home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol202 / z3mac.lbr / Z3PRS1.MAC < prev    next >
Encoding:
Text File  |  1985-02-10  |  13.8 KB  |  675 lines

  1. ;
  2. ; Z3LIB Module Name:  Z3PRS1
  3. ; Author:  Richard Conn
  4. ; Z3LIB  Version Number:  1.0
  5. ; Module Version Number:  1.0
  6. ; Module Entry Points:
  7. ;    ZPRSFN        PARSER
  8. ; Module External References:
  9. ;    GETDUOK        GETMDISK    GETMUSER    GETNDR
  10. ;    RETUD        CAPSTR
  11. ;
  12.  
  13. ;
  14. ; External References
  15. ;
  16.     EXT    RETUD,CAPSTR,GETDUOK,GETMDISK,GETMUSER,GETNDR
  17. ;
  18. ; Basic Equates
  19. ;
  20. CMDSEP    equ    ';'    ;command separator
  21. TFCB    equ    5CH    ;FCB Buffer
  22. TFCB2    equ    6CH    ;2nd FCB Buffer
  23. TBUFF    equ    80H    ;Temporary Buffer
  24.  
  25. ;
  26. ; PARSE TOKEN PTED TO BY HL INTO FCB PTED TO BY DE
  27. ;    ON INPUT,
  28. ;        HL pts to token, ending in any valid delimiter
  29. ;        DE pts to 36-byte FCB
  30. ;        A = Flag:
  31. ;            A = 0 if scan for DIR form before DU
  32. ;            A = 1 if scan for DU form before DIR
  33. ;    ON OUTPUT,
  34. ;        HL pts to char following token
  35. ;        A = Number of Question Marks in File Name and Zero Flag Set
  36. ;            Accordingly
  37. ;
  38. ZPRSFN::
  39.     PUSH    B    ;SAVE BC
  40.     STA    DUFIRST    ;SET FLAG
  41.     CALL    CAPSTR    ;CAPITALIZE INPUT
  42.     PUSH    D    ;SAVE PTR TO FCB
  43.     CALL    INITFCB    ;INIT IT
  44.     POP    D    ;GET PTR BACK
  45.     XRA    A    ;DON'T FLUSH ON SCANNER
  46.     STA    SCFLUSH
  47.     PUSH    D    ;SAVE PTR AGAIN
  48.     CALL    SCANNER    ;SCAN LINE
  49.     POP    D    ;RESTORE PTR
  50.     POP    B    ;RESTORE BC
  51.     LDA    QMCNT    ;CHECK FOR QUESTION MARKS
  52.     ORA    A
  53.     RET
  54.  
  55. ;
  56. ; PARSE COMMAND LINE PTED TO BY HL (may be an element of an MCL)
  57. ;    ON INPUT,
  58. ;        HL pts to command line ending in 0
  59. ;        A = Flag:
  60. ;            A = 0 if scan for DIR form before DU
  61. ;            A = 1 if scan for DU form before DIR
  62. ;    ON OUTPUT,
  63. ;        HL pts to next command in MCL
  64. ;        DE pts to FCB containing command name (header.COM)
  65. ;        A = Flag:
  66. ;            A = 0 and Zero Flag Set if OK
  67. ;            A = number of question marks and NZ if header
  68. ;                contains one or more question marks
  69. ;
  70. PARSER::
  71.     PUSH    B        ;SAVE BC
  72.     CALL    PARSE        ;DO THE WORK
  73.     LHLD    TAILSV        ;GET PTR TO COMMAND TAIL
  74.     LXI    D,TBUFF        ;COPY TAIL INTO TBUFF
  75.     MVI    B,0        ;SET CHAR COUNT
  76.     PUSH    D        ;SAVE PTR TO TBUFF
  77.     INX    D        ;PT TO FIRST CHAR POSITION
  78. SVTAIL:
  79.     MOV    A,M        ;GET NEXT CHAR
  80.     CALL    TSTEOL        ;END OF LINE?
  81.     JZ    SVT1
  82.     STAX    D        ;SAVE CHAR
  83.     INX    H        ;PT TO NEXT
  84.     INX    D
  85.     INR    B        ;INCREMENT CHAR COUNT
  86.     JMP    SVTAIL
  87. SVT1:
  88.     XRA    A        ;STORE ENDING 0
  89.     STAX    D
  90.     POP    H        ;GET PTR TO TBUFF
  91.     MOV    M,B        ;SET CHAR COUNT
  92.     POP    B        ;RESTORE BC
  93.     LHLD    NXTCHR        ;PT TO NEXT CHAR IN HL
  94.     LXI    D,FCBDN        ;PT TO FCB IN DE
  95.     LDA    ERRFLG        ;GET ERROR FLAG IN A
  96.     ORA    A        ;SET ZERO FLAG
  97.     RET
  98. ;
  99. ; MAIN ROUTINE
  100. ;
  101. PARSE:
  102. ;
  103. ; SAVE DU/DIR ORDER FLAG AND CAPITALIZE INPUT LINE
  104. ;
  105.     STA    DUFIRST        ;0=DIR FIRST, 0FFH=DU FIRST
  106.     CALL    CAPSTR        ;CAPITALIZE LINE
  107. ;
  108. ; SET SCANNER FLUSH FLAG
  109. ;
  110.     MVI    A,0FFH
  111.     STA    SCFLUSH        ;SET FLAG TO NZ (PERFORM FLUSH)
  112. ;
  113. ; INITIALIZE THE COMMAND AND TOKEN FCBS
  114. ;
  115.     LXI    D,FCBDN        ;PT TO COMMAND FCB
  116.     CALL    INITFCB        ;INIT IT
  117.     LXI    D,TFCB        ;PT TO TOKEN FCB
  118.     CALL    INITFCB        ;INIT TFCB and TFCB2
  119. ;
  120. ; EXTRACT COMMAND NAME
  121. ;
  122.     LXI    D,FCBDN        ;PLACE COMMAND NAME INTO COMMAND FCB
  123.     CALL    SCANNER        ;EXTRACT COMMAND NAME
  124.     LDA    QMCNT        ;SET QUESTION MARK COUNT
  125.     STA    ERRFLG        ;INTO ERROR FLAG
  126. ;
  127. ; SET TYPE OF COMMAND
  128. ;
  129.     PUSH    H        ;SAVE PTR TO NEXT BYTE
  130.     LXI    H,COMMSG    ;PLACE DEFAULT FILE TYPE (COM) INTO FCB
  131.     LXI    D,FCBFT        ;PT TO FILE TYPE
  132.     MVI    B,3        ;3 BYTES
  133.     CALL    LDIR
  134.     POP    H        ;GET PTR TO NEXT BYTE
  135. ;
  136. ; SET DIR: PREFIX FLAG
  137. ;
  138.     LDA    MYCOLON        ;PREVIOUS TOKEN CONTAINED A COLON?
  139.     STA    COLON        ;SET FLAG FOR DU: OR DIR: PREFIX
  140. ;
  141. ; SAVE POINTER TO COMMAND TAIL FOR LATER COPY INTO TBUFF AND FIND END OF
  142. ;   COMMAND LINE
  143. ;
  144.     SHLD    TAILSV        ;SAVE PTR TO COMMAND TAIL
  145.     PUSH    H        ;SAVE PTR
  146. CTAIL:
  147.     MOV    A,M        ;GET CHAR
  148.     CALL    TSTEOL        ;AT EOL?
  149.     JZ    CTAIL1
  150.     INX    H        ;PT TO NEXT
  151.     JMP    CTAIL
  152. CTAIL1:
  153.     SHLD    NXTCHR        ;SAVE PTR TO NEXT LINE
  154.     POP    H        ;GET PTR TO COMMAND TAIL
  155. ;
  156. ;  EXTRACT FIRST TOKEN
  157. ;
  158.     CALL    SKSP        ;SKIP OVER SPACES
  159.     RZ            ;DONE IF EOL OR END OF COMMAND
  160.     LXI    D,TFCB        ;STORE FIRST TOKEN IN TFCB
  161.     CALL    SCANNER        ;EXTRACT TOKEN
  162. ;
  163. ;  EXTRACT SECOND TOKEN
  164. ;
  165.     CALL    SKSP        ;SKIP OVER SPACES
  166.     RZ            ;DONE IF EOL OR END OF COMMAND
  167.     LXI    D,TFCB2        ;PT TO 2ND FCB AND FALL THRU TO SCANNER
  168. ;
  169. ; EXTRACT TOKEN FROM COMMAND LINE AND PLACE IT INTO FCB PTED TO BY DE
  170. ;   FORMAT FCBDN FCB IF TOKEN RESEMBLES FILE NAME AND TYPE (FILENAME.TYP)
  171. ;     ON INPUT, HL PTS TO NEXT CHAR AND DE PTS TO FCB
  172. ;     ON OUTPUT, HL PTS TO DELIMITER AFTER TOKEN AND ZERO FLAG IS RESET
  173. ;       IF '?' IS IN TOKEN
  174. ;
  175. ; ENTRY POINTS:
  176. ;    SCANNER - LOAD TOKEN INTO FCB PTED TO BY DE
  177. ;    ON EXIT, HL PTS TO ENDING DELIMITER
  178. ;
  179. SCANNER:
  180.     XRA    A        ;A=0
  181.     STAX    D        ;SET DEFAULT DRIVE
  182.     STA    MYCOLON        ;SET NO COLON
  183.     STA    TEMPDR        ;SET TEMPORARY DRIVE NUMBER TO DEFAULT
  184.     STA    QMCNT        ;ZERO QUESTION MARK COUNTER
  185.     CALL    RETUD        ;GET USER/DISK
  186.     MOV    A,C        ;GET USER
  187.     STA    TEMPUSR        ;SET TEMPUSR
  188.     PUSH    D        ;SAVE PTR TO FIRST BYTE OF FCB
  189.     MVI    B,8        ;8 CHARS MAX
  190.     CALL    SCANF        ;PLACE FIRST TOKEN INTO FILE NAME FIELD
  191.     POP    D        ;GET PTR TO FIRST BYTE OF FCB
  192.     MOV    A,M        ;GET TERMINATING CHAR
  193.     STA    ENDCHAR        ;SET ENDING CHAR
  194.     CPI    ':'        ;COLON?
  195.     JNZ    SCAN1        ;NO, WE HAVE A FILE NAME
  196.     STA    MYCOLON        ;SET COLON
  197.     INX    H        ;PT TO CHAR AFTER COLON
  198. ;
  199. ; CHECK FOR DU: FORM FIRST
  200. ;
  201.     LDA    DUFIRST        ;CHECK DUFIRST FLAG
  202.     ORA    A
  203.     JZ    SCN1
  204.     CALL    DUSCAN        ;CHECK FOR DU: FORM
  205.     JZ    SUD1        ;GOT IT
  206. ;
  207. ; CHECK FOR DIR: FORM SECOND OR FIRST
  208. ;
  209. SCN1:
  210.     CALL    DIRSCAN        ;CHECK FOR DIR: FORM
  211.     JZ    SUD1        ;GOT IT
  212. ;
  213. ; CHECK FOR DU SCAN FOR DUSECOND
  214. ;
  215.     LDA    DUFIRST        ;CHECK DU FLAG
  216.     ORA    A
  217.     JNZ    SUD1
  218. ;
  219. ; CHECK FOR DU: FORM SECOND
  220. ;
  221.     CALL    DUSCAN        ;CHECK FOR DU: FORM
  222. ;
  223. ; WE HAVE A VALID DU OR DIR - TEMPDR/TEMPUSR CONTAIN DATA
  224. ;
  225. SUD1:
  226.     LDA    TEMPDR        ;SET DRIVE
  227.     STAX    D        ;... IN FCB
  228. ;
  229. ; REINIT FCB PTED TO BY DE
  230. ;
  231.     PUSH    D        ;SAVE PTR
  232.     INX    D        ;PT TO FN FIELD
  233.     CALL    IFCB        ;ONLY PARTIAL INIT (17 BYTES TOTAL)
  234.     POP    D
  235. ;
  236. ; EXTRACT FILENAME FIELD
  237. ;
  238.     XRA    A
  239.     STA    QMCNT        ;ZERO QUESTION MARK COUNTER
  240.     PUSH    D        ;SAVE PTR TO FIRST BYTE OF FCB
  241.     MVI    B,8        ;8 CHARS MAX
  242.     CALL    SCANF        ;STORE FILE NAME
  243.     POP    D        ;GET PTR TO FIRST BYTE OF FCB
  244.     MOV    A,M        ;GET OFFENDING CHAR
  245.     STA    ENDCHAR        ;SET ENDING CHAR
  246. ;
  247. ; SKIP TO FILE TYPE FIELD
  248. ;   HL PTS TO NEXT CHAR, DE PTS TO DN FIELD OF FCB
  249. ;
  250. SCAN1:
  251.     LDA    ENDCHAR        ;GET ENDING CHAR
  252.     XCHG
  253.     LXI    B,8        ;PT TO BEFORE FILE TYPE FIELD OF FCB
  254.     DAD    B
  255.     XCHG
  256. ;
  257. ; EXTRACT FILETYPE FIELD
  258. ;
  259.     MVI    B,3        ;PREPARE TO EXTRACT FILE TYPE
  260.     CPI    '.'        ;IF '.', WE HAVE A TYPE
  261.     JNZ    SCAN2
  262.     INX    H        ;PT TO CHAR AFTER '.'
  263.     PUSH    D
  264.     CALL    SCANF        ;GET FCB FILE TYPE
  265.     POP    D
  266. SCAN2:
  267. ;
  268. ; SET USER NUMBER REFERENCED
  269. ;   HL PTS TO NEXT CHAR, DE PTS TO BEFORE FCB FT
  270. ;
  271.     XCHG
  272.     LXI    B,5        ;PT TO S1 FIELD
  273.     DAD    B
  274.     XCHG
  275.     LDA    TEMPUSR        ;STORE USER NUMBER HERE
  276.     STAX    D
  277.     LDA    SCFLUSH        ;FLUSH TO SPACE, ETC?
  278.     ORA    A        ;0=NO
  279.     JZ    SCAN4
  280. ;
  281. ; SKIP TO SPACE, CHAR AFTER =,  OR EOL
  282. ;   HL PTS TO NEXT CHAR IN LINE
  283. ;
  284. SCAN3:
  285.     MOV    A,M        ;GET NEXT CHAR
  286.     CPI    ' '+1        ;DONE IF LESS THAN SPACE
  287.     JC    SCAN4
  288.     CALL    TSTEOL        ;EOL?
  289.     JZ    SCAN4
  290.     INX    H        ;PT TO NEXT
  291.     CPI    '='        ;EQUATE?
  292.     JNZ    SCAN3
  293. ;
  294. ; SET ZERO FLAG TO INDICATE PRESENCE OF '?' IN DIR:FILENAME.TYP
  295. ;
  296. SCAN4:
  297.     LDA    QMCNT        ;NUMBER OF QUESTION MARKS
  298.     ORA    A        ;SET ZERO FLAG
  299.     RET
  300. ;
  301. ;  SCANF -- SCAN TOKEN PTED TO BY HL FOR A MAX OF B BYTES; PLACE IT INTO
  302. ;    FILE NAME FIELD PTED TO BY DE; EXPAND AND INTERPRET WILD CARDS OF
  303. ;    '*' AND '?'; ON EXIT, DE PTS TO TERMINATING DELIMITER
  304. ;
  305. SCANF:
  306.     CALL    SDELM        ;DONE IF DELIMITER ENCOUNTERED
  307.     RZ
  308.     INX    D        ;PT TO NEXT BYTE IN FCB
  309.     CPI    '*'        ;IS (DE) A WILD CARD?
  310.     JNZ    SCANF1        ;CONTINUE IF NOT
  311. ;
  312. ; HANDLE WILD FIELD
  313. ;
  314.     MVI    A,'?'        ;PLACE '?' IN FCB AND DON'T ADVANCE HL IF SO
  315.     STAX    D
  316.     CALL    SCQ        ;SCANNER COUNT QUESTION MARKS
  317.     JMP    SCANF2
  318. ;
  319. ; HANDLE NORMAL CHARS, INCL '?'
  320. ;
  321. SCANF1:
  322.     STAX    D        ;STORE FILENAME CHAR IN FCB
  323.     INX    H        ;PT TO NEXT CHAR IN COMMAND LINE
  324.     CPI    '?'        ;CHECK FOR QUESTION MARK (WILD)
  325.     CZ    SCQ        ;SCANNER COUNT QUESTION MARKS
  326. ;
  327. ; COUNT DOWN CHARS
  328. ;
  329. SCANF2:
  330.     DCR    B        ;COUNT DOWN
  331.     JNZ    SCANF        ;DECREMENT CHAR COUNT UNTIL 8 ELAPSED
  332. ;
  333. ; FLUSH TO NEXT DELIMITER
  334. ;
  335. SCANF3:
  336.     CALL    SDELM        ;8 CHARS OR MORE - SKIP UNTIL DELIMITER
  337.     RZ            ;ZERO FLAG SET IF DELIMITER FOUND
  338.     INX    H        ;PT TO NEXT CHAR IN COMMAND LINE
  339.     JMP    SCANF3
  340. ;
  341. ;  INCREMENT QUESTION MARK COUNT FOR SCANNER
  342. ;    THIS ROUTINE INCREMENTS THE COUNT OF THE NUMBER OF QUESTION MARKS IN
  343. ;    THE CURRENT FCB ENTRY
  344. ;
  345. SCQ:
  346.     PUSH    H        ;SAVE HL
  347.     LXI    H,QMCNT        ;GET COUNT
  348.     INR    M        ;INCREMENT
  349.     POP    H        ;GET HL
  350.     RET
  351. ;
  352. ;  SCAN FOR AND EXTRACT DISK/USER INFO ASSUMING DU: FORM
  353. ;    ON ENTRY, DE PTS TO FIRST BYTE OF FCB CONTAINING POSSIBLE DU FORM
  354. ;    ON EXIT, ZERO FLAG SET MEAN OK AND TEMPDR AND TEMPUSR SET
  355. ;
  356. DUSCAN:
  357.     PUSH    H        ;SAVE REGS
  358.     PUSH    D
  359.     CALL    DUS        ;DO SCAN
  360.     POP    D        ;RESTORE REGS
  361.     POP    H
  362.     RET
  363. DUS:
  364.     CALL    GETDUOK        ;OK FOR DU FORM?
  365.     JZ    DIRSERR        ;ABORT IF NOT
  366.     XCHG            ;PTR IN HL
  367.     INX    H        ;PT TO FIRST BYTE OF FN
  368.     CALL    GETMDISK    ;GET MAX DISK
  369.     MOV    B,A        ;... IN B
  370.     INR    B        ;B=MAX DISK + 1
  371.     MOV    A,M        ;GET FIRST CHAR
  372.     CPI    'A'        ;CONVERT POSSIBLE DRIVE SPEC TO NUMBER
  373.     JC    DUS1        ;IF LESS THAN 'A', MUST BE DIGIT
  374. ;
  375. ;  SET DISK NUMBER (A=1)
  376. ;
  377.     SUI    'A'-1        ;CONVERT DRIVE NUMBER TO 1-16
  378.     CMP    B        ;COMPARE AGAINST MAX DISK + 1
  379.     JNC    DUSE1        ;INVALID DISK NUMBER
  380.     STA    TEMPDR        ;SET TEMPORARY DRIVE NUMBER
  381.     INX    H        ;PT TO NEXT CHAR
  382.     MOV    A,M        ;SEE IF IT IS A SPACE
  383.     CPI    ' '
  384.     RZ
  385.     CALL    DIGCK        ;CHECK FOR DIGIT
  386.     RC
  387. ;
  388. ;  SET USER NUMBER
  389. ;
  390. DUS1:
  391.     PUSH    H        ;SAVE PTR TO DIGITS
  392.     MVI    B,2        ;UP TO 2 DIGITS
  393. DUS1A:
  394.     MOV    A,M        ;CHECK FOR DIGIT OR SPACE
  395.     CPI    ' '        ;IF SPACE, THEN NO DIGIT
  396.     JZ    DUS2
  397.     CALL    DIGCK        ;CHECK FOR DIGIT
  398.     JC    DUSE
  399.     INX    H
  400.     DCR    B
  401.     JNZ    DUS1A        ;COUNT DOWN
  402.     MOV    A,M        ;3RD CHAR
  403.     CPI    ' '        ;MUST BE SPACE
  404.     JNZ    DUSE
  405. DUS2:
  406.     POP    H
  407.     CALL    GETMUSER    ;GET MAX USER NUMBER
  408.     MOV    C,A        ;... IN C
  409.     INR    C        ;MAXUSR+1
  410.     CALL    NUM        ;GET NUMBER
  411.     CMP    C        ;COMPARE AGAINST MAXUSR+1
  412.     JNC    DUSE1
  413.     STA    TEMPUSR        ;SAVE USER NUMBER
  414.     XRA    A        ;SET OK
  415.     RET
  416. DUSE:
  417.     POP    H        ;CLEAR STACK
  418. DUSE1:
  419.     XRA    A
  420.     DCR    A
  421.     RET
  422. ;
  423. ;  SCAN FOR DIR FORM
  424. ;    ON ENTRY, DE PTS TO FCB CONTAINING NAME TO CHECK FOR
  425. ;    ON EXIT, IF FOUND, Z AND TEMPUSR AND TEMPDR SET
  426. ;
  427. DIRSCAN:
  428.     PUSH    H        ;SAVE REGS
  429.     PUSH    D
  430.     CALL    DIRS        ;DO SCAN
  431.     POP    D        ;RESTORE REGS
  432.     POP    H
  433.     RET
  434. DIRS:
  435.     CALL    GETNDR        ;PT TO NAMED DIR
  436.     JZ    DIRSERR        ;ABORT IF NONE
  437.     XCHG            ;PTR IN HL
  438.     INX    H        ;PT TO FN
  439. DIRS1:
  440.     LDAX    D        ;GET NEXT CHAR
  441.     ORA    A        ;ZERO IF END OF DIR
  442.     JZ    DIRSERR
  443.     INX    D        ;PT TO DIR NAME
  444.     INX    D
  445.     PUSH    H        ;SAVE PTR TO FILE NAME
  446.     PUSH    D        ;SAVE PTR TO DIR ENTRY
  447.     MVI    B,8        ;MATCH?
  448. DIRS2:
  449.     LDAX    D        ;GET BYTE
  450.     CMP    M        ;COMPARE
  451.     JNZ    DIRS3
  452.     INX    H        ;PT TO NEXT
  453.     INX    D
  454.     DCR    B
  455.     JNZ    DIRS2        ;COUNT DOWN
  456. DIRS3:
  457.     POP    D        ;RESTORE REGS
  458.     POP    H
  459.     JZ    DIRS4
  460.     XCHG            ;ADVANCE TO NEXT ENTRY
  461.     LXI    B,16        ;8 BYTES FOR NAME + 8 BYTES FOR PASSWORD
  462.     DAD    B
  463.     XCHG
  464.     JMP    DIRS1
  465. ;
  466. ; NO DIR match
  467. ;
  468. DIRSERR:
  469.     XRA    A        ;RETURN NZ
  470.     DCR    A
  471.     RET
  472. ;
  473. ; DIR match
  474. ;
  475. DIRS4:
  476.     DCX    D        ;PT TO USER
  477.     LDAX    D        ;GET USER
  478.     STA    TEMPUSR
  479.     DCX    D        ;PT TO DISK
  480.     LDAX    D        ;GET IT
  481.     STA    TEMPDR        ;A=1
  482.     XRA    A        ;SET Z
  483.     RET
  484.  
  485. ;
  486. ; SKIP OVER SPACES PTED TO BY HL
  487. ;   ON RETURN, ZERO FLAG SET MEANS WE HIT EOL OR CMDSEP
  488. ;
  489. SKSP:
  490.     MOV    A,M    ;GET NEXT CHAR
  491.     INX    H    ;PT TO NEXT
  492.     CPI    ' '    ;SPACE?
  493.     JZ    SKSP
  494.     DCX    H    ;PT TO NON-SPACE
  495.     RET
  496. ;
  497. ; CHECK TO SEE IF HL PTS TO DELIMITER; IF SO, RET W/ZERO FLAG SET
  498. ;
  499. SDELM:
  500.     MOV    A,M        ;GET NEXT CHAR FROM LINE
  501.     CPI    ' '+1        ;DELIM IF <= <SP>
  502.     JC    ZERO
  503.     CPI    '='        ;'='=DELIMITER
  504.     RZ
  505.     CPI    5FH        ;UNDERSCORE=DELIMITER
  506.     RZ
  507.     CPI    '.'        ;'.'=DELIMITER
  508.     RZ
  509.     CPI    ':'        ;':'=DELIMITER
  510.     RZ
  511.     CPI    ','        ;','=DELIMITER
  512.     RZ
  513.     CPI    '<'        ;'<'=DELIMITER
  514.     RZ
  515.     CPI    '>'        ;'>'=DELIMITER
  516.     RZ            ;FALL THRU TO TSTEOL
  517. ;
  518. ; CHECK TO SEE IF CHAR IN A IS EOL OR CMDSEP
  519. ;
  520. TSTEOL:
  521.     ORA    A    ;EOL?
  522.     RZ        ;RETURN WITH FLAG
  523.     CPI    CMDSEP    ;COMMAND SEPARATOR?
  524.     RET
  525. ;
  526. ; RETURN WITH A=0 AND Z
  527. ;
  528. ZERO:
  529.     XRA    A
  530.     RET
  531.  
  532. ;
  533. ; CONVERT NUMBER STRING PTED TO BY HL INTO A NUMBER IN A
  534. ;
  535. NUM:
  536.     PUSH    B
  537.     LXI    B,1100H        ;C=ACCUMULATED VALUE, B=CHAR COUNT
  538.                 ; (C=0, B=11)
  539. NUM1:
  540.     MOV    A,M        ;GET CHAR
  541.     CALL    SDELM        ;DONE IF DELIMITER
  542.     JZ    NUM2
  543.     INX    H        ;PT TO NEXT CHAR
  544.     CALL    DIGCK        ;CHECK FOR DIGIT IN A
  545.     JC    NUMERR
  546.     MOV    D,A        ;DIGIT IN D
  547.     MOV    A,C        ;NEW VALUE = OLD VALUE * 10
  548.     RLC            ;*2
  549.     JC    NUMERR
  550.     RLC            ;*4
  551.     JC    NUMERR
  552.     ADD    C        ;*5
  553.     JC    NUMERR
  554.     RLC            ;*10
  555.     JC    NUMERR
  556.     ADD    D        ;NEW VALUE = OLD VALUE * 10 + DIGIT
  557.     JC    NUMERR        ;CHECK FOR RANGE ERROR
  558.     MOV    C,A        ;SET NEW VALUE
  559.     DCR    B
  560.     JNZ    NUM1        ;COUNT DOWN
  561. ;
  562. ; RETURN FROM NUMBER
  563. ;
  564. NUM2:
  565.     MOV    A,C        ;GET ACCUMULATED VALUE
  566.     POP    B
  567.     ORA    A        ;CLEAR CARRY
  568.     RET
  569. ;
  570. ; RESTORE STACK AND RETURN WITH CARRY SET
  571. ;
  572. NUMERR:
  573.     POP    B
  574.     STC
  575.     RET
  576.  
  577. ;
  578. ; CHECK TO SEE IF A IS A DIGIT
  579. ;   IF SO, RETURN ITS VALUE
  580. ;   IF NOT, RETURN WITH CARRY SET
  581. ;
  582. DIGCK:
  583.     SUI    '0'        ;DIGIT?
  584.     RC            ;ERROR
  585.     CPI    10        ;RANGE?
  586.     JNC    DIGCK1
  587.     CMC            ;FLIP CARRY
  588.     RET
  589. DIGCK1:
  590.     STC            ;SET CARRY
  591.     RET
  592.  
  593. ;
  594. ; INIT FCB PTED TO BY DE
  595. ;
  596. INITFCB:
  597.     XRA    A
  598.     STAX    D    ;SET DEFAULT DISK (DN BYTE IS 0)
  599.     INX    D    ;PT TO FILE NAME FIELD
  600.     CALL    IFCB    ;FILL 1ST PART OF FCB; FALL THRU TO IFCB TO RUN AGAIN
  601. ;
  602. ; FILL FN, FT, EX, S1, S2, RC, AND FOLLOWING CR (OR DN) FIELDS
  603. ;
  604. IFCB:
  605.     MVI    B,11    ;STORE 11 SPACES
  606.     MVI    A,' '
  607.     CALL    FILL
  608.     XRA    A
  609.     STAX    D    ;SET EX TO ZERO
  610.     INX    D
  611.     CALL    RETUD    ;GET CURRENT USER
  612.     MOV    A,C
  613.     STAX    D    ;SET S1 TO CURRENT USER
  614.     INX    D
  615.     MVI    B,3    ;STORE 3 ZEROES
  616.     XRA    A    ;FALL THRU TO FILL
  617. ;
  618. ; FILL MEMORY POINTED TO BY DE WITH CHAR IN A FOR B BYTES
  619. ;
  620. FILL:
  621.     STAX    D        ;FILL WITH BYTE IN A
  622.     INX    D        ;PT TO NEXT
  623.     DCR    B        ;COUNT DOWN
  624.     JNZ    FILL
  625.     RET
  626. ;
  627. ; COPY HL TO DE FOR B BYTES
  628. ;
  629. LDIR:
  630.     MOV    A,M        ;GET
  631.     STAX    D        ;PUT
  632.     INX    H        ;PT TO NEXT
  633.     INX    D
  634.     DCR    B        ;COUNT DOWN
  635.     JNZ    LDIR
  636.     RET
  637. ;
  638. ; BUFFERS
  639. ;
  640. COMMSG:
  641.     DB    'COM'        ;FILE TYPE OF COM FILE
  642. COLON:
  643.     DS    1        ;INDICATES THAT CURRENT TOKEN CONTAINS DIR/DU
  644. DUFIRST:
  645.     DS    1        ;DU FIRST = 0FFH, DIR FIRST = 0
  646. ENDCHAR:
  647.     DS    1        ;TERMINATING CHAR IN SCAN
  648. ERRFLG:
  649.     DS    1        ;ERROR FLAG (NUMBER OF QUESTION MARKS IN HDR)
  650. FCBDN:
  651.     DS    1
  652.     DS    8
  653. FCBFT:
  654.     DS    3
  655.     DS    4
  656.     DS    16
  657.     DS    4
  658.  
  659. MYCOLON:
  660.     DS    1        ;INDICATES COMMAND BEGINS WITH DIR REFERENCE
  661. NXTCHR:
  662.     DS    2        ;PTR TO NEXT CHAR IN COMMAND SEQUENCE
  663. QMCNT:
  664.     DS    1        ;QUESTION MARK COUNT
  665. SCFLUSH:
  666.     DS    1        ;FLUSH TO SPACE, ETC, ON SCANNER (0=NO)
  667. TAILSV:
  668.     DS    2        ;PTR TO COMMAND TAIL
  669. TEMPDR:
  670.     DS    1        ;TEMPORARY DRIVE REF
  671. TEMPUSR:
  672.     DS    1        ;TEMPORARY USER NUMBER REF
  673.  
  674.     END
  675.