ASMB,R,L,C
      HED RFAIN 91703-16103 * (C) HEWLETT PACKARD CO. 1976
      NAM RFAIN 91703-16103 REV A 760211
      SPC 1 
******************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1976.  ALL RIGHTS     *
*  * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,      *
*  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT*
*  * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.       *
******************************************************************
      SPC 2 
      SPC 1 
* 
********************************************* 
* 
*RFAIN              REMOTE FILE ACCESS SUBROUTINES
* 
*SOURCE PART #      91703-18103 
* 
*REL PART#          91703-16103 
* 
*WRITTEN BY:        J. HARTSELL, LARRY POMATTO
* 
*DATE WRITTEN:      11-29-75
* 
*MODIFIED BY:       BOB SHATZER     (04-07-75)
*                   DAN GIBBONS     (02-11-76)
* 
**********************************************
      SPC 2 
* 
* THIS SET OF USER-CALLABLE SUBROUTINES INTERFACES
* A BCS TERMINAL USER TO THE RTE FILE MANAGER AND RTE 
* EXECUTIVE OF A DS/1B RTE CENTRAL COMPUTER.
* CONFIGURED INTO THE TERMINAL BCS SYSTEM.
* 
* 
* CALLING SEQUENCE: 
* 
*   JSB RXXXX 
*   DEF RETURN ADDRESS
*   DEF STATUS   (POSITIVE BEFORE XMSN, NEGATIVE AFTER) 
*                     5 RFA BUSY (REQUEST OVERFLOW) 
*                     4 NOT USED
*                     3 NOT ENOUGH PARAMETERS 
*                     2 COMMUNICATIONS LINE DOWN
*                     1 ILLEGAL REQUEST CODE
*                    -1 REQUEST COMPLETED, NO ERRORS
*                    -2 NOT USED
*                    -3 COMMUNICATIONS I/O ERROR
*                    -4 ERROR IN PARAMETERS 
*                       (ILLEGAL LU, UNDEF. PROG SCHED, 
*                        ILLEGAL RECORD SIZE, ETC.) 
*                    -5 IMPROPER SEQUENCE OF USER CALLS 
*                       (FILE NOT OPEN, ETC.) 
* 
*   DEF PARAMETER 1 
*   . 
*   . 
*   . 
*   DEF PARAMETER N 
*   RETURN
* 
* 
*        HALT 13 CRASH (FATAL ERROR): 
*          (A) = -1    A SOFTWARE BUG EXISTS AT CENTRAL.
*                      SEE LISTING FOR MODULE "ERR" FOR 
*                      EXPLANATION OF ERROR CODE SHOWN
*                      IN THE B REGISTER. 
* 
      ENT RCRET,RPURG,ROPEN,RREAD,RWRIT 
      ENT RPOSN,RWIND,RCLOS,RNAME,RCONT 
      ENT RLOCF,RAPOS,RSTAT,REXEC,PRMBA,PARMB 
* 
      ENT $BUSY 
      ENT $ESC,ATTN,STBSY,INDCK,RESET 
* 
      EXT TMOUT,.IOC.,$C.LU,#TAM
* 
* 
A     EQU 0 
B     EQU 1 
* 
********************************* 
* ENTRY POINTS FOR REMOTE CALLS ********************
********************************* 
* 
* CREATE A CENTRAL FILE.
* 
RCRET NOP 
      JSB CQUE      NO RETURN. CALL IS POINTER TO 
      DEC 150       ENTRY POINT AND FUNCTION CODE.
* 
* PURGE A CENTRAL FILE. 
* 
RPURG NOP 
      JSB CQUE
      DEC 151 
* 
* OPEN A CENTRAL FILE.
* 
ROPEN NOP 
      JSB CQUE
      DEC 152 
* 
* WRITE ON CENTRAL FILE.
* 
RWRIT NOP 
      JSB CQUE
      DEC 153 
* 
* READ FROM CENTRAL FILE. 
* 
RREAD NOP 
      JSB CQUE      SIGN BIT OF FCN CODE SET FOR
      OCT 100232    READ (FCN = 154). 
* 
* POSITION CENTRAL FILE.
* 
RPOSN NOP 
      JSB CQUE
      DEC 155 
