home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / ZSYS / SIMTEL20 / ZCPR3 / SUB.MAC < prev    next >
Text File  |  2000-06-30  |  23KB  |  1,043 lines

  1. ;
  2. ; PROGRAM NAME:  SUB
  3. ; AUTHOR:  RICHARD CONN (From SuperSUB Ver 1.1 by Ron Fowler)
  4. ; VERSION:  3.0
  5. ; DATE:  18 May 84
  6. ; PREVIOUS VERSIONS:  2.3 (6 Jan 83) - Called SUB2.ASM
  7. ; PREVIOUS VERSIONS:  2.2 (7 DEC 82), 2.1 (14 NOV 82), 2.0 (11 OCT 82)
  8. ; PREVIOUS VERSIONS:  1.4 (10 OCT 81), 1.3 (7 OCT 81)
  9. ; PREVIOUS VERSIONS:  1.2 (5 OCT 81), 1.1 (3 OCT 81), 1.0 (1 OCT 81)
  10. ; NOTE:  FOR USE WITH ZCPR3
  11. ;
  12. VERS    EQU    30
  13. z3env    SET    0f400h
  14.  
  15. ;
  16. ;    SUB is derived from Ron's SuperSUB program; it provides a different
  17. ; format for the command line, a command-search hierarchy like ZCPR3, a
  18. ; resetting of the DMA address, several additional functions, and there are
  19. ; several other additions/changes.  Additionally, ZCPR3-specific enhancements,
  20. ; such as appending the rest of the multiple command line to the command file
  21. ; and allowing multiple commands on a single line, are permitted.
  22. ;
  23. ;    SuperSUB, VERSION 1.1 (09/13/81)        by Ron Fowler
  24. ;    2/18/81 (first written)                 WESTLAND, MICH.
  25. ;
  26. ;
  27. ; This program is intended as a replacement for the
  28. ; SUBMIT program provided with CP/M.  It provides sev-
  29. ; eral new facilities:
  30. ;    1) Nestable SUBMIT runs
  31. ;    2) Interactive entry of SUBMIT job (no need
  32. ;       to use an editor for simple SUBMIT runs)
  33. ;    3) Command line entry of small SUBMIT jobs
  34. ;    4) Ability to enter blank lines in an edited
  35. ;       SUBMIT file
  36. ;    5) User customization of number of parameters
  37. ;       and drive to send $$$.SUB to
  38. ;
  39.  
  40. ;
  41. ; DEFINE BOOLEANS
  42. ;
  43. FALSE    EQU    0
  44. TRUE    EQU    NOT FALSE
  45.  
  46. ;
  47. ;        --  User customizable options --
  48. ;
  49.  
  50. FORCE$SUB    EQU    FALSE    ;TRUE IF SUBMITTED FILE MUST BE OF TYPE .SUB
  51. TIME$CONST    EQU    0C000H    ;DELAY FOR RINGING BELL
  52. NPAR        EQU    10    ;NUMBER OF ALLOWABLE PARAMETERS
  53. CPBASE        EQU    0    ;SET TO 4200H FOR HEATH CP/M
  54. OPT        EQU    '/'    ;OPTION DELIMITER CHAR
  55. PDELIM        EQU    '$'    ;PARAMETER DELIMITER
  56.  
  57. ;
  58. ; SYSLIB AND Z3LIB ROUTINES
  59. ;
  60.     EXT    Z3INIT,PFIND,GETCL1
  61.     EXT    LOGUD,GETUD,PUTUD
  62.     EXT    INITFCB
  63.     EXT    PSTR,PRINT,QPRINT,COUT,CRLF,CAPS,PHLDC
  64.     EXT    CODEND
  65.  
  66. ;
  67. ; CP/M DEFINITIONS
  68. ;
  69. FGCHAR    EQU    1    ;GET CHAR FUNCTION
  70. DIRIOF    EQU    6    ;DIRECT CONSOLE I/O
  71. RDBUF    EQU    10    ;READ CONSOLE BUFFER
  72. LOGIN    EQU    14    ;LOG IN DISK
  73. OPENF    EQU    15    ;OPEN FILE FUNCTION
  74. CLOSEF    EQU    16    ;CLOSE FILE FUNCTION
  75. DELETF    EQU    19    ;DELETE FILE FUNCTION
  76. READF    EQU    20    ;READ RECORD FUNCTION
  77. WRITEF    EQU    21    ;WRITE RECORD FUNCTION
  78. MAKEF    EQU    22    ;MAKE (CREATE) FILE FUNCTION
  79. GETDSK    EQU    25    ;RETURN CURRENT DISK
  80. SETDMA    EQU    26    ;SET DMA ADDRESS
  81. UCODE    EQU    32    ;GET/SET USER CODE
  82. ;
  83. UDFLAG    EQU    CPBASE+4
  84. BDOS    EQU    CPBASE+5
  85. ;
  86. CURIND    EQU    '$'    ;CURRENT USER/DISK INDICATOR
  87. FCB    EQU    5CH    ;DEFAULT FILE CONTROL BLOCK
  88. FCBEX    EQU    12    ;FCB OFFSET TO EXTENT FIELD
  89. FCBRC    EQU    15    ;FCB OFFSET TO RECORD COUNT
  90. FCBNR    EQU    32    ;FCB OFFSET TO NEXT RECORD
  91. FN    EQU    1    ;FCB OFFSET TO FILE NAME
  92. FT    EQU    9    ;FCB OFFSET TO FILE TYPE
  93. TBUF    EQU    CPBASE+80H    ;DEFAULT BUFFER
  94. TPA    EQU    CPBASE+100H    ;TRANSIENT PROGRAM AREA
  95. ;
  96. PUTCNT    EQU    TBUF    ;COUNTER FOR OUTPUT CHARS
  97. ;
  98. ; DEFINE SOME TEXT CHARACTERS
  99. ;
  100. CTRLC    EQU    'C'-'@'
  101. CTRLZ    EQU    'Z'-'@'
  102. BEL    EQU    7    ;RING BELL
  103. CR    EQU    13    ;CARRIAGE RETURN
  104. LF    EQU    10    ;LINE FEED
  105. TAB    EQU    9
  106.  
  107. ;
  108. ; Environment Definition
  109. ;
  110.     if    z3env ne 0
  111. ;
  112. ; External ZCPR3 Environment Descriptor
  113. ;
  114.     jmp    start
  115.     db    'Z3ENV'    ;This is a ZCPR3 Utility
  116.     db    1    ;External Environment Descriptor
  117. z3eadr:
  118.     dw    z3env
  119. start:
  120.     lhld    z3eadr    ;pt to ZCPR3 environment
  121. ;
  122.     else
  123. ;
  124. ; Internal ZCPR3 Environment Descriptor
  125. ;
  126.     MACLIB    Z3BASE.LIB
  127.     MACLIB    SYSENV.LIB
  128. z3eadr:
  129.     jmp    start
  130.     SYSENV
  131. start:
  132.     lxi    h,z3eadr    ;pt to ZCPR3 environment
  133.     endif
  134.  
  135. ;
  136. ; Start of Program -- Initialize ZCPR3 Environment
  137. ;
  138.     call    z3init    ;initialize the ZCPR3 Env and the VLIB Env
  139.     LXI    H,0    ;SAVE STACK IN CASE
  140.     DAD    SP    ;  ONLY HELP REQUESTED
  141.     SHLD    SPSAVE    ;(NOT OTHERWISE USED)
  142.     CALL    PUTUD    ;SAVE HOME DIR
  143.     CALL    QPRINT
  144.     DB    'SUB  Version ',VERS/10+'0','.',(VERS MOD 10)+'0',0
  145.  
  146.     CALL    CODEND    ;SET UP EXTERNAL BUFFERS
  147.     SHLD    CLBUF    ;SET PTR
  148.     MVI    M,128    ;ALLOW 128 CHARS
  149.     LXI    D,100H    ;FREE SPACE
  150.     DAD    D    ;PT TO FREE AREA
  151.     SHLD    FREMEM    ;SET PTR TO FREE MEMORY AREA
  152.     SPHL        ;SET STACK PTR
  153.  
  154.     LDA    FCB+1    ;ANYTHING ON CMD LINE?
  155.     CPI    ' '
  156.     JZ    HELP    ;NO, GO PRINT HELP
  157.     CALL    INITVAR    ;INITIALIZE THE VARIABLE AREA
  158.     CALL    GETPAR    ;GET COMMAND LINE PARAMETERS AND EXTRACT OPTION
  159.     CALL    ABORT    ;PERFORM ABORT IF FLAG SET
  160.     CALL    SETUP    ;SET UP READ OF SUBMIT FILE
  161.     CALL    RDFILE    ;READ THE SUBMIT FILE
  162.     CALL    WRSET    ;SET UP WRITE OF "$$$.SUB"
  163.     CALL    WRSUB    ;WRITE "$$$.SUB"
  164.     JMP    CPBASE    ;GO START THE SUBMIT
  165. ;
  166. ;    SETUP SETS UP THE FILE CONTROL BLOCK
  167. ;    FOR READING IN THE .SUB TEXT FILE
  168. ;
  169. SETUP:
  170.     LXI    H,FCB+FT    ;LOOK AT FIRST CHAR OF
  171.     MOV    A,M        ;FILE TYPE.  IF IT IS
  172.     CPI    ' '        ;BLANK, THEN GO MOVE
  173.     JZ    PUTSUB        ;"SUB" INTO FT FIELD
  174.  
  175.     IF    FORCE$SUB    ;FILE TYPE MUST BE OF .SUB
  176.     LXI    D,SUBTYP    ;FILE TYPE MUST BE .SUB
  177.     MVI    B,3        ;3 BYTES
  178.     CALL    COMPAR
  179.     JNZ    NOTFND    ;FILE NOT FOUND IF NO TYPE MATCH
  180.     ENDIF
  181.  
  182.     RET        ;  IF NOT BLANK, THEN ACCEPT ANY FILE TYPE
  183. ;
  184. ;    MOVE "SUB" INTO THE FILE TYPE
  185. ;
  186. PUTSUB:
  187.     XCHG        ;BY CONVENTION, MOVE FROM
  188.     LXI    H,SUBTYP    ; @HL TO @DE
  189.     MVI    B,3
  190.     CALL    MOVE
  191.     RET
  192. ;
  193. ; MOVE # BYTES IN B REGISTER FROM @HL TO @DE
  194. ;
  195. MOVE:
  196.     MOV    A,M    ;PICK UP
  197.     STAX    D    ;PUT DOWN
  198.     INX    H    ;I'M SURE
  199.     INX    D    ; YOU'VE SEEN THIS
  200.     DCR    B    ; BEFORE...
  201.     JNZ    MOVE    ;100 TIMES AT LEAST
  202.     RET        ;I KNOW I HAVE!
  203. ;
  204. ; GETPAR MOVES THE SUBSTITUTION PARAMETERS SPECIFIED
  205. ; IN THE COMMAND LINE INTO MEMORY, AND STORES THEIR
  206. ; ADDRESSES IN THE PARAMETER TABLE.  THIS ALLOWS
  207. ; SUBSTITUTION OF $1, $2, ETC., IN THE SUBMIT COMMANDS
  208. ; WITH THEIR ACTUAL VALUES SPECIFED IN THE COMMAND
  209. ; LINE.
  210. ;
  211. GETPAR:
  212.     XRA    A    ;A=0
  213.     STA    AFLAG    ;TURN OFF ABORT COMMAND
  214.     LXI    H,TBUF+1    ;WHERE WE FIND THE COMMAND TAIL
  215.     CALL    SCANTO    ;SKIP SUBMIT FILE NAME
  216.     STA    OPTION    ;FIRST CHAR OF CMD LINE IS OPTION
  217.     RC        ;LINE ENDED?
  218.     CPI    OPT    ;NO, CHECK OPTION
  219.     JNZ    GLP0    ;NOT KEYBOARD INP, READ FILE
  220.     INX    H    ;POINT PAST '/'
  221.     MOV    A,M    ;GET OPTION CHAR
  222.     CPI    'A'    ;ABORT COMMAND
  223.     JZ    GPARABT
  224.     CPI    'I'    ;INTERACTIVE MODE
  225.     RZ        ;RETURN IF SO
  226.     JMP    HELP    ;HELP OTHERWISE
  227. GPARABT:
  228.     MVI    A,0FFH    ;TURN ON ABORT FLAG
  229.     STA    AFLAG
  230.     INX    H    ;GET POSSIBLE BELL OPTION
  231.     MOV    A,M
  232.     CPI    'B'    ;BELL OPTION
  233.     RNZ
  234.     MVI    A,0FFH    ; SET BELL FLAG
  235.     STA    BELL$FLAG
  236.     RET
  237. GLP0:
  238.     MOV    A,M    ;INPUT IS FROM A .SUB FILE..THIS
  239.     INX    H    ;  CODE SKIPS OVER THE NAME OF
  240.     ORA    A    ;  THE SUB FILE TO GET TO THE
  241.     RZ        ;  COMMAND LINE PARAMETERS
  242.     CPI    ' '
  243.     JZ    GLP
  244.     CPI    TAB
  245.     JNZ    GLP0
  246. GLP:
  247.     CALL    SCANTO    ;PASS UP THE BLANKS
  248.     RC        ;CY RETURNED IF END OF CMD LINE
  249.     CALL    PUTPAR    ;NOW PUT THE PARAMETER INTO MEM
  250.     RC        ;CY RETURNED IF END OF CMD LINE
  251.     JMP    GLP    ;GET THEM ALL
  252. ;
  253. ; SCANTO SCANS PAST BLANKS TO THE FIRST NON-BLANK. IF
  254. ; END OF COMMAND LINE FOUND, RETURNS CARRY SET.
  255. ;
  256. SCANTO:
  257.     MOV    A,M
  258.     INX    H
  259.     ORA    A    ;SET FLAGS ON ZERO
  260.     STC        ;IN CASE ZERO FOUND (END OF CMD LIN)
  261.     RZ
  262.     CPI    ' '
  263.     JZ    SCANTO    ;SCAN PAST BLANKS
  264.     CPI    TAB    ;DO TABS TOO, JUST FOR
  265.     JZ    SCANTO    ;  GOOD MEASURE
  266.     DCX    H    ;FOUND CHAR, POINT BACK TO IT
  267.     ORA    A    ;INSURE CARRY CLEAR
  268.     RET
  269. ;
  270. ; PUTPAR PUTS THE PARAMETER POINTED TO BY HL INTO
  271. ; MEMORY POINTED TO BY "TXTPTR".  ALSO STORES THE
  272. ; ADDRESS OF THE PARAMETER INTO THE PARAMETER TABLE
  273. ; FOR EASY ACCESS LATER, WHEN WE WRITE $$$.SUB
  274. ;
  275. PUTPAR:
  276.     PUSH    H    ;SAVE POINTER TO PARM
  277.     LHLD    TXTPTR    ;NEXT FREE MEMORY
  278.     XCHG        ;  INTO DE
  279.     LHLD    TBLPTR    ;NEXT FREE AREA OF TABLE
  280.     MOV    A,M    ;NON-ZERO IN TABLE
  281.     ORA    A    ; INDICATES TABLE
  282.     JNZ    PAROVF    ; TABLE OVERFLOW (TOO MANY PARMS)
  283.     MOV    M,E    ;STORE THE PARM ADRS
  284.     INX    H
  285.     MOV    M,D
  286.     INX    H
  287.     SHLD    TBLPTR    ;SAVE TABLE PNTR FOR NEXT TIME
  288.     POP    H    ;GET BACK PARM POINTER
  289.     PUSH    D    ;SAVE FREE MEM POINTER BECAUSE
  290.             ;  WE WILL HAVE TO HAVE IT BACK
  291.             ;  LATER TO STORE THE LENGTH
  292.     INX    D    ;POINT PAST LENGTH STORAGE
  293.     MVI    B,0    ;INITIALIZE LENGTH OF PARM
  294. PPLP:
  295.     MOV    A,M    ;GET NEXT BYTE OF PARM
  296.     INX    H
  297.     ORA    A    ;TEST FOR END OF CMD LINE
  298.     JZ    PP2    ;JUMP IF END
  299.     CPI    ' '    ;TEST FOR END OF COMMAND
  300.     JZ    PP2
  301.     CPI    TAB    ;TAB ALSO ENDS COMMAND
  302.     JZ    PP2
  303.     STAX    D    ;PUT PARAMETER BYTE-BY-BYTE
  304.     INX    D    ;INTO FREE MEMORY
  305.     INR    B    ;BUMP LENGTH
  306.     JMP    PPLP
  307. PP2:
  308.     XCHG
  309.     SHLD    TXTPTR    ;NEW FREE MEMORY POINTER
  310.     POP    H    ;REMEMBER OUR LENGTH POINTER?
  311.     MOV    M,B    ;STORE THE LENGTH
  312.     XCHG        ;HAVE TO RETN HL > CMD LINE
  313.     ORA    A    ;NOW RETURN END OF LINE FLAG
  314.     STC
  315.     RZ        ;RETURN CY IF ZERO (EOL MARK)
  316.     CMC
  317.     RET
  318. ;
  319. ;
  320. ;    ABORT CHECKS TO SEE IF THE ABORT FLAG IS SET AND
  321. ;    EXECUTES THE ABORT FUNCTION IF SO
  322. ;
  323. ;
  324. ABORT:
  325.     LDA    AFLAG    ;GET THE FLAG
  326.     ORA    A    ;0=NO
  327.     RZ
  328.     CALL    PRINT
  329.     DB    CR,LF,' Strike ^C to Abort Command File - ',0
  330.     CALL    CHARINB    ;GET RESPONSE
  331.     CPI    CTRLC    ;ABORT?
  332.     JNZ    ABORT1    ;RETURN TO OPSYS
  333. ABORT0:
  334.     LXI    D,SUBFCB    ;DELETE SUBMIT FILE
  335.     MVI    C,DELETF
  336.     CALL    BDOS
  337.     CALL    PRINT
  338.     DB    ' ... Aborted',0
  339.     JMP    CPBASE    ;RETURN TO CP/M
  340. ABORT1:
  341.     CALL    PRINT
  342.     DB    ' ... Continuing',0
  343.     JMP    CPBASE    ; RETURN TO CP/M
  344. ;
  345. ;    INPUT CHAR FROM CON:; RING BELL EVERY SO OFTEN IF FLAG SET
  346. ;
  347. CHARINB:
  348.     LDA    BELL$FLAG    ; GET FLAG
  349.     ORA    A        ; 0=NO
  350.     JZ    CHARIN
  351.     PUSH    H        ; SAVE HL
  352. CHARINB$LOOP:
  353.     LXI    H,TIME$CONST    ; GET TIME CONSTANT
  354. CHARINB$LOOP1:
  355.     XTHL            ; LONG DELAY
  356.     XTHL
  357.     DCX    H        ; COUNT DOWN
  358.     MOV    A,H
  359.     ORA    L
  360.     JNZ    CHARINB$LOOP1
  361.     MVI    E,0FFH        ; REQUEST STATUS
  362.     MVI    C,DIRIOF    ; DIRECT I/O
  363.     CALL    BDOS
  364.     ORA    A        ; ANY INPUT?
  365.     JNZ    CHARINB$DONE
  366.     MVI    E,BEL        ; RING BELL
  367.     MVI    C,DIRIOF
  368.     CALL    BDOS
  369.     JMP    CHARINB$LOOP
  370. CHARINB$DONE:
  371.     POP    H        ; RESTORE HL
  372.     JMP    CAPS        ; CAPITALIZE CHAR
  373.  
  374. ;
  375. ;    INPUT CHAR FROM CON:; CAPITALIZE IT AND ECHO <CRLF>
  376. ;
  377. CHARIN:
  378.     MVI    C,FGCHAR    ;GET CHAR
  379.     CALL    BDOS
  380.     JMP    CAPS        ;CAPITALIZE
  381. ;
  382. ;    RDFILE READS THE .SUB FILE SPECIFIED
  383. ;    IN THE SUBMIT COMMAND INTO MEMORY
  384. ;
  385. RDFILE:
  386.     LXI    H,0    ;INIT LINE NUMBER
  387.     SHLD    LINNUM
  388.     LDA    OPTION    ;USING A FILE?
  389.     CPI    OPT    ;OPT OPTION TELLS
  390.     JNZ    RDFILE1    ;JUMP IF NOT
  391.     CALL    PRINT
  392.     DB    CR,LF,' Input Command Lines',0
  393.     CALL    CLFILL    ;GET FIRST LINE
  394.     JMP    LINE
  395. RDFILE1:
  396.     CALL    PRINT
  397.     DB    CR,LF,' Processing SUB File',0
  398.  
  399. ;  CHECK FOR .SUB FILE IN CURRENT USER/CURRENT DISK
  400.     LXI    D,FCB    ;WE ARE, OPEN IT
  401.     CALL    INITFCB    ;INIT FCB
  402.     MVI    A,0FFH    ;SEARCH CURRENT ALSO
  403.     CALL    PFIND    ;LOOK FOR FILE
  404.     JZ    NOTFND    ;FILE NOT FOUND
  405.     CALL    LOGUD    ;LOG INTO DIRECTORY
  406.     LXI    D,FCB    ;PT TO FCB
  407.     MVI    C,OPENF    ;OPEN FILE
  408.     CALL    BDOS
  409.     CALL    FILL    ;READ FIRST BLOCK
  410.     JNZ    NOTEXT    ;EMPTY FILE
  411. LINE:
  412.     LHLD    LINNUM    ;BUMP LINE NUMBER
  413.     INX    H
  414.     SHLD    LINNUM
  415.     LHLD    PREV    ;GET PREV PREVIOUS LINE POINTER
  416.     XCHG
  417.     LHLD    TXTPTR    ;GET CURRENT FREE MEM POINTER
  418.     SHLD    PREV    ;MAKE IT THE PREV LINE (FOR NXT PASS)
  419.     MOV    M,E    ;STORE AT BEGIN OF CURRENT LINE,
  420.     INX    H    ;  A POINTER TO THE PREVIOUS
  421.     MOV    M,D
  422.     INX    H
  423.     PUSH    H    ;LATER WE WILL PUT LENGTH HERE
  424.     INX    H    ;SKIP PAST LENGTH
  425.     MVI    C,0    ;INITIALIZE LENGTH TO ZERO
  426. LLP:
  427.     CALL    GNB    ;GET NEXT BYTE FROM INPUT SOURCE
  428.     CPI    CTRLZ    ;END OF FILE?
  429.     JZ    EOF    ;CY SET IF END OF FILE FOUND
  430.     ANI    7FH    ;MASK OUT MSB
  431.     CALL    CAPS    ;CONVERT TO UPPER CASE
  432.     CPI    LF    ;IGNORE LINEFEEDS
  433.     JZ    LLP
  434.     CPI    CR    ;IF IT'S A CARRIAGE RETURN,
  435.     JZ    EOL    ;  THEN DO END OF LINE
  436.     MOV    M,A    ;STORE ALL OTHERS INTO MEMORY
  437.     INX    H
  438.     CALL    SIZE    ;MAKE SURE NO MEMORY OVERFLOW
  439.     INR    C    ;BUMP CHAR COUNT
  440.     JM    LENERR    ;MAX OF 128 CHARS PER LINE
  441.     JMP    LLP    ;GO DO NEXT CHAR
  442. ;
  443. ;    DO END OF LINE SEQUENCE
  444. ;
  445. EOL:
  446.     SHLD    TXTPTR    ;SAVE FREE MEMORY POINTER
  447.     POP    H    ;CURRENT LINE'S LENGTH POINTER
  448.     MOV    M,C    ;STORE LENGTH AWAY
  449.     JMP    LINE    ;GO DO NEXT LINE
  450. ;
  451. ;    END OF TEXT FILE
  452. ;
  453. EOF:
  454.     SHLD    TXTPTR    ;SAVE FREE MEMORY POINTER
  455.     PUSH    B    ;SAVE LINE LENGTH
  456.     CALL    ZMCL    ;LOAD REST OF COMMAND LINE
  457.     POP    B    ;RESTORE LINE LENGTH
  458.     POP    H    ;CURRENT LINE'S LENGTH POINTER
  459.     MOV    M,C    ;STORE LENGTH AWAY
  460.     RET        ;ALL DONE READING SUB FILE
  461. ;
  462. ;  COPY COMMAND LINE INTO MEMORY BUFFER
  463. ;
  464. ZMCL:
  465.     CALL    GETCL1    ;GET ADDRESS OF COMMAND LINE BUFFER
  466.     MOV    A,H    ;CHECK FOR ANY
  467.     ORA    L
  468.     RZ
  469.     LHLD    LINNUM    ;BUMP LINE NUMBER
  470.     INX    H
  471.     SHLD    LINNUM
  472.     LHLD    PREV    ;GET PREV PREVIOUS LINE POINTER
  473.     XCHG
  474.     LHLD    TXTPTR    ;GET CURRENT FREE MEM POINTER
  475.     SHLD    PREV    ;MAKE IT THE PREV LINE (FOR NXT PASS)
  476.     MOV    M,E    ;STORE AT BEGIN OF CURRENT LINE,
  477.     INX    H    ;  A POINTER TO THE PREVIOUS
  478.     MOV    M,D
  479.     INX    H
  480.     PUSH    H    ;LATER WE WILL PUT LENGTH HERE
  481.     INX    H    ;SKIP PAST LENGTH
  482.     MVI    C,0    ;INITIALIZE LENGTH TO ZERO
  483.     XCHG        ;DE PTS TO NEXT PLACE TO STORE A BYTE
  484.     CALL    GETCL1    ;GET ADDRESS OF COMMAND LINE BUFFER
  485.     MOV    A,M    ;GET LOW
  486.     INX    H
  487.     MOV    H,M    ;GET HIGH
  488.     MOV    L,A    ;HL PTS TO FIRST BYTE OF MULTIPLE COMMAND LINE
  489.     MOV    B,M    ;GET FIRST CHAR IN LINE
  490.     MVI    M,0    ;CLEAR LINE
  491.     MOV    A,B    ;CHECK TO SEE IF FIRST CHAR IS A SEMICOLON (CMD SEP)
  492.     CPI    ';'
  493.     JNZ    ZMCL0
  494.     INX    H    ;PT TO 2ND CHAR
  495.     MOV    A,M    ;FIRST WAS A SEMICOLON, SO GET SECOND
  496. ZMCL0:
  497.     XCHG        ;HL PTS TO NEXT BUFFER SPACE, DE PTS TO MC LINE
  498.     JMP    ZMCL1A    ;A=FIRST CHAR IN MC LINE
  499. ;
  500. ;  MAJOR LOOP TO STORE MULTIPLE COMMAND LINE
  501. ;
  502. ZMCL1:
  503.     LDAX    D    ;GET NEXT BYTE FROM MULTIPLE COMMAND LINE
  504. ZMCL1A:
  505.     ORA    A    ;0=EOL
  506.     JZ    ZMCL2
  507.     ANI    7FH    ;MASK OUT MSB
  508.     CALL    CAPS    ;CONVERT TO UPPER CASE
  509.     MOV    M,A    ;STORE CHAR INTO MEMORY
  510.     INX    H    ;PT TO NEXT CHAR
  511.     INX    D
  512.     CALL    SIZE    ;MAKE SURE NO MEMORY OVFL
  513.     INR    C    ;INCR CHAR COUNT
  514.     JM    LENERR    ;MAX OF 128 CHARS IN LINE
  515.     JMP    ZMCL1
  516. ;
  517. ;  DONE WITH INPUT OF MULTIPLE COMMAND LINE -- SAVE CHAR CNT AND SET PTR
  518. ;
  519. ZMCL2:
  520.     SHLD    TXTPTR    ;SAVE PTR
  521.     POP    H    ;PT TO CHAR COUNT POSITION
  522.     MOV    M,C    ;STORE CHAR COUNT
  523.     RET
  524.  
  525. ;
  526. ;    GET NEXT BYTE FROM INPUT FILE OR USER
  527. ;
  528. GNB:
  529.     PUSH    H    ;DON'T ALTER ANYBODY
  530.     PUSH    D
  531.     PUSH    B
  532.     LDA    OPTION    ;INPUT FROM .SUB FILE?
  533.     CPI    OPT    ;TOLD BY ORIG CMD LINE OPTION
  534.     JNZ    GNBDISK    ;GET NEXT CHAR FROM DISK BUFFER IF NOT FROM USER
  535.     CALL    GNBKBD    ;GET A BYTE FROM KBD INPUT
  536.     JMP    GNBXIT    ;THEN LEAVE
  537. ;
  538. ;    GET NEXT BYTE FROM DISK FILE
  539. ;
  540. GNBDISK:
  541.     LDA    IBP    ;GET BUFFER POINTER
  542.     CPI    128    ;NEED ANOTHER BLOCK FROM DISK?
  543.     JC    GNBD1    ;CONTINUE
  544.     CALL    FILL    ;GET NEXT BLOCK
  545.     JZ    GNBD1    ;CONTINUE IF NOT EMPTY
  546.     CALL    GETUD    ;RETURN HOME
  547.     MVI    A,1AH    ;FAKE EOF
  548.     JMP    GNBXIT
  549. GNBD1:
  550.     MOV    E,A    ;PUT OFFSET IN DE
  551.     MVI    D,0
  552.     INR    A    ;POINT TO NEXT BYTE
  553.     STA    IBP    ;SAVE FOR NEXT
  554.     LXI    H,TBUF    ;NOW OFFSET INTO BUFFER
  555.     DAD    D
  556.     MOV    A,M    ;GET CHAR
  557. GNBXIT:
  558.     POP    B    ;RESTORE EVERYBODY
  559.     POP    D
  560.     POP    H
  561.     ORA    A    ;TURN ON CARRY
  562.     RET
  563. ;
  564. ;    FILL INPUT BUFFER FROM DISK
  565. ;
  566. FILL:
  567.     XRA    A    ;CLEAR INPUT BUFFER PTR
  568.     STA    IBP
  569.     LXI    D,FCB    ;PT TO FCB
  570.     MVI    C,READF    ;BDOS READ BLOCK FUNCTION
  571.     CALL    BDOS
  572.     ORA    A    ;RETURN Z IF EOF
  573.     MVI    A,0    ;SET PTR TO FIRST CHAR
  574.     RET
  575. ;
  576. ;    GET NEXT BYTE FROM USER (KEYBOARD INPUT)
  577. ;
  578. GNBKBD:
  579.     LHLD    CLPTR    ;PT TO NEXT CHAR
  580.     MOV    A,M    ;GET IT
  581.     INX    H    ;PT TO FOLLOWING
  582.     SHLD    CLPTR    ;RESET PTR
  583.     CPI    CR    ;END OF LINE?
  584.     RNZ
  585.     CALL    CLFILL    ;GET NEW LINE
  586.     JZ    GKEND    ;EMPTY LINE INPUT - RETURN EOF
  587.     MVI    A,CR    ;RETURN CR TO INDICATE END OF LINE
  588.     RET
  589. GKEND:
  590.     MVI    A,1AH    ;RETURN EOF
  591.     RET
  592. ;
  593. ;    FILL THE COMMAND LINE FROM THE USER
  594. ;
  595. CLFILL:
  596.     CALL    PRINT
  597.     DB    CR,LF,' Command Line? ',0
  598.     LHLD    CLBUF    ;NOW FILL THE BUFFER
  599.     XCHG        ;...DE PTS TO IT
  600.     MVI    C,RDBUF
  601.     CALL    BDOS
  602.     LHLD    CLBUF    ;PT TO COMMAND LINE BUFFER
  603.     INX    H
  604.     MOV    A,M    ;GET CHAR COUNT
  605.     INX    H
  606.     SHLD    CLPTR    ;RESET THE COMMAND LINE PTR
  607.     ORA    A    ;SET ZERO FLAG
  608.     PUSH    PSW    ;SAVE A
  609.     ADD    L    ;PT TO AFTER LAST CHAR
  610.     MOV    L,A
  611.     MOV    A,H
  612.     ACI    0
  613.     MOV    H,A
  614.     MVI    M,CR    ;SET EOL CHAR
  615.     POP    PSW    ;GET CHAR COUNT
  616.     RET
  617. ;
  618. ;    MAKE SURE NO MEMORY OVERFLOW
  619. ;
  620. SIZE:
  621.     LDA    BDOS+2    ;HIGHEST PAGE POINTER
  622.     SUI    9    ;MAKE IT BE UNDER CCP
  623.     CMP    H    ;CHECK IT AGAINST CURRENT PAGE
  624.     RNC        ;NC=ALL OKAY
  625.     JMP    MEMERR    ;OTHERWISE ABORT
  626. ;
  627. ;    SET UP THE $$$.SUB FILE
  628. ;    FOR WRITING
  629. ;
  630. WRSET:
  631.     CALL    PRINT
  632.     DB    CR,LF,' Writing Command File to Disk',0
  633.     LXI    D,SUBFCB
  634.     MVI    C,OPENF
  635.     CALL    BDOS    ;OPEN THE FILE
  636.     INR    A    ;CHECK CPM RETURN
  637.     JZ    NONE1    ;NONE EXISTS ALREADY
  638. ;
  639. ;    $$$.SUB EXISTS, SO SET
  640. ;    FCB TO APPEND TO IT
  641. ;
  642.     LDA    SUBFCB+FCBRC    ;GET RECORD COUNT
  643.     STA    SUBFCB+FCBNR    ;MAKE NEXT RECORD
  644.     RET
  645. ;
  646. ;    COME HERE WHEN NO $$$.SUB EXISTS
  647. ;
  648. NONE1:
  649.     LXI    D,SUBFCB
  650.     MVI    C,MAKEF
  651.     CALL    BDOS
  652.     INR    A
  653.     JZ    NOMAKE    ;0FFH=CAN'T CREATE FILE
  654.     RET
  655. ;
  656. ;    WRITE THE "$$$.SUB" FILE
  657. ;
  658. WRSUB:
  659.     LHLD    PREV    ;THIS CODE SCANS BACKWARD
  660.     MOV    A,H    ;  THRU THE FILE STORED IN
  661.     ORA    L    ;  MEMORY TO THE FIRST NON-
  662.     JZ    NOTEXT    ;  NULL LINE.  IF NONE IS
  663.     MOV    E,M    ;  FOUND, ABORTS
  664.     INX    H
  665.     MOV    D,M    ;HERE, WE PICK UP PNTR TO PREV LINE
  666.     INX    H    ;NOW WE POINT TO LENGTH
  667.     XCHG        ;WE NEED TO STORE AWAY
  668.     SHLD    PREV    ;  POINTER TO PREV LINE
  669.     XCHG
  670.     MOV    A,M    ;NOW PICK UP THE LENGTH
  671.     ORA    A    ;SET Z FLAG ON LENGTH
  672.     JNZ    WRNTRY    ;GOT LINE W/LENGTH: GO DO IT
  673.     LHLD    LINNUM    ;NOTHING HERE, FIX LINE NUMBER
  674.     DCX    H    ;(WORKING BACKWARD NOW)
  675.     SHLD    LINNUM
  676.     JMP    WRSUB
  677. WRLOP:
  678.     LHLD    PREV    ;GET PREV LINE POINTER
  679.     MOV    A,H
  680.     ORA    L    ;IF THERE IS NO PREV LINE
  681.     JZ    CLOSE    ;  THEN WE ARE DONE
  682.     MOV    E,M    ;ELSE SET UP PREV FOR NEXT
  683.     INX    H    ;  PASS THRU HERE
  684.     MOV    D,M
  685.     INX    H
  686.     XCHG        ;NOW STORE IT AWAY
  687.     SHLD    PREV
  688.     XCHG
  689. WRNTRY:
  690.     CALL    PUTLIN    ;WRITE THE LINE TO THE FILE
  691.     LHLD    LINNUM    ;BUMP THE LINE NUMBER
  692.     DCX    H    ;DOWN (WORKING BACK NOW)
  693.     SHLD    LINNUM
  694.     JMP    WRLOP
  695. ;
  696. ;    $$$.SUB IS WRITTEN, CLOSE THE FILE
  697. ;
  698. CLOSE:
  699.     LXI    D,SUBFCB
  700.     MVI    C,CLOSEF
  701.     JMP    BDOS
  702. ;
  703. ;    THIS SUBROUTINE WRITES A LINE
  704. ;    TO THE $$$.SUB FILE BUFFER,
  705. ;    AND FLUSHES THE BUFFER AFTER
  706. ;    THE LINE IS WRITTEN.
  707. ;
  708. PUTLIN:
  709.     MOV    A,M    ;PICK UP LENGTH BYTE
  710.     INX    H    ;POINT PAST IT
  711.     STA    GETCNT    ;MAKE A COUNT FOR "GET"
  712.     SHLD    GETPTR    ;MAKE A POINTER FOR "GET"
  713.     LXI    H,TBUF+1    ;TEXT GOES AFTER LENGTH
  714.     SHLD    PUTPTR    ;MAKE POINTER FOR "PUT"
  715.     XRA    A    ;INITIALIZE PUT COUNT
  716.     STA    PUTCNT
  717.     MOV    B,L    ;COUNT FOR CLEAR LOOP
  718. CLR:
  719.     MOV    M,A    ;ZERO OUT BUFFER LOC
  720.     INX    H
  721.     INR    B    ;COUNT
  722.     JNZ    CLR
  723. ;
  724. ;    THIS LOOP COLLECTS CHARACTERS
  725. ;    FROM THE LINE STORED IN MEMORY
  726. ;    AND WRITES THEM TO THE FILE.
  727. ;    IF THE "$" PARAMETER SPECIFIER
  728. ;    IS ENCOUNTERED, PARAMETER SUB-
  729. ;    STITUTION IS DONE
  730. ;
  731. PUTLP:
  732.     CALL    GETCHR    ;PICK UP A CHARACTER
  733.     JC    FLUSH    ;CY = NO MORE CHAR IN LINE
  734.     CPI    '^'    ;CONTROL-CHAR TRANSLATE PREFIX?
  735.     JNZ    NOTCX
  736.     CALL    GETCHR    ;YES, GET THE NEXT
  737.     JC    CCERR    ;ERROR: EARLY END OF INPUT
  738.     SUI    '@'    ;MAKE IT A CONTROL-CHAR
  739.     JC    CCERR    ;ERROR: TOO SMALL
  740.     CPI    ' '
  741.     JNC    CCERR    ;ERROR: TOO LARGE
  742. NOTCX:
  743.     CPI    PDELIM    ;PARAMETER SPECIFIER?
  744.     JNZ    STOBYT    ;IF NOT, JUST WRITE CHAR
  745.     LDA    OPTION    ;CHECK OPTION: '$' DOESN'T
  746.     CPI    OPT    ;  COUNT IN OPT MODE
  747.     MVI    A,PDELIM    ;(RESTORE THE '$')
  748.     JZ    STOBYT
  749.     CALL    LKAHED    ;PEEK AT NEXT CHAR
  750.     JC    PARERR    ;LINE ENDING MEANS PARAM ERR
  751.     CPI    PDELIM    ;ANOTHER "$"?
  752.     JNZ    SUBS    ;IF NOT THEN GO DO SUBSTITUTION
  753.     CALL    GETCHR    ;GET THE 2ND "$" (WE ONLY LOOKED
  754.             ;  AHEAD BEFORE)
  755. STOBYT:
  756.     CALL    PUTCHR    ;WRITE CHAR TO FILE
  757.     JMP    PUTLP
  758. ;
  759. ;    PARAMETER SUBSTITUTION...LOOKS UP THE
  760. ;    PARAMETER # AFTER THE "$" AND PLUGS IT
  761. ;    IN IF IT EXISTS.
  762. ;
  763. SUBS:
  764.     CALL    NUMTST    ;IT BETTER BE A NUMBER
  765.     JC    PARERR    ;  OTHERWISE PARAM ERROR
  766.     MVI    B,0    ;INITIALIZE PARM #
  767.     JMP    LPNTRY    ;WE JOIN LOOP IN PROGRESS...
  768. SUBLP:
  769.     CALL    LKAHED    ;LOOK AT NEXT CHAR
  770.     JC    DOSUBS    ;IF LINE EMPTY, THEN PLUG IN PARM
  771.     CALL    NUMTST    ;CHECK FOR NUMERIC
  772.     JC    DOSUBS    ;DONE IF NOT
  773. LPNTRY:
  774.     CALL    GETCHR    ;NOW REMOVE THE CHAR FROM INPUT STREAM
  775.     SUI    '0'    ;REMOVE ASCII BIAS
  776.     MOV    C,A    ;SAVE IT
  777.     MOV    A,B    ;OUR ACCUMULATED COUNT
  778.     ADD    A    ;MULTIPLY  BY TEN
  779.     ADD    A
  780.     ADD    B
  781.     ADD    A
  782.     ADD    C    ;THEN ADD IN NEW DIGIT
  783.     MOV    B,A    ;RESTORE COUNT
  784.     JMP    SUBLP
  785. ;
  786. ;    PERFORM THE SUBSTITUTION
  787. ;
  788. DOSUBS:
  789.     MOV    A,B    ;GET PARM #
  790.     DCR    A    ;MAKE ZERO RELATIVE
  791.     JM    PARERR    ;OOPS
  792.     CALL    LOOKUP    ;LOOK IT UP IN PARM TABLE
  793.     JC    PARERR    ;IT'S NOT THERE
  794.     MOV    B,A    ;LENGTH IN B
  795. SUBLP1:
  796.     INR    B    ;TEST B FOR ZERO
  797.     DCR    B
  798.     JZ    PUTLP    ;DONE
  799.     MOV    A,M    ;GET CHAR OF REAL PARAMETER
  800.     INX    H    ;POINT PAST FOR NEXT TIME
  801.     PUSH    H    ;SAVE REAL PARM POINTER
  802.     CALL    PUTCHR    ;PUT IT IN THE FILE
  803.     POP    H    ;GET BACK REAL PARM POINTER
  804.     DCR    B    ;COUNTDOWN
  805.     JMP    SUBLP1
  806. ;
  807. ;    COME HERE WHEN A LINE IS FINISHED,
  808. ;    AND WE NEED TO WRITE THE BUFFER TO DISK
  809. ;
  810. FLUSH:
  811.     LXI    D,SUBFCB
  812.     MVI    C,WRITEF
  813.     CALL    BDOS
  814.     ORA    A
  815.     JNZ    WRERR    ;CPM RETURNED A WRITE ERROR
  816.     RET
  817. ;
  818. ;    GETCHR GETS ONE CHAR FROM
  819. ;    LINE STORED IN MEMORY
  820. ;
  821. GETCHR:
  822.     LXI    H,GETCNT
  823.     MOV    A,M    ;PICK UP COUNT
  824.     DCR    A    ;REMOVE THIS CHAR
  825.     STC        ;PRESET ERROR
  826.     RM        ;RETURN CY IF OUT OF CHARS
  827.     MOV    M,A    ;UPDATE COUNT
  828.     LHLD    GETPTR    ;CURRENT CHAR POINTER
  829.     MOV    A,M    ;PICK UP CHAR
  830.     INX    H    ;BUMP POINTER
  831.     SHLD    GETPTR    ;PUT IT BACK
  832.     CMC        ;TURN CARRY OFF
  833.     RET
  834. ;
  835. ;    PUTCHR PUTS ONE CHAR TO
  836. ;    THE OUTPUT BUFFER
  837. ;
  838. PUTCHR:
  839.     LXI    H,PUTCNT
  840.     INR    M    ;INCREMENT COUNT
  841.     JM    LENERR    ;LINE WENT TO > 128 CHARS
  842.     LHLD    PUTPTR    ;GET BUFFER POINTER
  843.     ANI    7FH    ;MASK OUT MSB
  844.     MOV    M,A    ;PUT CHAR THERE
  845.     INX    H    ;BUMP POINTER
  846.     SHLD    PUTPTR    ;PUT IT BACK
  847.     RET        ;ALL DONE
  848. ;
  849. ;    LOOK AHEAD ONE CHAR IN
  850. ;    THE INPUT STREAM.  SET
  851. ;    CARRY IF NONE LEFT.
  852. ;
  853. LKAHED:
  854.     LDA    GETCNT
  855.     ORA    A    ;SEE IF COUNT IS DOWN TO ZERO
  856.     STC        ;PRE SET INDICATOR
  857.     RZ
  858.     MOV    A,M    ;PICK UP CHAR
  859.     CMC        ;TURN OFF CARRY FLAG
  860.     RET
  861. ;
  862. ;    LOOK UP PARAMETER WITH NUMBER IN
  863. ;    A REG. RETURN A=LENGTH OF PARM,
  864. ;    AND HL => PARAMETER
  865. ;
  866. LOOKUP:
  867.     CPI    NPAR
  868.     JNC    PAROVF    ;PARM # TOO HIGH
  869.     MOV    L,A
  870.     MVI    H,0    ;NOW HAVE 16 BIT NUMBER
  871.     DAD    H    ;DOUBLE FOR WORD OFFSET
  872.     LXI    D,TABLE
  873.     DAD    D    ;DO THE OFFSET
  874.     MOV    E,M    ;GET ADDRESS OF PARM
  875.     INX    H
  876.     MOV    D,M
  877.     MOV    A,D    ;ANYTHING THERE?
  878.     ORA    E
  879.     JNZ    LKUPOK
  880.     XRA    A    ;NO, ZERO LENGTH
  881.     RET
  882. LKUPOK:
  883.     XCHG        ;NOW IN DE
  884.     MOV    A,M    ;PICK UP LENGTH
  885.     INX    H    ;POINT PAST LENGTH
  886.     RET
  887. ;
  888. ;    UTILITY COMPARE SUBROUTINE
  889. ;
  890. COMPAR:
  891.     LDAX    D
  892.     CMP    M
  893.     RNZ
  894.     INX    H
  895.     INX    D
  896.     DCR    B
  897.     JNZ    COMPAR
  898.     RET
  899. ;
  900. ;    NUMERIC TEST UTILITY SUBROUTINE
  901. ;
  902. NUMTST:
  903.     CPI    '0'
  904.     RC
  905.     CPI    '9'+1
  906.     CMC
  907.     RET
  908. ;
  909. ;    ERROR HANDLERS
  910. ;
  911. WRERR:
  912.     CALL    ERRXIT
  913.     DB    'Disk Full',0
  914. NOMAKE:
  915.     CALL    ERRXIT
  916.     DB    'Dir Full',0
  917. MEMERR:
  918.     CALL    ERRXIT
  919.     DB    'Mem Full',0
  920. NOTFND:
  921.     CALL    ERRXIT
  922.     DB    'SUB File Not Found',0
  923. PARERR:
  924.     CALL    ERRXIT
  925.     DB    'Param',0
  926. PAROVF:
  927.     CALL    ERRXIT
  928.     DB    'Too Many Params',0
  929. LENERR:
  930.     CALL    ERRXIT
  931.     DB    'Line too Long',0
  932. NOTEXT:
  933.     CALL    ERRXIT
  934.     DB    'SUB File Empty',0
  935. CCERR:
  936.     CALL    ERRXIT
  937.     DB    'Ctrl Char',0
  938. ERRXIT:
  939.     CALL    CRLF        ;NEW LINE
  940.     POP    H
  941.     CALL    PSTR        ;PRINT MESSAGE
  942.     CALL    PRINT
  943.     DB    ' Error on Line ',0
  944.     LHLD    LINNUM        ;TELL LINE NUMBER
  945.     CALL    PHLDC
  946.     CALL    CRLF
  947.     LXI    D,SUBFCB    ;DELETE THE $$$.SUB FILE
  948.     MVI    C,DELETF
  949.     CALL    BDOS
  950.     JMP    CPBASE
  951. ;
  952. ;    INITIALIZE ALL VARIABLES
  953. ;
  954. INITVAR:
  955.     LXI    H,VAR
  956.     LXI    B,ENDVAR-VAR
  957. INITLP:
  958.     MVI    M,0    ;ZERO ENTIRE VAR AREA
  959.     INX    H
  960.     DCX    B
  961.     MOV    A,B
  962.     ORA    C
  963.     JNZ    INITLP
  964.     LXI    H,TABLE    ;INIT PARM TABLE POINTER
  965.     SHLD    TBLPTR
  966.     LXI    H,0FFFFH    ;MARK END OF TABLE
  967.     SHLD    ENDTBL
  968.     LHLD    FREMEM    ;FREE MEMORY STARTS TXT AREA
  969.     SHLD    TXTPTR
  970.     RET
  971. ;
  972. ; PRINT HELP WITH PROGRAM OPTIONS
  973. ;
  974. HELP:
  975.     CALL    PRINT
  976.     DB    CR,LF,'Syntax:'
  977.     DB    CR,LF,'  SUB            - Print this HELP Message'
  978.     DB    CR,LF,'  SUB /A <text>        - Abort of SUBMIT File'
  979.     DB    CR,LF,'  SUB /AB <text>    - Abort and Ring Bell'
  980.     DB    CR,LF,'  SUB /I<CR>        - Go into Interactive mode'
  981.     DB    CR,LF,'  SUB <FILE> <PARMS>    - Standard SUB File'
  982.     DB    0
  983.     LHLD    SPSAVE    ;RETURN TO OPSYS
  984.     SPHL
  985.     RET
  986. ;
  987. ;    VARIABLE STORAGE
  988. ;
  989. VAR    EQU    $
  990. ;
  991. AFLAG:
  992.     DB    0    ;ABORT FLAG (0=NO)
  993. TXTPTR:
  994.     DW    0    ;FREE MEMORY POINTER
  995. TBLPTR:
  996.     DW    0    ;POINTER TO PARM TABLE
  997. DUSER:
  998.     DB    0    ;DEFAULT USER NUMBER
  999. LINNUM:
  1000.     DW    0    ;CURRENT LINE NUMBER
  1001. PREV:
  1002.     DW    0    ;POINTER TO PREV LINE
  1003. GETCNT:
  1004.     DB    0    ;COUNTER FOR 'GET'
  1005. GETPTR:
  1006.     DW    0    ;POINTER FOR 'GET'
  1007. PUTPTR:
  1008.     DW    0    ;POINTER FOR 'PUT'
  1009. IBP:
  1010.     DB    0    ;INPUT BUFFER POINTER
  1011. CLPTR:
  1012.     DW    0    ;COMMAND LINE POINTER
  1013. BELL$FLAG:
  1014.     DB    0    ;RING BELL ON ABORT FLAG
  1015. OPTION:
  1016.     DB    0    ;OPT OPTION FLAG STORE
  1017. TABLE:
  1018.     DS    NPAR*3    ;PARAMETER TABLE
  1019. ENDTBL:
  1020.     DW    0FFFFH    ;END OF PARAMETER TABLE
  1021. ;
  1022. ENDVAR    EQU    $
  1023. SPSAVE:
  1024.     DW    0    ;STACK POINTER SAVE
  1025. ;
  1026. ;
  1027. ;    FCB FOR $$$.SUB
  1028. ;
  1029. SUBFCB:
  1030.     DB    1    ;DRIVE SPECIFIER (A SELECTED)
  1031.     DB    '$$$     '
  1032. SUBTYP:
  1033.     DB    'SUB'
  1034.     DW    0,0,0,0    ;INITIALIZE REST OF FCB
  1035.     DW    0,0,0,0
  1036.     DW    0,0,0,0
  1037. ;
  1038. CLBUF:    DS    2    ;PTR TO COMMAND LINE BUFFER
  1039. FREMEM:    DS    2    ;PTR TO FREE MEMORY AREA
  1040. ;
  1041.     END
  1042.  
  1043.