mirror of https://github.com/wwarthen/RomWBW.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
329 lines
6.2 KiB
329 lines
6.2 KiB
;
|
|
;------------------------------------------------------------------------------
|
|
; PLAY SCALES USING HBIOS
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
FCB .EQU $5C ; Location of default FCB
|
|
BDOS .EQU $0005
|
|
;
|
|
.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
|
|
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
|
|
PUSH BC
|
|
LD E,4
|
|
RST 08
|
|
LD DE,TXT_NAME
|
|
LD A,B
|
|
RRCA \ RRCA \ RRCA \ RRCA
|
|
CALL PRTIDXDEA ; SHOW NAME
|
|
LD DE,TXT_CH
|
|
CALL PRTSTR
|
|
;
|
|
POP BC ; GET & DISPLAY # CHANNELS
|
|
LD E,1
|
|
RST 08
|
|
LD A,B
|
|
CALL PRTDECB
|
|
CALL CRLF ; NUMBER OF CHANNELS IS IN B
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
; LOOP THROUGH EACH CHANNEL
|
|
;------------------------------------------------------------------------------
|
|
|
|
CH__TONE: LD A,(DEVICE) ; C CONTAINS DEVICE
|
|
LD C,A ; THROUGH THIS LOOP
|
|
;
|
|
PUSH BC
|
|
LD B,50H ; RESET DEVICE
|
|
RST 08
|
|
POP BC
|
|
;
|
|
PUSH BC
|
|
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 TST_SCALES ; SCALES TEST
|
|
; CALL TST_VOLUME ; VOLUME TEST
|
|
CALL CRLF
|
|
DJNZ TST_TONE_LP
|
|
;
|
|
PUSH BC
|
|
LD B,50H ; RESET DEVICE
|
|
RST 08
|
|
POP BC
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
; RESTORE STACK & EXIT
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
EXIT: LD SP, (OLDSTACK) ; Exit to CP/M
|
|
RST 00H
|
|
DI
|
|
HALT
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
; PLAY SCALES FROM HIGHEST HBIOS NOTE TO LOWEST
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
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 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 ; SET NOTE
|
|
LD HL,(NOTE)
|
|
PUSH BC
|
|
RST 08
|
|
POP BC
|
|
|
|
OR A ; DID DRIVER FAIL
|
|
JR Z,NEXT4 ; THIS NOTE ?
|
|
|
|
LD DE,TXT_BAD_N
|
|
CALL FAILMSG
|
|
JR SKIP
|
|
;
|
|
NEXT4: LD B,57H ; DURATION
|
|
LD HL,1000
|
|
PUSH BC
|
|
RST 08
|
|
POP BC
|
|
|
|
LD B,54H ; PLAY
|
|
LD A,(CHANNEL)
|
|
LD D,A
|
|
PUSH BC
|
|
RST 08
|
|
POP BC
|
|
;
|
|
OR A ; DID DRIVER FAIL
|
|
JR Z,NEXT2 ; TO PLAY ?
|
|
|
|
LD DE,TXT_BAD_N
|
|
CALL FAILMSG
|
|
JR SKIP
|
|
;
|
|
NEXT2: CALL DELAY
|
|
CALL CRLF
|
|
;
|
|
SKIP: LD HL,(NOTE)
|
|
DEC HL
|
|
LD (NOTE),HL
|
|
|
|
INC HL
|
|
LD A,H
|
|
OR L
|
|
DEC HL
|
|
JR NZ,NEXT0
|
|
;
|
|
LD B,51H ; VOLUME
|
|
LD L,00H ; OFF
|
|
PUSH BC
|
|
RST 08
|
|
POP BC
|
|
;
|
|
LD B,54H ; PLAY
|
|
LD A,(CHANNEL)
|
|
LD D,A
|
|
PUSH BC
|
|
RST 08
|
|
POP BC
|
|
|
|
PUSH BC
|
|
LD C, 6 ; check for keypress
|
|
LD E,0FFH
|
|
CALL BDOS
|
|
POP BC
|
|
OR A
|
|
JP NZ,EXIT
|
|
|
|
POP AF
|
|
POP BC
|
|
;
|
|
RET
|
|
;
|
|
FAILMSG: PUSH AF
|
|
PUSH BC
|
|
CALL PRTSTR
|
|
CALL CRLF
|
|
POP BC
|
|
POP AF
|
|
RET
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
; CONSTANT TONE ON ALL CHANNELS, SCALE VOLUME
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
TST_VOLUME:
|
|
LD HL,332+48 ; TONE
|
|
LD (NOTE),HL
|
|
;
|
|
LD B,3
|
|
NEXTCH1 LD A,B
|
|
DEC A
|
|
LD (CHANNEL),A
|
|
PUSH BC ; ACROSS
|
|
CALL TONE ; ALL
|
|
|
|
LD C, 6 ; KEYPRESS
|
|
LD E, 0FFH
|
|
CALL BDOS
|
|
POP BC ; CHANNELS
|
|
|
|
OR A
|
|
JP NZ,EXIT
|
|
|
|
DJNZ NEXTCH1
|
|
|
|
RET
|
|
|
|
TONE: LD A,(DEVICE)
|
|
LD C,A
|
|
|
|
LD B,50H ; RESET
|
|
PUSH BC
|
|
RST 08
|
|
POP BC
|
|
;
|
|
NEXT1: LD B,51H ; VOLUME
|
|
LD A,(VOLUME)
|
|
LD L,A
|
|
PUSH BC
|
|
RST 08
|
|
POP BC
|
|
;
|
|
LD B,53H ; NOTE
|
|
LD HL,(NOTE)
|
|
PUSH BC
|
|
RST 08
|
|
POP BC
|
|
;
|
|
LD B,54H ; PLAY
|
|
LD A,(CHANNEL)
|
|
LD D,A
|
|
PUSH BC
|
|
RST 08
|
|
POP BC
|
|
;
|
|
CALL DELAY
|
|
;
|
|
LD A,(VOLUME)
|
|
DEC A
|
|
LD (VOLUME),A
|
|
JR NZ,NEXT1
|
|
;
|
|
LD B,51H ; VOLUME
|
|
LD L,00H
|
|
PUSH BC
|
|
RST 08
|
|
POP BC
|
|
;
|
|
LD B,54H ; PLAY
|
|
PUSH BC
|
|
LD A,(CHANNEL)
|
|
LD D,A
|
|
POP BC
|
|
RST 08
|
|
;
|
|
RET
|
|
;;
|
|
;------------------------------------------------------------------------------
|
|
; LONG DELAY
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
DELAY: LD HL,-1
|
|
DELAY1: DEC HL
|
|
LD A,H
|
|
OR L
|
|
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"
|
|
;
|
|
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
|
|
CHANNEL .DB 0
|
|
OLDSTACK .DW 0 ; original stack pointer
|
|
.DS 40H ; space for stack
|
|
STACK ; top of stack
|
|
;
|
|
.END
|
|
|