* 
* REWIND CENTRAL FILE.
* 
RWIND NOP 
      JSB CQUE
      DEC 156 
* 
* CLOSE CENTRAL FILE. 
* 
RCLOS NOP 
      JSB CQUE
      DEC 157 
* 
* RENAME CENTRAL FILE.
* 
RNAME NOP 
      JSB CQUE
      DEC 158 
* 
* CONTROL CENTRAL FILE. 
* 
RCONT NOP 
      JSB CQUE
      DEC 159 
* 
* LOCATE CENTRAL FILE RECORD. 
* 
RLOCF NOP 
      JSB CQUE
      DEC 160 
* 
* ABS POSITION CENTRAL FILE.
* 
RAPOS NOP 
      JSB CQUE
      DEC 161 
* 
* READ CENTRAL FILE DIRECTORY.
* 
RSTAT NOP 
      JSB CQUE
      OCT 100242    READ CALL. FCN = 162. 
* 
* REMOTE EXEC CALLS 
* 
REXEC NOP 
      LDA REXEC     SAVE RETURN ADDRESS.
      STA NCALL 
      ADA B2
      LDA A,I       GET REQUEST CODE ADDR.
      LDA A,I       GET REQUEST CODE. 
      ELA,CLE,ERA   CLEAR SIGN BIT. 
      LDB EFCN
      ELB,CLE 
      CPA B1        IF READ DATA, SET SIGN BIT
      CCE           IN FUNCTION CODE. 
      ERB 
      STB EFCN
      JMP *+2 
NCALL NOP 
      JSB CQUE
EFCN  OCT 243       FCN = 163.
      SKP 
**********************************
* BUILD THE PARAM BUFFER (PARMB) *******************
**********************************
* 
* 
* WHEN CQUE IS CALLED, THE ADDRESS OF THE USER
* CALL AND THE FUNCTION CODE CAN BE DETERMINED
* VIA THE ENTRY POINT CONTENTS. 
* 
CQUE  NOP 
THERE JSB #TAM      MAKE #TAM INITIALIZATION CALL 
      DEF *+2 
ZERO  OCT 0 
      LDA ZERO
      STA THERE     CLEAR OUT INITIALIZATION CALL AFTER FIRST PASS
      STA THERE+1 
      LDA CQUE,I    FETCH FUNCTION CODE.
      CLB           CHECK SIGN BIT. 
      SSA 
      INB 
      STB RDATA     SET "READ DATA" FLAG. 
      ELA,CLE,ERA   CLEAR SIGN BIT. 
      STA FCN 
      ADA MD163     IF .FCN=0 EXEC CALL 
      STA .FCN      SET UP FOR LATTER FOR STREAM CALCUALTION
      LDA CQUE      FETCH USER CALL ADDRESS.
      ADA MD2 
      LDA A,I 
      STA CALL
* 
      CLA           CLEAR DATA BUFR ADDR. 
      STA DADR
* 
* INITIALIZE PARMB: STREAM, SUB-STREAM, FUNCTION CODE.
* 
      LDA PRMBA     POINT TO PARMB AREA.
      STA PARMB 
* 
      LDA .FCN      IF ZERO...EXEC=STREAM 5 
      LDB B5
      SZA           IF NON ZERO RFA...STREAM 6
      INB 
      STB PARMB,I   STORE STREAM TYPE.
      ISZ PARMB 
* 
      CLA 
      STA PARMB,I   SUB-STREAM (NULL).
      ISZ PARMB 
* 
      LDA FCN 
      STA PARMB,I   FUNCTION CODE.
      ISZ PARMB 
* 
* STORE SPARE WORD, DATA FLAG = 0.
* 
      LDA B202L 
      STA PARMB,I   202*000 
      ISZ PARMB 
      ALF,ALF 
      STA PARMB,I   000*202 
      ISZ PARMB 
      CLA 
      STA PARMB,I   000*000 
* 
* INITIALIZE DYNAMIC POINTERS.
* 
      LDA CALL    ADDR OF USER CALL RETURN ADDR.
      ADA B2
      STA P.PTR     POINTER TO USER CALL PARAMETERS.
* 
      LDA B2
      STA B.PTR     PARMB BYTE POINTER. 
