home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol058 / ciosp.sqc / CIOSP.SRC
Encoding:
Text File  |  1985-02-10  |  9.1 KB  |  416 lines

  1. ;    CP/M SYSTEM EQUATES
  2.  
  3. SYSTEM    EQU    0
  4. BDOS    EQU    5
  5. READC    EQU    1
  6. WRITC    EQU    2
  7. INST    EQU    10
  8.  
  9. ;    ENVIRONMENT RETRIEVAL ROUTINE
  10.  
  11. BEGIN:
  12.     LXI    D,TBUF        ; SAVE
  13.     LXI    H,SCORE        ; TBUF
  14.     MVI    B,128        ; TEMPORARILY
  15.     CALL    MOVE$BUFFER
  16.  
  17.     LXI    D,FCB        ; OPEN THE
  18.     LXI    H,BGN$NAME    ; ENVIRONMENT
  19.     CALL    FFCB        ; FILE
  20.     MVI    A,'C'
  21.     STA    FCB+9
  22.     MVI    A,'N'
  23.     STA    FCB+10
  24.     MVI    A,'F'
  25.     STA    FCB+11
  26.     LXI    D,FCB
  27.     CALL    FRESET
  28.     LXI    D,BLOCK        ; SET DMA
  29.     MVI    C,26        ; TO BLOCK
  30.     CALL    CPM
  31.     LXI    D,FCB        ; READ
  32.     MVI    C,20        ; ENVIRONMENT
  33.     CALL    CPM        ; RECORD
  34.     LXI    D,TBUF        ; AND RESET
  35.     MVI    C,26        ; DMA BACK
  36.     CALL    CPM        ; TO TBUF
  37.  
  38.     IF    NOT CASHEAB
  39.     LDA    DAC
  40.     STA    X22+1
  41.     STA    X33+1
  42.     STA    X44+1
  43.     ENDIF
  44.  
  45.     IF    PERCUSSION
  46.     LDA    PERA
  47.     CPI    0
  48.     JZ    BGN01
  49.     MVI    A,0D3H
  50.     STA    PR21
  51.     IF    NOT CASHEAB
  52.     STA    PR31
  53.     STA    PR41
  54.     ENDIF
  55.     LDA    PERA
  56.     STA    PR21+1
  57.     IF    NOT CASHEAB
  58.     STA    PR31+1
  59.     STA    PR41+1
  60.     ENDIF
  61. BGN01:
  62.     ENDIF
  63.  
  64.     LXI    D,SCORE        ; RETRIEVE
  65.     LXI    H,TBUF        ; TBUF
  66.     MVI    B,128
  67.     CALL    MOVE$BUFFER
  68.     RET
  69.  
  70.     DB    4,4
  71. BGN$NAME: DB    'SONG'
  72. BLOCK:    DS    0
  73. CPU:    DS    1
  74. CLOCK:    DS    4
  75. CASH:    DS    1
  76. MXVCE:    DS    2
  77. LSIZE:    DS    2
  78. DAC:    DS    1
  79. PERA:    DS    1
  80. MEMAP:    DS     1
  81. CRLF:    DS    3
  82. MXCOL:    DS    2
  83. MXROW:    DS    2
  84. FILL:    DS    110
  85.  
  86. ;       LOGICAL I/O SYSTEM FOR CP/M
  87.  
  88. ;               MISCELLANEOUS EQUATES
  89.  
  90. CPM     EQU     5               ; CPM ENTRY POINT
  91. BIOS    EQU     0               ; BIOS ENTRY POINT
  92.  
  93. FCB     EQU     5CH             ; TRANSIENT FCB
  94. TBUF    EQU     80H             ; TRANSIENT BUFFER
  95.  
  96. ;               FCB FORMAT
  97.  
  98. FFET    EQU     0               ; ENTRY TYPE
  99. FFFN    EQU     1               ; FILE NAME
  100. FFFT    EQU     9               ; FILE TYPE
  101. FFEX    EQU     12              ; FILE EXTENT
  102. FFRC    EQU     15              ; RECORD COUNT
  103. FFDM    EQU     16              ; ALLOCATION MAP
  104. FFNR    EQU     32              ; NEXT RECORD
  105. FFBA    EQU     33              ; NEXT BYTE
  106. FFDV    EQU     35              ; DEVICE ADDRESS
  107. FFBUF   EQU     36              ; BUFFER
  108.  
  109. ;        WRITE CHARACTER TO CONSOLE
  110.  
  111. FWTCH:
  112.     PUSH    PSW
  113.     CPI    13        ; CHECK FOR CR
  114.     JNZ    FWTCH1
  115.     LDA    CRLF
  116. FWTCH1:
  117.     CPI    10        ; CHECK FOR LF
  118.     JNZ    FWTCH2
  119.     LDA    CRLF+1
  120. FWTCH2:
  121.     MOV    E,A
  122.     MVI    C,WRITC
  123.     CALL    BDOS
  124.     POP    PSW
  125.     RET
  126.  
  127. ;        WRITE LINE ROUTINE
  128.  
  129. FWRTLN:
  130.     MOV    A,M
  131.     CPI    '$'
  132.     RZ
  133.     PUSH    H
  134.     CALL    FWTCH
  135.     POP    H
  136.     INX    H
  137.     JMP    FWRTLN
  138.  
  139. ;               FCB BUILDER
  140.  
  141. ;               PREPARES FCB FOR I/O
  142.  
  143. ;               INPUTS:         DE = @(FCB)
  144. ;                               HL = @(FCB$NAME)
  145.  
  146. FFCB: 
  147.     CALL    FCPRS        ; COMPRESS INPUT
  148.         CALL    FADDR           ; GET ADDRS
  149.     DCX    H        ; OBTAIN
  150.     MOV    B,M        ; SIZE
  151.     PUSH    B        ; AND
  152.     INX    H        ; SAVE
  153.         XCHG
  154.         SHLD    FTEMP           ; SAVE HL
  155.         MVI     A,36            ; AND
  156. FFCB01:
  157.         MVI     M,0             ; CLEAR
  158.     INX    H        ; ENTIRE
  159.     DCR    A        ; FCB
  160.     JNZ    FFCB01
  161.     PUSH    D        ; GET CURRENT
  162.     MVI    C,25        ; DEVICE
  163.         CALL    CPM             ; SPECIFICATION
  164.         LHLD    FPFDV           ; RETRIEVE HL
  165.         MOV     M,A             ; AND SAVE
  166.         POP     D               ; RETRIEVE
  167.         PUSH    D               ; D AND
  168.         LDAX    D               ; GET DEVICE
  169.         MOV     B,A             ; SPEC
  170.         INX     D               ; POINT TO ':'
  171.         LDAX    D               ; GET ':'
  172.         CPI     ':'             ; TEST FOR
  173.         JNZ     FFCB02          ; DEVICE SPEC
  174.         MOV     A,B             ; NORMALIZE
  175.         MVI     B,'A'           ; DEVICE
  176.         SUB     B               ; SPEC
  177.         MOV     M,A             ; AND SAVE
  178.         INX     D               ; BYPASS D:
  179.         POP     B
  180.     POP    B        ; ADJUST
  181.     DCR    B        ; SIZE
  182.     DCR    B
  183.     PUSH    B
  184.         PUSH    D
  185. FFCB02:
  186.         LHLD    FPFCB           ; POINT
  187.         INX     H               ; TO ID
  188.         PUSH    H               ; AND SAVE
  189.         MVI     A,11
  190. FFCB03:
  191.         MVI     M,' '           ; CLEAR
  192.         INX     H               ; ID
  193.         DCR     A               ; TO
  194.         JNZ     FFCB03          ; SPACES
  195.         POP     H               ; RETRIEVE
  196.     POP    D        ; HL, DE
  197.     POP    B        ; AND BC
  198. FFCB04:
  199.         LDAX    D               ; GET NAME
  200.         CPI     '.'             ; AND TEST
  201.         JZ      FFCB06          ; FOR TYPE
  202.         MOV     M,A             ; ELSE
  203.         INX     H               ; MOVE
  204. FFCB05:
  205.         INX     D               ; CHARACTER
  206.         DCR     B               ; TO
  207.         JNZ     FFCB04          ; FCB
  208.         RET
  209. FFCB06:
  210.         PUSH    D               ; POINT
  211.         LHLD    FTEMP           ; TO
  212.         LXI     D,FFFT          ; TYPE
  213.         DAD     D               ; FIELD
  214.         POP     D               ; IN
  215.         JMP     FFCB05          ; FCB
  216.  
  217. FCPRS:
  218.     PUSH    H
  219.     PUSH    D
  220.     MOV    D,H
  221.     MOV    E,L
  222.     DCX    H
  223.     MOV    B,M
  224.     INX    H
  225.     MVI    C,0
  226. FCPR01:
  227.     LDAX    D
  228.     CPI    '.'
  229.     JM    FCPR02
  230.     CPI    '['
  231.     JP    FCPR02
  232.     MOV    M,A
  233.     INX    H
  234.     INR    C
  235. FCPR02:
  236.     INX    D
  237.     DCR    B
  238.     JNZ    FCPR01
  239.     POP    D
  240.     POP    H
  241.     DCX    H
  242.     MOV    M,C
  243.     INX    H
  244.     RET
  245.  
  246. ;               OPEN A DISK FILE
  247.  
  248. ;               INPUT:          DE = @(FCB)
  249. ;               OUTPUT:         CARRY = ERROR
  250.  
  251. FRESET:
  252.         MVI     A,15            ; SET UP
  253.         STA     FTEMP           ; FOR OPEN
  254.         CALL    FINIT
  255.         PUSH    PSW
  256.         LHLD    FPFBUF          ; INITIALIZE
  257.         LXI     D,128           ; POINTER
  258.         DAD     D
  259.         CALL    FSVFBA
  260.         POP     PSW
  261.         RET
  262.  
  263. ;               DISK INITIALIZATION
  264.  
  265. ;               INPUT:          DE = @(FCB)
  266. ;                               FTEMP = COMMAND
  267. ;               OUTPUT:         CARRY = ERROR
  268.  
  269. FINIT:
  270.         CALL    FADDR           ; GET FCB ADDRS
  271.         CALL    FSW             ; SELECT DEVICE
  272.         LHLD    FPFCB           ; RETRIEVE
  273.         XCHG                    ; DE
  274.         LDA     FTEMP           ; GET COMMAND
  275.         MOV     C,A             ; CREATE/OPEN/CLOSE
  276.         CALL    CPM             ; OR DELETE FILE
  277.         PUSH    PSW             ; SAVE ERRORS
  278.         CALL    FSW             ; DEVICE
  279.         POP     PSW             ; RETRIEVE AND
  280.         CPI     0FFH            ; TEST FOR
  281.         JZ      FINT01          ; ERROR
  282.         XRA     A               ; NO
  283.         RET
  284. FINT01:
  285.         STC                     ; SET
  286.         RET                     ; CARRY
  287.  
  288. ;               READ BYTE FROM DISK
  289.  
  290. ;               INPUT:          DE = @(FCB)
  291. ;               OUTPUT:         A = BYTE
  292. ;                               CARRY = ERROR
  293.  
  294. FREAD:
  295.     MVI    A,0        ; CLEAR
  296.     STA    EOF        ; EOF
  297.  
  298.         CALL    FADDR           ; GET FCB ADDRS
  299. FRD01:
  300.         LHLD    FPFBUF
  301.         LXI     D,128
  302.         DAD     D
  303.         XCHG                    ; BUFFER END ADDR IN DE
  304.         LHLD    FXFBA           ; CURRENT PONTER IN HL
  305.         CALL    FCPHL           ; TEST FOR END OF BUFFER
  306.         JZ      FRD02           ; YES SO GO READ
  307.         MOV     A,M             ; GET BYTE
  308.         INX     H               ; BUMP POINTER
  309.         CALL    FSVFBA          ; AND SAVE IT
  310.         ORA     A               ; RESET FLAG
  311.         RET
  312. FRD02:
  313.         CALL    FSW             ; SET DRIVE
  314.         LHLD    FPFCB
  315.         XCHG
  316.         MVI     C,20            ; READ
  317.         CALL    CPM             ; BLOCK
  318.         PUSH    PSW             ; SAVE ERRORS
  319.         CALL    FSW             ; RESET DRIVE
  320.         POP     PSW             ; RETRIEVE AND
  321.         CPI     0               ; TEST FOR
  322.         JNZ     FRDER           ; ERROR
  323.         LHLD    FPFBUF          ; RESET
  324.         CALL    FSVFBA          ; POINTER
  325.         JMP     FRD01
  326. FRDER:
  327.     MVI    A,1        ; FLAG END
  328.     STA    EOF
  329.         RET
  330.         
  331. ;               DRIVE SWITCH PROCEDURE
  332.  
  333. FSW:
  334.         PUSH    H
  335.         PUSH    D
  336.         MVI     C,25            ; GET CURRENT
  337.         CALL    CPM             ; DRIVE NUMBER
  338.         MOV     B,A
  339.         LHLD    FPFDV
  340.         MOV     E,M             ; EXCHANGE
  341.         MOV     M,B             ; NUMBER
  342.         MVI     C,14            ; TELL
  343.         CALL    CPM             ; CPM
  344.         LHLD    FPFBUF          ; SET
  345.         XCHG                    ; DMA
  346.         MVI     C,26
  347.         CALL    CPM
  348.         POP     D
  349.         POP     H
  350.         RET
  351.  
  352. ;               FCB ADDRESS COMPUTER
  353.  
  354. ;               INPUT:          DE = @(FCB)
  355.  
  356. FADDR:
  357.         PUSH    H
  358.         PUSH    D
  359.         XCHG
  360.         SHLD    FPFCB
  361.         LXI     D,FFBA
  362.         DAD     D
  363.         SHLD    FPFBA
  364.         MOV     E,M
  365.         INX     H
  366.         MOV     D,M
  367.         XCHG
  368.         SHLD    FXFBA
  369.         LHLD    FPFCB
  370.         LXI     D,FFDV
  371.         DAD     D
  372.         SHLD    FPFDV
  373.         LHLD    FPFCB
  374.         LXI     D,FFBUF
  375.         DAD     D
  376.         SHLD    FPFBUF
  377.         POP     D
  378.         POP     H
  379.         RET
  380.  
  381. ;               SAVE FBA PROCEDURE
  382.  
  383. ;               INPUT:          HL = POINTER
  384.  
  385. FSVFBA:
  386.         SHLD    FXFBA
  387.         XCHG
  388.         LHLD    FPFBA
  389.         MOV     M,E
  390.         INX     H
  391.         MOV     M,D
  392.         RET
  393.  
  394. ;               DOUBLE PRECISION COMPARE
  395.  
  396. ;               INPUT:          HL AND DE
  397. ;               OUTPUT:         EQUAL/NOT EQUAL
  398.  
  399. FCPHL:
  400.         MOV     A,H
  401.         CMP     D
  402.         RNZ
  403.         MOV     A,L
  404.         CMP     E
  405.         RET
  406.         
  407. ;               DATA STORAGE
  408.  
  409. FTEMP:  DS      2
  410. FPFCB:  DS      2
  411. FPFBA:  DS      2
  412. FXFBA:  DS      2
  413. FPFDV:  DS      2
  414. FPFBUF: DS      2
  415.  
  416.