Browse Source

AY38910: Fix issue with interrupt handling during boot beep

patch
Dean Netherton 6 years ago
parent
commit
9aaa929800
  1. 54
      Source/HBIOS/ay38910.asm

54
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$"

Loading…
Cancel
Save