* 
      LDA UPARM     ADDR OF SAVED PARAMS. 
      STA U.PTR 
* 
* PERFORM COMMON PARMB ENTRY STORAGE ACCORDING TO 
* CLASS OF CALL (REXEC OR RFA)
* 
      LDA .FCN      GET FUNCTION CODE 
      SZA           EXEC OR RFA 
      JMP .RFA      RFA 
* 
      JSB INTGR     STORE REQ CODE IN PARMB.
      STA .RCD      SAVE IT.
* 
      CPA B1
      JMP RC1       READ. 
      CPA B2
      JMP RC1       WRITE.
      CPA B3
      JMP RC3       I/O CONTROL.
      CPA D10 
      JMP RC10      SCHEDULE. 
      CPA D11 
      JMP RC11      TIME. 
      CPA D12 
      JMP RC12      EXECUTION TIME. 
      CPA D13 
      JMP RC13      I/O STATUS. 
* 
      LDA B1        ILLEGAL REQUEST CODE. 
      JMP SSTAT 
* 
.RFA  LDA FCN       GET FUNCTION CODE 
      CPA D162      IS IT A STATUS REQUEST? 
      JMP *+3       YES...DON'T MOVE NAME 
      ISZ P.PTR     SKP OVER IERR PRAM
      JSB STRNG     STORE FILE NAME IN PARMB. 
* 
      LDA FCN 
      ADA MD150 
      ADA RTBL
      LDA A,I 
      JMP A,I 
* 
RTBL  DEF *+1       GO TO UNIQUE PROCESSING FOR 
      DEF .CRET     THE PARTICULAR RFA CALLS. 
      DEF .PURG 
      DEF .OPEN 
      DEF .WRIT 
      DEF .READ 
      DEF .POSN 
      DEF .WIND 
      DEF .CLOS 
      DEF .NAME 
      DEF .CONT 
      DEF .LOCF 
      DEF .APOS 
      DEF .STAT 
* 
* UNIQUE PROCESSING FOR INDIVIDUAL REMOTE EXEC CALLS. 
* 
RC1   JSB INTGR     STORE CONTROL WORD. 
      JSB GET.A 
      JSB RPARM     STORE BUFFER ADDR.
      JSB STLEN     STORE BUFFER LENGTH.
      JMP OPT2
* 
RC3   JSB INTGR     STORE CONTROL WORD. 
      JMP OPT1
* 
RC10  JSB STRNG     STORE PROGRAM NAME. 
      JSB OPTN      STORE OPTIONAL PARAMS.
      JSB OPTN
      JMP OPT3
* 
RC11  JMP READY 
* 
RC12  JSB STRNG     STORE PROG NAME.
      JSB INTGR     IRESL 
      JSB INTGR     MTPLE 
      JSB INTGR     IOFST: CHECK SIGN.
      SSA 
      JMP READY     INITIAL OFFSET VERSION. 
      JSB INTGR     MINS
      JSB INTGR     ISECS 
      JSB INTGR     MSECS 
      JMP READY     ABSOLUTE START TIME VERSION.
* 
RC13  JSB INTGR     STORE CONTROL WORD. 
      JMP READY 
* 
* UNIQUE PROCESSING FOR INDIVIDUAL RFA CALLS. 
* 
.CRET LDA B204      STORE 2-WORD SIZE ARRAY.
      JSB STBYT 
      JSB GET.A 
      STA TEMP3 
      ISZ TEMP3 
      LDA A,I 
      JSB STWRD 
      LDA TEMP3,I 
      JSB STWRD 
      JSB INTGR     STORE FILE TYPE.
      JMP OPT2
* 
.PURG JMP OPT2
* 
.OPEN BSS 0 
OPT3  JSB OPTN
OPT2  JSB OPTN      STORE OPTIONAL PARAMS.
OPT1  JSB OPTN
      JMP READY     PARMB COMPLETE. 
* 
.CLOS EQU OPT1
* 
.READ JSB GET.A 
      JSB RPARM     SAVE DATA BUFR ADDRESS. 
      JSB STLEN     STORE LENGTH. 
      JMP OPT2
* 
.WRIT EQU .READ 
* 
.POSN JSB INTGR     STORE RECORD NUMBER.
      JMP OPT1
