|
|
@ -5,6 +5,9 @@ |
|
|
;====================================================================== |
|
|
;====================================================================== |
|
|
; |
|
|
; |
|
|
; TODO: |
|
|
; TODO: |
|
|
|
|
|
; 1. PROVIDE SUPPORT FOR NOISE CHANNEL |
|
|
|
|
|
; 2. FOR PERIOD SET, MAP 400 TO 0 AND RETURN ERROR FOR 000 |
|
|
|
|
|
; 3. DOES THIS WORK FOR FASTER CPUS? ONLY BEEN TEST ON A Z80 7MHZ UNIT |
|
|
; |
|
|
; |
|
|
;====================================================================== |
|
|
;====================================================================== |
|
|
; CONSTANTS |
|
|
; CONSTANTS |
|
|
@ -104,13 +107,10 @@ SN7_NOTE: |
|
|
AUDTRACE_HL |
|
|
AUDTRACE_HL |
|
|
AUDTRACE_CR |
|
|
AUDTRACE_CR |
|
|
|
|
|
|
|
|
LD B, H |
|
|
|
|
|
LD C, L |
|
|
|
|
|
LD DE, 48 |
|
|
LD DE, 48 |
|
|
|
|
|
|
|
|
CALL _DIV16 |
|
|
|
|
|
|
|
|
CALL DIV16 |
|
|
; BC IS OCTAVE COUNT |
|
|
; BC IS OCTAVE COUNT |
|
|
; HL is NOTE WITIN ACTAVE |
|
|
|
|
|
|
|
|
; HL is NOTE WITIN OCTAVE |
|
|
ADD HL, HL |
|
|
ADD HL, HL |
|
|
LD DE, SN7NOTETBL |
|
|
LD DE, SN7NOTETBL |
|
|
ADD HL, DE |
|
|
ADD HL, DE |
|
|
@ -129,55 +129,21 @@ SN7_NOTE1: |
|
|
JR SN7_NOTE1 |
|
|
JR SN7_NOTE1 |
|
|
|
|
|
|
|
|
SN7_NOTE2: |
|
|
SN7_NOTE2: |
|
|
LD A, L |
|
|
|
|
|
|
|
|
LD A, L ; IF WE GENERATE ZERO - RETURN ERROR |
|
|
OR H |
|
|
OR H |
|
|
JR NZ, SN7_PERIOD |
|
|
|
|
|
|
|
|
JR NZ, SN7_PERIOD ; OTHERWISE APPLY THE CALCULATED PERIOD |
|
|
|
|
|
|
|
|
LD H, $FF |
|
|
LD H, $FF |
|
|
LD L, $FF |
|
|
LD L, $FF |
|
|
JR SN7_PERIOD |
|
|
JR SN7_PERIOD |
|
|
|
|
|
|
|
|
; Divide 16-bit values (with 16-bit result) |
|
|
|
|
|
; In: Divide BC by divider DE |
|
|
|
|
|
; Out: BC = result, HL = rest |
|
|
|
|
|
; |
|
|
|
|
|
_DIV16: |
|
|
|
|
|
LD HL, 0 |
|
|
|
|
|
LD A, B |
|
|
|
|
|
LD B, 8 |
|
|
|
|
|
DIV16_LOOP1: |
|
|
|
|
|
RLA |
|
|
|
|
|
ADC HL, HL |
|
|
|
|
|
SBC HL, DE |
|
|
|
|
|
JR NC, DIV16_NOADD1 |
|
|
|
|
|
ADD HL, DE |
|
|
|
|
|
DIV16_NOADD1: |
|
|
|
|
|
DJNZ DIV16_LOOP1 |
|
|
|
|
|
RLA |
|
|
|
|
|
CPL |
|
|
|
|
|
LD B, A |
|
|
|
|
|
LD A, C |
|
|
|
|
|
LD C, B |
|
|
|
|
|
LD B, 8 |
|
|
|
|
|
DIV16_LOOP2: |
|
|
|
|
|
RLA |
|
|
|
|
|
ADC HL, HL |
|
|
|
|
|
SBC HL, DE |
|
|
|
|
|
JR NC, DIV16_NOADD2 |
|
|
|
|
|
ADD HL, DE |
|
|
|
|
|
DIV16_NOADD2: |
|
|
|
|
|
DJNZ DIV16_LOOP2 |
|
|
|
|
|
RLA |
|
|
|
|
|
CPL |
|
|
|
|
|
LD B, C |
|
|
|
|
|
LD C, A |
|
|
|
|
|
RET |
|
|
|
|
|
|
|
|
|
|
|
SN7_PERIOD: |
|
|
SN7_PERIOD: |
|
|
AUDTRACE(SNT_PERIOD) |
|
|
AUDTRACE(SNT_PERIOD) |
|
|
AUDTRACE_HL |
|
|
AUDTRACE_HL |
|
|
AUDTRACE_CR |
|
|
AUDTRACE_CR |
|
|
|
|
|
|
|
|
|
|
|
; TODO: MAKE ZERO BE AN INVALID VALUE (USE 400) TO INDICATE LOWEST NOTE |
|
|
|
|
|
; NEED TO UPDATE TUNE.ASM TO SUPPORT THIS? |
|
|
; LD A, H ; IF ZERO - ERROR |
|
|
; LD A, H ; IF ZERO - ERROR |
|
|
; OR L |
|
|
; OR L |
|
|
; JR Z, SN7_QUERY_PERIOD1 |
|
|
; JR Z, SN7_QUERY_PERIOD1 |
|
|
@ -398,10 +364,11 @@ SNT_PLAY .DB "\r\nSN7_PLAY CH: $" |
|
|
SNT_REGWR .DB "\r\nOUT SN76489, $" |
|
|
SNT_REGWR .DB "\r\nOUT SN76489, $" |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
|
|
|
|
|
|
; THE FREQUENCY BY QUARTER TONE STARTING AT A0# |
|
|
|
|
|
; OCATVE 0 - not suported by this driver |
|
|
|
|
|
; FIRST PLAYABLE NOTE WILL BE $2E - 2 quater tones below a1# |
|
|
|
|
|
; A1# is $30 |
|
|
|
|
|
|
|
|
; 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 $2E |
|
|
|
|
|
; ASSUMING A CLOCK OF 1843200 THIS MAPS TO |
|
|
|
|
|
; 2 QUATER TONES BELOW A1#, WITH A1# AT $30 |
|
|
|
|
|
|
|
|
SN7NOTETBL: |
|
|
SN7NOTETBL: |
|
|
.DW SN7RATIO / 2913 |
|
|
.DW SN7RATIO / 2913 |
|
|
@ -454,9 +421,3 @@ SN7NOTETBL: |
|
|
.DW SN7RATIO / 5743 |
|
|
.DW SN7RATIO / 5743 |
|
|
|
|
|
|
|
|
SIZ_SN7NOTETBL .EQU $ - SN7NOTETBL |
|
|
SIZ_SN7NOTETBL .EQU $ - SN7NOTETBL |
|
|
.ECHO "SN76489 approx " |
|
|
|
|
|
.ECHO SIZ_SN7NOTETBL / 2 / 4 /12 |
|
|
|
|
|
.ECHO " Octaves. Last note index supported: " |
|
|
|
|
|
|
|
|
|
|
|
.ECHO SIZ_SN7NOTETBL / 2 |
|
|
|
|
|
.ECHO "\n" |
|
|
|
|
|
|