home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / extra / k08mit.pal < prev    next >
Text File  |  2020-01-01  |  82KB  |  3,232 lines

  1. /    KER8.PA  KERMIT FOR PDP8
  2.  
  3.  
  4. /    30-JUL-84    JERRY SANDS
  5. /    18-JUL-85    RANDY HIPPE
  6.  
  7. /    PROGRAM TO DO FILE TRANSFERS USING THE "KERMIT" PROTOCOL
  8. /
  9. /    IMPLEMENTS THE FOLLOWING COMMANDS:
  10. /
  11. /    1.    CONNECT
  12. /    2.    BYE
  13. /    3.    EXIT
  14. /    4.    SEND
  15. /    5.    GET
  16. /    6.    RECEIVE
  17. /
  18. /    SUPPORTS WILDCARDING FOR "SEND" ONLY.
  19.  
  20. /    DEFINITIONS
  21.  
  22.     TKSF=    6031    /CONSOLE KEYBOARD FLAG
  23.     TKRB=    6036    /CONSOLE KEYBOARD BUFFER
  24.     TTSF=    6041    /CONSOLE TELEPRINTER FLAG
  25.     TTLS=    6046    /CONSOLE TELEPRINTER BUFFER
  26.  
  27. /    CHANGE THE FOLLOWING TWO DEFINITIONS AND REASSEMBLE
  28. /
  29.     RKIOT=    33    /DEFINE REMOTE RECEIVE IOT
  30.     RTIOT=    34    /DEFINE REMOTE TRANSMIT IOT
  31. /
  32.     RKSF=    RKIOT^10+6001    /DEFINE REMOTE INPUT IOT
  33.     RKRB=    RKIOT^10+6006    /
  34.     RTSF=    RTIOT^10+6001    /DEFINE REMOTE OUTPUT IOT
  35.     RTLS=    RTIOT^10+6006    /
  36.  
  37.  
  38.     SOH=    1        /START OF PACKET CHAR
  39.  
  40.     CONX1=    "\-100        /DEFINE FIRST "CONNECT" EXIT CHAR
  41.     CONX2=    "C        /DEFINE SECOND "CONNECT" EXIT CHAR
  42.     CR=    215
  43.     SPACE=    240
  44.     DELETE=    377
  45.  
  46.     LINSIZ=    40        /KEYBOARD LINE BUFFER SIZE
  47.  
  48. /    STATE DEFINITIONS
  49.  
  50.     STDAT=    "D&137        /DATA
  51.     STACK=    "Y&137        /ACK
  52.     STNAK=    "N&137        /NAK
  53.     STSIN=    "S&137        /SEND INIT
  54.     STBRK=    "B&137        /BREAK LINK
  55.     STFIL=    "F&137        /FILENAME HEADER
  56.     STEOF=    "Z&137        /END OF FILE OR REPLY
  57.     STERR=    "E&137        /ERROR PACKET
  58.  
  59.     STATT=    "A&137        /FILE ATTRIBUTES
  60.     STRIN=    "R&137        /RECEIVE INIT
  61.     STEOT=    "B&137        /BREAK TRANSMISSION
  62.     STGEN=    "G&137        /KERMIT GENERIC COMMAND
  63.  
  64.     DEFCK=    "1&177        /DEFAULT 1 CHAR CHECKSUM
  65.     DEFEOL=    15+40        /CR IS DEFAULT EOL
  66.     DEFQCTL= "#&177        /"#" IS DEFAULT QCTL
  67.  
  68.     DECIMAL
  69.     DEFMAXL= 94        /DEFAULT MAX SIZE
  70.     OCTAL
  71.  
  72.  
  73.  
  74. /    PAGE ZERO REGISTERS
  75. /    AUTO INDEX
  76.  
  77.     *10
  78. X10,    0        /GENERAL AUTO INDEX 10
  79. X11,    0        /GENERAL AUTO INDEX 11
  80. X12,    0        /GENERAL AUTO INDEX 12
  81. X13,    0        /GENERAL AUTO INDEX 13
  82. X14,    0        /GENERAL AUTO INDEX 14
  83. X15,    0        /GENERAL AUTO INDEX 15
  84. X16,    0        /GENERAL AUTO INDEX 16
  85. X17,    0        /GENERAL AUTO INDEX 17
  86.  
  87. /    REGULAR PAGE ZERO REGISTERS
  88.  
  89. TEMP,    0
  90. RCHAR,    0        /REMOTE LINE CURRENT INPUT CHAR
  91. TCHAR,    0        /TERMINAL LINE CURRENT INPUT CHAR
  92. SCAN1,    0        /
  93. SCAN2,    0        /
  94. KEYDSP,    0        /DISPATCH ADDRESS FOR KEYWORD MATCH
  95. BININP,    0        /BINARY REGISTER FOR DECIMAL INPUT
  96. PTABLE,    0        /
  97. LPTR,    0        /HOLDS LINE POINTER
  98. CONFLG,    0        /FLAG FOR EXIT CONNECT
  99. STATE,    0        /CURRENT STATE
  100. RETRY,    -10        /NUMBER OF RE-TRYS
  101. RTRYC,    0        /USE THIS FOR ACTUAL COUNTER
  102. CCFLAG,    0        /FLAG FOR ^C TYPED
  103.  
  104. /    CURRENT PACKET I/O DATA
  105.  
  106. PAKPTR,    0        /POINTER TO OUTPUT PACKET POINTER
  107. PAKCKS,    0        /HOLDS CURRENT OUTPUT PACKET CHECKSUM TOTAL
  108. CURSEQ,    0        /CURRENT SEQ NUMBER
  109. QFLAG,    0        /NON-ZERO WHEN NO CONTROL QUOTING
  110.  
  111. /    KERMIT MODE FLAG
  112.  
  113.     MLINE=    1    /KERMIT IS ON-LINE
  114.     MSEND=    2    /KERMIT IS IN SEND MODE
  115.     MREC=    3    /KERMIT IS IN RECEIVE MODE
  116.  
  117. KMODE,    0        /CURRENT MODE OF KERMIT
  118.  
  119.  
  120.  
  121. /    RECEIVE "INIT" REGISTERS
  122.  
  123. RMAXL,    DEFMAXL+40    /MAX LENGTH FOR DATA PACKET (DEFAULT)
  124. RTIME,    0        /TIME-OUT VALUE
  125. RNPAD,    0        /NUMBER OF PADDING CHARS
  126. RPADC,    0        /CHAR USED FOR PADDING
  127. REOL,    DEFEOL        /TERMINATOR CHAR USED FOR END OF PACKET
  128. RQCTL,    DEFQCTL        /CONTROL CHAR PREFIX CHAR
  129. RQBIN,    0        /PARITY CHAR PREFIX CHAR (CHARS GT 177)
  130. RCHKT,    DEFCK        /CHECKSUM TYPE  (DEFAULT TYPE 1)
  131. RREPT,    0        /PREFIX CHAR FOR REPEATED CHARS
  132. RCAPAS,    0        /EXTRA CAPABILITY BIT MASK
  133.  
  134. USR,    7700        /POINTER TO USER SERVICE ROUTINES
  135. HNDADR,    0        /FILE DEVICE HANDLER ADDRESS
  136. FORCEP,    0        /FLAG FOR FORCED OUTPUT OF PACKET WHEN THERE IS
  137.             /  NO DATA (JUST SOH, LEN, SEQ, AND CHECKSUM)
  138. PRSERR,    0        /HOLDS PARSE POSITION FOR REPORTING ERRORS
  139. PACK6P,    0        /POINTER TO STORAGE OF 6 BIT CHARS
  140. PACK6F,    0        /FLAG FOR WHICH BYTE TO STORE
  141. GET6P,    0        /POINTER USED IN THE GET6 ROUTINE
  142. GET6F,    0        /FLAG USED IN THE GET6 ROUTINE
  143. MOVE4,    0        /COUNTER FOR "MOVE"
  144. INIFLG,    0        /INIT DONE FLAG
  145.  
  146. /    FILE NAME PARSE REGISTERS
  147.  
  148. FNPTR,    0        /POINTER TO WHERE TO PUT A PARSED FILE NAME
  149. WILDF,    0        /WILD CARD IN FILE NAME FLAG
  150.  
  151. /    FILE INFORMATION
  152.  
  153. FSBLK,    0        /FILE START BLOCK
  154. FLEN,    0        /FILE LENGTH
  155. DEVNUM,    0        /PARSED DEVICE NUMBER HERE
  156. OFFLG,    0        /OUTPUT FILE OPEN FLAG
  157. ODNAME,    0        /POINTER TO USER SPECIFIED DEVICE FOR OUTPUT
  158. ODNUMB,    0        /OUTPUT DEVICE NUMBER
  159. DIRBLK,    0        /CURRENT DIRECTORY BLOCK IN CORE
  160. DWORD,    0        /POINTER TO NEXT ENTRY TO TRY
  161. DPTR,    0        /POINTER TO FILE ENTRYS
  162.  
  163. /    OFTEN USED CONSTANTS
  164.  
  165. C77,    0077
  166. C177,    0177
  167. C377,    377
  168. C7400,    7400
  169. MCTRLZ,    -232
  170. UPTEMP,    0        /TEMP FOR OS/8 UNPACK ROUTINE
  171.  
  172.  
  173.  
  174. /    POINTER FOR THE PACKET INPUT AND OUTPUT ROUTINES
  175.  
  176.     SPACK=    JMS I    .    /SEND A PACKET TO REMOTE
  177.         SPACK0        /PUT IN A POINTER
  178.  
  179.     FPACK=    JMS I    .    /FORMAT PACKET
  180.         FPACK0        /PUT IN THE POINTER
  181.  
  182.     RPACK=    JMS I    .    /RECEIVE A PACKET FROM REMOTE
  183.         ILINK        /PUT IN A POINTER
  184.  
  185. /    POINTERS FOR OUTPUT ROUTINES
  186.  
  187.     TTYOUT=    JMS I    .    /PRINT ONE CHAR ON TTY
  188.         OTTY
  189.  
  190.     PRI8B=    JMS I    .    /PRINT 8 BIT STRING ON TTY
  191.         PRI8B0        /PUT IN THE POINTER
  192.  
  193.     PRI6B=    JMS I    .    /PRINT 6 BIT STRING ON TTY
  194.         PRI6B0        /PUT IN THE POINTER
  195.  
  196.     REMOUT=    JMS I    .    /SEND ONE CHAR DOWN REMOTE LINE
  197.         OREM        /PUT IN THE POINTER
  198.  
  199.     REM8B=    JMS I    .    /SEND 8 BIT STRING DOWN REMOTE LINE
  200.         REM8B0        /PUT IN THE POINTER
  201.  
  202.     REM6B=    JMS I    .    /SEND 6 BIT STRING DOWN REMOTE LINE
  203.         REM6B0        /PUT IN THE POINTER
  204.  
  205. /    MISC.
  206.  
  207.     RTDISP=    JMS I    .    /ROUTINE TO DISPATCH BASED ON "RRTYP"
  208.         DISPA0        /POINTER TO ROUTINE
  209.  
  210.     PACK6=    JMS I    .    /DEFINE CALL TO ROUTINE
  211.         PACK60        /POINTER TO ROUTINE
  212.  
  213.     SCANC=    JMS I    .    /SCAN FOR CHAR COMMAND
  214.         SCANC0        /PUT IN THE POINTER
  215.  
  216.     GET6=    JMS I    .    /DEFINE THE INSTRUCTION
  217.         GET60        /PUT IN THE POINTER
  218.  
  219.     MOVE=    JMS I    .    /DEFINE CALL TO MOVE ROUTINE
  220.         MOVE0        /POINTER
  221.  
  222.     CLEAR=    JMS I    .    /DEFINE CALL FOR "CLEAR" ROUTINE
  223.         CLEAR0        /POINTER
  224.  
  225.  
  226.  
  227. /BEGINNING OF PROGRAM
  228.     *200
  229.  
  230. START,    CLA CLL
  231.     TTLS                /INIT PRINTER OUTPUT LINE
  232.     RTLS                /INIT REMOTE OUTPUT LINE
  233.  
  234. CLOOP,    CLA CLL
  235.     DCA    CCFLAG            /CLEAR THE ^C FLAG
  236.     DCA    KMODE            /CLEAR THE MODE FLAG
  237.     PRI6B;    PROMPT            /DISPLAY THE USER PROMPT
  238.     JMS    LININP            /GET INPUT LINE FROM USER
  239.     TAD    (TMPTBL            /GET ADDRESS OF PARSE TABLE
  240.     DCA    PTABLE            /STORE FOR PARSER
  241.     TAD    (LINBUF            /GET ADDRESS OF INPUT LINE BUFFER
  242.  
  243. CLOOP1,    JMS    KEYPRS            /PARSE OFF A KEYWORD
  244.     JMP    CLOOP9            /NO MATCH ON KEYWORD
  245.     JMP    CLOOP            /END OF LINE DETECTED
  246.     DCA    LPTR            /STORE POINTER TO NEXT POS ON LINE
  247.     JMS I    KEYDSP            /DISPATCH TO SERVICE
  248.     JMP    CLOOP7            /ERROR RETURN FROM SERVICE DISPATCH
  249.     TAD    LPTR            /RE-GET COMMAND LINE POINTER
  250.     JMP    CLOOP1            /CONTINUE LINE PARSE
  251.  
  252.  
  253. CLOOP7,    SZA                /SKIP IF NO RETURNING MESSAGE
  254.     PRI6B                /AND DISPLAY IT
  255.     JMP    CLOOP            /BACK TO COMMAND LOOP
  256.  
  257. CLOOP9,    CLA CLL
  258.     PRI6B;    ERRMSG            /DISPLAY ERROR MESSAGE
  259.     JMP    CLOOP            /GO AGAIN
  260.  
  261.  
  262.  
  263. /    COMMAND TABLE LOOKUP
  264. /    ROUTINE TO LOOK THRU A TABLE OF SINGLE CHAR COMMANDS FOR A MATCH
  265. /    AND RETURN THE DISPATCH ADDRESS FOR A MATCH IN THE AC.  IF NO MATCH
  266. /    IS FOUND IN THE TABLE (THE TABLE ENDS WITH A COMMAND OF ZERO) A
  267. /    RETURN + 2 IS TAKEN, ELSE A RETURN + 3 IS TAKEN.
  268. /    ENTER:        AC = COMMAND TO FIND
  269. /            CALL + 2 = ADDRESS OF DISPATCH TABLE
  270. /    EXIT:        DISPATCH ADDRESS IN THE AC
  271. /            RETURN + 3
  272.  
  273.  
  274. SCANC0,    0
  275.     CIA                /NEGATE THE COMMAND
  276.     DCA    SCANC8            /STORE LOCALLY
  277.     TAD I    SCANC0            /GET ADDRESS OF DISPATCH TABLE
  278.     ISZ    SCANC0            /BUMP RETURN POINTER
  279.     DCA    SCANC9            /STORE POINTER LOCALLY
  280.     SKP                /SKIP INTO LOOP BELOW
  281.  
  282. SCANC1,    ISZ    SCANC9            /BUMP THE POINTER
  283.     TAD I    SCANC9            /GET A COMMAND FROM THE TABLE
  284.     SNA                /SKIP IF NOT END OF TABLE
  285.     JMP I    SCANC0            /END OF TABLE, RETURN +2 FOR ERROR
  286.     ISZ    SCANC9            /BUMP POINTER
  287.     TAD    SCANC8            /COMPARE WITH COMMAND WE ARE LOOKING FOR
  288.     SZA CLA                /SKIP IF IS A MATCH
  289.     JMP    SCANC1            /NO MATCH, TRY AGAIN
  290.  
  291.     TAD I    SCANC9            /GET DISPATCH ADDRESS
  292.     ISZ    SCANC0            /BUMP RETURN FOR MATCH
  293.     JMP I    SCANC0            /AND RETURN IN AC
  294.  
  295. SCANC8,    0        /LOCAL STORAGE FOR COMMAND TO LOOK FOR
  296. SCANC9,    0        /LOCAL POINTER FOR COMMAND TABLE
  297.  
  298.  
  299.  
  300. /    ROUTINE TO FORMAT A PACKET OF DATA
  301. /    CALL:    FPACK
  302. /        DATA ADDRESS (DATA MUST ALREADY BE CONTROL/QUOTED AND MUST
  303. /                  NOT BE LONGER THAN THE LARGEST PACKET)
  304. /        PACKET TYPE
  305.  
  306. FPACK0,    0
  307.     CLA CLL                /INSURE CLEAR AC
  308.     TAD I    FPACK0            /GET THE DATA ADDRESS
  309.     DCA    FP1            /STORE IN SOURCE POINTER
  310.     ISZ    FPACK0            /BUMP ARGUMENT POINTER
  311.     TAD I    FPACK0            /NOW GET TYPE
  312.     DCA    RSTYP            /STORE
  313.     ISZ    FPACK0            /BUMP ARGUMENT POINTER
  314.     TAD    (RSDTA            /GET ADDRESS OF DATA BUFFER
  315.     DCA    FP2            /STORE IN DESTINATION POINTER
  316.     TAD    (40+3            /SET FOR LENGTH COUNTER
  317.     DCA    RSLEN            /STORE IN PACKET
  318.     DCA    FP3            /INIT CHECKSUM
  319.     TAD    CURSEQ            /GET CURRENT SEQ NUMBER
  320.     AND    C77            /MOD 64
  321.     TAD    (40            /CHAR IT
  322.     DCA    RSSEQ            /PUT INTO PACKET
  323.  
  324. FPACK2,    TAD I    FP1            /GET A CHAR FROM SOURCE
  325.     SPA                /SKIP IF NOT END
  326.     JMP    FPACK3            /END
  327.     TAD    FP3            /COMBINE WITH CHECKSUM
  328.     DCA    FP3            /AND RETURN
  329.     TAD I    FP1            /GET CHAR BACK AGAIN
  330.     DCA I    FP2            /NOW PUT INTO DESTINATION
  331.     ISZ    RSLEN            /BUMP THE LENGTH
  332.     ISZ    FP1            /BUMP THE SOURCE POINTER
  333.     ISZ    FP2            /BUMP THE DESTINATION POINTER
  334.     JMP    FPACK2            /LOOP
  335.  
  336. FPACK3,    CLA CLL                /CLEAR THE AC
  337.     TAD    FP3            /GET CACULATED CHECKSUM
  338.     TAD    RSLEN            /INCLUDE THE LENGTH
  339.     TAD    RSSEQ            /AND THE SEQUENCE
  340.     TAD    RSTYP            /AND THE TYPE
  341.     JMS    CKSUM            /GET IT CORRECT
  342.     DCA I    FP2            /STORE WITH PACKET
  343.     ISZ    FP2            /BUMP PACKET POINTER
  344.     TAD    REOL            /GET ANY END OF LINE TO INCLUDE
  345.     TAD    (-40            /MAKE IT A REAL CHAR
  346.     SNA                /SKIP IF EOL CHAR REQUIRED
  347.     JMP    FPACK4            /NO EOL CHAR
  348.     DCA I    FP2            /STORE EOL CHAR WITH PACKET
  349.     ISZ    FP2            /BUMP POINTER
  350.  
  351. FPACK4,    STA                /AC = -1
  352.     DCA I    FP2            /PACKET NOW COMPLETE
  353.     TAD    RETRY            /SET UP RE-TRY COUNTER
  354.     DCA    RTRYC
  355.     ISZ    CURSEQ            /BUMP SEQUENCE NUMBER FOR NEXT TIME
  356.     NOP                /PROTECT ISZ
  357.     JMP I    FPACK0            /RETURN
  358.  
  359. FP1,    0        /POINTER TO SOURCE DATA
  360. FP2,    0        /POINTER TO PACKET BUFFER
  361. FP3,    0        /RUNNING CHECKSUM
  362.  
  363. PAGE
  364.  
  365.  
  366.  
  367. /    ROUTINE TO SEND THE FORMATTED PACKET
  368. /    ARGUMENTS:    CALL + 1  NON-ZERO = AWAIT RESPONSE
  369. /                  ZERO     = DO NOT AWAIT RESPONSE
  370. /            CALL + 2  DISPATCH TABLE
  371.  
  372. SPACK0,    0
  373.     REM8B;    RSBUF            /SEND PACKET JUST COMPLETED
  374.     TAD I    SPACK0            /DO WE GET A RESPONSE?
  375.     ISZ    SPACK0            /BUMP POINTER PAST ARGUMENT
  376.     SNA CLA                /SKIP IF YES
  377.     JMP I    SPACK0            /ALL DONE HERE
  378.     RPACK                /GET PACKET BACK FROM REMOTE
  379.     TAD I    SPACK0            /DID WE WANT A DISPATCH?
  380.     ISZ    SPACK0            /BUMP PAST ARGUMENT
  381.     SNA                /SKIP IF YES
  382.     JMP I    SPACK0            /EXIT IF NO
  383.     RTDISP                /DISPATCH
  384.     JMP I    SPACK0            /NOT FOUND, GOTTA RETURN
  385.  
  386.  
  387.  
  388. /    ROUTINE TO CLEAR WORDS OF MEMORY
  389. /    ENTER WITH:    AC = MINUS NUMBER OF WORDS TO CLEAR
  390. /                MQ = ADDRESS OF WHERE TO START THE CLEAR
  391.  
  392. CLEAR0,    0
  393.     DCA    CLEAR5            /STORE COUNT OF WORDS
  394.     MQA                /GET ADDRESS OF CLEAR
  395.     DCA    CLEAR6            /STORE IN POINTER
  396.     DCA I    CLEAR6            /ZERO A WORD
  397.     ISZ    CLEAR6            /BUMP POINTER
  398.     ISZ    CLEAR5            /BUMP COUNTER
  399.     JMP    .-3            /LOOP
  400.     JMP I    CLEAR0            /DONE
  401.  
  402. CLEAR5,    0        /TEMP FOR "CLEAR" ROUTINE
  403. CLEAR6,    0        /TEMP FOR "CLEAR" ROUTINE
  404.  
  405.  
  406. /    ROUTINE TO DISPATCH TO ROUTINE BASED ON VALUE OF "RRTYP"
  407. /    ADDRESS OF DISPATCH TABLE CAN BE IN THE AC OR AT CALL + 1. RETURN
  408. /    IF NO MATCH FOUND, DISPATCH IF MATCH FOUND
  409.  
  410. DISPA0,    0
  411.     SZA                /SKIP IF DISPATCH TABLE NOT IN AC
  412.     JMP    DISPA1            /USE VALUE IN AC
  413.     TAD I    DISPA0            /GET VALUE FROM CALL + 1
  414.     ISZ    DISPA0            /BUMP RETURN PAST ARGUMENT
  415.  
  416. DISPA1,    DCA    DISPA2            /STORE ADDRESS
  417.     TAD    RRTYP            /GET VALUE OF "RRTYP"
  418.     SCANC                /FIND MATCH IN TABLE
  419. DISPA2,    0                /ADDRESS OF TABLE HERE
  420.     JMP I    DISPA0            /NOT FOUND IN TABLE, RETURN
  421.     DCA    DISPA2            /PUT DISPATCH ADDRESS INTO A POINTER
  422.     JMP I    DISPA2            /AND DISPATCH TO IT
  423.  
  424.  
  425.  
  426. /    ROUTINE TO PUT CHARS INTO A BUFFER TO GET READY TO FORMAT A PACKET.
  427. /    ENTER WITH CHAR IN THE AC
  428. /    IF THE CHAR NEEDS CONTROL QUOTING, IT WILL BE ADDED
  429. /    EXIT + 2 IF EVERYTHING IS OK
  430. /    EXIT + 1 IF BUFFER IS FULL
  431.  
  432. OPBUF,    0
  433.     JMS    OPRE            /CHECK FOR PREFIX
  434.     JMP    OPBUF1            /NO PREFIX
  435.     DCA    OP1            /SAVE CONVERTED CHAR
  436.     TAD    RQCTL            /GET QUOTE CHAR TO USE
  437.     DCA I    OP2            /PUT RETURNED PREFIX INTO BUFFER
  438.     ISZ    OP2            /BUMP POINTER
  439.     TAD    OP1            /GET BACK CONVERTED CHAR
  440.  
  441. OPBUF1,    DCA I    OP2            /PUT INTO BUFFER
  442.     ISZ    OP2            /BUMP POINTER
  443.     STA                /AC = -1
  444.     DCA I    OP2            /ALWAYS TERMINATE BUFFER
  445.     TAD    RMAXL            /GET MAX BUFFER LENGTH
  446.     TAD    (-40+HOLDBF-4        /
  447.     CIA
  448.     TAD    OP2            /COMPARE WITH WHAT WE HAVE
  449.     SPA CLA                /SKIP IF NO ROOM
  450.     JMP    OPBUF2            /HAVE ROOM
  451.     JMS    INIOPB            /RESET BUFFER
  452.     JMP I    OPBUF            /TAKE RETURN + 1
  453.  
  454. OPBUF2,    ISZ    OPBUF            /BUMP RETURN FOR BUFFER NOT FULL
  455.     JMP I    OPBUF            /DONE
  456.  
  457. OP1,    0        /TEMP LOCATION
  458. OP2,    HOLDBF        /POINTER FOR HOLD BUFFER
  459.  
  460.  
  461. /    ROUTINE TO RE-SET THE HOLD BUFFER
  462.  
  463. INIOPB,    0
  464.     TAD    (HOLDBF            /RE-SET BUFFER POINTER
  465.     DCA    OP2
  466.     JMP I    INIOPB
  467.  
  468.  
  469.  
  470. /    ROUTINE TO CACULATE A 1 BYTE CHECKSUM
  471.  
  472. CKSUM,    0
  473.     DCA    CKSUM1            /STORE TEMP
  474.     TAD    CKSUM1            /GET BACK
  475.     BSW                /GET BITS 6-7 INTO BITS 0-1
  476.     AND    (3            /KEEP ONLY BITS 0-1
  477.     TAD    CKSUM1            /GET ORIGINAL
  478.     AND    C77            /KEEP ONLY BITS 0-5
  479.     TAD    (40            /MAKE A CHAR(CHECKSUM)
  480.     JMP I    CKSUM            /DONE, RETURN IN AC
  481.  
  482. CKSUM1,    0    /TEMP FOR "CKSUM"
  483.  
  484.  
  485. /    ROUTINE TO CHECK FOR A CONTROL C
  486. /    SET FLAG "CCFLAG" IF ^C IS TYPED
  487.  
  488. CCCK,    0
  489.     CLA CLL                /INSURE CLEAR AC
  490.     TAD    KMODE            /GET KERMITS MODE
  491.     TAD    (-MLINE            /CHECK FOR ON-LINE
  492.     SNA CLA                /SKIP IF NOT ON-LINE
  493.     JMP    CCCK2            /NO CTRL/C CHECK IF ON-LINE
  494.     JMS    ITTY            /CHECK FOR INPUT FROM CONSOLE
  495.     SKP                /GOT SOMETHING FROM CONSOLE
  496.     JMP    CCCK2            /NO INPUT FROM CONSOLE
  497.     AND    C177            /CLEAR TOP BITS
  498.     TAD    (-3            /CHECK FOR CTRL/C
  499.     SZA CLA                /SKIP IF CTRL/C
  500.     JMP    CCCK2            /^C NOT TYPED
  501.     IAC
  502.     DCA    CCFLAG            /SET ^C FLAG
  503.  
  504. CCCK2,    JMP I    CCCK            /RETURN
  505.  
  506.     PAGE
  507.  
  508.  
  509. /    ROUTINE TO INPUT CHARS FROM REMOTE UNTIL A "SOH" CHAR IS FOUND
  510.  
  511. GETSOH,    0
  512.     JMS    IREMW            /GET A CHAR FROM REMOTE
  513.     JMP I    GETSOH            /TIME-OUT
  514.     TAD    (-SOH            /COMPARE WITH "SOH"
  515.     SZA CLA                /SKIP IF SAME
  516.     JMP    GETSOH+1        /LOOP TILL WE GET ONE
  517.     ISZ    GETSOH            /BUMP FOR GOOD RETURN
  518.     JMP I    GETSOH            /GOT ONE, DONE
  519.  
  520.  
  521. /    ROUTINE TO GET A CHAR FROM THE REMOTE LINE AND UPDATE CHECKSUM
  522.  
  523. GETIR,    0
  524.     JMS    IREMW            /GET A CHAR FROM REMOTE
  525.     JMP I    GETIR            /TIME-OUT RETURN
  526.     DCA    GETIR1            /STORE TEMP
  527.     TAD    GETIR1            /GET CHAR BACK
  528.     TAD    ILINK9            /ADD CHECKSUM
  529.     DCA    ILINK9            /RETURN UPDATED CHECKSUM
  530.     TAD    GETIR1            /RE-GET CURRENT INPUT CHAR
  531.     TAD    (-15            /CHECK FOR A RETURN
  532.     SNA CLA                /SKIP IF NOT A RETURN
  533.     JMP I    GETIR            /WAS A RETURN, TAKE EXIT + 1
  534.     TAD    GETIR1            /RE-GET CHAR FOR RETURN
  535.     ISZ    GETIR            /BUMP FOR GOOD RETURN
  536.     JMP I    GETIR            /AND RETURN IN THE AC
  537.  
  538. GETIR1,    0    /TEMP LOCAL TO "GETIR"
  539.  
  540.  
  541. /    LOW LEVEL PROGRAMMED I/O THRU TERMINAL LINES
  542.  
  543. /    ROUTINE TO GET INPUT FROM THE REMOTE INPUT LINE
  544. /    RETURN + 1 IF INPUT FOUND
  545. /    RETURN + 2 IF NO INPUT FOUND
  546.  
  547. IREM,    0
  548.     CLA CLL                /INSURE CLEAR AC
  549.     RKSF                /CHECK FOR INPUT
  550.     JMP    IREM1            /NO INPUT, RETURN + 2
  551.     RKRB                /READ ANY INPUT
  552.     DCA    RCHAR            /STORE REMOTE CHAR
  553.     TAD    RCHAR            /RE-GET THE CHAR
  554.     JMP I    IREM            /DONE
  555.  
  556. IREM1,    ISZ    IREM            /NO INPUT, BUMP RETURN
  557.     JMP I    IREM
  558.  
  559.  
  560. /    ROUTINE TO WAIT FOR A CHAR FROM THE REMOTE LINE
  561. /    RETURN + 2 WITH CHAR INPUT IN THE AC
  562. /    RETURN + 1 IF TIME-OUT WAITING FOR CHAR
  563.  
  564. IREMW,    0
  565.     CLA CLL                /INSURE CLEAR AC
  566.     DCA    IREMW9            /RE-SET TIMER COUNTER
  567.     TAD    (-1000            /SET HIGH ORDER
  568.     DCA    IREMW8
  569.  
  570. IREMW1,    JMS    IREM            /CALL INPUT REMOTE ROUTINE
  571.     JMP    IREMW2            /RETURN HERE IF CHAR WAS INPUT
  572.     JMS    CCCK            /CHECK FOR A CONTROL/C
  573.     ISZ    IREMW9            /BUMP TIMER-COUNTER
  574.     JMP    IREMW1            /NO TIME-OUT YET
  575.     ISZ    IREMW8            /BUMP HIGH ORDER
  576.     JMP    IREMW1            /NO TIME-OUT YET
  577.     JMP I    IREMW            /TIME-OUT
  578.  
  579. IREMW2,    ISZ    IREMW            /BUMP RETURN FOR NO TIME-OUT
  580.     JMP I    IREMW            /AND EXIT
  581.  
  582. IREMW8,    0
  583. IREMW9,    0
  584.  
  585. /    ROUTINE TO GET INPUT FROM THE CONSOLE TERMINAL
  586. /    RETURN + 1 IF INPUT FOUND WITH THE INPUT BYTE IN THE AC
  587. /    RETURN + 2 IF NO INPUT FOUND WITH GARBAGE IN THE AC
  588.  
  589. ITTY,    0
  590.     TKSF                /CHECK FOR INPUT
  591.     JMP    ITTY1            /NO INPUT, RETURN BELOW
  592.     TKRB                /READ THE INPUT
  593.     AND    C177            /FORCE THE PARITY BIT ON
  594.     TAD    (200
  595.     DCA    TCHAR            /STORE AS CURRENT TERMINAL CHAR
  596.     TAD    TCHAR            /RE-GET
  597.     JMP I    ITTY            /RETURN
  598.  
  599. ITTY1,    ISZ    ITTY            /BUMP RETURN FOR NO INPUT
  600.     JMP I    ITTY            /AND RETURN
  601.  
  602.  
  603. /    INPUT FROM CONSOLE TTY WITH WAIT
  604.  
  605. ITTYW,    0
  606.     JMS    ITTY            /GO FETCH A CHAR FROM CONSOLE
  607.     JMP I    ITTYW            /RETURN HERE IF CHAR INPUT
  608.     JMP    ITTYW+1            /ELSE WAIT FOR INPUT
  609.  
  610.  
  611. /    ROUTINE TO INPUT AND ECHO CHARS FROM THE KEYBOARD
  612.  
  613.  
  614. INECO,    0
  615.     JMS    ITTYW            /GET A CHAR FROM THE KEYBOARD
  616.     TTYOUT                /DISPLAY THE CHAR ON THE SCREEN
  617.     JMP I    INECO            /DONE
  618.  
  619.  
  620. /    REMOTE OUTPUT ROUTINE  -  OUTPUT THE BYTE IN THE AC
  621.  
  622.  
  623. OREM,    0
  624.     RTSF                /CHECK OUTPUT FLAG
  625.     JMP    .-1            /WAIT UNTIL READY
  626.     RTLS                /SEND THE CHAR
  627.     CLA CLL                /RETURN CLEAR AC AND LINK
  628.     JMP I    OREM            /DONE
  629.  
  630.  
  631.  
  632. /    CONSOLE OUTPUT ROUTINE  -  OUTPUT THE BYTE IN THE AC
  633.  
  634. OTTY,    0
  635.     TTSF                /CHECK OUTPUT FLAG
  636.     JMP     .-1            /WAIT TILL READY
  637.     TTLS                /SEND THE CHAR
  638.     JMP I    OTTY            /DONE
  639.  
  640. PAGE
  641.  
  642.  
  643. /    HOLD BUFFER FOR CHAR OUTPUT
  644.  
  645.     DECIMAL
  646. HOLDBF,    ZBLOCK    92
  647.     OCTAL
  648.  
  649.  
  650. /    ROUTINE TO CHECK FOR CONTROL PREFIX
  651. /    ENTER WITH CHAR TO CHECK IN THE AC
  652. /    EXIT + 1 WITH CHAR IN THE AC IF NO PREFIX QUOTING
  653. /    EXIT + 2 WITH PROPER CHAR IN THE AC AND QUOTING IS REQUIRED
  654.  
  655. OPRE,    0
  656.     MQL                /SAVE CHAR
  657.     TAD    QFLAG            /CHECK FOR IN CTRL QUOTE MODE
  658.     SZA CLA                /SKIP IF YES
  659.     JMP    OPRE1            /NO QUOTE PREFIX
  660.  
  661.     MQA                /GET CHAR
  662.     AND    (7740            /QUICK CHECK FOR LT 40
  663.     SNA CLA                /SKIP IF NOT CONTROL
  664.     JMP    OPRE2            /PREFIX QUOTE
  665.  
  666.     MQA                /GET CHAR
  667.     TAD    (-177            /CHECK FOR "DELETE"
  668.     SNA CLA                /SKIP IF NOT
  669.     JMP    OPRE2            /PREFIX QUOTE
  670.  
  671.     MQA                /GET CHAR
  672.     CIA                /NEGATE FOR COMPARE
  673.     TAD    RQCTL            /SEE IF SAME AS QUOTE CHAR
  674.     SZA CLA                /SKIP IF PREFIX QUOTE
  675.     JMP    OPRE1            /NO PREFIX QUOTE
  676.  
  677.     TAD    RQCTL            /PREFIX WITH PREFIX
  678.     JMP    OPRE3            /PREFIX WITH THE PREFIX
  679.  
  680. OPRE1,    MQA                /GET CHAR
  681.     JMP I    OPRE            /DONE
  682.  
  683.  
  684. OPRE2,    MQA                /GET CHAR
  685.     TAD    (100            /MAKE IT PRINTABLE
  686.     AND    C177            /IN CASE WAS 177
  687.  
  688. OPRE3,    ISZ    OPRE            /BUMP FOR PREFIX RETURN
  689.     JMP I    OPRE            /DONE
  690.  
  691. PAGE
  692.  
  693.  
  694. /    ROUTINE TO SCAN A TEXT LINE FOR KEYWORD DELIMITERS.  ROUTINE EXPECTS
  695. /    THE AC TO POINT TO A TEXT LINE TO SCAN AND FINDS THE FIRST NON-SPACE,
  696. /    NON-END OF LINE CHAR IN THE LINE AND SETS "SCAN1" TO POINT TO IT.
  697. /    NEXT WE FIND THE LAST CHAR IN THE LINE THAT IS A NON-SPACE, NON-END
  698. /    OF LINE AND STORE A POINTER TO IT IN "SCAN2".  KEYWORDS ARE DELIMITED
  699. /    BY A BEGINNING OF LINE OR SPACE AT THE BEGINNING AND AN END OF LINE
  700. /    OR A SPACE AT THE END
  701.  
  702. /    ENTER:    AC = POINTER TO COMMAND LINE
  703.  
  704. /    EXIT: (SUCCESS)    SCAN1 = POINTER TO FIRST CHAR OF KEYWORD
  705. /            SCAN2 = POINTER TO LAST CHAR OF KEYWORD
  706. /               RETURN = RETURN + 2 (NO WORDS LEFT IN LINE)
  707.  
  708. /    EXIT: (FAIL)   RETURN = RETURN + 1
  709.  
  710.  
  711.  
  712. SCNEL,    0
  713.     JMS    NOSP            /FIND FIRST NON-SPACE
  714.     JMP I    SCNEL            /END OF LINE RETURN
  715.     DCA    SCAN1            /RETURN SCAN LINE POINTER
  716.     TAD    SCAN1            /RE-GET SCAN LINE POINTER
  717.     JMS    SP            /FIND FIRST SPACE OR EOL
  718.     NOP                /RETURN HERE ON EOL
  719.     TAD    (-1            /BACK UP TO PREVIOUS CHAR
  720.     DCA    SCAN2            /SET END ELEMENT POINTER
  721.     ISZ    SCNEL            /TAKE SUCCESS RETURN
  722.     JMP I    SCNEL            /DONE
  723.  
  724.  
  725. /    ROUTINE TO SCAN THRU A TEXT LINE LOOKING FOR THE NEXT SPACE
  726. /    ENTER ROUTINE WITH THE LINE POINTER IN THE AC
  727.  
  728. /    EXIT:    RETURN + 2 WITH AC = POINTER TO SPACE
  729. /        RETURN + 1 WITH AC = POINTER TO END OF LINE
  730.  
  731. SP,    0
  732.     DCA    SCANTP            /USE A TEMP POINTER
  733.     SKP                /SKIP INTO LOOP BELOW
  734.  
  735. SP1,    ISZ    SCANTP            /BUMP LINE POINTER
  736.     TAD I    SCANTP            /GET A CHAR
  737.     SPA                /SKIP IF NOT END OF LINE
  738.     JMP    SP3            /GOT AN END OF LINE
  739.     TAD    (-SPACE            /COMPARE WITH A SPACE
  740.     SZA CLA                /SKIP IF IS A SPACE
  741.     JMP    SP1            /LOOP TILL SPACE OR EOL
  742.     ISZ    SP            /BUMP RETURN FOR SPACE FOUND
  743.  
  744. SP3,    CLA CLL                /INSURE A CLEAR AC
  745.     TAD    SCANTP            /GET POINTER VALUE
  746.     JMP I    SP            /RETURN IN AC
  747.  
  748.  
  749. /    ROUTINE TO SCAN THRU A TEXT LINE FOR THE FIRST NON-SPACE
  750. /    ENTER ROUTINE WITH POINTER TO THE LINE IN THE AC
  751.  
  752. /    EXIT:    RETURN + 2 WITH AC = POINTER TO NON-SPACE
  753. /        RETURN + 1 WITH AC = POINTER TO END OF LINE
  754.  
  755. NOSP,    0
  756.     DCA    SCANTP            /USE A TEMP POINTER
  757.     SKP                /SKIP INTO LOOP BELOW
  758.  
  759. NOSP1,    ISZ    SCANTP            /BUMP THE LINE POINTER
  760.     TAD I    SCANTP            /GET A CHAR FROM THE LINE
  761.     SPA                /SKIP IF NOT EOL
  762.     JMP    NOSP3            /EXIT IF EOL
  763.     TAD    (-SPACE            /COMPARE WITH A SPACE
  764.     SNA CLA                /SKIP IF NOT SPACE
  765.     JMP    NOSP1            /LOOP TILL SPACE OR EOL
  766.     ISZ    NOSP            /BUMP RETURN FOR SPACE FOUND
  767.  
  768. NOSP3,    CLA CLL                /INSURE CLEAR AC
  769.     TAD    SCANTP            /GET POINTER
  770.     JMP I    NOSP            /RETURN IN AC
  771.  
  772.  
  773.  
  774. /    ROUTINE TO FIND AN END CHAR IN A STRING
  775. /    ENTER ROUTINE WITH POINTER TO THE STRING IN THE AC
  776. /    EXIT WITH THE POINTER TO THE FIRST MINUS CHAR IN THE AC
  777.  
  778. FNDEND,    0
  779.     DCA    SCANTP            /PUT POINTER IN SCANTP
  780.  
  781. FEND1,    TAD I    SCANTP            /GET A CHAR FROM THE STRING
  782.     SPA CLA                /SKIP IF NOT END
  783.     JMP    FEND2            /EXIT IF END OF STRING
  784.     ISZ    SCANTP            /BUMP THE POINTER
  785.     JMP    FEND1            /LOOP TILL NON-END OF STRING
  786.  
  787. FEND2,    TAD    SCANTP            /GET POINTER TO NON-END OF STRING
  788.     JMP I    FNDEND            /EXIT WITH POINTER IN AC
  789.  
  790. SCANTP,    0        /USED IN THE SCAN ROUTINES "SP", "NOSP", "FNDNUL"
  791.  
  792.  
  793. /    ROUTINE TO LOOKUP THE KEY WORD POINTED TO BY THE AC IN THE TABLE POINTED
  794. /    TO BY PTABLE.
  795.  
  796. /    RETURN + 1 IF NO MATCH IS FOUND WITH AC = ENTRY VALUE
  797. /    RETURN + 2 IF NO KEYWORD IS FOUND (EOL DETECTED)
  798. /    RETURN + 3 IF MATCH IS FOUND WITH THE NEXT PARSE POSITION IN THE LINE
  799. /    IN THE AC AND THE DISPATCH ADDRESS FROM THE TABLE IN "KEYDSP"
  800.  
  801. KEYPRS,    0
  802.     DCA    LOOK3            /SAVE IN CASE OF FAIL
  803.     TAD    LOOK3            /RE-GET
  804.     JMS    SCNEL            /TRY TO SCAN OFF A KEYWORD
  805.     JMP    KP45            /END OF LINE ENCOUNTERED
  806.     TAD    PTABLE            /GET ADDRESS OF TABLE
  807.     DCA    LOOK2            /STORE IN LOCAL POINTER
  808.  
  809. KP10,    TAD    SCAN1            /GET ADDRESS OF SCAN ELEMENT
  810.     DCA    LOOK1            /INTO LOCAL POINTER
  811.  
  812. KP20,    TAD I    LOOK1            /GET A CHAR FROM THE SCAN ELEMENT
  813.     CIA                /NEGATE FOR COMPARE
  814.     TAD I    LOOK2            /GET A CHAR FROM THE TABLE ELEMENT
  815.     SZA CLA                /SKIP IF MATCH
  816.     JMP    KP90            /NO MATCH, SET TO LOOK AT NEXT TABLE ENTRY
  817.     TAD    LOOK1            /CHECK IF ALL ENTERED CHARS MATCH
  818.     CIA                /NEGATE TO COMPARE
  819.     TAD    SCAN2            /HAVE WE MATCHED TO THE TERMINATOR?
  820.     SNA CLA                /SKIP IF NO
  821.     JMP    KP40            /YES, GOT ENOUGH TO MATCH
  822.     ISZ    LOOK1            /MORE TO MATCH, BUMP SCAN ELEMENT POINTER
  823.     ISZ    LOOK2            /BUMP TABLE ELEMENT POINTER
  824.     JMP    KP20            /CONTINUE MATCH LOOP
  825.  
  826. KP40,    TAD    LOOK2            /GET CURRENT TABLE POINTER
  827.     JMS    FNDEND            /FIND A NULL MARK
  828.     IAC                /BUMP BY 1
  829.     DCA    LOOK1            /STORE IN A POINTER
  830.     TAD I    LOOK1            /GET DISPATCH ADDRESS
  831.     DCA    KEYDSP            /PUT INTO DISPATCH ADDRESS
  832.     ISZ    KEYPRS            /BUMP RETURN
  833.     ISZ    KEYPRS            /BUMP AGAIN
  834.     CLA CLL IAC            /AC = 1
  835.     TAD    SCAN2            /GET POINTER TO END OF CURRENT KEY
  836.     JMP I    KEYPRS            /RETURN
  837.  
  838.  
  839. /    END OF LINE ENCOUNTERED ON PARSE
  840.  
  841. KP45,    ISZ    KEYPRS            /BUMP RETURN ONCE FOR EOL
  842.  
  843. /    NO MATCHES IN THE TABLE HERE
  844.  
  845. KP50,    TAD    LOOK3            /GET ORIGINAL AC
  846.     JMP I    KEYPRS            /RETURN
  847.  
  848.  
  849. /    FAILURE ON CURRENT TABLE ENTRY, SET FOR NEXT ENTRY (IF THERE IS ONE) AND
  850. /    TRY AGAIN
  851.  
  852. KP90,    TAD    LOOK2            /GET TABLE POINTER
  853.     JMS    FNDEND            /FIND NEXT TABLE ENTRY
  854.     IAC                /NEXT ENTRY IS 2 PAST THE NULL
  855.     IAC
  856.     DCA    LOOK2            /RE-SET LOCAL TABLE POINTER
  857.     TAD I    LOOK2            /CHECK END OF TABLE
  858.     SNA CLA                /SKIP IF NOT END OF THE TABLE
  859.     JMP    KP50            /TAKE NOT FOUND EXIT
  860.     JMP    KP10            /TRY MATCH ON THIS ENTRY
  861.  
  862.  
  863. LOOK1,    0
  864. LOOK2,    0
  865. LOOK3,    0
  866.  
  867.  
  868. /    ROUTINE TO MOVE WORDS OF MEMORY
  869. /    ENTER WITH:    "MOVE1" = MINUS THE NUMBER OF WORDS TO MOVE
  870. /            AC    = SOURCE ADDRESS
  871. /            MQ    = DESTINATION ADDRESS
  872.  
  873. MOVE0,    0
  874.     DCA    MOVE5        /STORE SOURCE ADDRESS IN LOCAL POINTER
  875.     MQA            /GET DESTINATION ADDRESS
  876.     DCA    MOVE6        /STORE IN LOCAL POINTER
  877.  
  878. MOVE1,    TAD I    MOVE5        /GET A WORD FROM THE SOURCE
  879.     DCA I    MOVE6        /MOVE TO DESTINATION
  880.     ISZ    MOVE5        /BUMP SOURCE POINTER
  881.     ISZ    MOVE6        /BUMP DESTINATION COUNTER
  882.     ISZ    MOVE4        /BUMP COUNTER
  883.     JMP    MOVE1        /LOOP
  884.     JMP I    MOVE0        /DONE
  885.  
  886. MOVE5,    0        /SOURCE POINTER FOR "MOVE"
  887. MOVE6,    0        /DESTINATION POINTER FOR "MOVE"
  888.  
  889. PAGE
  890.  
  891.  
  892. /    ROUTINE TO PARSE OFF A DEVICE NAME FROM THE COMMAND LINE.
  893.  
  894. /    ENTER WITH:    POINTER TO COMMAND LINE IN THE AC
  895. /    NON-ERROR EXIT:    RETURN + 2
  896. /            POINTER TO REMAINDER OF LINE IN THE AC
  897. /            DEVNUM = DEVICE NUMBER TO USE
  898.  
  899. /    ERROR EXIT:    RETURN + 1
  900. /            ORIGINAL AC
  901.  
  902. DPARS,    0
  903.     DCA    DPAR10            /SAVE INITIAL POINTER TO LINE
  904.     TAD    DPAR10            /GET POINTER
  905.     JMS    NOSP            /GET PAST ANY LEADING SPACES
  906.     JMP    DFDEV            /GOT END OF LINE, USE DEFAULT DEVICE
  907.     DCA    DPAR11            /SAVE POINTER TO LINE
  908.     DCA    DEVNAM            /INIT DEVICE NAME FOR "INQUIRE"
  909.     DCA    DEVNAM+1
  910.     DCA    DEVNUM            /INIT DEVICE NUMBER
  911.     TAD    (DEVNAM            /GET ADDRESS OF WHERE TO PUT DEV NAME
  912.     DCA    PACK6P            /STORE IN PACK6 POINTER
  913.     DCA    PACK6F            /INIT PACK6 FLAG FOR LOW BYTE
  914.     TAD    (-4            /SET UP A COUNTER
  915.     DCA    DPAR13            /FOR NO MORE THAN 4 CHARS
  916.  
  917. DPAR1,    TAD I    DPAR11            /GET A CHAR FROM THE LINE
  918.     SNA                /SKIP IF NOT EOL
  919.     JMP    DFDEV            /GOT AN EOL, USE DEFAULT DEVICE
  920.     TAD    (-":            /CHECK FOR END OF DEVICE NAME
  921.     SNA CLA                /SKIP IF NOT END OF DEVICE NAME
  922.     JMP    DPAR2            /DEVICE NAME SET UP
  923.     TAD I    DPAR11            /RE-GET CHAR
  924.     ISZ    DPAR11            /BUMP LINE POINTER
  925.     PACK6                /PACK 6 BIT
  926.     ISZ    DPAR13            /BUMP CHAR COUNTER
  927.     JMP    DPAR1            /CAN CONTINUE
  928.     SKP                /DO NOT BUMP POINTER AGAIN
  929.  
  930.     ISZ    DPAR11            /BUMP TO NEXT CHAR
  931.     TAD I    DPAR11            /GET CHAR AFTER THE 4TH
  932.     TAD    (-":            /THIS MUST BE A ":"
  933.     SZA CLA                /SKIP IF YES, ALL IS OK
  934.     JMP    DFDEV            /USE THE DEFAULT DEVICE
  935.  
  936. DPAR2,    ISZ    DPAR11            /BUMP POINTER PAST ":"
  937.     TAD    (DEVNAM            /GET PARSED DEVICE NAME ADDRESS
  938.     JMP    DPAR4            /DO AN OS/8 "INQUIRE"
  939.  
  940. DFDEV,    TAD    DPAR10            /GET ORIGINAL AC FOR
  941.     DCA    DPAR11            /RETURN POINTER
  942.  
  943. DPAR4,    JMS    DVNUM            /GET DEVICE NUMBER
  944.     JMP    DPAR8            /DEVICE NAME ERROR
  945.     DCA    DEVNUM            /RETURN FOR CALLING PROGRAM
  946.     TAD    DPAR11            /GET CURRENT POINTER
  947.     ISZ    DPARS            /BUMP RETURN
  948.     JMP I    DPARS
  949.  
  950.  
  951. DPAR8,    CLA CLL                /INSURE CLEAR AC
  952.     TAD    DPAR10            /GET ORIGINAL AC
  953.     JMP I    DPARS            /TAKE ERROR EXIT
  954.  
  955.  
  956. DPAR10,    0            /TEMP FOR DPARS
  957. DPAR11,    0            /TEMP FOR DPARS
  958. DPAR13,    0            /TEMP FOR DPARS
  959. DEFDEV,    DEVICE    DSK        /DEFAULT DEVICE
  960. DEVNAM,    FILENAME    ZZZZZZ.ZZ
  961.  
  962.  
  963.  
  964. /    ROUTINE TO RETURN A DEVICE NUMBER FOR A DEVICE NAME
  965. /    ENTER AC = ADDRESS OF DEVICE NAME
  966. /        OR
  967. /    ENTER AC = 0 IF DEFAULT "DSK" IS TO BE USED
  968. /    EXIT + 2 WITH DEVICE NUMBER IN AC IF ALL OK
  969. /    EXIT + 1 IF INVALID DEVICE
  970.  
  971.  
  972. DVNUM,    0
  973.     SNA                /SKIP IF DEVICE NAME SPECIFIED
  974.     TAD    (DEFDEV            /ELSE USE DEFAULT
  975.     DCA    DVNUM9            /SAVE IN LOCAL POINTER
  976.     TAD I    DVNUM9            /GET FIRST 2 CHARS OF NAME
  977.     DCA    DVNUM5            /PUT INTO CALL
  978.     ISZ    DVNUM9            /BUMP POINTER
  979.     TAD I    DVNUM9            /GET LAST 2 CHARS OF NAME
  980.     DCA    DVNUM5+1        /PUT INTO CALL
  981.     CIF    10            /CALL USER SERVICE FOR "INQUIRE"
  982.     JMS I    USR
  983.     12                /FUNCTION CODE 12
  984. DVNUM5,    0                /FIRST 2 BYTES OF DEVICE NAME
  985.     0                /LAST 2 BYTES OF DEVICE NAME
  986.     0                /ENTRY POINT OF HANDLER RETURNED HERE
  987.     JMP I    DVNUM            /ERROR, TAKE ERROR EXIT
  988.     TAD    DVNUM5+1        /DEVICE NUMBER
  989.     ISZ    DVNUM            /BUMP RETURN FOR NO ERROR
  990.     JMP I    DVNUM            /RETURN
  991.  
  992. DVNUM9,    0        /LOCAL FOR "DVNUM"
  993.  
  994.  
  995. /    ROUTINE TO CONVERT A STRING OF BYTES INTO PDP8 CHARS WHICH HAVE
  996. /    THE TOP BIT (BIT 7) SET.
  997. /    ENTER:    AC = ADDRESS OF STRING
  998. /             OR
  999. /        CALL + 1 = ADDRESS OF STRING
  1000. /    EXIT:    STRING HAS TOP BYTE SET
  1001.  
  1002. /    STRING IS TERMINATED ON A MINUS WORD
  1003.  
  1004. XLATE8,    0
  1005.     SZA                /SKIP IF ADDRESS AT CALL + 1
  1006.     JMP    XLAT81            /ADDRESS IN AC
  1007.     TAD I    XLATE8            /GET ADDRESS FROM CALL + 1
  1008.     ISZ    XLATE8            /BUMP RETURN PAST ADDRESS
  1009.  
  1010. XLAT81,    DCA    XLAT89            /STORE IN LOCAL POINTER
  1011.  
  1012. XLAT82,    TAD I    XLAT89            /GET A BYTE FROM STRING
  1013.     SPA                /SKIP IF NOT TERMINATOR
  1014.     JMP    XLAT83            /CLEAR AC AND EXIT
  1015.     AND    C177            /STRIP OFF ANY BIT 7
  1016.     TAD    (200            /NOW INSURE IT IS SET
  1017.     DCA I    XLAT89            /RETURN IT
  1018.     ISZ    XLAT89            /BUMP THE POINTER
  1019.     JMP    XLAT82            /LOOP
  1020.  
  1021. XLAT83,    CLA CLL                /INSURE CLEAR AC
  1022.     JMP I    XLATE8            /DONE WITH THIS STRING
  1023.  
  1024. XLAT89,    0            /LOCAL POINTER FOR "XLATE8"
  1025.  
  1026.  
  1027. /    ROUTINE TO GO THRU A STRING OF BYTES AND INSURE THE TOP BIT
  1028. /    (BIT 7) IS CLEAR.
  1029. /    ENTER WITH ADDRESS OF STRING IN AC OR AT CALL + 1
  1030. /    THE STRING TERMINATES ON A MINUS WORD
  1031.  
  1032. XLATE7,    0
  1033.     SZA                /SKIP IF ADDRESS NOT IN AC
  1034.     JMP    XLAT71            /ADDRESS IN AC
  1035.     TAD I    XLATE7            /GET ADDRESS FROM CALL + 1
  1036.     ISZ    XLATE7            /BUMP RETURN
  1037.  
  1038. XLAT71,    DCA    XLAT79            /STORE ADDRESS IN POINTER
  1039.  
  1040. XLAT72,    TAD I    XLAT79            /GET A CHAR FROM STRING
  1041.     SPA                /SKIP IF NOT END OF STRING
  1042.     JMP    XLAT73            /END OF STRING, TERMINATE
  1043.     AND    C177            /KEEP ONLY LOW 7 BITS
  1044.     DCA I    XLAT79            /RETURN
  1045.     ISZ    XLAT79            /BUMP POINTER
  1046.     JMP    XLAT72            /LOOP
  1047.  
  1048. XLAT73,    CLA CLL                /INSURE CLEAR AC
  1049.     JMP I    XLATE7            /RETURN
  1050.  
  1051. XLAT79,    0        /POINTER FOR "XLATE7"
  1052.  
  1053. PAGE
  1054.  
  1055.  
  1056. /    ROUTINE TO PARSE OFF A FILE NAME
  1057. /    FILE NAME TO BE PARSED MUST BE LETTERS OR DIGITS AND BE NO MORE THAN
  1058. /    SIX CHARS FOR THE NAME AND TWO CHARS FOR THE EXTENSION.
  1059.  
  1060. /    ENTER WITH:    AC =    POINTER TO FILE NAME TO PARSE
  1061. /             FNPTR =    POINTER TO WHERE TO PUT THE PARSED FILE NAME
  1062.  
  1063. /    NON-ERROR EXIT: AC =    POINTER TO REMAINDER OF COMMAND LINE
  1064. /                       RETURN THE CALL + 2
  1065.  
  1066. /    ERROR EXIT:    AC =    ORIGINAL POINTER
  1067. /                RETURN THE CALL + 1
  1068.  
  1069. PFNAM,    0
  1070.     DCA    PFN10            /SAVE POINTER TO FILE NAME STRING
  1071.     TAD    PFN10            /GET POINTER TO NAME
  1072.     JMS    XLATE8            /INSURE PARITY BIT SET
  1073.     TAD    FNPTR            /GET POINTER TO FILE NAME BLOCK
  1074.     MQL                /SET FOR "CLEAR" ROUTINE
  1075.     TAD    (-4            /FOUR WORDS TO CLEAR OUT
  1076.     CLEAR                /INIT THE FILE NAME BLOCK
  1077.     TAD    PFN10            /GET THE STRING POINTER
  1078.     JMS    NOSP            /GET PAST ANY LEADING SPACES
  1079.     JMP    PFNAM9            /GOT EOL, NO FILE NAME
  1080.     DCA    PFN11            /SAVE POINTER
  1081.     TAD    FNPTR            /GET FILE NAME BLOCK POINTER
  1082.     DCA    PACK6P            /SET UP THE "PACK6" POINTER
  1083.     DCA    PACK6F            /INIT THE "PACK6" FLAG
  1084.     TAD    (-6            /MAX OF 6 CHARS FOR FILE NAME
  1085.     DCA    PFN15            /PUT INTO COUNTER
  1086.     DCA    WILDF            /INIT THE WILD CARD FLAG
  1087.     JMS    NAM            /MOVE AND PACK FILE NAME
  1088.     TAD I    PFN11            /GET THE TERM CHAR
  1089.     SPA                /SKIP IF NOT EOL
  1090.     JMP    PFNAM7            /EOL MEANS END OF FILE NAME
  1091.     TAD    (-".            /WAS IT A "."?
  1092.     SNA                /SKIP IF NO
  1093.     JMP    PFNAM3            /GO HANDLE EXTENSION
  1094.     TAD    (".-"             /CHECK FOR A SPACE
  1095.     SZA CLA                /SKIP IF WAS A SPACE
  1096.     JMP    PFNAM9            /NOT A SPACE, GOT AN ERROR
  1097.     JMP    PFNAM7            /IS A SPACE, END OF FILE NAME
  1098.  
  1099. PFNAM3,    ISZ    PFN11            /BUMP PAST THE "."
  1100.     CLA CLL CML IAC RAL        /AC = 3
  1101.     TAD    FNPTR            /GET FILE NAME BLOCK POINTER
  1102.     DCA    PACK6P            /SET "PACK6" POINTER
  1103.     DCA    PACK6F            /INIT "PACK6" FLAG
  1104.     CLA CLL CMA RAL            /AC = -2
  1105.     DCA    PFN15            /COUNTER FOR 2 EXT CHARS
  1106.     JMS    NAM            /NOW DO THE EXTENSION
  1107.     TAD I    PFN11            /GET THE TERM CHAR
  1108.     SPA                /SKIP IF NOT EOL
  1109.     JMP    PFNAM7            /GOT COMPLETE FILE NAME HERE
  1110.     TAD    (-"             /CAN BE A SPACE
  1111.     SZA CLA                /SKIP IF IT WAS
  1112.     JMP    PFNAM9            /GOT A FILE NAME ERROR
  1113.  
  1114. PFNAM7,    ISZ    PFNAM            /BUMP RETURN FOR GOOD FILE NAME
  1115.     CLA CLL                /INSURE CLEAR AC
  1116.     TAD    PFN11            /GET CURRENT STRING POINTER
  1117.     JMP I    PFNAM            /AND RETURN
  1118.  
  1119. PFNAM9,    CLA CLL                /INSURE CLEAR AC
  1120.     TAD    PFN10            /GET ORIGINAL STRING POINTER
  1121.     JMP I    PFNAM            /TAKE ERROR RETURN
  1122.  
  1123.  
  1124. PFN10,    0        /TEMP FOR PFNAM ROUTINE
  1125. PFN11,    0        /TEMP FOR PFNAM ROUTINE
  1126. PFN15,    0        /TEMP FOR PFNAM ROUTINE
  1127.  
  1128.  
  1129. /    LOCAL ROUTINE TO "PFNAM" TO MOVE IN THE FILE NAME OR FILE EXTENSION
  1130. /    ENTER WITH "PFN11" POINTING TO WHERE TO GET THE NAME OR EXTENSION
  1131. /    AND "PFN15" EQUAL TO THE MAX NUMBER OF CHARS (6 FOR NAME, 2 FOR EXT)
  1132. /    THIS ROUTINE CHECKS FOR WILD CARD CHARS "*" AND "?" AND PUTS THE
  1133. /    "?" CHAR IN FOR ANY CHARS IN THE NAME THAT ARE WILD.  ALSO IF ANY
  1134. /    WILD CARD CHARS ARE FOUND THE FLAG "WILDC" IS SET SO BEFORE PARSING
  1135. /    ANY FILE NAME THE "WILDC" FLAG SHOULD BE INITIALIZED.
  1136.  
  1137. NAM,    0
  1138. NAM0,    TAD I    PFN11            /GET A CHAR FROM THE STRING
  1139.     JMS    ALPNUM            /MUST BE ALPHA OR NUMBER
  1140.     SKP                /NOT A ALPHA NUMERIC
  1141.     JMP    NAM3            /IS ALPHA NUMERIC
  1142.     TAD    (-"?            /IS IT A SINGLE WILD CARD CHAR
  1143.     SNA                /SKIP IF NO
  1144.     JMP    NAM2            /YES, JUST PUT IT IN
  1145.     TAD    ("?-"*            /IS IT A MULTIPLE WILD CARD CHAR?
  1146.     SZA CLA                /SKIP IF YES
  1147.     JMP I    NAM            /TAKE THE FILE NAME ERROR EXIT
  1148.     ISZ    WILDF            /SET FLAG FOR WILD CARD FOUND
  1149.  
  1150. NAM1,    TAD    ("?            /FILL REMAINING WITH WILD CARD CHAR
  1151.     PACK6                /PUT IN NAME BLOCK
  1152.     ISZ    PFN15            /BUMP CHAR COUNTER
  1153.     JMP    NAM1            /LOOP TILL ALL FILLED
  1154.     ISZ    PFN11            /BUMP THE STRING POINTER
  1155.     JMP    NAM9            /EXIT WITH "PFN11" POINTING TO NEXT CHAR
  1156.  
  1157. NAM2,    ISZ    WILDF            /SET FLAG FOR WILD CARD FOUND
  1158.     TAD    ("?            /GET THE WILD CHAR
  1159.  
  1160. NAM3,    PACK6                /PUT THE CHAR INTO THE FILE NAME BLOCK
  1161.     ISZ    PFN11            /BUMP THE STRING POINTER
  1162.     ISZ    PFN15            /BUMP THE CHAR COUNTER
  1163.     JMP    NAM0            /LOOP
  1164.  
  1165. NAM4,    TAD I    PFN11            /NOW GET TO A TERMINATOR CHAR
  1166.     JMS    ALPNUM            /BY FINDING FIRST NON-ALPHNUMERIC
  1167.     JMP    NAM9            /NOW WE CAN QUIT
  1168.     CLA CLL                /IGNORE EXCESS CHARS
  1169.     ISZ    PFN11            /BUMP THE STRING POINTER
  1170.     JMP    NAM4            /LOOP
  1171.  
  1172. NAM9,    CLA CLL                /LEAVE WITH A CLEAR AC
  1173.  
  1174.     JMP I    NAM            /RETURN
  1175.  
  1176.  
  1177. /    ROUTINE TO SEND A PACKET
  1178. /    ENTER WITH ADDRESS OF PACKET DATA IN CALL + 1
  1179. /    AND TYPE OF PACKET IN CALL + 2
  1180. /    EXIT CALL + 4 IF ACK RETURNED
  1181. /    EXIT CALL + 3 IF NAK OR OTHER PACKET TYPE RETURNED
  1182.  
  1183. SNDP,    0
  1184.     TAD I    SNDP            /GET DATA ADDRESS
  1185.     DCA    SNDP1            /STORE IN CALL
  1186.     ISZ    SNDP            /BUMP POINTER
  1187.     TAD I    SNDP            /GET PACKET TYPE
  1188.     DCA    SNDP2            /STORE IN CALL
  1189.     ISZ    SNDP            /BUMP
  1190.  
  1191.     FPACK                /FORMAT A PACKET
  1192. SNDP1,    0                /DATA ADDRESS GOES HERE
  1193. SNDP2,    0                /PACKET TYPE GOES HERE
  1194.  
  1195. SNDP3,    SPACK                /SEND A DATA PACKET
  1196.     1                /GET RESPONSE
  1197.     SNDP9                /RESPONSE DISPATCH TABLE ADDRESS
  1198.  
  1199. /    HERE ON NOT "NAK" OR "ACK" RESPONSE
  1200.  
  1201.     SKP
  1202.  
  1203. /    HERE ON "ACK"
  1204.  
  1205. SNDP5,    ISZ    SNDP            /BUMP RETURN
  1206.  
  1207.     ISZ    SNDP            /BUMP RETURN
  1208.     JMP I    SNDP            /EXIT
  1209.  
  1210. /    HERE ON NAK
  1211.  
  1212. SNDP4,    ISZ    RTRYC            /BUMP THE RE-TRY COUNTER
  1213.     JMP    SNDP3            /RE-TRY
  1214.     JMP I    SNDP            /TAKE RETURN + 3
  1215.  
  1216. SNDP9,    STACK;    SNDP5        /ACK
  1217.     STACK;    SNDP4        /NAK
  1218.     0
  1219.  
  1220. PAGE
  1221.  
  1222.  
  1223. /    ROUTINE TO PARSE OFF A DECIMAL NUMBER
  1224. /    ENTER ROUTINE WITH A POINTER TO THE PARSE LINE IN THE AC
  1225. /    EXIT:    RETURN + 1 FOR NO NUMBER
  1226. /        RETURN + 2 FOR INVALID NUMBER
  1227. /        RETURN + 3 FOR VALID NUMBER
  1228.  
  1229. /    IN ALL CASES ON RETURN THE AC WILL CONTAIN A POINTER TO THE NEXT
  1230. /    CHAR TO PARSE IN THE LINE.  ANY NUMBER PARSED WILL BE CONVERTED
  1231. /    TO BINARY AND PUT INTO THE REGISTER "BININP".
  1232.  
  1233. DECPRS,    0
  1234.     JMS    NOSP            /GET PAST ANY LEADING SPACES
  1235.     JMP I    DECPRS            /GOT AN END OF LINE, AC POINTS TO IT
  1236.     DCA    DP10            /SAVE POINTER TO LINE
  1237.     TAD    DP10            /RE-GET POINTER TO LINE
  1238.     DCA    DP11            /STORE IN OUR LINE POINTER
  1239.     DCA    BININP            /INIT BINARY REGISTER
  1240.     DCA    DP13            /INIT PARSED NUMBER FLAG
  1241.     SKP                /SKIP INTO LOOP BELOW
  1242.  
  1243. DP1,    ISZ    DP11            /BUMP THE LINE POINTER
  1244.     TAD I    DP11            /GET A CHAR FROM THE LINE
  1245.     JMS    DECCK            /CHECK FOR PROPER ASCII DECIMAL
  1246.     JMP    DP5            /NOT PROPER ASCII DECIMAL
  1247.     ISZ    DP13            /FLAG NUMBER INPUT
  1248.     TAD    (-"0            /MAKE BINARY
  1249.     DCA    DP12            /AND STORE
  1250.     TAD    BININP            /GET PREVIOUS INPUT
  1251.     JMS    MUL10            /AND MULTIPLY TIMES 10
  1252.     SZL                /SKIP IF NO OVERFLOW ENCOUNTERED
  1253.     JMP    DP6            /GOT AN OVERFLOW ERROR
  1254.     TAD    DP12            /COMBINE WITH CURRENT INPUT
  1255.     SZL                /SKIP IF NO OVERFLOW ERROR
  1256.     JMP    DP6            /GOT AN OVERFLOW ERROR
  1257.     DCA    BININP            /RETURN ACCUMULATED SUM
  1258.     JMP    DP1            /LOOP
  1259.  
  1260. DP5,    CLA CLL                /AC MAY NOT BE CLEAR
  1261.     TAD    DP13            /ANY NUMBERS INPUT YET?
  1262.     SNA CLA                /SKIP IF YES
  1263.     JMP    DP6            /TAKE THE NO NUMBER INPUT RETURN
  1264.     ISZ    DECPRS            /BUMP THE RETURN
  1265.     ISZ    DECPRS            /TWICE FOR GOOD NUMBER INPUT RETURN
  1266.     TAD    DP11            /GET POINTER TO LINE
  1267.     JMP I    DECPRS            /AND RETURN
  1268.  
  1269. DP6,    CLA CLL                /AC MAY NOT BE CLEAR
  1270.     TAD    DP10            /GET ORIGINAL LINE POINTER
  1271.     ISZ    DECPRS            /BUMP THE RETURN
  1272.     JMP I    DECPRS            /TAKE THE INVALID NUMBER RETURN
  1273.  
  1274. DP10,    0        /TEMP FOR DECPRS
  1275. DP11,    0        /TEMP FOR DECPRS
  1276. DP12,    0        /TEMP FOR DECPRS
  1277. DP13,    0        /TEMP FOR DECPRS
  1278.  
  1279.  
  1280. /    ROUTINE TO MULTIPLY THE VALUE OF THE AC TIMES 10
  1281. /    VALUE IN THE AC IS ASSUMED BINARY
  1282.  
  1283. /    THE NUMBER IS RETURNED IN THE AC.  IF THE LINK IS SET THE MULTIPLY
  1284. /    OVERFLOWED 12 BITS.
  1285.  
  1286. MUL10,    0
  1287.     DCA    MULTMP            /SAVE THE NUMBER
  1288.     TAD    MULTMP            /GET THE NUMBER BACK
  1289.     CLL RTL                /MULTIPLY TIMES 4
  1290.     TAD    MULTMP            /TIMES 5
  1291.     SZL                /SKIP IF NO OVERFLOW
  1292.     SKP                /GOT OVERFLOW
  1293.     RAL                /TIMES 10
  1294.     JMP I    MUL10            /RETURN NUMBER IN AC
  1295.                     /THE LINK HAS ANY OVERFLOW
  1296.  
  1297. MULTMP,    0            /TEMP STORAGE FOR MUL10 ROUTINE
  1298.  
  1299.  
  1300.  
  1301. /    ROUTINE TO CHECK FOR A VALID ASCII DECIMAL VALUE
  1302.  
  1303. /    ENTER WITH ASCII CHAR IN THE AC
  1304. /    EXIT RETURN + 1 IF NON-VALID ASCII DECIMAL WITH CHAR IN AC
  1305. /    EXIT RETURN + 2 IF VALID ASCII DECIMAL WITH CHAR IN AC
  1306.  
  1307. DECCK,    0
  1308.     DCA    DECCK5            /STORE THE CHAR TO CHECK
  1309.     TAD    DECCK5            /GET THE CHAR
  1310.     TAD    (-"0            /CHECK FOR LESS THAN 0
  1311.     SPA                /SKIP IF NOT LESS THAN 0
  1312.     JMP    DECCK1            /NON-ASCII DECIMAL
  1313.     TAD    ("0-"9-1        /CHECK GREATER THAN 9
  1314.     SMA CLA                /SKIP IF LE 9
  1315.     JMP    DECCK1            /INVALID ASCII DECIMAL
  1316.     ISZ    DECCK            /BUMP RETURN FOR VALID ASCII DECIMAL
  1317.  
  1318. DECCK1,    TAD    DECCK5            /RE-GET ORIGINAL CHAR IN AC
  1319.     JMP I    DECCK            /RETURN
  1320.  
  1321.  
  1322. DECCK5,    0        /TEMP FOR "DECCK" ROUTINE
  1323.  
  1324.  
  1325. /    ROUTINE TO INPUT A LINE FROM THE KEYBOARD
  1326.  
  1327.  
  1328. LININP,    0
  1329.     TAD    (LINBUF            /GET ADDRESS OF LINE BUFFER
  1330.     DCA    LIN50            /STORE IN A POINTER
  1331.  
  1332. LIN1,    JMS    ITTYW            /INPUT A CHAR
  1333.     TAD    (-CR            /CHECK FOR A RETURN TYPED
  1334.     SNA                /SKIP IF NOT A RETURN
  1335.     JMP    LIN2            /LINE IS INPUT
  1336.     TAD    (CR-DELETE        /CHECK FOR A DELETE CHAR
  1337.     SNA CLA                /SKIP IF NOT A DELETE
  1338.     JMP    LIN5            /OFF TO HANDLE A DELETE
  1339.     TAD    LIN50            /GET VALUE OF LINE POINTER
  1340.     TAD    (-LINBUF-LINSIZ        /COMPARE WITH END OF LINE BUFFER
  1341.     SMA CLA                /SKIP IF ROOM IN LINE BUFFER
  1342.     JMP    LIN10            /BEEP FOR FULL BUFFER
  1343.     TAD    TCHAR            /RE-GET CHAR JUST INPUT
  1344.     TTYOUT                /DISPLAY ON THE SCREEN
  1345.     DCA I    LIN50            /STORE IN THE LINE BUFFER
  1346.     ISZ    LIN50            /BUMP THE LINE BUFFER POINTER
  1347.     STA                /AC = -1
  1348.     DCA I    LIN50            /TERMINATE THE LINE
  1349.     JMP    LIN1            /LOOP TILL A RETURN TYPED
  1350.  
  1351. LIN2,    STA                /AC = -1
  1352.     DCA I    LIN50            /INSURE STRING TERMINATED
  1353.     PRI6B;    CRLF            /SEND A CR/LF
  1354.     JMP I    LININP            /DONE
  1355.  
  1356. /    HANDLE A DELETE TYPED IN
  1357.  
  1358. LIN5,    TAD    LIN50            /FIND OUT FIRST IF...
  1359.     TAD    (-LINBUF        /WE ARE AT THE BEGINNING OF THE LINE
  1360.     SNA CLA                /SKIP IF NO
  1361.     JMP    LIN1            /JUST IGNORE THE DELETE
  1362.     STA                /AC = -1
  1363.     TAD    LIN50            /GET THE LINE POINTER
  1364.     DCA    LIN50            /RETURN BACKED UP
  1365.     DCA I    LIN50            /ZERO THE CHAR
  1366.     PRI6B;    RUBOUT            /ERASE THE CHAR FROM THE SCREEN
  1367.     JMP    LIN1            /BACK TO INPUT
  1368.  
  1369. /    HANDLE FULL LINE BUFFER HERE
  1370.  
  1371. LIN10,    CLA CLL                /INSURE CLEAR AC
  1372.     PRI6B;    BEEP            /SEND OUT A BEEP WARNING
  1373.     JMP    LIN1            /BACK TO MAIN LOOP TO WAIT FOR A
  1374.                     / RETURN OR DELETE KEY
  1375.  
  1376. LIN50,    0        /TEMP POINTER FOR "LININP" ROUTINE
  1377.  
  1378.  
  1379. /    ROUTINE TO PRINT THE DATA IN THE RECEIVED PACKET
  1380.  
  1381. PRIPAK,    0
  1382.     PRI8B;    RRDTA            /PRINT THE DATA
  1383.     PRI6B;    CRLF            /ADD IN A CR/LF
  1384.     JMP I    PRIPAK            /DONE
  1385.  
  1386. PAGE
  1387.  
  1388.  
  1389. /    ROUTINE TO HANDLE THE "CONNECT" COMMAND
  1390.  
  1391.  
  1392. CONSRV,    0
  1393.     ISZ    CONSRV            /ALWAYS NON-ERROR RETURN
  1394.     PRI6B;    CONMSG            /TELL THEM WE ARE CONNECTING
  1395.     TAD    (MLINE            /SET MODE ONLINE
  1396.     DCA    KMODE
  1397.     DCA    CONFLG            /RE-SET CONNECT FLAG
  1398.  
  1399. CONSR1,    JMS    IREM            /GET ANY INPUT FROM REMOTE COMPUTER
  1400.     TTYOUT                /RETURN HERE ON INPUT FROM REMOTE, SEND
  1401.                     /  TO THE TELEPRINTER DEVICE
  1402.     JMS    ITTY            /GET ANY INPUT FROM KEYBOARD
  1403.     SKP                /RETURN HERE ON INPUT FROM KEYBOARD
  1404.     JMP    CONSR1            /NO KEYBOARD INUPUT, CONTINUE POLL
  1405.     TAD    (-CONX1            /CHECK FOR FIRST EXIT CHAR
  1406.     SZA                /SKIP IF IS FIRST EXIT CHAR
  1407.     JMP    CONSR5            /NOT FIRST EXIT CHAR
  1408.     STA                /SET AC = -1
  1409.     DCA    CONFLG            /MAKE FLAG = -1
  1410.     JMP    CONSR1            /CONTINUE POLL
  1411.  
  1412. CONSR5,    TAD    (CONX1-CONX2        /CHECK FOR SECOND EXIT CHAR
  1413.     SZA CLA                /SKIP IF IT IS
  1414.     JMP    CONSR9            /JUST ECHO AND EXIT
  1415.     ISZ    CONFLG            /WE SKIP IF FIRST CHAR CAME BEFORE
  1416.     JMP    CONSR9            /FIRST CHAR DID NOT COME IN
  1417.     PRI6B;    CONEXT            /TELL THEM WE ARE EXITING THE CONNECT
  1418.     JMP I    CONSRV            /DONE WITH CONNECT SERVICE
  1419.  
  1420. CONSR9,    DCA    CONFLG            /RE-SET THE CONNECT FLAG
  1421.     TAD    TCHAR            /GET CHAR JUST ENTERED
  1422.     JMS    OREM            /DISPLAY ON THE TERMINAL
  1423.     CLA CLL                /INSURE CLEAR AC
  1424.     JMP    CONSR1            /CONTINUE POLL LOOP
  1425.  
  1426.  
  1427.  
  1428. /    ROUTINE TO HANDLE THE "BYE" COMMAND
  1429.  
  1430. BYESRV,    0
  1431.     FPACK                /FORMAT A PACKET
  1432.     SRVBYE                /PACKET DATA ADDRESS
  1433.     STGEN                /PACKET TYPE
  1434.  
  1435. BYE2,    SPACK                /SEND PACKET
  1436.     1                /AWAIT RESPONSE
  1437.     BYE20                /DISPATCH LIST FOR RESPONSE
  1438.  
  1439. /    NAK OR UNDEFINED RESPONSE HERE
  1440.  
  1441. BYE5,    ISZ    RTRYC            /BUMP RE-TRY COUNTER
  1442.     JMP    BYE2            /GET RESPONSE AND TRY AGAIN
  1443.     TAD    (NOBYE            /FAILED, RETURN MESSAGE
  1444.     JMP I    BYESRV
  1445.  
  1446. /    ACK HERE
  1447.  
  1448. BYE10,    ISZ    BYESRV            /BUMP FOR NON-ERROR EXIT
  1449.     JMP I    BYESRV            /DONE
  1450.  
  1451. BYE20,    STACK;    BYE10        /ACK
  1452.     STNAK;    BYE5        /NAK
  1453.     0
  1454.  
  1455. SRVBYE,    "F&137                /SERVER KERMIT COMMAND TO SHUT DOWN
  1456.     -1                /END OF DATA
  1457.  
  1458.  
  1459. /    EXIT OS/8 KERMIT
  1460.  
  1461. OS8,    0
  1462.     PRI6B;    EXTXT            /DISPLAY WE ARE EXITING
  1463.     CLA CLL
  1464.     JMP I    (7600            /BACK TO OS8
  1465.  
  1466.  
  1467. /    REMOTE LINK INPUT ROUTINE
  1468. /    CALL = RPACK
  1469.  
  1470. ILINK,    0
  1471.     TAD    RETRY            /SET UP A RE-TRY COUNT
  1472.     DCA    ILINK6            /RE-TRY COUNT FOR INPUT ERRORS
  1473.  
  1474. ILINK0,    JMS    GETSOH            /FIRST GET THE "SOH" BYTE
  1475.     JMP    ILINK2            /RETURN HERE ON TIME-OUT
  1476.     DCA    ILINK9            /INIT CHECKSUM REGISTER
  1477.     TAD    (RRLEN            /GET REMOTE RECEIVE BUFFER ADDRESS
  1478.     DCA    ILINK8            /STORE IN LOCAL POINTER
  1479.     JMS    GETIR            /GET A CHAR
  1480.     JMP    ILINK2            /GOT A RETURN OR TIME-OUT
  1481.     DCA I    ILINK8            /STORE LENGTH IN BUFFER
  1482.     TAD I    ILINK8            /GET LENGTH CHAR BACK
  1483.     TAD    (-40-1            /CHAR FUNCTION - LENGTH BYTE
  1484.     CIA                /NEGATE FOR COUNTER
  1485.     DCA    ILINK7            /STORE IN LOCAL COUNTER
  1486.  
  1487. ILINK1,    ISZ    ILINK8            /BUMP POINTER
  1488.     JMS    GETIR            /GET NEXT CHAR
  1489.     JMP    ILINK2            /GOT A RETURN
  1490.     DCA I    ILINK8            /STORE IN BUFFER
  1491.     ISZ    ILINK7            /BUMP COUNTER
  1492.     JMP    ILINK1            /LOOP
  1493.  
  1494.     ISZ    ILINK8
  1495.     STA
  1496.     DCA I    ILINK8
  1497.     TAD    ILINK9            /GET CACULATED CHECKSUM
  1498.     JMS    CKSUM            /CACULATE 1 BYTE CHECKSUM
  1499.     CIA                /NEGATE FOR COMPARE
  1500.     DCA    ILINK7            /STORE TEMP
  1501.     JMS    GETIR            /NOW GET CHECKSUM
  1502.     JMP    ILINK2            /GOT A RETURN
  1503.     TAD    ILINK7            /COMPARE WITH CACULATED CHECKSUM
  1504.     SNA CLA                /SKIP IF NOT SAME
  1505.     JMP    ILINK4            /ARE SAME
  1506.  
  1507. ILINK2,    CLA CLL                /INSURE CLEAR AC
  1508.     ISZ    ILINK6            /BUMP RE-TRY COUNTER
  1509.     JMP    ILINK3            /CAN RE-TRY
  1510.     TAD    (FPERR            /GET MESSAGE FOR FATAL PACKET ERROR
  1511.     JMP    CLOOP7            /AND ABORT THE MESS
  1512.  
  1513. ILINK3,    TAD    CCFLAG            /CHECK IF ^C TYPED
  1514.     SZA CLA                /SKIP IF NO
  1515.     JMP    ABORT            /ABORT THIS
  1516.  
  1517.     JMS    SNDNAK            /SEND BACK A "NAK"
  1518.     JMP    ILINK0            /AND TRY AGAIN
  1519.  
  1520. ILINK4,    TAD    CCFLAG            /WAS A ^C TYPED?
  1521.     SNA CLA                /SKIP IF YES
  1522.     JMP I    ILINK            /NOPE, RETURN
  1523.     JMP    ABORT
  1524.  
  1525.  
  1526. ILINK6,    0    /LOCAL TO "ILINK"
  1527. ILINK7,    0    /LOCAL TO "ILINK"
  1528. ILINK8,    0    /LOCAL TO "ILINK"
  1529. ILINK9,    0    /LOCAL TO "ILINK"
  1530.  
  1531. PAGE
  1532.  
  1533.  
  1534. /    ROUTINE TO SERVICE A SEND REQUEST
  1535.  
  1536. SNDSRV,    0
  1537.     TAD    (MSEND            /FIRST SET MODE TO SEND
  1538.     DCA    KMODE            /PUT INTO MODE FLAG
  1539.     TAD    LPTR            /GET CURRENT LINE POINTER
  1540.     DCA    PRSERR            /SAVE LINE POSITION
  1541.     TAD    PRSERR            /GET LINE POSITION
  1542.     JMS    DPARS            /TRY TO PARSE OFF A DEVICE NAME
  1543.     JMP    S50            /RETURN A DEVICE NAME ERROR
  1544.     DCA    PRSERR            /SAVE LINE POINTER
  1545.     TAD    (FNBLK            /GET FILE NAME BLOCK ADDRESS
  1546.     DCA    FNPTR            /STORE IN POINTER
  1547.     TAD    PRSERR            /GET STRING POINTER
  1548.     JMS    PFNAM            /PARSE OFF THE FILE NAME
  1549.     JMP    S52            /FILE NAME PARSE ERROR
  1550.     DCA    PRSERR            /SAVE THE STRING POINTER
  1551.     TAD    PRSERR            /GET THE STRING POINTER
  1552.     JMS    NOSP            /FIND THE END OF STRING
  1553.     SKP                /GOT END OF STRING HERE
  1554.     JMP    S50            /SYNTAX ERROR
  1555.     DCA    PRSERR            /RETURN POINTER
  1556.  
  1557.     TAD    DEVNUM            /GET THE DEVICE NUMBER PARSED
  1558.     JMS    HFETCH            /FETCH A HANDLER FOR THIS
  1559.     JMP    S54            /HANDLER FETCH ERROR
  1560.     DCA    DIRBLK            /INIT FOR DIRECTORY SEARCH
  1561.     DCA    FILFND            /INIT FILE FOUND FLAG
  1562.     DCA    INIFLG            /CLEAR THE INIT DONE FLAG
  1563.  
  1564. SNDSV1,    TAD    (FNBLK            /GET FILE NAME BLOCK ADDRESS
  1565.     DCA    FCMP1            /SET FOR FILE TO FINE
  1566.     JMS    LOOKUP            /FIND A MATCH FOR THIS FILE
  1567.     JMP    S56            /DIRECTORY I/O ERROR
  1568.     JMP    S00            /FILE NOT FOUND
  1569.     ISZ    FILFND            /BUMP FILE FOUND COUNT
  1570.     JMS    SNDPRO            /PROCESS THIS FILE FOR SEND
  1571.     JMP    S60            /ERROR IN FILE SEND PROCESS
  1572.     TAD    WILDF            /WAS WILD CARD FILE SPEC?
  1573.     SZA CLA                /SKIP IF NO
  1574.     JMP    SNDSV1            /GOT WILD CARD, TRY FOR NEXT
  1575.  
  1576. S00,    TAD    FILFND            /CHECK FOR ANY FILES FOUND
  1577.     SNA CLA                /SKIP IF YES
  1578.     JMP    S58            /RETURN FILE NOT FOUND ERROR
  1579.     JMS    BRKXMT            /BREAK THE SEND
  1580.     TAD    PRSERR            /GET CURRENT CURSOR POSITION
  1581.     DCA    LPTR            /UPDATE
  1582.     ISZ    SNDSRV            /BUMP RETURN
  1583.     JMP I    SNDSRV            /AND DONE
  1584.  
  1585.  
  1586. /    ERROR HANDLING FOR SEND PROCESS
  1587.  
  1588. S50,    CLA CLL                /INSURE CLEAR AC
  1589.     TAD    (DEVERR            /GET DEVICE SPECIFICATION ERROR
  1590.     JMP I    SNDSRV            /TAKE THE ERROR EXIT
  1591.  
  1592. S52,    CLA CLL                /INSURE CLEAR AC
  1593.     TAD    (STXERR            /GET SYNTAX ERROR MESSAGE
  1594.     JMP I    SNDSRV            /TAKE ERROR EXIT
  1595.  
  1596. S54,    CLA CLL                /INSURE CLEAR AC
  1597.     TAD    (HFERR            /GET HANDLER FETCH ERROR MESSAGE
  1598.     JMP I    SNDSRV            /TAKE ERROR EXIT
  1599.  
  1600. /    RETURN A DIRECTORY I/O ERROR MESSAGE
  1601.  
  1602. S56,    CLA CLL                /INSURE CLEAR AC
  1603.     TAD    (DIOERR            /GET DIRECTORY I/O ERROR MESSAGE
  1604.     JMP I    SNDSRV            /TAKE THE ERROR EXIT
  1605.  
  1606. /    RETURN A FILE NOT FOUND ERROR
  1607.  
  1608. S58,    TAD    (NOFND            /GET ADDRESS OF MESSAGE
  1609.     JMP I    SNDSRV            /RETURN VIA ERROR RETURN
  1610.  
  1611. /    RETURN A SEND PROCESS ERROR
  1612.  
  1613. S60,    TAD    (SPERR            /GET A SEND PROCESS ERROR MESSAGE
  1614.     JMP I    SNDSRV            /TAKE THE ERROR EXIT
  1615.  
  1616.  
  1617. FILFND,    0            /HOLDS COUNT OF # OF FILES FOUND
  1618.  
  1619. FNBLK,    0
  1620.     0
  1621.     0
  1622.     0
  1623.  
  1624.  
  1625.  
  1626.  
  1627. /    ROUTINE TO RE-SET THE SEND
  1628.  
  1629. BRKXMT,    0
  1630.     CLA CLL                /INSURE CLEAR AC
  1631.     DCA    INIFLG            /CLEAR THE INIT SEND FLAG
  1632.  
  1633.     FPACK                /FORMAT A PACKET
  1634.     NODATA                /NO DATA FOR THIS PACKET
  1635.     STEOT                /"EOT" PACKET TYPE
  1636.  
  1637.     SPACK                /SEND THE PACKET
  1638.     0                /NO RESPONSE
  1639.     JMP I    BRKXMT            /DONE
  1640.  
  1641.  
  1642.  
  1643. /    ROUTINE TO SEND OUT A NAK WITHOUT DISTURBING THE NORMAL PACKET BUFFER
  1644.  
  1645. SNDNAK,    0
  1646.     TAD    CURSEQ            /GET CURRENT SEQ NUMBER
  1647.     TAD    (40-1            /CHAR IT AND SUB 1
  1648.     AND    C77            /MOD 64
  1649.     DCA    NAKPAK+2        /PUT IN NAK PACKET BUFFER
  1650.     TAD    NAKPAK+1        /GET LENGTH
  1651.     TAD    NAKPAK+2        /GET SEQ
  1652.     TAD    NAKPAK+3        /GET TYPE
  1653.     JMS    CKSUM            /CACULATE CHECKSUM
  1654.     DCA    NAKPAK+4        /PUT IN CHECKSUM
  1655.     TAD    REOL            /GET ANY EOL REQUIRED
  1656.     TAD    (-40            /UN-CHAR IT
  1657.     SNA                /SKIP IF USING
  1658.     STA                /NO EOL, PUT IN -1 INSTEAD
  1659.     DCA    NAKPAK+5        /PUT EOL IN
  1660.     REM8B;    NAKPAK            /SEND NAK TO REMOTE
  1661.     JMP I    SNDNAK            /DONE
  1662.  
  1663.  
  1664. NAKPAK,    0
  1665.     43        /LENGTH OF NAK PACKET
  1666.     0        /SEQ NUMBER GOES HERE
  1667.     STNAK        /DATA TYPE
  1668.     0        /CHECKSUM
  1669.     0        /EOL IF USED
  1670.     -1        /TERMINATE
  1671.  
  1672.  
  1673. PAGE
  1674.  
  1675.  
  1676.  
  1677. /    ROUTINE TO SERVICE A "GET" COMMAND
  1678.  
  1679.  
  1680. GETSRV,    0
  1681.     TAD    LPTR            /GET CURRENT LINE POINTER
  1682.     DCA    PRSERR            /SAVE
  1683.     TAD    PRSERR            /RE-GET IT
  1684.     JMS    NOSP            /FIND BEGINNING OF A FILE NAME
  1685.     JMP    GSRV21            /GOT EOL, NO FILE NAME
  1686.     DCA    GSRV90            /STORE BEGINNING ADDRESS
  1687.     TAD    GSRV90            /NOW WE LOOK FOR
  1688.     JMS    SP            /THE END OF THE LINE
  1689.     SKP                /GOT THE END OF THE LINE HERE
  1690.     JMP    .-2            /NOT END YET, CONTINUE
  1691.     DCA    PRSERR            /STORE POINTER TO EOL
  1692.     STA                /AC = -1
  1693.     DCA I    PRSERR            /TERMINATE FILE NAME WITH -1
  1694.     DCA    CURSEQ            /RE-SET THE SEQUENCE
  1695.     TAD    GSRV90            /GET ADDRESS OF FILE NAME
  1696.     JMS    XLATE7            /INSURE 7 BIT ASCII FILE NAME
  1697.  
  1698. GSRV10,    FPACK                /FORMAT THE PACKET
  1699. GSRV90,    0                /DATA ADDRESS HERE
  1700.     STRIN                /RECIEVE INIT PACKET
  1701.  
  1702. GSRV12,    SPACK                /SEND THE PACKET
  1703.     1                /GET RESPONSE
  1704.     GSRV80                /DISPATCH TABLE
  1705.  
  1706. /    SERVICE A NAK OR UNDEFINED
  1707.  
  1708. GSRV15,    ISZ    RTRYC            /BUMP THE RE-TRY COUNTER
  1709.     JMP    GSRV12            /TRY AGAIN
  1710.     JMP I    GETSRV            /GIVE UP
  1711.  
  1712. /    SERVICE A SEND/INIT FROM THE REMOTE
  1713.  
  1714. GSRV20,    JMS    INPSRV            /HANDLE JUST LIKE A RECEIVE
  1715.     JMP    GSRV21            /ERROR RETURN FROM "INPSRV"
  1716.     ISZ    GETSRV            /BUMP RETURN FOR NO ERROR
  1717.     TAD    PRSERR            /UPDATE THE CURRENT LINE POINTER
  1718.     DCA    LPTR
  1719.  
  1720. GSRV21,    JMP I    GETSRV
  1721.  
  1722. /    GOT AN ERROR PACKET, DISPLAY ERROR AND ABORT
  1723.  
  1724. GSRV40,    JMS    PRIPAK            /PRINT OUT THE ERROR PACKET
  1725.     JMP I    GETSRV            /TAKE THE ERROR EXIT
  1726.  
  1727. /    DISPATCH TABLE
  1728.  
  1729. GSRV80,    STERR;    GSRV40        /ERROR PACKET RETURNED
  1730.     STSIN;    GSRV20        /SEND INIT PACKET RETURNED
  1731.     STNAK;    GSRV15        /NAK PACKET RETURNED
  1732.     0            /TERMINATE TABLE
  1733.  
  1734.  
  1735.  
  1736. /ROUTINE TO SERVICE A "RECEIVE" COMMAND
  1737.  
  1738. RECSRV,    0
  1739.     TAD    LPTR            /GET CURRENT LINE POINTER
  1740.     DCA    PRSERR            /SAVE IT
  1741.     TAD    PRSERR            /GET IT BACK
  1742.     JMS    NOSP            /GO FIND END OF LINE
  1743.     SKP                /GOT END OF LINE HERE
  1744.     JMP    RECS60            /SOMETHING ELSE ON LINE, ERROR
  1745.     RPACK                /GET SEND/INIT PACKET FROM REMOTE
  1746.     RTDISP;    RECS80            /DISPATCH BASED ON "RRTYP"
  1747.     JMP    RECS60            /DON'T KNOW WHAT IT IS
  1748.  
  1749. /    GOT A SEND INIT PACKET
  1750.  
  1751. RECS10,    JMS    INPSRV            /OFF TO HANDLE INPUT
  1752.     JMP    RECS60            /ERROR RETURN
  1753.  
  1754. /    TAKE THE NON-ERROR RETURN
  1755.  
  1756. RECS20,    ISZ    RECSRV            /BUMP FOR NON-ERROR RETURN
  1757.     JMP I    RECSRV
  1758.  
  1759. /    TAKE THE ERROR RETURN
  1760.  
  1761. RECS60,    CLA
  1762.     JMP I    RECSRV            /TAKE ERROR EXIT
  1763.  
  1764. /    DISPATCH TABLE
  1765.  
  1766. RECS80,    STSIN;    RECS10        /SEND INIT PACKET DISPATCH
  1767.     STEOT;    RECS60        /END OF CONNECTION
  1768.     STBRK;    RECS20        /BREAK TRANSMISSION
  1769.     0
  1770.  
  1771. RECS90,    0        /TEMP FOR "RECSRV"
  1772.  
  1773. PAGE
  1774.  
  1775.  
  1776.  
  1777. /    ROUTINE TO SERVICE INPUT OF A FILE
  1778.  
  1779. INPSRV,    0
  1780.     TAD    (MREC            /SET UP CURRENT MODE
  1781.     DCA    KMODE            /FOR RECEIVE
  1782.     JMS    SETINI            /SET UP INIT REGISTERS
  1783.     DCA    CURSEQ            /RE-SET THE SEQUENCE NUMBER
  1784.  
  1785.     FPACK                /FORMAT A PACKET
  1786.     INIDAT                /PACKET DATA ADDRESS
  1787.     STACK                /"ACK" PACKET TYPE
  1788.  
  1789.  
  1790. INPS01,    SPACK                /SEND A PACKET
  1791.     1                /AWAIT RESPONSE
  1792.     INPS91              /DISPATCH TABLE ADDRESS
  1793.  
  1794. /    NAK OR UNDEFINED RESPONSE HERE
  1795.  
  1796. INPS02,    ISZ    RTRYC            /GOT A NAK, CHECK RE-TRY COUNT
  1797.     JMP    INPS01            /RE-TRY THE INIT
  1798.     JMP    INPS60            /GIVE UP
  1799.  
  1800. INPS03,    FPACK                /FORMAT A PACKET
  1801.     NODATA                /NO DATA
  1802.     STACK                /"ACK" PACKET TYPE
  1803.  
  1804. INPS05,    SPACK                /SEND A PACKET
  1805.     1                /AWAIT RESPONSE
  1806.     INPS90                /DISPATCH TABLE ADDRESS
  1807.     JMP    INPS60            /UNDEFINED RESPONSE
  1808.  
  1809. /    GOT A DATA PACKET, WRITE TO OUTPUT FILE
  1810.  
  1811. INPS10,    TAD    OFFLG            /CHECK THE OUTPUT FILE FLAG
  1812.     SNA CLA                /SKIP IF OUTPUT FILE OPEN
  1813.     JMP    INPS60            /ABORT AND EXIT
  1814.     JMS    WRIPAK            /WRITE THE PACKET TO THE FILE
  1815.     JMP    INPS60            /ERROR WRITING PACKET
  1816.     JMP    INPS03            /LOOP
  1817.  
  1818. /    GOT A FILE HEADER PACKET, OPEN FILE
  1819.  
  1820. INPS20,    TAD    OFFLG            /CHECK IF OUTPUT FILE OPEN
  1821.     SZA CLA                /SKIP IF NO
  1822.     JMP    INPS60            /ABORT IF FILE ALREADY OPEN
  1823.     TAD    RRLEN            /GET CURRENT PACKET LENGTH
  1824.     TAD    (-40-3            /CACULATE LENGTH OF DATA
  1825.     SPA                /SKIP IF DATA IN THE PACKET
  1826.     JMP    INPS60            /ELSE AN ERROR
  1827.     TAD    (RRDTA            /CACULATE LAST BYTE IN DATA
  1828.     DCA    INPS81            /STORE IN POINTER
  1829.     STA                /AC = -1
  1830.     DCA I    INPS81            /TERMINATE NAME WITH A MINUS WORD
  1831.     TAD    (FNBLK            /GET ADDRESS OF FILE NAME BLOCK
  1832.     DCA    FNPTR            /SAVE FOR NAME PARSE
  1833.     TAD    (RRDTA            /GET ADDRESS OF DATA IN PACKET
  1834.     JMS    PFNAM            /PARSE OFF THE FILE NAME
  1835.     JMP    INPS60            /ERROR IN FILE NAME
  1836.  
  1837. /    GET TARGET DEVICE
  1838.  
  1839.     CLA CLL                /CLEAR AC FROM FILE NAME PARSE
  1840.     TAD    ODNAME            /GET TARGET DEVICE NAME
  1841.     JMS    DVNUM            /GET DEVICE NUMBER
  1842.     JMP    INPS60            /ERROR
  1843.     DCA    ODNUMB            /SAVE OUTPUT DEVICE NUMBER
  1844.     TAD    ODNUMB            /GET NUMBER BACK
  1845.     JMS    HFETCH            /FETCH HANDLER FOR THIS DEVICE
  1846.     JMP    INPS60            /HANDLER FETCH ERROR
  1847.     TAD    (FNBLK            /GET ADDRESS OF FILE NAME BLOCK
  1848.     DCA    INPS22            /PUT IN CALL
  1849.     TAD    ODNUMB            /GET DEVICE NUMBER
  1850.     CIF    10            /IF = 1
  1851.     JMS I    USR            /CALL USER SERVICE ROUTINE
  1852.     3                /ENTER
  1853. INPS22,    0                /
  1854.     0                /
  1855.     JMP    INPS60            /ERROR
  1856.     TAD    INPS22            /GET NEW FILE START BLOCK
  1857.     DCA    FSBLK            /SAVE
  1858.     TAD    INPS22+1        /GET NEW FILE SIZE
  1859.     DCA    FLEN            /SAVE
  1860.     ISZ    OFFLG            /SET FLAG FOR OUTPUT FILE OPEN
  1861.     JMS    INIOUT            /INIT FOR OUTPUT
  1862.     TAD    FNPTR            /GET POINTER TO 6 BIT FILE NAME
  1863.     JMS    FILN8            /MAKE 8 BIT FORMATTED STRING
  1864.     PRI6B;    FRMSG            /LET USER KNOW
  1865.     PRI8B;    NAMBUF            /WHICH FILE WE ARE RECEIVING
  1866.     PRI6B;    CRLF
  1867.     JMP    INPS03            /LOOP
  1868.  
  1869. /    GOT AN END OF FILE PACKET
  1870.  
  1871. INPS30,    TAD    OFFLG            /ANY OUTPUT FILE OPEN?
  1872.     SNA CLA                /SKIP IF YES
  1873.     JMP    INPS60            /ERROR
  1874.     JMS    CLOSEF            /CLOSE THE FILE
  1875.     JMP    INPS60            /ERROR CLOSING THE FILE
  1876.     DCA    OFFLG            /RE-SET FILE OPEN FLAG
  1877.     JMP    INPS03            /CONTINUE
  1878.  
  1879. /    GOT AN END OF TRANSMISSION PACKET
  1880.  
  1881. INPS40,    TAD    OFFLG            /WAS A FILE OPEN?
  1882.     SZA CLA                /SKIP IF NO
  1883.     JMS    CLOSEF            /CLOSE ANY OPEN FILE
  1884.  
  1885.     FPACK                /FORMAT A PACKET
  1886.     NODATA                /NO DATA IN PACKET
  1887.     STACK                /"ACK" PACKET TYPE
  1888.  
  1889.     SPACK                /SEND THE PACKET
  1890.     0                /NO RESPONSE
  1891.     ISZ    INPSRV            /BUMP RETURN FOR NO ERROR
  1892.     JMP I    INPSRV            /TAKE NON-ERROR EXIT
  1893.  
  1894. /    GOT AN ERROR PACKET
  1895.  
  1896. INPS50,    JMS    PRIPAK            /PRINT THE PACKET DATA
  1897.     JMP I    INPSRV            /AND TAKE THE ERROR EXIT
  1898.  
  1899. /    HANDLE ERRORS HERE
  1900.  
  1901. INPS60,    CLA CLL                /INSURE CLEAR AC
  1902.     FPACK                /FORMAT A PACKET
  1903.     NODATA                /NO DATA
  1904.     STNAK                /"NAK" PACKET TYPE
  1905.  
  1906.     SPACK                /SEND THE PACKET
  1907.     0                /NO RESPONSE
  1908.  
  1909.     TAD    (RECERR            /GET ERROR MESSAGE
  1910.     JMP I    INPSRV            /TAKE THE ERROR RETURN
  1911.  
  1912. /    TEMPS FOR "INPSRV"
  1913.  
  1914. INPS80,    0
  1915. INPS81,    0
  1916.  
  1917. PAGE
  1918.  
  1919. /    DISPATCH TABLES FOR "INPSRV"
  1920.  
  1921. INPS90,    STDAT;    INPS10        /HANDLE DATA PACKETS
  1922.     STEOF;    INPS30        /HANDLE EOF PACKET
  1923.     STEOT;    INPS40        /HANDLE END OF TRANSMISSION PACKET
  1924.     STFIL;    INPS20        /HANDLE FILE NAME PACKET
  1925.     STERR;    INPS50        /HANDLE ERROR PACKET
  1926.     0            /TERMINATE TABLE
  1927.  
  1928. INPS91,    STNAK;    INPS02        /HANDLE A NAK PACKET
  1929.     STFIL;    INPS20        /HANDLE FILE NAME PACKET
  1930.     STERR;    INPS50        /HANDLE ERROR PACKET
  1931.     0            /TERMINATE TABLE
  1932.  
  1933.  
  1934.  
  1935.  
  1936. /    ROUTINE TO CHECK FOR AN ALPHABETIC OR NUMERIC CHAR
  1937. /    ENTER WITH THE CHAR IN THE AC
  1938. /    EXIT + 2 IF ALPHABETIC OR NUMERIC WITH CHAR IN THE AC
  1939. /    EXIT + 1 IF NON-ALPHABETIC OR NUMERIC WITH CHAR IN THE AC
  1940.  
  1941. ALPNUM,    0
  1942.     JMS    ALPHA            /CHECK FOR ALPHA FIRST
  1943.     SKP                /NON-ALPHA RETURN, MUST CHECK NUMERIC
  1944.     JMP    ALPNM1            /IS ALPHA, TAKE RETURN + 2
  1945.     JMS    NUMRC            /CHECK IF NUMERIC
  1946.     SKP                /NOT NUMERIC
  1947.  
  1948. ALPNM1,    ISZ    ALPNUM            /BUMP RETURN FOR ALPHA-NUMERIC
  1949.     JMP I    ALPNUM            /DONE
  1950.  
  1951.  
  1952. /    ROUTINE TO CHECK FOR AN ALPHABETIC CHARACTOR
  1953. /    ROUTINE ASSUMES UPPER CASE
  1954. /    ENTER ROUTINE WITH CHAR IN THE AC
  1955. /    EXIT + 2 IF THE CHAR IS ALPHABETIC WITH THE CHAR IN THE AC
  1956. /    EXIT + 1 IF THE CHAR IS NOT ALPHABETIC WITH THE CHAR IN THE AC
  1957.  
  1958. ALPHA,    0
  1959.     DCA    ALPHA1            /STORE THE CHAR FOR RETURN
  1960.     TAD    ALPHA1            /GET THE CHAR
  1961.     TAD    (-"Z-1            /TESTING FOR LETTER A-Z
  1962.     CLL                /INIT LINK FOR A FLAG
  1963.     TAD    ("Z-"A+1
  1964.     SZL                /SKIP IF NOT A LETTER
  1965.     ISZ    ALPHA            /IS A LETTER, BUMP RETURN
  1966.     CLA CLL                /CLEAR AC
  1967.     TAD    ALPHA1            /RESTORE CHAR IN THE AC
  1968.     JMP I    ALPHA            /TAKE PROPER RETURN
  1969.  
  1970. ALPHA1,    0        /TEMP FOR ALPHA ROUTINE
  1971.  
  1972. /    ROUTINE TO CHECK FOR A NUMERIC CHARACTOR
  1973. /    ENTER WITH THE CHAR TO CHECK IN THE AC
  1974. /    EXIT + 2 IF NUMERIC WITH THE CHAR IN THE AC
  1975. /    EXIT + 1 IF NON-NUMERIC WITH THE CHAR IN THE AC
  1976.  
  1977. NUMRC,    0
  1978.     DCA    NUMRC1            /SAVE THE CHAR FOR RETURN
  1979.     TAD    NUMRC1            /GET THE CHAR BACK
  1980.     TAD    (-"9-1            /TESTING FOR 0-9
  1981.     CLL                /INIT LINK FOR A FLAG
  1982.     TAD    ("9-"0+1
  1983.     SZL                /SKIP IF NOT A DIGIT
  1984.     ISZ    NUMRC            /BUMP RETURN FOR NUMERIC
  1985.     CLA CLL                /CLEAR AC
  1986.     TAD    NUMRC1            /RESTORE CHAR IN THE AC
  1987.     JMP I    NUMRC            /DONE
  1988.  
  1989. NUMRC1,    0        /TEMP FOR NUMRC CHECK ROUTINE
  1990.  
  1991. PAGE
  1992.  
  1993.  
  1994.  
  1995. /    ROUTINE TO PACK TWO 6 BIT CHARS IN A 12 BIT WORD
  1996. /    ROUTINE EXPECTS POINTER AT "PACK6P" TO BE POINTING TO WHERE TO PUT
  1997. /    THE CHARS AND THE FLAG "PACK6F" TO FLAG HIGH BYTE OR LOW BYTE FOR
  1998. /    PACKING (4000 = HIGH BYTE, 0 = LOW BYTE)
  1999. /    CALL:    PACK6
  2000.  
  2001.  
  2002. PACK60,    0
  2003.     AND    C77            /STRIP TO 6 BITS
  2004.     DCA    PACK6T            /STORE TEMP
  2005.     CLA CLL CML RAR            /SET LINK=0, AC = 4000
  2006.     TAD    PACK6F            /GET CURRENT FLAG
  2007.     DCA    PACK6F            /RETURN, LINK NOW CONTAINS FLAG
  2008.     SZL                /SKIP IF LINK IS ZERO (ON FIRST BYTE)
  2009.     TAD I    PACK6P            /GET FIRST BYTE
  2010.     TAD    PACK6T            /COMBINE WITH SECOND BYTE
  2011.     SNL                /SKIP IF ON SECOND BYTE
  2012.     BSW                /SWAP AROUND
  2013.     DCA I    PACK6P            /RETURN
  2014.     SZL                /SKIP IF FIRST BYTE
  2015.     ISZ    PACK6P            /BUMP POINTER TO NEXT
  2016.     JMP I    PACK60            /DONE
  2017.  
  2018. PACK6T,    0        /TEMP FOR "PACK6" ROUTINE
  2019.  
  2020.  
  2021.  
  2022. /    ROUTINE TO FETCH A DEVICE HANDLER BY HANDLER NUMBER
  2023. /    ENTER WITH NUMBER IN AC
  2024. /    EXIT WITH "HNDADR" POINTING TO ENTRY TO THE HANDLER AND RETURN
  2025. /    PLUS 2 IF SUCCESSFUL, AND RETURN + 1 IF ERROR
  2026.  
  2027. HFETCH,    0
  2028.     DCA    HNUM            /STORE HANDLER NUMBER
  2029.     TAD    (HNDLR            /GET THE HANDLER LOAD ADDRESS
  2030.     DCA    HADR            /STORE IN CALL
  2031.     TAD    HNUM            /GET HANDLER NUMBER BACK
  2032.     CIF    10            /USER IN FIELD 1
  2033.     JMS I    USR            /CALL USER SERVICE
  2034.     0001                /FETCH IS FUNCTION 1
  2035. HADR,    0                /PUT WERE TO LOAD HANDLER HERE
  2036.     SKP                /ERROR LOADING HANDLER HERE
  2037.     ISZ    HFETCH            /BUMP FOR NO ERROR
  2038.     CLA CLL                /INSURE CLEAR AC
  2039.     TAD    HADR            /GET RETURNED HANDLER ADDRESS
  2040.     DCA    HNDADR            /PUT WHERE ALL CAN ACCESS
  2041.     JMP I    HFETCH            /RETURN
  2042.  
  2043. HNUM,    0            /LOCAL TEMP FOR "HFETCH"
  2044.  
  2045.  
  2046. /    ROUTINE TO INPUT A BLOCK FROM DISK
  2047. /    ENTER WITH BLOCK NUMBER IN THE AC, AND THE BUFFER ADDRESS IN THE MQ
  2048. /    EXIT + 1 IF ERROR ON INPUT
  2049. /    EXIT + 2 IF SUCCESSFUL
  2050.  
  2051. BLKIN,    0
  2052.     DCA    BLKIN1            /STORE BLOCK NUMBER IN CALL
  2053.     MQA                /GET THE BUFFER ADDRESS
  2054.     DCA    BLKIN0            /PUT INTO THE CALL
  2055.     JMS I    HNDADR            /CALL THE HANDLER FOR SERVICE
  2056.     0200                /INPUT 2 128 WORD RECORDS
  2057. BLKIN0,    0                /TO THE I/O BUFFER
  2058. BLKIN1,    0                /BLOCK NUMBER HERE
  2059.     SKP                /ERROR RETURN
  2060.     ISZ    BLKIN            /BUMP FOR SUCCESS RETURN
  2061.     CLA CLL                /RETURN AC = 0
  2062.     JMP I    BLKIN
  2063.  
  2064.  
  2065. /    ROUTINE TO WRITE A BLOCK TO THE DISK
  2066. /    ENTER:    AC = BLOCK NUMBER TO WRITE
  2067. /    EXIT:    RETURN + 2 = WRITE SUCCESSFUL
  2068. /        RETURN + 1 = WRITE FAILED
  2069.  
  2070. BLKOUT,    0
  2071.     DCA    BLKOU1            /PUT BLOCK NUMBER IN CALL
  2072.     JMS I    HNDADR            /CALL THE HANDLER
  2073.     4200                /WRITE 1 BLOCK
  2074.     IOBUF                /OUTPUT BUFFER ADDRESS
  2075. BLKOU1,    0                /BLOCK NUMBER GOES HERE
  2076.     SKP                /ERROR ON THE WRITE
  2077.     ISZ    BLKOUT            /BUMP RETURN FOR NO ERROR
  2078.     CLA CLL                /RETURN AC = 0
  2079.     JMP I    BLKOUT            /EXIT
  2080.  
  2081.  
  2082.  
  2083. /    ROUTINE TO LOOKUP A FILE IN THE DIRECTORY
  2084. /    RETURN + 1 ON DIRECTORY I/O ERROR
  2085. /    RETURN + 2 IF FILE NOT FOUND
  2086. /    RETURN + 3 IF FILE FOUND
  2087.  
  2088. /    INITIALIZE DIRBLK TO ZERO IF DIRECTORY SEARCH FROM BEGINNING,
  2089. /    ELSE THE DIRECTORY SEARCH BEGINS WITH THE LAST MATCH.
  2090.  
  2091. LOOKUP,    0
  2092.     TAD    DIRBLK            /CHECK IF START FROM BEGINNING
  2093.     SNA CLA                /SKIP IF NO
  2094.     JMP    LUP1            /MUST READ IN BEGINNING OF DIRECTORY
  2095.     JMP    LUP25            /CONTINUE SEARCH LOOP
  2096.  
  2097. LUP0,    TAD    SLINK            /GET NEXT ENTRY NUMBER
  2098.     SNA CLA                /SKIP IF IS A NEXT ENTRY
  2099.     JMP    LUP30            /NO NEXT ENTRY
  2100.  
  2101. LUP1,    TAD    (DIRBUF            /GET THE DIRECTORY BUFFER ADDRESS
  2102.     MQL                /PUT INTO MQ REGISTER
  2103.     ISZ    DIRBLK            /BUMP THE BLOCK NUMBER
  2104.     TAD    DIRBLK            /GET THE BLOCK NUMBER IN THE AC
  2105.     JMS    BLKIN            /INPUT A DIRECTORY BLOCK
  2106.     JMP I    LOOKUP            /DIRECTORY I/O ERROR
  2107.     TAD    SBLOCK            /GET STARTING BLOCK FOR THIS SEGMENT
  2108.     DCA    FSBLK            /SAVE TO KEEP TRACK OF FILE POSITIONS
  2109.     TAD    (SFILS            /GET POINTER TO FILE ENTRY BEGINNING
  2110.     DCA    DPTR            /STORE IN A POINTER
  2111.  
  2112.  
  2113. LUP20,    TAD    DPTR            /GET POINTER TO ENTRY
  2114.     IAC                /ADD 1
  2115.     DCA    DWORD            /DWORD POINTS TO LENGTH OF EMPTY
  2116.     TAD I    DPTR            /GET FIRST WORD FROM ENTRY
  2117.     SNA CLA                /SKIP IF IS A FILE NAME
  2118.     JMP    LUP25            /NOT FILE, HANDLE EMPTY
  2119.     TAD    SADDNL            /GET NUMBER OF ADDITIONAL INFO WORDS
  2120.     CIA                /GOTTA MAKE IT POSITIVE
  2121.     TAD    DPTR            /ADD CURRENT POINTER
  2122.     TAD    (5-1            /POINT TO LENGTH OF FILE
  2123.     DCA    DWORD            /SAVE FOR NEXT TRY
  2124.     TAD I    DWORD            /CHECK FOR TENTATIVE FILE
  2125.     SNA CLA                /GOOD FILE HAS SOME LENGTH
  2126.     JMP    LUP25            /TENTATIVE FILE, SKIP IT
  2127.     TAD    DPTR            /NOW GET THIS TRY
  2128.     JMS    FMATCH            /TRY TO MATCH
  2129.     JMP    LUP25            /NO MATCH
  2130.  
  2131.     TAD    DPTR            /GET POINTER TO NAME
  2132.     JMS    FILN8            /GET FILE NAME INTO A BUFFER
  2133.     TAD    SADDNL            /GET NUMBER OF ADDITIONAL WORDS
  2134.     SNA CLA                /SKIP IF DATE IS PRESENT
  2135.     JMP    LUP22            /NO DATE IN THIS DIRECTORY
  2136.     TAD    DPTR            /GET POINTER TO FILE NAME
  2137.     TAD    (4            /GET PAST THE NAME
  2138.     DCA    DPTR            /STORE IN POINTER
  2139.     TAD I    DPTR            /GET THE DATE WORD
  2140. LUP22,    JMS    FILD8            /AND CONVERT
  2141.  
  2142.     TAD I    DWORD            /GET FILE LENGTH
  2143.     DCA    FLEN            /STORE LENGTH OF FILE
  2144.     TAD    DWORD            /GET POINTER TO NEXT ENTRY
  2145.     IAC                /BUMP AHEAD TO NEXT ENTRY
  2146.     DCA    DPTR            /SET FOR POSSIBLE NEXT SEARCH
  2147.     ISZ    LOOKUP            /BUMP FOR FILE FOUND
  2148.  
  2149. LUP30,    ISZ    LOOKUP            /JUMP HERE FOR FILE NOT FOUND
  2150.     JMP I    LOOKUP
  2151.  
  2152. LUP25,    TAD I    DWORD            /GET PREVIOUS SIZE
  2153.     CIA                /MAKE IT POSITIVE
  2154.     TAD    FSBLK            /GET CURRENT START BLOCK
  2155.     DCA    FSBLK            /UPDATE CURRENT START BLOCK
  2156.     TAD    DWORD            /GET POINTER TO PREVIOUS
  2157.     IAC                /POINT TO CURRENT
  2158.     DCA    DPTR            /RETURN TO POINTER
  2159.     ISZ    SENTRY            /BUMP ENTRY COUNTER
  2160.     JMP    LUP20            /CONTINUE LOOP
  2161.     JMP    LUP0            /GO TRY NEXT DIRECTORY SEGMENT
  2162.  
  2163. PAGE
  2164.  
  2165.  
  2166.  
  2167. /    DIRECTORY BLOCK BUFFER
  2168.  
  2169. DIRBUF=    .            /DEFINE BEGINNING OF BUFFER
  2170. SENTRY,    0            /# OF ENTRYS IN SEGMENT
  2171. SBLOCK,    0            /STARTING BLOCK NUMBER OF FIRST FILE
  2172. SLINK,    0            /LINK TO NEXT DIRECTORY SEGMENT
  2173. STENT,    0            /POINTER TO LAST WORD OF TENTATIVE ENTRY
  2174. SADDNL,    0            /# OF ADDITIONAL INFO WORDS
  2175. SFILS,    0            /BEGINNING OF FILE ENTRYS
  2176.     *DIRBUF
  2177.     ZBLOCK    400        /RESERVE SPACE FOR DIRECTORY SEGMENT
  2178. PAGE
  2179.  
  2180.     HNDLR=.            /DEFINE HANDLER LOAD LOCATION
  2181.  
  2182.     *HNDLR+400        /RESERVE SPACE FOR 2 PAGE HANDLER
  2183.  
  2184.  
  2185.     IOSIZ=    400
  2186. IOBUF,    ZBLOCK    IOSIZ
  2187.  
  2188.  
  2189.  
  2190. /    ROUTINE TO COMPARE TWO FILE NAMES FOR EQUALITY
  2191. /    THE ROUTINE WILL CHECK EACH OF THE 8 FILE NAME CHARS AND IF A
  2192. /    CHAR IN THE FIRST FILE NAME (THE ONE WE ARE LOOKING FOR) CONTAINS
  2193. /    A "?" IT WILL MATCH ON THE SECOND FILE NAME CHAR.
  2194. /    ENTER WITH "FCMP1" POINTING TO THE FILE NAME TO FIND, AND "FCMP2"
  2195. /    POINTING TO THE FILE NAME TO TRY AND MATCH.  EXIT + 1 IF NO MATCH
  2196. /    AND EXIT + 2 IF MATCH.  (IF NON-ZERO AC ON ENTRY, THE AC IS ASSUMED
  2197. /    TO HAVE THE VALUE FOR "FCMP2")
  2198.  
  2199. FMATCH,    0
  2200.     SZA                /SKIP IF NO ARGUMENT IN AC
  2201.     DCA    FCMP2            /THIS ARGUMENT CAME IN THE AC
  2202.     TAD    FCMP1            /GET ADDRESS OF FIRST FILE NAME BLOCK
  2203.     DCA    GET6P            /STORE IN A POINTER
  2204.     DCA    GET6F            /INIT FLAG FOR "GET6" ROUTINE
  2205.     TAD    FCMP2            /GET ADDRESS OF SECOND FILE NAME BLOCK
  2206.     DCA    FMATP            /STORE IN A LOCAL POINTER
  2207.     DCA    FMATF            /INIT LOCAL FLAG
  2208.     TAD    (-10            /8 CHARS TO DO
  2209.     DCA    FMATC            /STORE IN LOCAL COUNTER
  2210.  
  2211. FMAT1,    CLA CLL CML RAR            /AC=4000, LINK=0
  2212.     TAD    FMATF            /GET FLAG
  2213.     DCA    FMATF            /RETURN FLAG, LINK CONTAINS STATUS
  2214.     TAD I    FMATP            /GET A WORD FROM THE SECOND NAME
  2215.     SZL                /SKIP IF ON THE TOP BYTE
  2216.     ISZ    FMATP            /GOTTA BUMP THE POINTER
  2217.     SNL                /SKIP IF ON THE BOTTOM BYTE
  2218.     BSW                /SWAP TOP BYTE TO BOTTOM
  2219.     AND    C77            /KEEP ONLY BOTTOM 6 BITS
  2220.     DCA    FMATT            /STORE IN A TEMP
  2221.  
  2222.     GET6                /NOW GET A CHAR FROM FIRST NAME
  2223.     TAD    (-77            /CHECK IF WILD
  2224.     SNA                /SKIP IF NO
  2225.     JMP    FMAT2            /NO MATCH CHECK ON A WILD CARD
  2226.     TAD    C77            /RESTORE THE CHAR
  2227.     CIA                /NEGATE FOR COMPARE
  2228.     TAD    FMATT            /COMPARE WITH SECOND FILE NAME
  2229.     SZA CLA                /SKIP IF IS A MATCH
  2230.     JMP I    FMATCH            /THIS IS NOT A MATCH
  2231.  
  2232. FMAT2,    ISZ    FMATC            /BUMP COUNTER
  2233.     JMP    FMAT1            /LOOP, MORE TO CHECK
  2234.     ISZ    FMATCH            /BUMP RETURN FOR MATCH
  2235.     JMP I    FMATCH            /GOT A MATCH
  2236.  
  2237. FMATP,    0        /POINTER FOR "FMATCH"
  2238. FMATC,    0        /COUNTER FOR "FMATCH"
  2239. FMATF,    0        /FLAG FOR "FMATCH"
  2240. FMATT,    0        /TEMP FOR "FMATCH"
  2241. FCMP1,    0        /POINTER FOR FIRST FILE NAME BLOCK
  2242. FCMP2,    0        /POINTER FOR SECOND FILE NAME BLOCK
  2243.  
  2244.  
  2245.  
  2246. /    OS8 DIRECTORY FILE DATA SETUP
  2247. /    ENTER WITH THE DIRECTORY DATE WORD IN THE AC
  2248. /    EXIT WITH THE DATE IN THE BUFFER "DATBUF"
  2249.  
  2250. FILD8,    0
  2251.     DCA    FILD89            /SAVE THE DATE WORD
  2252.     TAD    FILD89            /GET DATA WORD
  2253.     AND    (7            /KEEP ONLY YEAR BITS
  2254.     TAD    (116            /ADD 78 YEARS
  2255.     MQL                /PUT INTO MQ REGISTER
  2256.     TAD    (DATEYR            /GET POINTER TO YEAR
  2257.     JMS    DECCON            /CONVERT TO ASCII DATE
  2258.     TAD    FILD89            /GET DATE WORD BACK
  2259.     CLL RTR                /SHIFT DAY DOWN
  2260.     RAR
  2261.     AND    (37            /KEEP ONLY DAY BITS
  2262.     MQL                /PUT IN MQ REGISTER
  2263.     TAD    (DATEDA            /GET POINTER TO DAY
  2264.     JMS    DECCON            /CONVERT TO ASCII DAY
  2265.     TAD    FILD89            /GET DATE WORD BACK
  2266.     BSW                /GET MONTH
  2267.     CLL RTR                /DOWN
  2268.     AND    (17            /KEEP ONLY MONTH BITS
  2269.     MQL                /INTO MQ REGISTER
  2270.     TAD    (DATEMO            /GET ADDRESS OF WHERE TO PUT MONTH
  2271.     JMS    DECCON            /CONVERT
  2272.     JMP I    FILD8            /ALL DONE
  2273.  
  2274. FILD89,    0            /TEMP FOR "FILD8"
  2275.  
  2276.  
  2277. /    ROUTINE TO CONVERT A BINARY VALUE INTO A TWO DIGIT ASCII DECIMAL
  2278. /    NUMBER.  ENTER WITH WHERE TO STORE THE CONVERTED NUMBER IN THE
  2279. /    AC AND THE NUMBER IN THE MQ REGISTER.
  2280.  
  2281. DECCON,    0
  2282.     DCA    DECC20            /STORE THE POINTER
  2283.     TAD    ("0&177-1        /GET AN ASCII ZERO
  2284.     DCA I    DECC20            /START OUT WITH A ZERO
  2285.     MQA                /GET THE BINARY VALUE
  2286.  
  2287. DECC01,    ISZ I    DECC20            /BUMP
  2288.     TAD    (-12            /SUB 10
  2289.     SMA                /SKIP IF NO MORE DIVISION
  2290.     JMP    DECC01            /ELSE KEEP GOING
  2291.  
  2292.     TAD    (12+"0&177        /CONVERT REMAINDER TO ASCII
  2293.     ISZ    DECC20            /BUMP POINTER
  2294.     DCA I    DECC20            /STORE
  2295.     JMS    FMTDAT            /FORMAT FOR PRINTING
  2296.     JMP I    DECCON            /DONE
  2297.  
  2298.  
  2299. DECC20,    0        /LOCAL POINTER TO DECCON
  2300.  
  2301. /    ROUTINE TO SET UP THE DATE IN A MM-DD-YY FORMAT TO PUT IN FRONT
  2302. /    OF A FILE TO PASS THE FILES DATE (TEMPORY AND NOT PART OF THE
  2303. /    KERMIT PROTOCAL)
  2304.  
  2305. FMTDAT,    0
  2306.     TAD    DATEMO            /GET FIRST CHAR OF DATE
  2307.     DCA    FDATE            /MOVE IT
  2308.     TAD    DATEMO+1
  2309.     DCA    FDATE+1
  2310.     TAD    DATEDA
  2311.     DCA    FDATE+3
  2312.     TAD    DATEDA+1
  2313.     DCA    FDATE+4
  2314.     TAD    DATEYR
  2315.     DCA    FDATE+6
  2316.     TAD    DATEYR+1
  2317.     DCA    FDATE+7
  2318.     JMP I    FMTDAT            /QUICK AND DIRTY
  2319.  
  2320. DATBUF,    "#&177        /FILE CREATION DATE ATTRIBUTE
  2321.     6+40        /LENGTH OF DATE (CHAR(X))
  2322. DATEYR,    0        /ASCII YEAR GOES HERE
  2323.     0
  2324. DATEMO,    0        /ASCII MONTH GOES HERE
  2325.     0
  2326. DATEDA,    0        /ASCII DAY GOES HERE
  2327.     0
  2328.     -1        /TERMINATE
  2329.  
  2330. /    FORMATED DATE GOES HERE
  2331.  
  2332. SETDAT,    "<&177        /COMMENT SIGN
  2333. FDATE,    0
  2334.     0
  2335.     "-&177
  2336.     0
  2337.     0
  2338.     "-&177
  2339.     0
  2340.     0
  2341.     12
  2342.     15
  2343.     -1
  2344.  
  2345. PAGE
  2346.  
  2347.  
  2348.  
  2349. /    ROUTINE TO INPUT BYTES FROM THE LOOKED UP INPUT FILE
  2350. /    ROUTINE EXPECTS THE DEVICE NUMBER IN "DEVNUM", THE FILES START
  2351. /    BLOCK NUMBER IN "FSBLK", AND THE FILES LENGTH IN "FLEN"
  2352. /    ENTER:    "DEVNUM", "FSBLK", AND "FLEN" ARE PROPERLY INITIALIZED
  2353. /    EXIT:    RETURN + 3 WITH THE CHAR IN THE AC IF SUCCESSFUL
  2354. /        RETURN + 2 IF END OF FILE
  2355. /        RETURN + 1 IF FATAL I/O ERROR
  2356.  
  2357. UNPACK,    0
  2358.     JMP I    .+1            /DISPATCH TO PROPER CO-ROUTINE
  2359.  
  2360. UNPEXT,    0                /EXIT POINT FOR UNPACK
  2361.     AND    C377            /KEEP ONLY CHAR BITS
  2362.     DCA    UPTEMP            /SAVE THE CHAR
  2363.     TAD    UPTEMP            /GET BACK
  2364.     TAD    MCTRLZ            /CHECK FOR EOF
  2365.     SZA CLA                /SKIP IF EOF
  2366.     ISZ    UNPACK            /BUMP FOR SUCCESSFUL RETURN
  2367.     TAD    UPTEMP            /GET CHAR BACK
  2368.  
  2369. UNPEOF,    ISZ    UNPACK            /RETURN HERE IF EOF
  2370.  
  2371. UNPERR,    JMP I    UNPACK            /RETURN HERE IF FATAL I/O ERROR
  2372.  
  2373. /    HERE FOR CHAR 1
  2374.  
  2375. UNPAK1,    TAD I    UNPAKP            /GET A WORD FROM THE BUFFER
  2376.     ISZ    UNPAKP            /BUMP POINTER FOR CHAR 2
  2377.     JMS    UNPEXT            /SET CO-ROUTINE POINTER AND EXIT
  2378.  
  2379. /    HERE FOR CHAR 2
  2380.  
  2381.     TAD I    UNPAKP            /GET CHAR 2
  2382.     JMS    UNPEXT            /SET CO-ROUTINE POINTER AND EXIT
  2383.  
  2384. /    HERE FOR CHAR 3
  2385.  
  2386.     STA                /SET AC = -1
  2387.     TAD    UNPAKP            /AC = POINTER - 1
  2388.     DCA    UNPAKT            /STORE IN TEMP
  2389.     TAD I    UNPAKT            /GET PREVIOUS CHAR
  2390.     AND    C7400            /KEEP ONLY BITS 0-3
  2391.     CLL RTR                /SHIFT DOWN TO BITS 4-7
  2392.     RTR                /GOTIT
  2393.     DCA    UNPAKT            /SAVE IT
  2394.     TAD I    UNPAKP            /GET THE NEXT HALF
  2395.     AND    C7400            /KEEP ONLY BITS 0-3
  2396.     CLL RTL                /GET DOWN TO BITS 8-11
  2397.     RTL                /
  2398.     RAL                /GOTIT
  2399.     TAD    UNPAKT            /COMBINE
  2400.     JMS    UNPEXT            /EXIT
  2401.  
  2402. /    HERE TO CHECK FOR BUFFER EMPTY AND READ IN NEXT BLOCK IF NEEDED
  2403.  
  2404.     CLA CLL                /INSURE CLEAR LINK
  2405.     ISZ    UNPAKP            /BUMP BUFFER POINTER
  2406.     TAD    UNPAKP            /GET OUR CURRENT POINTER
  2407.     TAD    (-IOBUF-IOSIZ        /COMPARE WITH THE END OF BUFFER
  2408.     CLA                /CLEAR JUST THE AC
  2409.     SNL                /IF LINK SET WE ARE PAST END OF BUFFER
  2410.     JMP    UNPAK1            /CONTINUE UNPACKING
  2411.     ISZ    FCBLK            /BUMP THE CURRENT BLOCK
  2412.     ISZ    FLEN            /BUMP THE FILE LENGTH COUNTER
  2413.     SKP                /NOT END OF FILE
  2414.     JMP    UNPEOF            /RETURN END OF FILE HERE
  2415.  
  2416. /    ENTER HERE ON FIRST READ CALL FOR FILE INPUT
  2417.  
  2418. UNPAK5,    TAD    [IOBUF            /GET ADDRESS OF INPUT BUFFER
  2419.     MQL                /PUT INTO MQ
  2420.     TAD    FCBLK            /GET THE FILES CURRENT BLOCK
  2421.     JMS    BLKIN            /AND READ IN THE NEXT BLOCK
  2422.     JMP    UNPERR            /TAKE I/O ERROR RETURN
  2423.     TAD    [IOBUF            /GET ADDRESS OF BEGINNING OF BUFFER
  2424.     DCA    UNPAKP            /SET UP POINTER
  2425.     JMP    UNPAK1            /NOW START UNPACKING THIS BUFFER
  2426.  
  2427. UNPAKP,    0        /POINTER FOR UNPACK ROUTINE
  2428. UNPAKT,    0        /TEMP FOR UNPACK ROUTINE
  2429. FCBLK,    0        /FILE CURRENT BLOCK
  2430.  
  2431.  
  2432. /    ROUTINE TO INITIALIZE FOR FILE INPUT. THIS ROUTINE SETS UP THE
  2433. /    CURRENT BLOCK TO BE READ FROM THE FILE AND SETS THE CO-ROUTINE
  2434. /    DISPATCH ADDRESS TO BEGIN READING BYTES FROM THE FILE.  CALL THIS
  2435. /    ROUTINE AFTER SETTING UP THE FOLLOWING:
  2436.  
  2437. /    DEVNUM =    OS/8 DEVICE NUMBER
  2438. /    FSBLK =        STARTING BLOCK NUMBER
  2439. /    FLEN =        FILE SIZE
  2440.  
  2441. INPINT,    0
  2442.     TAD    FSBLK            /GET FILES STARTING BLOCK
  2443.     DCA    FCBLK            /STORE LOCAL FOR INPUT ROUTINE
  2444.     TAD    (UNPAK5            /GET ADDRESS OF FIRST CO-ROUTINE
  2445.     DCA    UNPEXT            /STORE FOR FIRST DISPATCH
  2446.     JMP I    INPINT            /INPUT IS INITIALIZED
  2447.  
  2448.  
  2449.  
  2450. /    ROUTINE TO WRITE A BYTE TO THE OUTPUT FILE
  2451. /    ENTER:    AC = BYTE TO WRITE
  2452. /    EXIT:    + 2 = WRITE SUCCESSFUL
  2453. /        + 1 = WRITE NOT SUCCESSFUL
  2454.  
  2455. WRIBYT,    0
  2456.     AND    [177            /KILL ANY PARITY BIT
  2457.     TAD    [200            /SET PARITY BIT
  2458.     JMP I    WRIB01            /JUMP INTO CO-ROUTINE
  2459.  
  2460. WRIB01,    0                /CO-ROUTINE ADDRESS HERE
  2461.     ISZ    WRIBYT            /BUMP RETURN FOR SUCCESS
  2462.  
  2463. WRIB02,    JMP I    WRIBYT            /EXIT
  2464.  
  2465. WRIB10,    JMS    WRIB01            /JUMP HERE TO START BYTE 1 NEXT
  2466.  
  2467. /    HERE TO WRITE BYTE 1
  2468.  
  2469. WRIB11,    DCA I    WRIBP            /STORE BYTE IN BUFFER
  2470.     ISZ    WRIBP            /BUMP POINTER
  2471.     JMS    WRIB01            /DONE WITH FIRST
  2472.  
  2473. /    HERE TO WRITE BYTE 2
  2474.  
  2475.     DCA I    WRIBP            /STORE BYTE IN BUFFER
  2476.     JMS    WRIB01            /DONE WITH SECOND
  2477.  
  2478. /    HERE TO WRITE BYTE 3
  2479.  
  2480.     DCA    WRIBT            /STORE THE CHAR TEMP
  2481.     STA                /AC = -1
  2482.     TAD    WRIBP            /GET BUFFER POINTER
  2483.     DCA    WRIBP            /BACK UP POINTER BY 1
  2484.     TAD    WRIBT            /GET CHAR BACK
  2485.     RTL; RTL            /SHIFT HIGH BITS OF BYTE UP IN THE WORD
  2486.     AND    C7400            /KEEP ONLY TOP 4 BITS
  2487.     TAD I    WRIBP            /COMBINE WITH BYTE IN THE BUFFER
  2488.     DCA I    WRIBP            /AND RETURN
  2489.     ISZ    WRIBP            /BUMP POINTER
  2490.     TAD    WRIBT            /GET CHAR BACK
  2491.     BSW; RTL            /GET LOW 4 BITS UP
  2492.     AND    C7400            /KEEP ONLY THOSE BITS
  2493.     TAD I    WRIBP            /COMBINE
  2494.     DCA I    WRIBP            /AND RETURN
  2495.     ISZ    WRIBP            /BUMP POINTER AHEAD
  2496.     CLA CLL                /INSURE LINK IS CLEAR
  2497.     TAD    WRIBP            /GET CURRENT BUFFER POINTER
  2498.     TAD    (-IOBUF-IOSIZ        /CHECK FOR BUFFER FULL
  2499.     CLA                /CLEAR AC, LINK HAS STATUS
  2500.     SNL                /SKIP IF BUFFER FULL
  2501.     JMP    WRIB10            /BUFFER NOT FULL, LEAVE
  2502.     TAD    FCBLK            /GET CURRENT BLOCK TO WRITE
  2503.     JMS    BLKOUT            /AND WRITE IT
  2504.     JMP    WRIB02            /ERROR WRITING
  2505.     ISZ    OFLEN            /BUMP FILE SIZE COUNTER
  2506.     ISZ    FCBLK            /BUMP CURRENT BLOCK NUMBER
  2507.     ISZ    FLEN            /BUMP DISK ROOM COUNT
  2508.     SKP                /HERE IF MORE ROOM ON DISK
  2509.     JMP    WRIB02            /NO MORE ROOM, ERROR
  2510.     TAD    [IOBUF            /GET BUFFER ADDRESS
  2511.     DCA    WRIBP            /RE-SET BUFFER POINTER
  2512.     JMP    WRIB10            /BACK TO START OVER
  2513.  
  2514.  
  2515. WRIBP,    0        /POINTER FOR FILE WRITE ROUTINES
  2516. WRIBT,    0        /TEMP FOR FILE WRITE ROUTINES
  2517. OFLEN,    0        /COUNTER FOR OUTPUT FILE LENGTH
  2518.  
  2519.  
  2520. /    FILE OUTPUT ROUTINES
  2521. /    ROUTINE TO INITIALIZE FOR OUTPUT
  2522. /    ENTER:    FSBLK = STARTING BLOCK FOR OUTPUT FILE
  2523. /        FLEN = MAX SIZE FOR FILE
  2524.  
  2525. /    EXIT:    NOTHING
  2526.  
  2527. INIOUT,    0
  2528.     TAD    [IOBUF            /GET BUFFER ADDRESS
  2529.     DCA    WRIBP            /PUT INTO POINTER
  2530.     TAD    FSBLK            /GET FILE START BLOCK
  2531.     DCA    FCBLK            /PUT INTO FILE CURRENT BLOCK
  2532.     STA                /AC = -1
  2533.     TAD    FLEN            /GET FILE LENGTH
  2534.     DCA    FLEN            /STORE AS -FILE LENGTH -1
  2535.     DCA    OFLEN            /INIT ACTUAL FILE LENGTH COUNTER
  2536.     TAD    (WRIB11            /INSURE CO-ROUTINE LINK SET
  2537.     DCA    WRIB01
  2538.     JMP I    INIOUT
  2539.  
  2540. PAGE
  2541.  
  2542.  
  2543.  
  2544. /    ROUTINE TO FLUSH THE BUFFER AND CLOSE THE OUTPUT FILE
  2545. /    ENTER:    NOTHING
  2546. /    EXIT:    + 2 = FILE CLOSE SUCCESSFUL
  2547. /        + 1 = FILE CLOSE NOT SUCCESSFUL
  2548.  
  2549. CLOSEF,    0
  2550.     TAD    (32            /PUT IN AN EOF
  2551.     JMP    CLO15            /SEND IT FIRST
  2552.  
  2553. CLO10,    TAD    WRIBP            /GET CURRENT BUFFER POINTER
  2554.     TAD    (-IOBUF            /COMPARE WITH BEGINNING
  2555.     SNA CLA                /SKIP IF BUFFER NOT EMPTY
  2556.     JMP    CLO20            /BUFFER EMPTY, QUIT
  2557.  
  2558. CLO15,    JMS    WRIBYT            /WRITE OUT A ZERO
  2559.     JMP I    CLOSEF            /ERROR IN WRITING
  2560.     JMP    CLO10            /GO AGAIN
  2561.  
  2562. CLO20,    TAD    OFLEN            /GET OUTPUT FILE LENGTH
  2563.     DCA    CLOF1            /PUT INTO CALL
  2564.     TAD    ODNUMB            /GET OUTPUT DEVICE NUMBER
  2565.     CIF    10            /USR IN FIELD 1
  2566.     JMS I    USR            /CALL USR
  2567.     4                /CLOSE FUNCTION
  2568.     FNBLK                /ADDRESS OF FILE NAME BLOCK
  2569. CLOF1,    0                /FILE LENGTH HERE
  2570.     SKP                /ERROR HERE
  2571.     ISZ    CLOSEF            /BUMP RETURN FOR NO ERROR
  2572.     CLA CLL                /ALWAYS RETURN AC = 0
  2573.     JMP I    CLOSEF
  2574.  
  2575.  
  2576.  
  2577. /    ROUTINE TO WRITE THE CURRENT INPUT PACKET TO THE OUTPUT FILE
  2578. /    ENTER:    NOTHING
  2579. /    EXIT:    + 2 = WRITE SUCCESSFUL
  2580. /        + 1 = WRITE NOT SUCCESSFUL
  2581.  
  2582. WRIPAK,    0
  2583.     TAD    RRLEN            /GET LENGTH OF PACKET
  2584.     TAD    (RRDTA-40-3        /CACULATE END OF BUFFER
  2585.     DCA    W90            /PUT INTO POINTER
  2586.     DCA I    W90            /ZERO AFTER END OF BUFFER
  2587.     TAD    (RRDTA            /GET ADDRESS OF DATA
  2588.     DCA    W90            /PUT INTO POINTER
  2589.  
  2590. W10,    TAD I    W90            /GET A CHAR FROM PACKET
  2591.     SNA                /SKIP IF NOT END
  2592.     JMP    W60            /END, EXIT
  2593.     CIA                /NEGATE FOR COMPARE
  2594.     TAD    RQCTL            /COMPARE WITH CURRENT QUOTE CHAR
  2595.     SNA CLA                /SKIP IF NOT QUOTE CHAR
  2596.     JMP    W20            /IS QUOTE, HANDLE SPECIAL
  2597.     TAD    W92            /WAS LAST CHAR A QUOTE?
  2598.     SZA CLA                /SKIP IF NO
  2599.     TAD    (-100            /IT WAS, FIX UP THIS CHAR
  2600.     JMP    W25            /HANDLE REST BELOW
  2601.  
  2602. W20,    TAD    W92            /CURRENT CHAR A QUOTE, CHECK PREVIOUS
  2603.     SNA CLA                /SKIP IF YES
  2604.     JMP    W30            /JUST THIS CHAR IS QUOTE, SET FLAG
  2605.  
  2606. W25,    TAD I    W90            /GET CHAR FROM BUFFER
  2607.     JMS    WRIBYT            /SEND TO OUTPUT
  2608.     JMS I    WRIPAK            /ERROR IN OUTPUT
  2609.     JMP    W35            /FINISH BELOW
  2610.  
  2611. W30,    CLA CLL IAC            /GOTA SET FLAG FOR QUOTE CHAR
  2612.  
  2613. W35,    DCA    W92            /SET UP QUOTE FLAG
  2614.     ISZ    W90            /BUMP POINTER
  2615.     JMP    W10            /LOOP
  2616.  
  2617. W60,    ISZ    WRIPAK            /BUMP RETURN FOR OK
  2618.     JMP I    WRIPAK            /DONE
  2619.  
  2620. W90,    0        /POINTER FOR "WRIPAK"
  2621. W92,    0        /TEMP FOR "WRIPAK"
  2622.  
  2623. PAGE
  2624.  
  2625.  
  2626.  
  2627. /    SEND PROCESSING
  2628.  
  2629. SNDPRO,    0
  2630.     TAD    INIFLG            /CHECK IF SEND/INIT HAS BEEN DONE
  2631.     SZA CLA                /SKIP IF NO
  2632.     JMP    SNDP10            /RIGHT INTO FILE TRANSFER
  2633.     TAD    (DEFCK            /SET UP DEFAULT CHECKSUM
  2634.     DCA    RCHKT
  2635.     TAD    (DEFEOL            /GET DEFAULT EOL
  2636.     DCA    REOL            /AND SET IT
  2637.     TAD    (DEFQCTL        /GET DEFAULT QUOTE CONTROL CHAR
  2638.     DCA    RQCTL            /AND SET IT UP
  2639.     TAD    (DEFMAXL+40        /GET DEFAULT MAX BUFFER SIZE
  2640.     DCA    RMAXL            /SET IT UP
  2641.     DCA    CURSEQ            /RE-SET SEQUENCE NUMBER
  2642.     JMS    SNDI00            /HANDLE "SEND-INIT"
  2643.     JMP    SNDP80            /ERROR IN "SEND-INIT"
  2644.  
  2645. /    SEND FILE HEADER DISPATCH ROUTINE
  2646.  
  2647. SNDP10,    FPACK                /FORMAT A PACKET
  2648.     NAMBUF                /ADDRESS OF FILE HEADER FOR DATA
  2649.     STFIL                /"FIL" PACKET TYPE
  2650.  
  2651. SNDP11,    SPACK                /SEND A PACKET
  2652.     1                /AWAIT RESPONSE
  2653.     SNDP96                /DISPATCH TABLE ADDRESS
  2654.  
  2655. /    GOT A NAK OR UNDEFINED HERE
  2656.  
  2657. SNDP12,    ISZ    RTRYC            /BUMP THE COUNTER
  2658.     JMP    SNDP11            /TRY AGAIN
  2659.     JMP    SNDP80            /ERROR
  2660.  
  2661. /    FILE CREATION DATE HANDLING
  2662.  
  2663. SNDP15,    TAD    RCAPAS            /CHECK IF REMOTE SUPPORTS FILE
  2664.     AND    (10            /  ATTRIBUTES
  2665.     SNA CLA                /SKIP IF YES
  2666.     JMP    SNDP20            /SKIP IF NO
  2667.     FPACK                /FORMAT PACKET
  2668.     DATBUF                /DATE DATA
  2669.     STATT                /"ATT" PACKET TYPE
  2670.  
  2671. SNDP16,    SPACK                /SEND THE PACKET
  2672.     1                /AWAIT RESPONSE
  2673.     SNDP98                /DISPATCH TABLE ADDRESS
  2674.     JMP    SNDP80            /NONE OF THE TYPES IN OUR TABLE
  2675.  
  2676. /    GOT ACK HERE
  2677.  
  2678. SNDP20,    CLA CLL
  2679.     PRI6B;    FSMSG            /TELL USER WE ARE SENDING A FILE
  2680.     PRI8B;    NAMBUF            /TELL THEM THE NAME OF THE FILE
  2681.     PRI6B;    FDAT            /TELL THEM THE FILES DATE
  2682.     PRI8B;    FDATE            /
  2683.     JMS    DATOUT            /OUTPUT THE DATE ON THE FIRST LINE
  2684.     JMP    SNDP80            /ERROR SENDING THE DATE
  2685.     JMS    SLOOP
  2686.     SKP                /ERROR RETURN
  2687.     ISZ    SNDPRO            /BUMP FOR NON-ERROR EXIT
  2688.     JMP I    SNDPRO
  2689.  
  2690. SNDP80,    TAD    (SPERR            /GET ERROR MESSAGE
  2691.     JMP I    SNDPRO            /TAKE ERROR EXIT
  2692.  
  2693.  
  2694.  
  2695.  
  2696. /    DATA SEND LOOP
  2697. /    ROUTINE TO GET CHARS FROM THE INPUT BUFFER AND SEND THEM TO REMOTE
  2698. /    VIA PACKET TRANSFERS.  RETURN + 1 IF ERROR, + 2 IF DONE.
  2699.  
  2700. SLOOP,    0
  2701.     JMS    INIOPB            /INIT OUTPUT PACKET HOLD BUFFER
  2702.     JMS    INPINT            /INIT INPUT FILE
  2703.  
  2704. SLOP01,    JMS    UNPACK            /UNPACK A CHAR FROM THE BUFFER
  2705.     JMP    SLOP75            /HERE ON FATAL I/O ERROR
  2706.     JMP    SLOP15            /HERE ON EOF
  2707.     AND    C177            /STRIP OFF PARITY BIT FOR NOW
  2708.     JMS    OPBUF            /PUT INTO PACKET BUFFER
  2709.     SKP                /RETURN HERE ON BUFFER FULL
  2710.     JMP    SLOP01            /RETURN HERE IF STILL ROOM
  2711.  
  2712. /    PACKET IS FULL HERE, WE MUST SEND IT
  2713.  
  2714.     FPACK                /FORMAT A PACKET
  2715.     HOLDBF                /DATA ADDRESS
  2716.     STDAT                /"DAT" PACKET TYPE
  2717.  
  2718. SLOP05,    SPACK                /SEND PACKET
  2719.     1                /AWAIT RESPONSE
  2720.     SLOP90                /RESPONSE TABLE ADDRESS
  2721.  
  2722. /    HERE ON NAK OR FALL THRU ON UNDEFINED RESPONSE ABOVE
  2723.  
  2724. SLOP10,    ISZ    RTRYC            /BUMP THE RE-TRY COUNTER
  2725.     JMP    SLOP05            /TRY AGAIN
  2726.     JMP    SLOP75            /GIVE UP
  2727.  
  2728. /    HERE ON END OF FILE  --  SEND THEM WHAT WE HAVE
  2729.  
  2730. SLOP15,    FPACK                /FORMAT A PACKET
  2731.     HOLDBF                /ADDRESS OF DATA
  2732.     STDAT                /"DAT" PACKET TYPE
  2733.  
  2734. SLOP20,    SPACK                /SEND A PACKET
  2735.     1                /AWAIT RESPONSE
  2736.     SLOP92                /DISPATCH TABLE ADDRESS
  2737.  
  2738. /    NAK FOR LAST PACKET        
  2739.  
  2740. SLOP25,    ISZ    RTRYC            /BUMP RE-TRY COUNTER
  2741.     JMP    SLOP20            /TRY AGAIN
  2742.     JMP    SLOP75            /GIVE UP
  2743.  
  2744. /    ACK FOR FINAL PACKET, SEND AN EOF PACKET
  2745.  
  2746. SLOP35,    JMS    SNDP            /SEND A PACKET
  2747.     NODATA                /NO DATA
  2748.     STEOF                /MAKE IT AN EOF PACKET
  2749.     JMP    SLOP75            /NAK
  2750.     JMP    SLOP75            /NOT NAK OR ACK
  2751.     ISZ    SLOOP            /EOF ACCEPTED, BUMP FOR GOOD RETURN
  2752.     JMP I    SLOOP            /TAKE GOOD RETURN
  2753.  
  2754. /    JUMP HERE FOR ERROR EXIT
  2755.  
  2756. SLOP75,    TAD    (SPERR            /GET ADDRESS OF ERROR MESSAGE
  2757.     JMP I    SLOOP            /EXIT
  2758.  
  2759.     
  2760. SLOP90,    STACK;    SLOP01        /ACK, CONTINUE
  2761.     STNAK;    SLOP10        /NAK, HANDLE
  2762.     0
  2763.  
  2764. SLOP92,    STACK;    SLOP35        /ACK, CONTINUE
  2765.     STNAK;    SLOP25        /NAK, HANDLE
  2766.     0
  2767.  
  2768. PAGE
  2769.  
  2770.  
  2771.  
  2772. /    COMMAND DISPATCH TABLE FOR SEND SERVICE
  2773.  
  2774. SNDP96,    STACK;    SNDP15        /FILE HEADER ACKNOWLEDGED
  2775.     STNAK;    SNDP12        /NAK RETURNED, RE-TRY
  2776.     0            /END OF TABLE
  2777.  
  2778. SNDP98,    STACK;    SNDP20        /DATE ATTRIBUTE ACKNOWLEDGED
  2779.     0            /END OF TABLE
  2780.  
  2781.  
  2782.  
  2783. /    ROUTINE TO HANDLE A "SEND-INIT" COMMAND
  2784. /    RETURN + 1 IF ERROR
  2785. /    RETURN + 2 IF SUCCESSFUL
  2786.  
  2787. SNDI00,    0
  2788.     FPACK                /FORMAT A PACKET
  2789.     INIDAT                /ADDRESS OF DATA FOR PACKET
  2790.     STSIN                /"SIN" PACKET TYPE
  2791.  
  2792. SNDI02,    SPACK                /SEND A PACKET
  2793.     1                /AWAIT RESPONSE
  2794.     SNDI80                /RESPONSE TABLE TYPE
  2795.  
  2796. /    HERE ON NAK OR UNDEFINED
  2797.  
  2798. SNDI05,    ISZ    RTRYC            /BUMP RE-TRY COUNTER
  2799.     JMP    SNDI02            /TRY AGAIN
  2800.     JMP I    SNDI00            /TAKE ERROR EXIT
  2801.  
  2802. /    HERE ON ACK
  2803.  
  2804. SNDI10,    JMS    SETINI            /SET UP THE INIT REGISTERS
  2805.     CLA CLL IAC            /NOW FLAG THE SEND/INIT DONE
  2806.     DCA    INIFLG            /BY MAKING THIS NON-ZERO
  2807.     ISZ    SNDI00            /BUMP FOR NON-ERROR RETURN
  2808.     JMP I    SNDI00            /BACK TO MAIN SEND PROCESSING
  2809.  
  2810. SNDI80,    STACK;    SNDI10    /GOT AN ACK
  2811.     STNAK;    SNDI05    /NAK
  2812.     0        /END OF TABLE
  2813.  
  2814.  
  2815. /    ROUTINE TO MOVE THE SEND/INIT OR RECEIVE/INIT PACKET INTO THE
  2816. /    INIT REGISTERS
  2817.  
  2818. SETINI,    0
  2819.     TAD    (RMAXL            /GET ADDRESS OF RECEIVE INIT REGISTERS
  2820.     MQL                /SAVE FOR "CLEAR" ROUTINE
  2821.     TAD    (RMAXL-RCAPAS-1        /GET MINUS LENGTH OF # OF REGISTERS
  2822.     CLEAR                /CLEAR OUT
  2823.     TAD    (RMAXL            /GET ADDRESS OF RECEIVE INIT REGISTERS
  2824.     MQL                /SAVE FOR "MOVE" ROUTINE
  2825.     TAD    RRLEN            /GET LENGTH OF PACKET JUST INPUT
  2826.     TAD    (-40-4            /COUNT OF DATA RECEIVED
  2827.     CIA                /MAKE IT NEGATIVE
  2828.     DCA    MOVE4            /SAVE FOR "MOVE" ROUTINE
  2829.     TAD    (RRDTA            /ADDRESS OF DATA IN PACKET
  2830.     MOVE                /MOVE THE INIT REGISTERS
  2831.     JMP I    SETINI            /DONE
  2832.  
  2833.  
  2834.  
  2835. /    ROUTINE TO SEND THE DATE IN A DATA PACKET
  2836. /    RETURN + 1 IF ERROR, + 2 IF SUCCESSFUL
  2837.  
  2838. DATOUT,    0
  2839.     JMS    INIOPB            /INSURE PACKET HOLD BUFFER INITIALIZED
  2840.     TAD    (SETDAT            /GET ADDRESS OF DATE
  2841.     DCA    DATOU9            /PUT INTO POINTER
  2842.  
  2843. DATOU1,    TAD I    DATOU9            /GET A CHAR
  2844.     ISZ    DATOU9            /BUMP POINTER
  2845.     SPA                /SKIP IF NOT ENT
  2846.     JMP    DATOU2            /DONE
  2847.     JMS    OPBUF            /PUT INTO HOLD BUFFER
  2848.     SKP                /HOLD FULL, SEND IT
  2849.     JMP    DATOU1            /LOOP
  2850.  
  2851. DATOU2,    CLA CLL                /INSURE CLEAR AC
  2852.     FPACK                /FORMAT A PACKET
  2853.     HOLDBF                /DATA ADDRESS
  2854.     STDAT                /DATA PACKET
  2855.  
  2856. DATOU3,    SPACK                /SEND THE PACKET
  2857.     1                /GET RESPONSE
  2858.     DATOU7                /DISPATCH TABLE ADDRESS
  2859.  
  2860. /    HERE ON NAK OR UNDEFINED RESPONSE
  2861.  
  2862. DATOU4,    ISZ    RTRYC            /BUMP RE-TRY COUNTER
  2863.     JMP    DATOU3            /TRY AGAIN
  2864.     JMP I    DATOUT            /ABORT
  2865.  
  2866. /    HERE ON ACK
  2867.  
  2868. DATOU5,    ISZ    DATOUT            /BUMP FOR GOOD RETURN
  2869.     JMP I    DATOUT            /EXIT
  2870.  
  2871. DATOU7,    STACK;    DATOU5        /ACK
  2872.     STNAK;    DATOU4        /NAK
  2873.     0
  2874.  
  2875. DATOU9,    0        /TEMP POINTER FOR DATOUT
  2876.  
  2877.  
  2878.  
  2879. /    HANDLE AN ABORT REQUEST
  2880.  
  2881. ABORT,    CLA CLL                /INSURE CLEAR AC
  2882.     DCA    CCFLAG            /RE-SET THIS FLAG
  2883.     TAD    KMODE            /GET CURRENT MODE
  2884.     TAD    (-MSEND            /IS IT A SEND?
  2885.     SZA                /SKIP IF YES
  2886.     JMP    ABORT2            /NOT SEND
  2887.  
  2888.     JMS    SNDP            /SEND OUT A PACKET
  2889.     ABORT9                /WHICH HAS A "D" IN THE DATA
  2890.     STEOF                /AND IS AN EOF PACKET
  2891.     NOP                /WE GOT NAK BACK HERE
  2892.     NOP                /WE GOT NEITHER NAK OR ACK HERE
  2893.     JMS    BRKXMT            /BREAK THE SEND
  2894.     JMP    ABORT3            /FINISH THE ABORT
  2895.  
  2896. ABORT2,    TAD    (MSEND-MREC        /CHECK IF IN RECEIVE MODE
  2897.     SZA CLA                /SKIP IF YES
  2898.     JMP    ABORT3            /JUST BACK TO COMMAND LOOP
  2899.     JMS    SNDP            /SEND A PACKET BACK FOR AN ABORT
  2900.     ABORT8                /WHICH HAS AN "X" IN THE DATA
  2901.     STACK                /MAKE IT AN ACK PACKET
  2902.     NOP                /NAK HERE
  2903.     NOP                /NOT NAK OR ACK HERE
  2904.  
  2905. ABORT3,    TAD    (CCABRT            /GET ADDRESS OF ERROR MESSAGE
  2906.     JMP    CLOOP7            /DISPLAY THE ABORT
  2907.  
  2908.  
  2909. ABORT8,    "Z&137        /DATA PACKET FOR RECEIVE ABORT
  2910.     -1
  2911. ABORT9,    "D&137        /DATA PACKET FOR SEND ABORT
  2912.     -1
  2913.  
  2914. CCABRT,    TEXT    "CONTROL/C ABORT@M@J@"
  2915.  
  2916. PAGE
  2917.  
  2918.  
  2919.  
  2920. /    ROUTINE TO PRINT 6 BIT BYTES ON THE TTY. ENTER WITH THE ADDRESS OF
  2921. /    THE TEXT IN THE AC OR IN THE CALL + 1.
  2922.  
  2923. PRI6B0,    0
  2924.     SZA                /SKIP IF TEXT ADDRESS AT CALL + 1
  2925.     JMP    PRI6B1            /ADDRESS IN THE AC
  2926.     TAD I    PRI6B0            /GET THE ADDRESS
  2927.     ISZ    PRI6B0            /BUMP THE RETURN
  2928.  
  2929. PRI6B1,    MQL                /SAVE IN THE MQ REGISTER
  2930.     TAD    (OTTY            /GET ADDRESS OF THE TTY OUTPUT ROUTINE
  2931.     JMS    SIXB            /DO THE PRINT
  2932.     JMP I    PRI6B0            /DONE
  2933.  
  2934.  
  2935. /    SIX BIT TEXT REMOTE OUTPUT ROUTINE
  2936. /    ROUTINE TO OUTPUT FROM 6 BIT STORAGE TO THE REMOTE LINE.  ENTER WITH
  2937. /    THE ADDRESS OF THE TEXT IN THE AC OR WITH A CLEAR AC THE ADDRESS IS
  2938. /    AT THE CALL + 1
  2939.  
  2940. REM6B0,    0
  2941.     SZA                /SKIP IF ADDRESS AT CALL + 1
  2942.     JMP    REM6B1            /ADDRESS IN THE AC
  2943.     TAD I    REM6B0            /GET ADDRESS AT CALL + 1
  2944.     ISZ    REM6B0            /BUMP THE RETURN
  2945.  
  2946. REM6B1,    MQL                /PUT ADDRESS IN MQ REGISTER
  2947.     TAD    (OREM            /GET ADDRESS OF REMOTE OUTPUT ROUTINE
  2948.     JMS    SIXB            /DO THE OUTPUT
  2949.     JMP I    REM6B0            /DONE
  2950.  
  2951.  
  2952.  
  2953. /    SIX BIT TEXT PRINT ROUTINE
  2954. /    ENTER WITH ADDRESS OF TEXT IN AC AND THE ADDRESS OF THE OUTPUT
  2955. /    ROUTINE TO USE IN THE MQ REGISTER
  2956. /    A NULL BYTE SIGNALS A CONTROL CHAR IS NEXT
  2957. /    TWO NULL BYTES SIGNAL END OF TEXT
  2958.  
  2959. SIXB,    0
  2960.     DCA    SIXBP            /AND STORE IN A LOCAL POINTER
  2961.     MQA                /GET THE OUTPUT ROUTINE ADDRESS
  2962.     DCA    GET6P            /STORE ADDRESS IN POINTER
  2963.     DCA    GET6F            /INIT BYTE FLAG
  2964.  
  2965. SIXB1,    GET6                /GET A BYTE FROM THE STRING
  2966.     SNA                /SKIP IF NOT NULL
  2967.     JMP    SIXB3            /HANDLE CONTROL CHAR
  2968.     TAD    (240            /CONSTRUCT PROPER ASCII
  2969.     AND    C77
  2970.     TAD    (240
  2971.  
  2972. SIXB2,    JMS I    SIXBP            /AND SEND
  2973.     CLA CLL                /INSURE CLEAR AC
  2974.     JMP    SIXB1            /LOOP
  2975.  
  2976. SIXB3,    GET6                /GET BYTE FOLLOWING NULL BYTE
  2977.     SNA                /SKIP IF IS A CONTROL BYTE
  2978.     JMP I    SIXB            /GOT END OF STRING
  2979.     TAD    (200            /CONSTRUCT A CONTROL CHAR
  2980.     JMP    SIXB2            /AND GO PRINT
  2981.  
  2982. SIXBP,    0        /POINTER USED IN THE "SIXB" ROUTINE
  2983.  
  2984.  
  2985. /    ROUTINE TO PRINT 8 BIT CHARS ON THE TTY.  ENTER ROUTINE WITH THE
  2986. /    ADDRESS OF THE TEXT IN THE AC OR IF AC IS ZERO THE ADDRESS IS IN
  2987. /    THE CALL + 1.  TEXT TERMINATES ON A MINUS WORD.
  2988.  
  2989. PRI8B0,    0
  2990.     SZA                /SKIP IF ADDRESS NOT IN AC
  2991.     JMP    PRI8B1            /ADDRESS IS IN THE AC
  2992.     TAD I    PRI8B0            /GET ADDRESS FROM CALL + 1
  2993.     ISZ    PRI8B0            /BUMP RETURN POINTER
  2994.  
  2995. PRI8B1,    MQL                /SAVE ADDRESS IN MQ
  2996.     TAD    (OTTY            /GET ADDRESS OF TTY OUTPUT ROUTINE
  2997.     JMS    EIGHTB            /AND SEND IT
  2998.     JMP I    PRI8B0            /ALL DONE
  2999.  
  3000.  
  3001.  
  3002. /    ROUTINE TO SEND 8 BIT CHARS DOWN THE REMOTE LINE.  ENTER ROUTINE WITH
  3003. /    THE ADDRESS OF THE TEXT IN THE AC OR IF AC IS ZERO THE ADDRESS IS IN
  3004. /    THE CALL + 1.  TEXT TERMINATES ON A MINUS WORD.
  3005.  
  3006. REM8B0,    0
  3007.     SZA                /SKIP IF ADDRESS NOT IN AC
  3008.     JMP    REM8B1            /ADDRESS IN AC
  3009.     TAD I    REM8B0            /GET ADDRESS FROM CALL + 1
  3010.     ISZ    REM8B0            /BUMP RETURN
  3011.  
  3012. REM8B1,    MQL                /PUT ADDRESS IN MQ
  3013.     TAD    (OREM            /GET ADDRESS OF REMOTE OUTPUT ROUTINE
  3014.     JMS    EIGHTB            /AND SEND THE STRING
  3015.     JMP I    REM8B0            /DONE
  3016.  
  3017.  
  3018. /    ROUTINE TO SEND 8 BIT DATA
  3019. /    ENTER WITH ADDRESS OF DATA IN THE MQ AND THE ADDRESS OF THE ROUTINE
  3020. /    TO TAKE EACH BYTE IN THE AC.  TEXT TERMINATES ON A MINUS WORD.
  3021. EIGHTB,    0
  3022.     DCA    EIGHT5            /STORE POINTER TO ROUTINE
  3023.     MQA                /GET THE POINTER TO THE TEXT
  3024.     DCA    EIGHT6            /STORE IN LOCAL POINTER
  3025.  
  3026. EIGHT1,    TAD I    EIGHT6            /GET A CHAR
  3027.     ISZ    EIGHT6            /BUMP THE POINTER
  3028.     SPA                /SKIP IF NOT EOL
  3029.     JMP    EIGHT2            /GOT EOL
  3030.     JMS I    EIGHT5            /CALL OUTPUT ROUTINE
  3031.     CLA CLL                /INSURE CLEAR AC
  3032.     JMP    EIGHT1            /LOOP
  3033.  
  3034. EIGHT2,    CLA CLL                /CLEAR THE AC
  3035.     JMP I    EIGHTB            /DONE
  3036.  
  3037. EIGHT5,    0        /POINTER TO ROUTINE TO DO OUTPUT
  3038. EIGHT6,    0        /POINTER TO TEXT TO OUTPUT
  3039.  
  3040.  
  3041.  
  3042. /    ROUTINE TO UNPACK 6 BIT CHARS FROM MEMORY
  3043. /    BEFORE CALLING INIT "GET6P" AS A POINTER TO THE STRING LOCATION
  3044. /    AND "GET6F" SHOULD BE ZEROED TO START WITH THE TOP BYTE OF THE
  3045. /    FIRST MEMORY LOCATION.
  3046.  
  3047. GET60,    0
  3048.     CLA CLL CML RAR            /SET AC=4000, LINK=0
  3049.     TAD    GET6F            /GET THE FLAG
  3050.     DCA    GET6F            /RETURN THE FLAG
  3051.     TAD I    GET6P            /GET TWO BYTES
  3052.     SZL                /SKIP IF TOP BYTE
  3053.     ISZ    GET6P            /BOTTOM BYTE, PREPARE FOR NEXT TOP
  3054.     SNL                /SKIP IF BOTTOM BYTE
  3055.     BSW                /GET TOP BYTE INTO BOTTOM
  3056.     AND    C77            /STRIP UNUSED BITS
  3057.     JMP I    GET60            /DONE
  3058.  
  3059.  
  3060. /    LOCAL ROUTINE TO "FILN8" TO MAKE THE 6 BIT CHAR IN THE AC INTO
  3061. /    8 BITS AND STORE IN A STRING
  3062.  
  3063. MOV8,    0
  3064.     SNA                /SKIP IF NOT A NULL CHAR
  3065.     TAD    (" &77            /PUT IN A SPACE IF NULL
  3066.     TAD    (240            /CONVERT BACK TO 8 BIT
  3067.     AND    C77
  3068.     TAD    (240
  3069.     AND    C177            /CLEAR BIT 7
  3070.     DCA I    MOV8P            /PUT IN THE LINE
  3071.     ISZ    MOV8P            /BUMP POINTER
  3072.     JMP I    MOV8            /DONE
  3073.  
  3074. MOV8P,    0        /POINTER FOR "MOV8" ROUTINE
  3075.  
  3076.  
  3077.  
  3078. /    ROUTINE TO PULL A FILE NAME IN 6 BIT POINTED TO BY THE
  3079. /    AC AND PLACE IN THE FILE NAME BUFFER IN 8 BIT ADDING IN
  3080. /    THE "." TO SEPERATE FILE NAME AND EXTENSION.  A MINUS WORD
  3081. /    WILL FOLLOW THE NAME
  3082.  
  3083. FILN8,    0
  3084.     DCA    GET6P            /SET POINTER FOR "GET6"
  3085.     DCA    GET6F            /SET FLAG FOR "GET6"
  3086.     TAD    (NAMBUF            /GET ADDRESS OF THE NAME BUFFER
  3087.     DCA    MOV8P            /SET IN A POINTER
  3088.     TAD    (-6            /6 NAME CHARS TO DO
  3089.     DCA    FILN8C            /SAVE IN COUNTER
  3090.  
  3091.     GET6                /PULL A CHAR
  3092.     SZA                /SKIP IF A SPACE
  3093.     JMS    MOV8            /PUT INTO THE BUFFER
  3094.     ISZ    FILN8C            /BUMP COUNTER
  3095.     JMP    .-4            /LOOP TILL ALL 6 DONE
  3096.  
  3097.     TAD    (".&77            /GET A PERIOD
  3098.     JMS    MOV8            /PUT WITH FILE NAME
  3099.     CLA CLL CMA RAL            /AC = -2
  3100.     DCA    FILN8C            /2 EXTENSION CHARS
  3101.     GET6                /GET NEXT CHAR
  3102.     SZA                /SKIP IF A SPACE
  3103.     JMS    MOV8            /PUT WITH NAME
  3104.     ISZ    FILN8C            /BUMP COUNTER
  3105.     JMP    .-4            /LOOP
  3106.  
  3107.     STA                /AC = -1
  3108.     DCA I    MOV8P            /TERMINATE THE STRING
  3109.     JMP I    FILN8            /AND RETURN
  3110.  
  3111. FILN8C,    0            /COUNTER FOR "FILN8"
  3112.  
  3113. PAGE
  3114.  
  3115.  
  3116.  
  3117. /    PARSE TABLES
  3118.  
  3119. TMPTBL,
  3120.     "C; "O; "N; "N; "E; "C; "T
  3121.     -1            /MARK END OF THIS ENTRY
  3122.     CONSRV            /SERVICE DISPATCH ADDRESS
  3123.  
  3124.     "B; "Y; "E
  3125.     -1            /MARK END OF THIS ENTRY
  3126.     BYESRV            /SERVICE DISPATCH ADDRESS
  3127.  
  3128.     "E; "X; "I; "T
  3129.     -1            /MARK END OF THIS ENTRY
  3130.     OS8            /SERVICE DISPATCH ADDRESS
  3131.  
  3132.     "S; "E; "N; "D
  3133.     -1            /END OF THIS ENTRY
  3134.     SNDSRV            /SERVICE ADDRESS
  3135.  
  3136.     "G; "E; "T
  3137.     -1            /END OF THIS ENTRY
  3138.     GETSRV            /SERVICE ADDRESS
  3139.  
  3140.     "R; "E; "C; "E; "I; "V; "E
  3141.     -1            /MARK END OF THIS ENTRY
  3142.     RECSRV            /SERVICE ADDRESS
  3143.  
  3144.     -1            /MARK END OF THE TABLE
  3145.  
  3146.  
  3147. /    KEYBOARD LINE BUFFER
  3148.  
  3149. LINBUF,    ZBLOCK    LINSIZ        /LINE BUFFER
  3150.  
  3151.  
  3152.  
  3153. /    REMOTE PACKET INPUT BUFFER
  3154.  
  3155. RRBUF,    0        /MARK
  3156. RRLEN,    0        /PACKET LENGTH
  3157. RRSEQ,    0        /PACKET SEQ
  3158. RRTYP,    0        /PACKET TYPE
  3159.     DECIMAL
  3160. RRDTA,    ZBLOCK    91        /DATA GOES HERE
  3161.     OCTAL
  3162.  
  3163.  
  3164.  
  3165. /    REMOTE PACKET OUTPUT BUFFER
  3166.  
  3167. RSBUF,    SOH            /PACKET BUFFER (BEGINS WITH "SOH")
  3168. RSLEN,    0            /PACKET LENGTH GOES HERE
  3169. RSSEQ,    0            /PACKET SEQUENCE GOES HERE
  3170. RSTYP,    0            /PACKET TYPE GOES HERE
  3171.     DECIMAL
  3172. RSDTA,    ZBLOCK    91        /DATA GOES HERE
  3173.     0            /CHECKSUM HERE ON MAX PACKET
  3174.     0            /EOL (IF USED HERE ON MAX PACKET)
  3175.     0            /INTERNAL TERMINATOR HERE ON MAX PACKET
  3176.     OCTAL
  3177.  
  3178. /    FILE NAME BUFFER
  3179.  
  3180. NAMBUF,    ZBLOCK    12        /ROOM FOR FILE NAME, EXTENSION AND TERMINATOR
  3181.  
  3182.  
  3183. /    SEND-INIT PACKET DEFINITION
  3184.  
  3185. INIDAT,    DECIMAL
  3186.     94+32        /94 CHARS MAX
  3187.     OCTAL
  3188.     " &177        /NO TIME-OUT
  3189.     " &177        /NO PADDING
  3190.     0+100&177    /NO PADDING CHAR
  3191.     " &177+15    /CR FOR EOL
  3192.     "#&177        /QUOTE CHAR
  3193.     "N&137        /NO 8TH BIT QUOTING
  3194.     "1&177        /CHECK TYPE 1
  3195.     " &177        /NO REPEAT CHAR
  3196.     " &177+0    /NO EXTRA CAPABILITY
  3197. NODATA,    -1        /END OF DATA (USE THIS FOR SENDING NO-DATA)
  3198.  
  3199.  
  3200.  
  3201. /    TEXT STORAGE
  3202. PROMPT,    TEXT    "@M@JKERMIT-8>@"
  3203.  
  3204. ERRMSG,    TEXT    "COMMAND ERROR@M@J@"
  3205. CRLF,    TEXT    "@M@J@"
  3206. FDAT,    TEXT    "  CREATED ON @"
  3207. FSMSG,    TEXT    "SENDING FILE @"
  3208. FRMSG,    TEXT    "RECEIVING FILE @"
  3209.  
  3210. CONMSG,    TEXT    "@M@J[CONNECTING TO HOST, TYPE ^\C TO RETURN TO PDP8]@M@J@"
  3211. CONEXT,    TEXT    "@M@J[BACK AT PDP8]@M@J@"
  3212. NOBYE,    TEXT    "KERMIT SERVER BYE FAILURE@M@J@"
  3213. EXTXT,    TEXT    "KERMIT EXIT@M@J@"
  3214. RUBOUT,    TEXT    "@H @H@"
  3215. BEEP,    TEXT    "@G@"
  3216.  
  3217. DEVERR,    TEXT    "DEVICE NAME ERROR@M@J@"
  3218. NOFND,    TEXT    "FILE NOT FOUND@M@J@"
  3219. RECERR,    TEXT    "RECEIVE FAILED@M@J@"
  3220. DIOERR,    TEXT    "DIRECTORY I/O ERROR@M@J@"
  3221. HFERR,    TEXT    "HANDLER FETCH ERROR@M@J@"
  3222. STXERR,    TEXT    "COMMAND SYNTAX ERROR@M@J@"
  3223. SPERR,    TEXT    "SEND PROCESS ERROR@M@J@"
  3224. FPERR,    TEXT    "FATAL PACKET ERROR@M@J@"
  3225.  
  3226.     $$$$$$$$$$
  3227.  
  3228.  
  3229.  
  3230.  
  3231.  
  3232.