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 / DISKIO2.SRC < prev    next >
Text File  |  1984-04-29  |  17KB  |  918 lines

  1. DREV EQU 24H ;    06/13/79  R. CURTISS    "," FOR DELIMITER ALSO
  2.  
  3. ;DREV EQU 23H ;    06/10/79  R. CURTISS    DCLOSE XRA A, NOT IF READ
  4.  
  5. ;DREV EQU 22H ;    08/19/78  R. CURTISS    DEF. DMA = 80 AFTER
  6. ;                    READS AND WRITES
  7. ;DREV EQU 21H ;    08/19/78  R. CURTISS    GCLOSE ADDITIONS
  8. ;
  9. ;DREV EQU 20H ;    08/17/78  R. CURTISS    INITIAL CODING
  10. ;
  11. ;DREV EQU 15H ;    07/26/78  R. CURTISS    BWRITE - MVI A,0 JNZ
  12. ;
  13. ;DREV EQU 14H ;    07/25/78  R. CURTISS    OPEN- NR=0
  14. ;
  15. ;DREV EQU 13H ;    07/25/78  R. CURTISS    FIX ERROR IN READ
  16. ;                    AND OTHER CHANGES
  17. ;
  18. ;DREV EQU 12H ;    07/01/78  R. CURTISS    FIX ERRORS
  19. ;
  20. ;DREV EQU 11H ;    07/01/78  R. CURTISS    INITIAL CODING
  21. ;
  22. ; CP/M DISK I/O PACKAGE
  23. ;    1. INITIAL IMPLEMENTATION
  24. ;      OPEN, CLOSE, READ BYTE, WRITE BYTE
  25. ;
  26. ;    2. NEXT STAGE OF DEVELOPMENT
  27. ;      READ LINE, WRITE LINE, GENERAL CLOSE
  28. ;
  29. ;    3. ALLOW THE FOLLOWING FOR FILE NAMES:
  30. ;        CON:  - CONSOLE  IN/OUT
  31. ;        RDR:  - READER   IN
  32. ;        PUN:  - PUNCH       OUT
  33. ;        LST:  - LISTING     OUT
  34. ;
  35. ;
  36. ; TO OPEN DISK FILE
  37. ;    ERROR IF FILE ALREADY OPEN
  38. ;    ERROR IF BAD FILE NAME
  39. ;    SELECT ( ACCESS )
  40. ;       ( 1 = READ ) CONTINUE
  41. ;       ( 3 = WRITE )
  42. ;        ACCESS = 2
  43. ;        DELETE FILE IF PRESENT
  44. ;        CREATE FILE
  45. ;        ERROR IF NO DIRECTORY SPACE
  46. ;        FIN
  47. ;       ( 2 = WRITE )
  48. ;        ERROR IF FILE IS PRESENT
  49. ;        CREATE FILE
  50. ;        ERROR IF NO DIRECTORY SPACE
  51. ;        FIN
  52. ;       ( OTHER ) ERROR  ILLEGAL ACCESS CODE
  53. ;       FIN
  54. ;    OPEN FILE
  55. ;    ERROR IF NOT PRESENT
  56. ;    STATUS = 0   NORMAL
  57. ;    POINTER = 0    BUFFER EMPTY
  58. ;    FIN
  59. ;
  60. ;  INPUTS:
  61. ;    (HL) POINTS TO FILE TABLE ORIGIN
  62. ;    (DE) POINTS TO FILE NAME STRING
  63. ;    (BC) POINTS TO ACCESS CODE
  64. ;
  65. ;  OUTPUTS:
  66. ;    (A)=(HL)= OPERATION STATUS
  67. ;    (Z)     = CONDITION OF (A)
  68. ;
  69. ;
  70. FCBOFF    EQU    4    ; FCB OFFSET IN FILE TABLE
  71. BUFF    EQU    37    ; BUFFER OFFSET IN FILE TABLE
  72. BDOS    EQU    0005H    ; ENTRY POINT TO OPERATING SYSTEM
  73.  
  74.  
  75.     DB    DREV    ; PUT REVISION NUMBER IN CODE
  76.  
  77.  
  78. DOPEN:    SHLD    FTABLE    ; SAVE FILE TABLE POINTER
  79.  
  80.     MOV    A,M    ; GET ACCESS CODE FROM FILE TABLE
  81.     CPI    0
  82.     JNZ    ERR    ; JUMP IF FILE ALREADY OPEN
  83.  
  84.     LDAX    B    ; GET OPEN ACCESS CODE
  85.     STA    ACCESS
  86.  
  87.     LHLD    FTABLE    ; RECALL FILE TABLE POINTER
  88.     LXI    B,FCBOFF  ; FCB OFFSET IN FILE TABLE
  89.     DAD    B
  90.     CALL    GETNAM    ; GET FILE NAME
  91.     JNZ    ERR    ; JUMP IF NAME ERROR
  92.  
  93.     LDA    ACCESS
  94.     DCR    A
  95.     JZ    OPEN6    ; JUMP IF READ ACCESS DESIRED
  96.  
  97.     CPI    2
  98.     JNZ    OPEN2    ; JUMP IF NOT WRITE WITH DELETE
  99.  
  100.     STA    ACCESS    ; ACCESS = 2
  101.  
  102.     MVI    C,19
  103.     CALL    BDOS1    ; DELETE FILE IF PRESENT
  104.  
  105.     JMP    OPEN4
  106.  
  107. OPEN2:    CPI    1
  108.     JNZ    ERR    ; JUMP IF INVALID ACCESS CODE
  109.  
  110.     MVI    C,17
  111.     CALL    BDOS1    ; CHECK TO SEE IF FILE IS PRESENT
  112.     CPI    255
  113.     JNZ    ERR    ; JUMP IF FILE IS PRESENT
  114.  
  115. OPEN4:    MVI    C,22
  116.     CALL    BDOS1    ; CREATE FILE
  117.     CPI    255
  118.     JZ    ERR    ; JUMP IF NO DIRECTORY SPACE
  119.  
  120. OPEN6:    MVI    C,15
  121.     CALL    BDOS1    ; OPEN FILE
  122.     CPI    255
  123.     JZ    ERR    ; JUMP IF NOT PRESENT
  124.  
  125.     LHLD    FTABLE    ; RECALL FILE TABLE POINTER
  126.     LXI    D,FCBOFF+32
  127.     DAD    D
  128.     MVI    M,0    ; NEXT RECORD NUMBER IN FCB
  129.  
  130.     CALL    GCLADD    ; ADD FILE TABLE TO OPEN LIST
  131.  
  132.     LHLD    FTABLE    ; RECALL FILE TABLE POINTER
  133.     LDA    ACCESS
  134.     MOV    M,A    ; SET ACCESS CODE IN FILE TABLE
  135.  
  136.     INX    H
  137.     XRA    A
  138.     MOV    M,A    ; SET STATUS TO ZERO (NORMAL)
  139.  
  140.     INX    H
  141.     MOV    M,A    ; SET BUFFER POINTER TO ZERO
  142.  
  143.     JMP    RETURN
  144. ;
  145. ;
  146. ; TO CLOSE FILE
  147. ;    OUTPUT LAST BUFFER IF OPEN FOR WRITE
  148. ;    ERROR IF ACCESS < 1 OR > 2
  149. ;    CLOSE FILE IF OPEN FOR WRITE
  150. ;    ERROR IF NOT PRESENT
  151. ;    ACCESS = 0
  152. ;    BUFFER POINTER = 0
  153. ;    FIN
  154. ;
  155. ;  INPUT:
  156. ;    (HL) POINTS TO FILE TABLE ORIGIN
  157. ;
  158. ;  OUTPUTS:
  159. ;    (A)=(HL)= OPERATION STATUS
  160. ;    (Z)     = CONDITION OF (A)
  161. ;
  162. DCLOSE:    SHLD    FTABLE    ; SAVE FILE TABLE POINTER
  163.  
  164.     MOV    A,M    ; GET ACCESS CODE FROM FILE TABLE
  165.     CPI    2
  166.     JNZ    CLOSE1    ; JUMP IF NOT OPEN FOR WRITE
  167.  
  168.     CALL    CLOSE4    ; OUTPUT LAST BUFFER IF NOT EMPTY
  169.     JZ    CLOSE2    ; JUMP IF NO WRITE ERROR
  170.  
  171.     PUSH    PSW    ; SAVE ERROR CONDITION
  172.     CALL    CLOSE2    ; CLOSE THE FILE
  173.     POP    PSW
  174.     JMP    ERR
  175.  
  176. CLOSE1:    ORA    A
  177.     JZ    RETURN    ; JUMP IF ALREADY CLOSED
  178.  
  179.     CPI    1
  180.     JNZ    ERR    ; JUMP IF INVALID ACCESS CODE
  181.  
  182. CLOSE2:    CALL    GCLREM    ; REMOVE FILE TABLE FROM OPEN LIST
  183.  
  184.     LHLD    FTABLE    ; RECALL FILE TABLE POINTER
  185.     XRA    A
  186.     MOV    C,M    ; GET ACCESS CODE
  187.     MOV    M,A    ; ACCESS = 0 - FILE NOT OPEN
  188.  
  189.     INX    H
  190.     MOV    M,A    ; STATUS = 0 - NORMAL
  191.  
  192.     INX    H
  193.     MOV    M,A    ; BUFFER POINTER = 0
  194.  
  195.     DCR    C
  196.     JZ    RETURN    ; JUMP IF OPEN FOR READ
  197.  
  198.     MVI    C,16
  199.     CALL    BDOS1    ; CLOSE FILE
  200.     CPI    255
  201.     JZ    ERR    ; JUMP IF FILE NOT PRESENT
  202.  
  203.     XRA    A    ; NO ERROR
  204.     JMP    RETURN
  205.  
  206. CLOSE4:    INX    H
  207.     INX    H
  208.     MOV    A,M    ; GET BUFFER POINTER
  209.     ANI    7FH    ; MSB SHOULD BE 0 BUT BE SAFE
  210.     RZ        ; RETURN IF BUFFER IS EMPTY (Z)=1
  211.  
  212.     LXI    D,BUFF+127-2  ; -2 FOR 2 (INX HL) ABOVE
  213.     DAD    D    ; (HL) POINTS TO LAST BUFFER BYTE
  214.     CMA
  215.     ADI    128+1    ; PAD COUNT = 128 - POINTER
  216.  
  217. CLOSE6:    MVI    M,1AH    ; PAD BUFFER WITH CONTROL Z
  218.     DCX    H
  219.     DCR    A
  220.     JNZ    CLOSE6
  221.  
  222.     CALL    WRITE2    ; OUTPUT LAST BUFFER
  223.     RET        ; (Z)=1 IF WRITE IS OK
  224. ;
  225. ;
  226. ; TO CLOSE ALL OPEN FILES
  227. ;    FOR EACH OPEN FILE
  228. ;        CLOSE FILE
  229. ;        FIN
  230. ;    FIN
  231. ;
  232. ;  INPUTS:
  233. ;    NONE
  234. ;
  235. ;  OUTPUTS:
  236. ;    (A)=(HL)= OPERATION STATUS
  237. ;    (Z)     = CONDITION OF (A)
  238. ;
  239. GCLOSE:    LDA    LSIZE    ; RECALL OPEN FILE COUNT
  240.     ORA    A
  241.     RZ        ; RETURN IF LIST IS EMPTY
  242.  
  243.     LXI    H,FLIST    ; GET FIRST FILLE TABLE POINTER
  244.     MOV    E,M
  245.     INX    H
  246.     MOV    D,M
  247.     XCHG
  248.     CALL    DCLOSE    ; CLOSE AND DELETE FILE FROM LIST
  249.     JMP    GCLOSE
  250. ;
  251. ;
  252. ;    ADD FILE TABLE TO OPEN FILE LIST
  253. ;
  254. GCLADD:    LDA    LSIZE    ; GET OPEN FILE COUNT
  255.     CPI    LMAX    ; FILE LIST MAX SIZE
  256.     JNC    GCLA9    ; JUMP IF LIST IS FULL
  257.  
  258.     INR    A
  259.     STA    LSIZE    ; LSIZE = LSIZE + 1
  260.     DCR    A
  261.     ADD    A    ; A = A*2
  262.     MOV    E,A
  263.     MVI    D,0
  264.     LXI    H,FLIST
  265.     DAD    D    ; (HL) POINTS TO NEXT LIST ENTRY POS.
  266.  
  267.     XCHG
  268.     LHLD    FTABLE    ; RECALL FILE TABLE POINTER
  269.     XCHG
  270.  
  271.     MOV    M,E
  272.     INX    H
  273.     MOV    M,D    ; LIST(LSIZE) = FILE TABLE POINTER
  274.     RET
  275.  
  276. GCLA9:    ; ****************** NEED EROR MESSAGE
  277.     RET
  278. ;
  279. ;
  280. ;    REMOVE FILE TABLE POINTER FROM OPEN FILE LIST
  281. ;
  282. GCLREM:    LHLD    FTABLE    ; RECALL FILE TABLE POINTER
  283.     XCHG
  284.     LXI    H,FLIST    ; ORIGIN OF OPEN FILE LIST
  285.     LDA    LSIZE    ; RECALL OPEN FILE COUNT
  286.     MOV    C,A
  287.     INR    C
  288.  
  289. GCLR1:    DCR    C
  290.     JZ    GCLR9    ; JUMP IF END OF OPEN FILE LIST
  291.  
  292.     MOV    A,M
  293.     INX    H
  294.     XRA    E
  295.     MOV    B,A
  296.  
  297.     MOV    A,M
  298.     INX    H
  299.     XRA    D
  300.     ORA    B
  301.     JNZ    GCLR1    ; JUMP IF NO MATCH
  302.  
  303.     MOV    D,H
  304.     MOV    E,L
  305.     DCX    D
  306.     DCX    D
  307.  
  308. GCLR2:    DCR    C
  309.     JZ    GCLR8    ; JUMP IF END OF LIST
  310.  
  311.     MOV    A,M
  312.     STAX    D
  313.     INX    H
  314.     INX    D
  315.     MOV    A,M
  316.     STAX    D    ; LIST(M-1) = LIST(M)
  317.     INX    H
  318.     INX    D    ; M = M + 1
  319.     JMP    GCLR2
  320.  
  321. GCLR8:    LDA    LSIZE
  322.     DCR    A
  323.     STA    LSIZE
  324.     RET
  325.  
  326. GCLR9:    ; ****************** NEED ERROR MESSAGE
  327.     RET
  328. ;
  329. ;
  330. ; TO READ A LINE
  331. ;    ERROR IF ACCESS <> "READ"
  332. ;    ERROR IF STATUS <> "NORMAL"
  333. ;    I = 1
  334. ;    GET-NEXT-BYTE
  335. ;    UNTIL ( EOL,EOF,ERR )
  336. ;        IF ( I <= MAX-CHARACTER-COUNT )
  337. ;        LINE(I) = BYTE
  338. ;        I = I + 1
  339. ;        FIN
  340. ;        GET-NEXT-BYTE
  341. ;        FIN
  342. ;    RETURN-ACTUAL-CHARACTER-COUNT
  343. ;    FIN
  344. ;
  345. ;  INPUTS:
  346. ;    (HL) POINTS TO FILE TABLE
  347. ;    (DE) POINTS TO LINE BUFFER ORIGIN
  348. ;    (BC) POINTS TO PARAMETER LIST
  349. ;        3RD  POINTS TO MAX CHARACTER COUNT (255 MAX)
  350. ;        4TH  POINTS TO ACTUAL CHARACTER COUNT (255 MAX)
  351. ;
  352. ;  OUTPUTS:
  353. ;    (A)=(HL)= OPERATION STATUS
  354. ;    (Z)     = CONDITION OF (A)
  355. ;
  356. LREAD:    SHLD    FTABLE    ; SAVE FILE TABLE POINTER
  357.     XCHG
  358.     SHLD    LPOINT    ; SAVE LINE POINTER
  359.  
  360.     LXI    H,DBYTE
  361.     SHLD    DATA    ; DATA RETURN POINTER
  362.  
  363.     MOV    H,B
  364.     MOV    L,C
  365.  
  366.     MOV    E,M
  367.     INX    H
  368.     MOV    D,M    ; (DE) POINTS TO 3RD ARG
  369.  
  370.     XCHG
  371.     MOV    C,M    ; (C) HOLDS MAX LINE LENGTH
  372.     MOV    A,C
  373.     STA    CMAX    ; SAVE MAX LINE LENGTH
  374.     XCHG
  375.  
  376.     INX    H
  377.     MOV    E,M
  378.     INX    H
  379.     MOV    D,M    ; (DE) POINTS TO 4TH ARG
  380.  
  381.     XCHG
  382.     SHLD    ACTP    ; SAVE POINTER FOR ACTUAL LENGTH
  383.  
  384.     LHLD    FTABLE    ; RECALL FILE TABLE POINTER
  385.     MOV    A,M    ; GET ACCESS CODE
  386.     CPI    1
  387.     JNZ    ERR    ; JUMP IF NOT OPEN FOR READ
  388.  
  389.     INX    H
  390.     MOV    A,M    ; GET STATUS CODE
  391.     ORA    A
  392.     JNZ    ERR    ; JUMP IF NOT NORMAL
  393.  
  394.     INX    H    ; (HL) POINTS TO BUFFER POINTER
  395.     SHLD    BPOINT    ; SAVE IT
  396.  
  397. LREAD1:    CALL    LREAD5    ; GET NEXT BYTE FROM DISK
  398.     JNZ    LREAD2    ; JUMP IF EOL,EOF,ERR
  399.  
  400.     CALL    LREAD8    ; STORE BYTE INTO LINE
  401.     JMP    LREAD1
  402.  
  403. LREAD2:    PUSH    PSW    ; SAVE READ STATUS
  404.     LDA    CMAX    ; RECALL MAX CHARACTER COUNT
  405.     SUB    C
  406.     LHLD    ACTP
  407.     MOV    M,A    ; RETURN ACTUAL CHARACTER COUNT
  408.     POP    PSW
  409.  
  410.     CPI    0DH    ; CARRIAGE RETURN
  411.     JNZ    RETURN    ; RETURN IF EOF OR ERR
  412.  
  413.     XRA    A
  414.     JMP    RETURN    ; NORMAL RETURN
  415. ;
  416. ;    GET NEXT BYTE
  417. ;
  418. LREAD5:    LHLD    BPOINT    ; RECALL BUFFER POINTER POINTER
  419.     PUSH    B    ; SAVE LINE SPACE COUNT
  420.     CALL    BRXXX    ; GET NEXT BYTE FROM DISK
  421.     POP    B
  422.     RNZ        ; RETURN IF EOF,ERR
  423.  
  424.     LDA    DBYTE    ; GET BYTE JUST READ
  425.     ANI    7FH
  426.     JZ    LREAD5    ; IGNORE NULL
  427.  
  428.     CPI    0AH
  429.     JZ    LREAD5    ; IGNORE LINE FEED
  430.  
  431.     CPI    7FH
  432.     JZ    LREAD5    ; IGNORE RUBBOUT
  433.  
  434.     CPI    1AH    ; CONTROL Z
  435.     JZ    LREAD6    ; JUMP IF END OF FILE
  436.  
  437.     CPI    0DH
  438.     JZ    LREAD7    ; JUMP IF CARRIAGE RETURN
  439.  
  440.     CMP    A    ; (Z)=1
  441.     RET        ; NORMAL RETURN
  442.  
  443. LREAD6:    MVI    A,255    ; END OF FILE
  444.  
  445. LREAD7:    ORA    A    ; END OF LINE
  446.     RET
  447. ;
  448. ;    STORE NEXT BYTE IN LINE
  449. ;
  450. LREAD8:    INR    C
  451.     DCR    C
  452.     RZ        ; RETURN IF LINE BUFFER FULL
  453.  
  454.     LHLD    LPOINT    ; RECALL LINE BUFFER POINTER
  455.     MOV    M,A
  456.     INX    H
  457.     SHLD    LPOINT
  458.     DCR    C
  459.     RET
  460. ;
  461. ;
  462. ; TO READ BYTE
  463. ;    ERROR IF ACCESS <> "READ"
  464. ;    ERROR IF STATUS <> "ZERO"
  465. ;    IF ( BUFFER EMPTY )
  466. ;       GET NEXT BUFFER LOAD
  467. ;       POINT = 0
  468. ;       RETURN IF "EOF"
  469. ;       FIN
  470. ;    GET NEXT BYTE FROM BUFFER
  471. ;    POINT = POINT + 1
  472. ;    FIN
  473. ;
  474. ;  INPUTS:
  475. ;    (HL) POINTS TO FILE TABLE ORIGIN
  476. ;    (DE) POINTS TO DATA BYTE STORAGE
  477. ;
  478. ;  OUTPUTS:
  479. ;    (A)=(HL)= OPERATION STATUS
  480. ;    (Z)     = CONDITION OF (A)
  481. ;    ((DE))  = DATA BYTE RETURNED
  482. ;
  483. BREAD:    SHLD    FTABLE    ; SAVE FILE TABLE POINTER
  484.     XCHG
  485.     SHLD    DATA    ; SAVE DATABYTE POINTER
  486.     MVI    M,1AH    ; TENTATIVELY RETURN CONTROL Z
  487.  
  488.     XCHG
  489.     MOV    A,M    ; GET ACCESS CODE
  490.     CPI    1
  491.     JNZ    ERR    ; JUMP IF NOT READ ACCESS
  492.  
  493.     INX    H
  494.     MOV    A,M    ; GET STATUS CODE
  495.     CPI    0
  496.     JNZ    ERR    ; JUMP IF NOT NORMAL
  497.  
  498.     INX    H
  499.  
  500. BRXXX:    MOV    A,M    ; GET BUFFER POINTER
  501.     MOV    E,A    ; SAVE CURRENT POINTER
  502.     INR    A
  503.     ANI    7FH
  504.     MOV    M,A    ; POINTER = (POINTER + 1) MOD 128
  505.  
  506.     MOV    A,E    ; GET CURRENT POINTER
  507.     ORA    A
  508.     JNZ    READ2    ; JUMP IF BUFFER NOT EMPTY
  509.  
  510.     CALL    READ4    ; GET NEXT BUFFER LOAD
  511.     JNZ    ERR    ; JUMP IF READ ERROR
  512.  
  513.     ORA    A
  514.     JNZ    RETURN    ; JUMP IF END OF FILE
  515.  
  516.     MVI    E,0    ; CURRENT POINTER
  517.  
  518. READ2:    LHLD    FTABLE    ; RECALL FILE TABLE POINTER
  519.     MVI    D,0    ; (E) IS BUFFER POINTER
  520.     DAD    D
  521.     LXI    D,BUFF    ; BUFFER OFFSET IN FILE TABLE
  522.     DAD    D    ; (HL) POINTS TO NEXT BYTE IN BUFFER
  523.  
  524.     MOV    A,M    ; GET NEXT DATA BYTE
  525.     LHLD    DATA    ; RECALL DATA RETURN POINTER
  526.     MOV    M,A    ; RETURN DATA BYTE TO CALLER
  527.  
  528.     XRA    A    ; (A)=0   (Z)=1
  529.     JMP    RETURN    ; NORMAL RETURN
  530.  
  531.  
  532. READ4:    MVI    C,26
  533.     CALL    BDOS2    ; SET DMA ADDRESS
  534.  
  535.     MVI    C,20
  536.     CALL    BDOS1    ; READ NEXT DISK RECORD
  537.  
  538.     PUSH    PSW
  539.     MVI    C,26
  540.     LXI    D,80H
  541.     CALL    BDOS    ; RESTORE DMA ADDR TO DEFAULT
  542.     POP    PSW
  543.  
  544.     ORA    A
  545.     RZ        ; RETURN IF OK  (Z)=1
  546.  
  547.     CPI    1    ; EOF
  548.     RNZ        ; RETURN IF ERROR (A)>1  (Z)=0
  549.  
  550.     LHLD    FTABLE    ; RECALL FILE TABLE POINTER
  551.     INX    H
  552.     MVI    A,255
  553.     MOV    M,A    ; SET STATUS TO "EOF"
  554.  
  555.     CPI    255    ; EOF  (A)=255  (Z)=1
  556.     RET        ; END OF FILE DETECTED
  557. ;
  558. ;
  559. ; TO WRITE A LINE
  560. ;    ERROR IF ACCESS <> "WRITE"
  561. ;    ERROR IF STATUS <> "ZERO" "NORMAL"
  562. ;    FOR I = 1 TO LENGTH OF LINE
  563. ;        WRITE BYTE LINE(I)
  564. ;        FIN
  565. ;    FIN
  566. ;
  567. ;  INPUTS:
  568. ;    (HL) POINTS TO FILE TABLE
  569. ;    (DE) POINTS TO LINE BUFFER ORIGIN
  570. ;    (BC) POINTS TO LINE LENGTH IN BYTES (255 MAX)
  571. ;
  572. ;  OUTPUTS:
  573. ;    (A)=(HL)= OPERATION STATUS
  574. ;    (Z)     = CONDITION OF (A)
  575. ;
  576. LWRITE:    SHLD    FTABLE    ; SAVE FILE TABLE POINTER
  577.  
  578.     MOV    A,M    ; GET ACCESS CODE
  579.     CPI    2
  580.     JNZ    ERR    ; JUMP IF NOT OPEN FOR WRITE
  581.  
  582.     INX    H
  583.     MOV    A,M    ; GET STATUS CODE
  584.     ORA    A
  585.     JNZ    ERR    ; JUMP IF NOT NORMAL
  586.  
  587.     INX    H    ; POINTS TO BUFFER POINTER
  588.  
  589.     LDAX    B    ; CHARACTER COUNT
  590.     MOV    C,A
  591.     INR    C
  592.  
  593. LWRIT1:    DCR    C
  594.     JZ    LWRIT2    ; JUMP IF END OF LINE
  595.  
  596.     PUSH    H
  597.     PUSH    D
  598.     PUSH    B
  599.     LDAX    D    ; GET NEXT DATA BYTE
  600.     MOV    B,A
  601.     CALL    BWXXX    ; WRITE BYTE TO DISK
  602.     POP    B
  603.     POP    D
  604.     POP    H
  605.     RNZ        ; RETURN IF WRITE ERROR
  606.  
  607.     INX    D
  608.     JMP    LWRIT1
  609.  
  610. LWRIT2:    MVI    B,0DH
  611.     PUSH    H
  612.     CALL    BWXXX    ; WRITE CARRIAGE RETURN TO DISK
  613.     POP    H
  614.     RNZ        ; RETURN IF WRITE ERROR
  615.  
  616.     MVI    B,0AH
  617.     CALL    BWXXX    ; WRITE LINE FEED TO DISK
  618.     RET
  619. ;
  620. ;
  621. ; TO WRITE BYTE
  622. ;    ERROR IF ACCESS <> "WRITE"
  623. ;    ERROR IF STATUS <> "ZERO"
  624. ;    PUT BYTE INTO BUFFER
  625. ;    POINT = POINT + 1
  626. ;    IF ( BUFFER FULL )
  627. ;       WRITE NEXT BUFFER LOAD
  628. ;       POINT = 0
  629. ;       FIN
  630. ;    FIN
  631. ;
  632. ;  INPUTS:
  633. ;    (HL) POINTS TO FILE TABLE ORIGIN
  634. ;    (DE) POINTS TO DATA BYTE STORAGE
  635. ;
  636. ;  OUTPUTS:
  637. ;    (A)=(HL)= OPERATION STATUS
  638. ;    (Z)     = CONDITION OF (A)
  639. ;
  640. BWRITE:    SHLD    FTABLE    ; SAVE FILE TABLE POINTER
  641.     LDAX    D    ; GET DATA BYTE
  642.     MOV    B,A    ; SAVE IN B
  643.  
  644.     MOV    A,M    ; GET ACCESS CODE
  645.     CPI    2
  646.     JNZ    ERR    ; JUMP IF NOT WRITE ACCESS
  647.  
  648.     INX    H
  649.     MOV    A,M    ; GET STATUS CODE
  650.     CPI    0
  651.     JNZ    ERR    ; JUMP IF NOT NORMAL
  652.  
  653.     INX    H
  654. ;
  655. ;        (HL) POINTS TO BUFFER POINTER
  656. ;        (B)  DATA BYTE FOR OUTPUT
  657. ;
  658. BWXXX:    MOV    A,M    ; GET BUFFER POINTER
  659.     MOV    E,A    ; SAVE CURRENT POINTER
  660.     INR    A
  661.     ANI    7FH
  662.     MOV    M,A    ; POINTER = (POINTER+1) MOD 128
  663.  
  664.     MVI    D,0
  665.     DAD    D
  666.     LXI    D,BUFF-2  ; -2 FOR 2 (INX HL) ABOVE
  667.     DAD    D    ; (HL) = FTABLE+BUFF+POINT
  668.     MOV    M,B    ; STORE DATA BYTE INTO BUFFER
  669.  
  670.     CPI    0
  671.     MVI    A,0    ; NO ERROR
  672.     JNZ    RETURN    ; JUMP IF BUFFER NOT FULL
  673.  
  674.     CALL    WRITE2    ; WRITE BUFFER TO DISK
  675.     JNZ    ERR    ; JUMP IF WRITE ERROR
  676.  
  677.     JMP    RETURN
  678.  
  679.  
  680. WRITE2:    MVI    C,26
  681.     CALL    BDOS2    ; SET DMA ADDRESS
  682.  
  683.     MVI    C,21
  684.     CALL    BDOS1    ; WRITE NEXT DISK RECORD
  685.  
  686.     PUSH    PSW
  687.     MVI    C,26
  688.     LXI    D,80H
  689.     CALL    BDOS    ; RESTORE DMA ADDR. TO DEFAULT
  690.     POP    PSW
  691.  
  692.     ORA    A
  693.     RZ        ; RETURN IF WRITE OK (A)=0  (Z)=1
  694.  
  695.     CPI    2    ; END OF DISK
  696.     RNZ        ; RETURN IF ERROR (A)=1,>2  (Z)=0
  697.  
  698.     LHLD    FTABLE    ; RECALL FILE TABLE POINTER
  699.     INX    H
  700.     MVI    A,255    ; END OF MEDIUM
  701.     MOV    M,A    ; SET STATUS
  702.  
  703.     CPI    255    ; SET ZERO FLAG FOR NO ERROR
  704.     RET        ; (A)=255  (Z)=1
  705. ;
  706. ;
  707. ; SCAN FILE NAME
  708. ;  INPUTS:
  709. ;    (HL) POINTS TO FCB
  710. ;    (DE) POINTS TO FILE NAME - LEADING SPACES OK
  711. ;
  712. ;  OUTPUTS:
  713. ;    (A) = COUNT OF "?" IN NAME
  714. ;    (Z) = CONDITION OF (A)
  715. ;    (DE)= POINTER TO END OF NAME DELIMITER
  716. ;
  717. GETNAM:            ; GET FILE REFERENCE
  718.     PUSH    H
  719.     CALL    LL35    ; IGNOR LEADING BLANKS
  720.     ORA    A    ; NULL INDICATES END OF BUFFER
  721.     JZ    LLA6A    ; JUMP IF NULL
  722.  
  723.     SBI    '@'    ; CHECK IF DRIVE SPECIFIED
  724.     MOV    B,A
  725.     INX    D
  726.     LDAX    D
  727.     CPI    ':'
  728.     JZ    LL76
  729.  
  730.     DCX    D
  731.     MVI    M,0    ; ZERO FOR CURRENT DRIVE
  732.     JMP    LL7C
  733. LL76:
  734.     MOV    M,B    ; SPECIFIED DRIVE
  735.     INX    D
  736. LL7C:            ; GET FILENAME
  737.     MVI    B,8
  738.     CALL    LL7E    ; SCAN FILE NAME
  739.  
  740.     MVI    B,3
  741.     CPI    '.'    ; FILE TYPE DELIMITER
  742.     JNZ    LLCF    ; JUMP IF NO FILE TYPE
  743.  
  744.     INX    D
  745.     CALL    LL7E    ; SCAN FILE TYPE
  746.     JMP    LLD6
  747.  
  748. LLCF:            ; FILL REST OF FILE TYPE WITH SPACES
  749.     INX    H
  750.     MVI    M,' '
  751.     DCR    B
  752.     JNZ    LLCF
  753. LLD6:            ; PUT THREE ZEROS IN FILE CONTROL BLOCK
  754.     MVI    B,3
  755. LLD8:
  756.     INX    H
  757.     MVI    M,0
  758.     DCR    B
  759.     JNZ    LLD8
  760.     POP    H
  761.     LXI    B,000BH
  762. LLE7:            ; CHECK FOR AMBIGUOUS FILE REFERENCE
  763.     INX    H
  764.     MOV    A,M
  765.     CPI    '?'
  766.     JNZ    LLEF
  767.     INR    B
  768. LLEF:
  769.     DCR    C
  770.     JNZ    LLE7
  771.     MOV    A,B
  772.     ORA    A    ; (A) IS COUNT OF '?' IN NAME
  773.     RET        ; (Z)=1 IF UNAMBIGUOUS NAME
  774. ;
  775. ;
  776. ; ---------------------
  777. ;
  778. ;    (B)= MAX CHARACTER COUNT
  779. ;
  780. LL7E:            ; SCAN FNAME OR FTYPE
  781.     CALL    LL16
  782.     JZ    LL9F    ; JUMP IF DELIMITER FOUND
  783.     INX    H
  784.     CPI    '*'    ; IF '*', FILL REST OF FILENAME WITH '?'
  785.     JNZ    LL8F
  786.     MVI    M,'?'
  787.     JMP    LL91
  788. LL8F:
  789.     MOV    M,A    ; STORE IN FCB
  790.     INX    D
  791. LL91:
  792.     DCR    B    ; CHARACTER COUNT
  793.     JNZ    LL7E
  794. LL95:            ; IGNORE EXTRA CHARACTERS
  795.     CALL    LL16
  796.     JZ    LLA6
  797.     INX    D
  798.     JMP    LL95
  799. LL9F:            ; FILL REST OF FILENAME WITH SPACES
  800.     INX    H
  801.     MVI    M,' '
  802.     DCR    B
  803.     JNZ    LL9F
  804. LLA6:
  805.     RET
  806. ;
  807. ; ----------------------
  808. ;
  809. LLA6A:
  810.     POP    H
  811.     ORI    255    ; NO FILE NAME FOUND
  812.     RET        ; (Z)=0
  813. ;
  814. ; --------------------------
  815. ;
  816. LL16:            ; CHECK FOR DELIMITERS
  817.     LDAX    D
  818.     ORA    A    ; NULL
  819.     RZ
  820.     CPI    ' '    ; SPACE
  821.     JNC    LL16A    ; JUMP IF NOT CONTROL CHARACTER
  822.     MVI    A,'?'    ; REPLACE CONTROL CHAR
  823.     RET        ; (Z)=0
  824. LL16A:
  825.     RZ
  826.     CPI    '='
  827.     RZ
  828.     CPI    5FH    ; BACK ARROW
  829.     RZ
  830.     CPI    '.'
  831.     RZ
  832.     CPI    ','
  833.     RZ
  834.     CPI    ':'
  835.     RZ
  836.     CPI    ';'
  837.     RZ
  838.     CPI    '<'
  839.     RZ
  840.     CPI    '>'
  841.     RET
  842. ;
  843. ;    ----------------
  844. ;
  845. LL35:            ; ADVANCE  TO FIRST NON-BLANK OR END
  846.     LDAX    D
  847.     ORA    A
  848.     RZ
  849.     CPI    ' '
  850.     RNZ
  851.     INX    D
  852.     JMP    LL35
  853. ;
  854. ;
  855. ;
  856. ; BDOS FUNCTIONS USING FILE CONTROL BLOCK POINTER
  857. ;
  858. BDOS1:    LHLD    FTABLE    ; RECALL FILE TABLE POINTER
  859.     LXI    D,FCBOFF
  860.     DAD    D
  861.     XCHG        ; (DE) POINTS TO FILE CONTROL BLOCK
  862.     CALL    BDOS
  863.     RET
  864. ;
  865. ;
  866. ; BDOS FUNCTIONS USING BUFFER POINTER
  867. ;
  868. BDOS2:    LHLD    FTABLE    ; RECALL FILE TABLE POINTER
  869.     LXI    D,BUFF    ; BUFFER OFFSET
  870.     DAD    D
  871.     XCHG        ; (DE) POINTS TO BUFFER ORIGIN
  872.     CALL    BDOS
  873.     RET
  874. ;
  875. ;
  876. ; ALL ERROR CONDITIONS EXIT HERE
  877. ;
  878. ERR:    LHLD    FTABLE    ; RECALL FILE TABLE POINTER
  879. ;    ....    .....    ADD ERROR MESSAGE SOMETIME
  880.     INX    H
  881.     MVI    A,255
  882.     MOV    M,A    ; SET STATUS TO EOF
  883.     DCR    A    ; (A) = 254  (UNSPECIFIED ERROR)
  884. ;
  885. ;
  886. RETURN:    MVI    H,0
  887.     MOV    L,A    ; FORTRAN INTEGER FUNCTION RESULT
  888.     ORA    A    ; DETERMINE ZERO FLAG
  889.     RET
  890. ;
  891. ;
  892. ; LOCAL TEMPORARY STORAGE
  893. ;
  894. FTABLE:    DS    2    ; FILE TABLE POINTER
  895.  
  896. ACCESS:    DS    1    ; ACCESS CODE
  897.  
  898. DATA:    DS    2    ; DATA BYTE POINTER
  899.  
  900. ;
  901. ;
  902. ; STORAGE FOR OPEN FILE LIST
  903. ;
  904. LSIZE:    DB    0    ; COUNT OF FLIST SIZE
  905. LMAX    EQU    10    ; MAX SIZE OF OPEN FILE TABLE
  906. FLIST:    DS    LMAX*2    ; LIST OF FILE TABLE POINTERS
  907. ;
  908. ;
  909. ; STORAGE FOR LREAD
  910. ;
  911. LPOINT:    DS    2
  912. BPOINT:    DS    2
  913. ACTP:    DS    2
  914. DBYTE:    DS    1
  915. CMAX:    DS    1
  916. ;
  917. ;
  918.