home *** CD-ROM | disk | FTP | other *** search
- ; TRS80 VERSION OF UTILITY SUBROUTINE PACKAGE
-
- SYSTEM EQU 402DH
-
- ; MISCELLANEOUS WORKER PROCEDURES
-
- ; PROCEDURE TO RELOAD MENU PROGRAM
-
- BOOT:
- RESET FCB,MUSE$NAME,'C','O','M'
- JMP BOOTER
- DB 5,5
- MUSE$NAME:
- DB 'MUSIC'
-
- BEGIN: RET
-
- BLOCK: DS 0
- CPU: DB 3
- CLOCK: DB 95H,58H,8DH,80H
- CASH: DB 0FFH
- MXVCE: DW 4
- LSIZE: DW 16
- DAC: DB 0FCH
- CRLF: DW 0DH,00H,'$'
- MXCOL: DW 64
- MXROW: DW 16
- CEOS: DB 31
- CEOL: DB 30
- SCRL: DB 42 ; ASTERISK
- HOME: DB 59 ; SEMICOLON
- UP$ARROW: DB 91
- LEFT$ARROW: DB 8
- DOWN$ARROW: DB 10
- RITE$ARROW: DB 9
- RETURN: DB 0DH
- QUIT: DB 36 ; DOLLAR SIGN
- CANCEL: DB 39 ; SINGLE QUOTE
- PAGE$HEIGHT: DW 50
- PAGE$FEED: DB 0
- PAGE$SPACE: DB 10
-
- ; JUMP TABLE FOR TRSDOS 2.X
-
- CURSOR EQU 4020H ; CURSOR ADDRESS
-
- JGTCH: JMP 002BH ; GET CHARACTER
- JWTCH: JMP 0033H ; WRITE CHARACTER
- JREWRT: JMP 4420H ; CREATE FILE
- JRESET: JMP 4424H ; OPEN FILE
- JCLOS: JMP 4428H ; CLOSE FILE
- JDELE: JMP 442CH ; DELETE FILE
- JWRIT: JMP 443CH ; WRITE TO FILE
- JREAD: JMP 4436H ; READ FROM FILE
-
- ; MUSIC BOX BEEPER ROUTINE
-
- BEEP:
- LDA DAC
- STA BEEP01+1
- DI ; DISABLE GLITCHER
- MVI B,0E0H ; SET DURATION
- MVI A,0 ; CLEAR WAVEGEN
- BEEP01:
- OUT 0 ; TO MUSIC BOX
- INR A ; STEP FOR RAMP
- INR A
- JNZ BEEP01
- INR B ; COUNT LAMBDA
- JNZ BEEP01
- EI ; REGLITCH
- 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
- CALL BEEP
- 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
-
-