home *** CD-ROM | disk | FTP | other *** search
- ; CP/M SYSTEM EQUATES
-
- SYSTEM EQU 0
- BDOS EQU 5
- READC EQU 1
- WRITC EQU 2
- INST EQU 10
-
- ; ENVIRONMENT RETRIEVAL ROUTINE
-
- BEGIN:
- LXI D,TBUF ; SAVE
- LXI H,SCORE ; TBUF
- MVI B,128 ; TEMPORARILY
- CALL MOVE$BUFFER
-
- LXI D,FCB ; OPEN THE
- LXI H,BGN$NAME ; ENVIRONMENT
- CALL FFCB ; FILE
- MVI A,'C'
- STA FCB+9
- MVI A,'N'
- STA FCB+10
- MVI A,'F'
- STA FCB+11
- LXI D,FCB
- CALL FRESET
- LXI D,BLOCK ; SET DMA
- MVI C,26 ; TO BLOCK
- CALL CPM
- LXI D,FCB ; READ
- MVI C,20 ; ENVIRONMENT
- CALL CPM ; RECORD
- LXI D,TBUF ; AND RESET
- MVI C,26 ; DMA BACK
- CALL CPM ; TO TBUF
-
- IF NOT CASHEAB
- LDA DAC
- STA X22+1
- STA X33+1
- STA X44+1
- ENDIF
-
- IF PERCUSSION
- LDA PERA
- CPI 0
- JZ BGN01
- MVI A,0D3H
- STA PR21
- IF NOT CASHEAB
- STA PR31
- STA PR41
- ENDIF
- LDA PERA
- STA PR21+1
- IF NOT CASHEAB
- STA PR31+1
- STA PR41+1
- ENDIF
- BGN01:
- ENDIF
-
- LXI D,SCORE ; RETRIEVE
- LXI H,TBUF ; TBUF
- MVI B,128
- CALL MOVE$BUFFER
- RET
-
- DB 4,4
- BGN$NAME: DB 'SONG'
- BLOCK: DS 0
- CPU: DS 1
- CLOCK: DS 4
- CASH: DS 1
- MXVCE: DS 2
- LSIZE: DS 2
- DAC: DS 1
- PERA: DS 1
- MEMAP: DS 1
- CRLF: DS 3
- MXCOL: DS 2
- MXROW: DS 2
- FILL: DS 110
-
- ; LOGICAL I/O SYSTEM FOR CP/M
-
- ; MISCELLANEOUS EQUATES
-
- CPM EQU 5 ; CPM ENTRY POINT
- BIOS EQU 0 ; BIOS ENTRY POINT
-
- FCB EQU 5CH ; TRANSIENT FCB
- TBUF EQU 80H ; TRANSIENT BUFFER
-
- ; FCB FORMAT
-
- FFET EQU 0 ; ENTRY TYPE
- FFFN EQU 1 ; FILE NAME
- FFFT EQU 9 ; FILE TYPE
- FFEX EQU 12 ; FILE EXTENT
- FFRC EQU 15 ; RECORD COUNT
- FFDM EQU 16 ; ALLOCATION MAP
- FFNR EQU 32 ; NEXT RECORD
- FFBA EQU 33 ; NEXT BYTE
- FFDV EQU 35 ; DEVICE ADDRESS
- FFBUF EQU 36 ; BUFFER
-
- ; WRITE CHARACTER TO CONSOLE
-
- FWTCH:
- PUSH PSW
- CPI 13 ; CHECK FOR CR
- JNZ FWTCH1
- LDA CRLF
- FWTCH1:
- CPI 10 ; CHECK FOR LF
- JNZ FWTCH2
- LDA CRLF+1
- FWTCH2:
- MOV E,A
- MVI C,WRITC
- CALL BDOS
- POP PSW
- RET
-
- ; WRITE LINE ROUTINE
-
- FWRTLN:
- MOV A,M
- CPI '$'
- RZ
- PUSH H
- CALL FWTCH
- POP H
- INX H
- JMP FWRTLN
-
- ; FCB BUILDER
-
- ; PREPARES FCB FOR I/O
-
- ; INPUTS: DE = @(FCB)
- ; HL = @(FCB$NAME)
-
- FFCB:
- CALL FCPRS ; COMPRESS INPUT
- CALL FADDR ; GET ADDRS
- DCX H ; OBTAIN
- MOV B,M ; SIZE
- PUSH B ; AND
- INX H ; SAVE
- XCHG
- SHLD FTEMP ; SAVE HL
- MVI A,36 ; AND
- FFCB01:
- MVI M,0 ; CLEAR
- INX H ; ENTIRE
- DCR A ; FCB
- JNZ FFCB01
- PUSH D ; GET CURRENT
- MVI C,25 ; DEVICE
- CALL CPM ; SPECIFICATION
- LHLD FPFDV ; RETRIEVE HL
- MOV M,A ; AND SAVE
- POP D ; RETRIEVE
- PUSH D ; D AND
- LDAX D ; GET DEVICE
- MOV B,A ; SPEC
- INX D ; POINT TO ':'
- LDAX D ; GET ':'
- CPI ':' ; TEST FOR
- JNZ FFCB02 ; DEVICE SPEC
- MOV A,B ; NORMALIZE
- MVI B,'A' ; DEVICE
- SUB B ; SPEC
- MOV M,A ; AND SAVE
- INX D ; BYPASS D:
- POP B
- POP B ; ADJUST
- DCR B ; SIZE
- DCR B
- PUSH B
- PUSH D
- FFCB02:
- LHLD FPFCB ; POINT
- INX H ; TO ID
- PUSH H ; AND SAVE
- MVI A,11
- FFCB03:
- MVI M,' ' ; CLEAR
- INX H ; ID
- DCR A ; TO
- JNZ FFCB03 ; SPACES
- POP H ; RETRIEVE
- POP D ; HL, DE
- POP B ; AND BC
- FFCB04:
- LDAX D ; GET NAME
- CPI '.' ; AND TEST
- JZ FFCB06 ; FOR TYPE
- MOV M,A ; ELSE
- INX H ; MOVE
- FFCB05:
- INX D ; CHARACTER
- DCR B ; TO
- JNZ FFCB04 ; FCB
- RET
- FFCB06:
- PUSH D ; POINT
- LHLD FTEMP ; TO
- LXI D,FFFT ; TYPE
- DAD D ; FIELD
- POP D ; IN
- JMP FFCB05 ; FCB
-
- FCPRS:
- PUSH H
- PUSH D
- MOV D,H
- MOV E,L
- DCX H
- MOV B,M
- INX H
- MVI C,0
- FCPR01:
- LDAX D
- CPI '.'
- JM FCPR02
- CPI '['
- JP FCPR02
- MOV M,A
- INX H
- INR C
- FCPR02:
- INX D
- DCR B
- JNZ FCPR01
- POP D
- POP H
- DCX H
- MOV M,C
- INX H
- RET
-
- ; OPEN A DISK FILE
-
- ; INPUT: DE = @(FCB)
- ; OUTPUT: CARRY = ERROR
-
- FRESET:
- MVI A,15 ; SET UP
- STA FTEMP ; FOR OPEN
- CALL FINIT
- PUSH PSW
- LHLD FPFBUF ; INITIALIZE
- LXI D,128 ; POINTER
- DAD D
- CALL FSVFBA
- POP PSW
- RET
-
- ; DISK INITIALIZATION
-
- ; INPUT: DE = @(FCB)
- ; FTEMP = COMMAND
- ; OUTPUT: CARRY = ERROR
-
- FINIT:
- CALL FADDR ; GET FCB ADDRS
- CALL FSW ; SELECT DEVICE
- LHLD FPFCB ; RETRIEVE
- XCHG ; DE
- LDA FTEMP ; GET COMMAND
- MOV C,A ; CREATE/OPEN/CLOSE
- CALL CPM ; OR DELETE FILE
- PUSH PSW ; SAVE ERRORS
- CALL FSW ; DEVICE
- POP PSW ; RETRIEVE AND
- CPI 0FFH ; TEST FOR
- JZ FINT01 ; ERROR
- XRA A ; NO
- RET
- FINT01:
- STC ; SET
- RET ; CARRY
-
- ; READ BYTE FROM DISK
-
- ; INPUT: DE = @(FCB)
- ; OUTPUT: A = BYTE
- ; CARRY = ERROR
-
- FREAD:
- MVI A,0 ; CLEAR
- STA EOF ; EOF
-
- CALL FADDR ; GET FCB ADDRS
- FRD01:
- LHLD FPFBUF
- LXI D,128
- DAD D
- XCHG ; BUFFER END ADDR IN DE
- LHLD FXFBA ; CURRENT PONTER IN HL
- CALL FCPHL ; TEST FOR END OF BUFFER
- JZ FRD02 ; YES SO GO READ
- MOV A,M ; GET BYTE
- INX H ; BUMP POINTER
- CALL FSVFBA ; AND SAVE IT
- ORA A ; RESET FLAG
- RET
- FRD02:
- CALL FSW ; SET DRIVE
- LHLD FPFCB
- XCHG
- MVI C,20 ; READ
- CALL CPM ; BLOCK
- PUSH PSW ; SAVE ERRORS
- CALL FSW ; RESET DRIVE
- POP PSW ; RETRIEVE AND
- CPI 0 ; TEST FOR
- JNZ FRDER ; ERROR
- LHLD FPFBUF ; RESET
- CALL FSVFBA ; POINTER
- JMP FRD01
- FRDER:
- MVI A,1 ; FLAG END
- STA EOF
- RET
-
- ; DRIVE SWITCH PROCEDURE
-
- FSW:
- PUSH H
- PUSH D
- MVI C,25 ; GET CURRENT
- CALL CPM ; DRIVE NUMBER
- MOV B,A
- LHLD FPFDV
- MOV E,M ; EXCHANGE
- MOV M,B ; NUMBER
- MVI C,14 ; TELL
- CALL CPM ; CPM
- LHLD FPFBUF ; SET
- XCHG ; DMA
- MVI C,26
- CALL CPM
- POP D
- POP H
- RET
-
- ; FCB ADDRESS COMPUTER
-
- ; INPUT: DE = @(FCB)
-
- FADDR:
- PUSH H
- PUSH D
- XCHG
- SHLD FPFCB
- LXI D,FFBA
- DAD D
- SHLD FPFBA
- MOV E,M
- INX H
- MOV D,M
- XCHG
- SHLD FXFBA
- LHLD FPFCB
- LXI D,FFDV
- DAD D
- SHLD FPFDV
- LHLD FPFCB
- LXI D,FFBUF
- DAD D
- SHLD FPFBUF
- POP D
- POP H
- RET
-
- ; SAVE FBA PROCEDURE
-
- ; INPUT: HL = POINTER
-
- FSVFBA:
- SHLD FXFBA
- XCHG
- LHLD FPFBA
- MOV M,E
- INX H
- MOV M,D
- RET
-
- ; DOUBLE PRECISION COMPARE
-
- ; INPUT: HL AND DE
- ; OUTPUT: EQUAL/NOT EQUAL
-
- FCPHL:
- MOV A,H
- CMP D
- RNZ
- MOV A,L
- CMP E
- RET
-
- ; DATA STORAGE
-
- FTEMP: DS 2
- FPFCB: DS 2
- FPFBA: DS 2
- FXFBA: DS 2
- FPFDV: DS 2
- FPFBUF: DS 2
-