|
|
|
@ -4,7 +4,7 @@ |
|
|
|
; WRITTEN BY: DEAN NETHERTON |
|
|
|
;====================================================================== |
|
|
|
; |
|
|
|
; SN74489 PSG CHIP NEEDS AN INPUT CLOCK FREQUENCY OF |
|
|
|
; SN76489 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. |
|
|
|
; |
|
|
|
@ -37,6 +37,20 @@ SN76489_PORT_RIGHT .EQU $BF ; PORTS FOR ACCESSING THE SN76489 CHIP (RIGHT) |
|
|
|
DEVECHO "RC" |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
|
|
|
|
SN76489_PORT16_LEFT .EQU (IO_SEGMENT*256) + SN76489_PORT_LEFT |
|
|
|
SN76489_PORT16_RIGHT .EQU (IO_SEGMENT*256) + SN76489_PORT_RIGHT |
|
|
|
|
|
|
|
#IF (CPUFAM == CPU_EZ80) |
|
|
|
; The eZ80 configuration must have sufficient bus cycles configured for this driver |
|
|
|
; to work. See the entries: (EZ80_ASSIGN and EZ80_IO_CYCLES or EZ80_IO_FREQ) |
|
|
|
; |
|
|
|
; For CPU @ ~18Mhz, the eZ80 must have at least 4 Bus Cycles for I/O operations |
|
|
|
; For CPU @ ~24Mhz, the eZ80 must have at least 5 Bus Cycles for I/O operations |
|
|
|
|
|
|
|
SN76489_IO_DELAY .EQU 15 ; 200us DELAY BETWEEN CHANNEL WRITES |
|
|
|
|
|
|
|
#ENDIF |
|
|
|
DEVECHO ", IO_LEFT=" |
|
|
|
DEVECHO SN76489_PORT_LEFT |
|
|
|
DEVECHO ", IO_RIGHT=" |
|
|
|
@ -102,21 +116,34 @@ SN7_VOLUME_OFF: |
|
|
|
OUT (RTCIO),A ; TO HALF CLOCK SPEED |
|
|
|
#ENDIF |
|
|
|
|
|
|
|
|
|
|
|
LD A, CHANNEL_0_SILENT |
|
|
|
OUT (SN76489_PORT_LEFT), A |
|
|
|
OUT (SN76489_PORT_RIGHT), A |
|
|
|
LD BC, SN76489_PORT16_LEFT |
|
|
|
EZ80_DELAY_START(SN76489_IO_DELAY, SN7_DELAY_COUNTER) |
|
|
|
OUT (C), A |
|
|
|
LD BC, SN76489_PORT16_RIGHT |
|
|
|
OUT (C), A |
|
|
|
|
|
|
|
LD A, CHANNEL_1_SILENT |
|
|
|
OUT (SN76489_PORT_LEFT), A |
|
|
|
OUT (SN76489_PORT_RIGHT), A |
|
|
|
LD BC, SN76489_PORT16_LEFT |
|
|
|
EZ80_DELAY_WAIT(SN76489_IO_DELAY, SN7_DELAY_COUNTER) |
|
|
|
OUT (C), A |
|
|
|
LD BC, SN76489_PORT16_RIGHT |
|
|
|
OUT (C), A |
|
|
|
|
|
|
|
LD A, CHANNEL_2_SILENT |
|
|
|
OUT (SN76489_PORT_LEFT), A |
|
|
|
OUT (SN76489_PORT_RIGHT), A |
|
|
|
LD BC, SN76489_PORT16_LEFT |
|
|
|
EZ80_DELAY_WAIT(SN76489_IO_DELAY, SN7_DELAY_COUNTER) |
|
|
|
OUT (C), A |
|
|
|
LD BC, SN76489_PORT16_RIGHT |
|
|
|
OUT (C), A |
|
|
|
|
|
|
|
LD A, CHANNEL_3_SILENT |
|
|
|
OUT (SN76489_PORT_LEFT), A |
|
|
|
OUT (SN76489_PORT_RIGHT), A |
|
|
|
LD BC, SN76489_PORT16_LEFT |
|
|
|
EZ80_DELAY_WAIT(SN76489_IO_DELAY, SN7_DELAY_COUNTER) |
|
|
|
OUT (C), A |
|
|
|
LD BC, SN76489_PORT16_RIGHT |
|
|
|
OUT (C), A |
|
|
|
|
|
|
|
#IFDEF SBCV2004 |
|
|
|
LD A,(HB_RTCVAL) |
|
|
|
@ -174,9 +201,12 @@ SN7_PLAY: |
|
|
|
AUDTRACE_D |
|
|
|
AUDTRACE_CR |
|
|
|
|
|
|
|
EZ80_DELAY_START(SN76489_IO_DELAY, SN7_DELAY_COUNTER) |
|
|
|
|
|
|
|
LD A, (SN7_PENDING_PERIOD + 1) |
|
|
|
CP $FF |
|
|
|
JR Z, SN7_PLAY1 ; PERIOD IS TOO LARGE, UNABLE TO PLAY |
|
|
|
|
|
|
|
CALL SN7_APPLY_VOL |
|
|
|
CALL SN7_APPLY_PRD |
|
|
|
|
|
|
|
@ -281,8 +311,12 @@ SN7_APPLY_VOL: ; APPLY VOLUME TO BOTH LEFT AND RIGHT CHANNELS |
|
|
|
POP AF |
|
|
|
#ENDIF |
|
|
|
|
|
|
|
OUT (SN76489_PORT_LEFT), A |
|
|
|
OUT (SN76489_PORT_RIGHT), A |
|
|
|
LD BC, SN76489_PORT16_LEFT |
|
|
|
EZ80_DELAY_WAIT(SN76489_IO_DELAY, SN7_DELAY_COUNTER) |
|
|
|
OUT (C), A |
|
|
|
|
|
|
|
LD BC, SN76489_PORT16_RIGHT |
|
|
|
OUT (C), A |
|
|
|
|
|
|
|
#IFDEF SBCV2004 |
|
|
|
LD A,(HB_RTCVAL) |
|
|
|
@ -295,6 +329,7 @@ SN7_APPLY_VOL: ; APPLY VOLUME TO BOTH LEFT AND RIGHT CHANNELS |
|
|
|
RET |
|
|
|
|
|
|
|
SN7_APPLY_PRD: |
|
|
|
|
|
|
|
PUSH DE |
|
|
|
PUSH BC |
|
|
|
PUSH AF |
|
|
|
@ -326,8 +361,12 @@ SN7_APPLY_PRD: |
|
|
|
POP AF |
|
|
|
#ENDIF |
|
|
|
|
|
|
|
OUT (SN76489_PORT_LEFT), A |
|
|
|
OUT (SN76489_PORT_RIGHT), A |
|
|
|
LD BC, SN76489_PORT16_LEFT |
|
|
|
EZ80_DELAY_WAIT(SN76489_IO_DELAY, SN7_DELAY_COUNTER) |
|
|
|
OUT (C), A |
|
|
|
|
|
|
|
LD BC, SN76489_PORT16_RIGHT |
|
|
|
OUT (C), A |
|
|
|
|
|
|
|
#IFDEF SBCV2004 |
|
|
|
LD A,(HB_RTCVAL) |
|
|
|
@ -363,8 +402,14 @@ SN7_APPLY_PRD: |
|
|
|
POP AF |
|
|
|
#ENDIF |
|
|
|
|
|
|
|
OUT (SN76489_PORT_LEFT), A |
|
|
|
OUT (SN76489_PORT_RIGHT), A |
|
|
|
EZ80_DELAY_WAIT(SN76489_IO_DELAY, SN7_DELAY_COUNTER) |
|
|
|
|
|
|
|
LD BC, SN76489_PORT16_LEFT |
|
|
|
EZ80_DELAY_WAIT(SN76489_IO_DELAY, SN7_DELAY_COUNTER) |
|
|
|
OUT (C), A |
|
|
|
|
|
|
|
LD BC, SN76489_PORT16_RIGHT |
|
|
|
OUT (C), A |
|
|
|
|
|
|
|
#IFDEF SBCV2004 |
|
|
|
LD A,(HB_RTCVAL) |
|
|
|
@ -413,6 +458,11 @@ SN7_PENDING_VOLUME |
|
|
|
SN7_PENDING_DURATION |
|
|
|
.DW 0 ; PENDING DURATION (16 BITS) |
|
|
|
|
|
|
|
#IF (CPUFAM == CPU_EZ80) |
|
|
|
SN7_DELAY_COUNTER: |
|
|
|
.DW 0 |
|
|
|
#ENDIF |
|
|
|
|
|
|
|
STR_MESSAGELT .DB "\r\nSN76489: LEFT IO=0x$" |
|
|
|
STR_MESSAGERT .DB ", RIGHT IO=0x$" |
|
|
|
|
|
|
|
|