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

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