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 / SIMTEL / CPMUG / CPMUG051.ARK / IOOP.SRC < prev    next >
Text File  |  1984-04-29  |  16KB  |  977 lines

  1. REV EQU 16H ;    06/13/79  R. CURTISS    NO ERR ON REWIND CLOSED FILE
  2.  
  3. ;REV EQU 15H ;    06/10/79  R. CURTISS    DREV, C, ICNTL
  4.  
  5. ;REV EQU 14H ;    05/31/79  R. CURTISS    FIX LF, MORE, XDEVC, GBPDEV
  6.  
  7. ;REV EQU 13H ;    05/30/79  R. CURTISS    XDEVC FIX, PATCH SPACE
  8.  
  9. ;REV EQU 12H ;    05/29/79  R. CURTISS    IWRT5,MCHOFF
  10.  
  11. ;REV EQU 11H ;    05/29/79  R. CURTISS    MORE,FPRS,FNAME
  12.  
  13. ;REV EQU 10H ;    05/29/79  R. CURTISS    NEW VERSION
  14. ;
  15. ; STAGE2 MAIN PROGRAM AND I/O OPERATION PACKAGE
  16. ;
  17. ; REVISION B02  03/15/78  R. CURTISS   ADD COMMENTS
  18. ;
  19. MAIN    EQU    100H
  20. PROGR    EQU    1000H
  21.  
  22.     ORG    MAIN
  23.  
  24.     JMP    F4IO    ; MAIN ENTRY POINT - PROGRAM STARTUP
  25.     DB    REV    ; IOOP REVISION
  26.  
  27.     JMP    IOOP    ; ENTRY POINT - I/O PACKAGE
  28.     DB    DREV    ; DISK I/O REVISION
  29.  
  30.     JMP    TRAP    ; ENTRY POINT - END OF MACROS DETECTED
  31.     NOP
  32.  
  33.     JMP    MEMSET    ; ENTRY POINT - SET UP FLUB MEMORY BOUNDS
  34.     NOP
  35.  
  36. PROGRM:    JMP    PROGR    ; EXTERNAL REFERENCE - STAGE2, FLT1, FLT2
  37.     NOP
  38.  
  39. EXIT:    JMP    0000H    ; EXTERNAL REFERENCE - RETURN TO CP/M
  40.     NOP
  41. ;
  42. ; -------------------------------------
  43. ;
  44. ; MAIN PROGRAM
  45. ;
  46.     DS    38H    ; STACK SPACE
  47.  
  48. F4IO:    LXI    SP,F4IO
  49. ;
  50.     CALL    INIT
  51.     CALL    PROGRM
  52. ;
  53. ;     CLOSE ALL CHANNELS
  54. ;
  55.     CALL    GCLOSE
  56.  
  57.     CALL    EXIT
  58.     JMP    F4IO
  59. ;
  60. ; --------------------------------------
  61. ;
  62. ; INITIALIZE CHANNEL I/O TABLE
  63. ;
  64. INIT:
  65.     MVI    B,6*MAXCH
  66.     LXI    D,CHAN
  67.     LXI    H,JCHAN+1
  68. ;
  69. INIT1:
  70.     LDAX    D
  71.     MOV    M,A
  72.     INX    D
  73.     INX    H
  74.     DCR    B
  75.     JNZ    INIT1
  76. ;
  77.     CALL    FINIT    ; GET FILES FROM COMMAND LINE
  78.     RET
  79. ;
  80. ; -----------------------------------------
  81. ;
  82. ; INITIAL VALUES FOR CHANNEL CONTROL TABLE
  83. ;
  84. CHAN:
  85. ;        R W O C U S
  86.     DB    1,0,1,1,2,1    ;    CHANNEL 1 - INPUT FILE
  87.     DB    1,1,1,1,1,1    ;    CHANNEL 2 - SCRATCH FILE
  88.     DB    0,1,1,1,2,1    ;    CHANNEL 3 - OUTPUT FILE
  89.     DB    0,1,1,1,3,1    ;    CHANNEL 4 - LISTING FILE
  90.     DB    1,1,0,0,2,4    ;    CHANNEL 5 - CONSOLE I/O
  91. ;
  92. MAXCH    EQU    ($-CHAN)/6
  93. ;
  94. ;
  95. ;    R  KCH+1  READ ACCESS
  96. ;        0 - ILLEGAL
  97. ;        1 - CHANNEL AVAILABLE FOR READ
  98. ;
  99. ;    W  KCH+2  WRITE ACCESS
  100. ;        0 - ILLEGAL
  101. ;        1 - MACHINE READABLE OUTPUT
  102. ;        2 - HUMAN READABLE OUTPUT
  103. ;        3 - FIRST LINE OF HUMAN READABLE OUTPUT
  104. ;            ALLOWS TOP OF FORM
  105. ;
  106. ;    O  KCH+3  OPEN ACCESS
  107. ;        0 - NO ACTION REQUIRED
  108. ;        1 - OPEN REQUIRED
  109. ;
  110. ;    C  KCH+4  CONTROL ACCESS (CLOSE)
  111. ;        0 - NO ACTION REQUIRED
  112. ;        1 - CLOSE REQUIRED
  113. ;
  114. ;    U  KCH+5  DEVICE CODE
  115. ;        0 - NULL DEVICE
  116. ;        1 - DISK
  117. ;        2 - CONSOLE
  118. ;        3 - LIST DEVICE
  119. ;
  120. ;    S  KCH+6  CHANNEL STATUS
  121. ;        0 - NOT AVAILABLE
  122. ;        1 - CLOSED
  123. ;        2 - OPEN FOR READ
  124. ;        3 - OPEN FOR WRITE
  125. ;        5 - END OF FILE ON READ
  126. ;            END OF MEDIUM ON WRITE
  127. ;
  128. ; -------------------------------------
  129. ;
  130. TRAP:    NOP        ; TRAP AT END OF MACRO READING
  131.     NOP
  132.     RET
  133. ;
  134. ; --------------------------------------
  135. ;
  136. ; SET FLUB MEMORY BOUNDS
  137. ;    DE  LOW LIMIT
  138. ;    HL  HIGH LIMIT
  139. ;
  140. MEMSET:    LHLD    0006H    ; GET BDOS ENTRY ADDRESS
  141.     DCR    H    ; ONE PAGE LESS TO BE SAFE
  142.     RET
  143. ;
  144. ; ----------------------------------------
  145. ;
  146. ;    I/O SUPERVISOR
  147. ;
  148. ;  OPERATION CODE
  149. ;    0 - CLOSE
  150. ;    1 - WRITE
  151. ;      -1 - READ
  152. ;
  153. ;  OPERATION STATUS
  154. ;    0 - NORMAL
  155. ;    1 - EOF OR END OF MEDIUM
  156. ;    2 - ILLEGAL OPERATION
  157. ;    3+  ERROR CODE
  158. ;
  159. ;  STATUS = IOOP ( OPERATION , CHANNEL , BUFFER )
  160. ;              (A)        (B)      (HL)     
  161. ;
  162. ;    MAXLEN:    DB    N
  163. ;    LENGTH:    DS    1
  164. ;    BUFFER:    DS    N+1
  165. ;
  166. ; READ OPERATION
  167. ;    REGISTER    BEFORE        AFTER
  168. ;        A          -1        STATUS
  169. ;        B        CHANNEL
  170. ;       HL        START OF LINE    
  171. ;    BUFFER        MAXLEN        LENGTH
  172. ;                    LINE DATA
  173. ;
  174. ; WRITE OPERATION
  175. ;    REGISTER    BEFORE        AFTER
  176. ;        A           1        STATUS
  177. ;        B        CHANNEL
  178. ;       HL        START OF LINE
  179. ;    BUFFER        LENGTH
  180. ;            LINE DATA
  181. ;
  182. ; CLOSE/REWIND OPERATION
  183. ;    REGISTER    BEFORE        AFTER
  184. ;        A          0        STATUS
  185. ;        B        CHANNEL
  186. ;
  187. IOOP:
  188.     STA    JOP    ; SAVE OPERATION CODE
  189.     SHLD    POINT    ; SAVE BUFFER POINTER
  190.     MOV    A,B
  191.     STA    NCHAN    ; SAVE CHANNEL NUMBER
  192.     ORA    A    ; TEST CHANNEL NUMBER
  193.     JM    LL7    ; JUMP IF < 0   ERROR CONDITION
  194.     JZ    LL5    ; JUMP IF = 0   NULL CHANNEL   BIT BUCKET
  195. ;
  196.     CPI    MAXCH+1
  197.     JP    LL7    ; JUMP IF CHANNEL > MAX CHANNEL
  198. ;
  199.     CALL    MCHOFF    ; MAKE CHANNEL OFFSET
  200.     XCHG
  201.     SHLD    CHOFF    ; CHANNEL OFFSET
  202.     XCHG
  203. ;
  204.     LXI    H,JCHAN+6  ; STATUS = JCHAN(KCH+6)
  205.     DAD    D
  206.     MOV    A,M
  207.     ORA    A
  208.     JZ    LL7    ; JUMP IF STATUS = UNAVAILABLE
  209. ;
  210.     MOV    B,A    ; SAVE CHANNEL STATUS
  211.     LDA    JOP
  212.     ORA    A
  213.     JM    LL10    ; JUMP IF READ OPERATION
  214.     JNZ    LL20    ; JUMP IF WRITE OPERATION
  215. ;
  216. ; -------------------------------------
  217. ;
  218. ;     CONTROL OPERATION
  219. ;
  220.     MOV    A,B    ; GET CHANNEL STATUS
  221.     CPI    1
  222.     JZ    LL4    ; JUMP IF STATUS = CLOSED
  223. ;
  224.     LXI    H,JCHAN+4
  225.     DAD    D
  226.     MOV    A,M    ; CONTROL ACCESS = JCHAN(KCH+4)
  227. ;
  228.     ORA    A
  229.     JZ    LL3    ; JUMP IF CONTROL OPERATION UNAVAILABLE
  230. ;
  231.     PUSH    D    ; SAVE KCH
  232.     CALL    ICNTL    ; PERFORM CONTROL OPERATION
  233.     POP    D    ; RESTORE KCH
  234.     RET
  235. ;
  236. LL3:
  237.     LXI    H,JCHAN+6  ; SET CHANNEL STATUS TO INACTIVE
  238.     DAD    D
  239.     MVI    M,1    ;    JCHAN(KCH+6) = 1
  240. ;
  241. LL4:            ; NORMAL TERMINATION
  242.     XRA    A    ;    SET OPERATION STATUS TO ZERO
  243.     RET
  244. ;
  245. LL5:            ; NULL CHANNEL I/O
  246.     LDA    JOP
  247.     ORA    A
  248.     JP    LL4    ; JUMP IF NOT READ OPERATION
  249. ;
  250. LL6:
  251.     MVI    A,1    ; EOF STATUS OR END OF MEDIUM
  252.     RET
  253. ;
  254. LL7:
  255.     MVI    A,2    ; ILLEGAL OPERATION STATUS
  256.     RET
  257. ;
  258. ; ---------------------------------
  259. ;
  260. ;     READ OPERATION
  261. ;
  262. LL10:
  263.     MOV    A,B    ; GET CHANNEL STATUS
  264.     DCR    A
  265.     JZ    LL11    ; JUMP IF CLOSED
  266.     DCR    A
  267.     JZ    LL12    ; JUMP IF OPEN FOR READ
  268.     DCR    A
  269.     JZ    LL7    ; JUMP IF OPEN FOR WRITE   ERROR
  270.     DCR    A
  271.     JZ    LL12    ; JUMP IF OPEN FOR BOTH READ AND WRITE
  272.     DCR    A
  273.     JZ    LL6    ; JUMP IF END OF FILE
  274.     JMP    LL7    ; ERROR
  275. ;
  276. LL11:
  277.     LXI    H,JCHAN+1
  278.     DAD    D
  279.     MOV    A,M    ; GET READ ACCESS PERMISSION
  280. ;
  281.     ORA    A
  282.     JZ    LL7    ; JUMP IF READING NOT ALLOWED
  283. ;
  284.     LXI    H,JCHAN+6
  285.     DAD    D
  286.     MVI    M,2    ; SET CHANNEL STATUS OPEN FOR READ
  287. ;
  288.     LXI    H,JCHAN+3
  289.     DAD    D
  290.     MOV    A,M    ; GET OPEN ACCESS FOR CHANNEL
  291.     ORA    A
  292.     JZ    LL12    ; JUMP IF OPEN NOT REQUIRED
  293. ;
  294.     PUSH    D    ; SAVE KCH
  295.     LXI    B,IACCE    ; READ ACCESS
  296.     CALL    IOPEN
  297.     POP    D
  298.     ORA    A
  299.     RNZ        ; RETURN IF OPEN ERROR
  300. ;
  301. LL12:
  302.     PUSH    D    ; SAVE KCH
  303.     CALL    IREAD    ; PERFORM READ OPERATION
  304.     POP    D
  305.     JMP    LL30
  306. ;
  307. ; -------------------------------------
  308. ;
  309. ;     WRITE OPERATION
  310. ;
  311. LL20:
  312.     MOV    A,B    ; GET CHANNEL STATUS
  313.     DCR    A
  314.     JZ    LL21    ; JUMP IF CLOSED
  315.     DCR    A
  316.     JZ    LL7    ; JUMP IF OPEN FOR READ
  317.     DCR    A
  318.     JZ    LL22    ; JUMP IF OPEN FOR WRITE
  319.     DCR    A
  320.     JZ    LL22    ; JUMP IF OPEN FOR READ OR WRITE
  321.     DCR    A
  322.     JZ    LL6    ; JUMP IF AT END OF MEDIUM
  323.     JMP    LL7    ; ERROR
  324. ;
  325. LL21:
  326.     LXI    H,JCHAN+2
  327.     DAD    D
  328.     MOV    A,M    ; GET WRITE ACCESS
  329.     ORA    A
  330.     JZ    LL7    ; JUMP IF WRITING NOT POSSIBLE
  331. ;
  332.     LXI    H,JCHAN+6
  333.     DAD    D
  334.     MVI    M,3    ; SET CHANNEL OPEN FOR WRITE
  335. ;
  336.     LXI    H,JCHAN+3
  337.     DAD    D
  338.     MOV    A,M    ; GET OPEN ACCESS
  339.     ORA    A
  340.     JZ    LL22    ; JUMP IF NO OPEN REQUIRED
  341. ;
  342.     PUSH    D    ; SAVE KCH
  343.     LXI    B,OACCE    ; WRITE ACCESS
  344.     CALL    IOPEN
  345.     POP    D
  346.     ORA    A
  347.     RNZ        ; RETURN IF OPEN ERROR
  348. ;
  349. LL22:
  350.     PUSH    D    ; SAVE KCH
  351.     CALL    IWRIT    ; PERFORM WRITE OPERATION
  352.     POP    D
  353. ;
  354. ;
  355. LL30:
  356.     CPI    1
  357.     RNZ        ; RETURN IF NOT EOF OR EOM
  358. ;
  359.     LXI    H,JCHAN+6
  360.     DAD    D
  361.     MVI    M,5    ; SET STATUS TO EOF OR EOM
  362.     RET
  363. ;
  364. ; --------------------------------------
  365. ;
  366. ;    BUFFER READ ROUTINE
  367. ;
  368. IREAD:    CALL    GBPDEV    ; HL = BUFFER POINTER
  369.     ORA    A    ; A  = DEVICE CODE
  370.     JZ    IRED0    ; JUMP IF 0 - NULL
  371.  
  372.     DCR    A
  373.     JZ    IRED1    ; JUMP IF 1 - DISK
  374.  
  375.     DCR    A
  376.     JZ    IRED2    ; JUMP IF 2 - CONSOLE IN
  377.  
  378. IRED0:    MVI    A,1    ; END OF FILE OR ERROR CONDITION
  379.     RET
  380. ;
  381. ;
  382. IRED1:    PUSH    H
  383.     DCX    H
  384.     SHLD    ARGLST+2  ; SET LENGTH POINTER
  385.     DCX    H
  386.     SHLD    ARGLST      ; SET MAX LENGTH POINTER
  387.     CALL    GFTAB    ; HL = FILE TABLE POINTER
  388.     POP    D    ; DE = BUFFER POINTER
  389.     LXI    B,ARGLST
  390.     CALL    LREAD    ; READ LINE
  391.     ORA    A
  392.     RZ        ; RETURN IF NO ERROR OR EOF
  393.  
  394. IREOF:    CALL    MORE    ; CHECK FOR CHAN 1 MULTIPLE INPUTS
  395.     JZ    IREAD    ; JUMP IF ANOTHER INPUT FILE
  396.  
  397.     RET
  398.  
  399. ARGLST:    DW    0    ; MAX LINE LENGTH POINTER
  400.     DW    0    ; ACTUAL LINE LENGTH POINTER
  401. ;
  402. ; GET LINE FROM CONSOLE
  403. ;
  404. IRED2:    XCHG
  405.     DCX    D
  406.     DCX    D
  407.     CALL    CIB    ; INPUT BUFFER FROM CONSOLE
  408.     MVI    E,0AH
  409.     CALL    CO    ; SEND LINE FEED TO CONSOLE
  410.     LHLD    POINT
  411.     MOV    A,M
  412.     CPI    1AH    ; CONTROL Z
  413.     JZ    IREOF    ; JUMP IF FIRST CHAR IN BUFFER IS ^Z
  414.  
  415.     XRA    A    ; NO ERROR
  416.     RET
  417. ;
  418. ; ------------------------------------
  419. ;
  420. ; CHECK FOR CHANNEL 1 MULTIPLE INPUTS
  421. ;
  422. MORE:    LDA    NCHAN
  423.     DCR    A
  424.     JZ    MORE1    ; JUMP IF CHAN 1
  425.  
  426.     MVI    A,1    ; END OF FILE
  427.     RET
  428.  
  429. MORE1:    LHLD    FNPTR1    ; P = IP
  430.     MVI    C,','
  431.     CALL    SCAN
  432.     JZ    MORE2    ; JUMP IF ',' FOUND
  433.  
  434.     MVI    A,1    ; END OF FILE
  435.     RET
  436.  
  437. MORE2:    INX    H
  438.     SHLD    FNPTR1    ; IP = P+1
  439.  
  440.     CALL    GDEVIC    ; GET DEVICE CODE
  441.     DCR    A
  442.     JNZ    MORE3    ; JUMP UNLESS 1 - DISK
  443.  
  444.     CALL    GFTAB    ; HL = FILE TABLE POINTER
  445.     CALL    DCLOSE    ; CLOSE DISK FILE
  446.  
  447. MORE3:    LHLD    FNPTR
  448.     MVI    B,1
  449.     CALL    XDEVC    ; LU(1) = XUNIT(IP)
  450.     ORA    A
  451.     JZ    MORE8    ; ERROR IF NUL:
  452.  
  453.     CPI    3
  454.     JZ    MORE    ; ERROR IF LIST DEVICE
  455.  
  456.     LXI    B,IACCE
  457.     CALL    IOPEN    ; OPEN FILE IF DISK
  458.     RET
  459.  
  460. MORE8:    MVI    A,1    ; END OF FILE
  461.     RET
  462. ;
  463. ; -------------------------------------
  464. ;
  465. ;    BUFFER WRITE ROUTINE
  466. ;
  467. IWRIT:
  468.     LXI    H,JCHAN+2    ; GET WRITE ACCESS
  469.     DAD    D
  470.     MOV    B,M    ; JHOW = JCHAN(KCH+2)
  471. ;
  472.     DCR    B
  473.     JZ    IWRTB    ; JUMP IF JHOW = 1  MACHINE READABLE FILE
  474. ;
  475.     DCR    B
  476.     JZ    IWRTA    ; JUMP IF JHOW = 2  HUMAN READABLE OUTPUT
  477. ;
  478. ;    ***    MAYBE OUTPUT FORM FEED
  479.     MVI    M,2    ; SET JHOW TO 2   TOP OF FORM DONE
  480.     CALL    GBPDEV    ; HL - BUFFER POINTER
  481.     CPI    3    ; A  - DEVICE CODE
  482.     JNZ    IWRT1    ; JUMP UNLESS LIST DEVICE
  483.  
  484.     MVI    E,0CH
  485.     CALL    LO    ; FORM FEED TO PRINTER
  486. IWRTA:
  487. IWRTB:    CALL    GBPDEV    ; HL - BUFFER POINTER
  488.     ORA    A    ; A  - DEVICE CODE
  489.     RZ        ; RETURN IF 0 - NULL DEVICE
  490.  
  491.     DCR    A
  492.     JZ    IWRT1    ; JUMP IF 1 - DISK DEVICE
  493.  
  494.     DCR    A
  495.     JZ    IWRT2    ; JUMP IF 2 - CONSOLE OUT
  496.  
  497.     DCR    A
  498.     JZ    IWRT3    ; JUMP IF 3 - LIST DEVICE
  499.  
  500.     MVI    A,1    ; ERROR CONDITION
  501.     RET
  502. ;
  503. ;
  504. IWRT1:    LHLD    POINT    ; RECALL BUFFER POINTER
  505.     LDA    NCHAN    ; RECALL CHANNEL NUMBER
  506.     CPI    5
  507.     JZ    IWRT2    ; JUMP IF CONSOLE CHANNEL
  508.  
  509.     PUSH    H
  510.     CALL    GFTAB    ; HL = FILE TABLE POINTER
  511.     POP    D    ; DE = BUFFER POINTER
  512.     MOV    B,D
  513.     MOV    C,E
  514.     DCX    B    ; BC = POINTER TO LINE LENGTH
  515.     CALL    LWRITE    ; WRITE LINE
  516.     ORA    A
  517.     RZ        ; RETURN IF NO ERROR
  518.  
  519.     MVI    A,1
  520.     RET
  521. ;
  522. ; SEND LINE TO CONSOLE
  523. ;
  524. IWRT2:    DCX    H
  525.     MOV    C,M    ; GET LINE LENGTH
  526.     INR    C
  527.  
  528. IWRT2L:    DCR    C
  529.     JZ    IWRT2D
  530.  
  531.     INX    H
  532.     MOV    E,M
  533.     PUSH    B
  534.     PUSH    H
  535.     CALL    CO
  536.     POP    H
  537.     POP    B
  538.     JMP    IWRT2L
  539.  
  540. IWRT2D:    MVI    E,0DH
  541.     CALL    CO
  542.     MVI    E,0AH
  543.     CALL    CO
  544.     XRA    A    ; NO ERROR
  545.     RET
  546. ;
  547. ; SEND LINE TO LIST DEVICE
  548. ;
  549. IWRT3:    DCX    H
  550.     MOV    C,M    ; GET LINE LENGTH
  551.     INR    C
  552.  
  553. IWRT3L:    DCR    C
  554.     JZ    IWRT3D
  555.  
  556.     INX    H
  557.     MOV    E,M
  558.     PUSH    B
  559.     PUSH    H
  560.     CALL    LO
  561.     POP    H
  562.     POP    B
  563.     JMP    IWRT3L
  564.  
  565. IWRT3D:    MVI    E,0DH
  566.     CALL    LO
  567.     MVI    E,0AH
  568.     CALL    LO
  569.     XRA    A
  570.     RET
  571. ;
  572. ; -------------------------------------
  573. ;
  574. ;    OPEN CHANNEL
  575. ;
  576. IOPEN:
  577.     PUSH    B    ; BC POINTS TO ACCESS CODE
  578.     CALL    GFTAB    ; HL = FILE TABLE POINTER
  579.     PUSH    H
  580.     CALL    FNAME    ; DE = FILE NAME POINTER
  581.     POP    H
  582.     POP    B
  583.     RZ        ; RETURN UNLESS DISK DEVICE
  584.  
  585.     CALL    DOPEN    ; OPEN FILE
  586.     ORA    A
  587.     RZ        ; RETURN IF NO ERROR
  588.  
  589.     MVI    A,1
  590. ;    ***    ***    ERROR MESSAGE
  591.     RET
  592. ;
  593. ; --------------------------------------
  594. ;
  595. ;    CLOSE CHANNEL
  596. ;
  597. ICNTL:    CALL    GBPDEV    ; HL - BUFFER POINTER
  598.     CPI    1    ; A  - DEVICE CODE
  599.     JNZ    ICNT3    ; JUMP UNLESS 1 - DISK DEVICE
  600.  
  601.     LXI    H,JCHAN+6
  602.     DAD    D
  603.     MVI    M,1    ; SET STATUS CLOSED
  604.  
  605.     CALL    GFTAB    ; HL = FILE TABLE POINTER
  606.     CALL    DCLOSE    ; CLOSE FILE
  607.     ORA    A
  608.     RZ        ; RETURN IF NO ERROR
  609.  
  610.     MVI    A,1
  611.     RET
  612.  
  613. ICNT3:
  614.     XRA    A    ; SET OPERATION STATUS = 0
  615.     RET
  616. ;
  617. ; ------------------------------------
  618. ;
  619. ; GET BUFFER POINTER & DEVICE CODE NUMBER
  620. ;        HL    A
  621. ;
  622. GBPDEV:    LHLD    CHOFF    ; RECALL CHANNEL OFFSET
  623.     XCHG
  624.     LXI    H,JCHAN+5
  625.     DAD    D    ; ADD CHANNEL OFFSET
  626.     MOV    A,M    ; DEVICE CODE
  627.     LHLD    POINT
  628.     RET
  629. ;
  630. ; ---------------------------------
  631. ;
  632. ; GET FILE TABLE POINTER
  633. ;
  634. GFTAB:    LDA    NCHAN    ; GET CHANNEL NUMBER
  635.     DCR    A
  636.     ADD    A
  637.     MOV    E,A
  638.     MVI    D,0
  639.     LXI    H,FTABP
  640.     DAD    D
  641.     MOV    A,M
  642.     INX    H
  643.     MOV    H,M
  644.     MOV    L,A
  645.     RET
  646. ;
  647. ; -------------------------------------
  648. ;
  649. ; GET FILE NAMES FROM COMMAND LINE
  650. ;
  651. FINIT:    LXI    D,80H
  652.     LXI    H,COMLIN-1
  653.     LDA    80H
  654.     INR    A
  655.     MOV    C,A    ; # OF CHARACTERS
  656.  
  657. FINIT1:    LDAX    D
  658.     MOV    M,A
  659.     INX    H
  660.     INX    D
  661.     DCR    C
  662.     JNZ    FINIT1
  663.  
  664. FINIT2:    MVI    M,0    ; TERMINATE LINE WITH NULL
  665.     CALL    FINIT3    ; CONVERT TO UPPER CASE
  666.     CALL    FPRS    ; PARSE COMMAND LINE
  667.     RZ        ; RETURN IF NO COMMAND LINE ERROR
  668.  
  669.     LXI    D,COMERR
  670.     CALL    COB    ; ERROR MESSAGE TO CONSOLE
  671.     LXI    D,COMLIN-2
  672.     CALL    CIB    ; GET NEW COMMAND LINE
  673.     LXI    H,COMLIN-1
  674.     MOV    E,M    ; GET LINE LENGTH
  675.     MVI    D,0
  676.     INX    H
  677.     DAD    D
  678.     JMP    FINIT2
  679.  
  680.  
  681. FINIT3:    LXI    H,COMLIN-1
  682.     MOV    C,M    ; LENGTH OF COMMAND LINE
  683.     INX    H
  684.     INR    C
  685.  
  686. FINIT4:    DCR    C
  687.     RZ        ; RETURN IF AT END OF LINE
  688.  
  689.     MOV    A,M    ; GET CHARACTER
  690.     CALL    FINIT5    ; CONVERT IF LOWER CASE
  691.     MOV    M,A
  692.     JMP    FINIT4
  693.  
  694. FINIT5:    CPI    'A'+20H
  695.     RC        ; RETURN IF < 'a'
  696.     CPI    'Z'+21H
  697.     RNC        ; RETURN IF > 'z'
  698.     SUI    20H
  699.     RET
  700. ;
  701. ; --------------------------------------
  702. ;
  703. ; PARSE COMMAND LINE
  704. ;
  705. FPRS:    LXI    H,COMLIN  ; P = ^COM
  706.     MVI    C,'='
  707.     CALL    SCAN
  708.     JZ    FPRS1    ; JUMP IF '=' FOUND
  709.  
  710.     LXI    H,COMLIN
  711.     SHLD    FNPTR1    ; IP = ^COM
  712.     LXI    H,FNCON
  713.     SHLD    FNPTR3    ; OP = ^'CON:'
  714.     LXI    H,FNLST
  715.     SHLD    FNPTR4    ; LP = ^'LST:'
  716.     JMP    FPRS3
  717.  
  718. FPRS1:    MVI    M,0    ; MEM(P) = 0
  719.     INX    H    ; P = P + 1
  720.     SHLD    FNPTR1    ; IP = P
  721.  
  722.     LXI    H,COMLIN  ; P = ^COM
  723.     SHLD    FNPTR3    ; OP = ^CHANNEL 3 SPECIFICATION
  724.     MVI    C,','
  725.     CALL    SCAN
  726.     JZ    FPRS2    ; JUMP IF ',' FOUND
  727.  
  728.     LXI    H,FNLST
  729.     SHLD    FNPTR4    ; LP = ^'LST:'
  730.     JMP    FPRS3
  731.  
  732. FPRS2:    MVI    M,0    ; MEM(P) = 0
  733.     INX    H    ; P = P + 1
  734.     SHLD    FNPTR4    ; LP = ^CHANNEL 4 SPECIFICATION
  735.  
  736. FPRS3:    LHLD    FNPTR1
  737.     MVI    B,1
  738.     CALL    XDEVC    ; LU(1) = XUNIT(IP)
  739.     ORA    A
  740.     JZ    FPRS8    ; ERROR IF NUL: SPECIFIED
  741.  
  742.     CPI    3
  743.     JZ    FPRS8    ; ERROR IF LST: SPECIFIED
  744.  
  745.     LHLD    FNPTR3
  746.     MVI    B,3
  747.     CALL    XDEVC    ; LU(3) = XUNIT(OP)
  748.  
  749.     LHLD    FNPTR4
  750.     MVI    B,4
  751.     CALL    XDEVC    ; LU(4) = XUNIT(LP)
  752.  
  753.     XRA    A    ; NO COMMAND ERROR DETECTED
  754.     RET
  755.  
  756. FPRS8:    ORI    1    ; COMMAND ERROR DETECTED
  757.     RET
  758. ;
  759. ; -------------------------------------
  760. ;
  761. SCAN:    MOV    A,M
  762.     CMP    C
  763.     RZ        ; RETURN IF SEARCH SUCCESSFUL
  764.  
  765.     ORA    A
  766.     JZ    SCAN1    ; JUMP IF END OF STRING
  767.  
  768.     INX    H
  769.     JMP    SCAN
  770.  
  771. SCAN1:    INR    A    ; Z=0 - SEARCH FAILS
  772.     RET
  773. ;
  774. ; -------------------------------------
  775. ;
  776. ; GET FILE NAME POINTER FOR OPEN
  777. ;
  778. FNAME:    CALL    GDEVIC    ; GET DEVICE CODE
  779.     CPI    1
  780.     JZ    FNAME1    ; JUMP IF DISK DEVICE
  781.  
  782.     XRA    A
  783.     RET
  784.  
  785. FNAME1:    LDA    NCHAN
  786.     DCR    A
  787.     ADD    A
  788.     MOV    E,A
  789.     MVI    D,0
  790.     LXI    H,FNPTR  ; FILE NAME POINTER TABLE
  791.     DAD    D
  792.     MOV    E,M
  793.     INX    H
  794.     MOV    D,M
  795.     MVI    A,1
  796.     ORA    A
  797.     RET
  798.  
  799. GDEVIC:    LHLD    CHOFF    ; CHANNEL TABLE OFFSET
  800.     LXI    D,JCHAN+5
  801.     DAD    D
  802.     MOV    A,M
  803.     RET
  804. ;
  805. ; --------------------------------------
  806. ;
  807. ;    HL - POINTER TO FILE NAME
  808. ;    B  - CHANNEL NUMBER
  809.  
  810. ;    A  - DEVICE CODE NUMBER
  811. ;
  812. XDEVC:    CALL    SKIPB    ; SKIP BLANKS
  813.     MVI    C,0    ; NULL DEVICE
  814.     JZ    XDEVC4    ; JUMP IF , = OR NULL FOUND
  815.  
  816.     PUSH    H
  817.     LXI    D,XDVTBL-2  ; SPECIAL DEVICE CODE TABLE
  818.  
  819. XDEVC2:    INX    D
  820. XDEVC1:    INX    D
  821. XDEVC0:    LDAX    D
  822.     MOV    C,A
  823.     CPI    1
  824.     JZ    XDEVC3    ; JUMP IF END OF TABLE
  825.  
  826.     POP    H
  827.     PUSH    H
  828.     INX    D
  829.  
  830.     LDAX    D
  831.     INX    D
  832.     CMP    M
  833.     JNZ    XDEVC2    ; JUMP IF NO MATCH
  834.  
  835.     INX    H
  836.     LDAX    D
  837.     INX    D
  838.     CMP    M
  839.     JNZ    XDEVC1    ; JUMP IF NO MATCH
  840.  
  841.     INX    H
  842.     LDAX    D
  843.     INX    D
  844.     CMP    M
  845.     JNZ    XDEVC0    ; JUMP IF NO MATCH
  846.  
  847.     INX    H    ; TABLE MATCH FOUND
  848.     MVI    A,':'
  849.     CMP    M
  850.     JZ    XDEVC3    ; JUMP IF COLON
  851.  
  852.     MVI    C,1    ; DISK DEVICE ASSUMED
  853.  
  854. XDEVC3:    POP    H    ; RESTORE STACK
  855.  
  856. XDEVC4:    PUSH    B    ; B - CHAN #   C - DEVICE CODE #
  857.     CALL    MCHOFF    ; MAKE CHANNEL OFFSET POINTER
  858.     POP    B
  859.     LXI    H,JCHAN+5
  860.     DAD    D
  861.     MOV    M,C    ; JCHAN(CH+5) = DEVICE CODE
  862.     MOV    A,C
  863.     RET
  864. ;
  865. ;
  866. XDVTBL:    DB    0,'NUL'
  867.     DB    2,'CON'
  868.     DB    2,'TTY'
  869.     DB    2,'CRT'
  870.     DB    2,'KBD'
  871.     DB    3,'LST'
  872.     DB    3,'LPT'
  873.     DB    1
  874. ;
  875. ;
  876. SKIPB:    MOV    A,M
  877.     ORA    A
  878.     RZ
  879.  
  880.     SUI    ','
  881.     RZ
  882.  
  883.     MOV    A,M
  884.     SUI    '='
  885.     RZ
  886.  
  887.     MOV    A,M
  888.     CPI    ' '
  889.     RNZ
  890.  
  891.     INX    H
  892.     JMP    SKIPB
  893. ;
  894. ; -----------------------------------
  895. ;
  896. MCHOFF:    DCR    B    ; COMPUTE CHANNEL OFFSET
  897.     MOV    A,B    ;    FOR TABLE LOOKUP
  898.     RLC        ;    KCH = (JCH-1)*6
  899.     ADD    B
  900.     RLC
  901.     MOV    E,A
  902.     MVI    D,0
  903.     RET
  904. ;
  905. ; -------------------------------------
  906. ;
  907. ; CONSOLE I/O
  908. ;
  909. BDOS    EQU    0005H
  910.  
  911. CIB:    MVI    C,10
  912.     CALL    BDOS
  913.     RET
  914.  
  915. COB:    MVI    C,9
  916.     CALL    BDOS
  917.     RET
  918.  
  919. CO:    MVI    C,2
  920.     CALL    BDOS
  921.     RET
  922.  
  923. LO:    MVI    C,5
  924.     CALL    BDOS
  925.     RET
  926. ;
  927. ; ------------------------------------
  928. ;
  929. ;    STORAGE
  930. ;
  931. JCHAN:    DS    6*MAXCH+1  ; WORKING STORAGE FOR I/O TABLE
  932. JOP:    DS    1    ; STORAGE FOR OPERATION CODE
  933. POINT:    DS    2    ; BUFFER POINTER
  934. NCHAN:    DS    1    ; STORAGE FRO CHANNEL NUMBER
  935. LEN:    DS    1    ; LINE LENGTH
  936. CHOFF:    DS    2    ; CHANNEL TABLE OFFSET
  937. ;
  938. IACCE:    DB    1    ; READ ACCESS CODE
  939. OACCE:    DB    3    ; WRITE ACCESS CODE WITH DELETE
  940.  
  941. FTABP:    DW    FTAB1
  942.     DW    FTAB2
  943.     DW    FTAB3
  944.     DW    FTAB4
  945.  
  946. FTAB1:    DB    0,0,0,'1'    ; CHAN 1 FILE TABLE
  947.     DS    33+128
  948.  
  949. FTAB2:    DB    0,0,0,'2'
  950.     DS    33+128
  951.  
  952. FTAB3:    DB    0,0,0,'3'
  953.     DS    33+128
  954.  
  955. FTAB4:    DB    0,0,0,'4'
  956.     DS    33+128
  957.  
  958. FNPTR:
  959. FNPTR1:    DS    2
  960. FNPTR2:    DW    FNCH2
  961. FNPTR3:    DS    2
  962. FNPTR4:    DS    2
  963.  
  964. FNCH2:    DB    'STAGE2.CH2',0
  965.  
  966. FNNUL:    DB    'NUL:',0
  967. FNCON:    DB    'CON:',0
  968. FNLST:    DB    'LST:',0
  969.  
  970.     DB    128,0
  971. COMLIN:    DS    129    ; STORAGE FOR COMMAND LINE
  972.  
  973. COMERR:    DB    0DH,0AH,'>>>>> COMMAND ERROR - REENTER'
  974.     DB    0DH,0AH,'$',0
  975. ;
  976. ;
  977.