home *** CD-ROM | disk | FTP | other *** search
- ; CPM VERSION OF UTILITY SUBROUTINE PACKAGE
-
- ; MISCELLANEOUS WORKER PROCEDURES
-
- SYSTEM EQU 0
-
- ; PROCEDURE TO RELOAD MENU PROGRAM
-
- BOOT:
- RESET FCB,MUSE$NAME,'C','O','M'
- JMP BOOTER
- DB 5,5
- MUSE$NAME:
- DB 'MUSIC'
-
- ; PROCEDURE TO OBTAIN CONFIGURATION
-
- BEGIN:
- RESET FCB,BGN$NAME,'C','N','F'
- JC BGNERR
- LXI D,BLOCK
- MVI C,26
- CALL CPM
- LXI D,FCB
- MVI C,20
- CALL CPM
- JC BGNERR
- RET
- BGNERR:
- RESET FCB,STUP$NAME,'C','O','M'
- JMP BOOTER
- DB 5,5
- STUP$NAME:
- DB 'SETUP'
-
- DB 4,4
- BGN$NAME: DB 'SONG'
-
- BLOCK: DS 0
- CPU: DB 1
- CLOCK: DB 95H,74H,24H,00H
- CASH: DB 0FFH
- MXVCE: DW 4
- LSIZE: DW 16
- DAC: DB 24H
- PERA: DB 0FFH
- MEMAP: DB 0
-
- CRLF: DB 0DH,0AH,'$'
- MXCOL: DW 80
- MXROW: DW 24
- CR: DB 2
- PRFX: DB 0
-
- CMMD: DB 16
- XBND1: DB 79
- XINC1: DB 32
- XBND2: DB 80
- XINC2: DB 32
- YBND1: DB 23
- YINC1: DB 32
- YBND2: DB 24
- YINC2: DB 32
-
- CLESL: DB '$','$','$','$','$','$'
- CLELL: DB '$','$','$','$','$','$'
- NULL$COUNT: DB 0
-
- HOME: DB 19H
- UP$ARROW: DB 0BH
- LEFT$ARROW: DB 08H
- DOWN$ARROW: DB 0AH
- RITE$ARROW: DB 0CH
- RETURN: DB 0DH
- QUIT: DB 11H
- CANCEL: DB 03H
-
- TRANSLATE:
- DB 'H',19H
- DB 'A',0BH
- DB 'D',08H
- DB 'B',0AH
- DB 'C',0CH
- DB 'P',11H
- DB 'Q',03H
- DB 0,0
-
- PAGE$HEIGHT: DW 50
- PAGE$FEED: DB 0
- PAGE$SPACE: DB 0
-
- ; GOTOXY PROCEDURE FOR CERTAIN MEMORY MAPPED
- ; VIDEO BOARDS...SOL AND CUTTER.
-
- MGTXY:
- PUSH PSW
- PUSH B
- MVI B,1BH
- CALL 0C019H
- MVI B,01H
- CALL 0C019H
- POP B
- CALL 0C019H
- MVI B,1BH
- CALL 0C019H
- MVI B,02H
- CALL 0C019H
- POP PSW
- MOV B,A
- CALL 0C019H
- RET
-
- FILL: DS 40
-
- ; MUSIC BOARD BEEPER ROUTINE
-
- BEEP:
- LDA DAC
- STA BEEP01+1
- MVI B,0E0H ; SET DURATION
- MVI A,0 ; CLEAR WAVEGEN
- BEEP01:
- OUT 0 ; TO MUSIC BOARD
- INR A ; STEP FOR RAMP
- INR A
- JNZ BEEP01
- INR B ; COUNT LAMBDA
- JNZ BEEP01
- RET
-
- ; PROCEDURE TO GET INTEGER
-
- ; INPUTS: HL = HI$VAL
- ; OUTPUTS: HL = INTEGER
-
- GET$INT:
- SHLD GTNTX2
- GTNT01:
- REDLN GTNTX5,5
- LXI H,GTNTX5
- CALL STR$TO$INT
- XCHG
- MOV A,D
- ORA E
- JZ GTNT03
- LHLD GTNTX2
- CALL CPHLDE
- JP GTNT04
- GTNT02:
- WRTLN GTNTL1
- JMP GTNT01
- GTNT03:
- LDA GTNTXZ
- ORA A
- JNZ GTNT02
- GTNT04:
- MVI A,1
- STA GTNTXZ
- XCHG
- RET
- GTNTX2: DW 0
- GTNTXZ: DB 1
- DS 2
- GTNTX5: DS 5
- GTNTL1: DB 13,10,7,'Number not in range. Reenter >','$'
-
- ; PROCEDURE TO WRITE A STRING TO A FILE
- ; INPUTS: HL=@(STRING)
- ; DE=@(FCB)
-
- SWRITE:
- MOV A,M
- CPI '$'
- RZ
- PUSH H
- PUSH D
- CALL FWRIT
- POP D
- POP H
- INX H
- JMP SWRITE
-
- ; PROCEDURE TO CONVERT AN INTEGER TO A STRING
-
- ; INPUTS: HL = @(STRING)
- ; DE = INTEGER
- ; A = S(STRING)MIN
-
- INT$TO$STR:
- DCR A
- SHLD NTSTAD
- XCHG
- SHLD NTSTX
- MVI E,TRUE ; PUSH(EOT);
- PUSH D
- NTST01: ; REPEAT
- STA NTSTY
- LHLD NTSTX ; HL:=NTSTX MOD 10;
- XCHG
- LXI H,0
- LXI B,10
- CALL DIVIDE
- PUSH H ; PUSH(HL);
- LHLD NTSTX ; NTSTX:=NTSTX DIV 10
- XCHG
- LXI H,0
- LXI B,10
- CALL DIVIDE
- XCHG
- SHLD NTSTX
- LDA NTSTY
- DCR A ; UNTIL SIZE=0;
- JP NTST01
- LHLD NTSTX ; OR INT=0
- MOV A,H
- ORA L
- MVI A,0FFH
- JNZ NTST01
- LHLD NTSTAD
- NTST02:
- POP D ; POP(DE);
- MOV A,E ; WHILE E<>EOT DO BEGIN
- CPI TRUE
- RZ
- ORI 30H ; X:=S+30H;
- MOV M,A ; SONG$LINE[I]:=X;
- INX H ; I:=I+1
- JMP NTST02 ; END
- NTSTAD: DS 2
- NTSTX: DS 2
- NTSTY: DS 1
-
- ; PROCEDURE TO CONVERT A STRING TO AN INTEGER
-
- ; INPUTS: HL = @(STRING)
- ; OUTPUTS: HL = INTEGER
-
- STR$TO$INT:
- LXI D,0 ; DE:=0;
- STIN01:
- MOV A,M ; WHILE M IN ['0'..'9']
- XCHG ; (HL:=DE FOR RETURN)
- CPI '0'
- RM
- CPI ':'
- RP ; DO BEGIN
- ANI 0FH ; BC:=M AND 0FH;
- MVI B,0
- MOV C,A
- PUSH D
- PUSH H ; HL:=10*DE;
- POP D
- DAD H
- DAD H
- DAD D
- DAD H
- DAD B ; DE:=HL+BC;
- XCHG
- POP H
- INX H ; HL:=HL+1
- JMP STIN01 ; END
-
- ; PROCEDURE TO COMPARE TWO STRINGS
-
- ; INPUTS DE = @(STRING A)
- ; HL = @(STRING B)
- ; A = S(STRING)
-
- ; OUTPUTS CONDITION CODE
-
- STCMP:
- MOV B,A
- STCP01:
- LDAX D ; GET BYTE OF STRING B
- SUB M ; A - B
- RNZ ; GO IF NOT EQUAL
- INX D ; BUMP POINTERS
- INX H
- DCR B ; COUNT BYTES
- JNZ STCP01
- RET ; RETURN WITH EQUAL
-
- ; PROCEDURE TO COMPARE TWO WORDS
-
- ; INPUTS HL=FIRST WORD
- ; DE=SECOND WORD
-
- ; OUTPUTS CONDITION CODE(LESS C)
-
- CPHLDE:
- PUSH B
- PUSH D
- PUSH H
- MVI B,16
- CPHL01:
- DAD H ; TEST HIGH BIT
- XCHG
- JC CPHL02
- DAD H ; HL HIGH BIT OFF
- XCHG
- JNC CPHL03 ; BITS THE SAME
- MVI A,0FFH ; HL<DE
- JMP CPHL04
- CPHL02:
- DAD H ; HL HIGH BIT ON
- XCHG
- JC CPHL03 ; BITS THE SAME
- MVI A,01H ; HL>DE
- JMP CPHL04
- CPHL03:
- DCR B
- JNZ CPHL01
- MVI A,00H ; HL=DE
- CPHL04:
- CPI 0 ; SET CONDITION CODE
- POP H
- POP D
- POP B
- RET
-
- ; PROCEDURE TO SET AREA TO VALUE
-
- ; INPUTS HL=@(AREA)
- ; A=VALUE
- ; B=S(AREA)
-
- FILLCHAR:
- MOV M,A
- INX H
- DCR B
- JNZ FILLCHAR
- RET
-
- ; PROCEDURE TO MOVE STRING TO AREA
-
- ; INPUTS: HL = @(STRING)
- ; DE = @(AREA)
- ; A = S(STRING)
-
- MOVELEFT:
- PUSH B
- PUSH D
- PUSH H
- MOV B,A
- MVLF01:
- MOV A,M
- STAX D
- INX H
- INX D
- DCR B
- JNZ MVLF01
- POP H
- POP D
- POP B
- RET
-
- ; PROCEDURE TO PERFORM INTEGER MULTIPLICATION
-
- ; INPUTS: HL = MULTIPLICAND
- ; DE = MULTIPLIER
- ; OUTPUTS: DEHL = PRODUCT
-
- MULTIPLY:
- PUSH H
- POP B
- MVI A,16 ; ITERATION COUNTER
- LXI H,0 ; ZERO PRODUCT
- MULT01:
- PUSH PSW
- MOV A,D ; TEST NEXT
- ANI 80H ; M$PLIER BIT
- JZ MULT02 ; GO IF ZERO
- DAD B ; ADD M$CAND
- JNC MULT02 ; GO IF NO CARRY
- INX D ; CARRY TO MS BYTES
- MULT02:
- POP PSW
- DCR A ; DECREMENT ITERATION COUNT
- RZ ; DONE ON ZERO
- XCHG
- DAD H ; SHIFT DE
- XCHG
- DAD H ; SHIFT HL
- JNC MULT01 ; GO IF NO CARRY
- INX D ; CARRY TO MS BYTES
- JMP MULT01 ; LOOP
- RET
-
- ; PROCEDURE TO PERFORM INTEGER DIVISION
-
- ; INPUTS: HLDE = DIVIDEND
- ; BC = DIVISOR
- ; OUTPUTS: DE = QUOTIENT
- ; HL = REMAINDER
-
- DIVIDE:
- MOV A,B ; GET
- CMA ; TWO'S
- MOV B,A ; COMPLEMENT
- MOV A,C ; OF
- CMA ; DIVISOR
- MOV C,A
- INX B
- MVI A,16 ; ITERATION COUNT
- DVID01:
- PUSH PSW ; SAVE COUNT
- DAD H ; SHIFT HL
- XCHG ; DE TO HL FOR SHIFT
- DAD H ; SHIFT DE
- XCHG
- JNC DVID02 ; GO IF NO CARRY
- INX H ; CARRY TO MS 2 BYTES
- DVID02:
- PUSH H ; SAVE HL
- MOV A,L ; TEST IF
- ADD C ; HL>BC
- MOV A,H
- ADC B
- POP H ; RETRIEVE HL
- JM DVID03 ; GO IF HL<BC
- DAD B
- INX D
- DVID03:
- POP PSW ; RETRIEVE COUNTER
- DCR A ; DECREMENT COUNT
- JNZ DVID01 ; REPEAT UNTIL DONE
- RET
-