|
|
|
@ -1,49 +1,60 @@ |
|
|
|
; |
|
|
|
;------------------------------------------------------------------------------ |
|
|
|
; Play Scales using HBIOS |
|
|
|
; PLAY SCALES USING HBIOS |
|
|
|
;------------------------------------------------------------------------------ |
|
|
|
; |
|
|
|
FCB .EQU $5C ; Location of default FCB |
|
|
|
BDOS .EQU $0005 |
|
|
|
|
|
|
|
STEP .EQU 4 ; NOTE STEP I.E. 1 SEMITONE |
|
|
|
|
|
|
|
; |
|
|
|
.ORG $0100 |
|
|
|
; |
|
|
|
LD (OLDSTACK),SP ; save old stack pointer |
|
|
|
LD SP,STACK ; set new stack pointer |
|
|
|
; |
|
|
|
;------------------------------------------------------------------------------ |
|
|
|
; GET DEVICE # FROM COMMAND LINE |
|
|
|
;------------------------------------------------------------------------------ |
|
|
|
; |
|
|
|
LD A,(FCB+1) ; GET FIRST CHAR |
|
|
|
CP '/' ; IS IT INDICATING AN ARGUMENT |
|
|
|
LD A,0 ; ASSUME DEVICE 0 |
|
|
|
JR NZ,NO_ARG ; |
|
|
|
LD A,(FCB+2) ; GET NEXT CHARACTER |
|
|
|
SUB '0' ; CALCULATE DEVICE # |
|
|
|
LD (DEVICE),A ; |
|
|
|
|
|
|
|
NO_ARG: LD C,A ; GET & DISPLAY # CHANNELS |
|
|
|
SUB ' ' |
|
|
|
JR Z,NO_ARG |
|
|
|
SUB '0'-' ' |
|
|
|
JP C,EXIT |
|
|
|
; |
|
|
|
;------------------------------------------------------------------------------ |
|
|
|
; DISPLAY DEVICE AND NUMBER OF CHANNELS |
|
|
|
;------------------------------------------------------------------------------ |
|
|
|
; |
|
|
|
NO_ARG: LD (DEVICE),A ; |
|
|
|
LD DE,TXT_DEV ; DEVICE: |
|
|
|
CALL PRTSTR |
|
|
|
CALL PRTDECB |
|
|
|
LD C,A ; GET DEVICE ID |
|
|
|
LD A,':' |
|
|
|
CALL PRTCHR |
|
|
|
LD B,$55 |
|
|
|
LD E,1 |
|
|
|
PUSH BC |
|
|
|
LD E,4 |
|
|
|
RST 08 |
|
|
|
LD DE,TXT_NAME |
|
|
|
LD A,B |
|
|
|
CALL PRTHEX |
|
|
|
call CRLF |
|
|
|
|
|
|
|
LD B,1 |
|
|
|
RRCA \ RRCA \ RRCA \ RRCA |
|
|
|
CALL PRTIDXDEA ; SHOW NAME |
|
|
|
LD DE,TXT_CH |
|
|
|
CALL PRTSTR |
|
|
|
; |
|
|
|
CALL TST_TONE |
|
|
|
; CALL TST_VOL |
|
|
|
POP BC ; GET & DISPLAY # CHANNELS |
|
|
|
LD E,1 |
|
|
|
RST 08 |
|
|
|
LD A,B |
|
|
|
CALL PRTDECB |
|
|
|
CALL CRLF ; NUMBER OF CHANNELS IS IN B |
|
|
|
; |
|
|
|
EXIT: LD SP, (OLDSTACK) ; Exit to CP/M |
|
|
|
RST 00H |
|
|
|
DI |
|
|
|
HALT |
|
|
|
|
|
|
|
;------------------------------------------------------------------------------ |
|
|
|
; FOR EACH CHANNEL PLAY SCALES FROM HIGHEST TO LOWEST. B = # CHANNELS |
|
|
|
; LOOP THROUGH EACH CHANNEL |
|
|
|
;------------------------------------------------------------------------------ |
|
|
|
|
|
|
|
TST_TONE: LD A,(DEVICE) ; C CONTAINS DEVICE |
|
|
|
CH__TONE: LD A,(DEVICE) ; C CONTAINS DEVICE |
|
|
|
LD C,A ; THROUGH THIS LOOP |
|
|
|
; |
|
|
|
PUSH BC |
|
|
|
@ -52,15 +63,17 @@ TST_TONE: LD A,(DEVICE) ; C CONTAINS DEVICE |
|
|
|
POP BC |
|
|
|
; |
|
|
|
PUSH BC |
|
|
|
LD B,51H ; VOLUME HALF |
|
|
|
LD L,80H |
|
|
|
LD B,51H ; VOLUME FULL |
|
|
|
LD L,0FFH |
|
|
|
RST 08 |
|
|
|
POP BC |
|
|
|
; |
|
|
|
LD A,B |
|
|
|
TST_TONE_LP: DEC A |
|
|
|
LD (CHANNEL),A ; SAVE CURRENT CHANNEL |
|
|
|
CALL SCALES ; PLAY SCALE |
|
|
|
CALL TST_SCALES ; SCALES TEST |
|
|
|
; CALL TST_VOLUME ; VOLUME TEST |
|
|
|
CALL CRLF |
|
|
|
DJNZ TST_TONE_LP |
|
|
|
; |
|
|
|
PUSH BC |
|
|
|
@ -68,23 +81,45 @@ TST_TONE_LP: DEC A |
|
|
|
RST 08 |
|
|
|
POP BC |
|
|
|
; |
|
|
|
RET |
|
|
|
;------------------------------------------------------------------------------ |
|
|
|
; RESTORE STACK & EXIT |
|
|
|
;------------------------------------------------------------------------------ |
|
|
|
; |
|
|
|
EXIT: LD SP, (OLDSTACK) ; Exit to CP/M |
|
|
|
RST 00H |
|
|
|
DI |
|
|
|
HALT |
|
|
|
; |
|
|
|
;------------------------------------------------------------------------------ |
|
|
|
; PLAY SCALES FROM HIGHEST HBIOS NOTE TO LOWEST |
|
|
|
;------------------------------------------------------------------------------ |
|
|
|
; |
|
|
|
SCALES: PUSH BC |
|
|
|
TST_SCALES: PUSH BC |
|
|
|
PUSH AF |
|
|
|
|
|
|
|
; |
|
|
|
LD HL,380 ; START NOTE |
|
|
|
LD (NOTE),HL ; Top of Octave 7 is 343 |
|
|
|
|
|
|
|
LD B,51H ; VOLUME HIGH |
|
|
|
LD L,0FFH |
|
|
|
PUSH BC |
|
|
|
RST 08 |
|
|
|
POP BC |
|
|
|
; |
|
|
|
NEXT0: PUSH BC |
|
|
|
LD BC,(NOTE) |
|
|
|
CALL PRTHEXWORD |
|
|
|
CALL PRTDOT |
|
|
|
; |
|
|
|
LD DE,TXT_TSTCH ; DISPLAY CHANNEL |
|
|
|
CALL PRTSTR |
|
|
|
LD A,(CHANNEL) |
|
|
|
CALL PRTDECB |
|
|
|
; |
|
|
|
LD DE,TXT_NOTE ; DISPLAY NOTE |
|
|
|
CALL PRTSTR |
|
|
|
LD HL,(NOTE) |
|
|
|
CALL PRTDECW |
|
|
|
POP BC |
|
|
|
; |
|
|
|
LD B,53H ; NOTE |
|
|
|
LD B,53H ; SET NOTE |
|
|
|
LD HL,(NOTE) |
|
|
|
PUSH BC |
|
|
|
RST 08 |
|
|
|
@ -93,7 +128,7 @@ NEXT0: PUSH BC |
|
|
|
OR A ; DID DRIVER FAIL |
|
|
|
JR Z,NEXT4 ; THIS NOTE ? |
|
|
|
|
|
|
|
LD A,'n' |
|
|
|
LD DE,TXT_BAD_N |
|
|
|
CALL FAILMSG |
|
|
|
JR SKIP |
|
|
|
; |
|
|
|
@ -111,9 +146,9 @@ NEXT4: LD B,57H ; DURATION |
|
|
|
POP BC |
|
|
|
; |
|
|
|
OR A ; DID DRIVER FAIL |
|
|
|
JR Z,NEXT2 ; THIS NOTE ? |
|
|
|
JR Z,NEXT2 ; TO PLAY ? |
|
|
|
|
|
|
|
LD A,'p' |
|
|
|
LD DE,TXT_BAD_N |
|
|
|
CALL FAILMSG |
|
|
|
JR SKIP |
|
|
|
; |
|
|
|
@ -131,7 +166,7 @@ SKIP: LD HL,(NOTE) |
|
|
|
JR NZ,NEXT0 |
|
|
|
; |
|
|
|
LD B,51H ; VOLUME |
|
|
|
LD L,00H |
|
|
|
LD L,00H ; OFF |
|
|
|
PUSH BC |
|
|
|
RST 08 |
|
|
|
POP BC |
|
|
|
@ -145,7 +180,7 @@ SKIP: LD HL,(NOTE) |
|
|
|
|
|
|
|
PUSH BC |
|
|
|
LD C, 6 ; check for keypress |
|
|
|
LD E, 0FFH |
|
|
|
LD E,0FFH |
|
|
|
CALL BDOS |
|
|
|
POP BC |
|
|
|
OR A |
|
|
|
@ -157,8 +192,8 @@ SKIP: LD HL,(NOTE) |
|
|
|
RET |
|
|
|
; |
|
|
|
FAILMSG: PUSH AF |
|
|
|
PUSH BC ; YES SO DISPLAY |
|
|
|
CALL PRTCHR |
|
|
|
PUSH BC |
|
|
|
CALL PRTSTR |
|
|
|
CALL CRLF |
|
|
|
POP BC |
|
|
|
POP AF |
|
|
|
@ -167,7 +202,8 @@ FAILMSG: PUSH AF |
|
|
|
;------------------------------------------------------------------------------ |
|
|
|
; CONSTANT TONE ON ALL CHANNELS, SCALE VOLUME |
|
|
|
;------------------------------------------------------------------------------ |
|
|
|
TST_VOL: |
|
|
|
; |
|
|
|
TST_VOLUME: |
|
|
|
LD HL,332+48 ; TONE |
|
|
|
LD (NOTE),HL |
|
|
|
; |
|
|
|
@ -241,8 +277,9 @@ NEXT1: LD B,51H ; VOLUME |
|
|
|
RET |
|
|
|
;; |
|
|
|
;------------------------------------------------------------------------------ |
|
|
|
; LONG DELAY |
|
|
|
;------------------------------------------------------------------------------ |
|
|
|
|
|
|
|
; |
|
|
|
DELAY: LD HL,-1 |
|
|
|
DELAY1: DEC HL |
|
|
|
LD A,H |
|
|
|
@ -250,9 +287,37 @@ DELAY1: DEC HL |
|
|
|
JR NZ,DELAY1 |
|
|
|
RET |
|
|
|
; |
|
|
|
;------------------------------------------------------------------------------ |
|
|
|
; PRINT THE nTH STRING IN A LIST OF STRINGS WHERE EACH IS TERMINATED BY 0 |
|
|
|
; A REGISTER DEFINES THE nTH STRING IN THE LIST TO PRINT AND DE POINTS |
|
|
|
; TO THE START OF THE STRING LIST. |
|
|
|
;------------------------------------------------------------------------------ |
|
|
|
; |
|
|
|
PRTIDXDEA: LD C,A |
|
|
|
OR A |
|
|
|
PRTIDXDEA1: JR Z,PRTIDXDEA3 ; FOUND TARGET SO EXIT |
|
|
|
PRTIDXDEA2: LD A,(DE) ; LOOP UNIT |
|
|
|
INC DE ; WE REACH |
|
|
|
OR A ; END OF STRING |
|
|
|
JR NZ,PRTIDXDEA2 |
|
|
|
DEC C ; AT STRING END. SO GO |
|
|
|
JR PRTIDXDEA1 ; CHECK FOR INDEX MATCH |
|
|
|
PRTIDXDEA3: CALL PRTSTR ; DISPLAY THE STRING |
|
|
|
RET |
|
|
|
; |
|
|
|
#INCLUDE "printing.inc" |
|
|
|
; |
|
|
|
BADFLAG .DB '*','$' |
|
|
|
TXT_CH .DB "CHANNELS: ",0 |
|
|
|
TXT_TSTCH .DB "CHANNEL: ",0 |
|
|
|
TXT_BAD_N .DB " BAD NOTE",0 |
|
|
|
TXT_BAD_P .DB " PLAY ERROR",0 |
|
|
|
TXT_NOTE .DB " NOTE: ",0 |
|
|
|
TXT_DEV .DB "DEVICE: ",0 |
|
|
|
TXT_NAME .DB "SN76489 ",0 |
|
|
|
.DB "AY-3-8910 ",0 |
|
|
|
.DB "I/O PORT ",0 |
|
|
|
.DB "YM2612 ",0 |
|
|
|
MODE .DB 0 ; scales mode or volume mode |
|
|
|
DEVICE .DB 0 |
|
|
|
NOTE .DW 128 |
|
|
|
VOLUME .DB 0 |
|
|
|
@ -262,4 +327,3 @@ OLDSTACK .DW 0 ; original stack pointer |
|
|
|
STACK ; top of stack |
|
|
|
; |
|
|
|
.END |
|
|
|
|
|
|
|
|