* 
.WIND JMP READY 
* 
.NAME JSB STRNG     STORE NEW NAME. 
      JMP OPT2
* 
.CONT JSB INTGR     STORE CONTROL WORD. 
      JMP OPT1
* 
.LOCF JMP READY 
* 
.APOS JSB INTGR     STORE RECORD NUMBER.
      JMP OPT2
* 
.STAT JSB GET.A 
      JSB RPARM     SAVE DATA BUFR ADDRESS. 
      LDA D124      STORE LENGTH
      STA PARMB,I     IN DATA-FLAG AND
      JSB RPARM       GIVE IT TO CALLER.
      JMP READY 
* 
MSSNG LDA B3        MISSING PARAMETER.
      JMP SSTAT 
* 
READY CLA           STORE TERMINATION BYTE. 
      JSB STBYT 
* 
      LDA UPARM     POINT TO PLEN STORAGE.
      ADA B2
      STA U.PTR 
* 
      LDA B.PTR     COMPUTE PARMB SIZE. 
      ADA MD1 
      CLE,ERA 
      ADA B6
      JSB RPARM     SAVE PARMB LENGTH.
      SKP 
******************************************
* TRANSMIT PARMB TO CENTRAL & READ REPLY ***********
******************************************
* 
      LDA $C.LU     GO GET THE LU TO TALK TO
      STA C.LU      AND STORE IT IN CLEAR REQUEST 
      JSB .IOC.     CLEAR CARD
C.LU  OCT 0 
* 
      LDA $C.LU     GET LU
      STA CLU0      SET IN FOR CLEARING DRIVER
      STA CLU1
* 
      LDA SCWD      STORE LU IN IOC CALLS.
      AND MSK 
      IOR $C.LU 
      STA SCWD
* 
      LDA PCWD
      AND MSK 
      IOR $C.LU 
      STA PCWD
* 
      LDA WCWD
      AND MSK 
      IOR $C.LU 
      STA WCWD
* 
* FORMAT .IOC. CALL TO TRANSMIT PARMB.
* 
      LDA $C.LU     LU OF CENTRAL.
      IOR B20K      SET FOR "TRANSMIT ONLY".
      LDB DADR      IS THERE DATA?
      SZB 
      JMP DATA      YES.
* 
      IOR B300      NO. XMIT REQUEST ONLY.
      STA IRW       CONTROL WORD. 
      LDA PRMBA     REQUEST BUFFER (PARMB). 
      STA BUFF
      LDA PLEN      PARMB LENGTH. 
      STA BUFL
      JMP XMIT
* 
DATA  IOR B100      SET FOR "REQ AND DATA". 
      LDB RDATA     WANT TO READ DATA?
      SZB 
      XOR B30K      YES. SET FOR READ.
      STA IRW 
      LDA DABFA     PARMB BUFFER ADDR.
      STA BUFF
      LDA B4
      STA BUFL
* 
XMIT  LDA MD1       INITIALIZE ISTAT FOR
      STA ISTAT     NO ERRORS.
* 
      JSB STBSY     TELL TTY BUSY 
* TRANSMIT PARMB. 
* 
      JSB .IOC. 
IRW   NOP 
      JMP *-2 
BUFF  NOP 
BUFL  NOP 
* 
* WAIT FOR COMPLETION.
* 
      LDA TMOUT     INITIALIZE TIME-OUT DELAY.
      STA DELAY 
      CLA 
      STA DEL 
* 
WAIT  JSB .IOC. 
SCWD  OCT 40000 
      SSA,RSS 
      JMP ERCHK 
* 
      ISZ DEL       COUNT TIME. 
      JMP WAIT
      ISZ DELAY 
      JMP WAIT
* 
TOUT  LDA B200      TIME-OUT. SIMULATE "LINE  
      JMP SETER     DOWN" STATUS. 
* 
ERCHK SLA           ANY I/O ERRORS? 
      JMP POLL      NO. 
      STA TEMP1     YES. SAVE STATUS. 
      AND D8        BIT 3 SET?
      SZA,RSS 
      JMP CHKER     NO. 
      INB,SZB,RSS   YES. (B) = -1?
      JMP POLL      YES. GOT STOP FROM CENTRAL. 
