diff --git a/Source/Apps/Tune/Tune.asm b/Source/Apps/Tune/Tune.asm index fc41b087..085bf662 100644 --- a/Source/Apps/Tune/Tune.asm +++ b/Source/Apps/Tune/Tune.asm @@ -2006,84 +2006,69 @@ PLAYVIAHBIOS: ; ; CHANNEL 0 (LEFT) ; - LD B, BF_SNDVOL ; SET VOLUME - LD C, 0 ; DEVICE 0 -; LD H, 0 - LD A, (AYREGS + AmplA) ; GET 4-BIT - AND $0F ; VOLUME 0-15 - RLCA ; AND CONVERT - RLCA ; TO HBIOS - RLCA ; RANGE 0-255 - RLCA - LD L, A + LD BC, (BF_SNDVOL*256)+0 ; SET VOLUME + LD A, (AYREGS + AmplA) ; DEVICE 0 + ADD A,A ; GET 4-BIT + ADD A,A ; VOLUME 0-15 + ADD A,A ; AND CONVERT + ADD A,A ; TO HBIOS + LD L, A ; RANGE 0-255 RST 08 ; - LD B, BF_SNDPRD ; SET PERIOD - LD C, 0 ; DEVICE 0 - LD HL, (AYREGS+TonA) ; GET 12-BIT TONE PERIOD - ld A, H ; MASK OFF HIGH - AND $0F ; NIBBLE - LD H, A + LD BC, (BF_SNDPRD*256)+0 ; SET PERIOD + LD HL, (AYREGS+TonA) ; DEVICE 0 + ld A, H ; GET 12-BIT ONE PERIOD + AND $0F ; MASK OFF HIGH + LD H, A ; NIBBLE RST 08 ; - LD B, BF_SNDPLAY ; PLAY - LD C, 0 ; DEVICE 0 - LD D, 0 ; CHANNEL 0 - RST 08 + LD BC, (BF_SNDPLAY*256)+0 ; PLAY + LD D, 0 ; DEVICE 0 + RST 08 ; CHANNEL 0 ; ; CHANNEL 1 (MIDDLE) ; - LD B, BF_SNDVOL ; SET VOLUME - LD C, 0 ; DEVICE 0 -; LD H, 0 - LD A, (AYREGS + AmplB) ; GET 4-BIT - AND $0F ; VOLUME 0-15 - RLCA ; AND CONVERT - RLCA ; TO HBIOS - RLCA ; RANGE 0-255 - RLCA - LD L, A + LD BC, (BF_SNDVOL*256)+0 ; SET VOLUME + LD A, (AYREGS + AmplB) ; DEVICE 0 + ADD A,A ; GET 4-BIT + ADD A,A ; VOLUME 0-15 + ADD A,A ; AND CONVERT + ADD A,A ; TO HBIOS + LD L, A ; RANGE 0-255 RST 08 ; - LD B, BF_SNDPRD ; SET PERIOD - LD C, 0 ; DEVICE 0 - LD HL, (AYREGS+TonB) ; GET 12-BIT ONE PERIOD - ld a, h ; MASK OFF HIGH - AND $0F ; NIBBLE - LD H, A + LD BC, (BF_SNDPRD*256)+0 ; SET PERIOD + LD HL, (AYREGS+TonB) ; DEVICE 0 + ld A, H ; GET 12-BIT ONE PERIOD + AND $0F ; MASK OFF HIGH + LD H, A ; NIBBLE RST 08 ; - LD B, BF_SNDPLAY ; PLAY - LD C, 0 ; DEVICE 0 - LD D, 1 ; CHANNEL 1 - RST 08 + LD BC, (BF_SNDPLAY*256)+0 ; PLAY + LD D, 1 ; DEVICE 0 + RST 08 ; CHANNEL 0 ; ; CHANNEL 2 (RIGHT) ; - LD B, BF_SNDVOL ; SET VOLUME - LD C, 0 ; DEVICE 0 -; LD H, 0 - LD A, (AYREGS + AmplC) ; GET 4-BIT - AND $0F ; VOLUME 0-15 - RLCA ; AND CONVERT - RLCA ; TO HBIOS - RLCA ; RANGE 0-255 - RLCA - LD L, A + LD BC, (BF_SNDVOL*256)+0 ; SET VOLUME + LD A, (AYREGS + AmplC) ; DEVICE 0 + ADD A,A ; GET 4-BIT + ADD A,A ; VOLUME 0-15 + ADD A,A ; AND CONVERT + ADD A,A ; TO HBIOS + LD L, A ; RANGE 0-255 RST 08 ; - LD B, BF_SNDPRD ; SET PERIOD - LD C, 0 ; DEVICE 0 - LD HL, (AYREGS+TonC) ; GET 12-BIT ONE PERIOD - ld A, H ; MASK OFF HIGH - AND $0F ; NIBBLE - LD H, A + LD BC, (BF_SNDPRD*256)+0 ; SET PERIOD + LD HL, (AYREGS+TonC) ; DEVICE 0 + ld A, H ; GET 12-BIT ONE PERIOD + AND $0F ; MASK OFF HIGH + LD H, A ; NIBBLE RST 08 ; - LD B, BF_SNDPLAY ; PLAY - LD C, 0 ; DEVICE 0 - LD D, 2 ; CHANNEL 2 - RST 08 ; HBIOS CALL + LD BC, (BF_SNDPLAY*256)+0 ; PLAY + LD D, 2 ; DEVICE 0 + RST 08 ; CHANNEL 0 RET #ENDIF diff --git a/Source/HBIOS/ay38910.asm b/Source/HBIOS/ay38910.asm index 624bb82f..c4bb8d48 100644 --- a/Source/HBIOS/ay38910.asm +++ b/Source/HBIOS/ay38910.asm @@ -4,26 +4,32 @@ ; ;====================================================================== ; +AY_RCSND .EQU 0 ; 0 = EB MODULE, 1=MF MODULE +; #IF (AYMODE == AYMODE_SCG) AY_RSEL .EQU $9A AY_RDAT .EQU $9B +AY_RIN .EQU AY_RSEL AY_ACR .EQU $9C #ENDIF ; #IF (AYMODE == AYMODE_N8) AY_RSEL .EQU $9C AY_RDAT .EQU $9D +AY_RIN .EQU AY_RSEL AY_ACR .EQU N8_DEFACR #ENDIF ; -#IF (AYMODE == AYMODE_RCZ80) +#IF (AYMODE == AYMODE_RCZ80) AY_RSEL .EQU $D8 AY_RDAT .EQU $D0 +AY_RIN .EQU AY_RSEL+AY_RCSND #ENDIF ; #IF (AYMODE == AYMODE_RCZ180) AY_RSEL .EQU $68 AY_RDAT .EQU $60 +AY_RIN .EQU AY_RSEL+AY_RCSND #ENDIF ; ;====================================================================== @@ -58,14 +64,16 @@ AY_IDAT .EQU 0 ; NO INSTANCE DATA ASSOCIATED WITH THIS DEVICE ; ; 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_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" ; @@ -85,12 +93,24 @@ AY38910_INIT: CALL PRTHEXBYTE ; #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 #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 DE, AY_IDAT ; BC := FUNCTION TABLE ADDRESS CALL SND_ADDENT ; DE := INSTANCE DATA PTR @@ -100,9 +120,9 @@ AY38910_INIT: LD E,$07 ; SET VOLUME TO 50% 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 E,$00 CALL AY_WRTPSG ; R03 = $00 = XXXX0000 @@ -112,7 +132,8 @@ AY38910_INIT: LD E,$00 ; SET VOLUME OFF CALL AY_SETV ; ON ALL CHANNELS ; -; RET + XOR A ; SUCCESSFULL INIT + RET ; ;====================================================================== ; INITIALIZE DEVICE @@ -221,8 +242,6 @@ AY_NOTE: JR NC, AY_NOTE1 ; INCOMING HL DOES NOT MAP INTO AY3NOTETBL ; ADD HL, DE ; RESTORE HL -; EX DE,HL -; LD HL, AY3NOTETBL ; HL = AY3NOTETBL + HL LD DE, AY3NOTETBL ; HL = AY3NOTETBL + HL ADD HL, DE ; @@ -390,6 +409,38 @@ AY_WRTPSG: POP AF ; GET SAVED DCNTL VALUE OUT0 (Z180_DCNTL),A ; AND RESTORE IT #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) LD A,0 ; SBC-V2-004 CHANGE TO OUT (112),A ; NORMAL CLOCK SPEED @@ -416,7 +467,7 @@ AYT_REGWR .DB "\r\nOUT AY-3-8910 $" ; FREQUENCY TONE TABLE (SEMITONE CURRENTLY) ;====================================================================== ; -; PERIOD OCTAVE NOTE MIDI# +; MSX TABLE PERIOD OCTAVE NOTE MIDI# ; AY3NOTETBL: ; .DW 6842 ;0 12 diff --git a/Source/HBIOS/sn76489.asm b/Source/HBIOS/sn76489.asm index 0d7a2936..524b253d 100644 --- a/Source/HBIOS/sn76489.asm +++ b/Source/HBIOS/sn76489.asm @@ -119,6 +119,7 @@ SN7_NOTE: AUDTRACE_L AUDTRACE_CR + LD H,0 ADD HL, HL ; SHIFT RIGHT (MULT 2) -INDEX INTO SN7NOTETBL TABLE OF WORDS ; TEST IF HL IS LARGER THAN SN7NOTETBL SIZE OR A ; CLEAR CARRY FLAG @@ -127,9 +128,7 @@ SN7_NOTE: JR NC, SN7_NOTE1 ; INCOMING HL DOES NOT MAP INTO SN7NOTETBL ADD HL, DE ; RESTORE HL - LD E, L ; HL = SN7NOTETBL + HL - LD D, H - LD HL, SN7NOTETBL + LD DE, SN7NOTETBL ADD HL, DE LD A, (HL) ; RETRIEVE PERIOD COUNT FROM SN7NOTETBL