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