CHKER JSB .IOC.     NO...CLEAR DRIVER 
CLU0  OCT 0 
      JSB RESET 
      LDA TEMP1 
      JMP SETER 
* 
* POLL FOR REPLY BUFFER.
* 
POLL  JSB .IOC.     READ REPLY FROM CENTRAL.
PCWD  OCT 10300 
      JMP *-2 
      DEF REPLY 
      DEC 12
* 
      LDA TMOUT     INITIALIZE TIME-OUT DELAY 
      STA DELAY 
      CLA 
      STA DEL 
* 
PWAIT JSB .IOC.     CALL FOR I/O STATUS.
WCWD  OCT 40000 
      SSA,RSS       COMPLETE? 
      JMP CMPL0     YES 
      ISZ DEL       NO, COUNT TIME
      JMP PWAIT 
      ISZ DELAY 
      JMP PWAIT 
      JMP TOUT      TIME-OUT
* 
CMPL0 ALF,ALF       YES. REPLY RECEIVED?
      RAL            (CHECK BIT 6). 
      SSA           REQUEST PENDING?
      JMP POLL      NO. KEEP POLLING. 
* 
      JSB RESET     YES. CHECK BAIL-OUT.
      ALF,ALF 
      RAR 
      SLA,RSS       ANY I/O ERRORS? 
      JMP SETER     YES.
      LDA REPLY     SEE IF REPLY OR REQUEST 
      RAL 
      SSA           ? 
      JMP COMPL     REPLY. GO COMPLETE USER CALL. 
      JMP POLL      IGNORE...REQUEST...NOT LEGAL
* 
* TRANSMISSION ERROR. SET ERROR CODE. 
* 
SETER STA TEMP1     SAVE STATUS 
      JSB .IOC.     CLEAR DRIVER
CLU1  OCT 0 
      LDA TEMP1     GET STATUS
      AND B50       BITS 3,5 SET? 
      SZA,RSS 
      JMP LDOWN     NO. LINE DOWN.
      LDA MD3       YES. PARITY ERROR.
      JMP SSTAT 
LDOWN LDA B2        SET LINE-DOWN ERROR 
      JMP SSTAT 
      SKP 
*********************** 
* BAIL-OUT PROCESSING ******************************
*********************** 
* 
* INTERRUPT PROCESSORS SHOULD NOT ABORT AN ACTIVE RFA 
* CALL (WHEN $BUSY IS SET) BUT MAY REQUEST A BAIL-OUT 
* AS SOON AS THE CURRENT RFA CALL IS COMPLETE BY
* PREVIOUSLY CALLING 'ATTN' TO ESTABLISH A BAIL-OUT 
* ADDRESS. IF THE $BUSY FLAG IS SET WHEN AN ABORTIVE
* CONDITION EXISTS, SET THE $ESC FLAG AND IT WILL BE
* CHECKED AS SOON AS REMOTE TRANSMISSION COMPLETES. 
* 
ATTN  NOP           (A) = BAIL-OUT ADDRESS. 
      STA ATTEN 
      JMP ATTN,I
* 
ATTEN NOP 
$ESC  OCT 0         BAIL-OUT FLAG.
* 
* RESTORE $BUSY AND CHECK FOR BAIL-OUT. 
* 
RESET NOP 
      LDB SVBSY     RESTORE RFA BUSY FLAG.
      STB $BUSY 
      LDB ATTEN     BAIL-OUT ADDR DEFINED?
      SZB,RSS 
      JMP RESET,I   NO. RETURN. 
      LDB $ESC      YES. BAIL OUT?
      SZB 
      JMP ATTEN,I   YES. BAIL OUT.
      JMP RESET,I   NO. RETURN. 
      SKP 
******************************* 
* PASS RETURN PARAMS TO USER. **********************
******************************* 
* 
* 
COMPL LDA REPLY+2   RFAM ERROR CODE?
      CPA MD1 
      RSS 
      JMP CMPL2     NO. 
