diff --git a/Source/Apps/Test/Build.cmd b/Source/Apps/Test/Build.cmd index f757cf32..e56d13b3 100644 --- a/Source/Apps/Test/Build.cmd +++ b/Source/Apps/Test/Build.cmd @@ -24,6 +24,7 @@ pushd 2piotst && call Build || exit /b & popd pushd piomon && call Build || exit /b & popd pushd banktest && call Build || exit /b & popd pushd portscan && call Build || exit /b & popd +pushd sound && call Build || exit /b & popd goto :eof diff --git a/Source/Apps/Test/Clean.cmd b/Source/Apps/Test/Clean.cmd index 1e62b7d8..4e81e284 100644 --- a/Source/Apps/Test/Clean.cmd +++ b/Source/Apps/Test/Clean.cmd @@ -21,3 +21,4 @@ pushd 2piotst && call Clean || exit /b 1 & popd pushd piomon && call Clean || exit /b 1 & popd pushd banktest && call Clean || exit /b 1 & popd pushd portscan && call Clean || exit /b 1 & popd +pushd sound && call Clean || exit /b 1 & popd diff --git a/Source/Apps/Test/Makefile b/Source/Apps/Test/Makefile index ef0d67c2..7d70c01b 100644 --- a/Source/Apps/Test/Makefile +++ b/Source/Apps/Test/Makefile @@ -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 diff --git a/Source/Apps/Test/sound/Build.cmd b/Source/Apps/Test/sound/Build.cmd new file mode 100644 index 00000000..05f1ef0b --- /dev/null +++ b/Source/Apps/Test/sound/Build.cmd @@ -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 diff --git a/Source/Apps/Test/sound/Clean.cmd b/Source/Apps/Test/sound/Clean.cmd new file mode 100644 index 00000000..9ecb428f --- /dev/null +++ b/Source/Apps/Test/sound/Clean.cmd @@ -0,0 +1,6 @@ +@echo off +setlocal + +if exist *.com del *.com +if exist *.lst del *.lst +if exist *.bin del *.bin diff --git a/Source/Apps/Test/sound/Makefile b/Source/Apps/Test/sound/Makefile new file mode 100644 index 00000000..39f6746f --- /dev/null +++ b/Source/Apps/Test/sound/Makefile @@ -0,0 +1,7 @@ +OBJECTS = ay-test.com sound.com +DEST = ../../../../Binary/Apps/Test +TOOLS =../../../../Tools + +USETASM=1 + +include $(TOOLS)/Makefile.inc \ No newline at end of file diff --git a/Source/Apps/Test/sound/Scales.asm b/Source/Apps/Test/sound/Scales.asm deleted file mode 100644 index 46bbb19f..00000000 --- a/Source/Apps/Test/sound/Scales.asm +++ /dev/null @@ -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 diff --git a/Source/Apps/Test/sound/printing.inc b/Source/Apps/Test/sound/printing.inc new file mode 100644 index 00000000..be1ade84 --- /dev/null +++ b/Source/Apps/Test/sound/printing.inc @@ -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 ; + CALL PRTCHR ; print it + LD A,10 ; + CALL PRTCHR ; print it + POP AF ; restore AF + RET diff --git a/Source/Apps/Test/sound/sound.asm b/Source/Apps/Test/sound/sound.asm new file mode 100644 index 00000000..9fe28098 --- /dev/null +++ b/Source/Apps/Test/sound/sound.asm @@ -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 ",13,10 + .DB "",13,10 + .DB " is number of sound device",13,10 + .DB " 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 diff --git a/Source/HBIOS/cfg_duo.asm b/Source/HBIOS/cfg_duo.asm index 363968bc..2019aa05 100644 --- a/Source/HBIOS/cfg_duo.asm +++ b/Source/HBIOS/cfg_duo.asm @@ -305,10 +305,10 @@ PIOSBASE .EQU $60 ; PIO: PIO REGISTERS BASE ADR FOR SBC PPI UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) UFBASE .EQU $0C ; UF: REGISTERS BASE ADR ; -SN76489ENABLE .EQU FALSE ; SN: ENABLE SN76489 SOUND DRIVER +SN76489ENABLE .EQU TRUE ; SN: ENABLE SN76489 SOUND DRIVER AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER SN7CLK .EQU 3579545 ; SN: PSG CLOCK FREQ, ASSUME MSX STD -SNMODE .EQU SNMODE_NONE ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM] +SNMODE .EQU SNMODE_DUO ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM|DUO] ; AY38910ENABLE .EQU TRUE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD diff --git a/Source/HBIOS/sn76489.asm b/Source/HBIOS/sn76489.asm index ec132742..cdd701e2 100644 --- a/Source/HBIOS/sn76489.asm +++ b/Source/HBIOS/sn76489.asm @@ -30,6 +30,12 @@ SN76489_PORT_LEFT .EQU $FF ; PORTS FOR ACCESSING THE SN76489 CHIP (LEFT) SN76489_PORT_RIGHT .EQU $FB ; PORTS FOR ACCESSING THE SN76489 CHIP (RIGHT) .ECHO "RC" #ENDIF +; +#IF (SNMODE == SNMODE_DUO) +SN76489_PORT_LEFT .EQU $BE ; PORTS FOR ACCESSING THE SN76489 CHIP (LEFT) +SN76489_PORT_RIGHT .EQU $BF ; PORTS FOR ACCESSING THE SN76489 CHIP (RIGHT) + .ECHO "RC" +#ENDIF ; .ECHO ", IO_LEFT=" .ECHO SN76489_PORT_LEFT diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index 2219e62e..de3ac009 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -221,6 +221,7 @@ AYMODE_DUO .EQU 8 ; MBC SOUND BOARD SNMODE_NONE .EQU 0 SNMODE_RC .EQU 1 ; RCBUS SOUND MODULE SNMODE_VGM .EQU 2 ; VGM ECB BOARD +SNMODE_DUO .EQU 3 ; DUODYNE MEDIA-IO BOARD ; ; TMS VIDEO MODE SELECTIONS ; diff --git a/Source/ver.inc b/Source/ver.inc index 81ab2902..8234ae11 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,7 +2,7 @@ #DEFINE RMN 5 #DEFINE RUP 0 #DEFINE RTP 0 -#DEFINE BIOSVER "3.5.0-dev.18" +#DEFINE BIOSVER "3.5.0-dev.19" #define rmj RMJ #define rmn RMN #define rup RUP diff --git a/Source/ver.lib b/Source/ver.lib index b5f82610..782345d4 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 5 rup equ 0 rtp equ 0 biosver macro - db "3.5.0-dev.18" + db "3.5.0-dev.19" endm