diff --git a/Doc/RomWBW Applications.pdf b/Doc/RomWBW Applications.pdf index c02a88ac..fba769fc 100644 Binary files a/Doc/RomWBW Applications.pdf and b/Doc/RomWBW Applications.pdf differ diff --git a/Doc/RomWBW Disk Catalog.pdf b/Doc/RomWBW Disk Catalog.pdf index cd13ed0e..97d6338a 100644 Binary files a/Doc/RomWBW Disk Catalog.pdf and b/Doc/RomWBW Disk Catalog.pdf differ diff --git a/Doc/RomWBW Errata.pdf b/Doc/RomWBW Errata.pdf index bfc3136e..bf2b0307 100644 Binary files a/Doc/RomWBW Errata.pdf and b/Doc/RomWBW Errata.pdf differ diff --git a/Doc/RomWBW System Guide.pdf b/Doc/RomWBW System Guide.pdf index 1b596c04..bf34e024 100644 Binary files a/Doc/RomWBW System Guide.pdf and b/Doc/RomWBW System Guide.pdf differ diff --git a/Doc/RomWBW User Guide.pdf b/Doc/RomWBW User Guide.pdf index 844b2457..60673932 100644 Binary files a/Doc/RomWBW User Guide.pdf and b/Doc/RomWBW User Guide.pdf differ diff --git a/ReadMe.md b/ReadMe.md index 6e51ba26..aac1b197 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -3,7 +3,7 @@ **RomWBW ReadMe** \ Version 3.5 \ Wayne Warthen ([wwarthen@gmail.com](mailto:wwarthen@gmail.com)) \ -08 Jul 2024 +15 Jul 2024 # Overview diff --git a/ReadMe.txt b/ReadMe.txt index 73b12b3c..e30291e8 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -1,6 +1,6 @@ RomWBW ReadMe Wayne Warthen (wwarthen@gmail.com) -08 Jul 2024 +15 Jul 2024 diff --git a/Source/Doc/SystemGuide.md b/Source/Doc/SystemGuide.md index 0976fe0a..a1a68c0d 100644 --- a/Source/Doc/SystemGuide.md +++ b/Source/Doc/SystemGuide.md @@ -2015,7 +2015,7 @@ sound will play for the duration defined in HL and then return. | **Entry Parameters** | **Returned Values** | |----------------------------------------|----------------------------------------| | B: 0x57 | A: Status | -| C: Disk Unit | C: Device Attributes | +| C: Sound Unit | C: Device Attributes | | | D: Device Type | | | E: Device Number | | | H: Device Unit Mode | @@ -2038,6 +2038,17 @@ is servicing the specified unit. Both of these values are considered driver specific. Refer to the associated hardware driver for the values used. +### Function 0x58 -- Sound Beep (SNDBEEP) + +| **Entry Parameters** | **Returned Values** | +|----------------------------------------|----------------------------------------| +| B: 0x58 | A: Status | +| C: Sound Unit | | + +Play a beep tone on the specified Sound Unit (C). The beep will +normally be about 1/3 second in duration and the tone will be +approximately B5. + `\clearpage`{=latex} ## System (SYS) diff --git a/Source/HBIOS/ay38910.asm b/Source/HBIOS/ay38910.asm index ecd23da2..c357b0d9 100644 --- a/Source/HBIOS/ay38910.asm +++ b/Source/HBIOS/ay38910.asm @@ -127,6 +127,7 @@ AY_FNTBL: .DW AY_QUERY .DW AY_DURATION .DW AY_DEVICE + .DW AY_BEEP ; #IF (($ - AY_FNTBL) != (SND_FNCNT * 2)) .ECHO "*** INVALID SND FUNCTION TABLE ***\n" @@ -156,7 +157,6 @@ AY_NOISECNT .EQU 1 ; COUNT NUMBER OF NOISE CHANNELS ; ; ANNOUNCE DEVICE ON CONSOLE. ACTIVATE DEVICE IF REQUIRED. ; SETUP FUNCTION TABLES. SETUP THE DEVICE. -; ANNOUNCE DEVICE WITH BEEP. SET VOLUME OFF. ; RETURN INITIALIZATION STATUS ; AY38910_INIT: @@ -221,77 +221,22 @@ AY38910_INIT: LD A,$FF ; UNSUCCESSFULL INIT RET ; -AY_FND: LD IY, AY_IDAT ; SETUP FUNCTION TABLE +AY_FND: + LD IY, AY_IDAT ; SETUP FUNCTION TABLE LD BC, AY_FNTBL ; POINTER TO INSTANCE DATA LD DE, AY_IDAT ; BC := FUNCTION TABLE ADDRESS CALL SND_ADDENT ; DE := INSTANCE DATA PTR ; - CALL AY_INIT ; SET DEFAULT CHIP CONFIGURATION -; - LD E,$08 ; SET VOLUME TO 50% - CALL AY_SETV ; ON ALL CHANNELS -; -; LD DE,(AY_R2CHBP*256)+$55 ; BEEP ON CHANNEL B (CENTER) -; CALL AY_WRTPSG ; R02 = $55 = 01010101 - LD DE,(AY_R3CHBP*256)+$00 - CALL AY_WRTPSG ; R03 = $00 = XXXX0000 -; -#IF (SYSTIM != TM_NONE) - LD A, TICKFREQ / 3 ; SCHEDULE IN 1/3 SECOND TO TURN OFF SOUND - LD (AY_TIMTIK), A -; - ; RESET THE AY_TIMER BYPASS - LD HL,AY_TIMER1 - LD (AY_TIMER + 1),HL -; - ; HOOK THE TICK VECTOR - LD HL,(VEC_TICK + 1) ; GET CUR TICKS VECTOR - LD (AY_TIMHOOK + 1),HL ; SAVE IT INTERNALLY - LD HL,AY_TIMER ; INSTALL TIMER HOOK HANDLER - LD (VEC_TICK + 1),HL -; - LD A, $02 ; NOT READY & IN INTERUPT HANDLER - LD (AY_READY), A -#ELSE - CALL LDELAY ; HALF SECOND DELAY - LD E,$00 ; SET VOLUME OFF - CALL AY_SETV ; ON ALL CHANNELS - LD A, $01 ; READY & NOT IN INTERUPT HANDLER - LD (AY_READY), A -#ENDIF -; + CALL AY_RESET ; SET DEFAULT CHIP CONFIGURATION XOR A ; SUCCESSFULL INIT RET ; -#IF (SYSTIM != TM_NONE) -AY_TIMER: - JP AY_TIMER1 ; SELF MODIFIED TO BYPASS HANDLER -AY_TIMER1: - LD A,(AY_TIMTIK) - DEC A - LD (AY_TIMTIK), A - JR NZ,AY_TIMHOOK -; - LD E,$00 ; SET VOLUME OFF - CALL AY_SETV ; ON ALL CHANNELS - LD A, $01 ; READY & NOT IN INTERUPT HANDLER - LD (AY_READY), A -; - ; MAKE AY_TIMER A NO-OP HANDLER - LD HL,(AY_TIMHOOK + 1) - LD (AY_TIMER + 1),HL -; -AY_TIMHOOK: - JP 0 ; OVERWRITTEN WITH NEXT HANDLER -; -AY_TIMTIK .DB 0 ; COUNT DOWN TO FINISH BOOT BEEP -#ENDIF -; ;====================================================================== ; INITIALIZE DEVICE ;====================================================================== ; AY_INIT: + ; HANDLE R7 SPECIAL #IF (AYMODE == AYMODE_NABU) ; I/O B=INPUT, I/O A=OUTPUT, NOISE CHANNEL C, B, A DISABLE, TONE CHANNEL C, B, A ENABLE LD DE,(AY_R7ENAB*256)+$78 ; SET MIXER CONTROL / IO ENABLE. $78 - 01 111 000 @@ -299,29 +244,21 @@ AY_INIT: ; I/O PORTS = OUTPUT, NOISE CHANNEL C, B, A DISABLE, TONE CHANNEL C, B, A ENABLE LD DE,(AY_R7ENAB*256)+$F8 ; SET MIXER CONTROL / IO ENABLE. $F8 - 11 111 000 #ENDIF - JP AY_WRTPSG -; -AY_CHKREDY: - LD A, (AY_READY) - BIT 0, A - RET NZ - - POP HL ; REMOVE LAST RETURN ADDRESS - OR $FF - RET ; RETURN NZ -; -;====================================================================== -; SET VOLUME ALL CHANNELS -;====================================================================== -; -AY_SETV: - PUSH BC - LD B,AY_TONECNT ; NUMBER OF CHANNELS - LD D,AY_R8AVOL ; BASE REGISTER FOR VOLUME -AY_SV: CALL AY_WRTPSG ; CYCLING THROUGH ALL CHANNELS - INC D - DJNZ AY_SV - POP BC + CALL AY_WRTPSG ; SETUP R7 +; + ; THEN JUST SET ALL OTHER REGISTERS TO ZERO + LD E,0 ; VALUE ZERO + LD D,0 ; START W/ R0 + LD B,7 ; DO 7 REGISTERS (R0-R6) + CALL AY_INIT1 ; DO IT + INC D ; SKIP R7 + LD B,6 ; DO 6 MORE REGISTERS (R8-R13) + ; FALL THRU TO DO IT +; +AY_INIT1: + CALL AY_WRTPSG ; WRITE REGISTER + INC D ; BUMP TO NEXT + DJNZ AY_INIT1 ; LOOP RET ; ;====================================================================== @@ -333,25 +270,15 @@ AY_SV: CALL AY_WRTPSG ; CYCLING THROUGH ALL CHANNELS ; AY_RESET: AUDTRACE(AYT_INIT) - CALL AY_CHKREDY ; RETURNS TO OUR CALLER IF NOT READY -; - PUSH DE - PUSH HL CALL AY_INIT ; SET DEFAULT CHIP CONFIGURATION ; - AUDTRACE(AYT_VOLOFF) - LD E,0 ; SET VOLUME OFF - CALL AY_SETV ; ON ALL CHANNELS -; + ; RESET DEFAULTS IN CASE OF AN IN-PLACE HBIOS RESTART + LD HL,0 + LD (AY_PENDING_PERIOD),HL ; SET TONE PERIOD TO ZERO + LD (AY_PENDING_DURATION),HL; SET DURATION TO ZERO XOR A ; SIGNAL SUCCESS LD (AY_PENDING_VOLUME),A ; SET VOLUME TO ZERO - LD H,A - LD L,A - LD (AY_PENDING_PERIOD),HL ; SET TONE PERIOD TO ZERO -; - POP HL - POP DE - RET + RET ; DONE, A=0 ABOVE ; ;====================================================================== ; SOUND DRIVER FUNCTION - VOLUME @@ -414,12 +341,14 @@ AY_PLAY: AUDTRACE(AYT_PLAY) AUDTRACE_D AUDTRACE_CR - CALL AY_CHKREDY ; RETURNS TO OUR CALLER IF NOT READY ; LD A, (AY_PENDING_PERIOD + 1) ; CHECK THE HIGH BYTE OF THE PERIOD INC A - JR Z, AY_PLAY1 ; PERIOD IS TOO LARGE, UNABLE TO PLAY + JR NZ, AY_PLAY1 ; PERIOD IS OK, CONTINUE + OR $FF ; ELSE TOO LARGE, SIGNAL FAILURE + RET ; AND RETURN ; +AY_PLAY1: PUSH HL PUSH DE LD A,D ; LIMIT CHANNEL 0-2 @@ -432,7 +361,7 @@ AY_PLAY: AUDTRACE_CR ; LD HL,AY_PENDING_PERIOD ; WRITE THE LOWER - ld E,(HL) ; 8-BITS OF THE TONE PERIOD + LD E,(HL) ; 8-BITS OF THE TONE PERIOD CALL AY_WRTPSG INC D ; NEXT REGISTER INC HL ; NEXT BYTE @@ -467,18 +396,6 @@ AY_PLAY: XOR A ; SIGNAL SUCCESS RET ; -AY_PLAY1: - PUSH DE ; TURN VOLUME OFF TO STOP PLAYING - LD A,D ; LIMIT CHANNEL 0-2 - AND $3 ; AND INDEX TO THE - ADD A,AY_R8AVOL ; CHANNEL VOLUME - LD D,A ; REGISTER - LD E,0 - CALL AY_WRTPSG ; SET VOL (E) IN CHANNEL REG (D) - POP DE - OR $FF ; SIGNAL FAILURE - RET -; ;====================================================================== ; SOUND DRIVER FUNCTION - QUERY AND SUBFUNCTIONS ;====================================================================== @@ -546,22 +463,11 @@ AY_DEVICE: RET ; ;====================================================================== -; NON-BLOCKING INTERRUPT CODE +; SOUND DRIVER FUNCTION - BEEP ;====================================================================== ; -AY_DI: - LD A, (AY_READY) - BIT 1, A - RET NZ - HB_DI - RET -; -AY_EI: - LD A, (AY_READY) - BIT 1, A - RET NZ - HB_EI - RET +AY_BEEP: + JP SND_BEEP ; DEFER TO GENERIC CODE IN HBIOS ; ;====================================================================== ; @@ -571,7 +477,6 @@ AY_EI: ;====================================================================== ; AY_WRTPSG: - CALL AY_DI #IFDEF SBCV2004 LD A,(HB_RTCVAL) ; GET CURRENT RTC LATCH VALUE OR %00001000 ; SBC-V2-004 CHANGE @@ -595,14 +500,13 @@ AY_WRTPSG: LD A,(HB_RTCVAL) ; SBC-V2-004 CHANGE TO OUT (RTCIO),A ; NORMAL CLOCK SPEED #ENDIF - JP AY_EI + RET ; ;====================================================================== ; ; READ FROM REGISTER D AND RETURN WITH RESULT IN E ; AY_RDPSG: - CALL AY_DI #IFDEF SBCV2004 LD A,(HB_RTCVAL) ; GET CURRENT RTC LATCH VALUE OR %00001000 ; SBC-V2-004 CHANGE @@ -626,15 +530,13 @@ AY_RDPSG: LD A,(HB_RTCVAL) ; SBC-V2-004 CHANGE TO OUT (RTCIO),A ; NORMAL CLOCK SPEED #ENDIF - JP AY_EI + RET ; ;====================================================================== ; AY_PENDING_PERIOD .DW 0 ; PENDING PERIOD (12 BITS) ; ORDER AY_PENDING_VOLUME .DB 0 ; PENDING VOL (8 BITS) ; SIGNIFICANT AY_PENDING_DURATION .DW 0 ; PENDING DURATION (16 BITS) -AY_READY .DB 0 ; BIT 0 -> NZ DRIVER IS READY TO RECEIVE PLAY COMMAND - ; BIT 1 -> NZ EXECUTING WITHIN TIMER HANDLER = DO NOT DIS/ENABLE INT ; #IF AUDIOTRACE AYT_INIT .DB "\r\nAY_INIT\r\n$" diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index e87743c6..b839f340 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -3492,11 +3492,12 @@ DBG_NOTE: ; #ENDIF ; -; DIAGNOSTIC ROUTINE TO PLAY A BEEP -; -#IFDEF TESTING - CALL SND_BEEP -#ENDIF + ; MAKE A LITTLE NOISE... + LD B,BF_SNDBEEP ; HBIOS BEEP FUNCTION + LD C,0 ; SOUND UNIT 0 + LD A,(SND_CNT) ; GET SOUND UNIT COUNT + OR A ; CHECK FOR ZERO + CALL NZ,HB_DISPATCH ; DO IT IF WE HAVE A SOUND UNIT ; ;-------------------------------------------------------------------------------------------------- ; TRANSITION TO USER LAND @@ -3841,7 +3842,7 @@ HB_DISPATCH1: JP C,DSKY_DISPATCH CP BF_VDA + $10 ; $40-$4F: VIDEO DISPLAY ADAPTER JP C,VDA_DISPATCH - CP BF_SND + $08 ; $50-$58: SOUND DRIVERS + CP BF_SND + $10 ; $50-$5F: SOUND DRIVERS JP C,SND_DISPATCH CP BF_SYS ; SKIP TO BF_SYS VALUE AT $F0 JR C,HB_DISPERR ; ERROR IF LESS THAN BF_SYS @@ -4439,7 +4440,7 @@ SND_ADDENT: ; WORD DRIVER FUNCTION TABLE ADDRESS ; WORD UNIT SPECIFIC DATA (TYPICALLY A DEVICE INSTANCE DATA ADDRESS) ; -SND_FNCNT .EQU 8 ; NUMBER OF SND FUNCS (FOR RANGE CHECK) +SND_FNCNT .EQU 9 ; NUMBER OF SND FUNCS (FOR RANGE CHECK) SND_MAX .EQU 5 ; UP TO 5 UNITS SND_SIZ .EQU SND_MAX * 4 ; EACH ENTRY IS 4 BYTES ; @@ -4452,47 +4453,48 @@ SND_TBL .FILL SND_SIZ,0 ; SPACE FOR ENTRIES ; SPEAKER BEEP ROUTINE ;-------------------------------------------------------------------------------------------------- ; -;;; RELOCATE -; -; ROUTINE TO BEEP THE DEFAULT SOUND UNIT -; NEED TO CHECK FOR EXISTENCE OF SOUND UNIT +; ROUTINE TO BEEP A SOUND UNIT +; THE SOUND DRIVERS CAN DEFER THEIR BEEP FUNCTION TO THIS FUNCTION +; ON ENTRY, B = SOUND UNIT ; WHICH CHANNEL SHOULD BE USED? IS THERE A GOOD DEFAULT CHANNEL? ; SND_BEEP: - ; CHECK FOR AT LEAST 1 SOUND DEVICE - LD A,(SND_CNT) ; GET SOUND UNIT COUNT - OR A ; CHECK FOR ZERO - RET Z ; BAIL OUT IF NO SOUND UNITS - - ; PLAY A BEEP ON SOUND DEVICE UNIT 0 + ; RESET THE SOUND DEVICE TO START LD B,$50 ; SOUND RESET FUNCTION - LD C,0 ; SOUND UNIT NUMBER - CALL SND_DISPATCH ; DO IT + CALL SND_BEEP_DISP ; DO IT +; + ; SET VOLUME TO MAX LD B,$51 ; VOLUME - LD C,0 ; SOUND UNIT NUMBER LD L,$FF ; MAX - CALL SND_DISPATCH ; DO IT + CALL SND_BEEP_DISP ; DO IT +; + ; SET NOTE TO PLAY LD B,$53 ; SELECT NOTE - LD C,0 ; SOUND UNIT NUMBER - ;LD HL,0 ; A0# LD HL,244 ; B5 (CLOSE TO 1 KHZ) - CALL SND_DISPATCH ; DO IT - ;LD B,$56 ; DURATION - ;LD C,0 ; SOUND UNIT NUMBER - ;LD HL,500 ; 1/2 SECOND - ;CALL SND_DISPATCH ; DO IT + CALL SND_BEEP_DISP ; DO IT +; + ; START PLAYING THE SOUND LD B,$54 ; PLAY SOUND - LD C,0 ; SOUND UNIT NUMBER LD D,0 ; CHANNEL 0 - CALL SND_DISPATCH ; DO IT - LD DE,15625 ; PLAY FOR 1/4 SECOND + CALL SND_BEEP_DISP ; DO IT +; + ; WAIT A BIT FOR SOUND TO PLAY + LD DE,23436 ; PLAY FOR 1/3 SECOND CALL VDELAY ; WAIT WHILE TONE IS PLAYED - ;CALL LDELAY ; LET SOUND PLAY 1/2 SECOND +; LD B,$50 ; SOUND RESET FUNCTION - LD C,0 ; SOUND UNIT NUMBER - CALL SND_DISPATCH ; DO IT + CALL SND_BEEP_DISP ; DO IT +; + XOR A ; SIGNAL SUCCESS RET ; DONE ; +SND_BEEP_DISP: + ; CALL SOUND DISPATCHER PRESERVING BC ACROSS CALL + PUSH BC + CALL SND_DISPATCH + POP BC + RET +; ;-------------------------------------------------------------------------------------------------- ; SYSTEM FUNCTION DISPATCHER ;-------------------------------------------------------------------------------------------------- diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index 5c9634c8..a6006a20 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -74,6 +74,7 @@ BF_SNDPLAY .EQU BF_SND + 4 ; INITIATE THE REQUESTED SOUND COMMAND BF_SNDQUERY .EQU BF_SND + 5 ; E IS SUBFUNCTION BF_SNDDURATION .EQU BF_SND + 6 ; REQUEST DURATION HL MILLISECONDS BF_SNDDEVICE .EQU BF_SND + 7 ; SOUND DEVICE INFO REQUEST +BF_SNDBEEP .EQU BF_SND + 8 ; PLAY A BEEP SOUND ON DEVICE ; ; BF_SNDQUERY SUBCOMMANDS BF_SNDQ_STATUS .EQU 0 diff --git a/Source/HBIOS/sn76489.asm b/Source/HBIOS/sn76489.asm index 6f31de33..2b5c2f6d 100644 --- a/Source/HBIOS/sn76489.asm +++ b/Source/HBIOS/sn76489.asm @@ -49,10 +49,6 @@ SN7_IDAT .EQU 0 SN7_TONECNT .EQU 3 ; COUNT NUMBER OF TONE CHANNELS SN7_NOISECNT .EQU 1 ; COUNT NUMBER OF NOISE CHANNELS SN7_CHCNT .EQU SN7_TONECNT + SN7_NOISECNT -CHANNEL_0_SILENT .EQU $9F -CHANNEL_1_SILENT .EQU $BF -CHANNEL_2_SILENT .EQU $DF -CHANNEL_3_SILENT .EQU $FF ; #INCLUDE "audio.inc" ; @@ -78,52 +74,67 @@ SN76489_INIT: LD A, SN76489_PORT_RIGHT CALL PRTHEXBYTE - CALL SN7_VOLUME_OFF + CALL SN7_RESET XOR A ; SIGNAL SUCCESS RET - +; ;====================================================================== -; SN76489 DRIVER - SOUND ADAPTER (SND) FUNCTIONS +; INITIALIZE DEVICE ;====================================================================== ; -SN7_RESET: - AUDTRACE(SNT_INIT) - CALL SN7_VOLUME_OFF - XOR A ; SIGNAL SUCCESS - RET - -SN7_VOLUME_OFF: - AUDTRACE(SNT_VOLOFF) - - +SN7_INIT: +; #IFDEF SBCV2004 LD A,(HB_RTCVAL) OR %00001000 ; SBC-V2-004+ CHANGE OUT (RTCIO),A ; TO HALF CLOCK SPEED #ENDIF - - LD A, CHANNEL_0_SILENT - OUT (SN76489_PORT_LEFT), A - OUT (SN76489_PORT_RIGHT), A - - LD A, CHANNEL_1_SILENT - OUT (SN76489_PORT_LEFT), A - OUT (SN76489_PORT_RIGHT), A - - LD A, CHANNEL_2_SILENT - OUT (SN76489_PORT_LEFT), A - OUT (SN76489_PORT_RIGHT), A - - LD A, CHANNEL_3_SILENT - OUT (SN76489_PORT_LEFT), A - OUT (SN76489_PORT_RIGHT), A - +; + LD HL,SN7_REG_INIT ; POINT TO REG INIT TBL + LD B,SN7_REG_CNT ; BYTES IN TABLE +SN7_INIT1 + LD A,(HL) + INC HL ; BUMP FOR NEXT TIME + OUT (SN76489_PORT_LEFT), A ; WRITE LEFT PORT + OUT (SN76489_PORT_RIGHT), A ; WRITE RIGHT PORT + DJNZ SN7_INIT1 ; LOOP TILL DONE +; #IFDEF SBCV2004 LD A,(HB_RTCVAL) AND %11110111 ; SBC-V2-004+ CHANGE TO OUT (RTCIO),A ; NORMAL CLOCK SPEED #ENDIF - +; + RET +; +SN7_REG_INIT: + .DB $80,$00 ; TONE 1 FREQ (2 BYTES) + .DB $9F ; TONE 1 ATTENTUATION + .DB $A0,$00 ; TONE 2 FREQ (2 BYTES) + .DB $BF ; TONE 2 ATTENTUATION + .DB $C0,$00 ; TONE 3 FREQ (2 BYTES) + .DB $DF ; TONE 3 ATTENTUATION + .DB $E0 ; NOISE CONTROL + .DB $FF ; NOISE ATTENTUATION +SN7_REG_CNT .EQU $ - SN7_REG_INIT +; +;====================================================================== +; SN76489 DRIVER - SOUND ADAPTER (SND) FUNCTIONS +;====================================================================== +; +SN7_RESET: + AUDTRACE(SNT_INIT) +; + CALL SN7_INIT ; HARDWARE INIT +; + ; RESET DEFAULTS IN CASE OF AN IN-PLACE HBIOS RESTART + LD HL,0 + LD (SP_PENDING_PERIOD),HL + LD (SP_PENDING_DURATION),HL + XOR A + LD (SP_PENDING_VOLUME),A +; + XOR A RET ; BIT MAPPING @@ -391,6 +402,9 @@ SN7_DEVICE: XOR A RET +SN7_BEEP: + JP SND_BEEP ; DEFER TO GENERIC CODE IN HBIOS + SN7_FNTBL: .DW SN7_RESET .DW SN7_VOLUME @@ -400,18 +414,16 @@ SN7_FNTBL: .DW SN7_QUERY .DW SN7_DURATION .DW SN7_DEVICE + .DW SN7_BEEP ; #IF (($ - SN7_FNTBL) != (SND_FNCNT * 2)) .ECHO "*** INVALID SND FUNCTION TABLE ***\n" !!!!! #ENDIF -SN7_PENDING_PERIOD - .DW 0 ; PENDING PERIOD (10 BITS) -SN7_PENDING_VOLUME - .DB 0 ; PENDING VOL (8 BITS -> DOWNCONVERTED TO 4 BITS AND INVERTED) -SN7_PENDING_DURATION - .DW 0 ; PENDING DURATION (16 BITS) +SN7_PENDING_PERIOD .DW 0 ; PENDING PERIOD (10 BITS) +SN7_PENDING_VOLUME .DB 0 ; PENDING VOL (8 BITS -> DOWNCONVERTED TO 4 BITS AND INVERTED) +SN7_PENDING_DURATION .DW 0 ; PENDING DURATION (16 BITS) STR_MESSAGELT .DB "\r\nSN76489: LEFT IO=0x$" STR_MESSAGERT .DB ", RIGHT IO=0x$" diff --git a/Source/HBIOS/spk.asm b/Source/HBIOS/spk.asm index 23ab2079..3ceb148c 100644 --- a/Source/HBIOS/spk.asm +++ b/Source/HBIOS/spk.asm @@ -13,14 +13,15 @@ ; DRIVER FUNCTION TABLE AND INSTANCE DATA ; SP_FNTBL: - .DW SP_STUB ; SP_RESET - .DW SP_STUB ; SP_VOLUME + .DW SP_RESET + .DW SP_VOLUME .DW SP_PERIOD .DW SP_NOTE .DW SP_PLAY .DW SP_QUERY .DW SP_DURATION .DW SP_DEVICE + .DW SP_BEEP ; #IF (($ - SP_FNTBL) != (SND_FNCNT * 2)) .ECHO "*** INVALID SND FUNCTION TABLE ***\n" @@ -37,8 +38,8 @@ SP_RTCIOMSK .EQU 00000100B ; FOR OTHER DRIVERS, THE PERIOD VALUE FOR THE TONE IS STORED AT PENDING_PERIOD ; FOR THE SPK DRIVER THE ADDRESS IN THE TONE TABLE IS STORED IN PENDING_PERIOD ; -SP_PENDING_PERIOD .DW SP_NOTE_C8 ; PENDING PERIOD (16 BITS) -SP_PENDING_VOLUME .DB $FF ; PENDING VOL (8 BITS) +SP_PENDING_PERIOD .DW 0 ; PENDING PERIOD (16 BITS) +SP_PENDING_VOLUME .DB 0 ; PENDING VOL (8 BITS) SP_PENDING_DURATION .DW 0 ; PENDING DURATION (16 BITS) SP_TBLRDY .DB 0 ; IF != 0, NOTE TABLE IS READY ; @@ -60,17 +61,9 @@ SP_INIT: PRTS("SPK: IO=0x$") LD A,RTCIO CALL PRTHEXBYTE -; - ; RESET DEFAULTS IN CASE OF AN IN-PLACE HBIOS RESTART - LD HL,SP_NOTE_C8 - LD (SP_PENDING_PERIOD),HL - LD A,$FF - LD (SP_PENDING_VOLUME),A - XOR A - LD (SP_PENDING_DURATION),A -; +; CALL SP_SETTBL ; SETUP TONE TABLE - CALL SP_PLAY ; PLAY DEFAULT NOTE + CALL SP_RESET ; RESET PARAMETERS ; XOR A RET @@ -79,17 +72,24 @@ SP_INIT: ; SOUND DRIVER FUNCTION - RESET ;====================================================================== ; -;SP_RESET: -; XOR A ; SUCCESSFULL RESET -; RET +SP_RESET: + ; RESET DEFAULTS IN CASE OF AN IN-PLACE HBIOS RESTART + LD HL,0 + LD (SP_PENDING_PERIOD),HL ; SET TONE PERIOD TO ZERO + LD (SP_PENDING_DURATION),HL; SET DURATION TO ZERO + XOR A ; SIGNAL SUCCESS + LD (SP_PENDING_VOLUME),A ; SET VOLUME TO ZERO +; + XOR A ; SUCCESSFULL RESET + RET ; ;====================================================================== ; SOUND DRIVER FUNCTION - VOLUME ;====================================================================== ; -;SP_VOLUME: -; XOR A ; SIGNAL SUCCESS -; RET +SP_VOLUME: + XOR A ; SIGNAL SUCCESS + RET ; ;====================================================================== ; SOUND DRIVER FUNCTION - PERIOD @@ -97,7 +97,6 @@ SP_INIT: ; SP_PERIOD: LD (SP_PENDING_PERIOD), HL ; SAVE AND RETURN SUCCESSFUL -SP_STUB: XOR A RET ; @@ -362,16 +361,40 @@ SP_DEVICE: RET ; ;====================================================================== +; SOUND DRIVER FUNCTION - BEEP +;====================================================================== +; +SP_BEEP: + LD HL,SP_NOTE_B5 ; B5 (CLOSE TO 1 KHZ) + LD (SP_PENDING_PERIOD),HL + ;LD A,$FF + ;LD (SP_PENDING_VOLUME),A + ;XOR A + ;LD (SP_PENDING_DURATION),A +; + CALL SP_PLAY ; PLAY DEFAULT NOTE + CALL SP_RESET ; RESET DRIVER +; + XOR A + RET +; +;====================================================================== ; ; STANDARD ONE SECOND TONE TABLES AT 1MHZ. ; FOR SP_BEEPER ROUTINE, FIRST WORD LOADED INTO DE, SECOND INTO HL +; THE PARAMETER TO SP_TONESET IS (FREQ * 100) +; DE: FREQUENCY IN HZ +; HL: T-STATES PER HALF-CYCL E / 4 AT 1 MHZ CPU SPEED +; EX. MIDDLE C IS 261.63 HZ, 523.26 HALF CYCLES PER SECOND +; 1,000,000 / 523.26 / 4 = 477 +; OR ALTERNATIVELY 12,500,000 / 26163 = 477 ; ;====================================================================== ; #DEFINE SP_TONESET(SP_FREQ) .DW SP_FREQ/100, 12500000/SP_FREQ ; SP_TUNTBL: - SP_TONESET(1635) ; C0 + SP_TONESET(1635) ; C0 ; DE=16, HL=7645 SP_TONESET(1732) ; C SP_TONESET(1835) ; D0 SP_TONESET(1945) ; D @@ -419,7 +442,7 @@ SP_TUNTBL: SP_TONESET(22000) ; A3 SP_TONESET(23308) ; A SP_TONESET(24694) ; B3 - SP_TONESET(26163) ; C4 + SP_TONESET(26163) ; C4 ; DE=261, HL=477 SP_TONESET(27718) ; C SP_TONESET(29366) ; D4 SP_TONESET(31113) ; D @@ -442,6 +465,7 @@ SP_TUNTBL: SP_TONESET(83061) ; G SP_TONESET(88000) ; A5 SP_TONESET(93233) ; A +SP_NOTE_B5: SP_TONESET(98777) ; B5 SP_TONESET(104650) ; C6 SP_TONESET(110873) ; C @@ -467,7 +491,6 @@ SP_TUNTBL: SP_TONESET(352000) ; A7 SP_TONESET(372931) ; A SP_TONESET(395107) ; B7 -SP_NOTE_C8: SP_TONESET(418601) ; C8 SP_TONESET(443492) ; C SP_TONESET(469863) ; D8 @@ -479,7 +502,7 @@ SP_NOTE_C8: SP_TONESET(664488) ; G SP_TONESET(704000) ; A8 SP_TONESET(745862) ; A - SP_TONESET(790213) ; B8 + SP_TONESET(790213) ; B8 ; DE=7902, HL=15 ; SP_NOTCNT .EQU ($-SP_TUNTBL) / 4 ; diff --git a/Source/HBIOS/ym2612.asm b/Source/HBIOS/ym2612.asm index a4818364..018729d6 100644 --- a/Source/HBIOS/ym2612.asm +++ b/Source/HBIOS/ym2612.asm @@ -55,6 +55,7 @@ YM_FNTBL: .DW YM_RESET .DW YM_QUERY .DW YM_DURATION .DW YM_DEVICE + .DW YM_BEEP ; #IF (($ - YM_FNTBL) != (SND_FNCNT * 2)) .ECHO "*** INVALID SND FUNCTION TABLE ***\n" @@ -197,6 +198,13 @@ YM_DEVICE: LD D,SNDDEV_YM2612 ; D := DEVICE TYPE RET ; ;------------------------------------------------------------------------------ +; Sound driver function - BEEP +;------------------------------------------------------------------------------ +; +YM_BEEP: + JP SND_BEEP ; DEFER TO GENERIC CODE IN HBIOS +; +;------------------------------------------------------------------------------ ; Sound driver function - RESET ; Initialize device. Set volume off. Reset volume and tone variables. ;------------------------------------------------------------------------------ diff --git a/Source/ver.inc b/Source/ver.inc index 1581133f..5679fdb6 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.55" +#DEFINE BIOSVER "3.5.0-dev.56" #define rmj RMJ #define rmn RMN #define rup RUP diff --git a/Source/ver.lib b/Source/ver.lib index 7e98e689..ee4ff2c3 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.55" + db "3.5.0-dev.56" endm