home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / nicolet80 / nicolet.a next >
Text File  |  2020-01-01  |  100KB  |  4,055 lines

  1. 41984,32768,3968,
  2. /KERMIT FOR NIC-80 SERIES
  3. /FROM KERM**.A
  4. /
  5. /CONSTRUCTION -
  6. /  *RUN CLEAR
  7. /  *RUN LOADER
  8. /  @KERM**.C:M
  9. /  *LOA FPP72 102000
  10. /  *LOA NICBUG 114632
  11. /  *LOA BOOTS
  12. /  *STO KERMIT 102000-117777;110000
  13. /
  14. /LAYOUT -
  15. /  0-2777        I/O DISK-BUFFER (0-1777 FOR FLOPPY)
  16. /  3000-5777     DISK DIRECTORY (4000-5777 FOR FLOPPY)
  17. /  6000-7777     FPP72, DIRFUN OVERLAYS, DEMON MONITOR HEAD
  18. /  100000-100777 INPUT "INTERRUPT" ROTATING BUFFER
  19. /  101000-101777 OUTPUT "INTERRUPT" ROTATING BUFFER
  20. /  102000-102777 FPP72 ON ENTRY, THEN OUTPUT PACKET CONSTRUCTION
  21. /  103000-103777 FPP72 ON ENTRY, THEN INPUT PACKET DECONSTRUCTION
  22. /  104000-105777 TEXT FOR COMMAND SUMMARY, NOTES, ETC
  23. /  106000-107777 WORK ROUTINES FOR RECEIVE MODE
  24. /  110000-111777 COMMAND LIST, CONTROLLING ROUTINES, SOFTWARE "INTERRUPTS"
  25. /  112000-113777 ROUTINES FOR TRANSMIT, PACKET CONSTRUCTION, ETC
  26. /  114000-115777 FILENAME PARSING, NICBUG, BOOTS
  27. /  116000-117777 DISK ROUTINES, GENERAL UTILITIES, DISPLAY
  28. /
  29. /DEFINITIONS
  30. RSINF=6564
  31. RSIN=44563
  32. RSOUTF=6574
  33. RSOUT=4573
  34. TACMQZ=634354
  35. INCOR=4341
  36. PAGSKP
  37. *110000
  38. /PAGE 110000 HOLDS THE COMMAND BLOCK, SOFTWARE "INTERRUPTS" AND
  39. /MAIN CONTROLLING ROUTINES
  40. /USES W-PREFIX POINTERS
  41. /COMMAND BLOCK
  42. /ACCEPTS COMMANDS AFTER A ":" PROMPT
  43.        JMS @ WINTRO    /ANNOUNCE KERMIT?
  44. COMBAK,ONEM IGBFLG     /IGNORE REMOTE SYSTEM
  45.        ZERM IGAFLG     /CLEAR FLAGS
  46.        ZERM NULAFG
  47.        ZERM NULBFG
  48.        ZERM LCFLAG
  49.        ZERM CMDFLG
  50.        ZERM IGCRFG
  51.        ZERM IGTOFG
  52.        ZERM CXFLG
  53.        ZERM CZFLG
  54.        JMS RSEMPT
  55.        ONEM IGBFLG     /IGNORE B-INPUT
  56.        JMS CRLF
  57.        MEMA (":        /PROMPT
  58.        JMS TYPE
  59.        JMS CREAD       /READ SANS TIME-OUT
  60. LCBAK, A-MZ ("B        /CALL NICBUG
  61.        ZERZ
  62.        JMP @ BUGOUT
  63.        A-MZ ("C        /CONNECT TO REMOTE SYSTEM
  64.        ZERZ
  65.        JMP DUMSRT
  66.        A-MZ ("D        /DIRECTORY LISTING
  67.        ZERZ
  68.        JMS @ WDIRLS
  69.        A-MZ ("E        /SET ECHO
  70.        ZERZ
  71.        JMS MAKEKO
  72.        A-MZ ("H        /HELP! PRINT COMMAND SUMMARY
  73.        ZERZ
  74.        JMS @ WHELP
  75.        A-MZ ("I        /TOGGLE INDICATORS & ARCHIVING
  76.        ZERZ
  77.        JMS @ WARCTO
  78.        A-MZ ("K        /KILL ECHO
  79.        ZERZ
  80.        JMS KILEKO
  81.        A-MZ ("L        /LOGIN ON REMOTE SYSTEM
  82.        ZERZ
  83.        JMS LOGIN
  84.        A-MZ ("M        /QUIT TO DEMON MONITOR
  85.        ZERZ
  86.        JMP @ MONOUT
  87.        A-MZ ("N        /PRINT NOTES ON OPERATION
  88.        ZERZ
  89.        JMS @ WNOTPR
  90.        A-MZ ("P        /SET KERMIT PARAMETERS
  91.        ZERZ
  92.        JMS SETPAR
  93.        A-MZ ("Q        /QUIT TO DEMON
  94.        ZERZ
  95.        JMP @ MONOUT
  96.        A-MZ ("R        /RECEIVE DATA
  97.        ZERZ
  98.        JMS GETDAT
  99.        A-MZ ("S        /SEND DATA
  100.        ZERZ
  101.        JMS PUTDAT
  102.        A-MZ ("T        /TOGGLE RS232 B-INPUT ON/OFF
  103.        ZERZ
  104.        JMS BTOG
  105.        A-MZ ("U        /CONFIGURE USERNAME, PASSWORD
  106.        ZERZ
  107.        JMS @ WCONFI
  108.        MMOZ LCFLAG
  109.        JMP LCASE
  110.        MMOZ CMDFLG
  111.        JMP BADCHA
  112. COMFIN,JMS CRLF
  113.        JMP COMBAK
  114. BADCHA,MEMA ("?        /EXPOSTULATION
  115.        JMS TYPE
  116.        JMP COMFIN
  117. LCASE, A-MA (40        /PERHAPS LOWER-CASE?
  118.        ONEM LCFLAG
  119.        JMP LCBAK
  120. CMDFLG,0
  121. LCFLAG,0
  122. /
  123. /DUMB TERMINAL MODE
  124. /ONLY EXIT IS VIA A CTRL/G
  125. DUMSRT,JMS CRLF
  126.        JMS QIKRET
  127. DUMTRM,ZERM IGAFLG     /CLEAR FLAGS
  128.        ZERM IGBFLG
  129.        ZERM KBFLG
  130.        ZERM NULAFG
  131.        ZERM NULBFG
  132.        ZERM CMDFLG
  133.        ZERM RTFLG
  134.        JMS OPENB       /SEND AN X-ON
  135.        JMS RSDUTY      /DUTY CYCLE
  136.        JMP #-1         /AND KEEP CYCLING TIL INTERRUPTED
  137. /RS232 DUTY CYCLE
  138. /LOOKS AT ALL FOUR RS232 FLAGS, AND THE TWO BUFFERS
  139. /AND TAKES APPROPRIATE ACTION
  140. /A-INPUT ARRIVALS GO TO OP-BUFFER IF KBFLG=0, TO IP-BUFFER IF =1
  141. /B-INPUT ARRIVALS GO TO IP-BUFFER
  142. /FLAGS IGAFLG, IGBFLG CAUSE A,B INPUTS TO BE IGNORED
  143. /THE OP-BUFFER IS TRANSMITTED OUT VIA RS232-B
  144. /THE IP-BUFFER IS PRINTED ON THE VDU
  145. /CHARACTERS IN BUFFERS ARE ALWAYS PROCESSED AS SOON AS POSSIBLE
  146. /BY BEING EITHER PRINTED OR TRANSMITTED
  147. /THE PRINTING OR TRANSMISSION MAY BE INHIBITED BY SETTING NULAFG
  148. /OR NULBFG, BUT THE BUFFERS WILL STILL RECEIVE CHARACTERS
  149. /CONTROL FLAGS
  150. KBFLG, 0                /SEND KB CHAR TO OP IF =0, TO IP IF =1
  151. IGAFLG,0               /IGNORE KB, EXCEPT CTRL/G, IF =1
  152. IGBFLG,0               /IGNORE B-INPUT, IF =1
  153. NULAFG,0               /INHIBIT IP-PRINTING IF =1
  154. NULBFG,0               /SUSPEND OP-PRINTING IF =1
  155. IGCRFG,0               /INHIBIT CR FACILITY IF =1
  156. IPKTFG,0               /1=PACKET ARRIVING
  157. CXFLG, 0               /1=ABORT CURRENT FILE
  158. CZFLG, 0               /1=ABORT WHOLE FILE SERIES
  159. /THE RS232 DUTY CYCLE
  160. RSDUTY,0
  161.        RSINF           /ANYTHING ON B-INPUT?
  162.        ZERZ            /NO
  163.        JMS RSBINP      /YES, DEAL WITH IT
  164.        TTYRF           /ANYTHING FROM KB?
  165.        ZERZ            /NO
  166.        JMS TTYINP      /YES, DEAL WITH IT
  167.        RSOUTF          /IS B-OUTPUT READY?
  168.        ZERZ            /NO
  169.        JMS RSBOP       /YES, SEND CHAR FROM OP-BUFFER
  170.        TTYPF           /IS A-OUTPUT READY?
  171.        ZERZ            /NO
  172.        JMS TTYOP       /YES, PRINT CHAR FROM IP-BUFFER
  173.        JMP @ RSDUTY
  174. /INPUT ROUTINE FOR TTY KEYBOARD
  175. /DO NOT CALL UNLESS TTYRF IS SKIPPING
  176. /JUMP TO COMMAND BLOCK ON CTRL/G, NICBUG ON CTRL/B
  177. /OTHERWISE, PUT CHAR IN OP-BUFFER IF KBFLG=0
  178. /OR IN IP-BUFFER IF KBFLG=1
  179. /BUT IF IGAFLG=1, JUST READ CHAR AND IGNORE IT
  180. /HOLD LAST CHAR IN TTYCHA
  181. /IF IN RECEIVE/TRANSMIT MODE, WATCH OUT FOR CR AND CTRL/Z
  182. TTYINP,0
  183.        RDTTY
  184.        A-MZ ("G-100    /JUMP TO COMMD BLOCK ON BELL
  185.        ZERZ
  186.        JMP COMBAK
  187.        A-MZ ("B-100    /NICBUG ON ^B
  188.        ZERZ
  189.        JMP @ BUGOUT
  190.        MEMZ RTFLG      /R OT T MODE?
  191.        ZERZ
  192.        JMP NOTRT       /NO
  193.        A-MZ ("X-100    /YES, ABORT CURRENT FILE
  194.        ZERZ
  195.        ONEM CXFLG
  196.        A-MZ ("Z-100    /ABORT FILE SERIES
  197.        ZERZ
  198.        ONEM CZFLG
  199.        A-MZ (215       /RESEND LAST PACKET ON CR
  200.        JMP NOTRT
  201.        MEMZ IGCRFG     /UNLESS WE ARE IGNORING THEM?
  202.        JMP NOTRT       /WE ARE
  203.        JMP RSEND
  204. NOTRT, MEMZ IGAFLG     /IGNORE CHAR IF IGAFLG=1
  205.        JMP @ TTYINP
  206.        ACCM TTYCHA     /PRESERVE CHAR
  207.        MEMZ KBFLG      /IS KBFLG SET?
  208.        JMP KBPRN       /YES, SO CHAR TO IP-BUFFER
  209.        JMS ACOBUF      /NO, SO CHAR TO OP-BUFFER
  210.        JMP @ TTYINP
  211. KBPRN, JMS ACIBUF
  212.        JMP @ TTYINP
  213. TTYCHA,0               /CURRENT TTY CHARACTER
  214. /INPUT ROUTINE FOR RS232 CHANNEL-B
  215. /DO NOT CALL UNLESS RSINF IS SKIPPING
  216. /IF A CTRL/S, SET NULBFG=1; IF A CTRL/Q, SET NULBFG=0
  217. /OTHERWISE, PUT CHAR INTO IP-BUFFER
  218. /BUT IF IGBFLG=1, READ CHARCTER AND IGNORE IT
  219. /IF IPKTFG IS SET, PASS CHAR TO INPUT PACKET BUFFER INSTEAD
  220. /HOLD LAST CHAR IN RSBCHA
  221. RSBINP,0
  222.        RSIN
  223.        A+MA (200       /ADD BIT-7 FOR NIC
  224.        A-MZ ("S-100    /SET NULBFG ON CTRL/S
  225.        ZERZ
  226.        JMP WATSET
  227.        A-MZ ("Q-100    /CLEAR NULBFG ON CTRL/Q
  228.        ZERZ
  229.        JMP WATCLR
  230.        MEMZ IGBFLG     /IGNORE CHAR IF IGBFLG=1
  231.        JMP @ RSBINP
  232.        ACCM RSBCHA
  233.        MEMZ IPKTFG     /INCOMING PACKET?
  234.        JMP PKTING      /YES
  235.        JMS ACIBUF      /NO, ADD TO IP-BUFFER
  236.        JMP @ RSBINP
  237. PKTING,JMS @ WAIPBU    /ADD TO IP-PACKET BUFFER
  238.        JMP @ RSBINP
  239. WATSET,ONEM NULBFG
  240.        JMP @ RSBINP
  241. WATCLR,ZERM NULBFG
  242.        JMP @ RSBINP
  243. RSBCHA,0               /CURRENT RS232-B CHARACTER
  244. /RS232-B OUTPUT ROUTINE
  245. /TRANSMIT CHARACTER FROM OP-BUFFER
  246. /DO NOT CALL UNLESS RSOUTF IS SKIPPING
  247. /IF OCHACT=0, EXIT WITHOUT DOING ANYTHING
  248. /IF NULBFG=1, EXIT WITHOUT DOING ANYTHING
  249. RSBOP, 0
  250.        MEMZ OCHACT
  251.        ZERZ
  252.        JMP @ RSBOP
  253.        MEMZ NULBFG
  254.        JMP @ RSBOP
  255.        JMS OBUFAC
  256.        A-MA (200
  257.        A+MM CHKSUM
  258.        RSOUT
  259.        JMP @ RSBOP
  260. CHKSUM,0
  261. CHKMSK,1777777
  262. /RS232-A OUTPUT ROUTINE FOR TTY
  263. /PRINT FROM IP-BUFFER
  264. /DO NOT CALL UNLESS TTYPF IS SKIPPING
  265. /IF ICHACT=0, EXIT WITHOUT DOING ANYTHING
  266. /IF NULAFG=1, REMOVE CHARACTER FROM BUFFER BUT DON'T PRINT IT
  267. /ONLY PRINT APPROVED CTRL/CHARACTERS
  268. TTYOP, 0
  269.        MEMZ ICHACT
  270.        ZERZ
  271.        JMP @ TTYOP
  272.        JMS IBUFAC
  273.        ANDA (377
  274.        ACCM TTYHOL
  275.        MEMZ NULAFG
  276.        JMP @ TTYOP
  277.        A-MA (240
  278.        EXCT AC19
  279.        JMP CTRLUK
  280.        A+MA (240
  281. TITBAK,PRTTY
  282.        JMP @ TTYOP
  283. CTRLUK,A+MA (240
  284.        A-MZ (210
  285.        ZERZ
  286.        JMP TITBAK
  287.        A-MZ (211
  288.        ZERZ
  289.        JMP TITBAK
  290.        A-MZ (212
  291.        ZERZ
  292.        JMP TITBAK
  293.        A-MZ (215
  294.        ZERZ
  295.        JMP TITBAK
  296.        JMP @ TTYOP
  297. TTYHOL,0
  298. /TRANSFER CHARACTER FROM ACC TO OP-BUFFER
  299. /UNLESS BUFFER IS ALREADY FULL
  300. /BUMP POINTER, COUNTER
  301. ACOBUF,0
  302.        ACCM OPHOLD     /TEMPORARY STORE
  303.        MEMA OCHACT     /IS BUFFER FULL?
  304.        A-MA (777
  305.        SKIP AC19
  306.        JMP ACBOUT      /YES, JUMP OUT
  307.        MEMA OPHOLD     /NO, ADD CHAR
  308.        ACCM @ OPUTPT
  309.        MPOM OCHACT     /BUMP COUNTER
  310.        MPOMA OPUTPT    /AND POINTER
  311.        A-MA TOPOP
  312.        EXCT AC19       /HIT THE TOP?
  313.        JMP ACBOUT      /NO, SO EXIT
  314.        MEMA BOTOP      /YES, RESET POINTER
  315.        ACCM OPUTPT
  316. ACBOUT,MEMA OPHOLD     /RECOVER COPY OF CHAR
  317.        JMP @ ACOBUF
  318. /TRANSFER CHARACTER (IF ANY) FROM OP-BUFFER TO ACC
  319. OBUFAC,0
  320.        MEMZ OCHACT     /ANY CHARS?
  321.        ZERZ
  322.        JMP @ OBUFAC    /NO, JUMP OUT
  323.        MEMA @ OPIKPT   /COLLECT CHAR
  324.        ACCM OPHOLD     /HOLD IT
  325.        MMOM OCHACT     /DECREMENT COUNTER
  326.        MPOMA OPIKPT    /BUMP POINTER
  327.        A-MA TOPOP
  328.        SKIP AC19       /HIT THE TOP?
  329.        JMP ROPBUF      /YES
  330.        MEMA OPHOLD     /NO, SO RECOVER CHAR
  331.        JMP @ OBUFAC    /AND EXIT
  332. ROPBUF,MEMA BOTOP      /RESET POINTER
  333.        ACCM OPIKPT
  334.        MEMA OPHOLD     /RECOVER CHAR
  335.        JMP @ OBUFAC    /AND EXIT
  336. OPHOLD,0
  337. OPUTPT,101000
  338. OPIKPT,101000
  339. OCHACT,0
  340. BOTOP, 101000
  341. TOPOP, 101777
  342. /TRANSFER CHARACTER FROM ACC TO IP-BUFFER
  343. /UNLESS BUFFER IS ALREADY FULL
  344. /BUMP POINTER, COUNTER
  345. ACIBUF,0
  346.        A-MZ ("Q-100    /DO NOT PRINT CTRL/Q
  347.        ZERZ
  348.        JMP @ ACIBUF
  349.        A-MZ ("A-100    /OR ^A
  350.        ZERZ
  351.        JMP @ ACIBUF
  352.        ACCM IPHOLD     /TEMPORARY STORE
  353.        MEMA ICHACT     /IS BUFFER FULL?
  354.        A-MA (777
  355.        SKIP AC19
  356.        JMP @ ACIBUF    /YES, JUMP OUT
  357.        MEMA IPHOLD     /NO, ADD THE CHAR
  358.        ACCM @ IPUTPT
  359.        MPOM ICHACT     /BUP THE COUNTER
  360.        MPOMA IPUTPT    /AND POINTER
  361.        A-MA TOPIP
  362.        EXCT AC19       /HIT THE TOP?
  363.        JMP @ ACIBUF    /NO, SO EXIT
  364.        MEMA BOTIP      /RESET POINTER
  365.        ACCM IPUTPT
  366.        JMP @ ACIBUF
  367. /TRANSFER CHARACTER (IF ANY) FROM IP-BUFFER TO ACC
  368. /BUMP POINTER, DECREMENT COUNTER
  369. IBUFAC,0
  370.        MEMZ ICHACT     /ANY CHARS?
  371.        ZERZ
  372.        JMP @ IBUFAC    /NO, JUMP OUT
  373.        MEMA @ IPIKPT   /COLLECT CHAR
  374.        ACCM IPHOLD     /HOLD IT
  375.        MMOM ICHACT     /DECREMENT COUNTER
  376.        MPOMA IPIKPT    /BUMP POINTER
  377.        A-MA TOPIP
  378.        SKIP AC19       /HIT THE TOP?
  379.        JMP RIPBUF      /YES
  380.        MEMA IPHOLD     /NO, SO RECOVER CHAR
  381.  
  382.        JMP @ IBUFAC    /AND EXIT
  383. RIPBUF,MEMA BOTIP      /RESET POINTER
  384.        ACCM IPIKPT
  385.        MEMA IPHOLD     /RECOVER CHAR
  386.        JMP @ IBUFAC    /AND EXIT
  387. IPHOLD,0
  388. IPUTPT,100000
  389. IPIKPT,100000
  390. ICHACT,0
  391. BOTIP, 100000
  392. TOPIP, 100777
  393. /WATCH OUT FOR CHARACTER IN ACC ON ENTRY
  394. /EMPTIES IP-BUFFER BEFORE EXITING
  395. WATCHA,0
  396.        ACCM WACHOL
  397.        JMS RSDUTY
  398.        MEMA RSBCHA
  399.        A-MZ WACHOL
  400.        JMP #-3
  401.        JMS EMPTIP
  402.        ZERM RSBCHA
  403.        JMP @ WATCHA
  404. WACHOL,0
  405. /LOOK OUT FOR EITHER OF TWO SPECIFIED CHARACTERS
  406. /IN ADDRESSES FOLLOWING CALL
  407. /EXITS WITH CHAR IN ACC, AFTER EMPTYING IP-BUFFER
  408. WATCH2,0
  409.        MEMA @ WATCH2
  410.        ACCM CHAR1
  411.        MPOM WATCH2
  412.        MEMA @ WATCH2
  413.        ACCM CHAR2
  414.        MPOM WATCH2
  415. NUWACH,JMS RSDUTY
  416.        MEMA RSBCHA
  417.        A-MZ CHAR1
  418.        ZERZ
  419.        JMP WOUT1
  420.        A-MZ CHAR2
  421.        ZERZ
  422.        JMP WOUT2
  423.        JMP NUWACH
  424. WOUT1, JMS EMPTIP
  425.        ZERM RSBCHA
  426.        MEMA CHAR1
  427.        JMP @ WATCH2
  428. WOUT2, JMS EMPTIP
  429.        ZERM RSBCHA
  430.        MEMA CHAR2
  431.        JMP @ WATCH2
  432. CHAR1, 0
  433. CHAR2, 0
  434. /EMPTY BOTH TEXT BUFFERS
  435. RSEMPT,0
  436.        JMS EMPTIP
  437.        JMS EMPTOP
  438.        JMP @ RSEMPT
  439. /EMPTY THE IP-BUFFER
  440. EMPTIP,0
  441.        JMS RSDUTY
  442.        MEMZ ICHACT
  443.        JMP #-2
  444.        JMP @ EMPTIP
  445. /EMPTY THE OP-BUFFER
  446. EMPTOP,0
  447.        JMS RSDUTY
  448.        MEMZ OCHACT
  449.        JMP #-2
  450.        JMP @ EMPTOP
  451. /RECEIVE AND TRANSMIT ROUTINES
  452. /CURRENT MODE IS SHOWN BY RTFLG
  453. /IF RTFLG=1, IN TRANSMIT MODE
  454. /         0  NOT IN CONTACT WITH REMOTE SYSTEM
  455. /        -1  IN RECEIVE MODE
  456. RTFLG, 0
  457. /
  458. /RECEIVE FILES IN KERMIT PROTOCOL
  459. /ASSUMES REMOTE MACHINE IS ALREADY SENDING INITIATION PACKETS
  460. GETDAT,0
  461.        ONEM CMDFLG
  462.        JMS CRLF
  463.        JMS @ WRTCLR    /CLEAR I/O BUFFERS
  464. GDLOOP,JMS @ WSAVE     /SAVE MSA
  465.        JMS @ WGETPA    /FIND A SPACE ON THE DISK
  466.        JMS @ WDISSO    /RESTORE MSA
  467.        JMS @ WPRGSE    /SET TYPROG COUNTER
  468.        JMS @ WSARRO    /INITIALISE ARROW
  469.        MEMZ RTFLG      /ALREADY TALKING?
  470.        JMP GDNTRY      /YES
  471.        MONM RTFLG      /SET RTFLG FOR RECEIVE
  472.        JMS @ WRECIN    /NO, GET INITIATION PACKET
  473.        JMS @ WRTCAL    /COMPUTE TIME-OUT PERIOD
  474.        JMS @ WACKPK    /SEND AN ACK
  475.        JMS @ WNAMGE    /WATCH FOR FILEHEADER PACKET
  476. GDNTRY,JMS @ WFILSA    /SAY WHAT'S HAPPENING
  477.        MEMZ @ WDIAFL   /IF DIAGNOSTICS ARE ON,
  478.        JMS @ WPRGSE    /RESET TYPROG COUNTER
  479.        JMS @ WRECDA    /RECEIVE AND STORE DATA ON DISK
  480.        JMS @ WSAVE     /SAVE MSA
  481.        JMS @ WDIREN    /MAKE DIR ENTRY
  482.        JMS @ WDISSO    /RESTORE MSA
  483. GXZBAK,JMS @ WACKPK    /SEND AN ACK
  484.        JMS @ WMORFI    /MORE FILES TO COME?
  485.        JMP GDLOOP      /YES, BACK FOR NEXT
  486.        JMS @ WACKPK    /NO, SO ACK THE BYE
  487. GDEND, ZERM RTFLG      /CLEAR RTFLG FOR NO R/T
  488.        JMP @ GETDAT
  489. /TRANSMIT FILES IN KERMIT PROTOCOL
  490. PUTDAT,0
  491.        ONEM CMDFLG
  492.        JMS @ WRTCLR    /CLEAR I/O BUFFERS
  493. NEWNAM,JMS CRLF
  494.        JMS UNPCK       /GET FILENAME FROM -KB
  495.        ENF
  496.        ONEM IGCRFG     /INHIBIT CR RESEND FACILITY
  497.        JMS @ WGETLI
  498.        ZERM IGCRFG     /ENABLE CR RESEND AGAIN
  499.        JMS @ WGETDA    /DIGEST REPLY
  500.        ZERM @ WNFILE   /ZERO FILE NUMBER
  501.        JMS @ WDIRLO    /LOAD DIR AT 2000 OR 3000 (D OR F)
  502. NEWPUT,JMS @ WSARRO    /INITIALISE ARROW
  503.        JMS @ WLOOKU    /LOOK UP DIR DATA, SAY WHAT'S HAPPENING
  504.        ZERZ
  505.        JMP SETLOD      /GOT A FILENAME MATCH
  506.        MEMZ RTFLG
  507.        JMP MOQERY      /SEE IF ANY MORE TO BE SENT
  508.        JMP NEWNAM      /TRY AGAIN
  509. SETLOD,JMS @ WLODSE    /SET THINGS UP FOR LOADING FILE
  510.        MEMZ @ WDIAFL   /IF DIAGNOSTICS ARE ON,
  511.        JMS @ WPRGSE    /RESET TYPROG COUNTER
  512.        MEMZ RTFLG      /ALREADY IN CONTACT?
  513.        JMP NEXFH       /YES
  514.        JMS @ WINISN    /NO, INITIATE CONTACT
  515.        ONEM RTFLG      /SET TRANSMISSION FLAG
  516.        JMS @ WRTCAL    /CALCULATE TIMEOUT REPEATS
  517. NEXFH, JMS @ WFILHE    /SEND FILENAME, GET ACK
  518. CONPUT,JMS @ WNEXRE    /PREPARE TO MOVE RECORD
  519.        JMS @ WLOAD     /LOAD <=1 RECORD
  520.        JMS @ WPKTOU    /SEND IT OFF AS PACKETS
  521.        MEMZ @ WLASFL   /LAST RECORD?
  522.        JMP FINPUT      /YES, FINISH OFF
  523.        JMP CONPUT      /NO, LOAD NEXT ONE
  524. FINPUT,JMS @ WENDPK    /SEND FILE-FINISHING Z-PKT
  525. PXBAK, MEMZ @ WJOKER   /ANY JOKERS?
  526.        JMP NEWPUT      /YES, SEEK NEXT MATCH
  527. MOQERY,JMS CRLF        /NO
  528.        JMS CRLF
  529.        JMS UNPCK       /ANY MORE FILES TO SEND?
  530.        MORQ
  531.        JMS READ
  532.        A-MZ ("Y
  533.        ZERZ
  534.        JMP NEWNAM      /YES, ASK FOR NEXT FILENAME
  535.        JMS @ WCLOSI    /NO, SEND B-PACKET TO TERMINATE
  536.        ZERM RTFLG      /TRANSMISSION OVER
  537.        JMP @ PUTDAT
  538. ENF,   TEXT %ENTER NAME OF FILE(S) FOR TRANSMISSION%
  539. MORQ,  TEXT %ANY MORE FILES TO SEND (Y OR N)? %
  540. /TRY TO ESCAPE FROM STUCK RECEIVE/TRANSMIT LOOP
  541. /RESEND LAST PACKET, RETURN TO WAIT LOOP IN GETPKT
  542. RSEND, JMS @ WPUTPK    /RESEND THE PACKET
  543.        JMP @ WGPLP1    /LOOK FOR RESPONSE
  544. /ABORT CURRENT TRANSMISSION, SEE IF MORE NEEDED
  545. TABORT,JMS @ WDISCR    /SEND Z-PACKET WITH A D
  546.        JMP MOQERY      /SEEK NEXT FILENAME
  547. /SET KERMIT PARAMETERS
  548. SETPAR,0
  549.        ONEM CMDFLG
  550.        JMS CRLF
  551.        JMS CRLF
  552.        JMS UNPCK
  553.        NOTYET
  554.        JMS CRLF
  555.        JMP @ SETPAR
  556. NOTYET,TEXT %NOT YET AUTOMATED - USE NICBUG (:B) FOR NOW%
  557. /READ CHARACTER FROM KEYBOARD
  558. /PRINT IT IF NULAFG=0, BUT NOT IN NULAFG=1
  559. /EMERGES WITH CHAR IN ACC
  560. READ,  0
  561.        ZERM IGAFLG     /TAKE NOTICE OF KB
  562.        JMS EMPTIP      /COMPLETE IP-PRINTING
  563.        ONEM KBFLG     /ROUTE TO PRINTER
  564.        ZERM TTYCHA
  565.        JMS TSET        /INITIALISE TIME-OUT COUNT
  566.        JMS RSDUTY      /AWAIT CHAR
  567.        JMS TCOUNT      /TIMED OUT YET?
  568.        JMP TIMOUT      /YES
  569.        MEMAZ TTYCHA
  570.        ZERZ
  571.        JMP #-5
  572.        ACCM REDHOL     /HOLD IT
  573.        JMS EMPTIP      /WAIT FOR IT TO BE PRINTED
  574.        MEMA REDHOL     /RECOVER IT
  575.        JMP @ READ
  576. TIMOUT,JMS CRLF        /TIMED OUT
  577.        JMS UNPCK
  578.        TOUT
  579.        JMS CRLF
  580.        JMP COMBAK
  581. REDHOL,0
  582. TOUT,  TEXT %TIMED OUT%
  583. /SECRET READ, WITHOUT PRINTING
  584. SREAD, 0
  585.        ONEM NULAFG
  586.        JMS READ
  587.        ZERM NULAFG
  588.        JMP @ SREAD
  589. /VERSION OF READ FOR COMMAND BLOCK, WITHOUT TIME-OUT FACILITY
  590. CREAD, 0
  591.        ONEM IGTOFG
  592.        JMS READ
  593.        ZERM IGTOFG
  594.        JMP @ CREAD
  595. /TIME-OUT COUNTER FOR INCLUSION IN WAIT-LOOPS SUCH AS READ
  596. /TAKES 1ST RA WHEN TIMED OUT
  597. /NORMALLY 2ND RA
  598. /BUT CAN BE INHIBITED BY SETTING IGTOFG=1
  599. TCOUNT,0
  600.        MEMZ IGTOFG     /INHIBITION?
  601.        JMP TCOUT       /YES, JUMP STRAIGHT OUT
  602.        MMOMZ TCNT      /COUNTED OUT?
  603.        JMP TCOUT       /NO, NOT YET
  604.        MEMA @ WRSANU   /YES, RESET COUNTER
  605.        ACCM TCNT
  606.        MMOMZ TNUM     /WAS IT LAST SESSION?
  607.        JMP TCOUT       /NO
  608.        JMP @ TCOUNT    /YES, 1ST RA
  609. TCOUT, MPOM TCOUNT     /TAKE 2ND RA
  610.        JMP @ TCOUNT
  611. TCNT,  0
  612. TNUM,  0
  613. IGTOFG,0               /0-DO, 1=DON'T, DO TIME-OUT
  614. /SET TIME-OUT COUNTERS
  615. TSET,  0
  616.        MEMA @ WRSANU
  617.        ACCM TCNT
  618.        MEMA (7
  619.        ACCM TNUM
  620.        JMP @ TSET
  621. /TYPE CHARACTER IN ACC
  622. /PROVIDED THAT NULAFG=0
  623. TYPE,  0
  624.        ACCM TYPHOL
  625.        JMS ACIBUF
  626.        JMS EMPTIP
  627.        MEMA TYPHOL
  628.        JMP @ TYPE
  629. TYPHOL,0
  630. /TRANSMIT CHARACTER IN ACC
  631. /PROVIDED THAT NULBFG=0
  632. RSTYPE,0
  633.        ACCM BTYPHO
  634.        JMS ACOBUF
  635.        JMS EMPTOP
  636.        MEMA BTYPHO
  637.        JMP @ RSTYPE
  638. BTYPHO,0
  639. /TYPE CRLF, PROVIDED THAT NULAFG=0
  640. CRLF,  0
  641.        MEMA (215
  642.        JMS TYPE
  643.        MEMA (212
  644.        JMS TYPE
  645.        JMP @ CRLF
  646. /TRANSMIT CRLF, PROVIDED THAT NULBFG=0
  647. RSCRLF,0
  648.        MEMA (215
  649.        JMS RSTYPE
  650.        MEMA (212
  651.        JMS RSTYPE
  652.        JMP @ RSCRLF
  653. /TRANSMIT RETURN ONLY, NEXT TIME RSDUTY IS CALLED
  654. QIKRET,0
  655.        MEMA (215
  656.        JMS ACOBUF
  657.        JMP @ QIKRET
  658. /SEND A RETURN, AND PAUSE
  659. SLORET,0
  660.        MEMA (215
  661.        JMS RSTYPE
  662.        MEMA SLONUM
  663.        ACCM SLOCNT
  664.        JMS RSDUTY
  665.        MMOMZ SLOCNT
  666.        JMP #-2
  667.        JMP @ SLORET
  668. SLONUM,10000
  669. SLOCNT,0
  670. /LOG IN ON SYM
  671. LOGIN,0
  672.        ONEM CMDFLG
  673.        MEMA @ WUSRNA
  674.        EXCT ZAC
  675.        JMP UNFIGD
  676.        ZERM IGBFLG
  677.        ZERM IGAFLG
  678.        ZERM KBFLG
  679.        JMS RSEMPT
  680.        JMS PADGET
  681.        JMS SYMGET
  682.        JMS SYMENT
  683.        JMP DUMTRM
  684. UNFIGD,JMS CRLF
  685.        JMS UNPCK
  686.        UF
  687.        JMS CRLF
  688.        JMP @ LOGIN
  689. UF,    TEXT %ENTER "U" TO CONFIGURE%
  690. /MAKE CONTACT WITH THE PAD
  691. PADGET,0
  692.        JMS SLORET
  693.        JMS SLORET
  694.        JMS SLORET
  695.        JMS SLORET
  696.        JMS QIKRET
  697.        MEMA (">
  698.        JMS WATCHA
  699.        JMS RSEMPT
  700.        JMP @ PADGET
  701. /MAKE CONTACT WITH THE SYM
  702. SYMGET,0
  703.        JMS RSPCK
  704.        CALSYM
  705.        JMS QIKRET
  706.        MEMA (":
  707.        JMS WATCHA
  708.        JMP @ SYMGET
  709. CALSYM,TEXT %CALL LANCS.CENT1%
  710. /ENTER USERNAME, ACCEPT PASSWORD, WAIT FOR ">" CHARACTER
  711. SYMENT,0
  712.        JMS @ WASCTR
  713.        USRNAM
  714.        MEMA (":
  715.        JMS WATCHA
  716.        JMS @ WASCTR
  717.        PASWRD
  718.        MEMA (">
  719.        JMS WATCHA
  720.        JMP @ SYMENT
  721. /SWITCH OFF SYMMETRY ECHO
  722. KILEKO,0
  723.        ONEM CMDFLG
  724.        JMS OPENB
  725.        JMS QIKRET
  726.        MEMA (">
  727.        JMS WATCHA
  728.        JMS RSPCK
  729.        ECHOFF
  730.        JMS QIKRET
  731.        MEMA (">
  732.        JMS WATCHA
  733.        JMP @ KILEKO
  734. ECHOFF,TEXT %STTY -ECHO%
  735. /SWITCH ECHO ON AGAIN
  736. MAKEKO,0
  737.        ONEM CMDFLG
  738.        JMS OPENB
  739.        JMS QIKRET
  740.        MEMA (">
  741.        JMS WATCHA
  742.        JMS RSPCK
  743.        ECHON
  744.        JMS QIKRET
  745.        MEMA (">
  746.        JMS WATCHA
  747.        JMP @ MAKEKO
  748. ECHON, TEXT %STTY ECHO%
  749. /LOG-OFF, EXIT TO MONITOR
  750. LOGOUT,0
  751.        ONEM CMDFLG
  752.        ZERM IGBFLG
  753.        ZERM NULBFG
  754.        MEMA ("Q-100
  755.        JMS RSTYPE
  756.        JMS QIKRET
  757.        MEMA (">
  758.        JMS WATCHA
  759.        JMS RSPCK
  760.        LO
  761.        JMS QIKRET
  762.        MEMA ("*
  763.        JMS WATCHA
  764.        JMS EMPTIP
  765.        JMP @ MONOUT
  766. LO,    TEXT %LOGOUT%
  767. /TOGGLE THE B-INPUT ON/OFF
  768. BTOG,  0
  769.        ONEM CMDFLG
  770.        JMS CRLF
  771.        JMS UNPCK
  772.        RBI
  773.        MEMZ IGBFLG
  774.        JMP BTOFF
  775.        JMS UNPCK
  776.        RBON
  777.        JMS OPENB
  778.        JMP BTGOUT
  779. BTOFF, JMS UNPCK
  780.        RBOFF
  781.        JMS SHUTB
  782. BTGOUT,JMS CRLF
  783.        JMP @ BTOG
  784. RBI,   TEXT %RS232 B-INPUT %
  785. RBON,  TEXT %OPEN%
  786. RBOFF, TEXT %SHUT%
  787. /SHUT DOWN THE B-INPUT
  788. SHUTB, 0
  789.        JMS RSEMPT
  790.        MEMA ("S-100
  791.        JMS RSTYPE
  792.        ONEM IGBFLG
  793.        JMP @ SHUTB
  794. /OPEN UP THE B-INPUT AGAIN
  795. OPENB, 0
  796.        JMS RSEMPT
  797.        ZERM IGBFLG
  798.        MEMA ("Q-100
  799.        JMS RSTYPE
  800.        JMP @ OPENB
  801. /UNPACK 6-BIT TEXT AND TYPE
  802. UNPCK, 0
  803.        MEMA @ UNPCK
  804.        ACCM UNP100
  805.        MPOM UNPCK
  806. UNP200,MEMA @ UNP100
  807.        JMS UNP300
  808. UNPBAK,MPOM UNP100
  809.        JMP UNP200
  810. UNP300,0
  811.        ACCM UNP400
  812.        RASH 14
  813.        JMS UNP500
  814.        RASH 6
  815.        JMS UNP500
  816.        JMS UNP500
  817.        JMP @ UNP300
  818. UNP500,0
  819.        ANDA (77
  820. UPEXIT,A-MZ (77
  821.        ZERZ
  822.        JMP UNPOUT
  823.        A+MA (240
  824.        JMS ACIBUF
  825.        MEMA UNP400
  826.        JMP @ UNP500
  827. UNPOUT,JMS EMPTIP
  828.        JMP @ UNPCK
  829. UNP100,0
  830. UNP400,0
  831. /VERSION OF UNPCK FOR FILENAME PRINTING
  832. /JUMPS OUT ON FINDING A SPACE, INSTEAD OF A 77
  833. FPCK,  0
  834.        MEMA @ FPCK
  835.        ACCM FPCADD
  836.        MPOM FPCK
  837.        MEMA INSSP
  838.        ACCM UPEXIT
  839.        JMS UNPCK
  840. FPCADD,0
  841.        MEMA INS77
  842.        ACCM UPEXIT
  843.        JMP @ FPCK
  844. INSSP, A-MZ (0
  845. INS77, A-MZ (77
  846. /UNPACK 6-BIT TEXT DOWN RS232-B OUTPUT
  847. /CONVERTING TO LOWER-CASE
  848. RSPCK, 0
  849.        MEMA @ RSPCK
  850.        ACCM RSP100
  851.        MPOM RSPCK
  852. RSP200,MEMA @ RSP100
  853.        JMS RSP300
  854.        MPOM RSP100
  855.        JMP RSP200
  856. RSP300,0
  857.        ACCM RSP400
  858.        RASH 14
  859.        JMS RSP500
  860.        RASH 6
  861.        JMS RSP500
  862.        JMS RSP500
  863.        JMP @ RSP300
  864. RSP500,0
  865.        ANDA (77
  866.        A-MZ (77
  867.        ZERZ
  868.        JMP RSPOUT
  869.        A-MA (40
  870.        EXCT AC19 ZAC
  871.        A-MA (40
  872.        A+MA (340
  873.        JMS ACOBUF
  874.        MEMA RSP400
  875.        JMP @ RSP500
  876. RSPOUT,JMS EMPTOP
  877.        JMP @ RSPCK
  878. RSP100,0
  879. RSP400,0
  880. /DISK POINTERS
  881. WDISSO,0
  882. MONOUT,7600
  883. /PAGE 106000 POINTERS
  884. WMORFI,MORFIN
  885. WRECIN,RECINI
  886. WNAMGE,NAMGET
  887. WFILSA,FILSAY
  888. WRECDA,RECDAT
  889. /PAGE 112000 POINTERS
  890. WDIAFL,DIAFLG
  891. WRSANU,RSANUM
  892. WARCTO,ARCTOG
  893. WRTCLR,RTCLR
  894. WINISN,INISND
  895. WACKPK,ACKPKT
  896. WSIDCO,SIDCON
  897. WFILHE,FILHED
  898. WPKTOU,PKTOUT
  899. WENDPK,ENDPKT
  900. WCLOSI,CLOSIT
  901. WPUTPK,PUTPKT
  902. WGPLP1,GPLUP1
  903. WDISCR,DISCRD
  904. WAIPBU,AIPBUF
  905. WPRGSE,PRGSET
  906. WRTCAL,RTCALC
  907. /PAGE 114000 POINTERS
  908. WGETLI,GETLIN
  909. WGETDA,GETDAB
  910. WASFLA,ASFLAG
  911. WNFILE,NFILES
  912. WLOOKU,LOOKUP
  913. WJOKER,JOKER
  914. BUGOUT,114700
  915. /PAGE 116000 POINTERS
  916. WSARRO,SARROW
  917. WUSRNA,USRNAM
  918. WHELP, HELP
  919. WNOTPR,NOTPRN
  920. WDIRLO,DIRLOD
  921. WLODSE,LODSET
  922. WNEXRE,NEXREC
  923. WLOAD, LOAD
  924. WLASFL,LASFLG
  925. WINTRO,INTROD
  926. WCONFI,CONFIG
  927. WASCTR,ASCTRN
  928. WSAVE, SAVE
  929. WDIREN,DIRENT
  930. WGETPA,GETPAD
  931. WDIRLS,DIRLST
  932. WDISKI,DISKID
  933. PAGSKP
  934. *104000
  935. /PAGE 104000 HOLDS TEXT FOR COMMAND SUMMARY ETC
  936. /KERMIT COMMAND SUMMARY
  937. COMSUM,TEXT %       ***KERMIT COMMAND SUMMARY***%
  938. TEXT %B - CALL NICBUG%
  939. TEXT %C - CONNECT (DUMB TERMINAL MODE)%
  940. TEXT %  ^G - RETURN TO COMMAND BLOCK%
  941. TEXT %D - DIRECTORY LISTING%
  942. TEXT %E - SET EXTERNAL ECHO%
  943. TEXT %H - HELP! PRINT COMMAND SUMMARY%
  944. TEXT %I - TOGGLE INDICATOR-PRINTING & PACKET-ARCHIVING ON/OFF%
  945. TEXT %K - KILL EXTERNAL ECHO%
  946. TEXT %L - LOGIN ON REMOTE SYSTEM%
  947. TEXT %M - QUIT, RETURN TO DEMON MONITOR%
  948. TEXT %N - PRINT NOTES ON OPERATION%
  949. TEXT %P - SET KERMIT PARAMETERS%
  950. TEXT %Q - QUIT, RETURN TO DEMON MONITOR%
  951. TEXT %R - RECEIVE DATA, FILE ON DISK%
  952. TEXT %  ^G - UNCONDITIONAL RETURN TO COMMAND BLOCK%
  953. TEXT %  ^X - ABORT TRANSFER OF CURRENT FILE%
  954. TEXT %  ^Z - ABORT TRANSFER OF WHOLE FILE SERIES%
  955. TEXT %  CR - RETRANSMIT LAST PACKET, AND CONTINUE%
  956. TEXT %S - SEND FILE(S) TO REMOTE SYSTEM%
  957. TEXT %  (WITH ^G,^X,^Z,CR, SAME AS FOR R-COMMAND)%
  958. TEXT %T - TOGGLE RS232 B-INPUT ON/OFF%
  959. TEXT %U - CONFIGURE USERNAME AND PASSWORD%
  960. 740000
  961. NOTES, TEXT %                ***NOTES***%
  962. TEXT %1. OPERATION IS MORE RELIABLE AFTER A MINOR MODIFICATION TO THE RS-232%
  963. TEXT %PCB IN THE NIC-80 (SEE INSTRUCTIONS).%
  964. TEXT % %
  965. TEXT %2. TO AVOID BUFFER-OVERFLOW AND LOSS OF CHARACTERS WHEN A LOT OF DATA%
  966. TEXT %ARRIVES FAST IN TERMINAL-EMULATOR MODE (:C), THE RS-232 A-CHANNEL SHOULD%
  967. TEXT %BE RUN AT A BAUD RATE EQUAL TO (OR FASTER THAN) THE B-CHANNEL RATE.%
  968. TEXT % %
  969. TEXT %3. INDICATOR-PRINTING AND PACKET-ARCHIVING (:I) IS TO ASSIST DE-BUGGING:%
  970. TEXT %THE PREVIOUS 3 OR 4 PACKETS ARE PRESERVED AT OCTAL 200 INTERVALS IN%
  971. TEXT %102000-102777 (OUTPUT PACKETS) AND 103000-103777 (INPUT), FOR INSPECTION%
  972. TEXT %WITH NICBUG (:B), AND THE INDICATOR SYMBOLS ARE PRINTED DURING OPERATION.%
  973. TEXT % %
  974. TEXT %4. WITH INDICATOR-PRINTING (:I) SELECTED, THE (MOSTLY LOWER-CASE)%
  975. TEXT %SYMBOLS FOR OUTGOING PACKETS ARE -%
  976. TEXT %     S - PACKET SENT%
  977. TEXT %     S - (UPPER-CASE) SAME PACKET RE-SENT%
  978. TEXT %INDICATOR SYMBOLS FOR INCOMING PACKETS ARE -%
  979. TEXT %     R - GOOD (UNCORRUPTED) PACKET RECEIVED%
  980. TEXT %     C - CHECKSUM ERROR%
  981. TEXT %     L - LENGTH ERROR%
  982. TEXT %     N - NAK RECEIVED (NOT PRINTED IF SEQ.NO. ALSO WRONG)%
  983. TEXT %     N - (UPPER-CASE) NAK TO *NEXT* PACKET RECEIVED%
  984. TEXT %     T - TIME-OUT, AWAITING PACKET%
  985. TEXT %     T - (UPPER-CASE) TIME-OUT, DURING RECEPTION OF PACKET%
  986. TEXT %     W - WRONG SEQUENCE NUMBER%
  987. TEXT % %
  988. TEXT %5. IT IS ASSUMED THAT THE NIC-80 IS CONTROLLED FROM A VDU TERMINAL,%
  989. TEXT %NOT AN ORIGINAL ASR33 TELETYPE (WHICH CANNOT PRINT THE LOWER-CASE%
  990. TEXT %INDICATOR SYMBOLS).%
  991. TEXT % %
  992. 740000
  993. PAGSKP
  994. *106000
  995. /PAGE 106000 HOLDS THE MAIN WORK ROUTINES FOR RECEIVING DATA
  996. /USES V-PREFIX POINTERS
  997. /
  998. /RECEIVE PACKETS AND STORE AS DATA FILES ON DISK
  999. /ASSUMES THAT A FILE-HEADER HAS ALREADY ARRIVED AND THAT A SPACE
  1000. /HAS BEEN FOUND ON THE DISK
  1001. RECDAT,0
  1002.        ZERM ENDFLG     /CLEAR FLAGS
  1003.        ZERM NEFLG
  1004.        ZERM LCRFLG
  1005.        ZERM DOLFLG
  1006.        ZERM SBFLG
  1007.        JMS CLRDB       /CLEAR DISK BUFFER
  1008.        ZERM DBPNT      /SET POINTER
  1009.        MEMA @ VRECSI   /SET RECORD WORD-COUNTER
  1010.        ACCM DBCNT
  1011.        ACCM @ VRITWR   /AND STORE SIZE
  1012.        ZERM @ VWRDST   /ZERO WORDS STORED
  1013.        MEMZ @ VASFLA   /IS IT ASCII OR NUMERICAL?
  1014.        JMP RDASCI      /ASCII
  1015.        JMS @ VACKPK    /NUMERICAL, SEND AN ACK
  1016.        JMS DATGET      /AND GET FIRST DATA PACKET
  1017.        JMS INRPIP      /INITIALISE PIP POINTER, COUNTER
  1018.        JMS FDGET       /SCOOP & STORE FILE DIR DATA
  1019. RDNLUP,JMS BINMOV      /MOVE NUMBER TO BINBUF (&RELOAD)
  1020.        JMS BINMAK      /CONVERT TO INTEGER (&STORE)
  1021.        JMS BMPDB       /CHECK POSITION, STORE IF READY
  1022.        JMP RDNLUP      /BACK FOR NEXT
  1023.        JMP @ RECDAT    /ENDFLG=1, LAST BUFFER STORED
  1024. RDASCI,JMS @ VACKPK    /SEND AN ACK
  1025.        JMS DATGET      /GET FIRST DATA PACKET
  1026.        JMS INRPIP      /INITIALISE PIP POINTER, COUNTER
  1027.        JMS FDGET       /SCOOP & STORE FILE DIR DATA
  1028. RDALUP,JMS PNTMOV      /MOVE QUINT TO PENTUM (&RELOAD)
  1029.        JMS PAKDWN      /TRANSFER AS PACASC
  1030.        JMS BMPDB       /CHECK POSITION, STORE IF READY
  1031.        JMP RDALUP      /BACK FOR MORE
  1032.        JMP @ RECDAT    /ENDFLG=1, LAST BUFFER STORED
  1033. /POINTERS, COUNTER, FOR PACKET IN OUTPUT BUFFER
  1034. ROPAKS=102000
  1035. ROMARK,ROPAKS          /FOR ^A MARK
  1036. ROLEN, ROPAKS+1        /LENGTH
  1037. ROSEQ, ROPAKS+2        /SEQUENCE NO.
  1038. ROTYPE,ROPAKS+3        /PACKET TYPE
  1039. RODATS,ROPAKS+4        /START OF DATA
  1040. ROPKPT,0               /POINTER
  1041. ROPKCT,0               /COUNTER
  1042. /POINTERS, COUNTER, FOR PACKET IN INPUT BUFFER
  1043. RIPAKS=103000
  1044. RIMARK,RIPAKS          /FOR ^A MARK
  1045. RILEN, RIPAKS+1        /LENGTH
  1046. RISEQ, RIPAKS+2        /SEQUENCE NO.
  1047. RITYPE,RIPAKS+3        /PACKET TYPE
  1048. RIDATS,RIPAKS+4        /START OF DATA
  1049. RIPKPT,0               /POINTER
  1050. RIPKCT,0               /COUNTER
  1051. /GENERAL POINTERS, VARIABLES, FOR RECEIVE MODE
  1052. DBPNT, 0               /DISK-BUFFER POINTER
  1053. DBCNT, 0               /DISK-BUFFER COUNTER
  1054. ENDFLG,0               /=1 WHEN Z-PACKET ARRIVES
  1055. NEFLG, 0               /=1 WHEN ASCII REACHES (RECSIZ-130)
  1056. LCRFLG,0               /=1 WHEN LAST CR ADDED
  1057. DOLFLG,0               /=1 WHEN DOLLAR ADDED
  1058. SBFLG, 0               /=1 WHEN ASCII BUFFER STORABLE
  1059. RTRYCT,0                /TRY COUNTER FOR RECEIVE
  1060. /INITIALISE POINTER, COUNTER, FOR READING DATA
  1061. INRPIP,0
  1062.        MEMA RIDATS
  1063.        ACCM RIPKPT
  1064.        MEMA @ RILEN
  1065.        A-MA (243
  1066.        ACCM RIPKCT
  1067.        JMP @ INRPIP
  1068. /CLEAR THE DISK BUFFER
  1069. CLRDB, 0
  1070.        ZERM CLDBPT
  1071.        MEMA @ VRECSI
  1072.        ACCM CLDBCT
  1073. CLDLUP,ZERM @ CLDBPT
  1074.        MPOM CLDBPT
  1075.        MMOMZ CLDBCT
  1076.        JMP CLDLUP
  1077.        JMP @ CLRDB
  1078. CLDBPT,0
  1079. CLDBCT,0
  1080. /TEST PROGRESS
  1081. /BUMP DISK BUFFER & STORE IF FULL, NORMALLY 1ST RA
  1082. /IF ENDFLG=1, DO FINAL STORE, TAKE 2ND RA
  1083. /WITH ASCII (ASFLAG=1), SET NEFLG WHEN 130 SHORT OFBUFFER TOP
  1084. /AND STORE THE BUFFER WHEN SBFLG SETS
  1085. /NOTE THAT, FOR ASCII, THE BUMPING IS DONE BY PAKDWN
  1086. BMPDB, 0
  1087.        MEMZ @ VASFLA   /ASCII OR NUMERICAL?
  1088.        JMP BMPASC      /ASCII
  1089.        MPOM DBPNT
  1090.        MPOM @ VARWDS
  1091.        MMOM DBCNT
  1092.        MEMZ ENDFLG     /NUMERICAL, ALL DONE?
  1093.        JMP LASBIN      /YES
  1094.        MEMA DBCNT      /NO, ANY SPACE LEFT?
  1095.        SKIP ZAC
  1096.        JMP @ BMPDB     /YES, TAKE 1ST RA
  1097. STOBUF,JMS @ VWRITE    /NO, SO STORE BUFFER
  1098.        JMS CLRDB       /CLEAR THE AREA
  1099.        ZERM DBPNT      /RESET POINTER
  1100.        MEMA @ VRECSI   /AND COUNTER
  1101.        ACCM DBCNT
  1102.        JMP @ BMPDB     /TAKE 1ST RA
  1103. LASBIN,MEMA DBPNT      /STORE WHAT WE HAVE
  1104.        AMOM @ VRITWR
  1105. BDBOUT,JMS @ VWRITE    /WRITE BUFFER TO DISK
  1106.        MPOM BMPDB      /TAKE 2ND RA
  1107.        JMP @ BMPDB
  1108. BMPASC,MMOZ SBFLG      /READY TO STORE ASCII BUFFER?
  1109.        JMP NETST       /NO, CHECK POSITION
  1110.        MEMZ ENDFLG     /YES, IS IT LAST ONE?
  1111.        JMP BDBOUT      /YES, FINISH OFF
  1112.        ZERM SBFLG      /NO, CLEAR FLAGS
  1113.        ZERM NEFLG
  1114.        ZERM LCRFLG
  1115.        JMP STOBUF      /AND GO AND STORE BUFFER
  1116. NETST, MEMA DBCNT      /NEAR END OF BUFFER?
  1117.        A-MA (130
  1118.        EXCT AC19 ZAC
  1119.        ONEM NEFLG      /YES, SET NEAR-END FLAG
  1120.        JMP @ BMPDB     /TAKE 1ST RA
  1121. /COLLECT AND STORE THE DIRECTORY DATA FOR THE FILE
  1122. /ASSUMED TO BE THREE DECIMAL NUMBERS AT FRONT OF FIRST PACKET
  1123. /SIZE, LOAD ADDRESS, STARTING ADDRESS
  1124. FDGET, 0
  1125.        MEMA @ RIDATS   /IS 1ST CHAR A DIGIT?
  1126.        JMS DIGCHK
  1127.        ZERZ
  1128.        JMP @ FDGET     /NO, JUMP OUT
  1129.        MEMA VSIZE      /SET POINTER
  1130.        ACCM DBPNT
  1131.        MEMA (3         /SET COUNTER
  1132.        ACCM FDGCNT
  1133. FDGLUP,JMS BINMOV      /DECIMAL-OCTAL CONVERSION LOOP
  1134.        JMS BINMAK
  1135.        MPOM DBPNT
  1136.        MMOMZ FDGCNT
  1137.        JMP FDGLUP
  1138.        ZERM DBPNT      /RESET POINTERS
  1139.        MEMA (5
  1140.        A+MM RIPKPT
  1141.        M-AM RIPKCT
  1142.        MEMA @ VSIZE    /INITIALISE ARROW
  1143.        ACCM @ VWRDTO
  1144.        ZERM @ VARWDS
  1145.        JMP @ FDGET
  1146. FDGCNT,0
  1147. /MOVE ONE DECIMAL INTEGER FROM PIP-BUFFER TO BIN BUFFER
  1148. /IGNORE LEADING ZEROES, DIGITS AFTER A DECIMAL POINT, AND NON-NUMERIC
  1149. /CHARACTERS WHICH ARE ASSUMED TO BE SEPARATORS
  1150. BINMOV,0
  1151.        MEMA BINST      /CLEAR BINBUF BUFFER
  1152.        ACCM BINPT
  1153.        MEMA (7
  1154.        ACCM BINCT
  1155. BMOV1, ZERM @ BINPT
  1156.        MPOM BINPT
  1157.        MMOMZ BINCT
  1158.        JMP BMOV1
  1159.        MEMA BINST      /RESET BIN POINTER, COUNTER
  1160.        ACCM BINPT
  1161.        MEMA (7
  1162.        ACCM BINCT
  1163. BMOV2, MEMA @ RIPKPT   /FIND FIRST DIGIT, OR MINUS
  1164.        JMS DIGCHK      /EXAMINE CHAR
  1165.        JMP BMOV3       /GOT ONE
  1166.        JMS PIPBMP      /BUMP PACKET (OR GET NEXT)
  1167.        JMP BMOV2       /RETRY
  1168. BMOV3, ACCM @ BINPT    /DEPOSIT CHAR (DIGIT OR -)
  1169.        JMS PIPBMP      /BUMP PACKET (OR GET NEXT)
  1170.        MPOM BINPT      /BUMP BIN POINTER
  1171.        MMOMA BINCT     /SAFETY CHECK
  1172.        EXCT AC19
  1173.        JMP BMOTP       /TOO MANY DIGITS
  1174.        MEMA @ RIPKPT   /LOOK AT NEXT CHAR
  1175.        JMS DIGCHK      /IS IT A DIGIT?
  1176.        JMP BMOV3       /YES, GRAB IT
  1177.        JMP @ BINMOV    /NO, JOB FINISHED
  1178. BMOTP, MEMA BINST      /ENSURE BINT IS MAXIMUM INTEGER
  1179.        ACCM BINPT
  1180.        MEMA @ BINPT
  1181.        A-MZ ("-        /OF APPROPRIATE SIGN
  1182.        ZERZ
  1183.        MPOM BINPT
  1184.        MEMA ("9
  1185.        ACCM @ BINPT
  1186. OTPOUT,MEMA @ RIPKPT   /MOVE ALONG TO A NON-DIGIT
  1187.        JMS DIGCHK
  1188.        ZERZ
  1189.        JMP @ BINMOV    /FOUND ONE, EXIT
  1190.        JMS PIPBMP
  1191.        JMP OTPOUT
  1192. /CHECK CHAR IN ACC ON ENTRY
  1193. /IF A DIGIT OR MINUS, TAKE 1ST RA WITH CHAR IN ACC
  1194. /OTHERWISE, IF NON-NUMERIC, TAKE 2ND RA
  1195. DIGCHK,0
  1196.        ACCM DCHOLD
  1197.        A-MA (260
  1198.        EXCT AC19
  1199.        JMP MINCHK
  1200.        MEMA DCHOLD
  1201.        A-MA (272
  1202.        EXCT AC19
  1203.        JMP NUMCHA
  1204.        JMP NONNUM
  1205. NUMCHA,MEMA DCHOLD
  1206.        JMP @ DIGCHK
  1207. NONNUM,MPOM DIGCHK
  1208.        MEMA DCHOLD
  1209.        JMP @ DIGCHK
  1210. MINCHK,MEMA DCHOLD
  1211.        A-MZ (255
  1212.        JMP NONNUM
  1213.        JMP NUMCHA
  1214. DCHOLD,0
  1215. /RE-CREATE A BINARY INTEGER FROM ASCII DECIMAL NUMBER
  1216. /NUMBER TO BE IN BINBUF, STARTING AT THE BEGINNING
  1217. /FIRST ADDRESS MAY CONTAIN A MINUS SIGN OR A DIGIT
  1218. /IF FIRST ADDRESS CONTAINS A ZERO, THE NUMBER IS TREATED AS ZERO
  1219. /ROUTINE DEPOSITS RESULT AT DBPNT, AND EXITS WITH IT IN ACC
  1220. BINMAK,0
  1221.        MEMA DESRT      /INITIALISE THINGS
  1222.        ACCM DEPNT
  1223.        ZERM BINT
  1224.        ZERM BINSIN
  1225.        MEMA @ BINST    /IS NUMBER ZERO?
  1226.        A-MA (260
  1227.        EXCT ZAC
  1228.        JMP NULFIN      /YES, SO EXIT
  1229.        MEMA @ BINST    /NO, IS NUMBER NEGATIVE?
  1230.        A-MA (255
  1231.        EXCT ZAC
  1232.        ONEM BINSIN     /YES, SET FLAG
  1233.        MEMA BINEND     /FIND LOWEST DIGIT
  1234.        ACCM BINPT
  1235.        MEMA (7
  1236.        ACCM BINCT
  1237. BMLUP1,MEMAZ @ BINPT   /SEARCH LOOP
  1238.        JMP GOTDIG
  1239.        MMOM BINPT
  1240.        MMOMZ BINCT
  1241.        JMP BMLUP1
  1242. GOTDIG,JMS UNASCI      /REMOVE ASCII BIAS, TEST
  1243.        JMP NULFIN      /ERROR, TREAT AS ZERO
  1244.        ACCM BINT       /OK, UNITS
  1245. BMLUP2,MMOM BINPT
  1246.        MEMA @ BINPT
  1247.        JMS UNASCI      /REMOVE ASCII BIAS, TEST
  1248.        JMP BINFIN      /NON-DIGIT, FINISH OFF
  1249.        ACCM BINMUL     /OK, MULTIPLY BY DEC EQUIVT
  1250.        MEMA @ DEPNT
  1251.        TACMQ
  1252.        MULT
  1253. BINMUL,0
  1254.        SKIP ZAC        /TEST FOR OVERFLOW
  1255.        JMP MAXFIN      /IT HAS
  1256.        TMQAC           /OK
  1257.        A+MMA BINT      /ADD RESULT TO BINT
  1258.        EXCT AC19       /HAS BIT-19 SET?
  1259.        JMP MAXFIN      /YES
  1260.        MPOM DEPNT      /BUMP DEC EQUIVT POINTER
  1261.        JMP BMLUP2      /AND BACK FOR NEXT DIGIT
  1262. BINFIN,MEMA BINT       /FINISH OFF, ADJUST SIGN?
  1263. MAXOUT,MEMZ BINSIN
  1264.        ANGA
  1265. MNOUT, ACCM BINT       /LEAVE RESULT IN BINT
  1266.        ACCM @ DBPNT    /AND DBPNT
  1267.        JMP @ BINMAK
  1268. NULFIN,ZERAM BINT      /LEAVE ZERO IN BINT, ACC, DBPNT
  1269.        ACCM @ DBPNT
  1270.        JMP @ BINMAK
  1271. MAXFIN,MEMA MAXPOS     /OVERFLOW, SO SET MAX INTEGER
  1272.        MMOZ BINSIN     /CHECKING SIGN
  1273.        JMP MAXOUT
  1274.        MEMA MAXNEG
  1275.        JMP MNOUT
  1276. BINST, BINBUF          /ST OF BUFFER FOR BINARY CONVERSION
  1277. BINEND,BINBUF+6        /POINTER TO END
  1278. BINBUF,BLOCK 7
  1279. BINPT, 0               /POINTER
  1280. BINCT, 0               /COUNTER
  1281. BINT,  0               /OCTAL BESULT
  1282. BINSIN,0               /1=NEGATIVE NUMBER
  1283. MAXPOS,1777777         /MAX NO. FOR OVERFLOWS
  1284. MAXNEG,2000000
  1285. DESRT, DELST           /DECIMAL EQUIVALENTS LIST
  1286. DEPNT, 0               /DE POINTER
  1287. DELST, 12              /10
  1288.        144             /100
  1289.        1750            /1000
  1290.        23420           /10000
  1291.        303240          /100000
  1292. /MOVE 5 CHARS FROM PIP-BUFFER TO PENTUM BUFFER
  1293. /IF <5 AVAILABLE, GET NEXT PACKET, RESET POINTER
  1294. /PROCESS CONTROL-PREFIXES, BUT IGNORE ANY LFS
  1295. /WHEN ENDFLG=1, ADD DOLLAR, SET DOLFLG, AND FILL REST OF PENTUM WITH FFS
  1296. /IF DOLFLG ALREADY SET, JUST FF-FILL THE WHOLE PENTUM
  1297. PNTMOV,0
  1298.        JMS PNTSET      /CLEAR PENTUM BUFFER, SET POINTER AND COUNTER
  1299.        MEMZ DOLFLG     /DOLLAR ALREADY SET?
  1300.        JMP PNTFF       /YES, JUST FF-FILL
  1301. PNTLUP,MEMZ ENDFLG     /END OF DATA?
  1302.        JMP PNTDOL      /YES, SET DOLLAR AND FFS
  1303.        MEMA @ RIPKPT   /GET A CHAR
  1304.        A-MZ @ VRQCTL   /IS IT THE CTRL PREFIX?
  1305.        JMP NONCTL      /NO
  1306.        JMS PIPBMP      /YES, GET NEXT CHAR
  1307.        MEMA @ RIPKPT
  1308.        A-MZ @ VRQCTL   /ANOTHER PREFIX?
  1309.        ZERZ
  1310.        JMP NONCTL      /YES, TREAT AS NORMAL
  1311.        A-MZ ("J        /IS IT AN LF?
  1312.        JMP CLCHA       /NO, TREAT AS CTRL/CHA
  1313.        JMS PIPBMP      /YES, IGNORE IT
  1314.        JMP PNTLUP
  1315. CLCHA, A-MA (100       /REMOVE CTRL BIAS
  1316.        A-MZ (215       /IS IT A CR?
  1317.        JMP NONCTL      /NO
  1318.        MEMZ NEFLG      /YES, IS NEFLG SET?
  1319.        ZERZ
  1320.        JMP NONCTL      /NO, JUST CARRY ON
  1321.        ACCM @ PENTPT   /YES, DEPOSIT THE CR
  1322.        MPOM PENTPT     /BUMP POINTERS
  1323.        JMS PIPBMP
  1324.        ONEM LCRFLG     /SET THE LAST-CR FLAG
  1325.        JMP FFLOOP      /AND START FF-FILLING IF POSS
  1326. NONCTL,ACCM @ PENTPT   /DEPOSIT CHAR IN PENTUM
  1327.        MPOM PENTPT     /BUMP POINTERS
  1328.        JMS PIPBMP
  1329.        MMOMZ PENTCT    /GOT FIVE YET?
  1330.        JMP PNTLUP      /NO, BACK FOR NEXT
  1331.        JMP @ PNTMOV    /YES, ALL DONE, JUMP OUT
  1332. PNTDOL,MEMA (244       /DEPOSIT DOLLAR TO CLOSE
  1333.        ACCM @ PENTPT
  1334.        ONEM DOLFLG     /SET DOLLAR FLAG
  1335.        JMP FFLOOP
  1336. PNTFF, MEMA (214       /DEPOSIT FFS TO FINISH RECORD
  1337.        ACCM @ PENTPT
  1338.        MPOM PENTPT
  1339.        ONEM SBFLG      /SET STORE-BUFFER FLAG
  1340. FFLOOP,MMOMZ PENTCT    /GOT FIVE YET?
  1341.        JMP PNTFF       /NO, GET ANOTHER FF
  1342.        JMP @ PNTMOV    /YES, BUFFER FINISHED
  1343. /BUMP POINTER, DECREMENT COUNTER, FOR PIP-BUFFER
  1344. /ENTER WITH LAST CHAR IN ACC
  1345. /IF DATA PACKET FINISHED, LOAD NEXT ONE
  1346. /IF NEXT IS A Z-PACKET, DATGET WILL SET ENDFLG
  1347. PIPBMP,0
  1348.        MPOM RIPKPT     /BUMP PIP POINTER
  1349.        MMOMZ RIPKCT    /END OF PACKET?
  1350.        JMP @ PIPBMP    /NO, EXIT
  1351.        JMS @ VACKPK    /YES, SEND AN ACK
  1352.        JMS DATGET      /AND GET NEXT ONE
  1353.        JMS INRPIP      /RESET POINTER, COUNTER
  1354.        JMP @ PIPBMP
  1355. /CLEAR PENTUM BUFFER AND SET PENTUM POINTERS
  1356. PNTSET,0
  1357.        MEMA PENTST
  1358.        ACCM PENTPT
  1359.        MEMA (5
  1360.        ACCM PENTCT
  1361. PSLUP, ZERM @ PENTPT
  1362.        MPOM PENTPT
  1363.        MMOMZ PENTCT
  1364.        JMP PSLUP
  1365.        MEMA PENTST
  1366.        ACCM PENTPT
  1367.        MEMA (5
  1368.        ACCM PENTCT
  1369.        JMP @ PNTSET
  1370. /CREATE 2 WORDS OF PACASC FROM 5 ASCII CHARACTERS IN PENTUM BUFFER
  1371. /DEPOSIT THEM IN DISK BUFFER WITH DBPNT POINTER
  1372. PAKDWN,0
  1373.        MEMA PENTST
  1374.        ACCM PENTPT
  1375.        MEMA @ PENTPT   /CHAR-1
  1376.        MPOM PENTPT
  1377.        RLSH 10
  1378.        ACCM @ DBPNT
  1379.        MEMA @ PENTPT   /CHAR-2
  1380.        MPOM PENTPT
  1381.        LASH 4
  1382.        A+MM @ DBPNT
  1383.        MEMA @ PENTPT   /CHAR-3
  1384.        MPOM PENTPT
  1385.        ACCM PAKHOL
  1386.        RISH 4
  1387.        ANDA (17
  1388.        A+MM @ DBPNT
  1389.        MPOM DBPNT      /START ON SECOND WORD
  1390.        MPOM @ VARWDS
  1391.        MMOM DBCNT
  1392.        MEMA PAKHOL
  1393.        ANDA (17
  1394.        RLSH 4
  1395.        ACCM @ DBPNT
  1396.        MEMA @ PENTPT   /CHAR-4
  1397.        MPOM PENTPT
  1398.        LASH 10
  1399.        A+MM @ DBPNT
  1400.        MEMA @ PENTPT   /CHAR-5
  1401.        MPOM PENTPT
  1402.        A+MM @ DBPNT
  1403.        MPOM DBPNT
  1404.        MPOM @ VARWDS
  1405.        MMOM DBCNT
  1406.        JMP @ PAKDWN
  1407. PAKHOL,0
  1408. PENTUM,BLOCK 5         /5-CHAR BUFFER FOR PAKDWN
  1409. PENTST,PENTUM
  1410. PENTPT,0
  1411. PENTCT,0
  1412. /ROUTINE TO STRIP ASCII BIAS FROM CHAR IN ACC AND TEST IT
  1413. /IF NON-NUMERICAL, FIRST RA
  1414. /NORMALLY, 2ND RA WITH RESULT IN ACC
  1415. UNASCI,0
  1416.        A-MA (260       /STRIP BIAS
  1417.        ACCM UNANUM     /HOLD RESULT
  1418.        EXCT AC19
  1419.        JMP @ UNASCI    /NON-NUMERIC
  1420.        A-MA (12
  1421.        SKIP AC19
  1422.        JMP @ UNASCI    /NON-NUMERIC
  1423.        MPOM UNASCI     /OK, GOOD DIGIT
  1424.        MEMA UNANUM
  1425.        JMP @ UNASCI
  1426. UNANUM,0
  1427. /LOOK OUT FOR INITIATION S-PACKET
  1428. /STORE RELEVANT DATA
  1429. RECINI,0
  1430.        MEMA (240       /INITIALISE SEQ.NO.
  1431.        ACCM @ VSEQNO
  1432.        JMS @ VINPUT    /GET A PACKET
  1433.        A-MZ ("S        /IS IT S-TYPE?
  1434.        JMP BADRIP      /NO
  1435.        JMS @ VSIDCO    /YES, COLLECT THE DATA
  1436.        JMP @ RECINI
  1437. BADRIP,MEMA ("S        /ABORT WITH AN S
  1438.        JMS @ VABORT
  1439. /LOOK FOR AN F-TYPE PACKET WITH THE FILENAME
  1440. /CONVERT IT TO 6-BIT AND STORE
  1441. NAMGET,0
  1442.        JMS @ VINPUT    /GET A PACKET
  1443.        A-MZ ("F        /IS IT F-TYPE?
  1444.        JMP BADNG       /NO
  1445.        JMS MAKFN       /YES, CONVERT FILENAME
  1446.        JMP @ NAMGET
  1447. BADNG, MEMA ("F        /ABORT WITH AN F
  1448.        JMS @ VABORT
  1449. /SEE IF THERE ARE MORE FILES TO COME
  1450. /IF AN F-PACKET ARRIVES, SCOOP UP FILENAME AND TAKE 1ST RA
  1451. /IF A B-PACKET ARRIVES, TAKE 2ND RA
  1452. MORFIN,0
  1453.        JMS @ VINPUT    /GET A PACKET
  1454.        A-MZ ("B        /IS IT A BYE?
  1455.        ZERZ
  1456.        JMP BYESYM      /YES
  1457.        A-MZ ("F        /IS IT A FILEHEADER PACKET?
  1458.        ZERZ
  1459.        JMP NEXFIL      /YES
  1460.        MEMA ("B        /ABORT WITH A B
  1461.        JMS @ VABORT
  1462. BYESYM,MPOM MORFIN     /END OF SESSION, 2ND RA
  1463.        JMP @ MORFIN
  1464. NEXFIL,JMS MAKFN      /COLLECT FILENAME
  1465.        JMP @ MORFIN    /AND 1ST RA
  1466. /LOOK FOR A DATA PACKET
  1467. DATGET,0
  1468.        JMS @ VINPUT    /GET A PACKET
  1469.        A-MZ ("D        /IS IT D-TYPE?
  1470.        ZERZ
  1471.        JMP @ DATGET    /YES, EXIT
  1472.        A-MZ ("Z        /IS IT Z-TYPE?
  1473.        JMP BADDG       /NO
  1474.        ONEM ENDFLG     /YES, SET END-OF-FILE FLAG
  1475.        MEMA @ RILEN    /ANYTHING IN DATA FIELD?
  1476.        A-MZ (243
  1477.        ZERZ
  1478.        JMP @ DATGET    /NO, KEEP THE FILE
  1479.         MEMA @ RIDATS  /YES, IS IT A D-DISCARD?
  1480.        A-MZ ("D
  1481.         JMP @ DATGET   /NO, SO KEEP THE FILE
  1482.        JMP @ VGXZBA    /YES, A D, SO DISCARD IT
  1483. BADDG, MEMA ("D        /ABORT WITH A D
  1484.        JMS @ VABORT
  1485. /SEND ACK WITH INITIALISATION DATA
  1486. RINACK,0
  1487.        JMS @ VINISN    /SAME AS FOR S, BUT NOT SENT
  1488.        MEMA ("Y
  1489.        ACCM @ ROTYPE   /CHANGE TYPE TO Y
  1490.        JMS @ VCOMPK    /COMPLETE THE PACKET
  1491.        ZERM @ VRETFL
  1492.        JMS @ VPUTPK    /SEND IT
  1493.        JMS @ VBMPSE    /BUMP SEQ.NO.
  1494.        JMP @ RINACK
  1495. /PICK UP FILENAME FROM FILE-HEADER PACKET
  1496. /CONVERT TO 6-BIT, DEPOSIT IN FILNAM, FILNAM+1
  1497. /IGNORE CHARS AFTER 6TH
  1498. MAKFN, 0
  1499.        ZERM EXTNUM     /CLEAR EXTENSION
  1500.        ZERM @ VASFLA   /AND THE .A FLAG
  1501.        MEMA RIDATS     /SET PACKET POINTER
  1502.        ACCM RIPKPT
  1503.        MEMA @ RILEN    /AND NAME CHAR COUNTER
  1504.        A-MA (243
  1505.        ACCM RIPKCT
  1506.        EXCT AC19 ZAC
  1507.        JMP @ VNULNA
  1508.        JMS FWORD       /FORM FIRST WORD
  1509.        ACCM @ VFILNA   /DEPOSIT IT
  1510.        JMS FWORD       /FORM SECOND WORD
  1511.        ACCM @ VFILN1   /DEPOSIT IT
  1512.        JMS EXTLUK      /CHECK FOR LATE EXTENSION
  1513.        MEMA @ VFILN1   /SET EXTENSION, IF ANY
  1514.        LLSH 2
  1515.        A+MA EXTNUM
  1516.        RLSH 2
  1517.        ACCM @ VFILN1
  1518.        JMP @ MAKFN
  1519. /FORM FILENAME WORD FROM 3 CHARS STARTING AT RIPKPT
  1520. /RETURN ZERO IF NAME ALREADY COMPLETED
  1521. FWORD, 0
  1522.        ZERM FWHOLD
  1523.        MEMA RIPKCT
  1524.        EXCT AC19 ZAC
  1525.        JMP FWNULL
  1526.        JMS PIKCHA
  1527.        JMS CONV86
  1528.        LASH 14
  1529.        ACCM FWHOLD
  1530.        JMS FWBMP
  1531.        JMS PIKCHA
  1532.        JMS CONV86
  1533.        LASH 6
  1534.        A+MM FWHOLD
  1535.        JMS FWBMP
  1536.        JMS PIKCHA
  1537.        JMS CONV86
  1538.        A+MM FWHOLD
  1539.        JMS FWBMP
  1540.        MEMA FWHOLD
  1541.        JMP @ FWORD
  1542. FWNULL,ZERA
  1543.        JMP @ FWORD
  1544. FWHOLD,0
  1545. /PICK UP A FILENAME CHARACTER FROM THE FILEHEADER PACKET
  1546. /IF A "." IS FOUND, BUMP POINTER AND EXAMINE NEXT CHARACTER
  1547. /IF IT IS AN A, B, OR C, SET EXTNUM AND EXIT FWORD WITH RIPKCT=0
  1548. PIKCHA,0
  1549.        MEMA @ RIPKPT   /COLLECT CHAR
  1550.        A-MZ (".        /IS IT A "."?
  1551.        JMP @ PIKCHA    /NO, EXIT
  1552.        JMS FWBMP       /YES, BUMP POINTER
  1553.        JMS EXTCHK      /SET EXTENSION IF A, B, OR C
  1554.        MEMZ EXTNUM     /WAS IT?
  1555.        ZERZ
  1556.        JMP @ PIKCHA    /NO, EXIT WITH CHAR
  1557.        MEMA FWHOLD     /YES, EXIT FWORD WITH FWHOLD
  1558.        JMP @ FWORD
  1559. /CHECK WHETHER RIPKPT POINTS TO A VALID EXTENSION
  1560. /IF SO, SET EXTNUM=1,2,3 FOR A,B,C
  1561. /IF NOT, EXIT WITH CHAR IN ACC
  1562. /TO BE CALLED AFTER A "." HAS BEEN FOUND
  1563. EXTCHK,0
  1564.        MEMA @ RIPKPT   /COLLECT CHAR
  1565.        A-MZ ("A        /IS IT A VALID EXTENSION?
  1566.        ZERZ
  1567.        JMP AEXT
  1568.        A-MZ ("B
  1569.        ZERZ
  1570.        JMP BEXT
  1571.        A-MZ ("C
  1572.        ZERZ
  1573.        JMP CEXT
  1574.        A-MZ ("a
  1575.        ZERZ
  1576.        JMP AEXT
  1577.        A-MZ ("b
  1578.        ZERZ
  1579.        JMP BEXT
  1580.        A-MZ ("c
  1581.        JMP @ EXTCHK    /NO, EXIT WITH CHAR
  1582. CEXT,  MEMA (3         /YES, SET .C
  1583.        ACCM EXTNUM
  1584.        JMP EXCOUT
  1585. AEXT,  ONEM EXTNUM     /SET .A
  1586.        ONEM @ VASFLA
  1587.        JMP EXCOUT
  1588. BEXT,  MEMA (2
  1589.        ACCM EXTNUM
  1590. EXCOUT,ZERM RIPKPT     /DON'T LOOK ANY FURTHER
  1591.        JMP @ EXTCHK
  1592. EXTNUM,0               /0=NULL, 1=.A, 2=.B, 3=.C
  1593. /SEE IF THERE IS AN A, B, OR C EXTENSION BEYOND THE 6-CHAR LIMIT
  1594. /IF SO, RECORD IT AND EXIT
  1595. EXTLUK,0
  1596.        MEMA RIPKCT     /ANY CHARS LEFT?
  1597.        EXCT AC19 ZAC
  1598.        JMP @ EXTLUK    /NO, JUMP OUT
  1599. EXTLUP,MEMA @ RIPKPT   /YES, COLLECT ONE
  1600.        A-MZ (".        /IS IT A "."?
  1601.        ZERZ
  1602.        JMP CHACHK      /YES
  1603.        MPOM RIPKPT     /NO BUMP POINTER
  1604.        MMOMZ RIPKCT    /ALL DONE?
  1605.        JMP EXTLUP      /NO, BACK FOR NEXT
  1606.        JMP @ EXTLUK    /YES, EXIT
  1607. CHACHK,MPOM RIPKPT     /BUMP POINTER
  1608.        MMOMZ RIPKCT    /ANY MORE CHARS?
  1609.        ZERZ
  1610.        JMP @ EXTLUK    /NO, EXIT
  1611.        JMS EXTCHK      /YES, SEEK EXTENSION
  1612.        JMP EXTLUP      /ANS SEE IF THERE ARE ANY MORE
  1613. /BUMP PACKET POINTER, DECREMENT COUNTER
  1614. /JUMP OUT OF FWORD WHEN DONE
  1615. FWBMP, 0
  1616.        MPOM RIPKPT
  1617.        MMOMZ RIPKCT
  1618.        JMP @ FWBMP
  1619.        MEMA FWHOLD
  1620.        JMP @ FWORD
  1621. /CONVERT 8-BIT ASCII TO 6-BIT ASCII
  1622. /INPUT AND OUTPUT CHARS BOTH IN ACC
  1623. /CONVERT ANY LOWER-CASE TO UPPER-CASE
  1624. /CONVERT ANY NON-TEXTUAL, NON-NUMERIC, CHARS TO ZZZ...
  1625. CONV86,0
  1626.        ACCM HOLD8
  1627.        A-MA (260       /TEXT OR NUMERICAL?
  1628.        EXCT AC19
  1629.        JMP CONVZ       /NEITHER, SO CONVERT TO Z
  1630.        MEMA HOLD8      /COULD BE
  1631.        A-MA (271
  1632.        EXCT AC19 ZAC
  1633.        JMP NUMUC       /YES, NUMERICAL
  1634.        MEMA HOLD8      /IS IT TEXTUAL?
  1635.        A-MA (301
  1636.        EXCT AC19
  1637.        JMP CONVZ       /NO, ITS PUNCTUAL
  1638.        MEMA HOLD8
  1639.        A-MA (332
  1640.        EXCT AC19 ZAC
  1641.        JMP NUMUC       /YES, UPPER-CASE
  1642.        MEMA HOLD8      /IS IT LOWER-CASE?
  1643.        A-MA (341
  1644.        EXCT AC19
  1645.        JMP CONVZ       /NO, ITS PUNCTUAL
  1646.        MEMA HOLD8
  1647.        A-MA (372
  1648.        EXCT AC19 ZAC
  1649.        JMP LCTXT       /YES, IT'S LOWER-CASE
  1650. CONVZ, MEMA ("Z-240    /CONVERT TO Z
  1651.        JMP @ CONV86
  1652. NUMUC, MEMA HOLD8      /CONVERT TO NUMERICAL UR UPPER-CASE
  1653.        A-MA (240
  1654.        JMP @ CONV86
  1655. LCTXT, MEMA HOLD8      /CONVERT LC TO 6-BIT UC
  1656.        A-MA (300
  1657.        JMP @ CONV86
  1658. HOLD8, 0               /TO HOLD 8-BIT CHAR
  1659. /SAY WHAT IS HAPPENING, PRINT INCOMING FILENAME
  1660. FILSAY,0
  1661.        MEMZ @ VDIAFL
  1662.        JMS @ VCRLF
  1663.        JMS @ VUNPCK    /PRINT "RECEIVING"
  1664.        RECNAM
  1665.        JMS @ VFPCK
  1666.        FILNAM
  1667.        MEMZ EXTNUM     /IS THERE AN EXTENSION?
  1668.        JMP PEXTN       /YES
  1669. FLSOUT,JMP @ FILSAY    /NO, EXIT
  1670. PEXTN, MEMA (".
  1671.        JMS @ VTYPE
  1672.        MEMA EXTNUM
  1673.        A+MA (300
  1674.        JMS @ VTYPE
  1675.        JMP FLSOUT
  1676. RECNAM,TEXT %RECEIVING %
  1677. /POINTERS TO PAGE 110000
  1678. VGXZBA,GXZBAK
  1679. VCRLF, CRLF
  1680. VUNPCK,UNPCK
  1681. VFPCK, FPCK
  1682. VTYPE, TYPE
  1683. VGDLOO,GDLOOP
  1684. VGDEND,GDEND
  1685. VCOMBA,COMBAK
  1686. /PAGE 112000
  1687. VDIAFL,DIAFLG
  1688. VRQCTL,RQCTL
  1689. VRETFL,RETFLG
  1690. VGETPK,GETPKT
  1691. VINPUT,INPUT
  1692. VABORT,ABORT
  1693. VCHKCH,CHKCHK
  1694. VSIDCO,SIDCON
  1695. VNAKPK,NAKPKT
  1696. VINISN,INISND
  1697. VCOMPK,COMPKT
  1698. VPUTPK,PUTPKT
  1699. VACKPK,ACKPKT
  1700. VBMPSE,BMPSEQ
  1701. VSEQNO,SEQNO
  1702. VDECSE,DECSEQ
  1703. /PAGE 114000
  1704. VSIZE, SIZE
  1705. VASFLA,ASFLAG
  1706. VJOKER,JOKER
  1707. VFILNA,FILNAM
  1708. VFILN1,FILNAM+1
  1709. /PAGE 116000
  1710. VARWDS,ARWDS
  1711. VWRDTO,WRDTOT
  1712. VRECSI,RECSIZ
  1713. VRITWR,RITWRD
  1714. VWRDST,WRDSTO
  1715. VWRITE,WRITE
  1716. VSAVE, SAVE
  1717. VNULNA,NULNAM
  1718. PAGSKP
  1719. *112000
  1720. /PAGE 112000 HOLDS THE MAIN WORK ROUTINES FOR DATA-TRANSMISSION
  1721. /USES X-PREFIX POINTERS
  1722. /
  1723. SEQNO, 0               /PACKET SEQUENCE NUMBER (ASCII CHAR)
  1724. /
  1725. /POINTERS, COUNTERS, CONSTANTS FOR PACKET CONSTRUCTION IN OUTPUT BUFFER
  1726. OPAKST=102000
  1727. OMARK, OPAKST          /FOR ^A MARK
  1728. OLEN,  OPAKST+1        /LENGTH
  1729. OSEQ,  OPAKST+2        /SEQUENCE NUMBER
  1730. OTYPE, OPAKST+3        /PACKET TYPE
  1731. ODATST,OPAKST+4        /START OF DATA
  1732. OPAKPT,0               /OUTPUT PACKET POINTER
  1733. OPAKCT,0               /OUTPUT PACKET COUNTER
  1734. /POINTERS, COUNTERS, CONSTANTS FOR PACKET DECONSTRUCTION
  1735. /IN INPUT BUFFER
  1736. IPAKST=103000
  1737. IMARK, IPAKST          /FOR ^A MARK
  1738. ILEN,  IPAKST+1        /LENGTH
  1739. ISEQ,  IPAKST+2        /SEQUENCE NUMBER
  1740. ITYPE, IPAKST+3        /PACKET TYPE
  1741. IDATST,IPAKST+4        /START OF DATA
  1742. IPAKPT,0               /INPUT PACKET COUNTER
  1743. IPAKCT,0               /INPUT PACKET COUNTER
  1744. /LOCAL PARAMETER VALUES, TO BE SENT
  1745. /DEFAULTS THAT MAY BE ADJUSTED AS NECESSARY, IN REAL (UNCODED) UNITS
  1746. LMAXL, 136             /MAX PKT LENGTH WE CAN RECEIVE (94)
  1747. LTIME, 5               /PERIOD (S) FOR US TO BE TIMED OUT
  1748. LNPAD, 0               /NO. OF PADS WE WANT
  1749. LPADC, 200             /PAD CHAR WE WANT (=NULL)
  1750. LEOL,  215             /PKT TERMINATOR WE WANT (CR)
  1751. LQCTL, "#              /CONTROL PREFIX WE SEND
  1752. /REMOTE PARAMETER VALUES
  1753. /TO BE SET AT INITIATION, BUT DEFAULTS FOR NOW
  1754. /IN REAL (UNCODED) UNITS
  1755. RMAXL, 136             /MAX PKT LENGTH WE CAN SEND
  1756. RTIME, 5               /TIME-OUT (S) WE ARE TO USE
  1757. RNPAD, 0               /NO. OF PADS TO SEND
  1758. RPADC, 200             /PAD CHAR TO SEND
  1759. REOL,  215             /PKT TERMINATOR WE ARE TO SEND
  1760. RQCTL, "#              /CONTROL-PREFIX TO EXPECT
  1761. /TRANSMIT INITIATION PACKET, GET ACK
  1762. INISND,0
  1763.        MEMA (240       /INITIALISE PKT SEQ NO.
  1764.        ACCM SEQNO
  1765.        JMS CLPOPB      /CLEAR POP-BUFFER
  1766.        MEMA ("S        /S-TYPE PACKET
  1767.        ACCM @ OTYPE
  1768.        MEMA ODATST     /SET DATA POINTER
  1769.        ACCM OPAKPT
  1770.        MEMA LMAXL      /SET OUR MAXL
  1771.        A+MA (200
  1772.        JMS POPPUT
  1773.        MEMA LTIME      /SET OUR TIME-OUT
  1774.        A+MA (200
  1775.        JMS POPPUT
  1776.        MEMA LNPAD      /SE OUR PAD NO.
  1777.        A+MA (200
  1778.        JMS POPPUT
  1779.        MEMA LPADC      /SET OUR PAD CHAR
  1780.        JMS POPPUT
  1781.        MEMA LEOL       /SET OUR TERMINATOR
  1782.        JMS POPPUT
  1783.        MEMA LQCTL      /SET OUR CONTROL-PREFIX
  1784.        A-MA (40
  1785.        JMS POPPUT
  1786.        MPOM OPAKPT     /SPACE FOR CHECKSUM
  1787.        MEMA LEOL       /TERMIATOR
  1788.        ACCM @ OPAKPT
  1789.        JMS COMPKT      /COMPLETE THE PACKET
  1790.        ZERM RETFLG
  1791.        JMS PUTPKT      /YES, SEND THE PACKET
  1792.        JMS ACKGET      /AND GET AN ACK
  1793.        JMP @ INISND
  1794. /ADD CONTENTS OF ACC+40 AT OPAKPT, AND INCREMENT
  1795. POPPUT,0
  1796.        A+MA (40
  1797.        ACCM @ OPAKPT
  1798.        MPOM OPAKPT
  1799.        JMP @ POPPUT
  1800. /DECONSTRUCT/INTERPRET SEND-INITIATION ACK
  1801. SIDCON,0
  1802.        MEMA IDATST     /COLLECT PARAMETERS
  1803.        ACCM IPAKPT
  1804.        JMS NEXSID      /MAX PKT LENGTH TO SEND
  1805.        ACCM RMAXL
  1806.        JMS NEXSID      /TIMEOUT WE ARE TO USE
  1807.        ACCM RTIME
  1808.        JMS NEXSID      /NO. OF PADS TO SEND
  1809.        ACCM RNPAD
  1810.        JMS NEXSID      /PAD CHAR TO SEND
  1811.        A+MA (240
  1812.        ACCM RPADC
  1813.        JMS NEXSID      /PKT TERMINATOR TO SEND
  1814.        A+MA (200
  1815.        ACCM REOL
  1816.        JMS NEXSID      /CONTROL-PREFIX TO EXPECT
  1817.        A+MA (240
  1818.        ACCM RQCTL
  1819.        JMP @ SIDCON
  1820. /SUBROUTINE TO COLLECT SI DATA AND BUMP POINTER
  1821. NEXSID,0
  1822.        MEMA @ IPAKPT
  1823.        A-MA (240
  1824.        MPOM IPAKPT
  1825.        JMP @ NEXSID
  1826. /SEND PACKET WITH FILENAME, GET ACK
  1827. FILHED,0
  1828.        JMS CLPOPB      /CLEAR POP BUFFER
  1829.        MEMA ("F        /F-TYPE PACKET
  1830.        ACCM @ OTYPE
  1831.        MEMA ODATST     /SET DATA POINTER
  1832.        ACCM OPAKPT
  1833.        MEMA @ XFILN1   /INSERT FIRST 3 CHARS OF NAME
  1834.        JMS NAMPAK
  1835.        MEMA @ XFILN2   /INSERT SECOND THREE CHARS
  1836.        JMS NAMPAK
  1837.        MEMA @ XFILN2   /ANY EXTENSION?
  1838.        LLSH 2
  1839.        ANDA (3
  1840.        EXCT ZAC
  1841.        JMP NONEXT      /NO
  1842.        ACCM XTENSN     /YES, PRESERVE IT
  1843.        MEMA (".        /SEND THE "."
  1844.        ACCM @ OPAKPT
  1845.        MPOM OPAKPT
  1846.        MEMA XTENSN     /SEND THE A, B, OR C
  1847.        A+MA (300
  1848.        ACCM @ OPAKPT
  1849.        MPOM OPAKPT
  1850. NONEXT,MPOM OPAKPT     /SPACE FOR CHECKSUM
  1851.        MEMA REOL       /TERMINATOR
  1852.        ACCM @ OPAKPT
  1853.        JMS BMPSEQ      /BUMP SEQ.NO.
  1854.        JMS COMPKT      /COMPLETE THE PKT
  1855.        JMS PUTPKT      /SEND THE PACKET
  1856.        ZERM FDPFLG     /CLEAR FIRST-DATA-PKT FLAG
  1857.        JMS ACKGET      /GET AN ACK
  1858.        JMP @ FILHED
  1859. XTENSN,0
  1860. /UNPACK 6-BIT FILENAME WORD IN ACC INTO POP-BUFFER
  1861. NAMPAK,0
  1862.        ACCM NHOLD
  1863.        RASH 14
  1864.        JMS LETPUT
  1865.        RASH 6
  1866.        JMS LETPUT
  1867.        JMS LETPUT
  1868.        JMP @ NAMPAK
  1869. NHOLD, 0
  1870. /CONVERT LOWEST 6 BITS OF ACC TO 8-BIT ASCII CHAR
  1871. /AND PLACE IT IN POP-BUFFER
  1872. LETPUT,0
  1873.        ANDA (77
  1874.        EXCT ZAC        /ASSUME NULL IMPLIES END
  1875.        JMP @ NAMPAK
  1876.        A-MZ (77        /AND 77 DITTO
  1877.        ZERZ
  1878.        JMP @ NAMPAK
  1879.        A+MA (240       /OTHERWISE, CONVERY
  1880.        ACCM @ OPAKPT   /DEPOSIT
  1881.        MPOM OPAKPT     /BUMP POINTER
  1882.        MEMA NHOLD      /RECOVER WORD
  1883.        JMP @ LETPUT    /AND EXIT
  1884. /SEND OFF THE WORDS LOADED AT 0 AS DATA PACKETS
  1885. /IF ASFLAG=-1, UNPACK AS PAIRS OF PACASC
  1886. /IF ASFLAG=0, TREAT AS INTEGER DATA
  1887. PKTOUT,0
  1888.        ZERM PKOPNT     /SET POINTER
  1889.        MEMA @ XREDWR   /SET COUNTER
  1890.        ACCM PKOCNT
  1891.        MEMA (10        /INITIALISE COMRET
  1892.        ACCM NUMCNT
  1893. DPLUP, JMS DATPKT      /SEND DATA PACKET
  1894.        MEMZ @ XCXFLG   /-KB INTERRUPTION?
  1895.        JMP CXOUT       /YES
  1896.        MEMZ @ XCZFLG
  1897.        JMP CZOUT       /YES
  1898.        JMS ACHAR       /EXTERNAL ABORTION?
  1899.        A-MZ ("X
  1900.        ZERZ
  1901.        JMP CXOUT       /YES
  1902.        A-MZ ("Z
  1903.        ZERZ
  1904.        JMP CZOUT       /YES
  1905.        MEMA PKOCNT     /ANY MORE WORDS?
  1906.        SKIP AC19 ZAC
  1907.        JMP DPLUP       /YES, SEND NEXT PACKET
  1908.        JMP @ PKTOUT    /NO, ALL SENT
  1909. CXOUT, JMS DISCRD      /DISCARD CURRENT FILE
  1910.        ZERM @ XCXFLG   /CLEAR FLAG
  1911.        JMS ACKGET      /GET ACK
  1912.        JMP @ XPXBAK    /SEE IF ANY MORE FILES TO GO
  1913. CZOUT, JMS DISCRD      /DISCARD CURRENT FILE
  1914.        ZERM @ XCZFLG   /CLEAR FLAG
  1915.        JMS ACKGET      /SEEK ACK
  1916.        JMP @ XMOQER    /ASK FOR NEW FILENAME
  1917. PKOPNT,0               /DATA PICKUP POINTER
  1918. PKOCNT,0               /DATA PICKUP COUNTER
  1919. /MAKE UP AND TRANSMIT A DATA PACKET FROM PKOPNT POINTER
  1920. /TREATING AS PACASC IF ASFLAG=-1, AND INTEGER DATA IF =0
  1921. /INCREMENT PKOPNT, DECREMENT PKOCNT AS NEEDED
  1922. /DO NOT EXCEED RMAXL IN TOTAL LENGTH, AND DO NOT OVERRUN PKOCNT=0
  1923. DATPKT,0
  1924.        JMS CLPOPB      /CLEAR POP BUFFER
  1925.        MEMA ("D
  1926.        ACCM @ OTYPE
  1927.        MEMA ODATST     /SET POP-BUFFER POINTER
  1928.        ACCM OPAKPT
  1929.        MEMA RMAXL      /SET PKT LENGTH
  1930.        A-MA (20        /TO ALLOW FOR COMPLETIONS
  1931.        ACCM OPAKCT
  1932.        MMOZ FDPFLG     /FIRST DATA PACKET?
  1933.        JMS FDATA       /YES, SEND FILE DIR DATA AT FRONT
  1934.        ONEM FDPFLG
  1935. DMLUP, JMS WRDPUT      /MOVE A WORD (OR 2 IF ASFLAG=-1)
  1936.        MEMA OPAKCT     /AT END OF PKT?
  1937.        EXCT AC19 ZAC
  1938.        JMP DMFIN       /YES, FINISH OFF
  1939.        MEMA PKOCNT     /NO; AT END OF DATA?
  1940.        EXCT AC19 ZAC
  1941.        JMP DMFIN       /YES, FINISH OFF
  1942.        JMP DMLUP       /NO, MOVE ANOTHER WORD (OR 2)
  1943. DMFIN, MPOM OPAKPT     /SPACE FOR CHECKSUM
  1944.        MEMA REOL       /ADD TERMINATOR
  1945.        ACCM @ OPAKPT
  1946.        JMS BMPSEQ      /BUMP SEQ.NO.
  1947.        JMS COMPKT      /COMPLETE THE PKT
  1948.        JMS PUTPKT      /SEND THE PACKET
  1949.        JMS ACKGET      /GET AN ACK
  1950.        JMP @ DATPKT
  1951. FDPFLG,0               /0=FIRST DATA PACKET
  1952. /IF ASFLAG=0, MOVE ONE INTEGER INTO POP-BUFFER AS A DECIMAL NUMBER
  1953. /FOLLOWED BY A COMMA, WITH A CRLF AFTER EVERY 8TH ENTRY
  1954. /BUT IF ASFLAG=-1, UNPACK TWO ADDRESSES AS FIVE ASCII CHARACTERS
  1955. WRDPUT,0
  1956.        MPOZ @ XASFLA   /ASCII OR INTEGER?
  1957.        JMP WPINTG      /INTEGER
  1958.        JMS DILATE      /SEND AS ASCII
  1959.        JMP @ WRDPUT
  1960. WPINTG,JMS DECOUT      /SEND AS NUMERICAL
  1961.        JMS COMRET
  1962.        JMP @ WRDPUT
  1963. /EXPAND NEXT PAIR OF WORDS IN DISK BUFFER
  1964. /PLACE THE 5 CHARS IN PACKET OP-BUFFER
  1965. DILATE,0
  1966.        MEMA @ PKOPNT
  1967.        LLSH 10
  1968.        ANDA (377
  1969.        JMS ACCPOP      /CHAR-1
  1970.        MEMA @ PKOPNT
  1971.        RLSH 4
  1972.        ANDA (377
  1973.        JMS ACCPOP      /CHAR-2
  1974.        MEMA @ PKOPNT
  1975.        ANDA (17
  1976.        LASH 4
  1977.        ACCM DILHOL
  1978.        MPOM PKOPNT     /LOOK AT SECOND WORD
  1979.        MMOM PKOCNT
  1980.        MPOM @ XARWDS
  1981.        MEMA @ PKOPNT
  1982.        LLSH 4
  1983.        ANDA (17
  1984.        A+MA DILHOL
  1985.        JMS ACCPOP      /CHAR3
  1986.        MEMA @ PKOPNT
  1987.        RLSH 10
  1988.        ANDA (377
  1989.        JMS ACCPOP      /CHAR-4
  1990.        MEMA @ PKOPNT
  1991.        ANDA (377
  1992.        JMS ACCPOP      /CHAR-5
  1993.        MPOM PKOPNT
  1994.        MMOM PKOCNT
  1995.        MPOM @ XARWDS
  1996.        JMP @ DILATE
  1997. DILHOL,0
  1998. /MOVE ACC INTO POP-BUFFER, BUMP POINTER, DECREMENT COUNTER
  1999. /ENCODING IT IF NECESSARY, BUT IGNORING ZEROES AND FORMFEEDS
  2000. ACCPOP,0
  2001.        ACCM APHOLD
  2002.        EXCT ZAC        /IGNORE ZERO
  2003.        JMP @ ACCPOP
  2004.        A-MZ (214       /FF IMPLIES END OF RECORD
  2005.        ZERZ
  2006.        JMP ENDREC
  2007.        A-MA (240       /ENCODING NEEDED?
  2008.        EXCT AC19
  2009.        JMP CODCHA      /YES
  2010.        MEMA APHOLD     /NO, JUST TRANSFER
  2011.        A-MZ LQCTL      /UNLESS IT IS THE CTRL/PREFIX?
  2012.        ZERZ
  2013.        JMP PREPRE      /YES IT IS
  2014.        ACCM @ OPAKPT
  2015. APOUT, MPOM OPAKPT
  2016.        MMOM OPAKCT
  2017.        JMP @ ACCPOP
  2018. PREPRE,ACCM @ OPAKPT   /PREFIX THE PREFIX
  2019.        MPOM OPAKPT
  2020.        MMOM OPAKCT
  2021.        ACCM @ OPAKPT
  2022.        JMP APOUT
  2023. CODCHA,MEMA LQCTL      /SEND CONTROL-PREFIX
  2024.        ACCM @ OPAKPT
  2025.        MPOM OPAKPT
  2026.        MMOM OPAKCT
  2027.        MEMA APHOLD     /SEND UN-CTRL-ED CHAR
  2028.        A+MA (100
  2029.        ACCM @ OPAKPT
  2030.        A-MZ ("M        /WAS IT A CR?
  2031.        JMP APOUT       /NO
  2032.        MPOM OPAKPT     /YES, SEND AN LF+100
  2033.        MMOM OPAKCT
  2034.        MEMA LQCTL      /WITH PREFIX
  2035.        ACCM @ OPAKPT
  2036.        MPOM OPAKPT
  2037.        MMOM OPAKCT
  2038.        MEMA ("J
  2039.        ACCM @ OPAKPT
  2040.        MMOM OPAKCT
  2041.        JMP APOUT
  2042. ENDREC,ZERM PKOCNT     /END OF RECORD
  2043.        JMP @ ACCPOP
  2044. APHOLD,0
  2045. /TRANSFER CHAR TO PACKET IP-BUFFER
  2046. /BUT DO NOT OVERRUN LIMITS
  2047. /IF ANOTHER ^A ARRIVES, ASSUME THAT IT STARTS A NEW PACKET
  2048. /AND RESET BUFFER POINTER AND COUNTER
  2049. AIPBUF,0
  2050.        ACCM APBHOL
  2051.        MMOMA IPAKCT
  2052.        EXCT AC19 ZAC
  2053.        JMP @ AIPBUF
  2054.        MEMA APBHOL
  2055.        A-MA ("A-100
  2056.        EXCT ZAC
  2057.        JMS SETIPK
  2058.        MEMA APBHOL
  2059.        ACCM @ IPAKPT
  2060.        MPOM IPAKPT
  2061.        JMP @ AIPBUF
  2062. APBHOL,0
  2063. /SEND A Z-PACKET TO CLOSE THE FILE
  2064. ENDPKT,0
  2065.        JMS CLPOPB      /CLEAR POP-BUFFER
  2066.        MEMA ("Z        /Z-TYPE PACKET
  2067.        ACCM @ OTYPE
  2068.        MEMA ODATST
  2069.        APOM OPAKPT     /SPACE FOR CHECKSUM
  2070.        MEMA REOL       /TERMINATOR
  2071.        ACCM @ OPAKPT
  2072.        JMS BMPSEQ      /BUMP SEQ.NO.
  2073.        JMS COMPKT      /COMPLETE THE PACKET
  2074.        JMS PUTPKT      /SEND THE PACKET
  2075.        JMS ACKGET      /GET AN ACK
  2076.        JMP @ ENDPKT
  2077. /SEND Z-PACKET WITH D IN THE DATA FIELD, TO ABORT CURRENT TRANSMISSION
  2078. DISCRD,0
  2079.        JMS CLPOPB      /CLEAR POP-BUFFER
  2080.        MEMA ("Z        /Z-TYPE PACKET
  2081.        ACCM @ OTYPE
  2082.        MEMA ("D        /D FOR DISCARD
  2083.        ACCM @ ODATST
  2084.        MEMA ODATST
  2085.        A+MA (2         /SPACE FOR CHECKSUM
  2086.        ACCM OPAKPT
  2087.        MEMA REOL       /TERMINATOR
  2088.        ACCM @ OPAKPT
  2089.        JMS BMPSEQ      /BUMP SEQ.NO.
  2090.        JMS COMPKT      /COMPLETE THE PACKET
  2091.        JMS PUTPKT      /SEND THE PACKET
  2092.        JMP @ DISCRD
  2093. /SEND B-PACKET TO CLOSE TRANSMISSION
  2094. CLOSIT,0
  2095.        JMS PRGSET      /INITIALISE TYPROG
  2096.        JMS CLPOPB      /CLEAR POP-BUFFER
  2097.        MEMA ("B        /B-TYPE PACKET
  2098.        ACCM @ OTYPE
  2099.        MEMA ODATST
  2100.        APOM OPAKPT     /SPACE FOR CHECKSUM
  2101.        MEMA REOL       /TERMINATOR
  2102.        ACCM @ OPAKPT
  2103.        JMS BMPSEQ      /BUMP SEQ.NO.
  2104.        JMS COMPKT      /COMPLETE THE PACKET
  2105.        JMS PUTPKT      /SEND THE PACKET
  2106.        JMS ACKGET      /GET AN ACK
  2107.        JMP @ CLOSIT
  2108. /COMPLETE THE PACKET IN THE POP-BUFFER
  2109. COMPKT,0
  2110.        JMS MRKSEQ      /SET MARK AND SEQ. NO.
  2111.        JMS LENCAL      /CALCULATE AND SET LENGTH
  2112.        JMS CHKMAK      /CALCULATE AND SET CHECKSUM
  2113.        ZERM RETFLG
  2114.        JMP @ COMPKT
  2115. /SET MARK AND SEQUENCE NUMBER FOR OUTGOING PACKET
  2116. MRKSEQ,0
  2117.        MEMA ("A-100    /MARK
  2118.        ACCM @ OMARK
  2119.        MEMA SEQNO      /SEQ. NO.
  2120.        ACCM @ OSEQ
  2121.        JMP @ MRKSEQ
  2122. /COMPUTE LENGTH OF PACKET AT OMARK, DEPOSIT RESULT AT OLEN
  2123. LENCAL,0
  2124.        MEMA OMARK
  2125.        ACCM LENPNT
  2126.        ZERM LENCNT
  2127. LENLUP,MEMA @ LENPNT
  2128.        MPOM LENPNT
  2129.        MPOM LENCNT
  2130.        A-MZ REOL
  2131.        JMP LENLUP
  2132.        MEMA LENCNT
  2133.        A+MA (240-3
  2134.        ACCM @ OLEN
  2135.        JMP @ LENCAL
  2136. LENPNT,0
  2137. LENCNT,0
  2138. /PREPARE CHECKSUM FOR OUTGOING PACKET
  2139. /MUST BE *LAST* ACTION PRIOR TO TRANSMISSION
  2140. CHKMAK,0
  2141.        MEMA OLEN       /SET POINTER, COUNTER
  2142.        ACCM OPAKPT
  2143.        MEMA @ OLEN
  2144.        A-MA (240
  2145.        ACCM OPAKCT
  2146.        ZERA
  2147. OCHLUP,A+MA @ OPAKPT   /SUMMATION LOOP
  2148.        A-MA (200       /SUBTRACT THE NIC BIAS
  2149.        MPOM OPAKPT
  2150.        MMOMZ OPAKCT
  2151.        JMP OCHLUP
  2152.        ACCM ROCSUM
  2153.        JMS CMAK        /CREATE THE CHECKSUM
  2154.        ACCM OCSUM
  2155.        ACCM @ OPAKPT   /DEPOSIT IT
  2156.        JMP @ CHKMAK
  2157. ROCSUM,0               /RAW OP CHECKSUM
  2158. OCSUM, 0               /KERMIT-ED VERSION
  2159. /LOOK FOR AN ACK
  2160. ACKGET,0
  2161.        JMS INPUT       /GET A PACKET
  2162.        A-MZ ("Y        /IS IT AN ACK?
  2163.        JMP BADAG       /NO
  2164.        JMP @ ACKGET    /YES, EXIT
  2165. BADAG, MEMA ("Y        /ABORT WITH A Y
  2166.        JMS ABORT
  2167. /COLLECT DATA CHAR, IF ANY, FROM ACK
  2168. /EMERGE WITH RESULT IN ACC, OR ZAC IF NULL DATA FIELD
  2169. ACHAR, 0
  2170.        MEMA @ ILEN     /IS THERE ANY DATA?
  2171.        A-MZ (243
  2172.        JMP GOTCH       /YES
  2173.        ZERA            /NO, SET ZAC
  2174.        JMP @ ACHAR
  2175. GOTCH, MEMA @ IDATST   /COLLECT DATA CHAR
  2176.        JMP @ ACHAR
  2177. /SEND ACK FOR CURRENT SEQUENCE NUMBER
  2178. ACKPKT,0
  2179.        JMS CLPOPB      /CLEAR POP-BUFFER
  2180.        MEMA ("Y        /Y-TYPE PACKET
  2181.        ACCM @ OTYPE
  2182.        MEMZ @ XCXFLG   /X-ABORTION?
  2183.        JMP CXABRT      /YES
  2184.        MEMZ @ XCZFLG   /Z-ABORTION?
  2185.        JMP CZABRT      /YES
  2186.        MEMA ODATST
  2187.        APOM OPAKPT
  2188.        MEMA REOL       /TERMINATOR
  2189.        ACCM @ OPAKPT
  2190.        JMS COMPKT      /COMPLETE THE PACKET
  2191.        ZERM RETFLG
  2192.        JMS PUTPKT      /SEND IT
  2193.        JMS BMPSEQ      /BUMP SEQ.NO.
  2194.        JMP @ ACKPKT
  2195. CXABRT,MEMA ("X        /ACK WITH AN X
  2196.        JMP DOXZ
  2197. CZABRT,MEMA ("Z        /ACK WITH A Z
  2198. DOXZ,  ACCM @ ODATST
  2199.        MEMA ODATST
  2200.        A+MA (2         /SPACE FOR CHECKSUM
  2201.        ACCM OPAKPT
  2202.        MEMA REOL       /TERMINATOR
  2203.        ACCM @ OPAKPT
  2204.        JMS COMPKT      /COMPLETE THE PACKET
  2205.        ZERM RETFLG
  2206.        JMS PUTPKT      /SEND IT
  2207.        JMS BMPSEQ      /BUMP SEQ.NO.
  2208.        ZERM @ XCXFLG   /CLEAR FLAGS
  2209.        ZERM @ XCZFLG
  2210.        JMP @ ACKPKT
  2211. /SEND NAK FOR CURRENT SEQUENCE NUMBER
  2212. NAKPKT,0
  2213.        JMS CLPOPB      /CLEAR POP-BUFFER
  2214.        MEMA ("N        /N-TYPE PACKET
  2215.        ACCM @ OTYPE
  2216.        MEMA ODATST
  2217.        ACCM OPAKPT
  2218.        MEMA REOL       /TERMINATOR
  2219.        ACCM @ OPAKPT
  2220.        JMS COMPKT      /COMPLETE THE PACKET
  2221.        ZERM RETFLG
  2222.        JMS PUTPKT      /SEND IT
  2223.        JMP @ NAKPKT
  2224. /SEND A PACKET
  2225. /IT MUST BE PRE-PREPARED AT OMARK ET SEQ
  2226. PUTPKT,0
  2227.        JMS SETOPK      /SET POINTER, COUNTER
  2228.        JMS PADPUT      /SEND PAD CHARS?
  2229. PPLUP, MEMA @ OPAKPT   /TRANSFER CHAR TO OP-BUFFER
  2230.        JMS @ XACOBU
  2231.        MPOM OPAKPT     /BUMP POINTER
  2232.        A-MZ REOL       /GOT TERMINATOR?
  2233.        ZERZ
  2234.        JMP PPFIN       /YES, ALL GONE
  2235.        MMOMZ OPAKCT    /NO, BUT CHECK COUNTER
  2236.        JMP PPLUP       /AND BACK FOR NEXT
  2237. PPFIN, JMS @ XRSDUT    /EMPTY THE OP BUFFER
  2238.        JMS @ XARROW    /DISPLAYING PROGRESS ARROW
  2239.        MEMZ @ XOCHAC
  2240.        JMP PPFIN
  2241.        MEMA ("s        /PRINT "s" FOR PACKET SENT
  2242.        MEMZ RETFLG
  2243.        MEMA ("S        /PRINT "S" FOR RETRANSMITTED PACKET
  2244.        JMS TYPROG
  2245.        ONEM RETFLG
  2246.        JMP @ PUTPKT
  2247. RETFLG,0               /1=RETRANSMISSION
  2248. /SEND PAD CHARACTERS, AS AGREED
  2249. PADPUT,0
  2250.        MEMA RNPAD      /ANY TO SEND?
  2251.        EXCT AC19 ZAC
  2252.        JMP @ PADPUT    /NO, JUMP OUT
  2253.        ACCM PADCNT     /YES, SET COUNTER
  2254. PDPLUP,MEMA RPADC      /TRANSFER PADS TO OP-BUFFER
  2255.        JMS @ XACOBU
  2256.        MMOMZ PADCNT
  2257.        JMP PDPLUP
  2258.        JMP @ PADPUT
  2259. PADCNT,0
  2260. /UNIVERSAL PACKET INPUT ROUTINE
  2261. /IF ALL IS WELL, EXITS WITH TYPE IN ACC
  2262. /BUT ABORTS AFTER 10 TIMEOUTS AND RETURNS TO COMMAND BLOCK
  2263. /TYPES AN "r" IF ALL IS OK
  2264. /OTHER DIAGNOSTIC INDICATORS ARE TYPED BY SUBROUTINES
  2265. INPUT, 0
  2266.        MEMA (12        /SET RETRY COUNTER
  2267.        ACCM TINCNT
  2268. REINP, JMS GETPKT      /CATCH A PACKET
  2269.        EXCT ZAC        /TIMED OUT?
  2270.        JMP BADINP      /YES
  2271.        JMS CHKLEN      /CHECK LENGTH
  2272.        JMP BADINP      /WRONG
  2273.        JMS CHKCHK      /CHECK CHECKSUM
  2274.        JMP BADINP      /WRONG
  2275.        JMS SEQCHK      /CHECK SEQ.NO.
  2276.        JMP SCASE       /WRONG, BUT IS IT SPECIAL CASE?
  2277.        MEMA @ ITYPE    /CHECK TYPE
  2278.        A-MZ ("N        /IS IT A NAK?
  2279.        JMP GUDINP      /NO, A GOOD PACKET
  2280.        MEMA ("n        /YES, TYPE n
  2281.        JMS TYPROG
  2282.        JMP BADINP
  2283. SCASE, JMS SEQNAK      /CHECK THE SPECIAL CASE
  2284.        JMP BADINP      /IT ISN'T
  2285.        MEMA ("Y        /IT IS, SO TREAT AS AN ACK
  2286.        JMP @ INPUT
  2287. BADINP,MMOMZ TINCNT    /STILL RETRYING?
  2288.        JMP RESEND      /YES
  2289.        MEMA ("T        /NO, FED UP, ABORT SESSION
  2290.        JMS ABORT
  2291. RESEND,JMS PUTPKT      /RESEND LAST PACKET
  2292.        JMP REINP
  2293. GUDINP,MEMA ("r        /PRINT r TO INDICATE GOOD INPUT
  2294.        JMS TYPROG
  2295.        MEMA @ ITYPE    /EXIT WITH TYPE IN ACC
  2296.        JMP @ INPUT
  2297. TINCNT,0
  2298. /GET A PACKET FROM RS232-B CHANNEL, TRANSFER TO PACKET IP-BUFFER
  2299. /WATCH OUT FOR ^A, THEN COLLECT RESULT AT 103000
  2300. /IF NOTHING, TIME-OUT AFTER RTIME SECONDS WITH ACC=0
  2301. /NORMALLY, EXIT WITH ACC=1
  2302. GETPKT,0
  2303.        JMS CLPIPB      /CLEAR INPUT BUFFER
  2304.        MEMA RSANUM     /SET TIME-OUT COUNT
  2305.        ACCM GPCNT
  2306.        JMS SETIPK      /INITIALISE I-PKT VARIABLES
  2307.        ZERM @ XIGBFL   /PREPARE TO WATCH B-INPUT
  2308.        ZERM @ XRSBCH   /CLEAR CHAR BUFF
  2309. GPLUP1,JMS @ XRSDUT    /WATCH LOOP
  2310.        MEMA @ XRSBCH
  2311.        A-MZ ("A-100    /GOT A MARK YET?
  2312.        ZERZ
  2313.        JMP GOTPKT      /YES, COLLECT THE PACKET
  2314.        MMOMZ GPCNT     /TIME-OUT YET?
  2315.        JMP GPLUP1      /NO
  2316.        ONEM @ XIGBFL   /YES, STOP WATCHING B-INPUT
  2317.        MEMA ("t        /INDICATE TIMEOUT WITH A t
  2318.        JMS TYPROG
  2319.        ZERA            /AND EXIT WITH ZAC
  2320.        JMP @ GETPKT
  2321. GOTPKT,ONEM @ XIPKTF   /SET INCOMING PACKET FLAG
  2322.        MEMA ("A-100
  2323.        JMS AIPBUF
  2324. GPLUP2,JMS @ XRSDUT    /PACKET BUILDING LOOP
  2325.        MEMA @ XRSBCH
  2326.        A-MZ LEOL       /WATCH FOR TERMINATOR
  2327.        ZERZ
  2328.        JMP GPKFIN      /GOT IT
  2329.        JMS GPDLAY      /TARRY A MOMENT
  2330.        MMOMZ GPCNT
  2331.        JMP GPLUP2      /NOT TIMED-OUT YET
  2332.        ZERM @ XIPKTF   /TIMED OUT IN MID-PKT, CLEAR PKT FLG
  2333.        ONEM @ XIGBFL   /STOP WATCHING B-INPUT
  2334.        MEMA ("T        /INDICATE TIMEOUT WITH A T
  2335.        JMS TYPROG
  2336.        ZERA            /AND EXIT WITH ZAC
  2337.        JMP @ GETPKT
  2338. GPKFIN,ZERM @ XIPKTF   /PACKET IS COMPLETE
  2339.        ONEAM @ XIGBFL  /STOP WATCHING B-INPUT, EXIT AC0
  2340.        JMP @ GETPKT
  2341. RSANUM,200000          /DEFAULT TIME-OUT COUNT
  2342. GPCNT, 0
  2343. /VARIABLE DELAY
  2344. GPDLAY,0
  2345.        MEMA GPDNUM
  2346.        AMOAZ
  2347.        JMP #-1
  2348.        JMP @ GPDLAY
  2349. GPDNUM,1
  2350. /CHECK SEQUENCE NUMBER OF INPUT PACKET
  2351. /FIRST RA IF WRONG, SECOND RA IF OK
  2352. SEQCHK,0
  2353.        MEMA SEQNO
  2354.        A-MZ @ ISEQ
  2355.        JMP BADSEQ      /WRONG
  2356.        MPOM SEQCHK     /OK, 2ND RA
  2357.        JMP @ SEQCHK
  2358. BADSEQ,MEMA ("w        /PRINT "w" FOR WRONG SEQ.NO.
  2359.        JMS TYPROG
  2360.        JMP @ SEQCHK    /AND 1ST RA
  2361. /CHECK FOR SPECIAL CASE OF NAK TO *NEXT* PACKET
  2362. /FIRST RA IF NOT, SECOND RA IF IT IS THE SPECIAL CASE
  2363. SEQNAK,0
  2364.        MEMA @ ITYPE    /IS IT A NAK?
  2365.        A-MZ ("N
  2366.        JMP @ SEQNAK    /NO
  2367.        MEMA @ ISEQ     /IS (@ISEQ - SEQNO)=1 ?
  2368.        A-MA SEQNO
  2369.        AMOZ
  2370.        JMP ORDNAK      /NO, ORDINARY NAK
  2371.        MEMA ("N        /YES, THIS IS IT, PRINT "N"
  2372.        JMS TYPROG
  2373.        MPOM SEQNAK     /TAKE 2ND RA
  2374.        JMP @ SEQNAK
  2375. ORDNAK,MEMA ("n        /PRINT "n" FOR NAK
  2376.        JMS TYPROG
  2377.        JMP @ SEQNAK    /AND TAKE 1ST RA
  2378. /CHECK THAT INPUT PACKET LENGTH IS CORRECT
  2379. /FIRST RA IF WRONG, SECOND RA IF OK
  2380. CHKLEN,0
  2381.        JMS SETIPK
  2382. CKLOOP,MPOM IPAKPT     /CALCULATE LENGTH
  2383.        MEMA @ IPAKPT
  2384.        A-MZ REOL       /GOT TERMINATOR?
  2385.        JMP CKLOOP      /NO
  2386.        MEMA IPAKPT     /YES, DO THE COMPARISON
  2387.        A-MA ISEQ
  2388.        A+MA (240
  2389.        A-MZ @ ILEN
  2390.        JMP BADLEN      /DISAGREES
  2391.        MPOM CHKLEN     /OK, TAKE 2ND RA
  2392.        JMP @ CHKLEN
  2393. BADLEN,MEMA ("l        /PRINT "l" FOR WRONG LENGTH
  2394.        JMS TYPROG
  2395.        JMP @ CHKLEN    /TAKE 1ST RA
  2396. /UNIVERSAL ABORTION ROUTINE
  2397. /CODED AS A SUBROUTINE TO FACILITATE DEBUGGING
  2398. /IF A WRONG INPUT PACKET WAS FOUND, ENTER WITH CORRECT TYPE IN ACC
  2399. /IF TEN FAILURES, ENTER WITH T IN ACC
  2400. ABORT, 0
  2401.        ZERM @ XRTFLG   /ABORT THE SESSION
  2402.        ONEM @ XIGBFL  /STOP WATCHING B-INPUT
  2403.        ACCM HABORT
  2404.        JMS @ XCRLF
  2405.        JMS @ XCRLF
  2406.        JMS @ XUNPCK
  2407.        ABSING
  2408.        JMS @ XCRLF
  2409.        MEMA HABORT
  2410.        A-MZ ("T        /NO-VALID-PACKET?
  2411.        ZERZ
  2412.        JMP NVP         /YES
  2413.        JMS @ XUNPCK    /MUST BE WRONG TYPE OF PACKET
  2414.        RECP
  2415.        MEMA @ ITYPE    /SAY WHAT WE GOT
  2416.        JMS @ XTYPE
  2417.        JMS @ XUNPCK
  2418.        DASHP1
  2419.        MEMA HABORT     /SAY WHAT WE WANTED
  2420.        JMS @ XTYPE
  2421.        JMS @ XUNPCK
  2422.        DASHP2
  2423.        JMP ABOUT       /AND EXIT
  2424. NVP,   JMS @ XUNPCK    /ANNOUNCE 10 TIMEOUTS
  2425.        TENTS
  2426. ABOUT, JMS @ XCRLF
  2427.        JMP @ XCOMBA    /BACK TO COMMAND BLOCK
  2428. HABORT,0
  2429. ABSING,TEXT %ABORTING SESSION -%
  2430. RECP,  TEXT %RECEIVED %
  2431. DASHP1,TEXT %-PACKET WHEN EXPECTING %
  2432. DASHP2,TEXT %-PACKET%
  2433. TENTS, TEXT %TEN TIME-OUTS WITH NO VALID INPUT PACKET RECEIVED%
  2434. /BUMP PACKET SEQUENCE NUMBER
  2435. BMPSEQ,0
  2436.        MPOMA SEQNO
  2437.        A-MZ (340
  2438.        JMP @ BMPSEQ
  2439.        MEMA (240
  2440.        ACCM SEQNO
  2441.        JMP @ BMPSEQ
  2442. /DECREMENT PACKET SEQUENCE NUMBER
  2443. DECSEQ,0
  2444.        MMOMA SEQNO
  2445.        A-MZ (237
  2446.        JMP @ DECSEQ
  2447.        MEMA (337
  2448.        ACCM SEQNO
  2449.        JMP @ BMPSEQ
  2450. /CLEAR PACKET IP-BUFFER
  2451. CLPIPB,0
  2452.        MEMA IMARK
  2453.        JMS CLPBUF
  2454.        JMP @ CLPIPB
  2455. /CLEAR PACKET OP-BUFFER
  2456. CLPOPB,0
  2457.        MEMA OMARK
  2458.        JMS CLPBUF
  2459.        JMP @ CLPOPB
  2460. /CLEAR FIRST 200 ADDRESSES OF PACKET IP/OP BUFFER
  2461. /START TO BE IN ACC ON ENTRY
  2462. /BUT IF DIAFLG=1, PUSH OLD PKTS UP IN THE BED AND RETAIN THEM
  2463. CLPBUF,0
  2464.        MMOZ DIAFLG
  2465.        JMP ORDCLP
  2466.        JMS DIACLR
  2467.        JMP @ CLPBUF
  2468. ORDCLP,ACCM CLRBPT
  2469.        MEMA (200
  2470.        ACCM CLRBCT
  2471. CLBLUP,ZERM @ CLRBPT
  2472.        MPOM CLRBPT
  2473.        MMOMZ CLRBCT
  2474.        JMP CLBLUP
  2475.        JMP @ CLPBUF
  2476. CLRBPT,0
  2477. CLRBCT,0
  2478. /DIAGNOSTIC BUFFER CLEARANCE
  2479. /MOVES EVERYTHING UP IN THE BED BY 200
  2480. /FIRST BLOCK ADD TO BE IN ACC ON ENTRY
  2481. /BUT IF FIRST ADDRESS =0, JUST JUMPS OUT - BECAUSE CLEARANCE UN-NEEDED
  2482. DIACLR,0
  2483.        ACCM BOTDC
  2484.        MEMZ @ BOTDC
  2485.        ZERZ
  2486.        JMP @ DIACLR
  2487.        MEMA BOTDC
  2488.        A+MA (777
  2489.        ACCM DCPT2
  2490.        A-MA (200
  2491.        ACCM DCPT1
  2492.        MEMA (600
  2493.        ACCM DCCNT
  2494. DCLOOP,MEMA @ DCPT1
  2495.        ZERM @ DCPT1
  2496.        ACCM @ DCPT2
  2497.        MMOM DCPT1
  2498.        MMOM DCPT2
  2499.        MMOMZ DCCNT
  2500.        JMP DCLOOP
  2501.        JMP @ DIACLR
  2502. BOTDC, 0
  2503. DCPT1, 0
  2504. DCPT2, 0
  2505. DCCNT, 0
  2506. DIAFLG,0
  2507. /TOGGLE PACKET-ARCHIVING ON/OFF
  2508. ARCTOG,0
  2509.        ONEM @ XCMDFL
  2510.        JMS @ XCRLF
  2511.        JMS @ XUNPCK
  2512.        INDARC
  2513.        MEMZ DIAFLG
  2514.        JMP ARCOFF
  2515.        ONEM DIAFLG
  2516.        JMS @ XUNPCK
  2517.        AON
  2518.        JMP ARCOUT
  2519. ARCOFF,ZERM DIAFLG
  2520.        JMS @ XUNPCK
  2521.        AOFF
  2522. ARCOUT,JMS @ XCRLF
  2523.        JMP @ ARCTOG
  2524. INDARC,TEXT %INDICATORS & ARCHIVING %
  2525. AOFF,  TEXT %OFF%
  2526. AON,   TEXT %ON%
  2527. /CLEAR BOTH PACKET BUFFERS FULLY
  2528. RTCLR, 0
  2529.        MEMA OMARK
  2530.        ACCM RTCPNT
  2531.        MPOA (1777
  2532.        ACCM RTCCNT
  2533. RTCLUP,ZERM @ RTCPNT
  2534.        MPOM RTCPNT
  2535.        MMOMZ RTCCNT
  2536.        JMP RTCLUP
  2537.        JMP @ RTCLR
  2538. RTCPNT,0
  2539. RTCCNT,0
  2540. /CHECK CHECKSUM FOR PACKET IN INPUT BUFFER
  2541. /IF ERROR, 1ST RA
  2542. /NORMALLY, IF OK, 2ND RA
  2543. CHKCHK,0
  2544.        MEMA ILEN       /SET POINTER, COUNTER
  2545.        ACCM IPAKPT
  2546.        MEMA @ ILEN
  2547.        A-MA (240
  2548.        EXCT AC19 ZAC
  2549.        JMP BADCHK
  2550.        ACCM IPAKCT
  2551.        ZERA
  2552. ICHLUP,A+MA @ IPAKPT   /SUMMATION LOOP
  2553.        A-MA (200       /SUBTRACT NIC BIAS
  2554.        MPOM IPAKPT
  2555.        MMOMZ IPAKCT
  2556.        JMP ICHLUP
  2557.        ACCM RICSUM
  2558.        JMS CMAK        /CREATE CHECKSUM
  2559.        ACCM ICSUM
  2560.        A-MA @ IPAKPT   /COMPARE RESULT IN PKT
  2561.        SKIP ZAC
  2562.        JMP BADCHK      /ERROR
  2563.        MPOM CHKCHK     /OK, IT MATCHES
  2564.        JMP @ CHKCHK
  2565. BADCHK,MEMA ("c        /TYPE "c" TO INDICATE ERROR
  2566.        JMS TYPROG
  2567.        JMP @ CHKCHK    /AND FIRST RA
  2568. RICSUM,0               /RAW IP CHECKSUM
  2569. ICSUM, 0               /KERMIT-ED VERSION
  2570. /CREATE 8-BIT KERMIT CHECKSUM
  2571. /RAW CHECKSUM TO BE IN ACC ON ENTRY, EXIT WITH RESULT IN ACC
  2572. CMAK,  0
  2573.        ACCM CMHOLD
  2574.        ANDA (300
  2575.        RASH 6
  2576.        A+MA CMHOLD
  2577.        ANDA (77
  2578.        A+MA (240
  2579.        JMP @ CMAK
  2580. CMHOLD,0
  2581. CMWORK,0
  2582. /SET POINTERS, COUNTER, ETC, FOR INCOMING PACKET
  2583. SETIPK,0
  2584.        MEMA IMARK     /SET POINTER
  2585.        ACCM IPAKPT
  2586.        MEMA LMAXL      /SET COUNTER, FOR SAFETY
  2587.        ACCM IPAKCT
  2588.        JMP @ SETIPK
  2589. /SET POINTERS, COUNTER, ETC, FOR OUTGOING PACKET
  2590. SETOPK,0
  2591.        MEMA OMARK     /SET POINTER
  2592.        ACCM OPAKPT
  2593.        MEMA RMAXL      /SET COUNTER, FOR SAFETY
  2594.        ACCM OPAKCT
  2595.        JMP @ SETOPK
  2596. /TYPE A CHARACTER TO INDICATE PROGRESS
  2597. /ACTIVE IN ARCHIVAL/DIAGNOSTIC MODE, WHEN DIAFLG=1
  2598. /CHARACTER TO BE IN ACC ON ENTRY
  2599. /COUNTER SHOULD BE SET PRIOR TO RECEIVE/TRANSMIT
  2600. TYPROG,0
  2601.        MMOZ DIAFLG     /UNLESS DIAFLG IS SET...
  2602.        JMP @ TYPROG    /...JUMP OUT
  2603.        JMS @ XACIBU     /RELY ON FUTURE RSDUTIES TO PRINT
  2604.        MMOMZ TYPRCT    /END OF LINE ON TERMINAL?
  2605.        JMP @ TYPROG    /NO
  2606.        JMS PRGSET      /YES, RESET COUNTER
  2607.        JMP @ TYPROG
  2608. TYPRCT,0
  2609. /INITIALISE TYPROG COUNTER
  2610. PRGSET,0
  2611.        MEMA (215       /POP A CRLF INTO THE PRINTER BUFFER
  2612.        JMS @ XACIBU
  2613.        MEMA (212
  2614.        JMS @ XACIBU
  2615.        MEMA TYPRNO     /SET THE COUNTER
  2616.        ACCM TYPRCT
  2617.        JMP @ PRGSET
  2618. TYPRNO,106
  2619. /COMPUTE NUMBER FOR TIME-OUT COUNTER
  2620. /LEAVE RESULT IN RSANUM FOR GETPKT TO USE
  2621. /IF ACC OVERFLOWS, JUST SET 2**19-1
  2622. RTCALC,0
  2623.        MEMA RTIME
  2624.        TACMQ
  2625.        MULT
  2626.        31463           /DECIMAL 13107
  2627.        SKIP ZAC
  2628.        JMP RSAOTP
  2629.        TMQAC
  2630.        EXCT AC19
  2631.        JMP RSAOTP
  2632. RTCOUT,ACCM RSANUM
  2633.        JMP @ RTCALC
  2634. RSAOTP,MEMA MAXRSA
  2635.        JMP RTCOUT
  2636. MAXRSA,1777777
  2637. /ENSURE HEADER IS NOT TRANSFERRED TO SYMMETRY
  2638. /IF NO HEADER, 2ND RA
  2639. /IF HEADER, BUMP POINTER & DECREMENT COUNTER BY 1K
  2640. /IF COUNTER THEN =0 (IE NIC-298), TAKE 1ST RA
  2641. /OTHERWISE, 2ND RA
  2642. TSTHED,0
  2643.        MEMA @ IDTPNT
  2644.        A-MZ IDTRM
  2645.        JMP TSTOK
  2646.        MPOA (1777
  2647.        A+MM TRANPT
  2648.        M-AMZ TRANCT
  2649.        JMP TSTOK
  2650.        JMP @ TSTHED
  2651. TSTOK, MPOM TSTHED
  2652.        JMP @ TSTHED
  2653. IDTPNT,2
  2654. IDTRM, 770320
  2655. TRANPT,0
  2656. TRANCT,0
  2657. /SEND FILE DIRECTORY DATA AT FRONT OF FIRST DATA PACKET
  2658. /SIZE, LOAD ADDRESS, STARTING ADDRESS
  2659. FDATA, 0
  2660.        MEMA XSIZE      /SET PICK-UP POINTER
  2661.        ACCM PKOPNT
  2662.        MEMA (3         /COUNTER
  2663.        ACCM FDCNT
  2664.        ACCM NUMCNT
  2665. FDLOOP,JMS DECOUT      /SEND LOOP
  2666.        JMS COMRET
  2667.        MMOMZ FDCNT
  2668.        JMP FDLOOP
  2669.        ZERM PKOPNT     /RESET POINTER, COUNTER
  2670.        MEMA @ XREDWR
  2671.        ACCM PKOCNT
  2672.        JMP @ FDATA
  2673. FDCNT, 0
  2674. /TYPE A COMMA, WITH A CR EVERY 8TH LINE
  2675. COMRET,0
  2676.        MEMA (",
  2677.        JMS ACCPOP
  2678.        MMOMZ NUMCNT
  2679.        JMP @ COMRET
  2680.        MEMA (215
  2681.        JMS ACCPOP
  2682.        MEMA (10
  2683.        ACCM NUMCNT
  2684.        JMP @ COMRET
  2685. NUMCNT,0
  2686. /MOVE INTEGER INTO POP-BUFFER AS A SIGNED DECIMAL NUMBER
  2687. /WITH SPECIAL TREATMENT FOR 2000000, WHICH SETS BIGFLG
  2688. DECOUT,0
  2689.        ZERM BIGFLG
  2690.        MEMA @ PKOPNT
  2691.        MPOM PKOPNT
  2692.        MMOM PKOCNT
  2693.        MPOM @ XARWDS
  2694.        ACCM DECNUM
  2695.        EXCT ZAC
  2696.        JMP NULDEC
  2697.        ZERM SGNFLG
  2698.        SKIP AC19
  2699.        JMP POSDEC
  2700.        MNGAM DECNUM
  2701.        EXCT AC19
  2702.        ONEM BIGFLG
  2703.        MONM SGNFLG
  2704. POSDEC,MEMA (5
  2705.        ACCM DIGITS
  2706.        MEMA EQULST
  2707.        ACCM EQUPNT
  2708.        ZERM SPACFG
  2709. DECLUP,MEMA @ EQUPNT
  2710.        ACCM DECDIV
  2711.        MEMA DECNUM
  2712.        LASH 1
  2713.        TACMQ
  2714.        ZERA
  2715.        MEMZ BIGFLG
  2716.        ONEA
  2717.        ZERM BIGFLG
  2718.        DIVD
  2719. DECDIV,0
  2720.        RASH 1
  2721.        ACCM DECNUM
  2722.        TMQAC
  2723.        SKIP ZAC
  2724.        JMP NONORT
  2725.        MPOZ SPACFG
  2726.        JMP NOTSIG
  2727. NONORT,MPOZ SPACFG
  2728.        JMS SGNPRN
  2729.        MONM SPACFG
  2730.        A+MA (260
  2731.        JMS ACCPOP
  2732. NOTSIG,MPOM EQUPNT
  2733.        MMOMZ DIGITS
  2734.        JMP DECLUP
  2735.        MPOZ SPACFG
  2736.        JMS SGNPRN
  2737.        MEMA DECNUM
  2738.        A+MA (260
  2739.        JMS ACCPOP
  2740.        JMP @ DECOUT
  2741. NULDEC,MEMA (260
  2742.        JMS ACCPOP
  2743.        JMP @ DECOUT
  2744. DECNUM,0                /NUMBER TO BE SENT
  2745. SGNFLG,0                /SIGN FLAG
  2746. SPACFG,0                /LEADING ZERO SUPPRESS FLAG
  2747. BIGFLG,0               /SET BY A 2000000
  2748. DIGITS,0                /COUNTER FOR DIGITS
  2749. EQUPNT,0                /POINTER FOR DECIMAL EQUIVALENTS
  2750. EQULST,EQUILS           /START OF DECIMAL EQUIVALENTS
  2751. EQUILS,303240           /100000
  2752.        23420            /10000
  2753.        1750             /1000
  2754.        144              /100
  2755.        12               /10
  2756. BIGNUM,1000000         /HALF OF MOD(2000000)
  2757. /PRINT SIGN, IF NEGATIVE
  2758. SGNPRN,0
  2759.        MPOZ SGNFLG
  2760.        JMP @ SGNPRN
  2761.        ACCM SGNTEM
  2762.        MEMA ("-
  2763.        JMS ACCPOP
  2764.        MEMA SGNTEM
  2765.        JMP @ SGNPRN
  2766. SGNTEM,0
  2767. /PAGE 110000 POINTERS
  2768. XCXFLG,CXFLG
  2769. XCZFLG,CZFLG
  2770. XPXBAK,PXBAK
  2771. XMOQER,MOQERY
  2772. XCMDFL,CMDFLG
  2773. XRTFLG,RTFLG
  2774. XIGBFL,IGBFLG
  2775. XTYPE, TYPE
  2776. XCRLF, CRLF
  2777. XUNPCK,UNPCK
  2778. XCOMBA,COMBAK
  2779. XOCHAC,OCHACT
  2780. XRSDUT,RSDUTY
  2781. XACOBU,ACOBUF
  2782. XACIBU,ACIBUF
  2783. XRSBCH,RSBCHA
  2784. XIPKTF,IPKTFG
  2785. /PAGE 114000 POINTERS
  2786. XSIZE, SIZE
  2787. XFILN1,FILNAM
  2788. XFILN2,FILNAM+1
  2789. XASFLA,ASFLAG
  2790. /PAGE 116000 POINTERS
  2791. XREDWR,REDWRD
  2792. XARROW,ARROW
  2793. XARWDS,ARWDS
  2794. XWRDST,WRDSTO
  2795. PAGSKP
  2796. *114000
  2797. /PAGE 114000 HOLDS THE FILENAME-PARSING ROUTINES
  2798. /THEN, SPACE FOR NICBUG AND BOOTS
  2799. /USES Y-PREFIX POINTERS
  2800. /ROUTINES FOR FILENAME SPECIFICATION
  2801. /
  2802. /GET A LINE FROM THE KEYBOARD, USING READ.  LINE EDITING
  2803. /IS AVAILABLE USING <RUBOUT>,<BS>,<CTRL-O>, & <LF>. LINE IS TERM-
  2804. /INATED BY A <CR> OR THE 79'TH CHARACTER.  CHARACTER COUNT WILL
  2805. /BE IN LCC, AND LP WILL POINT TO START OF THE BUFFER.
  2806. GETLIN,    0
  2807.        JMS @ YCRLF
  2808. GTLIN0,JMS @ YCRLF
  2809.        MEMA ("@
  2810.        JMS @ YTYPE
  2811.        MEMA LINBUF
  2812.     ACCM    LP    /INITIALIZE LINE PNTR
  2813.     ZERM    LCC    /AND CHAR CNTR
  2814.        MEMA @ YRECSI   /AND DIR COUNTER
  2815.        ACCM DIRSIZ
  2816. GTLIN1,JMS @ YREAD     /READ AND ECHO CHAR
  2817.     A-MZ    (215    /CR?
  2818.     JMP    GTLIN2    /NO
  2819. /PROCESS CR
  2820. DOCR,    MEMA    (215    /(THIS IS FOR LINE OVFLW)
  2821.     JMS    RUBCHK
  2822.     JMS    @ YCRLF
  2823.     MEMA    LINBUF
  2824.     ACCM    LP    /RESTORE LP
  2825.     MPOM    LCC    /COUNT CR AS A CHAR
  2826.     JMP    @GETLIN    /DONE
  2827. GTLIN2,    A-MZ    (212    /LF?
  2828.     JMP    GTLIN3    /NO
  2829. /PROCESS LF
  2830. KBECHL,    JMS    RUBCHK
  2831.     MEMA    LINBUF
  2832.     ACCM    LP
  2833.     MEMA    LCC
  2834.     ACCMZ    RUBFLG
  2835.     ZERZ
  2836.     JMP    GTLIN1    /NOTHING TO ECHO
  2837.     MEMA    ("^
  2838.     JMS    @ YTYPE    /FIRST ECHO "^"
  2839.     JMS    @ YCRLF    /  THEN @ YCRLF
  2840. KBECLP,    MEMA    @LP    /  THEN THE LINE
  2841.     MPOM    LP
  2842.     JMS    @ YTYPE
  2843.     MMOMZ    RUBFLG
  2844.     JMP    KBECLP
  2845.     JMP    GTLIN1    /LINE ECHOED
  2846. GTLIN3,    A-MZ    (210    /BS?
  2847.     ZERZ
  2848.     MEMA    (377    /YES, SUBSTITUTE RUBOUT
  2849.     A-MZ    (377    /RUBOUT?
  2850.     JMP    GTLIN4    /NO
  2851. /PROCESS RUBOUT
  2852. BKSPC,    MMOMA    LCC
  2853.     EXCT    AC19
  2854.     JMP    GTLIN0    /NOTHING TO DELETE
  2855.     MMOM    LP
  2856.     MEMZ    RUBFLG    /RUBOUTS UNDERWAY?
  2857.     JMP    BKSP1    /YES
  2858.     MONM    RUBFLG    /NO, TURN FLAG ON
  2859.     MEMA    ("[
  2860.     JMS    @ YTYPE    /ECHO "["
  2861. BKSP1,    MEMA    @LP
  2862.     JMS    KBECHO    /ECHO DELETED CHAR
  2863.     JMP    GTLIN1
  2864. GTLIN4,    A-MZ    ("O-100    /CTRL-O?
  2865.     JMP    GTLIN5    /NO
  2866. /PROCESS CTRL-O
  2867. ERSLN,    JMS    RUBCHK
  2868.     JMP    GTLIN0
  2869. GTLIN5,    A-MZ    (200    /NULL?
  2870.     ZERZ
  2871.     JMP    GTLIN1    /IGNORE NULLS
  2872.     JMS    RUBCHK
  2873.     MPOMA    LCC    /INCREMENT COUNT
  2874.     A-MZ    (117    /COUNT=79?
  2875.     JMP    GTLIN1    /NO
  2876.     JMP    DOCR    /YES, FORCE END OF LINE
  2877.  
  2878. RUBCHK,    0
  2879.     ACCM    @LP
  2880. RUBCK1,    MPOM    LP
  2881.     MCPZ    RUBFLG    /RUBOUTS UNDERWAY?
  2882.     JMP    @RUBCHK    /NO
  2883.     MEMA    ("]    /YES, FINISH BRACKETS
  2884.     JMS    @ YTYPE
  2885.     ZERM    RUBFLG
  2886.     MMOM    LP
  2887.     MEMA    @LP
  2888.     JMP    RUBCK1
  2889.  
  2890. KBECHO,    0
  2891.     A-MZ    (211    /HT?
  2892.     JMP    #+3
  2893.     MEMA    (240    /YES, ECHO 2 SPACES
  2894.     JMS    @ YTYPE
  2895.     JMS    @ YTYPE
  2896.     JMP    @KBECHO
  2897.  
  2898. LINBUF,    ZZZEND
  2899. RUBFLG,    0
  2900. LP,    0
  2901. LCC,    0
  2902.  
  2903. /GETDAB: PARSES A LINE OF THE FORM (/)(NAMGRP)(.X)(-D2)(:Z)
  2904. / WHERE NAMGRP.X MAY CONTAIN *'S AND/OR ?'S
  2905. GETDAB,    0
  2906.        ZERM JOKER
  2907.        ZERM NFILES
  2908.        MEMA ASFADD
  2909.     ACCM    TEMP
  2910.     MEMA    (12
  2911.     ZERM    @TEMP
  2912.     MPOM    TEMP
  2913.     AMOAZ
  2914.     JMP    #-3    /CLEAR THE DAB & MASKS
  2915.     JMS    GETNBC
  2916.     A-MZ    (240    /(IF SPACE, ACTUALLY CR)
  2917.     ZERZ
  2918.     JMP    #+3
  2919.     A-MZ    ("/    /IGNORE LEADING '/'
  2920.     MMOM    LP
  2921.     JMS    GETNAM
  2922.     MEMA    NAMWRD
  2923.     ACCM    NAME1
  2924.     MEMA    NAMASK
  2925.     ACCM    NAMSK1
  2926.     JMS    GETNAM
  2927.     MEMA    NAMWRD
  2928.     ACCM    NAME2
  2929.     MEMA    NAMASK
  2930.     LASH    2
  2931.     A+MA    (3
  2932.     RLSH    2
  2933.     ACCM    NAMSK2
  2934. GTDAB1,    MEMA    @LP
  2935.     MPOM    LP
  2936.     A-MZ    (".
  2937.     ZERZ
  2938.     JMP    GTDABE
  2939.     A-MZ    ("-
  2940.     ZERZ
  2941.        JMP DABERR
  2942.     A-MZ    (":
  2943.     JMP    @GETDAB
  2944.     MEMA    @LP
  2945.     ACCM    OPTION
  2946.     JMP    @GETDAB
  2947.  
  2948. GTDABE,    JMS    GETNBC    /GET EXTENSION
  2949.     A-MZ    ("P
  2950.     ZERZ
  2951.     JMP    GTDABE    /IGNORE 'P'
  2952.     A-MZ    ("*
  2953.     ZERZ
  2954.     JMP    GTDAB2    /'*' MEANS ANY EXTENSION
  2955.     A-MZ    ("?
  2956.     ZERZ
  2957.     JMP    GTDAB2    /  SO DOES '?'
  2958.     A-MA    ("@
  2959.     EXCT    ZAC AC19
  2960.     JMP    DABERR    /ILLEGAL CHAR
  2961.     A-MA    (4
  2962.     SKIP    AC19
  2963.     JMP    DABERR    /ILLEGAL EXTENSION
  2964.     A+MA    (4
  2965.     RLSH    2
  2966.     A+MM    NAME2
  2967.     JMP    GTDAB1    /EXTENSION IN BITS 18-19
  2968. GTDAB2,    MEMA    NAMSK2
  2969.     LASH    2
  2970.     RISH    2
  2971.     ACCM    NAMSK2    /ALLOW ANY EXTENSION
  2972.        ONEM JOKER
  2973.     JMP    GTDAB1
  2974.  
  2975.  
  2976. DABERR,JMS @ YCRLF        /ERROR IN DAB
  2977.        JMS @ YUNPCK
  2978.        ERR8
  2979.        JMS @ YEXPLA
  2980.        JMP @ YNEWNA
  2981. JOKER, 0                /SET =1 BY ANY "?" OR "*" CHARACTERS
  2982.  
  2983. GETNAM,    0    /FORM NEXT FILENAME WORD
  2984.     ZERM    NAMASK
  2985.     ZERM    NAMWRD
  2986.     MEMA    (3
  2987.     ACCM    LTRCNT
  2988. GTNAM1,    JMS    GETNBC
  2989.        A-MZ ("*         /SORT OUT THE JOKERS
  2990.        ZERZ
  2991.        ONEM JOKER
  2992.        A-MZ ("?
  2993.        ZERZ
  2994.        ONEM JOKER
  2995.  
  2996.     A-MZ    ("*
  2997.     ZERZ
  2998.     JMP    @GETNAM    /* MEANS ANY 3 CHARS
  2999.     A-MZ    ("?
  3000.     ZERZ
  3001.     JMP    GTNAM2    /? MEANS ANY 1 CHAR
  3002.     A-MA    (240
  3003.     ACCM    TEMP
  3004.     MEMA    LTRCNT
  3005.     ACCM    TEMP2
  3006.     MEMA    TEMP
  3007.     LLSH    6
  3008.     MMOMZ    TEMP2
  3009.     JMP    #-2    /ROTATE TOO FAR
  3010.     RLSH    6    /POSITION CORRECTLY
  3011.     A+MM    NAMWRD    /BUILD NAME
  3012.     MEMA    LTRCNT
  3013.     ACCM    TEMP2
  3014.     MEMA    (77
  3015.     LLSH    6
  3016.     MMOMZ    TEMP2
  3017.     JMP    #-2
  3018.     RLSH    6
  3019.     A+MM    NAMASK    /BUILD NAME MASK
  3020. GTNAM2,    MMOMZ    LTRCNT
  3021.     JMP    GTNAM1
  3022.     JMP    @GETNAM    /EXIT 
  3023.  
  3024. GETNBC,    0    /GET NEXT NON-BLANK CHAR
  3025. GTNBC1,    MEMA    @LP
  3026.     MPOM    LP
  3027.     A-MZ    (240
  3028.     ZERZ
  3029.     JMP    GTNBC1    /IGNORE SPACE
  3030.     A-MZ    (211
  3031.     ZERZ
  3032.     JMP    GTNBC1    /IGNORE TAB
  3033.     A-MZ    (215
  3034.     ZERZ
  3035.     JMP    GTNBC2
  3036.     A-MA    (240
  3037.     EXCT    AC19
  3038.     JMP    DABERR    /CONTROL CHAR
  3039.     A-MA    ("[-240
  3040.     SKIP    AC19
  3041.     JMP    DABERR    /LOWER CASE OR SPECIAL
  3042.     A+MA    ("[
  3043.     A-MZ    ("-
  3044.     ZERZ
  3045.     JMP    GTNBC2    /'-' STARTS DEVICE CODE
  3046.     A-MZ    (".
  3047.     ZERZ
  3048.     JMP    GTNBC2    /'.' STARTS EXTENSION
  3049.     A-MZ    (":    /':' PRECEDES OPTION
  3050.     JMP    @GETNBC    /NONE OF THE ABOVE
  3051. GTNBC2,    MEMA    (240    /SUBSTITUTE A SPACE
  3052.     MMOM    LP    /BACK UP TO TERMINATOR
  3053.     JMP    @GETNBC
  3054.  
  3055. LTRCNT,    0
  3056. NAMWRD,    0
  3057. NAMASK,    0
  3058. ASFLAG,    0
  3059. NAME1,    0
  3060. NAME2,    0
  3061. FRSTRK,    0
  3062. SIZE,    0
  3063. MLA,    0
  3064. PSA,    0
  3065. NAMSK1,    0
  3066. NAMSK2,    0
  3067. OPTION,    0
  3068. NFILES,0               /NUMBER OF FILES FOUND
  3069. TEMP,  0               /WORK ADDRESSES
  3070. TEMP2, 0
  3071. REMDER,0
  3072. ASFADD,ASFLAG
  3073. /LOOKUP: SEARCHES THE DISK DIRECTORY STARTING AT THE NEXT
  3074. /POSITION (DIRPNT+5).
  3075. /1ST RA IF NO FILE FOUND, 2ND RA IF FILENAME FINDS A MATCH
  3076. LOOKUP,    0
  3077. LKP2,    MEMA    (5
  3078.     A+MM    DIRPNT
  3079.        M-AMA DIRSIZ
  3080.     EXCT    AC19
  3081.        JMP LKP5
  3082.     MCPZ    @DIRPNT    /END OF DIRECTORY?
  3083.     JMP    LKP6    /NO
  3084. LKP5,    MEMZ    NFILES    /ANY FILES FOUND?
  3085.        JMP @ LOOKUP    /YES, SO EXIT
  3086.     JMS    @ YUNPCK    /NO, TELL HIM SO
  3087.         ERR1
  3088.        JMP @ LOOKUP    /RESTART
  3089. /SEARCH THE DIRECTORY
  3090. LKP6,    MEMAZ    @DIRPNT    /LOOK AT WORD 1
  3091.     JMP    LKP7    /NOT DELETED
  3092.     JMP    LKP2    /NO, SKIP IT
  3093. LKP7,    MEMA    DIRPNT    /TRY TO MATCH THE NAME
  3094.     APOM    DRPNT2
  3095.     MEMA    NAME1
  3096.     ANDA    NAMSK1
  3097.     ACCM    TEMP
  3098.     MEMA    @DIRPNT
  3099.     ANDA    NAMSK1
  3100.     A-MZ    TEMP
  3101.     JMP    LKP2    /DIDN'T MATCH
  3102.     MEMA    NAME2
  3103.     ANDA    NAMSK2
  3104.     ACCM    TEMP
  3105.     MEMA    @DRPNT2
  3106.     ANDA    NAMSK2
  3107.     A-MZ    TEMP
  3108.     JMP    LKP2    /DIDN'T MATCH
  3109.     MEMA    @DRPNT2
  3110.     MPOM    DRPNT2
  3111.     ACCM    NAME2
  3112.     LLSH    2
  3113.     ANDA    (3
  3114.     A-MZ    (1
  3115.     ZERMZ    ASFLAG    /CLEAR IF .B, .C, OR NULL
  3116.     MONM    ASFLAG    /SET IF .A
  3117.     MEMA    @DIRPNT
  3118.     ACCM    NAME1
  3119.     MEMA    @DRPNT2
  3120.     ANDA    BITS16    /(177777)
  3121.     ACCM    MLA    /MLA(0:15)
  3122.     MCPA    BITS16
  3123.     ANDA    @DRPNT2
  3124.     RISH    1
  3125.     ACCM    PSA    /PSA(15:18)
  3126.     MPOM    DRPNT2
  3127.     MEMA    @DRPNT2    /GET WORD 4
  3128.     ANDA    BITS16
  3129.     ACCM    SIZE    /SIZE, MOD 2**16
  3130.     MCPA    BITS16
  3131.     ANDA    @DRPNT2
  3132.     RISH    5
  3133.     A+MM    PSA    /PSA(11:14)
  3134.     MPOM    DRPNT2
  3135.     MEMA    @DRPNT2
  3136.     RISH    11
  3137.     A+MM    PSA    /PSA(0:10)
  3138.        MEMA DIRPNT
  3139.        A+MA (4
  3140.        ACCM DRPNT2
  3141.        MEMA @ DRPNT2
  3142.        ANDA (777
  3143.        ACCM FRSTRK      /FIRST RECORD
  3144.        JMS CKBDIR      /IS IT THE BACKUP DIR?
  3145.        JMP @ LOOKUP    /YES, DON'T SEND IT
  3146.     JMS    PRFLNM    /TYPE FOUND FILENAME
  3147.        MPOM LOOKUP
  3148.     JMP    @LOOKUP    /YES, RETURN
  3149. /SAY FILENAME BEING SENT
  3150. PRFLNM,0
  3151.        MPOM NFILES     /BUMP FILE NO.
  3152.        MEMZ @ YDIAFL
  3153.        JMS @ YCRLF
  3154.        JMS @ YCRLF
  3155.        JMS @ YUNPCK    /PRINT "SENDING"
  3156.        SND
  3157.        MEMA NAME1      /PRINT FILENAME
  3158.        ANDA PRMSK
  3159.        ACCM FILNAM
  3160.        MEMA NAME2
  3161.        ANDA PRMSK
  3162.        ACCM FILNAM+1
  3163.        JMS @ YFPCK
  3164.        FILNAM
  3165.        MEMA NAME2       /PRINT EXTENSION
  3166.        LLSH 2
  3167.        ANDA (3
  3168.        ACCM EXTEN
  3169.        RLSH 2          /INSERT INTO FILENAME
  3170.        TACMQ
  3171.        MEMA FILNAM+1
  3172.        INCOR
  3173.        ACCM FILNAM+1
  3174.        MEMA NAME1      /PRINT "."?
  3175.        EXCT AC19
  3176.        JMP PNTPRN      /YES
  3177.        MEMZ EXTEN
  3178.        ZERZ
  3179.        JMP SPCOUT      /NO
  3180. PNTPRN,MEMA (".        /YES, PRINT THE "."
  3181.        JMS @ YTYPE
  3182.        MEMA EXTEN
  3183.     A+MA    ("@
  3184.     A-MZ    ("@
  3185.     JMS     @ YTYPE
  3186.     MEMA    NAME1
  3187.        SKIP AC19
  3188.        JMP SPCOUT
  3189.     MEMA    ("P    / TYPE P IF PROTECTED
  3190.     JMS     @ YTYPE
  3191. SPCOUT,MEMA (240       /PRINT SPACE ON THE WAY OUT
  3192.        JMS @ YTYPE
  3193.     JMP    @PRFLNM
  3194. BITS16,    177777
  3195. DLTFLG,    0
  3196. DIRMOD,    0
  3197. DIRFLG,    0
  3198. DIRSIZ,0
  3199. DIRPNT,    0
  3200. DRPNT2,    0
  3201. DRPSAV,    0
  3202. BIGMT,    0
  3203. PRMSK, 777777
  3204. FILNAM,0
  3205.        0
  3206.        007700
  3207. EXTEN, 0
  3208. /OFF-PAGE POINTERS
  3209. YDIAFL,DIAFLG
  3210. YNEWNA,NEWNAM
  3211. YCRLF, CRLF
  3212. YTYPE, TYPE
  3213. YREAD, READ
  3214. YUNPCK,UNPCK
  3215. YFPCK, FPCK
  3216. YEXPLA,EXPLAN
  3217. YRECSI,RECSIZ
  3218. YDECPR,DECPRN
  3219. ZZZEND,BLOCK 20         /CHARACTER BUFFER
  3220. *115477
  3221. /TEXT FOR ERRORS ETC, FITS IN ABOVE BOOTS
  3222. ERR1,  TEXT %FILE NOT FOUND%
  3223. ERR2,  TEXT % %
  3224. ERR4,  TEXT %ONE FILE AT A TIME, PLEASE!%
  3225. ERR5,  TEXT %NO ROOM%
  3226. ERR5A, TEXT % %
  3227. ERR6,  TEXT %DISK READ ERROR%
  3228. ERR8,  TEXT %WHAT?%
  3229. FILE,  TEXT %  FILE %
  3230. SND,   TEXT %SENDING %
  3231. /WATCH OUT FOR ///DIR BACKUP DIRECTORY
  3232. /IF FOUND, TAKE 1ST RA
  3233. /NORMALLY, TAKE 2ND RA
  3234. CKBDIR,0
  3235.        MEMA NAME1
  3236.        ANDA PRMSK
  3237.        A-MZ BDIR
  3238.        JMP CKBOUT
  3239.        MEMA NAME2
  3240.        ANDA PRMSK
  3241.        A-MZ BDIR+1
  3242.        JMP CKBOUT
  3243.        JMS @ YCRLF
  3244.        JMS @ YCRLF
  3245.        JMS @ YUNPCK
  3246.        NSND
  3247.        JMS @ YUNPCK
  3248.        BDIR
  3249.        JMS @ YCRLF
  3250.        JMP @ CKBDIR
  3251. CKBOUT,MPOM CKBDIR
  3252.        JMP @ CKBDIR
  3253. BDIR,  TEXT %///DIR%
  3254. NSND,  TEXT %NOT SENDING %
  3255. PAGSKP
  3256. *116000
  3257. /PAGE 116000 HOLDS MOST OF THE DISK-INTERACTIVE ROUTINES
  3258. /AND GENERAL UTILITIES
  3259. /
  3260. TOTLOD,0               /TOTAL WORDS LOADED TO DATE
  3261. ARWDS, 0               /WORDS PACKETED OUT TO DATE
  3262. /
  3263. WRDTOT,0               /TOTAL WORDS TO LOAD
  3264. WORDS, 0               /WORDS STILL TO LOAD
  3265. WRDSTO,0               /TOTAL OF WORDS STORED TO DATE
  3266. LASFLG,0               /SET =1 FOR FINAL RECORD
  3267. /
  3268. /PRINT INTRODUCTORY MESSAGE ON FIRST ENTRY
  3269. INTROD,0
  3270.        MEMZ INTFLG
  3271.        JMP @ INTROD
  3272.        ONEM @ ZIGBFL
  3273.        JMS @ ZCRLF
  3274.        JMS DSKSET      /CONFIGURE FOR DISK
  3275.        JMS FPPMOV      /MOVE FPP72 INTO POSITION
  3276.        JMS TXPCK
  3277.        INTMES
  3278.        ONEM INTFLG
  3279.        JMS @ ZCRLF
  3280.        JMP @ INTROD
  3281. INTFLG,0
  3282. /CONFIGURE NICSYM FOR DISK IN USE
  3283. DSKSET,0
  3284.        JMS DISKID      /IDENTIFY F OR D
  3285.        ACCM DSKTYP
  3286.        MEMA (DPST1-UNIT /SET COUNTER
  3287.        ACCM DSKCNT
  3288.        MEMA FLSRT      /SET PICK-UP POINTER
  3289.        MEMZ DSKTYP
  3290.        MEMA DLSRT
  3291.        ACCM DSKPT1
  3292.        MEMA DPST1      /SET PUT-DOWN POINTER
  3293.        ACCM DSKPT2
  3294. DSKLUP,MEMA @ DSKPT1   /TRANSFER LOOP
  3295.        ACCM @ DSKPT2
  3296.        MPOM DSKPT1
  3297.        MPOM DSKPT2
  3298.        MMOMZ DSKCNT
  3299.        JMP DSKLUP
  3300.        MEMA DISOLV     /FIX UP PAGE 110000
  3301.        ACCM @ DISPT
  3302.        JMP @ DSKSET
  3303. DSKTYP,0               /0=NIC-298, 1=NIC-294
  3304. DSKPT1,0
  3305. DSKPT2,0
  3306. DSKCNT,0
  3307. DISPT, WDISSO
  3308. /MOVE FPP72 FROM 102000 TO ITS WORKING POSITION AT 6000
  3309. FPPMOV,0
  3310.        MEMA FPPSRT
  3311.        ACCM FPPPIK
  3312.        MEMA FPPEND
  3313.        ACCM FPPPUT
  3314.        MEMA FPPSIZ
  3315.        ACCM FPPCNT
  3316. FPPLUP,MEMA @ FPPPIK
  3317.        ACCM @ FPPPUT
  3318.        MPOM FPPPIK
  3319.        MPOM FPPPUT
  3320.        MMOMZ FPPCNT
  3321.        JMP FPPLUP
  3322.        JMP @ FPPMOV
  3323. FPPSRT,102000
  3324. FPPEND,6000
  3325. FPPSIZ,1577
  3326. FPPPIK,0
  3327. FPPPUT,0
  3328. FPPCNT,0
  3329. /CONFIGURE NICSYM WITH USERNAME AND PASSWORD
  3330. CONFIG,0
  3331.        ONEM @ ZCMDFL
  3332.        MEMA @ FTST1    /CHECK FPP72 IS OK AT 102000
  3333.        A-MZ FVAL1
  3334.        JMP GETVIR
  3335.        MEMA @ FTST2
  3336.        A-MZ FVAL2
  3337.        JMP GETVIR
  3338.        ZERM NEWFLG
  3339. RENAM, JMS @ ZCRLF         /GET USERNAME
  3340.        JMS @ ZUNPCK
  3341.        CON
  3342.        JMS @ ZUNPCK
  3343.        UWORD
  3344.        MEMA USRNAM
  3345.        EXCT ZAC
  3346.        JMP UBAK
  3347.        JMS ASCPRN
  3348.        USRNAM
  3349.        MEMA (240
  3350.        JMS @ ZTYPE
  3351. UBAK,  JMS ASCINP
  3352.        USRNAM
  3353.        SKIP ZAC
  3354.        ONEM NEWFLG
  3355.        JMS @ ZUNPCK    /GET PASSWORD
  3356.        CON
  3357.        JMS @ ZUNPCK
  3358.        PWORD
  3359.        ONEM @ ZNULAF
  3360.        JMS ASCINP
  3361.        PASWRD
  3362.        ZERM @ ZNULAF
  3363.        SKIP ZAC
  3364.        ONEM NEWFLG
  3365.        JMS @ ZCRLF
  3366.        MEMZ NEWFLG     /STORE, IF ALTERED
  3367.        JMS NVSTO
  3368.        JMP @ CONFIG
  3369. GETVIR,JMS @ ZCRLF
  3370.        JMS @ ZUNPCK
  3371.        CONVIR
  3372.        JMS @ ZCRLF
  3373.        JMP @ CONFIG
  3374. NEWFLG,0               /=1 IF CHANGES MADE
  3375. FTST1, 102000
  3376. FVAL1, 25
  3377. FTST2, 103000
  3378. FVAL2, 2000767
  3379. CON,   TEXT %CONFIGURE %
  3380. UWORD, TEXT %USERNAME: %
  3381. PWORD, TEXT %PASSWORD: %
  3382. CONVIR,TEXT %CONFIGURE *VIRGIN* KERMIT%
  3383. /INPUT ROUTINE FOR 8-BIT ASCII
  3384. ASCINP,0
  3385.        MEMA @ ASCINP
  3386.        MPOM ASCINP
  3387.        ACCM ASCPNT
  3388.        ACCM ASCSRT
  3389.        MEMA (17        /MAXIMUM CHARACTERS
  3390.        ACCM ASCCNT
  3391.        JMS @ ZREAD
  3392.        A-MZ (215
  3393.        ZERZ
  3394.        JMP ASCOUT
  3395.        ZERZ
  3396. NEWASC,JMS @ ZREAD
  3397.        A-MZ ("Q-100    /ABORT ON CTRL/Q
  3398.        ZERZ
  3399.        JMP @ ZCOMBA
  3400.        A-MZ (210       /DELETE TO THE LEFT
  3401.        ZERZ
  3402.        JMP DELRIT
  3403.        A-MZ (377       /OR RUBOUT
  3404.        ZERZ
  3405.        JMP RUBLFT
  3406.        ACCM @ ASCPNT   /ACCEPT CHARACTER
  3407.        A-MZ (215
  3408.        ZERZ
  3409.        JMP FINCOM      /JUMP OUT ON CR
  3410.        MPOM ASCPNT
  3411.        MMOMZ ASCCNT
  3412.        JMP NEWASC
  3413. FINCOM,JMS @ ZCRLF
  3414.        JMP @ ASCINP
  3415. ASCOUT,JMS @ ZCRLF
  3416.        ZERA            /TO SHOW NULL INPUT
  3417.        JMP @ ASCINP
  3418. RUBLFT,MEMA (210       /BACKSPACE ON RUBOUT
  3419.        JMS @ ZTYPE
  3420. DELRIT,MMOMA ASCPNT    /DELETE CHAR
  3421.        A-MA ASCSRT     /BUT DO NOT GO BEYOND START
  3422.        SKIP AC19
  3423.        JMP DELOUT
  3424.        MPOM ASCPNT     /TOO FAR, SO ADVANCE ONE SPACE
  3425.        MEMA (240
  3426.        JMS @ ZTYPE
  3427. DELOUT,MEMA (210
  3428.        JMP NEWASC
  3429. ASCPNT,0               /POINTER
  3430. ASCCNT,0
  3431. ASCSRT,0
  3432. /TRANSMIT 8-BIT ASCII OUT ON RS232 B-CHANNEL
  3433. /ADDRESS OF TEXT TO BE IN WORD FOLLOWING CALL
  3434. ASCTRN,0
  3435.        MEMA @ ASCTRN
  3436.        MPOM ASCTRN
  3437.        ACCM RDCPNT
  3438.        MEMA @ RDCPNT
  3439.        MEMA (115
  3440.        ACCM REDCNT     /SAFETY STOP
  3441. NEWRDC,MEMA @ RDCPNT
  3442.        MPOM RDCPNT
  3443.        A-MZ (215
  3444.        ZERZ
  3445.        JMP RDCFIN      /JUMP OUT ON CR
  3446.        JMS @ ZACOBU
  3447.        MMOMZ REDCNT
  3448.        JMP NEWRDC
  3449. RDCFIN,JMS @ ZACOBU
  3450.        JMS @ ZEMPTO
  3451.        JMP @ ASCTRN
  3452. RDCPNT,0
  3453. REDCNT,0
  3454. /PRINT 8-BIT ASCII ON TTY
  3455. /ADDRESS OF TEXT TO BE IN WORD FOLLOWING CALL
  3456. ASCPRN,0
  3457.        MEMA @ ASCPRN
  3458.        MPOM ASCPRN
  3459.        ACCM RDCPNT
  3460.        MEMA (115
  3461.        ACCM REDCNT
  3462. NUAPRN,MEMA @ RDCPNT
  3463.        MPOM RDCPNT
  3464.        A-MZ (215
  3465.        ZERZ
  3466.        JMP @ ASCPRN
  3467.        JMS @ ZTYPE
  3468.        MMOMZ REDCNT
  3469.        JMP NUAPRN
  3470.        JMP @ ASCPRN
  3471. /UNPACKING ROUTINE FOR LARGE TEXT BLOCKS
  3472. /GIVES A CRLF WHEN A 77 IS FOUND
  3473. /AND EXITS WHEN A 74 IS FOUND
  3474. TXPCK,0
  3475.        MEMA (26
  3476.        ACCM TUNCNT
  3477.        MEMA @ TXPCK
  3478.        ACCM TX100
  3479.        MPOM TXPCK
  3480. TX200,MEMA @ TX100
  3481.        JMS TX300
  3482. TX600,MPOM TX100
  3483.        JMP TX200
  3484. TX300,0
  3485.        ACCM TX400
  3486.        RASH 14
  3487.        JMS TX500
  3488.        RASH 6
  3489.        JMS TX500
  3490.        JMS TX500
  3491.        JMP @ TX300
  3492. TX500,0
  3493.        ANDA (77
  3494.        A-MZ (77
  3495.        ZERZ
  3496.        JMP NEXLIN
  3497.        A-MZ (74
  3498.        ZERZ
  3499.        JMP @ TXPCK
  3500.        A+MA (240
  3501.        JMS @ ZTYPE
  3502.        MEMA TX400
  3503.        JMP @ TX500
  3504. NEXLIN,JMS @ ZCRLF
  3505.        MMOMZ TUNCNT
  3506.        JMP TX600
  3507. KBWAIT,JMS @ ZSREAD
  3508.        A-MZ ("Q
  3509.        ZERZ
  3510.        JMP @ TXPCK
  3511.        A-MZ (215
  3512.        ZERZ
  3513.        JMP ONELIN
  3514.        A-MZ (240
  3515.        JMP KBWAIT
  3516.        MEMA (26
  3517.        ACCM TUNCNT
  3518.        JMP TX600
  3519. ONELIN,ONEM TUNCNT
  3520.        JMP TX600
  3521. TX100,0
  3522. TX400,0
  3523. TUNCNT,0
  3524. /LOAD THE DIRECTORY AT 3000 (D) OR 4000 (F)
  3525. /USED IN TRANSMIT MODE
  3526. DIRLOD,0
  3527.        ZERM @ ERRFLG
  3528.        MEMA UNIT       /SET UNIT & RECORD
  3529.        A+MA (3
  3530.        ACCM SDIREC
  3531.        MEMA RECSIZ      /SET NIMBER OF WORDS
  3532.        ACCM SDWRDS
  3533.        MEMA SAVSRT     /SET DIR START
  3534.        ACCM DIRSRT
  3535.        ZERA
  3536.        JMS @ DISK      /DO THE LOAD
  3537. SDIREC,0
  3538. SDWRDS,0
  3539. DIRSRT,0
  3540.        MEMA DIRSRT      /INITIALISE DIR POINTER
  3541.        A-MA (5
  3542.        ACCM @ ZDIRPN
  3543.        MEMA @ ERRFLG    /CHECK FOR ERRORS
  3544.        EXCT ZAC
  3545.        JMP @ DIRLOD     /ALL IS WELL
  3546.        JMS @ ZCRLF         /REPORT ERROR
  3547.        JMS @ ZUNPCK
  3548.        ERR6
  3549.        ZERM @ ERRFLG
  3550.        JMP @ ZCOMBA
  3551. /PREPARE TO LOAD FILE
  3552. LODSET,0
  3553.        ZERM LASFLG
  3554.        MEMA @ ZSIZE
  3555.        ACCM WORDS
  3556.        ACCM WRDTOT
  3557.        ZERM WRDSTO
  3558.        ZERM TOTLOD
  3559.        ZERM ARWDS
  3560.        MEMA RECSIZ
  3561.        ACCM REDWRD
  3562. FINSET,MEMA UNIT
  3563.        A+MA @ ZFRSTR
  3564.        AMOM REDREC
  3565.        JMP @ LODSET
  3566. /FIND LARGEST EMPTY SPACE ON DISK
  3567. GETPAD,0
  3568.        JMS DIRFIN
  3569.        ZERM @ OARG2
  3570.        MONM @ DISOLV
  3571.        JMS @ DIRFUN
  3572.        1
  3573.        2
  3574.        NULNAM
  3575.        ZERZ
  3576.        STOP
  3577.        MEMA @ OARG2
  3578.        EXCT AC19
  3579.        ANGA
  3580.        ACCM PADSIZ
  3581.        MEMA @ OARG1
  3582.        ACCM PADST
  3583.        A+MA UNIT
  3584.        ACCM RITREC
  3585.        ZERM @ ERRFLG
  3586.        JMP @ GETPAD
  3587. PADST, 0                   /STARTING RECORD OF SPACE
  3588. PADSIZ,0               /SIZE OF SPACE
  3589. NULNAM,0
  3590. /MAKE THE DIRECTORY ENTRY
  3591. DIRENT,0
  3592.        JMS DIRFIN
  3593.        MEMA PADST
  3594.        ACCM @ OARG1
  3595.        MEMA WRDSTO
  3596.        ACCM @ OARG2
  3597.        MEMA @ ZMLA
  3598.        ACCM @ OARG3
  3599.        MEMA @ ZPSA
  3600.        ACCM @ SYSTRT
  3601.        MEMA @ ZFILN1
  3602.        LLSH 2
  3603.        SKIP AC0
  3604.        APOA
  3605.        RLSH 2
  3606.        MEMZ @ ZASFLA
  3607.        ACCM @ ZFILN1
  3608.        JMS @ DIRFUN
  3609.        1
  3610.        1
  3611.        FILNAM
  3612.        STOP
  3613.        JMP @ DIRENT
  3614. DATMEM,100000
  3615. /CALL DIRFUN INTO CORE
  3616. /USED ONLY IN RECEIVE MODE
  3617. DIRFIN,0
  3618.        MEMA (5
  3619.        ACCM RETRYS
  3620. RETRY, ZERM @ ERRFLG
  3621.        MEMA UNIT
  3622.        A+MA (7
  3623.        ACCM DFREC
  3624.        ZERA
  3625.        JMS @ DISK 
  3626. DFREC, 0
  3627.        600
  3628.        7000
  3629.        ZERM @ DEVDIR
  3630.        MMOZ @ ERRFLG
  3631.        JMP @ DIRFIN
  3632.        MMOMZ RETRYS
  3633.        JMP RETRY
  3634.        JMS @ ZUNPCK
  3635.        ERR6
  3636.        JMS @ ZCRLF
  3637.        ZERM @ ERRFLG
  3638.        JMP @ ZCOMBA
  3639. RETRYS,0
  3640. /PREPARE TO LOAD <=1 RECORD
  3641. NEXREC,0
  3642.        MPOM REDREC     /BUMP RECORD
  3643.        MEMA WORDS      /MORE THAN RECSIZ TO GO?
  3644.        A-MA RECSIZ
  3645.        EXCT AC19 ZAC
  3646.        JMP LASMOV      /NO, LAST LOAD
  3647.        MEMA RECSIZ     /YES
  3648.        M-AM WORDS      /DECREMENT WORDS
  3649.        JMP @ NEXREC
  3650. LASMOV,ONEM LASFLG     /FLAG FINAL TRANDFER
  3651.        MEMA WORDS      /SET WORD COUNT
  3652.        ACCM REDWRD
  3653.        JMS CLDBUF      /CLEAR DISK BUFFER
  3654.        JMP @ NEXREC
  3655. /LOAD UP TO ONE RECORD AT 0
  3656. LOAD,  0
  3657.        MEMA (5
  3658.        ACCM NUTRYS
  3659. NEXTRY,ZERM @ ERRFLG
  3660.        ZERA
  3661.        JMS @ DISK
  3662. REDREC,0
  3663. REDWRD,0
  3664.        0
  3665.        MEMA REDWRD
  3666.        A+MM TOTLOD
  3667.        MEMA @ ERRFLG
  3668.        EXCT ZAC
  3669.        JMP @ LOAD          /ALL IS WELL
  3670.        MMOMZ NUTRYS        /DISK READ ERROR
  3671.        JMP NEXTRY          /FOUR MORE TRIES
  3672.        JMS @ ZUNPCK
  3673.        ERR6
  3674.        JMS @ ZCRLF
  3675.        ZERM @ ERRFLG
  3676.        JMP @ LOAD
  3677. NUTRYS,0
  3678. /WRITE UP TO ONE RECORD FROM 0, DON'T OVERRUN PADSIZ
  3679. /BUMP THE RECORD NUMBER
  3680. WRITE, 0
  3681.        MEMA PADSIZ
  3682.        A-MA WRDSTO
  3683.        EXCT AC19 ZAC
  3684.        JMP FULLUP
  3685.        ONEA
  3686.        JMS @ DISK 
  3687. RITREC, 0
  3688. RITWRD, 0
  3689.        0
  3690.        MEMA RITWRD
  3691.        A+MM WRDSTO
  3692.        MPOM RITREC
  3693.        JMP @ WRITE
  3694. FULLUP,JMS @ ZCRLF
  3695.        JMS @ ZUNPCK
  3696.        FU
  3697.        JMS @ ZCRLF
  3698.        ONEM @ ZCZFLG
  3699.        JMP @ WRITE
  3700. FU,    TEXT %DISK FULL%
  3701. /SAVE THE MSA
  3702. SAVE,  0
  3703.        MPOA UNIT
  3704.        ACCM KUNIT
  3705.        MEMA SAVWRD
  3706.        ACCM SWRD
  3707.        MEMA SAVSRT
  3708.        ACCM SSRT
  3709.        ONEA
  3710.        JMS @ DISK
  3711. KUNIT,0
  3712. SWRD,  0
  3713. SSRT,  0
  3714.        JMP @ SAVE
  3715. /IDENTIFY DISK UNIT CURRENTLY IN USE
  3716. /RETURNS WITH RESULT IN ACC: 0=FLOPPY, 1=DIABLO
  3717. DISKID,0
  3718.        MEMA @ IDPNT
  3719.        A-MZ IDNUM
  3720.        JMP DIABID
  3721.        ZERA
  3722.        JMP @ DISKID     /FLOPPY DISK
  3723. DIABID,ONEA
  3724.        JMP @ DISKID     /DIABLO
  3725. IDPNT, 7602
  3726. IDNUM, 1001
  3727. /DO A SUMMARY DIRECTORY LISTING
  3728. DIRLST,0
  3729.        ONEM @ ZCMDFL
  3730.        JMS @ ZCRLF
  3731.        JMS @ ZCRLF
  3732.        JMS @ ZUNPCK
  3733.        DLST
  3734.        JMS SAVE
  3735.        JMS DIRFIN
  3736.        JMS @ DIRFUN
  3737.        1
  3738.        0
  3739.        1
  3740.        ACCA
  3741.        JMS @ DISOLV
  3742.        JMP @ DIRLST
  3743. DLST,  TEXT % - DIRECTORY -%
  3744. USRNAM,BLOCK 20
  3745. PASWRD,BLOCK 20
  3746. /RE-STORE KERMIT AFTER CONFIGURATION
  3747. NVSTO, 0
  3748.        ZERM INTFLG
  3749.        JMS SAVE
  3750.        JMS DIRFIN       /FIND KERMIT ON DISK
  3751.        JMS @ DIRFUN
  3752.        1
  3753.        2
  3754.        NVNAM
  3755.        JMP NONSYM
  3756.        JMS @ DISOLV
  3757.        MEMA @ OARG1
  3758.        A+MA UNIT
  3759.        ACCM NVREC
  3760.        ONEA             /REPLACE WITH NEW VERSION
  3761.        JMS @ DISK
  3762. NVREC, 0
  3763.        16000
  3764.        102000
  3765.        ONEM INTFLG
  3766.        JMP @ NVSTO
  3767. NONSYM,JMS @ DISOLV
  3768.        JMS @ ZCRLF
  3769.        JMS @ ZUNPCK
  3770.        NVNAM
  3771.        JMS @ ZUNPCK
  3772.        MISING
  3773.        JMS @ ZCRLF
  3774.        ONEM INTFLG
  3775.        JMP @ ZCOMBA
  3776. MISING,TEXT % NOT FOUND, SO CANNOT CONFIGURE%
  3777. NVNAM, TEXT %KERMIT%
  3778. /CLEAR DISK BUFFER 0-2000/3000
  3779. CLDBUF,0
  3780.        ZERM CLBPNT
  3781.        MEMA RECSIZ
  3782.        ACCM CLBCNT
  3783. CBLUP,ZERM @ CLBPNT
  3784.        MPOM CLBPNT
  3785.        MMOMZ CLBCNT
  3786.        JMP CBLUP
  3787.        JMP @ CLDBUF
  3788. CLBPNT,0
  3789. CLBCNT,0
  3790. /INITIALISE ARROW POSITION ON LHS
  3791. /WITH ARWDS=0 AND A DEFAULT WRDTOT
  3792. SARROW,0
  3793.        ZERM ARWDS
  3794.        MPOA (1777
  3795.        ACCM WRDTOT
  3796.        JMP @ SARROW
  3797. /DISPLAY AN ARROW ON THE CRT TO INDICATE PROGRESS, IF RTFLG=1
  3798. /A DIFFERENT ELEMENT GETS DISPLAYED ON EACH ENTRY
  3799. ARROW,0
  3800.        MPOMA ARNUM
  3801.        A-MZ (1
  3802.        ZERZ
  3803.        JMP ARCALC
  3804.        A-MZ (2
  3805.        ZERZ
  3806.        JMP LHSDOT
  3807.        A-MZ (3
  3808.        ZERZ
  3809.        JMP SHAFT
  3810.        A-MZ (4
  3811.        ZERZ
  3812.        JMP HEAD
  3813.        ZERM ARNUM
  3814.        JMP RHSDOT
  3815. ARNUM, 0
  3816. /CALCULATE POSITION OF TIP OF ARROW FROM
  3817. /  ARTIP = SHFSIZ + (ARWDS/WRDTOT)*(TOPHOR - SHFSIZ)
  3818. ARCALC,MEMA WRDTOT
  3819.        ACCM ARDIV
  3820.        MEMA TOPHOR
  3821.        A-MA SHFSIZ
  3822.        ACCM ARMUL
  3823.        MEMA ARWDS
  3824.        TACMQ
  3825.        MULT
  3826. ARMUL, 0
  3827.        CLL
  3828.        ACCM ARHIGH
  3829.        TMQAC
  3830.        ACCM ARLOW
  3831.        EXCT AC19
  3832.        STL
  3833.        LASH 1
  3834.        TACMQ
  3835.        MEMA ARHIGH
  3836.        LASH 1
  3837.        EXCT L
  3838.        APOA
  3839.        DIVD
  3840. ARDIV, 0
  3841.        TMQAC
  3842.        A+MA SHFSIZ
  3843.        ACCM ARTIP
  3844.        JMP @ ARROW
  3845. TOPHOR,37774
  3846. ARHIGH,0
  3847. ARLOW, 0
  3848. ARTIP, 0
  3849. /DISPLAY A VERTICAL LINE ON THE LHS TO SHOW START
  3850. LHSDOT,ZERA
  3851.        JMS MIDDOT
  3852.        JMP @ ARROW
  3853. /DISPLAY A VERTICAL LINE ON THE RHS TO SHOW DESTINATION
  3854. RHSDOT,MEMA TOPHOR
  3855.        JMS MIDDOT
  3856.        JMP @ ARROW
  3857. /DISPLAY VERTICAL LINE AT X-POSITION IN ACC ON ENTRY
  3858. MIDDOT,0
  3859.        TACXD
  3860.        MEMA DOTSRT
  3861.        ACCM DOTHIT
  3862.        MEMA (10
  3863.        ACCM DOTCNT
  3864.        ZERA
  3865. DOTLUP,MEMA DOTINC
  3866.        A+MMA DOTHIT
  3867.        TACYD INTENS
  3868.        MMOMZ DOTCNT
  3869.        JMP DOTLUP
  3870.        JMP @ MIDDOT
  3871. DOTCNT,0
  3872. DOTHIT,0
  3873. DOTINC,10000
  3874. DOTSRT,140000
  3875. /DRAW SHAFT OF ARROW
  3876. /RHS X-CRT-VALUE TO BE AR ARPOS
  3877. SHAFT, MEMA ARTIP
  3878.        A-MA SHFSIZ
  3879.        ACCM SHFPNT
  3880.        TACXD
  3881.        MEMA SHFNUM
  3882.        ACCM SHFCNT
  3883. SHFLUP,MEMA YHITE
  3884.        TACYD INTENS
  3885.        MEMA SHFINC
  3886.        A+MMA SHFPNT
  3887.        TACXD
  3888.        MMOMZ SHFCNT
  3889.        JMP SHFLUP
  3890.        JMP @ ARROW
  3891. SHFNUM,10
  3892. SHFCNT,0
  3893. SHFSIZ,1200
  3894. SHFPNT,0
  3895. SHFINC,120
  3896. /DRAW HEAD OF ARROW WITH ITS APEX ON X-AXIS AT ARPOS
  3897. HEAD,  MEMA HEDNUM
  3898.        ACCM HEDCNT
  3899.        MEMA ARTIP
  3900.        ACCM XHEDPT
  3901.        TACXD
  3902.        MEMA YHITE
  3903.        ACCM YHEDP1
  3904.        ACCM YHEDP2
  3905.        TACYD INTENS
  3906. HEDLUP,MEMA HXINC
  3907.        M-AMA XHEDPT
  3908.        TACXD
  3909.        MEMA HYINC
  3910.        A+MMA YHEDP1
  3911.        TACYD INTENS
  3912.        MEMA HYINC
  3913.        M-AMA YHEDP2
  3914.        TACYD INTENS
  3915.        MMOMZ HEDCNT
  3916.        JMP HEDLUP
  3917.        JMP @ ARROW
  3918. HEDNUM,5
  3919. HEDCNT,0
  3920. XHEDPT,0
  3921. YHEDP1,0
  3922. YHEDP2,0
  3923. HXINC, 60
  3924. HYINC, 10000
  3925. YHITE, 200000
  3926. /ARROW TESTER FOR NICBUG
  3927. ARWTST,0
  3928.        MEMA AWTNUM
  3929.        ACCM AWTCNT
  3930. AWTLUP,JMS ARROW
  3931.        MMOMZ AWTCNT
  3932.        JMP AWTLUP
  3933.        JMP @ ARWTST
  3934. AWTNUM,100000
  3935. AWTCNT,0
  3936. /OFFER HELP
  3937. EXPLAN,0
  3938.        JMS @ ZCRLF
  3939.        JMS TXPCK
  3940.        HLPHLP
  3941.        JMP @ EXPLAN
  3942. /PRINT INSTRUCTIONS
  3943. HELP,  0
  3944.        ONEM @ ZCMDFL
  3945.        JMS @ ZCRLF
  3946.        JMS @ ZCRLF
  3947.        JMS TXPCK
  3948.        COMSUM
  3949.        JMS @ ZCRLF
  3950.        JMP @ HELP
  3951. /PRINT NOTES ON OPERATION
  3952. NOTPRN,0
  3953.        ONEM @ ZCMDFL
  3954.        JMS @ ZCRLF
  3955.        JMS @ ZCRLF
  3956.        JMS TXPCK
  3957.        NOTES
  3958.        JMS @ ZCRLF
  3959.        JMP @ NOTPRN
  3960. /TYPE DECIMAL INTEGER
  3961. /NUMBER TO BE IN ACC ON ENTRY
  3962. DECPRN,0
  3963.     ZERM    DIGCNT
  3964. DECOU1,    LASH    1
  3965.     TACMQZ
  3966.     DIVD
  3967.     12    /NUMBER BASE = DECIMAL
  3968.     RISH    1
  3969.     ACCM    @DIGPTR
  3970.     MPOM    DIGPTR    /PUSH A DIGIT
  3971.     MPOM    DIGCNT
  3972.     TMQAC
  3973.     SKIP    ZAC
  3974.     JMP    DECOU1
  3975. DECOU2,    MMOM    DIGPTR
  3976.     MEMA    @DIGPTR    /POP A DIGIT
  3977.     A+MA    (260
  3978.        JMS @ ZTYPE
  3979.     MMOMZ    DIGCNT
  3980.     JMP    DECOU2
  3981.     JMP    @DECPRN
  3982. DIGCNT,0
  3983. DIGPTR,    #+1
  3984.     BLOCK    7    /SPACE FOR 7 DIGITS
  3985. /FLOPPY DISK PARAMETERS
  3986. FUNIT, 1000
  3987. FRECSZ,2000
  3988. FMAXRC,231
  3989. FDISOL,7747
  3990. FERRFL,7735
  3991. FDISK, 7613
  3992. FSVWRD,3600
  3993. FSVSRT,4000
  3994. FLSRT, FUNIT
  3995. /DIABLO DISK PARAMETERS
  3996. DUNIT, 100000
  3997. DRECSZ,3000
  3998. DMAXRC,624
  3999. DDISOL,7751
  4000. DERRFL,7704
  4001. DDISK, 7612
  4002. DSVWRD,4600
  4003. DSVSRT,3000
  4004. DLSRT, DUNIT
  4005. /PARAMETERS FOR DISK IN USE
  4006. UNIT, 0                /1000 (OR 100000)
  4007. RECSIZ,0                /2000 (OR 3000)
  4008. MAXREC,0                /231 (OR 624)
  4009. DISOLV,0                /7747 (OR 7751)
  4010. ERRFLG,0                /7735 (OR 7704)
  4011. DISK, 0                /7613 (OR 7612)
  4012. SAVWRD,0               /NO. OF WORDS TO SAVE
  4013. SAVSRT,0               /START OF SAVE AREA
  4014. DPST1, UNIT
  4015. /COMMON DISK PARAMETERS
  4016. MONTOR,7600
  4017. OARG1, 7770
  4018. OARG2, 7771
  4019. OARG3, 7772
  4020. SYSTRT,7760
  4021. DEVDIR,7764
  4022. DIRFUN,7000
  4023. /PAGE 110000 POINTERS
  4024. ZCOMBA,COMBAK
  4025. ZCMDFL,CMDFLG
  4026. ZREAD, READ
  4027. ZSREAD,SREAD
  4028. ZUNPCK,UNPCK
  4029. ZTYPE, TYPE
  4030. ZCRLF, CRLF
  4031. ZIGBFL,IGBFLG
  4032. ZNULAF,NULAFG
  4033. ZACOBU,ACOBUF
  4034. ZEMPTO,EMPTOP
  4035. ZRTFLG,RTFLG
  4036. /PAGE 112000 POINTERS
  4037. ZCZFLG,CZFLG
  4038. ZCLOSI,CLOSIT
  4039. /PAGE 114000 POINTERS
  4040. ZDIRPN,DIRPNT
  4041. ZSIZE, SIZE
  4042. ZFRSTR,FRSTRK
  4043. ZMLA,  MLA
  4044. ZPSA,  PSA
  4045. ZFILN1,FILNAM+1
  4046. ZASFLA,ASFLAG
  4047. /TEXT FOR INTRODUCTORY MESSAGE
  4048. INTMES,TEXT %NIC-80 KERMIT 1.76%
  4049. HLPHLP,TEXT %TYPE "H" FOR HELP%
  4050. 740000
  4051. /
  4052. /PVE McCLINTOCK
  4053. /LANCASTER UNIVERSITY 1994
  4054. $
  4055.