From 9aaa929800170af00bd305c2a433579604ade0b2 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Wed, 13 May 2020 12:50:33 +1000 Subject: [PATCH 1/2] AY38910: Fix issue with interrupt handling during boot beep --- Source/HBIOS/ay38910.asm | 54 ++++++++++++++++++++++++++++++++-------- 1 file changed, 44 insertions(+), 10 deletions(-) diff --git a/Source/HBIOS/ay38910.asm b/Source/HBIOS/ay38910.asm index 38744a31..284f7557 100644 --- a/Source/HBIOS/ay38910.asm +++ b/Source/HBIOS/ay38910.asm @@ -137,10 +137,15 @@ AY_FND: LD IY, AY_IDAT ; SETUP FUNCTION TABLE 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 + CALL AY_SETV ; ON ALL CHANNELS + LD A, $01 ; READY & NOT IN INTERUPT HANDLER + LD (AY_READY), A #ENDIF ; @@ -159,6 +164,8 @@ AY_TIMER: LD E,$00 ; SET VOLUME OFF CALL AY_SETV ; ON ALL CHANNELS + LD A, $01 ; READY & NOT IN INTERUPT HANDLER + LD (AY_READY), A AY_TIMER1: JP 0 ; OVERWRITTEN WITH NEXT HANDLER @@ -174,8 +181,16 @@ AY_TIMTIK .DB 0 ; COUNT DOWN TO FINISH BOOT BEEP ; AY_INIT: LD DE,(AY_R7ENAB*256)+$F8 ; SET MIXER CONTROL / IO ENABLE. $F8 - 11 111 000 - CALL AY_WRTPSG ; I/O PORTS = OUTPUT, NOISE CHANNEL C, B, A DISABLE, TONE CHANNEL C, B, A ENABLE - RET + JP AY_WRTPSG ; I/O PORTS = OUTPUT, NOISE CHANNEL C, B, A DISABLE, TONE CHANNEL C, B, A ENABLE + +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 @@ -200,7 +215,8 @@ 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 @@ -227,6 +243,7 @@ AY_VOLUME: AUDTRACE(AYT_VOL) AUDTRACE_L AUDTRACE_CR + LD A,L ; SAVE VOLUME LD (AY_PENDING_VOLUME), A ; @@ -283,6 +300,8 @@ 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 @@ -390,6 +409,21 @@ AY_QUERY_DEV: LD DE, (AY_RSEL*256)+AY_RDAT ; AND ADDRESS AND DATA PORT XOR A RET + +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 + ; ;====================================================================== ; @@ -399,7 +433,7 @@ AY_QUERY_DEV: ;====================================================================== ; AY_WRTPSG: - HB_DI + CALL AY_DI #IF (SBCV2004) LD A,8 ; SBC-V2-004 CHANGE OUT (112),A ; TO HALF CLOCK SPEED @@ -422,8 +456,7 @@ AY_WRTPSG: LD A,0 ; SBC-V2-004 CHANGE TO OUT (112),A ; NORMAL CLOCK SPEED #ENDIF - HB_EI - RET + JP AY_EI ; ;====================================================================== @@ -431,7 +464,7 @@ AY_WRTPSG: ; READ FROM REGISTER D AND RETURN WITH RESULT IN E ; AY_RDPSG: - HB_DI + CALL AY_DI #IF (SBCV2004) LD A,8 ; SBC-V2-004 CHANGE OUT (112),A ; TO HALF CLOCK SPEED @@ -454,13 +487,14 @@ AY_RDPSG: LD A,0 ; SBC-V2-004 CHANGE TO OUT (112),A ; NORMAL CLOCK SPEED #ENDIF - HB_EI - RET + JP AY_EI ; ;====================================================================== ; AY_PENDING_PERIOD .DW 0 ; PENDING PERIOD (12 BITS) ; ORDER AY_PENDING_VOLUME .DB 0 ; PENDING VOL (8 BITS) ; SIGNIFICANT +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$" From 6f00dd56c4fcf611f2dbd88df8dcf3b15a75e930 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Wed, 13 May 2020 13:10:01 +1000 Subject: [PATCH 2/2] AY38910: Fix issue with interrupt handling --- Source/HBIOS/ay38910.asm | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Source/HBIOS/ay38910.asm b/Source/HBIOS/ay38910.asm index 284f7557..0e3c7c5d 100644 --- a/Source/HBIOS/ay38910.asm +++ b/Source/HBIOS/ay38910.asm @@ -159,14 +159,16 @@ AY_TIMER: LD (AY_TIMTIK), A JR NZ, AY_TIMER1 - LD HL, (AY_TIMHOOK) ; REMOVE US FROM THE TIMER HOOKS LIST - LD (VEC_TICK + 1), HL - LD E,$00 ; SET VOLUME OFF CALL AY_SETV ; ON ALL CHANNELS LD A, $01 ; READY & NOT IN INTERUPT HANDLER LD (AY_READY), A + LD DE, AY_TIMER ; MAKE AY_TIMER A NO_OP HANDLER + LD HL, AY_TIMER1 + LD BC, 3 + LDIR + AY_TIMER1: JP 0 ; OVERWRITTEN WITH NEXT HANDLER AY_TIMHOOK: .EQU $ - 2