* 
      LDA MD5       YES. MAP THE CODE.
      LDB REPLY+3 
      CPB B4
      JMP SSTAT     FILE NOT OPEN.
      LDA B5
      CPB B5
      JMP SSTAT     REQ. OVERFLOW AT CENTRAL. 
      LDA MD4 
      CPB D8
      JMP SSTAT     UNDEF. PROG SCHEDULE. 
      CPB D11 
      JMP SSTAT     ILLEGAL RECORD SIZE.
      CPB D12 
      JMP SSTAT     ILLEGAL LU. 
      LDA B1
      CPB D9        ILLEGAL REQUEST CODE. 
      JMP SSTAT 
      CCA           SOFTWARE BUG! 
      HLT 13B       (A)= -1, (B)= CODE. 
* 
SSTAT STA ISTAT     COMMUNICATION STATUS. 
* 
CMPL2 LDA CALL
      INA 
      STA P.PTR     PTR TO USER CALL PARAMS.
* 
      LDA ISTAT     RETURN ISTAT TO CALLER. 
      JSB RWORD 
* 
      LDA ISTAT 
      CPA MD1       IF ISTAT NOT -1, DON'T
      RSS           PASS ANY RETURN PARAMS. 
      JMP EXIT
* 
      LDA RPLY
      ADA B4
      STA I.PTR     PTR TO REPLY BUFR PARAMS. 
* 
      LDA .FCN      TEST FOR RFA OR REXEC.
      SZA,RSS 
      JMP RREXC     REXEC.
* 
      LDB FCN       RFA. RSTAT? 
      CPB D162
      JMP EXIT      YES. ALL DONE.
* 
      LDA I.PTR,I   NO. RETURN IERR.
      JSB RWORD 
      ISZ I.PTR     GET TO FIRST RETURN PRAM
* 
      LDB FCN 
      CPB D154      RREAD?
      RSS 
      JMP CMPL3     NO. 
      LDA P.PTR     MOVE PARAM POINTER. 
      ADA B3
      STA P.PTR 
      LDA I.PTR,I   YES. RETURN XMSN LOG. 
      JSB RWORD 
      JMP EXIT
* 
CMPL3 CPB D160      RLOCF?
      RSS 
      JMP EXIT      NO. 
      ISZ P.PTR     SKIP OVER FILE NAME.
      LDB MD7       YES. RETURN N PARAMS. 
      JSB PINTG 
      JMP EXIT
* 
RREXC ISZ P.PTR     SKIP PAST REQ CODE. 
      LDA .RCD      REXEC TIME CALL?
      CPA D11 
      RSS 
      JMP CMPL4     NO. 
      LDA P.PTR,I   YES. RETURN TIME ARRAY. 
      JSB INDCK     CHASE DOWNTHOSE LITTLE BITS 
      STA P.PTR 
      LDB MD5 
TLOOP LDA I.PTR,I 
      STA P.PTR,I 
      ISZ P.PTR 
      ISZ I.PTR 
      INB,SZB 
      JMP TLOOP 
      JMP EXIT
* 
CMPL4 CPA D13       REXEC I/O STATUS CALL?
      RSS 
      JMP EXIT      NO. 
      ISZ P.PTR     SKIP OVER CONTROL WORD. 
      LDB MD2       YES. PASS PARAMS. 
      JSB PINTG 
* 
* RETURN TO USER PROGRAM. 
* 
EXIT  LDA CALL,I    GET RETURN ADDRESS. 
      STA TEMP1 
      LDA REPLY+2   SET A, B REGISTERS. 
      LDB REPLY+3 
      JMP TEMP1,I   RETURN. 
      SKP 
**********************
* SUBROUTINE SECTION *******************************
**********************
* 
* STORE INTEGER PARAM FROM USER CALL INTO PARMB.
* 
INTGR NOP 
      JSB PCHEK     IS THE PARAM SPECIFIED? 
      JMP MSSNG     NO. 
      LDA B202      YES, STORE CONTROL BYTE.
      JSB STBYT 
      JSB GET.P     FETCH PARAM VALUE.
      JSB STWRD     STORE IN PARMB. 
      JMP INTGR,I   (A) HAS THE VALUE.
* 
* STORE OPTIONAL INTEGER PARAM (IF SPECIFIED) FROM
* USER CALL INTO PARMB. 
* 
OPTN  NOP 
      JSB PCHEK     IS PARAM SPECIFIED? 
      JMP OPTN,I    NO (LEAVE P.PTR ALONE). 
      JSB INTGR     YES, STORE IT.
      JMP OPTN,I    (A) HAS THE VALUE.
