From 79ddc8d44de2840bdd6009eca79ee27cf679a0bf Mon Sep 17 00:00:00 2001 From: b1ackmai1er <39449559+b1ackmai1er@users.noreply.github.com> Date: Fri, 22 May 2020 15:55:15 +0800 Subject: [PATCH] Update ay38910.asm --- Source/HBIOS/ay38910.asm | 84 +++++++++++++++------------------------- 1 file changed, 32 insertions(+), 52 deletions(-) diff --git a/Source/HBIOS/ay38910.asm b/Source/HBIOS/ay38910.asm index 1cff70b3..81c41223 100644 --- a/Source/HBIOS/ay38910.asm +++ b/Source/HBIOS/ay38910.asm @@ -4,8 +4,10 @@ ; ;====================================================================== ; -#include "cfg_state.inc" -; + +;#include "cfg_state.inc" + + AY_RCSND .EQU 0 ; 0 = EB MODULE, 1=MF MODULE ; #IF (AYMODE == AYMODE_SCG) @@ -13,7 +15,6 @@ AY_RSEL .EQU $9A AY_RDAT .EQU $9B AY_RIN .EQU AY_RSEL AY_ACR .EQU $9C -AY_CLK .SET 3579545 ; MSX NTSC COLOUR BURST FREQ = 315/88 #ENDIF ; #IF (AYMODE == AYMODE_N8) @@ -72,13 +73,10 @@ 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 ; -#IF (AY_CLK > 3579545) ; DEPENDING ON THE -AY_SCALE .EQU 2 ; INPUT CLOCK FREQUENCY -#ELSE ; PRESCALE THE TONE PERIOD -AY_SCALE .EQU 3 ; DATA TO MAINTAIN MAXIMUM -#ENDIF ; RANGE AND ACCURACY -; -AY_RATIO .EQU (AY_CLK * 100) / (16 >> AY_SCALE) +AY_PHICLK .EQU 3579545 ; MSX NTSC COLOUR BURST FREQ = 315/88 +;AY_PHICLK .EQU 3500000 ; ZX SPECTRUM 3.5MHZ +;AY_PHICLK .EQU 4000000 ; RETROBREW SCB-SCG +AY_RATIO .EQU AY_CLK * 100 / 16 ; #INCLUDE "audio.inc" ; @@ -129,50 +127,55 @@ AY_FND: LD IY, AY_IDAT ; SETUP FUNCTION TABLE LD DE,(AY_R3CHBP*256)+$00 CALL AY_WRTPSG ; R03 = $00 = XXXX0000 ; -#IF SYSTIMEN + +#IF (SYSTIM != TM_NONE) LD A, TICKFREQ / 3 ; SCHEDULE IN 1/3 SECOND TO TURN OFF SOUND LD (AY_TIMTIK), A -; + LD HL, (VEC_TICK + 1) ; GET CUR TICKS VECTOR LD (AY_TIMHOOK), 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 ; XOR A ; SUCCESSFULL INIT RET -; -#IF SYSTIMEN + +#IF (SYSTIM != TM_NONE) + AY_TIMER: LD A, (AY_TIMTIK) DEC A LD (AY_TIMTIK), A JR NZ, AY_TIMER1 -; + 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 AY_TIMTIK .DB 0 ; COUNT DOWN TO FINISH BOOT BEEP + #ENDIF ; ;====================================================================== @@ -182,7 +185,7 @@ 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 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 @@ -216,7 +219,7 @@ 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 @@ -258,34 +261,10 @@ AY_NOTE: AUDTRACE(AYT_NOTE) AUDTRACE_HL AUDTRACE_CR -; -; CALL PRTHEXWORDHL -; CALL PC_COLON -; - LD DE, AY3NOTETBL ; ON ENTRY HL IS THE NOTE TO PLAY - PUSH DE ; AND DE IS THE START OF NOTE TABLE - LD DE, 48 ; LOAD DE WITH NOTE TABLE SIZE - CALL DIV16 ; AND CALCULATE OCTAVE COUNT IN BC -; - ADD HL, HL ; HL IS THE REMAINDER FROM ABOVE DIVISION (0-47) AND THE NOTE - POP DE ; TO PLAY IN THE OCTAVE. ADD IT TO THE START OF THE NOTE TABLE - ADD HL, DE ; TO POINT TO THE PERIOD FOR THE NOTE WE WANT TO PLAY. -; - LD A, (HL) ; HL POINT TO CURRENT PERIOD COUNT WE WANT TO PLAY - INC HL ; SO LOAD PERIOD COUNT FROM NOTE TABLE INTO HL - LD H, (HL) ; SO WE CAN UPDATE IT FOR THE REQUIRED OCTAVE - LD L, A -; - LD A,AY_SCALE ; THE NOTE TABLE PERIOD DATA HAS BEEN - ADD A,C ; PRESCALED TO MAINTAIN RANGE SO ALLOW - LD B,A ; FOR THIS WHEN CHANGING OCTAVE -AY_NOTE1: - SRL H ; ADJUST THE PERIOD DATA - RR L ; FOR THE DESIRED OCTAVE - DJNZ AY_NOTE1 ; FALL THROUGH TO SET PERIOD AND RANGE CHECK -; -; CALL PRTHEXWORDHL -; CALL NEWLINE + + LD DE, AY3NOTETBL + CALL AUD_NOTE ; RETURNS PERIOD IN HL, FALL THRU + ; TO SET THIS PERIOD ; ;====================================================================== ; SOUND DRIVER FUNCTION - PERIOD @@ -299,7 +278,7 @@ AY_PERIOD: LD A, H ; IF ZERO - ERROR OR L JR Z, AY_PERIOD1 -; + LD A, H ; MAXIMUM TONE PERIOD IS 12-BITS AND 11110000B ; ALLOWED RANGE IS 0001-0FFF (4095) JR NZ, AY_PERIOD1 ; RETURN NZ IF NUMBER TOO LARGE @@ -447,6 +426,7 @@ AY_EI: RET NZ HB_EI RET + ; ;====================================================================== ; @@ -480,6 +460,7 @@ AY_WRTPSG: OUT (112),A ; NORMAL CLOCK SPEED #ENDIF JP AY_EI + ; ;====================================================================== ; @@ -529,14 +510,13 @@ AYT_REGWR .DB "\r\nOUT AY-3-8910 $" #ENDIF ; ;====================================================================== -; QUARTER TONE FREQUENCY TABLE +; BBC MICRO QUARTER TONE FREQUENCY TABLE ;====================================================================== ; -; THE FREQUENCY BY QUARTER TONE STARTING AT A0# OCTAVE 0 +; THE FREQUENCY BY QUARTER TONE STARTING AT A0# OCATVE 0 ; USED TO MAP EACH OCTAVE (DIV BY 2 TO JUMP AN OCTAVE UP) ; FIRST PLAYABLE NOTE WILL BE 0 ; ASSUMING A CLOCK OF 1843200 THIS MAPS TO A0# -; AY3NOTETBL: .DW AY_RATIO / 2913 .DW AY_RATIO / 2956