mirror of https://github.com/wwarthen/RomWBW.git
Browse Source
- Adds support for SN76489 on Voice I/O Board - Updated SOUND.COM utilitypull/393/head v3.5.0-dev.19
14 changed files with 676 additions and 334 deletions
@ -1,5 +1,5 @@ |
|||
OBJECTS = |
|||
SUBDIRS = DMAmon I2C inttest ppidetst ramtest tstdskng rzsz vdctest kbdtest ps2info 2piotst piomon banktest portscan |
|||
SUBDIRS = DMAmon I2C inttest ppidetst ramtest tstdskng rzsz vdctest kbdtest ps2info 2piotst piomon banktest portscan sound |
|||
DEST = ../../../Binary/Apps/Test |
|||
TOOLS =../../../Tools |
|||
|
|||
|
|||
@ -0,0 +1,12 @@ |
|||
@echo off |
|||
setlocal |
|||
|
|||
set TOOLS=../../../../Tools |
|||
set PATH=%TOOLS%\tasm32;%PATH% |
|||
set TASMTABS=%TOOLS%\tasm32 |
|||
|
|||
tasm -t80 -g3 -fFF sound.asm sound.com sound.lst || exit /b |
|||
tasm -t80 -g3 -fFF ay-test.asm ay-test.com ay-test.lst || exit /b |
|||
|
|||
copy /Y sound.com ..\..\..\..\Binary\Apps\Test\ || exit /b |
|||
copy /Y ay-test.com ..\..\..\..\Binary\Apps\Test\ || exit /b |
|||
@ -0,0 +1,6 @@ |
|||
@echo off |
|||
setlocal |
|||
|
|||
if exist *.com del *.com |
|||
if exist *.lst del *.lst |
|||
if exist *.bin del *.bin |
|||
@ -0,0 +1,7 @@ |
|||
OBJECTS = ay-test.com sound.com |
|||
DEST = ../../../../Binary/Apps/Test |
|||
TOOLS =../../../../Tools |
|||
|
|||
USETASM=1 |
|||
|
|||
include $(TOOLS)/Makefile.inc |
|||
@ -1,329 +0,0 @@ |
|||
; |
|||
;------------------------------------------------------------------------------ |
|||
; 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 |
|||
@ -0,0 +1,177 @@ |
|||
; |
|||
; Print character in A without destroying any registers |
|||
; |
|||
PRTCHR: |
|||
PUSH BC ; save registers |
|||
PUSH DE |
|||
PUSH HL |
|||
LD E,A ; character to print in E |
|||
LD C,$02 ; BDOS function to output a character |
|||
CALL BDOS ; do it |
|||
POP HL ; restore registers |
|||
POP DE |
|||
POP BC |
|||
RET |
|||
; |
|||
PRTDOT: |
|||
; |
|||
; shortcut to print a dot preserving all regs |
|||
PUSH AF ; save af |
|||
LD A,'.' ; load dot char |
|||
CALL PRTCHR ; print it |
|||
POP AF ; restore af |
|||
RET ; done |
|||
; |
|||
PRTCR: |
|||
; |
|||
; shortcut to print a carriage return preserving all regs |
|||
PUSH AF ; save af |
|||
LD A,13 ; load CR value |
|||
CALL PRTCHR ; print it |
|||
POP AF ; restore af |
|||
RET ; done |
|||
; |
|||
; Print a zero terminated string at (DE) without destroying any registers |
|||
; |
|||
PRTSTR: |
|||
PUSH AF |
|||
PUSH DE |
|||
; |
|||
PRTSTR1: |
|||
LD A,(DE) ; get next char |
|||
OR A |
|||
JR Z,PRTSTR2 |
|||
CALL PRTCHR |
|||
INC DE |
|||
JR PRTSTR1 |
|||
; |
|||
PRTSTR2: |
|||
POP DE ; restore registers |
|||
POP AF |
|||
RET |
|||
; |
|||
; Print the value in A in hex without destroying any registers |
|||
; |
|||
PRTHEX: |
|||
PUSH AF ; save AF |
|||
PUSH DE ; save DE |
|||
CALL HEXASCII ; convert value in A to hex chars in DE |
|||
LD A,D ; get the high order hex char |
|||
CALL PRTCHR ; print it |
|||
LD A,E ; get the low order hex char |
|||
CALL PRTCHR ; print it |
|||
POP DE ; restore DE |
|||
POP AF ; restore AF |
|||
RET ; done |
|||
; |
|||
; print the hex word value in bc |
|||
; |
|||
PRTHEXWORD: |
|||
PUSH AF |
|||
LD A,B |
|||
CALL PRTHEX |
|||
LD A,C |
|||
CALL PRTHEX |
|||
POP AF |
|||
RET |
|||
; |
|||
; print the hex dword value in de:hl |
|||
; |
|||
PRTHEX32: |
|||
PUSH BC |
|||
PUSH DE |
|||
POP BC |
|||
CALL PRTHEXWORD |
|||
PUSH HL |
|||
POP BC |
|||
CALL PRTHEXWORD |
|||
POP BC |
|||
RET |
|||
; |
|||
; Convert binary value in A to ascii hex characters in DE |
|||
; |
|||
HEXASCII: |
|||
LD D,A ; save A in D |
|||
CALL HEXCONV ; convert low nibble of A to hex |
|||
LD E,A ; save it in E |
|||
LD A,D ; get original value back |
|||
RLCA ; rotate high order nibble to low bits |
|||
RLCA |
|||
RLCA |
|||
RLCA |
|||
CALL HEXCONV ; convert nibble |
|||
LD D,A ; save it in D |
|||
RET ; done |
|||
|
|||
; |
|||
; Convert low nibble of A to ascii hex |
|||
; |
|||
HEXCONV: |
|||
AND $0F ; low nibble only |
|||
ADD A,$90 |
|||
DAA |
|||
ADC A,$40 |
|||
DAA |
|||
RET |
|||
|
|||
; |
|||
; Print value of A or HL in decimal with leading zero suppression |
|||
; Use prtdecb for A or prtdecw for HL |
|||
; |
|||
PRTDECB: |
|||
PUSH HL |
|||
LD H,0 |
|||
LD L,A |
|||
CALL PRTDECW ; print it |
|||
POP HL |
|||
RET |
|||
; |
|||
PRTDECW: |
|||
PUSH AF |
|||
PUSH BC |
|||
PUSH DE |
|||
PUSH HL |
|||
CALL PRTDEC0 |
|||
POP HL |
|||
POP DE |
|||
POP BC |
|||
POP AF |
|||
RET |
|||
; |
|||
PRTDEC0: |
|||
LD E,'0' |
|||
LD BC,-10000 |
|||
CALL PRTDEC1 |
|||
LD BC,-1000 |
|||
CALL PRTDEC1 |
|||
LD BC,-100 |
|||
CALL PRTDEC1 |
|||
LD C,-10 |
|||
CALL PRTDEC1 |
|||
LD E,0 |
|||
LD C,-1 |
|||
PRTDEC1: |
|||
LD A,'0' - 1 |
|||
PRTDEC2: |
|||
INC A |
|||
ADD HL,BC |
|||
JR C,PRTDEC2 |
|||
SBC HL,BC |
|||
CP E |
|||
RET Z |
|||
LD E,0 |
|||
CALL PRTCHR |
|||
RET |
|||
; |
|||
; Start a new line |
|||
; |
|||
CRLF2: |
|||
CALL CRLF ; two of them |
|||
CRLF: |
|||
PUSH AF ; preserve AF |
|||
LD A,13 ; <CR> |
|||
CALL PRTCHR ; print it |
|||
LD A,10 ; <LF> |
|||
CALL PRTCHR ; print it |
|||
POP AF ; restore AF |
|||
RET |
|||
@ -0,0 +1,460 @@ |
|||
; |
|||
;======================================================================= |
|||
; RomWBW HBIOS Sound Device Test Tool (SOUND) |
|||
;======================================================================= |
|||
; |
|||
; Simple utility that can exercise a sound device in RomWBW. It can |
|||
; play a single tone, sliding scale, or sliding volume. |
|||
; |
|||
; I'm not actually sure who wrote the original version of this, but I |
|||
; suspect it was Phil Summers. |
|||
; |
|||
; WBW 2024-03-21: Control test function by command line |
|||
; Add (T)one function |
|||
; |
|||
;======================================================================= |
|||
; |
|||
;------------------------------------------------------------------------------ |
|||
; 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 |
|||
; |
|||
LD DE,TXT_BANNER |
|||
CALL PRTSTR |
|||
; |
|||
;------------------------------------------------------------------------------ |
|||
; PARSE COMMAND LINE |
|||
;------------------------------------------------------------------------------ |
|||
; |
|||
LD HL,FCB+1 ; POINT TO FCB CHARS |
|||
LD B,8 ; PARSE 8 CHARS |
|||
PARSE: |
|||
PUSH BC |
|||
LD A,(HL) ; GET NEXT CHAR |
|||
; |
|||
; IF NUMBER, SET DEVICE ID |
|||
CP '0' |
|||
JR C,PARSE1 ; IF < 0, SKIP |
|||
CP '9'+ 1 |
|||
JR NC,PARSE1 ; IF > 9, SKIP |
|||
SUB '0' ; MAKE BINARY |
|||
LD (DEVICE),A ; SAVE DEVIE NUM |
|||
JR PARSE2 ; CONTINUE LOOP |
|||
PARSE1: |
|||
; IF LETTER, SET RUN OPTION |
|||
CP 'A' |
|||
JR C,PARSE2 ; IF < A, SKIP |
|||
CP 'Z'+ 1 |
|||
JR NC,PARSE1 ; IF > Z, SKIP |
|||
LD (OPTION),A ; SAVE RUN OPTION |
|||
JR PARSE2 ; CONTINUE LOOP |
|||
; |
|||
PARSE2: |
|||
INC HL ; BUMP PTR |
|||
DJNZ PARSE |
|||
; |
|||
LD A,(OPTION) ; GET OPTION |
|||
CP ' ' ; HAVE OPTION? |
|||
JR NZ,RUN ; IF SO, RUN |
|||
LD DE,TXT_USAGE ; ELSE GET USAGE |
|||
CALL PRTSTR ; AND DISPLAY IT |
|||
JP EXIT ; AND GET OUT |
|||
; |
|||
;------------------------------------------------------------------------------ |
|||
; DISPLAY DEVICE AND NUMBER OF CHANNELS |
|||
;------------------------------------------------------------------------------ |
|||
; |
|||
RUN: |
|||
LD DE,TXT_DEV ; DEVICE: |
|||
CALL PRTSTR |
|||
LD A,(DEVICE) |
|||
CALL PRTDECB |
|||
LD C,A ; GET DEVICE ID |
|||
LD A,':' |
|||
CALL PRTCHR |
|||
; |
|||
LD B,$55 ; HBIOS SND QUERY |
|||
LD A,(DEVICE) |
|||
LD C,A |
|||
; |
|||
PUSH BC ; SAVE FUNC AND ID |
|||
LD E,4 ; HBIOS SNDQ DEV |
|||
RST 08 |
|||
LD A,B |
|||
;RRCA \ RRCA \ RRCA \ RRCA |
|||
LD DE,TXT_NAME |
|||
CALL PRTIDXDEA ; SHOW NAME |
|||
; |
|||
LD DE,TXT_CH |
|||
CALL PRTSTR |
|||
POP BC ; RESTORE FUNC AND ID |
|||
LD E,1 ; HBIOS SNDQ_CHCNT |
|||
RST 08 |
|||
LD A,B ; NUMBER OF CHANNELS IS IN B |
|||
LD (CHANNELS),A ; SAVE IT |
|||
CALL PRTDECB ; PRINT IT |
|||
CALL CRLF |
|||
; |
|||
;------------------------------------------------------------------------------ |
|||
; LOOP THROUGH EACH CHANNEL |
|||
;------------------------------------------------------------------------------ |
|||
; |
|||
LD A,(DEVICE) ; GET DEVICE |
|||
LD C,A ; INTO C |
|||
PUSH BC ; SAVE IT |
|||
LD B,$50 ; RESET SND DEVICE |
|||
RST 08 ; DO IT |
|||
POP BC ; RECOVER DEVICE |
|||
LD B,$51 ; SET VOLUME |
|||
LD L,$FF ; TO MAX |
|||
RST 08 ; DO IT |
|||
; |
|||
LD A,(CHANNELS) |
|||
LD B,A ; B IS LOOP COUNTER |
|||
LD C,0 ; C IS CHANNEL INDEX |
|||
; |
|||
CH_LOOP: |
|||
PUSH BC ; SAVE LOOP CTL |
|||
LD A,C ; CHANNEL |
|||
LD (CHANNEL),A ; TO STORAGE |
|||
CALL CH_RUN ; DO CHANNEL |
|||
PUSH AF |
|||
LD A,(DEVICE) |
|||
LD C,A |
|||
LD B,50H ; RESET |
|||
RST 08 |
|||
POP AF |
|||
POP BC ; RECOVER LOOP CTL |
|||
JR NZ,EXIT ; HANDLE ERROR/ABORT |
|||
INC C ; NEXT CHANNEL |
|||
DJNZ CH_LOOP ; LOOP AS NEEDED |
|||
; |
|||
LD A,(DEVICE) ; GET DEVICE |
|||
LD C,A ; TO C |
|||
LD B,50H ; RESET DEVICE |
|||
RST 08 ; DO IT |
|||
JR EXIT ; DONE |
|||
; |
|||
CH_RUN: |
|||
LD A,(OPTION) ; RUN OPTION |
|||
CP 'S' ; SCALES? |
|||
JP Z,TST_SCALES ; IF SO, DO SCALES |
|||
CP 'V' ; VOLUME? |
|||
JP Z,TST_VOLUME ; IF SO, DO VOLUME |
|||
CP 'T' ; TONE |
|||
JP Z,TST_TONE ; IF SO, DO TONE |
|||
RET |
|||
; |
|||
;------------------------------------------------------------------------------ |
|||
; 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: LD A,(DEVICE) ; SETUP DEVICE FOR BELOW |
|||
LD C,A |
|||
; |
|||
LD HL,380 ; START NOTE |
|||
LD (NOTE),HL ; Top of Octave 7 is 343 |
|||
|
|||
LD B,51H ; VOLUME HIGH |
|||
LD L,0FFH ; MAX |
|||
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: |
|||
PUSH BC |
|||
LD C, 6 ; CHECK FOR KEYPRESS |
|||
LD E,0FFH |
|||
CALL BDOS |
|||
POP BC |
|||
OR A ; SET RESULT |
|||
RET NZ ; RETURN IF ABORT |
|||
|
|||
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 |
|||
; |
|||
XOR A ; SET RESULT |
|||
RET |
|||
; |
|||
FAILMSG: PUSH BC |
|||
CALL PRTSTR |
|||
CALL CRLF |
|||
POP BC |
|||
RET |
|||
; |
|||
;------------------------------------------------------------------------------ |
|||
; CONSTANT TONE ON ALL CHANNELS, SCALE VOLUME |
|||
;------------------------------------------------------------------------------ |
|||
; |
|||
TST_VOLUME: |
|||
; LD HL,332+48 ; TONE |
|||
LD HL,244 ; ~1000 HZ |
|||
LD (NOTE),HL |
|||
; |
|||
LD DE,TXT_TSTCH ; DISPLAY CHANNEL |
|||
CALL PRTSTR |
|||
LD A,(CHANNEL) |
|||
CALL PRTDECB |
|||
|
|||
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 |
|||
|
|||
PUSH BC |
|||
LD C, 6 ; KEYPRESS |
|||
LD E, 0FFH |
|||
CALL BDOS |
|||
POP BC ; RECOVER LOOP CTRL |
|||
OR A ; KEY PRESSED? |
|||
RET NZ ; BAIL OUT IF SO |
|||
; |
|||
LD A,(VOLUME) |
|||
DEC A |
|||
LD (VOLUME),A |
|||
JR NZ,NEXT1 |
|||
; |
|||
CALL CRLF |
|||
; |
|||
RET |
|||
; |
|||
;------------------------------------------------------------------------------ |
|||
; 1 KHZ TONE ON CHANNEL, PLAY TILL KEYPRESS |
|||
;------------------------------------------------------------------------------ |
|||
; |
|||
TST_TONE: |
|||
LD HL,244 ; ~1000 HZ |
|||
LD (NOTE),HL |
|||
; |
|||
LD DE,TXT_TSTCH ; DISPLAY CHANNEL |
|||
CALL PRTSTR |
|||
LD A,(CHANNEL) |
|||
CALL PRTDECB |
|||
; |
|||
LD A,(DEVICE) |
|||
LD C,A |
|||
; |
|||
LD B,50H ; RESET |
|||
PUSH BC |
|||
RST 08 |
|||
POP BC |
|||
; |
|||
LD B,51H ; VOLUME |
|||
LD A,$FF ; MAX |
|||
LD L,A |
|||
PUSH BC |
|||
RST 08 |
|||
POP BC |
|||
; |
|||
LD B,53H ; NOTE |
|||
LD HL,(NOTE) |
|||
PUSH BC |
|||
RST 08 |
|||
POP BC |
|||
; |
|||
TST_TONE1: |
|||
; |
|||
LD B,54H ; PLAY |
|||
LD A,(CHANNEL) |
|||
LD D,A |
|||
PUSH BC |
|||
RST 08 |
|||
POP BC |
|||
; |
|||
;CALL DELAY |
|||
; |
|||
PUSH BC |
|||
LD C, 6 ; KEYPRESS |
|||
LD E, 0FFH |
|||
CALL BDOS |
|||
OR A ; KEY PRESSED? |
|||
POP BC |
|||
JR Z,TST_TONE1 |
|||
CALL CRLF |
|||
XOR A |
|||
RET ; RETURN ON KEYPRESS |
|||
; |
|||
;------------------------------------------------------------------------------ |
|||
; LONG DELAY |
|||
;------------------------------------------------------------------------------ |
|||
; |
|||
;DELAY: LD HL,-1 |
|||
DELAY: LD HL,1000 |
|||
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_BANNER .DB 13,10,"RomWBW HBIOS Sound Tool v1.0, 21-Mar-2024",13,10,13,10,0 |
|||
TXT_USAGE .DB "Usage:",13,10 |
|||
.DB "SOUND <d><o>",13,10 |
|||
.DB "",13,10 |
|||
.DB " <d> is number of sound device",13,10 |
|||
.DB " <o> is option to run:",13,10 |
|||
.DB " 'T': play a 1 KHz tone on each channel until keypress",13,10 |
|||
.DB " 'S': play a scale of notes on each channel",13,10 |
|||
.DB " 'V': play a 1 KHz tone at all volumes on each channel",13,10 |
|||
.DB "",13,10 |
|||
.DB "Examples:",13,10 |
|||
.DB "SOUND 1T - play a tone on all channels of sound device unit #1",13,10 |
|||
.DB "SOUND 0S - play a scale on all channels of sound device unit #0",13,10,0 |
|||
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_VOL .DB " VOLUME: ",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 |
|||
OPTION .DB ' ' ; run scales |
|||
NOTE .DW 128 |
|||
VOLUME .DB 0 |
|||
CHANNEL .DB 0 |
|||
CHANNELS .DB 0 |
|||
OLDSTACK .DW 0 ; original stack pointer |
|||
.DS 40H ; space for stack |
|||
STACK ; top of stack |
|||
; |
|||
.END |
|||
Loading…
Reference in new issue