* 
* STORE 6 CHAR ASCII STRING FROM USER CALL
* INTO PARMB. 
* 
STRNG NOP 
      JSB PCHEK     IS PARAM SPECIFIED? 
      JMP MSSNG     NO. 
* 
      LDA B6        STORE CONTROL BYTE. 
      JSB STBYT 
      LDA MD3 
      STA TEMP2     WORD COUNTER. 
      JSB GET.A 
      STA TEMP3     STRING START ADDR.
* 
STR   LDA TEMP3,I   FETCH ASCII CHARACTERS. 
      ALF,ALF 
      JSB STBYT     STORE LEFT BYTE.
      LDA TEMP3,I 
      JSB STBYT     STORE RIGHT BYTE. 
* 
      ISZ TEMP3     BUMP TO NEXT INPUT WORD.
      ISZ TEMP2     DONE? 
      JMP STR       NO. 
      JMP STRNG,I   YES, EXIT.
* 
* STORE A-REGISTER CONTENTS INTO NEXT WORD
* OF SAVED VALUES.
* 
RPARM NOP 
      LDB U.PTR,I 
      STA B,I 
      ISZ U.PTR 
      JMP RPARM,I 
* 
* STORE USER BUFFER LENGTH IN PARMB, DATA-FLAG, 
* AND SAVE IT.
* 
STLEN NOP 
      JSB INTGR     STORE IN PARMB. 
* 
      SZA,RSS 
      JMP WRONG     SPECIFIED, BUT ZERO.
      SSA,RSS       NEGATIVE? 
      JMP STL       NO. 
* 
      CMA,INA       YES, MAKE POSITIVE. 
      INA           ROUND UP. 
      ERA,CLE,ELA 
      RAR           CONVERT TO WORD COUNT.
* 
STL   STA PARMB,I   STORE IN DATA-FLAG. 
      JSB RPARM     PASS BACK TO CALLER.
      JMP STLEN,I   EXIT. 
* 
WRONG LDA MD4 
      JMP SSTAT 
* 
* TEST WHETHER THE USER HAS SPECIFIED 
* A PARAMETER.
*        JSB PCHEK
*         ERROR RETURN (PARAM NOT GIVEN)
*         NORMAL RETURN 
* 
PCHEK NOP 
      LDA P.PTR     PARAM ADDR
      CMA,INA 
      ADA CALL,I    RETURN ADDRESS. 
      ADA MD1 
      SSA,RSS 
      ISZ PCHEK 
      JMP PCHEK,I 
* 
* GET VALUE OF NEXT PARAM IN USER CALL
* 
GET.P NOP 
      JSB GET.A     FETCH PARAM ADDR. 
      LDA A,I       GET PARAM VALUE.
      JMP GET.P,I 
* 
* GET ADDRESS OF NEXT PARAM IN USER CALL
*   AND BUMP PARAM POINTER. 
* 
GET.A NOP 
      LDA P.PTR,I   GET PARAMETER ADDRESS.
      JSB INDCK     CHASE DOWN THOSE BITS 
      ISZ P.PTR     BUMP PARAM POINTER. 
      JMP GET.A,I 
* 
* STORE WORD (IN A-REG) IN PARMB. 
* 
STWRD NOP 
      STA TEMP2     SAVE WORD.
      ALF,ALF 
      JSB STBYT     STORE LEFT BYTE.
      LDA TEMP2 
      JSB STBYT     STORE RIGHT BYTE. 
      LDA TEMP2     RESTORE WORD. 
      JMP STWRD,I   RETURN. 
* 
* STORE BYTE IN NEXT BYTE OF PARMB. 
* 
STBYT NOP           (A) = BYTE RIGHT JUSTIFIED. 
      AND M377      ISOLATE NEW BYTE. 
      STA TEMP1     SAVE. 
      LDB B.PTR     FORM WORD ADDR OF PARMB.
      CLE,ERB       (E) = LEFT/RIGHT FLAG.
      ADB PARMB 
* 
      LDA B,I       INSERT NEW BYTE INTO PARMB. 
      SEZ,RSS 
      ALF,ALF 
      AND M377L 
      IOR TEMP1 
      SEZ,RSS 
      ALF,ALF 
      STA B,I 
