home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / ccp / z80ccp.ark / Z80CCP.ASM < prev   
Encoding:
Assembly Source File  |  1988-03-13  |  36.0 KB  |  1,568 lines

  1.  
  2. *
  3. *  ENHANCED CP/M CONSOLE COMMAND PROCESSOR (CCP) for CP/M REV. 2.2
  4. *
  5. *    Origianl CCP disassembled by ????
  6. *    Original CCP disassembled further by RLC
  7. *    Original CCP commented by RLC
  8. *    Modified and generalized by John Thomas (6/20/81)
  9. *    Macros expanded and condtional for terminals which
  10. *         use form feeds to clear the screen added by
  11. *         Bo McCormick (6/27/81)
  12. *
  13. ***** ASSEMBLING THIS CCP FOR CP/M 2.2 *****
  14. *    You must be using a Z-80 processor to run this
  15. *    program. You do not need MAC or any macro library.
  16. *    If you add further modifications to the program
  17. *    the total size of the program must not exceed
  18. *    2K in order to fit under the BDOS. Set the CCPLOC equate
  19. *    to the memory location of the CCP in your system.
  20. *    Once assembled, the hex file of this CCP program can be
  21. *    "patched" into your sytem using DDT as outlined in the
  22. *    CP/M 2 Alteration Guide.
  23. *    Code must be added to use the Clear Screen command with
  24. *    your terminal. Equates exist for the Hazeltine 1500,
  25. *    the Heath/Zenith H19/H89, and any terminal which uses
  26. *    a form feed to clear the screen.
  27. *    Also, there is a provision for a boot-up command. Place
  28. *    the command to be executed on cold and warm starts at 
  29. *    location CBUFF.
  30. *
  31. ***** NON-STANDARD FEATURES *****
  32. *    The non-standard features incorporated into this CCP are:
  33. *      A.  The Command-Search Hierarchy, as follows --
  34. *        1.  Scan for a CCP-resident command and execute it if
  35. *            found
  36. *        2.  If not CCP-resident, look for a .COM file on disk
  37. *        3.  If the .COM file is not found in the current user
  38. *            area and the current user area is not USER 0,
  39. *            USER 0 is selected and scanned for the file
  40. *        4.  If the .COM file is not found on the current
  41. *            logged-in disk drive, drive A: is selected
  42. *            and scanned for the file
  43. *      B.  The DIR Command no longer prints the current drive spec
  44. *        at the beginning of each line
  45. *      C.  The TYPE Command pages its output
  46. *      D.  A LIST Command now exists which is like TYPE but does not
  47. *        page and sends its output to the LST: device
  48. *      E.  A CLS (Clear Screen) Command now exists which clears the
  49. *        screen of the terminal
  50. *      F.  The user number is printed as part of the command prompt;
  51. *        the prompt is now du>, such as A0> and A15>
  52. *      G.  Z80-code is used throughout to reduce the size of the CCP
  53. *        and give room to implement the additional functions
  54. *      H.  The input line buffer has been reduced in size to 100 bytes
  55. *      I.  The ERA Command displays the names of the files it is to
  56. *        erase
  57. *      J.  The DIR Command has an additional special form of "DIR @"
  58. *        which displays all files (both non-system and system),
  59. *        while "DIR" displays just the non-system files
  60. *      K.  The Directory Display no longer displays the disk name at
  61. *        the beginning of each line and it now includes a '.' between
  62. *        the file name and file type (FILENAME.TYP)
  63. *      L.  The SUBMIT File Facility now expects the $$$.SUB file to be
  64. *        on the currently logged-in disk (as opposed to always A:)
  65. *      M.  The Command Line Prompt is now '$' if the command comes from
  66. *        a $$$.SUB file and '>' if the command comes from the user;
  67. *        also, the '>' is not printed until all preprocessing is
  68. *        completed
  69. *      N.  The TYPE and LIST Commands mask the MSB of each byte, so that
  70. *        files created by editors such as EDIT80 are "printable"
  71. *
  72.  
  73. FALSE    EQU    0
  74. TRUE    EQU    NOT FALSE
  75.  
  76. CCPLOC    EQU    3400H+1400H        ; START OF CCP IN MEMORY
  77.                     ; REPLACE WITH VALUE
  78.                     ; FOR YOUR SYSTEM
  79.  
  80. NLINES    EQU    16        ; NUMBER OF LINES ON CRT SCREEN
  81.  
  82. H19    EQU    FALSE        ; USING HEATH H19/H89 TERMINAL
  83. HAZE    EQU    FALSE        ; USING HAZELTINE 1500 TERMINAL
  84. FFTERM    EQU    TRUE        ; USING TERMINAL THAT RESPONDS TO 0CH
  85.                 ; OR ANY CHARACTER IF YOU CHANGE THE
  86.                 ; VALUE OF FF BELOW
  87.  
  88. CR    EQU    0DH
  89. LF    EQU    0AH
  90. TAB    EQU    09H
  91. FF    EQU    0CH        ;<==== CHANGE THIS BYTE IF TERMINAL
  92. ESC    EQU    1BH        ;      NEEDS A DIFFERENT CHARACTER
  93.                 ;      TO CLEAR THE SCREEN
  94.  
  95.  
  96. WBOOT    EQU    0000H        ; CP/M WARM BOOT ADDRESS
  97. UDFLAG    EQU    0004H        ; USER NUMBER IS IN HIGH NYBBLE, DISK IN LOW
  98. BDOS    EQU    0005H        ; BDOS FUNCTION CALL ENTRY PT
  99. TBUFF    EQU    0080H        ; DEFAULT DISK I/O BUFFER
  100. TFCB    EQU    005CH        ; DEFAULT FCB BUFFER
  101. TPA    EQU    0100H        ; BASE OF TPA
  102.  
  103.  
  104.  
  105.     ORG    CCPLOC        ; START OF CCP IN MEMEORY IN YOUR SYSTEM
  106.  
  107.  
  108. ENTRY:
  109.     JMP    CCP
  110.     JMP    CCP1
  111.  
  112. *  INPUT COMMAND LINE AND DEFAULT COMMAND
  113. BUFLEN    EQU    100        ; MAXIMUM BUFFER LENGTH
  114. MBUFF:
  115.     DB    BUFLEN        ; MAXIMUM BUFFER LENGTH
  116. CBUFF:
  117.     DB    3        ;<== NUMBER OF VALID CHARS IN COMMAND LINE
  118. CIBUFF:
  119.     DB    'DIR '        ;<== DEFAULT (COLD BOOT) COMMAND
  120.     DB    '    '
  121.     DB    '    '
  122.     DB    '    '
  123. CIBUF:
  124.     DS    85        ; TOTAL IS 100 BYTES
  125.     DS    20        ; STACK AREA
  126. STACK    EQU    $        ; TOP OF STACK
  127.  
  128. CIBPTR:
  129.     DW    CIBUFF        ;POINTER TO CMD INPUT BUFF
  130. CIPTR:
  131.     DW    CIBUF        ;CURRENT PNTR
  132.  
  133. *
  134. *  I/O UTILITIES
  135. *
  136.  
  137. *  OUTPUT <SP>
  138. SPACER:
  139.     MVI    A,' '    ; FALL THRU TO CONOUT
  140.  
  141. *  OUTPUT CHAR IN REG A TO CONSOLE AND DON'T CHANGE BC
  142. CONOUT:
  143.     PUSH    B
  144.     PUSH    H
  145.     MVI    C,02H
  146. OUTPUT:
  147.     MOV    E,A
  148.     CALL    BDOS
  149.     POP    H
  150.     POP    B
  151.     RET
  152.  
  153. *  CALL BDOS AND SAVE BC
  154. BDOSB:
  155.     PUSH    B
  156.     CALL    BDOS
  157.     POP    B
  158.     RET
  159.  
  160. *  OUTPUT CHAR IN REG A TO LIST DEVICE
  161. LSTOUT:
  162.     PUSH    B
  163.     PUSH    H
  164.     MVI    C,05H
  165.     DB    18H
  166.     DB    OUTPUT-$-1 AND 0FFH
  167.  
  168. *  OUTPUT <CRLF>
  169. CRLF:
  170.     MVI    A,CR
  171.     CALL    CONOUT
  172.     MVI    A,LF
  173.     DB    18H
  174.     DB    CONOUT-$-1 AND 0FFH
  175.  
  176. *  PRINT STRING (ENDING IN 0) PTED TO BY RET ADR; START WITH <CRLF>
  177. PRINT:
  178.     XTHL            ; GET PTR TO STRING
  179.     PUSH    PSW        ; SAVE FLAGS
  180.     CALL    CRLF        ; NEW LINE
  181.     CALL    PRIN1
  182.     POP    PSW        ; GET FLAGS
  183.     XTHL            ; RESTORE HL AND RET ADR
  184.     RET
  185.  
  186. *  PRINT STRING (ENDING IN 0) PTED TO BY HL
  187. PRIN1:
  188.     MOV    A,M        ; GET NEXT BYTE
  189.     INX    H        ; PT TO NEXT BYTE
  190.     ORA    A        ; DONE IF 0
  191.     RZ
  192.     CALL    CONOUT        ; PRINT CHAR
  193.     DB    18H
  194.     DB    PRIN1-$-1 AND 0FFH
  195.  
  196. *
  197. *  BDOS FUNCTION ROUTINES
  198. *
  199.  
  200. RESET:
  201.     MVI    C,0DH
  202.     JMP    BDOS
  203. ;
  204. LOGIN:
  205.     MOV    E,A
  206.     MVI    C,0EH
  207.     JMP    BDOS
  208. ;
  209. OPENF:
  210.     XRA    A
  211.     STA    FCBCR
  212.     LXI    D,FCBDN    ; FALL THRU TO OPEN
  213. ;
  214. OPEN:
  215.     MVI    C,0FH    ; FALL THRU TO GRBDOS
  216. ;
  217. GRBDOS:
  218.     CALL    BDOS
  219.     INR    A    ; SET ZERO FLAG FOR ERROR RETURN
  220.     RET
  221. ;
  222. CLOSE:
  223.     MVI    C,10H
  224.     DB    18H
  225.     DB    GRBDOS-$-1 AND 0FFH
  226. ;
  227. SEARF:
  228.     LXI    D,FCBDN    ; SPECIFY FCB
  229. SEAR1:
  230.     MVI    C,11H
  231.     DB    18H
  232.     DB    GRBDOS-$-1 AND 0FFH
  233. ;
  234. SEARN:
  235.     MVI    C,12H
  236.     DB    18H
  237.     DB    GRBDOS-$-1 AND 0FFH
  238. ;
  239. DELETE:
  240.     MVI    C,13H
  241.     JMP    BDOS
  242. ;
  243. READF:
  244.     LXI    D,FCBDN    ; FALL THRU TO READ
  245. ;
  246. READ:
  247.     MVI    C,14H    ; FALL THRU TO GOBDOS
  248. ;
  249. GOBDOS:
  250.     CALL    BDOSB    ; PRESERVE B
  251.     ORA    A
  252.     RET    
  253. ;
  254. WRITE:
  255.     MVI    C,15H
  256.     DB    18H
  257.     DB    GOBDOS-$-1 AND 0FFH
  258. ;
  259. CREATE:
  260.     MVI    C,16H
  261.     DB    18H
  262.     DB    GRBDOS-$-1 AND 0FFH
  263. ;
  264. GETUSR:
  265.     MVI    E,0FFH        ;GET CURRENT USER NUMBER
  266. SETUSR:
  267.     MVI    C,20H        ;SET USER NUMBER TO VALUE IN E (GET IF E=FFH)
  268.     JMP    BDOS
  269.  
  270. *
  271. *  END OF BDOS FUNCTIONS
  272. *
  273.  
  274. *
  275. *  CCP UTILITIES
  276. *
  277.  
  278. *  SET USER/DISK FLAG TO CURRENT USER AND DEFAULT DISK
  279. SETUD:
  280.     CALL    GETUSR        ; GET NUMBER OF CURRENT USER
  281.     ADD    A        ; PLACE IT IN HIGH NYBBLE
  282.     ADD    A
  283.     ADD    A
  284.     ADD    A
  285.     LXI    H,TDRIVE    ; MASK IN DEFAULT DRIVE NUMBER (LOW NYBBLE)
  286.     ORA    M        ; MASK IN
  287.     STA    UDFLAG        ; SET USER/DISK NUMBER
  288.     RET
  289.  
  290. *  SET USER/DISK FLAG TO USER 0 AND DEFAULT DISK
  291. SETU0D:
  292.     LDA    TDRIVE        ; SET USER 0/DEFAULT DISK
  293.     STA    UDFLAG        ; SET USER/DISK NUMBER
  294.     RET
  295.  
  296. *  CONVERT CHAR IN A TO UPPER CASE
  297. UCASE:
  298.     CPI    61H        ; LOWER-CASE A
  299.     RC
  300.     CPI    7BH        ; GREATER THAN LOWER-CASE Z?
  301.     RNC
  302.     ANI    5FH        ; CAPITALIZE
  303.     RET
  304.  
  305. *  INPUT NEXT COMMAND TO CCP
  306. REDBUF:
  307.     LDA    RNGSUB        ; SUBMIT FILE CURRENTLY IN EXECUTION?
  308.     ORA    A        ; 0=NO
  309.     DB    28H
  310.     DB    RB1-$-1 AND 0FFH        ; GET LINE FROM CONSOLE IF NOT
  311.     LXI    D,SUBFCB    ; OPEN $$$.SUB
  312.     CALL    OPEN
  313.     DB    28H
  314.     DB    RB1-$-1 AND 0FFH        ; ERASE $$$.SUB IF END OF FILE AND GET CMND
  315.     LDA    SUBFRC        ; GET VALUE OF LAST RECORD IN FILE
  316.     DCR    A        ; PT TO NEXT TO LAST RECORD
  317.     STA    SUBFCR        ; SAVE NEW VALUE OF LAST RECORD IN $$$.SUB
  318.     LXI    D,SUBFCB    ; READ LAST RECORD OF SUBMIT FILE
  319.     CALL    READ
  320.     DB    20H
  321.     DB    RB1-$-1 AND 0FFH        ; ABORT $$$.SUB IF ERROR IN READING LAST REC
  322.     LXI    D,CBUFF        ; COPY LAST RECORD (NEXT SUBMIT CMND) TO CBUFF
  323.     LXI    H,TBUFF        ;   FROM TBUFF
  324.     MVI    B,BUFLEN    ; NUMBER OF BYTES
  325.     CALL    MOVEHD
  326.     LXI    H,SUBFS2    ; PT TO S2 OF $$$.SUB FCB
  327.     MVI    M,0        ; SET S2 TO ZERO
  328.     INX    H        ; PT TO RECORD COUNT
  329.     DCR    M        ; DECREMENT RECORD COUNT OF $$$.SUB
  330.     LXI    D,SUBFCB    ; CLOSE $$$.SUB
  331.     CALL    CLOSE
  332.     DB    28H
  333.     DB    RB1-$-1 AND 0FFH        ; ABORT $$$.SUB IF ERROR
  334.     MVI    A,'$'        ; PRINT SUBMIT PROMPT
  335.     CALL    CONOUT
  336.     LXI    H,CIBUFF    ; PRINT COMMAND LINE FROM $$$.SUB
  337.     CALL    PRIN1
  338.     CALL    BREAK        ; CHECK FOR ABORT (ANY CHAR)
  339.     DB    28H
  340.     DB    CNVBUF-$-1 AND 0FFH    ; IF <NULL> (NO ABORT), CAP COMMAND AND RUN
  341.     CALL    SUBKIL        ; KILL $$$.SUB IF ABORT
  342.     JMP    RESTRT        ; RESTART CCP
  343.  
  344. *  INPUT COMMAND LINE FROM USER CONSOLE
  345. RB1:
  346.     CALL    SUBKIL        ; ERASE $$$.SUB IF PRESENT
  347.     CALL    SETUD        ; SET USER AND DISK
  348.     MVI    A,'>'        ; PRINT PROMPT
  349.     CALL    CONOUT
  350.     MVI    C,0AH        ; READ COMMAND LINE FROM USER
  351.     LXI    D,MBUFF
  352.     CALL    BDOS
  353.     CALL    SETU0D        ; SET CURRENT DISK NUMBER IN LOWER PARAMS
  354.  
  355. *  CAPITALIZE STRING (ENDING IN 0) IN CBUFF
  356. CNVBUF:
  357.     LXI    H,CBUFF        ; PT TO USER'S COMMAND
  358.     MOV    B,M        ; CHAR COUNT IN B
  359. CB1:
  360.     INX    H        ; PT TO 1ST VALID CHAR
  361.     MOV    A,B        ; DONE WHEN <NULL> ENCOUNTERED
  362.     ORA    A
  363.     DB    28H
  364.     DB    CB2-$-1 AND 0FFH
  365.     MOV    A,M        ; CAPITALIZE COMMAND CHAR
  366.     CALL    UCASE
  367.     MOV    M,A
  368.     DCR    B        ; CONTINUE UNTIL END OF COMMAND LINE
  369.     DB    18H
  370.     DB    CB1-$-1 AND 0FFH
  371. CB2:
  372.     MOV    M,A        ; STORE ENDING <NULL>
  373.     LXI    H,CIBUFF    ; SET COMMAND LINE PTR TO 1ST CHAR
  374.     SHLD    CIBPTR
  375.     RET
  376.  
  377. *  CHECK FOR ANY CHAR FROM USER CONSOLE; RET W/ZERO SET IF NONE
  378. BREAK:
  379.     PUSH    D        ; SAVE DE
  380.     MVI    E,0FFH        ; GET STATUS
  381.     MVI    C,6        ; DIRECT CONSOLE I/O
  382.     CALL    BDOSB
  383.     POP    D
  384.     ANI    7FH        ; MASK MSB AND SET ZERO FLAG
  385.     RET
  386.  
  387. *  RETURN NUMBER OF CURRENT DISK IN A
  388. GETDRV:
  389.     MVI    C,19H
  390.     JMP    BDOS
  391.  
  392. *  SET 80H AS DMA ADDRESS
  393. DEFDMA:
  394.     LXI    D,TBUFF        ; 80H=TBUFF
  395. DMASET:
  396.     MVI    C,1AH
  397.     JMP    BDOS
  398.  
  399. *  CHECK FOR SUBMIT FILE IN EXECUTION AND ABORT IT IF SO
  400. SUBKIL:
  401.     LXI    H,RNGSUB    ; CHECK FOR SUBMIT FILE IN EXECUTION
  402.     MOV    A,M
  403.     ORA    A        ; 0=NO
  404.     RZ
  405.     MVI    M,0        ; ABORT SUBMIT FILE
  406.     LXI    D,SUBFCB    ; DELETE $$$.SUB
  407.     JMP    DELETE
  408.  
  409. *  INVALID COMMAND -- PRINT IT
  410. ERROR:
  411.     CALL    CRLF        ; NEW LINE
  412.     LHLD    CIPTR        ; PT TO BEGINNING OF COMMAND LINE
  413. ERR2:
  414.     MOV    A,M        ; GET CHAR
  415.     CPI    ' '        ; SIMPLE '?' IF <SP>
  416.     DB    28H
  417.     DB    ERR1-$-1 AND 0FFH
  418.     ORA    A        ; SIMPLE '?' IF <NULL>
  419.     DB    28H
  420.     DB    ERR1-$-1 AND 0FFH
  421.     PUSH    H        ; SAVE PTR TO ERROR COMMAND CHAR
  422.     CALL    CONOUT        ; PRINT COMMAND CHAR
  423.     POP    H        ; GET PTR
  424.     INX    H        ; PT TO NEXT
  425.     DB    18H
  426.     DB    ERR2-$-1 AND 0FFH    ; CONTINUE
  427. ERR1:
  428.     MVI    A,'?'        ; PRINT '?'
  429.     CALL    CONOUT
  430.     CALL    SUBKIL        ; TERMINATE ACTIVE $$$.SUB IF ANY
  431.     JMP    RESTRT        ; RESTART CCP
  432.  
  433. *  CHECK TO SEE IF DE PTS TO DELIMITER; IF SO, RET W/ZERO FLAG SET
  434. SDELM:
  435.     LDAX    D
  436.     ORA    A        ; 0=DELIMITER
  437.     RZ
  438.     CPI    ' '        ; ERROR IF < <SP>
  439.     JC    ERROR
  440.     RZ            ; <SP>=DELIMITER
  441.     CPI    '='        ; '='=DELIMITER
  442.     RZ
  443.     CPI    5FH        ; UNDERSCORE=DELIMITER
  444.     RZ
  445.     CPI    '.'        ; '.'=DELIMITER
  446.     RZ
  447.     CPI    ':'        ; ':'=DELIMITER
  448.     RZ
  449.     CPI    ';'        ; ';'=DELIMITER
  450.     RZ
  451.     CPI    '<'        ; '<'=DELIMITER
  452.     RZ
  453.     CPI    '>'        ; '>'=DELIMITER
  454.     RET
  455.  
  456. *  SKIP STRING PTED TO BY DE (STRING ENDS IN 0) UNTIL END OF STRING
  457. *    OR NON-BLANK ENCOUNTERED (BEGINNING OF TOKEN)
  458. SBLANK:
  459.     LDAX    D
  460.     ORA    A
  461.     RZ
  462.     CPI    ' '
  463.     RNZ
  464.     INX    D
  465.     DB    18H
  466.     DB    SBLANK-$-1 AND 0FFH
  467.  
  468. *  ADD A TO HL (HL=HL+A)
  469. ADDAH:
  470.     ADD    L
  471.     MOV    L,A
  472.     RNC
  473.     INR    H
  474.     RET
  475.  
  476. *  EXTRACT TOKEN FROM COMMAND LINE AND PLACE IT INTO FCBDN; FORMAT FCBDN
  477. *    IF TOKEN RESEMBLES FILE NAME AND TYPE (FILENAME.TYP);
  478. *    ON INPUT, CIBPTR PTS TO CHAR AT WHICH TO START SCAN
  479. *    ON OUTPUT, CIBPTR PTS TO CHAR AT WHICH TO CONTINUE AND ZERO FLAG IS SET
  480. *      IF '?' IS IN TOKEN
  481. SCANER:
  482.     MVI    A,0        ; START AT DRIVE SPECIFICATION BYTE
  483. SCAN1:
  484.     LXI    H,FCBDN        ; POINT TO FCBDN
  485.     CALL    ADDAH        ; OFFSET INTO FCB
  486.     PUSH    H
  487.     PUSH    H
  488.     XRA    A        ; SET TEMPORARY DRIVE NUMBER TO DEFAULT
  489.     STA    TEMPDR
  490.     LHLD    CIBPTR        ; GET PTR TO NEXT CHAR IN COMMAND LINE
  491.     XCHG            ; PTR IN DE
  492.     CALL    SBLANK        ; SKIP TO NON-BLANK OR END OF LINE
  493.     XCHG
  494.     SHLD    CIPTR        ; SET PTR TO NON-BLANK OR END OF LINE
  495.     XCHG            ; DE PTS TO NEXT NON-BLANK OR END OF LINE CHAR
  496.     POP    H        ; GET PTR TO NEXT BYTE IN FCBDN
  497.     LDAX    D        ; END OF LINE?
  498.     ORA    A        ; 0=YES
  499.     DB    28H
  500.     DB    SCAN2-$-1 AND 0FFH
  501.     SBI    'A'-1        ; CONVERT POSSIBLE DRIVE SPEC TO NUMBER
  502.     MOV    B,A        ; STORE NUMBER (A:=0, B:=1, ETC) IN B
  503.     INX    D        ; PT TO NEXT CHAR
  504.     LDAX    D        ; SEE IF IT IS A COLON (:)
  505.     CPI    ':'
  506.     DB    28H
  507.     DB    SCAN3-$-1 AND 0FFH    ; YES^  WE HAVE A DRIVE SPEC
  508.     DCX    D        ; NO^  BACK UP PTR TO FIRST NON-BLANK CHAR
  509. SCAN2:
  510.     LDA    TDRIVE        ; SET 1ST BYTE OF FCBDN AS DEFAULT DRIVE
  511.     MOV    M,A
  512.     DB    18H
  513.     DB    SCAN4-$-1 AND 0FFH
  514. SCAN3:
  515.     MOV    A,B        ; WE HAVE A DRIVE SPEC^
  516.     STA    TEMPDR        ; SET TEMPORARY DRIVE
  517.     MOV    M,B        ; SET 1ST BYTE OF FCBDN AS SPECIFIED DRIVE
  518.     INX    D        ; PT TO BYTE AFTER ':'
  519.  
  520. *  EXTRACT FILENAME FROM POSSIBLE FILENAME.TYP
  521. SCAN4:
  522.     MVI    B,08H        ; MAX OF 8 CHARS IN FILE NAME
  523. SCAN5:
  524.     CALL    SDELM        ; DONE IF DELIMITER ENCOUNTERED - <SP> FILL
  525.     DB    28H
  526.     DB    SCAN9-$-1 AND 0FFH
  527.     INX    H        ; PT TO NEXT BYTE IN FCBDN
  528.     CPI    '*'        ; IS (DE) A WILD CARD?
  529.     DB    20H
  530.     DB    SCAN6-$-1 AND 0FFH    ; CONTINUE IF NOT
  531.     MVI    M,'?'        ; PLACE '?' IN FCBDN AND DON'T ADVANCE DE IF SO
  532.     DB    18H
  533.     DB    SCAN7-$-1 AND 0FFH
  534. SCAN6:
  535.     MOV    M,A        ; STORE FILENAME CHAR IN FCBDN
  536.     INX    D        ; PT TO NEXT CHAR IN COMMAND LINE
  537. SCAN7:
  538.     DB    10H
  539.     DB    SCAN5-$-1 AND 0FFH    ; DECREMENT CHAR COUNT UNTIL 8 ELAPSED
  540. SCAN8:
  541.     CALL    SDELM        ; 8 CHARS OR MORE - SKIP UNTIL DELIMITER
  542.     DB    28H
  543.     DB    SCAN10-$-1 AND 0FFH    ; ZERO FLAG SET IF DELIMITER FOUND
  544.     INX    D        ; PT TO NEXT CHAR IN COMMAND LINE
  545.     DB    18H
  546.     DB    SCAN8-$-1 AND 0FFH
  547. SCAN9:
  548.     INX    H        ; PT TO NEXT BYTE IN FCBDN
  549.     MVI    M,' '        ; FILL FILENAME PART WITH <SP>
  550.     DB    10H
  551.     DB    SCAN9-$-1 AND 0FFH
  552.  
  553. *  EXTRACT FILE TYPE FROM POSSIBLE FILENAME.TYP
  554. SCAN10:
  555.     MVI    B,03H        ; PREPARE TO EXTRACT TYPE
  556.     CPI    '.'        ; IF (DE) DELIMITER IS A '.', WE HAVE A TYPE
  557.     DB    20H
  558.     DB    SCAN15-$-1 AND 0FFH    ; FILL FILE TYPE BYTES WITH <SP>
  559.     INX    D        ; PT TO CHAR IN COMMAND LINE AFTER '.'
  560. SCAN11:
  561.     CALL    SDELM        ; CHECK FOR DELIMITER
  562.     DB    28H
  563.     DB    SCAN15-$-1 AND 0FFH    ; FILL REST OF TYPE IF IT IS A DELIMITER
  564.     INX    H        ; PT TO NEXT BYTE IN FCBDN
  565.     CPI    '*'        ; WILD?
  566.     DB    20H
  567.     DB    SCAN12-$-1 AND 0FFH    ; STORE CHAR IF NOT WILD
  568.     MVI    M,'?'        ; STORE '?' AND DON'T ADVANCE COMMAND LINE PTR
  569.     DB    18H
  570.     DB    SCAN13-$-1 AND 0FFH
  571. SCAN12:
  572.     MOV    M,A        ; STORE CHAR IN FCBDN
  573.     INX    D        ; PT TO NEXT CHAR IN COMMAND LINE
  574. SCAN13:
  575.     DB    10H
  576.     DB    SCAN11-$-1 AND 0FFH    ; COUNT DOWN CHARS IN FILE TYPE (3 MAX)
  577. SCAN14:
  578.     CALL    SDELM        ; SKIP REST OF CHARS AFTER 3-CHAR TYPE TO
  579.     DB    28H
  580.     DB    SCAN16-$-1 AND 0FFH    ;   DELIMITER
  581.     INX    D
  582.     DB    18H
  583.     DB    SCAN14-$-1 AND 0FFH
  584. SCAN15:
  585.     INX    H        ; FILL IN REST OF TYP WITH <SP>
  586.     MVI    M,' '
  587.     DB    10H
  588.     DB    SCAN15-$-1 AND 0FFH
  589.  
  590. *  FILL IN EX, S1, S2, AND RC WITH ZEROES
  591. SCAN16:
  592.     MVI    B,4        ; 4 BYTES
  593. SCAN17:
  594.     INX    H        ; PT TO NEXT BYTE IN FCBDN
  595.     MVI    M,0
  596.     DB    10H
  597.     DB    SCAN17-$-1 AND 0FFH
  598.  
  599. *  SCAN COMPLETE -- DE PTS TO DELIMITER BYTE AFTER TOKEN
  600.     XCHG            ; STORE PTR TO NEXT BYTE IN COMMAND LINE
  601.     SHLD    CIBPTR
  602.  
  603. *  SET ZERO FLAG TO INDICATE PRESENCE OF '?' IN FILENAME.TYP
  604.     POP    H        ; GET PTR TO FCBDN IN HL
  605.     LXI    B,11        ; SCAN FOR '?' IN FILENAME.TYP (C=11 BYTES)
  606. SCAN18:
  607.     INX    H        ; PT TO NEXT BYTE IN FCBDN
  608.     MOV    A,M
  609.     CPI    '?'
  610.     DB    20H
  611.     DB    SCAN19-$-1 AND 0FFH
  612.     INR    B        ; B<>0 TO INDICATE '?' ENCOUNTERED
  613. SCAN19:
  614.     DCR    C        ; COUNT DOWN
  615.     DB    20H
  616.     DB    SCAN18-$-1 AND 0FFH
  617.     MOV    A,B        ; A=B=NUMBER OF '?' IN FILENAME.TYP
  618.     ORA    A        ; SET ZERO FLAG TO INDICATE ANY '?'
  619.     RET
  620.  
  621. *
  622. *  CCP BUILT-IN COMMAND TABLE AND COMMAND PROCESSOR
  623. *
  624. NCMNDS    EQU    8        ; NUMBER OF CCP COMMANDS
  625. NCHARS    EQU    4        ; NUMBER OF CHARS/COMMAND
  626. *  CCP COMMAND NAME TABLE
  627. CMDTBL:
  628.     DB    'DIR '
  629.     DB    'ERA '
  630.     DB    'LIST'
  631.     DB    'TYPE'
  632.     DB    'SAVE'
  633.     DB    'REN '
  634.     DB    'USER'
  635.     DB    'CLS '
  636. *  CCP COMMAND ADDRESS TABLE
  637. REQTBL:
  638.     DW    DIR
  639.     DW    ERA
  640.     DW    LIST
  641.     DW    TYPE
  642.     DW    SAVE
  643.     DW    REN
  644.     DW    USER
  645.     DW    CLS
  646.     DW    COM        ;MUST BE A COM FILE
  647.  
  648. *  CMDTBL (COMMAND TABLE) SCANNER
  649. *    ON RETURN, A=TABLE ENTRY # (0-5) OR 6 IF NOT FOUND (COM FILE)
  650. CMDSER:
  651.     LXI    H,CMDTBL    ; PT TO COMMAND TABLE
  652.     MVI    C,0        ; SET COMMAND COUNTER
  653. CMS1:
  654.     MOV    A,C        ; CHECK FOR DONE
  655.     CPI    NCMNDS        ; NUMBER OF COMMANDS
  656.     RNC
  657.     LXI    D,FCBFN        ; PT TO STORED COMMAND NAME
  658.     MVI    B,NCHARS    ; NUMBER OF CHARS/COMMAND (8 MAX)
  659. CMS2:
  660.     LDAX    D        ; COMPARE AGAINST TABLE ENTRY
  661.     CMP    M
  662.     DB    20H
  663.     DB    CMS3-$-1 AND 0FFH    ; NO MATCH
  664.     INX    D        ; PT TO NEXT CHAR
  665.     INX    H
  666.     DB    10H
  667.     DB    CMS2-$-1 AND 0FFH    ; COUNT DOWN
  668.     LDAX    D        ; NEXT CHAR IN INPUT COMMAND MUST BE <SP>
  669.     CPI    ' '
  670.     DB    20H
  671.     DB    CMS4-$-1 AND 0FFH
  672.     MOV    A,C        ; TABLE ENTRY NUMBER IN A
  673.     RET
  674. CMS3:
  675.     INX    H        ; SKIP TO NEXT COMMAND TABLE ENTRY
  676.     DB    10H
  677.     DB    CMS3-$-1 AND 0FFH
  678. CMS4:
  679.     INR    C        ; INCREMENT TABLE ENTRY NUMBER
  680.     DB    18H
  681.     DB    CMS1-$-1 AND 0FFH
  682.  
  683. *
  684. *  CCP STARTING POINTS
  685. *
  686.  
  687. *  START CCP AND DON'T PROCESS DEFAULT COMMAND STORED
  688. CCP1:
  689.     XRA    A        ; SET NO DEFAULT COMMAND
  690.     STA    CBUFF
  691.  
  692. *  START CCP AND POSSIBLY PROCESS DEFAULT COMMAND
  693. CCP:
  694.     LXI    SP,STACK    ; RESET STACK
  695.     PUSH    B
  696.     MOV    A,C        ; C=USER/DISK NUMBER (SEE LOC 4)
  697.     RAR            ; EXTRACT USER NUMBER
  698.     RAR
  699.     RAR
  700.     RAR
  701.     ANI    0FH
  702.     MOV    E,A        ; SET USER NUMBER
  703.     CALL    SETUSR
  704.     CALL    RESET        ; RESET DISK SYSTEM
  705.     POP    B
  706.     MOV    A,C        ; C=USER/DISK NUMBER (SEE LOC 4)
  707.     ANI    0FH        ; EXTRACT DEFAULT DISK DRIVE
  708.     STA    TDRIVE        ; SET IT
  709.     CALL    LOGIN        ; LOG IN DEFAULT DISK
  710.     LXI    D,SUBFCB    ; CHECK FOR $$$.SUB ON CURRENT DISK
  711.     CALL    SEAR1
  712.     CMA            ; 0FFH IS RETURNED IF NO $$$.SUB, SO COMPLEMENT
  713.     STA    RNGSUB        ; SET FLAG (0=NO $$$.SUB)
  714.     LDA    CBUFF        ; EXECUTE DEFAULT COMMAND?
  715.     ORA    A        ; 0=NO
  716.     DB    20H
  717.     DB    RS1-$-1 AND 0FFH
  718.  
  719. *  PROMPT USER AND INPUT COMMAND LINE FROM HIM
  720. RESTRT:
  721.     LXI    SP,STACK    ; RESET STACK
  722.  
  723. *  PRINT PROMPT (DU>)
  724.     CALL    CRLF        ; PRINT PROMPT
  725.     CALL    GETDRV        ; CURRENT DRIVE IS PART OF PROMPT
  726.     ADI    'A'        ; CONVERT TO ASCII A-P
  727.     CALL    CONOUT
  728.     CALL    GETUSR        ; GET USER NUMBER
  729.     CPI    10        ; USER < 10?
  730.     DB    38H
  731.     DB    RS00-$-1 AND 0FFH
  732.     SUI    10        ; SUBTRACT 10 FROM IT
  733.     PUSH    PSW        ; SAVE IT
  734.     MVI    A,'1'        ; OUTPUT 10'S DIGIT
  735.     CALL    CONOUT
  736.     POP    PSW
  737. RS00:
  738.     ADI    '0'        ; OUTPUT 1'S DIGIT (CONVERT TO ASCII)
  739.     CALL    CONOUT
  740.  
  741. *  READ INPUT LINE FROM USER OR $$$.SUB
  742.     CALL    REDBUF        ; INPUT COMMAND LINE FROM USER (OR $$$.SUB)
  743.  
  744. *  PROCESS INPUT LINE
  745. RS1:
  746.     LXI    D,TBUFF        ; PT TO INPUT COMMAND LINE (IN TBUFF)
  747.     CALL    DMASET        ; SET TBUFF TO DMA ADDRESS
  748.     CALL    GETDRV        ; GET DEFAULT DRIVE NUMBER
  749.     STA    TDRIVE        ; SET IT
  750.     CALL    SCANER        ; PARSE COMMAND NAME FROM COMMAND LINE
  751.     CNZ    ERROR        ; ERROR IF COMMAND NAME CONTAINS A '?'
  752.     LDA    TEMPDR        ; IS COMMAND OF FORM 'D:COMMAND'?
  753.     ORA    A        ; NZ=YES
  754.     JNZ    COM        ; PROCESS AS COM FILE IMMEDIATELY
  755.     CALL    CMDSER        ; SCAN FOR CCP-RESIDENT COMMAND
  756.     LXI    H,REQTBL    ; EXECUTE COMMAND (CCP-RESIDENT OR COM)
  757.     MOV    E,A        ; COMPUTE OFFSET INTO ADDRESS TABLE
  758.     MVI    D,0
  759.     DAD    D
  760.     DAD    D
  761.     MOV    A,M        ; GET ADDRESS IN HL
  762.     INX    H
  763.     MOV    H,M        ; ADDRESS HIGH
  764.     MOV    L,A        ; ADDRESS LOW
  765.     PCHL            ; EXECUTE CCP ROUTINE
  766.  
  767. *
  768. *  ERROR MESSAGES
  769. *
  770. PRNNF:
  771.     CALL    PRINT        ; NO FILE MESSAGE
  772.     DB    'No Files',0
  773.     RET
  774.  
  775. *
  776. *  MORE CCP UTILITIES
  777. *
  778.  
  779. *  EXTRACT NUMBER FROM COMMAND LINE
  780. NUMBER:
  781.     CALL    SCANER        ; PARSE NUMBER AND PLACE IN FCBFN
  782.     LDA    TEMPDR        ; TOKEN BEGIN WITH DRIVE SPEC (D:)?
  783.     ORA    A        ; ERROR IF SO
  784.     JNZ    ERROR
  785.     LXI    H,FCBFN        ; PT TO TOKEN FOR CONVERSION
  786.     LXI    B,11        ; B=ACCUMULATED VALUE, C=CHAR COUNT
  787. NUM1:
  788.     MOV    A,M        ; GET CHAR
  789.     CPI    ' '        ; DONE IF <SP>
  790.     DB    28H
  791.     DB    NUM2-$-1 AND 0FFH
  792.     INX    H        ; PT TO NEXT CHAR
  793.     SUI    '0'        ; CONVERT TO BINARY (ASCII 0-9 TO BINARY)
  794.     CPI    10        ; ERROR IF >= 10
  795.     JNC    ERROR
  796.     MOV    D,A        ; DIGIT IN D
  797.     MOV    A,B        ; GET ACCUMULATED VALUE
  798.     ANI    0E0H        ; CHECK FOR RANGE ERROR (>255)
  799.     JNZ    ERROR
  800.     MOV    A,B        ; NEW VALUE = OLD VALUE * 10
  801.     RLC
  802.     RLC
  803.     RLC
  804.     ADD    B        ; CHECK FOR RANGE ERROR
  805.     JC    ERROR
  806.     ADD    B        ; CHECK FOR RANGE ERROR
  807.     JC    ERROR
  808.     ADD    D        ; NEW VALUE = OLD VALUE * 10 + DIGIT
  809.     JC    ERROR        ; CHECK FOR RANGE ERROR
  810.     MOV    B,A        ; SET NEW VALUE
  811.     DCR    C        ; COUNT DOWN
  812.     DB    20H
  813.     DB    NUM1-$-1 AND 0FFH
  814.     RET
  815.  
  816. *  REST OF TOKEN BUFFER MUST BE <SP>
  817. NUM2:
  818.     MOV    A,M        ; CHECK FOR <SP>
  819.     CPI    ' '
  820.     JNZ    ERROR
  821.     INX    H        ; PT TO NEXT
  822.     DCR    C        ; COUNT DOWN CHARS
  823.     DB    20H
  824.     DB    NUM2-$-1 AND 0FFH
  825.     MOV    A,B        ; GET ACCUMULATED VALUE
  826.     RET
  827.  
  828. *  MOVE 3 BYTES FROM HL TO DE
  829. MOVHD3:
  830.     MVI    B,3        ; MOVE 3 CHARS
  831. MOVEHD:
  832.     MOV    A,M        ; GET IT
  833.     STAX    D        ; PUT IT
  834.     INX    H        ; PT TO NEXT
  835.     INX    D
  836.     DB    10H
  837.     DB    MOVEHD-$-1 AND 0FFH
  838.     RET
  839.  
  840. *  PT TO DIRECTORY ENTRY IN TBUFF WHOSE OFFSET IS SPECIFIED BY A AND C
  841. DIRPTR:
  842.     LXI    H,TBUFF        ; PT TO TEMP BUFFER
  843.     ADD    C        ; PT TO 1ST BYTE OF DIR ENTRY
  844.     CALL    ADDAH        ; PT TO DESIRED BYTE IN DIR ENTRY
  845.     MOV    A,M        ; GET DESIRED BYTE
  846.     RET
  847.  
  848. *  CHECK FOR SPECIFIED DRIVE AND LOG IT IN IF NOT DEFAULT
  849. SLOGIN:
  850.     XRA    A        ; SET FCBDN FOR DEFAULT DRIVE
  851.     STA    FCBDN
  852.     CALL    COMLOG        ; CHECK DRIVE
  853.     RZ
  854.     JMP    LOGIN        ; DO LOGIN OTHERWISE
  855.  
  856. *  CHECK FOR SPECIFIED DRIVE AND LOG IN DEFAULT DRIVE IF SPECIFIED<>DEFAULT
  857. DLOGIN:
  858.     CALL    COMLOG        ; CHECK DRIVE
  859.     RZ            ; ABORT IF SAME
  860.     LDA    TDRIVE        ; LOG IN DEFAULT DRIVE
  861.     JMP    LOGIN
  862.  
  863. *  ROUTINE COMMON TO BOTH LOGIN ROUTINES; ON EXIT, Z SET MEANS ABORT
  864. COMLOG:
  865.     LDA    TEMPDR        ; DRIVE SPECIFIED?
  866.     ORA    A        ; 0=NO
  867.     RZ
  868.     DCR    A        ; COMPARE IT AGAINST DEFAULT
  869.     LXI    H,TDRIVE
  870.     CMP    M
  871.     RET            ; ABORT IF SAME
  872.  
  873. *
  874. *  CCP DIRECTORY DISPLAY FUNCTION (DIR)
  875. *
  876. DIR:
  877.     MVI    A,80H        ; SET SYSTEM BIT EXAMINATION
  878.     PUSH    PSW
  879.     CALL    SCANER        ; EXTRACT POSSIBLE D:FILENAME.TYP TOKEN
  880.     CALL    SLOGIN        ; LOG IN DRIVE IF NECESSARY
  881.     LXI    H,FCBFN        ; MAKE FCB WILD (ALL '?') IF NO FILENAME.TYP
  882.     MOV    A,M        ; GET FIRST CHAR OF FILENAME.TYP
  883.     CPI    ' '        ; IF <SP>, ALL WILD
  884.     DB    28H
  885.     DB    DIR0-$-1 AND 0FFH
  886.     CPI    '@'        ; SYSTEM FILES?
  887.     DB    20H
  888.     DB    DIR2-$-1 AND 0FFH
  889.     INX    H        ; JUST '@'?  <SP> MUST FOLLOW
  890.     MOV    A,M
  891.     DCX    H        ; BACK UP
  892.     CPI    ' '        ; JUST '@' IF <SP> FOLLOWS
  893.     DB    20H
  894.     DB    DIR2-$-1 AND 0FFH
  895.     POP    PSW        ; GET FLAG
  896.     XRA    A        ; SET NO SYSTEM BIT EXAMINATION
  897.     PUSH    PSW
  898. DIR0:
  899.     MVI    B,11        ; NUMBER OF CHARS IN FN & FT
  900. DIR1:
  901.     MVI    M,'?'        ; STORE '?'
  902.     INX    H
  903.     DB    10H
  904.     DB    DIR1-$-1 AND 0FFH
  905. DIR2:
  906.     POP    PSW        ; GET FLAG
  907.     CALL    DIRPR        ; PRINT DIRECTORY
  908.     JMP    RSTCCP        ; RESTART CCP
  909.  
  910. *  DIRECTORY PRINT ROUTINE; ON ENTRY, MSB OF A IS 1 (80H) IF SYSTEM FILES EXCL
  911. DIRPR:
  912.     MOV    D,A        ; STORE SYSTEM FLAG IN D
  913.     MVI    E,0        ; SET COLUMN COUNTER TO ZERO
  914.     PUSH    D        ; SAVE COLUMN COUNTER (E) AND SYSTEM FLAG (D)
  915.     CALL    SEARF        ; SEARCH FOR SPECIFIED FILE (FIRST OCCURRANCE)
  916.     CZ    PRNNF        ; PRINT NO FILE MSG; REG A NOT CHANGED
  917.  
  918. *  ENTRY SELECTION LOOP; ON ENTRY, A=OFFSET FROM SEARF OR SEARN
  919. DIR3:
  920.     DB    28H
  921.     DB    DIR11-$-1 AND 0FFH    ; DONE IF ZERO FLAG SET
  922.     DCR    A        ; ADJUST TO RETURNED VALUE
  923.     RRC            ; CONVERT NUMBER TO OFFSET INTO TBUFF
  924.     RRC
  925.     RRC
  926.     ANI    60H
  927.     MOV    C,A        ; OFFSET INTO TBUFF IN C (C=OFFSET TO ENTRY)
  928.     MVI    A,10        ; ADD 10 TO PT TO SYSTEM FILE ATTRIBUTE BIT
  929.     CALL    DIRPTR
  930.     POP    D        ; GET SYSTEM BIT MASK FROM D
  931.     PUSH    D
  932.     ANA    D        ; MASK FOR SYSTEM BIT
  933.     DB    20H
  934.     DB    DIR10-$-1 AND 0FFH    ; SKIP ENTRY IF BIT IS SET
  935.     POP    D        ; GET ENTRY COUNT (=<CR> COUNTER)
  936.     MOV    A,E        ; ADD 1 TO IT
  937.     INR    E
  938.     PUSH    D        ; SAVE IT
  939.     ANI    03H        ; OUTPUT <CRLF> IF 4 ENTRIES PRINTED IN LINE
  940.     PUSH    PSW
  941.     DB    20H
  942.     DB    DIR4-$-1 AND 0FFH
  943.     CALL    CRLF        ; NEW LINE
  944.     DB    18H
  945.     DB    DIR5-$-1 AND 0FFH
  946. DIR4:
  947.     CALL    SPACER        ; PRINT <SP>:<SP> BETWEEN ENTRIES
  948.     MVI    A,':'
  949.     CALL    CONOUT
  950.     CALL    SPACER
  951. DIR5:
  952.     MVI    B,01H        ; PT TO 1ST BYTE OF FILE NAME
  953. DIR6:
  954.     MOV    A,B        ; A=OFFSET
  955.     CALL    DIRPTR        ; HL NOW PTS TO 1ST BYTE OF FILE NAME
  956.     ANI    7FH        ; MASK OUT MSB
  957.     CPI    ' '        ; NO FILE NAME?
  958.     DB    20H
  959.     DB    DIR8-$-1 AND 0FFH    ; PRINT FILE NAME IF PRESENT
  960.     POP    PSW
  961.     PUSH    PSW
  962.     CPI    03H
  963.     DB    20H
  964.     DB    DIR7-$-1 AND 0FFH
  965.     MVI    A,09H        ; PT TO 1ST BYTE OF FILE TYPE
  966.     CALL    DIRPTR        ; HL NOW PTS TO 1ST BYTE OF FILE TYPE
  967.     ANI    7FH        ; MASK OUT MSB
  968.     CPI    ' '        ; NO FILE TYPE?
  969.     DB    28H
  970.     DB    DIR9-$-1 AND 0FFH    ; CONTINUE IF SO
  971. DIR7:
  972.     MVI    A,' '        ; OUTPUT <SP>
  973. DIR8:
  974.     CALL    CONOUT        ; PRINT CHAR
  975.     INR    B        ; INCR CHAR COUNT
  976.     MOV    A,B
  977.     CPI    12        ; END OF FILENAME.TYP?
  978.     DB    30H
  979.     DB    DIR9-$-1 AND 0FFH    ; CONTINUE IF SO
  980.     CPI    09H        ; END IF FILENAME ONLY?
  981.     DB    20H
  982.     DB    DIR6-$-1 AND 0FFH    ; PRINT TYP IF SO
  983.     MVI    A,'.'        ; PRINT DOT BETWEEN FILE NAME AND TYPE
  984.     CALL    CONOUT
  985.     DB    18H
  986.     DB    DIR6-$-1 AND 0FFH
  987. DIR9:
  988.     POP    PSW
  989. DIR10:
  990.     CALL    BREAK        ; CHECK FOR ABORT
  991.     DB    20H
  992.     DB    DIR11-$-1 AND 0FFH
  993.     CALL    SEARN        ; SEARCH FOR NEXT FILE
  994.     DB    18H
  995.     DB    DIR3-$-1 AND 0FFH    ; CONTINUE
  996. DIR11:
  997.     POP    D        ; RESTORE STACK
  998.     RET
  999.  
  1000. *
  1001. *  CCP FILE ERASE FUNCTION (ERA)
  1002. *
  1003. ERA:
  1004.     CALL    SCANER        ; PARSE FILE SPECIFICATION
  1005.     CPI    0BH        ; ALL WILD (ALL FILES = 11 '?')?
  1006.     DB    20H
  1007.     DB    ERA1-$-1 AND 0FFH    ; IF NOT, THEN DO ERASES
  1008.     CALL    PRINT
  1009.     DB    'All (Y/N)?',0
  1010.     CALL    REDBUF        ; GET REPLY
  1011.     LXI    H,CBUFF        ; CHECK FOR <CR>
  1012.     DCR    M
  1013.     JNZ    RESTRT        ; RESTART CCP IF JUST <CR>
  1014.     INX    H        ; PT TO RESPONSE BYTE
  1015.     MOV    A,M        ; GET IT
  1016.     CPI    'Y'        ; YES?
  1017.     JNZ    RESTRT        ; RESTART CCP IF NOT
  1018.     INX    H        ; PT TO CHAR AFTER 'Y'
  1019.     SHLD    CIBPTR        ; SET PTR TO IT
  1020. ERA1:
  1021.     CALL    SLOGIN        ; LOG IN SELECTED DISK IF ANY
  1022.     MVI    A,80H        ; SKIP SYSTEM FILES (EXAMINE SYSTEM BIT)
  1023.     CALL    DIRPR        ; PRINT DIRECTORY OF ERASED FILES
  1024.     LXI    D,FCBDN        ; DELETE FILE SPECIFIED
  1025.     CALL    DELETE
  1026.     JMP    RSTCCP        ; REENTER CCP
  1027.  
  1028. *
  1029. *  CCP LIST FUNCTION (LIST)
  1030. *
  1031. LIST:
  1032.     MVI    A,0FFH        ; TURN ON PRINTER FLAG
  1033.     DB    18H
  1034.     DB    TYPE0-$-1 AND 0FFH
  1035.  
  1036. *
  1037. *  CCP TYPE FUNCTION (TYPE)
  1038. *
  1039. TYPE:
  1040.     XRA    A        ; TURN OFF PRINTER FLAG
  1041.  
  1042. *  ENTRY POINT FOR CCP LIST FUNCTION (LIST)
  1043. TYPE0:
  1044.     STA    PRFLG        ; SET FLAG
  1045.     CALL    SCANER        ; EXTRACT FILENAME.TYP TOKEN
  1046.     JNZ    ERROR        ; ERROR IF ANY QUESTION MARKS
  1047.     CALL    SLOGIN        ; LOG IN SELECTED DISK IF ANY
  1048.     CALL    OPENF        ; OPEN SELECTED FILE
  1049.     JZ    TYPE4        ; ABORT IF ERROR
  1050.     CALL    CRLF        ; NEW LINE
  1051.     CALL    PAGSET        ; SET LINE COUNT
  1052.     LXI    H,CHRCNT    ; SET CHAR POSITION/COUNT
  1053.     MVI    M,0FFH        ; EMPTY LINE
  1054.     MVI    B,0        ; SET TAB CHAR COUNTER
  1055. TYPE1:
  1056.     LXI    H,CHRCNT    ; PT TO CHAR POSITION/COUNT
  1057.     MOV    A,M        ; END OF BUFFER?
  1058.     CPI    80H
  1059.     DB    38H
  1060.     DB    TYPE2-$-1 AND 0FFH
  1061.     PUSH    H        ; READ NEXT BLOCK
  1062.     CALL    READF
  1063.     POP    H
  1064.     DB    20H
  1065.     DB    TYPE3-$-1 AND 0FFH    ; ERROR?
  1066.     XRA    A        ; RESET COUNT
  1067.     MOV    M,A
  1068. TYPE2:
  1069.     INR    M        ; INCREMENT CHAR COUNT
  1070.     LXI    H,TBUFF        ; PT TO BUFFER
  1071.     CALL    ADDAH        ; COMPUTE ADDRESS OF NEXT CHAR FROM OFFSET
  1072.     MOV    A,M        ; GET NEXT CHAR
  1073.     ANI    7FH        ; MASK OUT MSB
  1074.     CPI    1AH        ; END OF FILE (^Z)?
  1075.     JZ    RSTCCP        ; RESTART CCP IF SO
  1076.     PUSH    PSW        ; SAVE CHAR
  1077.     LDA    PRFLG        ; TYPE OR LIST?
  1078.     ORA    A        ; 0=TYPE
  1079.     DB    28H
  1080.     DB    TYPE2T-$-1 AND 0FFH
  1081.  
  1082. *  OUTPUT CHAR TO LST: DEVICE WITH TABULATION
  1083.     POP    PSW        ; GET CHAR
  1084.     CPI    CR        ; RESET TAB COUNT?
  1085.     DB    28H
  1086.     DB    TABRST-$-1 AND 0FFH
  1087.     CPI    LF        ; RESET TAB COUNT?
  1088.     DB    28H
  1089.     DB    TABRST-$-1 AND 0FFH
  1090.     CPI    TAB        ; TAB?
  1091.     DB    28H
  1092.     DB    LTAB-$-1 AND 0FFH
  1093.     CALL    LSTOUT        ; LIST CHAR
  1094.     INR    B        ; INCREMENT CHAR COUNT
  1095.     DB    18H
  1096.     DB    TYPE2L-$-1 AND 0FFH
  1097. TABRST:
  1098.     CALL    LSTOUT        ; OUTPUT <CR>
  1099.     MVI    B,0        ; RESET TAB COUNTER
  1100.     DB    18H
  1101.     DB    TYPE2L-$-1 AND 0FFH
  1102. LTAB:
  1103.     MVI    A,' '        ; <SP>
  1104.     CALL    LSTOUT
  1105.     INR    B        ; INCR POS COUNT
  1106.     MOV    A,B
  1107.     ANI    7
  1108.     DB    20H
  1109.     DB    LTAB-$-1 AND 0FFH
  1110.     DB    18H
  1111.     DB    TYPE2L-$-1 AND 0FFH
  1112.  
  1113. *  OUTPUT CHAR TO CON: WITH TABULATION
  1114. TYPE2T:
  1115.     POP    PSW        ; GET CHAR
  1116.     PUSH    PSW        ; SAVE CHAR
  1117.     CALL    CONOUT        ; TYPE CHAR
  1118.     POP    PSW
  1119.     CPI    LF        ; PAGE ON <LF>
  1120.     CZ    PAGER        ; COUNT LINES AND PAGE
  1121.  
  1122. *  CONTINUE PROCESSING
  1123. TYPE2L:
  1124.     CALL    BREAK        ; CHECK FOR ABORT
  1125.     DB    28H
  1126.     DB    TYPE1-$-1 AND 0FFH    ; CONTINUE IF NO CHAR
  1127.     CPI    'C'-'@'        ; ^C?
  1128.     JZ    RSTCCP        ; RESTART IF SO
  1129.     DB    18H
  1130.     DB    TYPE1-$-1 AND 0FFH
  1131. TYPE3:
  1132.     DCR    A        ; NO ERROR?
  1133.     JZ    RSTCCP        ; RESTART CCP
  1134.     CALL    PRINT        ; PRINT READ ERROR MSG
  1135.     DB    'Read Error',0
  1136. TYPE4:
  1137.     CALL    DLOGIN        ; LOG IN DEFAULT DRIVE
  1138.     JMP    ERROR
  1139.  
  1140. *
  1141. *  PAGING ROUTINES
  1142. *    PAGER COUNTS DOWN LINES AND PAUSES FOR INPUT (DIRECT) IF COUNT EXPIRES
  1143. *    PAGSET SETS LINES/PAGE COUNT
  1144. *
  1145. PAGER:
  1146.     LDA    PAGCNT        ; COUNT DOWN
  1147.     DCR    A
  1148.     STA    PAGCNT
  1149.     RNZ
  1150.     PUSH    H        ; SAVE HL
  1151. PAGER1:
  1152.     MVI    C,6        ; DIRECT CONSOLE I/O
  1153.     MVI    E,0FFH        ; INPUT
  1154.     CALL    BDOSB
  1155.     ORA    A        ; CHAR READY?
  1156.     DB    28H
  1157.     DB    PAGER1-$-1 AND 0FFH    ; WAIT FOR CHAR
  1158.     CPI    'C'-'@'        ; ^C
  1159.     JZ    RSTCCP        ; RESTART CCP
  1160.     POP    H        ; RESTORE HL
  1161. PAGSET:
  1162.     MVI    A,NLINES-2    ; GET LINE COUNT
  1163.     STA    PAGCNT
  1164.     RET
  1165.  
  1166. *
  1167. *  CCP SAVE FUNCTION (SAVE)
  1168. *
  1169. SAVE:
  1170.     CALL    NUMBER        ; EXTRACT NUMBER FROM COMMAND LINE
  1171.     PUSH    PSW        ; SAVE IT
  1172.     CALL    SCANER        ; EXTRACT FILENAME.TYPE
  1173.     JNZ    ERROR        ; MUST BE NO '?' IN IT
  1174.     CALL    SLOGIN        ; LOG IN SELECTED DISK
  1175.     LXI    D,FCBDN        ; DELETE FILE IN CASE IT ALREADY EXISTS
  1176.     PUSH    D
  1177.     CALL    DELETE
  1178.     POP    D
  1179.     CALL    CREATE        ; MAKE NEW FILE
  1180.     DB    28H
  1181.     DB    SAVE3-$-1 AND 0FFH    ; ERROR?
  1182.     XRA    A        ; SET RECORD COUNT FIELD OF NEW FILE'S FCB
  1183.     STA    FCBCR
  1184.     POP    PSW        ; GET PAGE COUNT
  1185.     MOV    L,A        ; HL=PAGE COUNT
  1186.     MVI    H,0
  1187.     DAD    H        ; DOUBLE IT FOR HL=SECTOR (128 BYTES) COUNT
  1188.     LXI    D,TPA        ; PT TO START OF SAVE AREA (TPA)
  1189. SAVE1:
  1190.     MOV    A,H        ; DONE WITH SAVE?
  1191.     ORA    L        ; HL=0 IF SO
  1192.     DB    28H
  1193.     DB    SAVE2-$-1 AND 0FFH
  1194.     DCX    H        ; COUNT DOWN ON SECTORS
  1195.     PUSH    H        ; SAVE PTR TO BLOCK TO SAVE
  1196.     LXI    H,128        ; 128 BYTES PER SECTOR
  1197.     DAD    D        ; PT TO NEXT SECTOR
  1198.     PUSH    H        ; SAVE ON STACK
  1199.     CALL    DMASET        ; SET DMA ADDRESS FOR WRITE (ADDRESS IN DE)
  1200.     LXI    D,FCBDN        ; WRITE SECTOR
  1201.     CALL    WRITE
  1202.     POP    D        ; GET PTR TO NEXT SECTOR IN DE
  1203.     POP    H        ; GET SECTOR COUNT
  1204.     DB    20H
  1205.     DB    SAVE3-$-1 AND 0FFH    ; WRITE ERROR?
  1206.     DB    18H
  1207.     DB    SAVE1-$-1 AND 0FFH    ; CONTINUE
  1208. SAVE2:
  1209.     LXI    D,FCBDN        ; CLOSE SAVED FILE
  1210.     CALL    CLOSE
  1211.     INR    A        ; ERROR?
  1212.     DB    20H
  1213.     DB    SAVE4-$-1 AND 0FFH
  1214. SAVE3:
  1215.     CALL    PRINT
  1216.     DB    'No Space',0
  1217. SAVE4:
  1218.     CALL    DEFDMA        ; SET DMA TO 0080
  1219.     JMP    RSTCCP        ; RESTART CCP
  1220.  
  1221. *
  1222. *  CCP RENAME FILE FUNCTION (REN)
  1223. *
  1224. REN:
  1225.     CALL    SCANER        ; EXTRACT FILE NAME
  1226.     JNZ    ERROR        ; ERROR IF ANY '?' IN IT
  1227.     LDA    TEMPDR        ; SAVE CURRENT DEFAULT DISK
  1228.     PUSH    PSW
  1229.     CALL    SLOGIN        ; LOG IN SELECTED DISK
  1230.     CALL    SEARF        ; LOOK FOR SPECIFIED FILE
  1231.     DB    28H
  1232.     DB    REN0-$-1 AND 0FFH    ; CONTINUE IF NOT FOUND
  1233.     CALL    PRINT
  1234.     DB    'File Exists',0
  1235.     JMP    RENRET
  1236. REN0:
  1237.     LXI    H,FCBDN        ; SAVE NEW FILE NAME
  1238.     LXI    D,FCBDM
  1239.     MVI    B,16        ; 16 BYTES
  1240.     CALL    MOVEHD
  1241.     LHLD    CIBPTR        ; GET PTR TO NEXT CHAR IN COMMAND LINE
  1242.     XCHG            ; ... IN DE
  1243.     CALL    SBLANK        ; SKIP TO NON-BLANK
  1244.     CPI    '='        ; '=' OR UNDERSCORE OK
  1245.     DB    28H
  1246.     DB    REN1-$-1 AND 0FFH
  1247.     CPI    5FH
  1248.     DB    20H
  1249.     DB    REN4-$-1 AND 0FFH
  1250. REN1:
  1251.     XCHG            ; PT TO CHAR AFTER '=' OR UNDERSCORE IN HL
  1252.     INX    H
  1253.     SHLD    CIBPTR        ; SAVE PTR TO OLD FILE NAME
  1254.     CALL    SCANER        ; EXTRACT FILENAME.TYP TOKEN
  1255.     DB    20H
  1256.     DB    REN4-$-1 AND 0FFH    ; ERROR IF ANY '?'
  1257.     POP    PSW        ; GET OLD DEFAULT DRIVE
  1258.     MOV    B,A        ; SAVE IT
  1259.     LXI    H,TEMPDR    ; COMPARE IT AGAINST CURRENT DEFAULT DRIVE
  1260.     MOV    A,M        ; MATCH?
  1261.     ORA    A
  1262.     DB    28H
  1263.     DB    REN2-$-1 AND 0FFH
  1264.     CMP    B        ; CHECK FOR DRIVE ERROR
  1265.     MOV    M,B
  1266.     DB    20H
  1267.     DB    REN4-$-1 AND 0FFH
  1268. REN2:
  1269.     MOV    M,B
  1270.     XRA    A
  1271.     STA    FCBDN        ; SET DEFAULT DRIVE
  1272.     LXI    D,FCBDN        ; RENAME FILE
  1273.     MVI    C,17H        ; BDOS RENAME FCT
  1274.     CALL    BDOS
  1275.     INR    A        ; ERROR? -- FILE NOT FOUND IF SO
  1276.     DB    20H
  1277.     DB    RENRET-$-1 AND 0FFH
  1278. REN3:
  1279.     CALL    PRNNF        ; PRINT NO FILE MSG
  1280. RENRET:
  1281.     JMP    RSTCCP        ; RESTART CCP
  1282. REN4:
  1283.     CALL    DLOGIN        ; LOG IN DEFAULT DRIVE
  1284.     JMP    ERROR
  1285.  
  1286. *
  1287. *  CCP SET USER NUMBER FUNCTION
  1288. *
  1289. MAXUSR    EQU    15        ; MAXIMUM USER AREA ACCESSABLE
  1290. USER:
  1291.     CALL    NUMBER        ; EXTRACT USER NUMBER FROM COMMAND LINE
  1292.     CPI    MAXUSR+1    ; ERROR IF >= MAXUSR
  1293.     JNC    ERROR
  1294.     MOV    E,A        ; PLACE USER NUMBER IN E
  1295.     LDA    FCBFN        ; CHECK FOR PARSE ERROR
  1296.     CPI    ' '        ; <SP>=ERROR
  1297.     JZ    ERROR
  1298.     CALL    SETUSR        ; SET SPECIFIED USER
  1299.     JMP    RCCPNL        ; RESTART CCP (NO DEFAULT LOGIN)
  1300.  
  1301. *
  1302. *  CLEAR SCREEN ROUTINE FOR CRT TERMINAL
  1303. *
  1304. CLS:    IF    H19        ; CLEAR H19/H89 CRT SCREEN
  1305.     MVI    A,ESC        ; GET ESCAPE CHAR
  1306.     CALL    CONOUT
  1307.     MVI    A,'E'        ; CLEAR SCREEN
  1308.     CALL    CONOUT
  1309.     ENDIF
  1310.     IF    HAZE        ; CLEAR HAZELTINE 1500 SCREEN
  1311.     MVI    A,7EH        ; TILDA PREFIX
  1312.     CALL    CONOUT
  1313.     MVI    A,28        ; CLEAR SCREEN
  1314.     CALL    CONOUT
  1315.     ENDIF
  1316.     IF    FFTERM
  1317.     MVI    A,FF
  1318.     CALL    CONOUT
  1319.     ENDIF
  1320.     JMP    RCCPNL        ; RESTART CCP (NO DEFAULT LOGIN)
  1321.  
  1322. *
  1323. *  NOT CCP-RESIDENT COMMAND -- PROCESS AS TRANSCIENT
  1324. *
  1325. COM:
  1326.     CALL    GETUSR        ; GET CURRENT USER NUMBER
  1327.     STA    TMPUSR        ; SAVE IT FOR LATER
  1328.     STA    TSELUSR     ; TEMP USER TO SELECT
  1329.     LDA    FCBFN        ; ANY COMMAND?
  1330.     CPI    ' '        ; ' ' MEANS COMMAND WAS 'D:' TO SWITCH
  1331.     DB    20H
  1332.     DB    COM1-$-1 AND 0FFH    ; NOT <SP>, SO MUST BE TRANSCIENT OR ERROR
  1333.     LDA    TEMPDR        ; LOOK FOR DRIVE SPEC
  1334.     ORA    A        ; IF ZERO, JUST BLANK
  1335.     JZ    RCCPNL
  1336.     DCR    A        ; ADJUST FOR LOG IN
  1337.     STA    TDRIVE        ; SET DEFAULT DRIVE
  1338.     CALL    SETU0D        ; SET DRIVE WITH USER 0
  1339.     CALL    LOGIN        ; LOG IN DRIVE
  1340.     JMP    RCCPNL        ; RESTART CCP
  1341. COM1:
  1342.     LDA    FCBFT        ; CHECK FOR ERROR IN FCB
  1343.     CPI    ' '        ; ERROR IF SO
  1344.     JNZ    ERROR
  1345. *
  1346. *  COMA IS A REENTRY POINT FOR A NON-STANDARD CP/M MODIFICATION
  1347. * THIS IS THE RETURN POINT FOR WHEN THE .COM FILE IS NOT FOUND THE
  1348. * FIRST TIME, DRIVE A: IS SELECTED FOR A SECOND STTEMPT
  1349. *
  1350. COMA:
  1351.     CALL    SLOGIN        ; LOG IN SPECIFIED DRIVE IF ANY
  1352.     LXI    H,COMMSG    ; PLACE 'COM' IN FCB
  1353.     LXI    D,FCBFT     ; PT TO FILE TYPE
  1354.     CALL    MOVHD3        ; MOVE 3 CHARS
  1355.     CALL    OPENF        ; OPEN COMMAND.COM FILE
  1356.     DB    20H
  1357.     DB    COMA1-$-1 AND 0FFH    ; ERROR?
  1358.  
  1359. *  ERROR ROUTINE TO SELECT USER 0 IF ALL ELSE FAILS
  1360.     LDA    TSELUSR     ; GET USER FLAG
  1361.     ORA    A        ; SET FLAGS
  1362.     DB    28H
  1363.     DB    COMA0-$-1 AND 0FFH    ; TRY DISK A: IF ALREADY USER 0
  1364.     XRA    A        ; SELECT USER 0
  1365.     MOV    E,A
  1366.     STA    TSELUSR     ; RESET TEMPORARY USER NUMBER
  1367.     CALL    SETUSR
  1368.     DB    18H
  1369.     DB    COMA-$-1 AND 0FFH    ; TRY AGAIN
  1370.  
  1371. *  ERROR ROUTINE TO SELECT DRIVE A: IF DEFAULT WAS ORIGINALLY SELECTED
  1372. COMA0:
  1373.     LXI    H,TEMPDR    ; GET DRIVE FROM CURRENT COMMAND
  1374.     XRA    A        ; A=0
  1375.     ORA    M
  1376.     JNZ    COM8        ; ERROR IF ALREADY DISK A:
  1377.     MVI    M,1        ; SELECT DRIVE A:
  1378.     DB    18H
  1379.     DB    COMA-$-1 AND 0FFH
  1380.  
  1381. *  FILE FOUND -- PROCEED WITH LOAD
  1382. COMA1:
  1383.     LXI    H,TPA        ; SET START ADDRESS OF MEMORY LOAD
  1384. COM2:
  1385.     PUSH    H        ; SAVE ADDRESS OF NEXT SECTOR
  1386.     XCHG            ; ... IN DE
  1387.     CALL    DMASET        ; SET DMA ADDRESS FOR LOAD
  1388.     LXI    D,FCBDN        ; READ NEXT SECTOR
  1389.     CALL    READ
  1390.     DB    20H
  1391.     DB    COM3-$-1 AND 0FFH    ; READ ERROR OR EOF?
  1392.     POP    H        ; GET ADDRESS OF NEXT SECTOR
  1393.     LXI    D,128        ; MOVE 128 BYTES PER SECTOR
  1394.     DAD    D        ; PT TO NEXT SECTOR IN HL
  1395.     LXI    D,ENTRY-128    ; ARE WE GOING TO WRITE OVER CCP?
  1396.     MOV    A,L        ; COMPARE ADDRESS OF NEXT SECTOR (HL)
  1397.     SUB    E        ;   TO START OF CCP (DE)
  1398.     MOV    A,H
  1399.     SBB    D
  1400.     DB    30H
  1401.     DB    PRNLE-$-1 AND 0FFH    ; ERROR IF SAME
  1402.     DB    18H
  1403.     DB    COM2-$-1 AND 0FFH    ; OTHERWISE CONTINUE
  1404.  
  1405. *  LOAD ERROR
  1406. PRNLE:
  1407.     CALL    PRINT
  1408.     DB    'Bad Load',0
  1409.     JMP    RSTCCP
  1410.  
  1411. COM3:
  1412.     POP    H        ; LOAD COMPLETE!
  1413.     DCR    A
  1414.     DB    20H
  1415.     DB    PRNLE-$-1 AND 0FFH
  1416.     CALL    RESETUSR    ; RESET CURRENT USER NUMBER
  1417.                 ;   USER MUST BE SET BEFORE LOGIN IS DONE
  1418.     CALL    DLOGIN        ; LOG IN DEFAULT DRIVE
  1419.     CALL    SCANER        ; SEARCH COMMAND LINE FOR NEXT TOKEN
  1420.     LXI    H,TEMPDR    ; SAVE PTR TO DRIVE SPEC
  1421.     PUSH    H
  1422.     MOV    A,M        ; SET DRIVE SPEC
  1423.     STA    FCBDN
  1424.     MVI    A,10H        ; OFFSET FOR 2ND FILE SPEC
  1425.     CALL    SCAN1        ; SCAN FOR IT AND LOAD IT INTO FCBDN+16
  1426.     POP    H        ; SET UP DRIVE SPECS
  1427.     MOV    A,M
  1428.     STA    FCBDM
  1429.     XRA    A
  1430.     STA    FCBCR
  1431.     LXI    D,TFCB        ; COPY TO DEFAULT FCB
  1432.     LXI    H,FCBDN        ; FROM FCBDN
  1433.     MVI    B,33        ; SET UP DEFAULT FCB
  1434.     CALL    MOVEHD
  1435.     LXI    H,CIBUFF
  1436. COM4:
  1437.     MOV    A,M        ; SKIP TO END OF 2ND FILE NAME
  1438.     ORA    A        ; END OF LINE?
  1439.     DB    28H
  1440.     DB    COM5-$-1 AND 0FFH
  1441.     CPI    ' '        ; END OF TOKEN?
  1442.     DB    28H
  1443.     DB    COM5-$-1 AND 0FFH
  1444.     INX    H
  1445.     DB    18H
  1446.     DB    COM4-$-1 AND 0FFH
  1447.  
  1448. *  LOAD COMMAND LINE INTO TBUFF
  1449. COM5:
  1450.     MVI    B,0        ; SET CHAR COUNT
  1451.     LXI    D,TBUFF+1    ; PT TO CHAR POS
  1452. COM6:
  1453.     MOV    A,M        ; COPY COMMAND LINE TO TBUFF
  1454.     STAX    D
  1455.     ORA    A        ; DONE IF ZERO
  1456.     DB    28H
  1457.     DB    COM7-$-1 AND 0FFH
  1458.     INR    B        ; INCR CHAR COUNT
  1459.     INX    H        ; PT TO NEXT
  1460.     INX    D
  1461.     DB    18H
  1462.     DB    COM6-$-1 AND 0FFH
  1463.  
  1464. *  RUN LOADED TRANSCIENT PROGRAM
  1465. COM7:
  1466.     MOV    A,B        ; SAVE CHAR COUNT
  1467.     STA    TBUFF
  1468.     CALL    CRLF        ; NEW LINE
  1469.     CALL    DEFDMA        ; SET DMA TO 0080
  1470.     CALL    SETUD        ; SET USER/DISK
  1471.     CALL    TPA        ; RUN TRANSCIENT
  1472.     CALL    SETU0D        ; SET USER 0/DISK
  1473.     CALL    LOGIN        ; LOGIN DISK
  1474.     JMP    RESTRT        ; RESTART CCP
  1475.  
  1476. *  TRANSCIENT LOAD ERROR
  1477. COM8:
  1478.     CALL    RESETUSR    ; RESET CURRENT USER NUMBER
  1479.                 ;   RESET MUST BE DONE BEFORE LOGIN
  1480.     CALL    DLOGIN        ; LOG IN DEFAULT DISK
  1481.     JMP    ERROR
  1482.  
  1483. *  RESET SELECTED USER NUMBER IF CHANGED
  1484. RESETUSR:
  1485.     LDA    TMPUSR        ; GET OLD USER NUMBER
  1486.     MOV    E,A        ; PLACE IN E
  1487.     JMP    SETUSR        ; RESET
  1488.  
  1489. *  FILE TYPE FOR COMMAND
  1490. COMMSG:
  1491.     DB    'COM'
  1492.  
  1493. *  ENTRY POINT FOR RESTARTING CCP AND LOGGING IN DEFAULT DRIVE
  1494. RSTCCP:
  1495.     CALL    DLOGIN        ; LOG IN DEFAULT DRIVE
  1496. *  ENTRY POINT FOR RESTARTING CCP WITHOUT LOGGING IN DEFAULT DRIVE
  1497. RCCPNL:
  1498.     CALL    SCANER        ; EXTRACT NEXT TOKEN FROM COMMAND LINE
  1499.     LDA    FCBFN        ; GET FIRST CHAR OF TOKEN
  1500.     SUI    ' '        ; ANY CHAR?
  1501.     LXI    H,TEMPDR
  1502.     ORA    M
  1503.     JNZ    ERROR
  1504.     JMP    RESTRT
  1505.  
  1506.  
  1507. RNGSUB:
  1508.     DB    0        ;0=$$$.SUB NOT PRESENT, ELSE $$$.SUB PRESENT
  1509.  
  1510. *
  1511. *  FILE CONTROL BLOCK (FCB), ONE
  1512. *
  1513. SUBFCB:
  1514.     DB    0        ;DISK NAME
  1515.     DB    '$$$'        ;FILE NAME
  1516.     DB    '     '
  1517.     DB    'SUB'        ;FILE TYPE
  1518.     DB    0        ;EXTENT NUMBER
  1519.     DB    0        ;S1
  1520. SUBFS2:
  1521.     DS    1        ;S2
  1522. SUBFRC:
  1523.     DS    1        ;RECORD COUNT
  1524.     DS    16        ;DISK GROUP MAP
  1525. SUBFCR:
  1526.     DS    1        ;CURRENT RECORD NUMBER
  1527.  
  1528. *
  1529. *  FILE CONTROL BLOCK
  1530. *
  1531. FCBDN:
  1532.     DS    1        ;DISK NAME
  1533. FCBFN:
  1534.     DS    8        ;FILE NAME
  1535. FCBFT:
  1536.     DS    3        ;FILE TYPE
  1537.     DS    1        ;EXTENT NUMBER
  1538.     DS    2        ;S1 AND S2
  1539.     DS    1        ;RECORD COUNT
  1540. FCBDM:
  1541.     DS    16        ;DISK GROUP MAP
  1542. FCBCR:
  1543.     DS    1        ;CURRENT RECORD NUMBER
  1544.  
  1545. *  OTHER BUFFERS
  1546. PRFLG:
  1547.     DB    0        ;PRINTER FLAG (0=NO, 0FFH=YES)
  1548. PAGCNT:
  1549.     DB    NLINES-2    ;LINES LEFT ON PAGE
  1550. IORESL:
  1551.     DB    0        ;I/O RESULTS
  1552. TDRIVE:
  1553.     DB    1        ;TEMP DRIVE NUMBER
  1554. TEMPDR:
  1555.     DB    0
  1556. CHRCNT:
  1557.     DB    0        ;CHAR COUNT FOR TYPE
  1558. TMPUSR:
  1559.     DB    0        ;TEMPORARY USER NUMBER FOR COM
  1560. TSELUSR:
  1561.     DB    0        ;TEMPORARY SELECTED USER NUMBER
  1562.  
  1563.     END
  1564.  
  1565.  
  1566. OK
  1567.     DB    28H
  1568.     DB