mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 14:11:48 -06:00
@@ -1,4 +1,5 @@
|
||||
#IF AUDIOTRACE
|
||||
;
|
||||
#DEFINE AUDTRACE(STR) PUSH DE \ LD DE, STR \ CALL WRITESTR \ POP DE
|
||||
#DEFINE AUDTRACE_A CALL PRTHEXBYTE
|
||||
#DEFINE AUDTRACE_B PUSH AF \ LD A, B \ CALL PRTHEXBYTE \ POP AF
|
||||
@@ -9,12 +10,13 @@
|
||||
#DEFINE AUDTRACE_BC PUSH HL \ PUSH BC \ POP HL \ CALL PRTHEXWORDHL \ POP HL
|
||||
#DEFINE AUDTRACE_DE PUSH HL \ PUSH DE \ POP HL \ CALL PRTHEXWORDHL \ POP HL
|
||||
#DEFINE AUDTRACE_IY PUSH HL \ PUSH IY \ POP HL \ CALL PRTHEXWORDHL \ POP HL
|
||||
|
||||
;
|
||||
#DEFINE AUDDEBUG(S) push hl \ CALL PRTSTRD \ .TEXT S \ .TEXT "$" \ pop hl ; $$$$$$ PRINT STRING S TO CONSOLE - PRTD("HELLO") - NO TRAILING $ REQUIRED
|
||||
|
||||
;
|
||||
#DEFINE AUDTRACE_CR AUDDEBUG("\r\n$")
|
||||
|
||||
;
|
||||
#ELSE
|
||||
;
|
||||
#DEFINE AUDTRACE(S)
|
||||
#DEFINE AUDTRACE_A
|
||||
#DEFINE AUDTRACE_B
|
||||
@@ -25,51 +27,76 @@
|
||||
#DEFINE AUDTRACE_HL
|
||||
#DEFINE AUDTRACE_DE
|
||||
#DEFINE AUDTRACE_IY
|
||||
|
||||
;
|
||||
#DEFINE AUDDEBUG(STR)
|
||||
|
||||
;
|
||||
#DEFINE AUDTRACE_CR
|
||||
;
|
||||
#ENDIF
|
||||
|
||||
|
||||
#IFNDEF AUDIOUTILS
|
||||
#DEFINE AUDIOUTILS
|
||||
|
||||
;
|
||||
#IFNDEF AUDIO_INC
|
||||
#DEFINE AUDIO_INC
|
||||
;
|
||||
; NOTE TABLE VALUES ARE SHIFTED A FEW EXTRA BITS TO MAKE THE
|
||||
; DIVISION AS ACCURATE AS POSSIBLE.
|
||||
;
|
||||
AUD_SCALE .EQU 3
|
||||
;
|
||||
; ON ENTRY, DE IS ADDRESS OF NOTE TABLE, HL IS NOTE TO PLAY
|
||||
; NOTE VALUE 0 MEANS B0b/A0# IN OCTAVE 0 WHICH IS THE FIRST ENTRY
|
||||
; OF THE NOTE TABLE. THE NOTE TABLE REPRESENTS THE FREQUENCIES
|
||||
; FOR 1 FULL OCTAVE IN QUARTER NOTES. SINCE THERE ARE 12 NOTES
|
||||
; IN AN OCTAVE, THE TABLE HAS 48 ENTRIES FOR ALL QUARTER NOTES.
|
||||
;
|
||||
; ON EXIT, HL CONTAINS THE PERIOD VALUE TO PROGRAM INTO THE PSG
|
||||
; DERIVED FROM THE NOTE TABLE SCALED TO THE REQUESTED OCTAVE.
|
||||
;
|
||||
AUD_NOTE:
|
||||
AUDDEBUG("AUDNOTE ")
|
||||
AUDTRACE_HL
|
||||
AUDTRACE_CR
|
||||
AUDTRACE_DE
|
||||
AUDTRACE_CR
|
||||
|
||||
push de
|
||||
LD DE, 48
|
||||
CALL DIV16
|
||||
; BC IS OCTAVE COUNT
|
||||
; HL is NOTE WITHIN OCTAVE
|
||||
ADD HL, HL
|
||||
pop de
|
||||
ADD HL, DE
|
||||
|
||||
LD A, (HL) ; RETRIEVE PERIOD COUNT FROM SN7NOTETBL
|
||||
INC HL
|
||||
LD H, (HL)
|
||||
LD L, A
|
||||
|
||||
INC C
|
||||
;
|
||||
; START BY SEPARATING THE NOTE AND OCTAVE PORTION
|
||||
; OF THE INCOMING TONE VALUE IN HL
|
||||
PUSH DE ; SAVE NOTE TABLE ADR
|
||||
LD DE,48 ; 48 QUARTERNOTES PER OCTAVE
|
||||
CALL DIV16 ; SEPARATE OCTAVE AND NOTE
|
||||
;
|
||||
; THE QUOTIENT (BC) IS THE OCTAVE NUMBER REQUESTED
|
||||
; THE REMAINDER (HL) IS THE QUARTER NOTE WITHIN THE OCTAVE.
|
||||
;
|
||||
; NOW USE THE QUARTER NOTE VALUE TO LOOKUP THE CORRESPONDING
|
||||
; PSG PERIOD VALUE IN THE NOTE TABLE.
|
||||
ADD HL,HL ; SCALE FOR 2 BYTE TABLE ENTRY SIZE
|
||||
POP DE ; RECOVER THE TABLE ADR
|
||||
ADD HL,DE ; HL := DESIRED TABLE ENTRY ADR
|
||||
LD A,(HL) ; GET LOW BYTE OF PERIOD TO A
|
||||
INC HL ; POINT TO HIGH BYTE VALUE
|
||||
LD H,(HL) ; GET HIGH BYTE OF PERIOD TO H
|
||||
LD L,A ; PUT LOW BYTE INTO L
|
||||
;
|
||||
; NOW WE SCALE THE PERIOD VALUE DOWN BASED ON THE OCTAVE VALUE IN C
|
||||
; AND BY THE AUD_SCALE VALUE THAT WAS USED IN THE NOTE TABLE.
|
||||
; FOR EACH OCTAVE, THE PERIOD IS HALVED WHICH DOUBLES THE FREQUENCY
|
||||
; THAT WILL BE PRODUCED BY THE PSG. SINCE MOVING UP AN OCTAVE
|
||||
; SHOULD PRODUCE A FREQUENCY THAT IS TWICE THE LOWER OCTIAVE, THIS
|
||||
; WORKS NICELY, ALTHOUGH SOME ERROR MAY BE INTRODUCED.
|
||||
;
|
||||
LD A,AUD_SCALE ; SHIFT BY AUD_SCALE BITS
|
||||
ADD A,C ; ... AND OCTAVE
|
||||
LD B,A ; USE AS LOOP COUNTER
|
||||
AUD_NOTE1:
|
||||
DEC C
|
||||
JR Z, AUD_NOTE2
|
||||
SRL H
|
||||
RR L
|
||||
JR AUD_NOTE1
|
||||
|
||||
AUD_NOTE2:
|
||||
LD A, L ; IF NOT ZERO
|
||||
OR H
|
||||
RET NZ ; RETURN THE CALCULATED PERIOD
|
||||
|
||||
LD H, $FF ; OTHERWISE RETURN -1 PERIOD (ERROR)
|
||||
LD L, $FF
|
||||
SRL H ; RIGHT SHIFT HL
|
||||
RR L ; ... BY ONE BIT
|
||||
DJNZ AUD_NOTE1 ; LOOP UNTIL DONE
|
||||
;
|
||||
; IF THE RESULTANT PERIOD IS ZERO, IT MEANS THAT THE REQUESTED
|
||||
; PERIOD IS TOO LOW (FREQUENCY TOO HIGH) FOR THE PSG TO PRODUCE.
|
||||
LD A, L ; CHECK FOR ZERO
|
||||
OR H ; ... MEANING PSG CAN'T DO IT
|
||||
RET NZ ; IF NOT ZERO, RETURN THE CALCULATED PERIOD
|
||||
DEC HL ; OTHERWISE RETURN -1 PERIOD (ERROR)
|
||||
RET
|
||||
#ENDIF
|
||||
|
||||
@@ -4,8 +4,12 @@
|
||||
;
|
||||
;======================================================================
|
||||
;
|
||||
; @3.579545 OCTAVE RANGE IS 2 - 7 (Bb2/A#2 .. A7)
|
||||
; @4.000000 OCTAVE RANGE IS 2 - 7 (B2 .. A7)
|
||||
; AY-3-8910 & YM2149 PSG CHIPS NEED AN INPUT CLOCK FREQUENCY OF
|
||||
; NO MORE THAN 2 MHZ. THE CLOSEST THING THERE IS TO A STANDARD
|
||||
; IS THE MSX FREQ OF 1.7897725 MHZ.
|
||||
;
|
||||
; @1.7897725 OCTAVE RANGE IS 2 - 7 (Bb2/A#2 .. A7)
|
||||
; @2.0000000 OCTAVE RANGE IS 2 - 7 (B2 .. A7)
|
||||
;
|
||||
AY_RCSND .EQU 0 ; 0 = EB MODULE, 1=MF MODULE
|
||||
;
|
||||
@@ -14,7 +18,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)
|
||||
@@ -53,7 +56,6 @@ AY_RSEL .EQU $A0
|
||||
AY_RDAT .EQU $A1
|
||||
AY_RIN .EQU AY_RSEL
|
||||
AY_ACR .EQU $A2
|
||||
AY_CLK .SET 3579545 ; MSX NTSC COLOUR BURST FREQ = 315/88
|
||||
#ENDIF
|
||||
;
|
||||
;======================================================================
|
||||
@@ -92,14 +94,16 @@ AY_IDAT .EQU 0 ; NO INSTANCE DATA ASSOCIATED WITH THIS DEVICE
|
||||
;
|
||||
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
|
||||
;
|
||||
#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)
|
||||
.ECHO "SN76489 CLOCK: "
|
||||
.ECHO SN7CLK
|
||||
.ECHO "\n"
|
||||
;
|
||||
#INCLUDE "audio.inc"
|
||||
;
|
||||
@@ -306,38 +310,8 @@ AY_VOLUME:
|
||||
;======================================================================
|
||||
;
|
||||
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 - 1 ; THE NOTE TABLE PERIOD DATA HAS BEEN
|
||||
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
|
||||
;
|
||||
;======================================================================
|
||||
; SOUND DRIVER FUNCTION - PERIOD
|
||||
@@ -347,21 +321,22 @@ AY_PERIOD:
|
||||
AUDTRACE(AYT_PERIOD)
|
||||
AUDTRACE_HL
|
||||
AUDTRACE_CR
|
||||
|
||||
LD A, H ; IF ZERO - ERROR
|
||||
OR L
|
||||
JR Z, AY_PERIOD1
|
||||
;
|
||||
LD A, H ; MAXIMUM TONE PERIOD IS 12-BITS
|
||||
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
|
||||
LD (AY_PENDING_PERIOD), HL ; SAVE AND RETURN SUCCESSFUL
|
||||
JR NZ,AY_PERIOD1 ; RETURN NZ IF NUMBER TOO LARGE
|
||||
LD (AY_PENDING_PERIOD),HL ; SAVE AND RETURN SUCCESSFUL
|
||||
XOR A ; SET SUCCESS
|
||||
RET
|
||||
;
|
||||
AY_PERIOD1:
|
||||
LD A, $FF ; REQUESTED PERIOD IS LARGER
|
||||
LD (AY_PENDING_PERIOD), A ; THAN THE DEVICE CAN SUPPORT
|
||||
LD (AY_PENDING_PERIOD+1), A; SO SET PERIOD TO FFFF
|
||||
LD HL,$FFFF ; REQUESTED PERIOD IS LARGER
|
||||
LD (AY_PENDING_PERIOD),HL ; THAN PSG CAN SUPPORT, SO
|
||||
OR $FF ; SET PERIOD TO $FFFF
|
||||
RET ; AND RETURN FAILURE
|
||||
;
|
||||
;======================================================================
|
||||
@@ -612,10 +587,32 @@ AYT_REGWR .DB "\r\nOUT AY-3-8910 $"
|
||||
; QUARTER TONE FREQUENCY TABLE
|
||||
;======================================================================
|
||||
;
|
||||
; THE FREQUENCY BY QUARTER TONE STARTING AT A0# OCTAVE 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#
|
||||
; THE FOLLOWING TABLE MAPS A FULL OCTAVE OF QUARTER-NOTES
|
||||
; STARTING AT A# IN OCTAVE 0 TO THE CORRESPONDING PERIOD
|
||||
; VALUE TO USE ON THE PSG TO ACHIEVE THE DESIRED NOTE FREQUENCY.
|
||||
;
|
||||
; THE FREQUENCY PRODUCED BY THE AY-3-8910 IS:
|
||||
; FREQ = CLOCK / 16 / PERIOD
|
||||
;
|
||||
; SO, TO MAP A DESIRED FREQUENCY TO A PERIOD, WE USE:
|
||||
; PERIOD = CLOCK / 16 / FREQ
|
||||
;
|
||||
; IN ORDER TO IMPROVE THE RESOLUTION OF THE FREQUENCY
|
||||
; VALUE USED, WE ALSO MULTPLY BOTH SIDES OF THE EQUATION
|
||||
; BY 100:
|
||||
; PERIOD * 100 = (CLOCK / 16 / FREQ) * 100
|
||||
;
|
||||
; THE RESULTING PERIOD VALUE CAN BE REPEATEDLY HALVED
|
||||
; TO TO JUMP UP AS MANY OCTAVES AS DESIRED.
|
||||
;
|
||||
; THE FINAL VALUE IS SHIFTED BY AUD_SCALE BITS
|
||||
; IN ORDER TO IMPROVE THE RESOLUTION. THIS FINAL SHIFT
|
||||
; IS REMOVED WHEN IN THE AY_NOTE ROUTINE.
|
||||
;
|
||||
; ASSUMING A CLOCK OF 1.7897725 MHZ, THE FIRST PLAYABLE
|
||||
; NOTE WILL BE A0#/B0b (HBIOS NOTE CODE 0).
|
||||
;
|
||||
AY_RATIO .EQU (AY_CLK * 100) / (16 >> AUD_SCALE)
|
||||
;
|
||||
AY3NOTETBL:
|
||||
.DW AY_RATIO / 2913 ; A0#/B0b 178977250 / 2913 = 61440; PROOF: 61440 >> 3 = 7680, 3579545 / 7680 / 16 = 29.13
|
||||
|
||||
@@ -196,13 +196,13 @@ PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP
|
||||
;
|
||||
UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM)
|
||||
;
|
||||
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
|
||||
SN76489ENABLE .EQU FALSE ; SN: ENABLE SN76489 SOUND DRIVER
|
||||
AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER
|
||||
SN7CLK .EQU 3579545 ; DEFAULT TO NTSC
|
||||
SNMODE .EQU SNMODE_NONE ; DRIVER MODE: SNMODE_[NONE|RC|VGM]
|
||||
SN7CLK .EQU 3579545 ; SN: PSG CLOCK FREQ, ASSUME MSX STD
|
||||
SNMODE .EQU SNMODE_NONE ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM]
|
||||
;
|
||||
AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
|
||||
AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
|
||||
AY38910ENABLE .EQU FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER
|
||||
AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD
|
||||
AYMODE .EQU AYMODE_NONE ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC]
|
||||
;
|
||||
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
|
||||
|
||||
@@ -240,13 +240,13 @@ PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP
|
||||
;
|
||||
UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM)
|
||||
;
|
||||
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
|
||||
SN76489ENABLE .EQU FALSE ; SN: ENABLE SN76489 SOUND DRIVER
|
||||
AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER
|
||||
SN7CLK .EQU 3579545 ; DEFAULT TO NTSC
|
||||
SNMODE .EQU SNMODE_NONE ; DRIVER MODE: SNMODE_[NONE|RC|VGM]
|
||||
SN7CLK .EQU 3579545 ; SN: PSG CLOCK FREQ, ASSUME MSX STD
|
||||
SNMODE .EQU SNMODE_RC ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM]
|
||||
;
|
||||
AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
|
||||
AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
|
||||
AY38910ENABLE .EQU FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER
|
||||
AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD
|
||||
AYMODE .EQU AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC]
|
||||
;
|
||||
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
|
||||
|
||||
@@ -320,13 +320,13 @@ PIOSBASE .EQU $60 ; PIO: PIO REGISTERS BASE ADR FOR SBC PPI
|
||||
UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM)
|
||||
UFBASE .EQU $0C ; UF: REGISTERS BASE ADR
|
||||
;
|
||||
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
|
||||
SN76489ENABLE .EQU FALSE ; SN: ENABLE SN76489 SOUND DRIVER
|
||||
AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER
|
||||
SN7CLK .EQU 3579545 ; DEFAULT TO NTSC
|
||||
SNMODE .EQU SNMODE_NONE ; DRIVER MODE: SNMODE_[NONE|RC|VGM]
|
||||
SN7CLK .EQU 3579545 ; SN: PSG CLOCK FREQ, ASSUME MSX STD
|
||||
SNMODE .EQU SNMODE_NONE ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM]
|
||||
;
|
||||
AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
|
||||
AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
|
||||
AY38910ENABLE .EQU FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER
|
||||
AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD
|
||||
AYMODE .EQU AYMODE_NONE ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC]
|
||||
;
|
||||
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
|
||||
|
||||
@@ -244,13 +244,13 @@ PIOSBASE .EQU $60 ; PIO: PIO REGISTERS BASE ADR FOR SBC PPI
|
||||
UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM)
|
||||
UFBASE .EQU $0C ; UF: REGISTERS BASE ADR
|
||||
;
|
||||
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
|
||||
SN76489ENABLE .EQU FALSE ; SN: ENABLE SN76489 SOUND DRIVER
|
||||
AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER
|
||||
SN7CLK .EQU 3579545 ; DEFAULT TO NTSC
|
||||
SNMODE .EQU SNMODE_NONE ; DRIVER MODE: SNMODE_[NONE|RC|VGM]
|
||||
SN7CLK .EQU 3579545 ; SN: PSG CLOCK FREQ, ASSUME MSX STD
|
||||
SNMODE .EQU SNMODE_NONE ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM]
|
||||
;
|
||||
AY38910ENABLE .EQU TRUE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
|
||||
AY_CLK .EQU 3579545 / 2 ; DEFAULT TO CPUOSC / 4
|
||||
AY38910ENABLE .EQU FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER
|
||||
AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD
|
||||
AYMODE .EQU AYMODE_MBC ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC]
|
||||
;
|
||||
SPKENABLE .EQU TRUE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
|
||||
|
||||
@@ -246,13 +246,13 @@ PIOSBASE .EQU $60 ; PIO: PIO REGISTERS BASE ADR FOR SBC PPI
|
||||
UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM)
|
||||
UFBASE .EQU $0C ; UF: REGISTERS BASE ADR
|
||||
;
|
||||
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
|
||||
SN76489ENABLE .EQU FALSE ; SN: ENABLE SN76489 SOUND DRIVER
|
||||
AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER
|
||||
SN7CLK .EQU 3579545 ; DEFAULT TO NTSC
|
||||
SNMODE .EQU SNMODE_NONE ; DRIVER MODE: SNMODE_[NONE|RC|VGM]
|
||||
SN7CLK .EQU 3579545 ; SN: PSG CLOCK FREQ, ASSUME MSX STD
|
||||
SNMODE .EQU SNMODE_VGM ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM]
|
||||
;
|
||||
AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
|
||||
AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
|
||||
AY38910ENABLE .EQU FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER
|
||||
AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD
|
||||
AYMODE .EQU AYMODE_SCG ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC]
|
||||
;
|
||||
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
|
||||
|
||||
@@ -241,13 +241,13 @@ PIOSBASE .EQU N8_PPI0 ; PIO: PIO REGISTERS BASE ADR FOR SBC PPI
|
||||
UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM)
|
||||
FIFO_BASE .EQU $0C ; UF: REGISTERS BASE ADR
|
||||
;
|
||||
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
|
||||
SN76489ENABLE .EQU FALSE ; SN: ENABLE SN76489 SOUND DRIVER
|
||||
AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER
|
||||
SN7CLK .EQU 3579545 ; DEFAULT TO NTSC
|
||||
SNMODE .EQU SNMODE_NONE ; DRIVER MODE: SNMODE_[NONE|RC|VGM]
|
||||
SN7CLK .EQU 3579545 ; SN: PSG CLOCK FREQ, ASSUME MSX STD
|
||||
SNMODE .EQU SNMODE_VGM ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM]
|
||||
;
|
||||
AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
|
||||
AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
|
||||
AY38910ENABLE .EQU FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER
|
||||
AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD
|
||||
AYMODE .EQU AYMODE_N8 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC]
|
||||
;
|
||||
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
|
||||
|
||||
@@ -253,13 +253,13 @@ PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP
|
||||
;
|
||||
UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM)
|
||||
;
|
||||
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
|
||||
SN76489ENABLE .EQU FALSE ; SN: ENABLE SN76489 SOUND DRIVER
|
||||
AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER
|
||||
SN7CLK .EQU 3579545 ; DEFAULT TO NTSC
|
||||
SNMODE .EQU SNMODE_NONE ; DRIVER MODE: SNMODE_[NONE|RC|VGM]
|
||||
SN7CLK .EQU 3579545 ; SN: PSG CLOCK FREQ, ASSUME MSX STD
|
||||
SNMODE .EQU SNMODE_RC ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM]
|
||||
;
|
||||
AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
|
||||
AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
|
||||
AY38910ENABLE .EQU FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER
|
||||
AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD
|
||||
AYMODE .EQU AYMODE_RCZ180 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC]
|
||||
;
|
||||
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
|
||||
|
||||
@@ -268,13 +268,13 @@ PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP
|
||||
;
|
||||
UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM)
|
||||
;
|
||||
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
|
||||
SN76489ENABLE .EQU FALSE ; SN: ENABLE SN76489 SOUND DRIVER
|
||||
AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER
|
||||
SN7CLK .EQU 3579545 ; DEFAULT TO NTSC
|
||||
SNMODE .EQU SNMODE_NONE ; DRIVER MODE: SNMODE_[NONE|RC|VGM]
|
||||
SN7CLK .EQU 3579545 ; SN: PSG CLOCK FREQ, ASSUME MSX STD
|
||||
SNMODE .EQU SNMODE_RC ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM]
|
||||
;
|
||||
AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
|
||||
AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
|
||||
AY38910ENABLE .EQU FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER
|
||||
AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD
|
||||
AYMODE .EQU AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC]
|
||||
;
|
||||
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
|
||||
|
||||
@@ -260,13 +260,13 @@ PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP
|
||||
;
|
||||
UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM)
|
||||
;
|
||||
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
|
||||
SN76489ENABLE .EQU FALSE ; SN: ENABLE SN76489 SOUND DRIVER
|
||||
AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER
|
||||
SN7CLK .EQU 3579545 ; DEFAULT TO NTSC
|
||||
SNMODE .EQU SNMODE_RC ; DRIVER MODE: SNMODE_[NONE|RC|VGM]
|
||||
SN7CLK .EQU 3579545 ; SN: PSG CLOCK FREQ, ASSUME MSX STD
|
||||
SNMODE .EQU SNMODE_RC ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM]
|
||||
;
|
||||
AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
|
||||
AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
|
||||
AY38910ENABLE .EQU FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER
|
||||
AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD
|
||||
AYMODE .EQU AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC]
|
||||
;
|
||||
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
|
||||
|
||||
@@ -241,13 +241,13 @@ PIOSBASE .EQU RPH_PPI0 ; PIO: PIO REGISTERS BASE ADR FOR SBC PPI
|
||||
UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM)
|
||||
FIFO_BASE .EQU $0C ; UF: REGISTERS BASE ADR
|
||||
;
|
||||
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
|
||||
SN76489ENABLE .EQU FALSE ; SN: ENABLE SN76489 SOUND DRIVER
|
||||
AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER
|
||||
SN7CLK .EQU 3579545 ; DEFAULT TO NTSC
|
||||
SNMODE .EQU SNMODE_NONE ; DRIVER MODE: SNMODE_[NONE|RC|VGM]
|
||||
SN7CLK .EQU 3579545 ; SN: PSG CLOCK FREQ, ASSUME MSX STD
|
||||
SNMODE .EQU SNMODE_NONE ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM]
|
||||
;
|
||||
AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
|
||||
AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
|
||||
AY38910ENABLE .EQU FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER
|
||||
AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD
|
||||
AYMODE .EQU AYMODE_N8 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC]
|
||||
;
|
||||
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
|
||||
|
||||
@@ -244,13 +244,13 @@ PIOSBASE .EQU $60 ; PIO: PIO REGISTERS BASE ADR FOR SBC PPI
|
||||
UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM)
|
||||
UFBASE .EQU $0C ; UF: REGISTERS BASE ADR
|
||||
;
|
||||
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
|
||||
SN76489ENABLE .EQU FALSE ; SN: ENABLE SN76489 SOUND DRIVER
|
||||
AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER
|
||||
SN7CLK .EQU 3579545 ; DEFAULT TO NTSC
|
||||
SNMODE .EQU SNMODE_VGM ; DRIVER MODE: SNMODE_[NONE|RC|VGM]
|
||||
SN7CLK .EQU 3579545 ; SN: PSG CLOCK FREQ, ASSUME MSX STD
|
||||
SNMODE .EQU SNMODE_VGM ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM]
|
||||
;
|
||||
AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
|
||||
AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
|
||||
AY38910ENABLE .EQU FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER
|
||||
AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD
|
||||
AYMODE .EQU AYMODE_SCG ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC]
|
||||
;
|
||||
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
|
||||
|
||||
@@ -248,13 +248,13 @@ PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP
|
||||
;
|
||||
UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM)
|
||||
;
|
||||
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
|
||||
SN76489ENABLE .EQU FALSE ; SN: ENABLE SN76489 SOUND DRIVER
|
||||
AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER
|
||||
SN7CLK .EQU 3579545 ; DEFAULT TO NTSC
|
||||
SNMODE .EQU SNMODE_NONE ; DRIVER MODE: SNMODE_[NONE|RC|VGM]
|
||||
SN7CLK .EQU 3579545 ; SN: PSG CLOCK FREQ, ASSUME MSX STD
|
||||
SNMODE .EQU SNMODE_RC ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM]
|
||||
;
|
||||
AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
|
||||
AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
|
||||
AY38910ENABLE .EQU FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER
|
||||
AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD
|
||||
AYMODE .EQU AYMODE_RCZ180 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC]
|
||||
;
|
||||
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
|
||||
|
||||
@@ -2812,6 +2812,43 @@ INITSYS3:
|
||||
;
|
||||
#ENDIF
|
||||
;
|
||||
#IF 0
|
||||
;
|
||||
LD HL,0
|
||||
CALL DBG_NOTE
|
||||
LD HL,48
|
||||
CALL DBG_NOTE
|
||||
LD HL,204
|
||||
CALL DBG_NOTE
|
||||
LD HL,268
|
||||
CALL DBG_NOTE
|
||||
LD HL,436
|
||||
CALL DBG_NOTE
|
||||
;
|
||||
JP INITSYS4
|
||||
;
|
||||
DBG_NOTE:
|
||||
PUSH HL
|
||||
CALL NEWLINE
|
||||
PRTS("AY: $")
|
||||
CALL PRTDEC16
|
||||
PRTS("=$")
|
||||
CALL AY_NOTE
|
||||
LD HL,(AY_PENDING_PERIOD)
|
||||
CALL PRTDEC16
|
||||
POP HL
|
||||
;
|
||||
PRTS(" SN: $")
|
||||
CALL PRTDEC16
|
||||
PRTS("=$")
|
||||
CALL SN7_NOTE
|
||||
LD HL,(SN7_PENDING_PERIOD)
|
||||
CALL PRTDEC16
|
||||
;
|
||||
RET
|
||||
;
|
||||
#ENDIF
|
||||
;
|
||||
INITSYS4:
|
||||
;
|
||||
#IF (MEMMGR == MM_Z280)
|
||||
|
||||
@@ -1,9 +1,13 @@
|
||||
;======================================================================
|
||||
; SN76489 sound driver
|
||||
; SN76489 SOUND DRIVER
|
||||
;
|
||||
; WRITTEN BY: DEAN NETHERTON
|
||||
;======================================================================
|
||||
;
|
||||
; SN74489 PSG CHIP NEEDS AN INPUT CLOCK FREQUENCY OF
|
||||
; NO MORE THAN 4 MHZ. THE CLOSEST THING THERE IS TO A STANDARD
|
||||
; IS THE MSX FREQ OF 3.579545 MHZ.
|
||||
;
|
||||
; TODO:
|
||||
; 1. PROVIDE SUPPORT FOR NOISE CHANNEL
|
||||
; 2. DOES THIS WORK FOR FASTER CPUS? ONLY BEEN TESTED ON A Z80 7MHZ UNIT
|
||||
@@ -15,15 +19,13 @@
|
||||
#IF (SNMODE == SNMODE_VGM)
|
||||
SN76489_PORT_LEFT .EQU $C6 ; PORTS FOR ACCESSING THE SN76489 CHIP (LEFT)
|
||||
SN76489_PORT_RIGHT .EQU $C7 ; PORTS FOR ACCESSING THE SN76489 CHIP (RIGHT)
|
||||
;SN7CLK .EQU 3575950 ; CLOCK SPEED DRIVING THE SN76489 CHIPS
|
||||
#ENDIF
|
||||
|
||||
;
|
||||
#IF (SNMODE == SNMODE_RC)
|
||||
SN76489_PORT_LEFT .EQU $FF ; PORTS FOR ACCESSING THE SN76489 CHIP (LEFT)
|
||||
SN76489_PORT_RIGHT .EQU $FB ; PORTS FOR ACCESSING THE SN76489 CHIP (RIGHT)
|
||||
;SN7CLK .EQU 3575950 ; CLOCK SPEED DRIVING THE SN76489 CHIPS
|
||||
#ENDIF
|
||||
|
||||
;
|
||||
SN7_IDAT .EQU 0
|
||||
SN7_TONECNT .EQU 3 ; COUNT NUMBER OF TONE CHANNELS
|
||||
SN7_NOISECNT .EQU 1 ; COUNT NUMBER OF NOISE CHANNELS
|
||||
@@ -32,15 +34,13 @@ CHANNEL_0_SILENT .EQU $9F
|
||||
CHANNEL_1_SILENT .EQU $BF
|
||||
CHANNEL_2_SILENT .EQU $DF
|
||||
CHANNEL_3_SILENT .EQU $FF
|
||||
|
||||
SN7RATIO .EQU SN7CLK * 100 / 32
|
||||
|
||||
;
|
||||
.ECHO "SN76489 CLOCK: "
|
||||
.ECHO SN7CLK
|
||||
.ECHO "\n"
|
||||
|
||||
;
|
||||
#INCLUDE "audio.inc"
|
||||
|
||||
;
|
||||
SN76489_INIT:
|
||||
LD IY, SN7_IDAT ; POINTER TO INSTANCE DATA
|
||||
LD BC, SN7_FNTBL ; BC := FUNCTION TABLE ADDRESS
|
||||
@@ -125,33 +125,29 @@ SN7_VOLUME:
|
||||
SN7_NOTE:
|
||||
LD DE, SN7NOTETBL
|
||||
CALL AUD_NOTE ; RETURNS PERIOD IN HL, FALL THRU
|
||||
; TO SET THIS PERIOD
|
||||
;
|
||||
SN7_PERIOD:
|
||||
AUDTRACE(SNT_PERIOD)
|
||||
AUDTRACE_HL
|
||||
AUDTRACE_CR
|
||||
|
||||
LD A, H ; IF ZERO - ERROR
|
||||
;
|
||||
LD A,H ; IF ZERO - ERROR
|
||||
OR L
|
||||
JR Z, SN7_QUERY_PERIOD1
|
||||
|
||||
LD (SN7_PENDING_PERIOD), HL ;ASSUME SUCCESS
|
||||
|
||||
OR A ; IF >= 401 ERROR
|
||||
LD DE, $401
|
||||
SBC HL, DE
|
||||
JR NC, SN7_QUERY_PERIOD1
|
||||
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
JR Z,SN7_PERIOD1
|
||||
;
|
||||
LD A,H ; MAXIMUM TONE PERIOD IS 10-BITS
|
||||
AND 11111100B ; ALLOWED RANGE IS 0001-03FF (1023)
|
||||
JR NZ,SN7_PERIOD1 ; RETURN NZ IF NUMBER TOO LARGE
|
||||
LD (SN7_PENDING_PERIOD),HL ; SAVE AND RETURN SUCCESSFUL
|
||||
XOR A ; SET SUCCESS
|
||||
RET
|
||||
|
||||
SN7_QUERY_PERIOD1: ; REQUESTED PERIOD IS LARGER THAN THE SN76489 CAN SUPPORT
|
||||
LD A, $FF
|
||||
LD L, A
|
||||
LD H, A
|
||||
LD (SN7_PENDING_PERIOD), HL
|
||||
RET
|
||||
|
||||
;
|
||||
SN7_PERIOD1:
|
||||
LD HL,$FFFF ; REQUESTED PERIOD IS LARGER
|
||||
LD (SN7_PENDING_PERIOD),HL ; THAN PSG CAN SUPPORT, SO
|
||||
OR $FF ; SET PERIOD TO $FFFF
|
||||
RET ; AND RETURN FAILURE
|
||||
;
|
||||
SN7_PLAY:
|
||||
AUDTRACE(SNT_PLAY)
|
||||
AUDTRACE_D
|
||||
@@ -408,12 +404,38 @@ SNT_PERIOD .DB "\r\nSN7_PERIOD: $"
|
||||
SNT_PLAY .DB "\r\nSN7_PLAY CH: $"
|
||||
SNT_REGWR .DB "\r\nOUT SN76489, $"
|
||||
#ENDIF
|
||||
|
||||
; THE FREQUENCY BY QUARTER TONE STARTING AT A0#
|
||||
; USED TO MAP EACH OCTAVE (DIV BY 2 TO JUMP AN OCTAVE UP)
|
||||
; ASSUMING A CLOCK OF 3575950 HZ, THE FIRST PLAYABLE
|
||||
;
|
||||
;======================================================================
|
||||
; QUARTER TONE FREQUENCY TABLE
|
||||
;======================================================================
|
||||
;
|
||||
; THE FOLLOWING TABLE MAPS A FULL OCTAVE OF QUARTER-NOTES
|
||||
; STARTING AT A# IN OCTAVE 0 TO THE CORRESPONDING PERIOD
|
||||
; VALUE TO USE ON THE PSG TO ACHIEVE THE DESIRED NOTE FREQUENCY.
|
||||
;
|
||||
; THE FREQUENCY PRODUCED BY THE SN76489 IS:
|
||||
; FREQ = CLOCK / 32 / PERIOD
|
||||
;
|
||||
; SO, TO MAP A DESIRED FREQUENCY TO A PERIOD, WE USE:
|
||||
; PERIOD = CLOCK / 32 / FREQ
|
||||
;
|
||||
; IN ORDER TO IMPROVE THE RESOLUTION OF THE FREQUENCY
|
||||
; VALUE USED, WE ALSO MULTPLY BOTH SIDES OF THE EQUATION
|
||||
; BY 100:
|
||||
; PERIOD * 100 = (CLOCK / 32 / FREQ) * 100
|
||||
;
|
||||
; THE RESULTING PERIOD VALUE CAN BE REPEATEDLY HALVED
|
||||
; TO TO JUMP UP AS MANY OCTAVES AS DESIRED.
|
||||
;
|
||||
; THE FINAL VALUE IS SHIFTED BY AUD_SCALE BITS
|
||||
; IN ORDER TO IMPROVE THE RESOLUTION. THIS FINAL SHIFT
|
||||
; IS REMOVED WHEN IN THE AY_NOTE ROUTINE.
|
||||
;
|
||||
; ASSUMING A CLOCK OF 3.579545 MHZ, THE FIRST PLAYABLE
|
||||
; NOTE WILL BE A2 (HBIOS NOTE CODE 92).
|
||||
|
||||
;
|
||||
SN7RATIO .EQU (SN7CLK * 100) / (32 >> AUD_SCALE)
|
||||
;
|
||||
SN7NOTETBL:
|
||||
.DW SN7RATIO / 2913 ; A0#/B0b
|
||||
.DW SN7RATIO / 2956 ;
|
||||
|
||||
Reference in New Issue
Block a user