* 
      ISZ B.PTR     BUMP RELATIVE BYTE POINTER. 
      JMP STBYT,I   RETURN. 
* 
* 
* PASS A-REG CONTENTS TO USER PARAM.
* 
RWORD NOP 
      STA TEMP1 
      JSB PCHEK     IS PARAM SPECIFIED? 
      JMP RWORD,I   NO. 
      LDA P.PTR,I   GET ADDRESS 
      JSB INDCK     CHECK INDIRECTS 
      LDB TEMP1     GET VALUE 
      STB A,I       AND SAVE IT 
      ISZ P.PTR 
      JMP RWORD,I 
* 
* PASS N PARAMS TO USER PROGRAM. (B)= -N. 
* 
PINTG NOP 
      STB TEMP2 
PLOOP LDA I.PTR,I 
      JSB RWORD 
      ISZ I.PTR 
      ISZ TEMP2 
      JMP PLOOP 
      JMP PINTG,I 
      SPC 2 
* 
*     SUBROUTINE TO SET THE DRIVER BUSY FLAG
*     CALLING SEQUENCE
*     JSB STBSY 
*     B REG LOST
* 
STBSY NOP 
      LDB $BUSY 
      STB SVBSY     SAVE PREVIOUS STATUS
      CLB,INB       SET IT BUSY 
      STB $BUSY     SET BUSY FLAG 
      JMP STBSY,I   AND RETURN
      SPC 2 
* 
*     SUBROUTINE TO CHASE DOWN INDIRECTS
*     CALLING SEQUENCE
*     JSB INDCK 
*     A REG=ADDRESS  B REG NOT TOUCHED
* 
INDCK NOP 
      RSS 
      LDA A,I 
      RAL,CLE,SLA,ERA 
      JMP *-2 
      JMP INDCK,I   RETURN WITH DIRECT ADDRES 
      SKP 
********************************* 
* CONSTANTS AND WORKING STORAGE ********************
********************************* 
* 
B1    OCT 1 
B2    OCT 2 
B3    OCT 3 
B4    OCT 4 
B5    OCT 5 
B6    OCT 6 
D8    DEC 8 
D9    DEC 9 
D10   DEC 10
D11   DEC 11
D12   DEC 12
D13   DEC 13
D124  DEC 124 
D154  DEC 154 
D160  DEC 160 
D162  DEC 162 
MD1   DEC -1
MD2   DEC -2
MD3   DEC -3
MD4   DEC -4
MD5   DEC -5
MD7   DEC -7
MD150 DEC -150
MD163 DEC -163
B50   OCT 50
B100  OCT 100 
B200  OCT 200 
B300  OCT 300 
B20K  OCT 20000 
B30K  OCT 30000 
B202  OCT 202 
B202L OCT 101000
B204  OCT 204 
M377  OCT 377 
M377L OCT 177400
MSK   OCT 177700
* 
RDATA NOP           READ DATA FLAG. 
FCN   NOP           FUNCTION CODE.
CALL  NOP           ADDR OF USER CALL +1. 
.FCN  NOP           0= REXEC, -= RFA. 
.RCD  NOP           REXEC REQUEST CODE. 
P.PTR NOP           USER CALL PARAM POINTER.
B.PTR NOP           PARMB BYTE POINTER. 
U.PTR NOP 
I.PTR NOP 
TEMP1 NOP 
TEMP2 NOP 
TEMP3 NOP 
ISTAT NOP           COMMUNICATION STATUS. 
$BUSY NOP 
SVBSY NOP 
DELAY NOP 
DEL   NOP 
* 
PARMB NOP 
PRMB  BSS 26        PARAM BUFFER (PARMB). 
* 
RPLY  DEF REPLY 
REPLY BSS 12        REPLY BUFFER. 
* 
UPARM DEF UPRM
UPRM  DEF DADR
      DEF DLEN
      DEF PLEN
* 
DABFA DEF PRMBA 
* 
PRMBA DEF PRMB
PLEN  NOP 
DADR  NOP 
DLEN  NOP 
* 
      BSS 0 
* 
      END 
                                                                                                                                                                                                