|
|
@ -4,26 +4,32 @@ |
|
|
; |
|
|
; |
|
|
;====================================================================== |
|
|
;====================================================================== |
|
|
; |
|
|
; |
|
|
|
|
|
AY_RCSND .EQU 0 ; 0 = EB MODULE, 1=MF MODULE |
|
|
|
|
|
; |
|
|
#IF (AYMODE == AYMODE_SCG) |
|
|
#IF (AYMODE == AYMODE_SCG) |
|
|
AY_RSEL .EQU $9A |
|
|
AY_RSEL .EQU $9A |
|
|
AY_RDAT .EQU $9B |
|
|
AY_RDAT .EQU $9B |
|
|
|
|
|
AY_RIN .EQU AY_RSEL |
|
|
AY_ACR .EQU $9C |
|
|
AY_ACR .EQU $9C |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
#IF (AYMODE == AYMODE_N8) |
|
|
#IF (AYMODE == AYMODE_N8) |
|
|
AY_RSEL .EQU $9C |
|
|
AY_RSEL .EQU $9C |
|
|
AY_RDAT .EQU $9D |
|
|
AY_RDAT .EQU $9D |
|
|
|
|
|
AY_RIN .EQU AY_RSEL |
|
|
AY_ACR .EQU N8_DEFACR |
|
|
AY_ACR .EQU N8_DEFACR |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
#IF (AYMODE == AYMODE_RCZ80) |
|
|
|
|
|
|
|
|
#IF (AYMODE == AYMODE_RCZ80) |
|
|
AY_RSEL .EQU $D8 |
|
|
AY_RSEL .EQU $D8 |
|
|
AY_RDAT .EQU $D0 |
|
|
AY_RDAT .EQU $D0 |
|
|
|
|
|
AY_RIN .EQU AY_RSEL+AY_RCSND |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
#IF (AYMODE == AYMODE_RCZ180) |
|
|
#IF (AYMODE == AYMODE_RCZ180) |
|
|
AY_RSEL .EQU $68 |
|
|
AY_RSEL .EQU $68 |
|
|
AY_RDAT .EQU $60 |
|
|
AY_RDAT .EQU $60 |
|
|
|
|
|
AY_RIN .EQU AY_RSEL+AY_RCSND |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
;====================================================================== |
|
|
;====================================================================== |
|
|
@ -58,14 +64,16 @@ AY_IDAT .EQU 0 ; NO INSTANCE DATA ASSOCIATED WITH THIS DEVICE |
|
|
; |
|
|
; |
|
|
; DEVICE CAPABILITIES AND CONFIGURATION |
|
|
; DEVICE CAPABILITIES AND CONFIGURATION |
|
|
; |
|
|
; |
|
|
SBCV2004 .EQU 0 ; USE SBC-V2-004 HALF CLOCK DIVIDER |
|
|
|
|
|
|
|
|
SBCV2004 .EQU 0 ; USE SBC-V2-004 HALF CLOCK DIVIDER |
|
|
; |
|
|
; |
|
|
AY_TONECNT .EQU 3 ; COUNT NUMBER OF TONE CHANNELS |
|
|
AY_TONECNT .EQU 3 ; COUNT NUMBER OF TONE CHANNELS |
|
|
AY_NOISECNT .EQU 1 ; COUNT NUMBER OF NOISE CHANNELS |
|
|
AY_NOISECNT .EQU 1 ; COUNT NUMBER OF NOISE CHANNELS |
|
|
; |
|
|
; |
|
|
AY_PHICLK .EQU 3579500 |
|
|
|
|
|
AY_CLKDIV .EQU 2 |
|
|
|
|
|
AY_CLK .EQU AY_PHICLK / AY_CLKDIV |
|
|
|
|
|
|
|
|
;AY_PHICLK .EQU 3579500 ; MSX NTSC COLOUR BURST FREQ = 315/88 |
|
|
|
|
|
;AY_PHICLK .EQU 3500000 ; ZX SPECTRUM 3.5MHZ |
|
|
|
|
|
;AY_PHICLK .EQU 4000000 ; RETROBREW SCB-SCG |
|
|
|
|
|
;AY_CLKDIV .EQU 2 |
|
|
|
|
|
;AY_CLK .EQU AY_PHICLK / AY_CLKDIV |
|
|
; |
|
|
; |
|
|
#INCLUDE "audio.inc" |
|
|
#INCLUDE "audio.inc" |
|
|
; |
|
|
; |
|
|
@ -85,12 +93,24 @@ AY38910_INIT: |
|
|
CALL PRTHEXBYTE |
|
|
CALL PRTHEXBYTE |
|
|
; |
|
|
; |
|
|
#IF ((AYMODE == AYMODE_SCG) | (AYMODE == AYMODE_N8)) |
|
|
#IF ((AYMODE == AYMODE_SCG) | (AYMODE == AYMODE_N8)) |
|
|
; ACTIVATE DEVICE |
|
|
|
|
|
LD A,$FF ; BIT 4 IS AY RESET CONTROL, BIT 3 IS ACTIVE LED |
|
|
|
|
|
|
|
|
LD A,$FF ; ACTIVATE DEVICEBIT 4 IS AY RESET CONTROL, BIT 3 IS ACTIVE LED |
|
|
OUT (AY_ACR),A ; SET INIT AUX CONTROL REG |
|
|
OUT (AY_ACR),A ; SET INIT AUX CONTROL REG |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
LD IY, AY_IDAT ; SETUP FUNCTION TABLE |
|
|
|
|
|
|
|
|
LD D,AY_R2CHBP ; SIMPLE HARDWARE PROBE |
|
|
|
|
|
LD E,$55 |
|
|
|
|
|
CALL AY_WRTPSG ; WRITE AND |
|
|
|
|
|
CALL AY_RDPSG ; READ TO A |
|
|
|
|
|
LD A,$55 ; SOUND CHANNEL |
|
|
|
|
|
CP E ; REGISTER |
|
|
|
|
|
JR Z,AY_FND |
|
|
|
|
|
; |
|
|
|
|
|
CALL PRTSTRD \ .TEXT " NOT PRESENT$" |
|
|
|
|
|
; |
|
|
|
|
|
LD A,$FF ; UNSUCCESSFULL INIT |
|
|
|
|
|
RET |
|
|
|
|
|
; |
|
|
|
|
|
AY_FND: LD IY, AY_IDAT ; SETUP FUNCTION TABLE |
|
|
LD BC, AY_FNTBL ; POINTER TO INSTANCE DATA |
|
|
LD BC, AY_FNTBL ; POINTER TO INSTANCE DATA |
|
|
LD DE, AY_IDAT ; BC := FUNCTION TABLE ADDRESS |
|
|
LD DE, AY_IDAT ; BC := FUNCTION TABLE ADDRESS |
|
|
CALL SND_ADDENT ; DE := INSTANCE DATA PTR |
|
|
CALL SND_ADDENT ; DE := INSTANCE DATA PTR |
|
|
@ -100,9 +120,9 @@ AY38910_INIT: |
|
|
LD E,$07 ; SET VOLUME TO 50% |
|
|
LD E,$07 ; SET VOLUME TO 50% |
|
|
CALL AY_SETV ; ON ALL CHANNELS |
|
|
CALL AY_SETV ; ON ALL CHANNELS |
|
|
; |
|
|
; |
|
|
LD D,AY_R2CHBP ; BEEP ON CHANNEL B (CENTER) |
|
|
|
|
|
LD E,$55 |
|
|
|
|
|
CALL AY_WRTPSG ; R02 = $55 = 01010101 |
|
|
|
|
|
|
|
|
; LD D,AY_R2CHBP ; BEEP ON CHANNEL B (CENTER) |
|
|
|
|
|
; LD E,$55 |
|
|
|
|
|
; CALL AY_WRTPSG ; R02 = $55 = 01010101 |
|
|
LD D,AY_R3CHBP |
|
|
LD D,AY_R3CHBP |
|
|
LD E,$00 |
|
|
LD E,$00 |
|
|
CALL AY_WRTPSG ; R03 = $00 = XXXX0000 |
|
|
CALL AY_WRTPSG ; R03 = $00 = XXXX0000 |
|
|
@ -112,7 +132,8 @@ AY38910_INIT: |
|
|
LD E,$00 ; SET VOLUME OFF |
|
|
LD E,$00 ; SET VOLUME OFF |
|
|
CALL AY_SETV ; ON ALL CHANNELS |
|
|
CALL AY_SETV ; ON ALL CHANNELS |
|
|
; |
|
|
; |
|
|
; RET |
|
|
|
|
|
|
|
|
XOR A ; SUCCESSFULL INIT |
|
|
|
|
|
RET |
|
|
; |
|
|
; |
|
|
;====================================================================== |
|
|
;====================================================================== |
|
|
; INITIALIZE DEVICE |
|
|
; INITIALIZE DEVICE |
|
|
@ -221,8 +242,6 @@ AY_NOTE: |
|
|
JR NC, AY_NOTE1 ; INCOMING HL DOES NOT MAP INTO AY3NOTETBL |
|
|
JR NC, AY_NOTE1 ; INCOMING HL DOES NOT MAP INTO AY3NOTETBL |
|
|
; |
|
|
; |
|
|
ADD HL, DE ; RESTORE HL |
|
|
ADD HL, DE ; RESTORE HL |
|
|
; EX DE,HL |
|
|
|
|
|
; LD HL, AY3NOTETBL ; HL = AY3NOTETBL + HL |
|
|
|
|
|
LD DE, AY3NOTETBL ; HL = AY3NOTETBL + HL |
|
|
LD DE, AY3NOTETBL ; HL = AY3NOTETBL + HL |
|
|
ADD HL, DE |
|
|
ADD HL, DE |
|
|
; |
|
|
; |
|
|
@ -390,6 +409,38 @@ AY_WRTPSG: |
|
|
POP AF ; GET SAVED DCNTL VALUE |
|
|
POP AF ; GET SAVED DCNTL VALUE |
|
|
OUT0 (Z180_DCNTL),A ; AND RESTORE IT |
|
|
OUT0 (Z180_DCNTL),A ; AND RESTORE IT |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
|
|
|
#IF (SBCV2004) |
|
|
|
|
|
LD A,0 ; SBC-V2-004 CHANGE TO |
|
|
|
|
|
OUT (112),A ; NORMAL CLOCK SPEED |
|
|
|
|
|
#ENDIF |
|
|
|
|
|
HB_EI |
|
|
|
|
|
RET |
|
|
|
|
|
|
|
|
|
|
|
; |
|
|
|
|
|
;====================================================================== |
|
|
|
|
|
; |
|
|
|
|
|
; READ FROM REGISTER D AND RETURN WITH RESULT IN E |
|
|
|
|
|
; |
|
|
|
|
|
AY_RDPSG: |
|
|
|
|
|
HB_DI |
|
|
|
|
|
#IF (SBCV2004) |
|
|
|
|
|
LD A,8 ; SBC-V2-004 CHANGE |
|
|
|
|
|
OUT (112),A ; TO HALF CLOCK SPEED |
|
|
|
|
|
#ENDIF |
|
|
|
|
|
#IF (CPUFAM == CPU_Z180) |
|
|
|
|
|
IN0 A,(Z180_DCNTL) ; GET WAIT STATES |
|
|
|
|
|
PUSH AF ; SAVE VALUE |
|
|
|
|
|
OR %00110000 ; FORCE SLOW OPERATION (I/O W/S=3) |
|
|
|
|
|
OUT0 (Z180_DCNTL),A ; AND UPDATE DCNTL |
|
|
|
|
|
#ENDIF |
|
|
|
|
|
LD A,D ; SELECT THE REGISTER WE |
|
|
|
|
|
OUT (AY_RSEL),A ; WANT TO READ |
|
|
|
|
|
IN A,(AY_RIN) ; READ SELECTED REGISTER |
|
|
|
|
|
LD E,A |
|
|
|
|
|
#IF (CPUFAM == CPU_Z180) |
|
|
|
|
|
POP AF ; GET SAVED DCNTL VALUE |
|
|
|
|
|
OUT0 (Z180_DCNTL),A ; AND RESTORE IT |
|
|
|
|
|
#ENDIF |
|
|
#IF (SBCV2004) |
|
|
#IF (SBCV2004) |
|
|
LD A,0 ; SBC-V2-004 CHANGE TO |
|
|
LD A,0 ; SBC-V2-004 CHANGE TO |
|
|
OUT (112),A ; NORMAL CLOCK SPEED |
|
|
OUT (112),A ; NORMAL CLOCK SPEED |
|
|
@ -416,7 +467,7 @@ AYT_REGWR .DB "\r\nOUT AY-3-8910 $" |
|
|
; FREQUENCY TONE TABLE (SEMITONE CURRENTLY) |
|
|
; FREQUENCY TONE TABLE (SEMITONE CURRENTLY) |
|
|
;====================================================================== |
|
|
;====================================================================== |
|
|
; |
|
|
; |
|
|
; PERIOD OCTAVE NOTE MIDI# |
|
|
|
|
|
|
|
|
; MSX TABLE PERIOD OCTAVE NOTE MIDI# |
|
|
; |
|
|
; |
|
|
AY3NOTETBL: |
|
|
AY3NOTETBL: |
|
|
; .DW 6842 ;0 12 |
|
|
; .DW 6842 ;0 12 |
|
|
|