mirror of
https://github.com/deater/dos33fsprogs.git
synced 2025-03-10 14:32:34 +00:00
optimize 1.77MHz to 1MHz conversion
fixed a few minor bugs here from qkumba's version as it was making the validation tests fail. One was not zeroing out mixer/envelope, and one was not saving some values properly in the 1MHz case --- vmw
This commit is contained in:
parent
390c560edc
commit
0d3427b11d
@ -1802,7 +1802,7 @@ do_frame:
|
|||||||
; R13 = Envelope Shape, 0xff means don't write
|
; R13 = Envelope Shape, 0xff means don't write
|
||||||
; R14/R15 = I/O (ignored)
|
; R14/R15 = I/O (ignored)
|
||||||
|
|
||||||
lda #0 ; 2
|
lda #0 ; needed ; 2
|
||||||
sta pt3_mixer_value ; 4
|
sta pt3_mixer_value ; 4
|
||||||
sta pt3_envelope_add ; 4
|
sta pt3_envelope_add ; 4
|
||||||
|
|
||||||
@ -1813,133 +1813,132 @@ do_frame:
|
|||||||
ldx #(NOTE_STRUCT_SIZE*2) ; Note C ; 2
|
ldx #(NOTE_STRUCT_SIZE*2) ; Note C ; 2
|
||||||
jsr calculate_note ; 6+?
|
jsr calculate_note ; 6+?
|
||||||
|
|
||||||
; Load up the Frequency Registers
|
|
||||||
|
|
||||||
lda note_a+NOTE_TONE_L ; Note A Period L ; 4
|
|
||||||
sta AY_REGISTERS+0 ; into R0 ; 3
|
|
||||||
lda note_a+NOTE_TONE_H ; Note A Period H ; 4
|
|
||||||
sta AY_REGISTERS+1 ; into R1 ; 3
|
|
||||||
|
|
||||||
; FIXME: make this self-modifying?
|
; FIXME: make this self-modifying?
|
||||||
|
|
||||||
lda convert_177 ; 4
|
lda convert_177 ; 4
|
||||||
beq no_scale_a ; 2/3
|
cmp #1 ; 2
|
||||||
|
|
||||||
|
; Load up the Frequency Registers
|
||||||
|
|
||||||
|
lda note_a+NOTE_TONE_L ; Note A Period L ; 4
|
||||||
|
sta AY_REGISTERS+0 ; into R0 ; 3
|
||||||
|
|
||||||
|
lda note_a+NOTE_TONE_H ; Note A Period H ; 4
|
||||||
|
sta AY_REGISTERS+1 ; into R1 ; 3
|
||||||
|
lda note_a+NOTE_TONE_L ; Note A Period L ; 4
|
||||||
|
bcc no_scale_a ; 2/3
|
||||||
|
|
||||||
; Convert from 1.77MHz to 1MHz by multiplying by 9/16
|
; Convert from 1.77MHz to 1MHz by multiplying by 9/16
|
||||||
|
|
||||||
; conversion costs 100 cycles!
|
; conversion costs 100 cycles!
|
||||||
|
|
||||||
; first multiply by 8
|
; first multiply by 8
|
||||||
asl AY_REGISTERS+0 ; 5
|
asl ; 2
|
||||||
rol AY_REGISTERS+1 ; 5
|
rol AY_REGISTERS+1 ; 5
|
||||||
asl AY_REGISTERS+0 ; 5
|
asl ; 2
|
||||||
rol AY_REGISTERS+1 ; 5
|
rol AY_REGISTERS+1 ; 5
|
||||||
asl AY_REGISTERS+0 ; 5
|
asl ; 2
|
||||||
rol AY_REGISTERS+1 ; 5
|
rol AY_REGISTERS+1 ; 5
|
||||||
|
|
||||||
; add in original to get 9
|
; add in original to get 9
|
||||||
clc ; 2
|
clc ; 2
|
||||||
lda note_a+NOTE_TONE_L ; 4
|
adc note_a+NOTE_TONE_L ; 4
|
||||||
adc AY_REGISTERS+0 ; 3
|
|
||||||
sta AY_REGISTERS+0 ; 3
|
sta AY_REGISTERS+0 ; 3
|
||||||
lda note_a+NOTE_TONE_H ; 4
|
lda note_a+NOTE_TONE_H ; 4
|
||||||
adc AY_REGISTERS+1 ; 3
|
adc AY_REGISTERS+1 ; 3
|
||||||
sta AY_REGISTERS+1 ; 3
|
|
||||||
|
|
||||||
; divide by 16 to get proper value
|
; divide by 16 to get proper value
|
||||||
ror AY_REGISTERS+1 ; 5
|
ror ; 2
|
||||||
ror AY_REGISTERS+0 ; 5
|
ror AY_REGISTERS+0 ; 5
|
||||||
ror AY_REGISTERS+1 ; 5
|
ror ; 2
|
||||||
ror AY_REGISTERS+0 ; 5
|
ror AY_REGISTERS+0 ; 5
|
||||||
ror AY_REGISTERS+1 ; 5
|
ror ; 2
|
||||||
ror AY_REGISTERS+0 ; 5
|
ror AY_REGISTERS+0 ; 5
|
||||||
ror AY_REGISTERS+1 ; 5
|
ror ; 2
|
||||||
ror AY_REGISTERS+0 ; 5
|
ror AY_REGISTERS+0 ; 5
|
||||||
lda AY_REGISTERS+1 ; 3
|
|
||||||
and #$0f ; 2
|
and #$0f ; 2
|
||||||
sta AY_REGISTERS+1 ; 3
|
sta AY_REGISTERS+1 ; 3
|
||||||
|
|
||||||
no_scale_a:
|
no_scale_a:
|
||||||
|
|
||||||
|
lda convert_177 ; 4
|
||||||
|
cmp #1 ; 2
|
||||||
|
|
||||||
lda note_b+NOTE_TONE_L ; Note B Period L ; 4
|
lda note_b+NOTE_TONE_L ; Note B Period L ; 4
|
||||||
sta AY_REGISTERS+2 ; into R2 ; 3
|
sta AY_REGISTERS+2 ; into R2 ; 3
|
||||||
|
|
||||||
lda note_b+NOTE_TONE_H ; Note B Period H ; 4
|
lda note_b+NOTE_TONE_H ; Note B Period H ; 4
|
||||||
sta AY_REGISTERS+3 ; into R3 ; 3
|
sta AY_REGISTERS+3 ; into R3 ; 3
|
||||||
|
lda note_b+NOTE_TONE_L ; Note B Period L ; 4
|
||||||
lda convert_177 ; 4
|
bcc no_scale_b ; 2/3
|
||||||
beq no_scale_b ; 2/3
|
|
||||||
|
|
||||||
; Convert from 1.77MHz to 1MHz by multiplying by 9/16
|
; Convert from 1.77MHz to 1MHz by multiplying by 9/16
|
||||||
|
|
||||||
; first multiply by 8
|
; first multiply by 8
|
||||||
asl AY_REGISTERS+2 ; 5
|
asl ; 2
|
||||||
rol AY_REGISTERS+3 ; 5
|
rol AY_REGISTERS+3 ; 5
|
||||||
asl AY_REGISTERS+2 ; 5
|
asl ; 2
|
||||||
rol AY_REGISTERS+3 ; 5
|
rol AY_REGISTERS+3 ; 5
|
||||||
asl AY_REGISTERS+2 ; 5
|
asl ; 2
|
||||||
rol AY_REGISTERS+3 ; 5
|
rol AY_REGISTERS+3 ; 5
|
||||||
|
|
||||||
; add in original to get 9
|
; add in original to get 9
|
||||||
clc ; 2
|
clc ; 2
|
||||||
lda note_b+NOTE_TONE_L ; 4
|
adc note_b+NOTE_TONE_L ; 4
|
||||||
adc AY_REGISTERS+2 ; 3
|
|
||||||
sta AY_REGISTERS+2 ; 3
|
sta AY_REGISTERS+2 ; 3
|
||||||
lda note_b+NOTE_TONE_H ; 4
|
lda note_b+NOTE_TONE_H ; 4
|
||||||
adc AY_REGISTERS+3 ; 3
|
adc AY_REGISTERS+3 ; 3
|
||||||
sta AY_REGISTERS+3 ; 3
|
|
||||||
|
|
||||||
; divide by 16 to get proper value
|
; divide by 16 to get proper value
|
||||||
ror AY_REGISTERS+3 ; 5
|
ror ; 2
|
||||||
ror AY_REGISTERS+2 ; 5
|
ror AY_REGISTERS+2 ; 5
|
||||||
ror AY_REGISTERS+3 ; 5
|
ror ; 2
|
||||||
ror AY_REGISTERS+2 ; 5
|
ror AY_REGISTERS+2 ; 5
|
||||||
ror AY_REGISTERS+3 ; 5
|
ror ; 2
|
||||||
ror AY_REGISTERS+2 ; 5
|
ror AY_REGISTERS+2 ; 5
|
||||||
ror AY_REGISTERS+3 ; 5
|
ror ; 2
|
||||||
ror AY_REGISTERS+2 ; 5
|
ror AY_REGISTERS+2 ; 5
|
||||||
lda AY_REGISTERS+3 ; 3
|
|
||||||
and #$0f ; 2
|
and #$0f ; 2
|
||||||
sta AY_REGISTERS+3 ; 3
|
sta AY_REGISTERS+3 ; 3
|
||||||
|
|
||||||
no_scale_b:
|
no_scale_b:
|
||||||
|
|
||||||
|
lda convert_177 ; 4
|
||||||
|
cmp #1 ; 2
|
||||||
|
|
||||||
lda note_c+NOTE_TONE_L ; Note C Period L ; 4
|
lda note_c+NOTE_TONE_L ; Note C Period L ; 4
|
||||||
sta AY_REGISTERS+4 ; into R4 ; 3
|
sta AY_REGISTERS+4 ; into R4 ; 3
|
||||||
lda note_c+NOTE_TONE_H ; Note C Period H ; 4
|
lda note_c+NOTE_TONE_H ; Note C Period H ; 4
|
||||||
sta AY_REGISTERS+5 ; into R5 ; 3
|
sta AY_REGISTERS+5 ; into R5 ; 3
|
||||||
|
lda note_c+NOTE_TONE_L ; Note C Period L ; 4
|
||||||
lda convert_177 ; 4
|
bcc no_scale_c ; 2/3
|
||||||
beq no_scale_c ; 2/3
|
|
||||||
|
|
||||||
; Convert from 1.77MHz to 1MHz by multiplying by 9/16
|
; Convert from 1.77MHz to 1MHz by multiplying by 9/16
|
||||||
|
|
||||||
; first multiply by 8
|
; first multiply by 8
|
||||||
asl AY_REGISTERS+4 ; 5
|
asl ; 2
|
||||||
rol AY_REGISTERS+5 ; 5
|
rol AY_REGISTERS+5 ; 5
|
||||||
asl AY_REGISTERS+4 ; 5
|
asl ; 2
|
||||||
rol AY_REGISTERS+5 ; 5
|
rol AY_REGISTERS+5 ; 5
|
||||||
asl AY_REGISTERS+4 ; 5
|
asl ; 2
|
||||||
rol AY_REGISTERS+5 ; 5
|
rol AY_REGISTERS+5 ; 5
|
||||||
|
|
||||||
; add in original to get 9
|
; add in original to get 9
|
||||||
clc ; 2
|
clc ; 2
|
||||||
lda note_c+NOTE_TONE_L ; 4
|
adc note_c+NOTE_TONE_L ; 4
|
||||||
adc AY_REGISTERS+4 ; 3
|
|
||||||
sta AY_REGISTERS+4 ; 3
|
sta AY_REGISTERS+4 ; 3
|
||||||
lda note_c+NOTE_TONE_H ; 4
|
lda note_c+NOTE_TONE_H ; 4
|
||||||
adc AY_REGISTERS+5 ; 3
|
adc AY_REGISTERS+5 ; 3
|
||||||
sta AY_REGISTERS+5 ; 3
|
|
||||||
|
|
||||||
; divide by 16 to get proper value
|
; divide by 16 to get proper value
|
||||||
ror AY_REGISTERS+5 ; 5
|
ror ; 2
|
||||||
ror AY_REGISTERS+4 ; 5
|
ror AY_REGISTERS+4 ; 5
|
||||||
ror AY_REGISTERS+5 ; 5
|
ror ; 2
|
||||||
ror AY_REGISTERS+4 ; 5
|
ror AY_REGISTERS+4 ; 5
|
||||||
ror AY_REGISTERS+5 ; 5
|
ror ; 2
|
||||||
ror AY_REGISTERS+4 ; 5
|
ror AY_REGISTERS+4 ; 5
|
||||||
ror AY_REGISTERS+5 ; 5
|
ror ; 2
|
||||||
ror AY_REGISTERS+4 ; 5
|
ror AY_REGISTERS+4 ; 5
|
||||||
lda AY_REGISTERS+5 ; 3
|
|
||||||
and #$0f ; 2
|
and #$0f ; 2
|
||||||
sta AY_REGISTERS+5 ; 3
|
sta AY_REGISTERS+5 ; 3
|
||||||
|
|
||||||
@ -1953,7 +1952,6 @@ no_scale_c:
|
|||||||
adc pt3_noise_add ; 4
|
adc pt3_noise_add ; 4
|
||||||
and #$1f ; 2
|
and #$1f ; 2
|
||||||
sta AY_REGISTERS+6 ; 3
|
sta AY_REGISTERS+6 ; 3
|
||||||
sta temp_word_l ; 4
|
|
||||||
|
|
||||||
lda convert_177 ; 3
|
lda convert_177 ; 3
|
||||||
beq no_scale_n ; 2/3
|
beq no_scale_n ; 2/3
|
||||||
@ -1961,21 +1959,20 @@ no_scale_c:
|
|||||||
; Convert from 1.77MHz to 1MHz by multiplying by 9/16
|
; Convert from 1.77MHz to 1MHz by multiplying by 9/16
|
||||||
|
|
||||||
; first multiply by 8
|
; first multiply by 8
|
||||||
asl AY_REGISTERS+6 ; 5
|
lda AY_REGISTERS+6 ; 3
|
||||||
asl AY_REGISTERS+6 ; 5
|
asl ; 2
|
||||||
asl AY_REGISTERS+6 ; 5
|
asl ; 2
|
||||||
|
asl ; 2
|
||||||
|
|
||||||
; add in original to get 9
|
; add in original to get 9
|
||||||
clc ; 2
|
clc ; 2
|
||||||
lda temp_word_l ; 4
|
adc temp_word_l ; 4
|
||||||
adc AY_REGISTERS+6 ; 3
|
|
||||||
|
|
||||||
; divide by 16 to get proper value
|
; divide by 16 to get proper value
|
||||||
ror AY_REGISTERS+6 ; 5
|
ror ; 2
|
||||||
ror AY_REGISTERS+6 ; 5
|
ror ; 2
|
||||||
ror AY_REGISTERS+6 ; 5
|
ror ; 2
|
||||||
ror AY_REGISTERS+6 ; 5
|
ror ; 2
|
||||||
lda AY_REGISTERS+6 ; 3
|
|
||||||
and #$1f ; 2
|
and #$1f ; 2
|
||||||
sta AY_REGISTERS+6 ; 3
|
sta AY_REGISTERS+6 ; 3
|
||||||
|
|
||||||
@ -2011,7 +2008,6 @@ no_scale_n:
|
|||||||
clc ; 2
|
clc ; 2
|
||||||
lda pt3_envelope_slide_l ; 4
|
lda pt3_envelope_slide_l ; 4
|
||||||
adc temp_word_l ; 4
|
adc temp_word_l ; 4
|
||||||
sta temp_word_l ; 4
|
|
||||||
sta AY_REGISTERS+11 ; 3
|
sta AY_REGISTERS+11 ; 3
|
||||||
lda temp_word_h ; 4
|
lda temp_word_h ; 4
|
||||||
adc pt3_envelope_slide_h ; 4
|
adc pt3_envelope_slide_h ; 4
|
||||||
@ -2024,32 +2020,30 @@ no_scale_n:
|
|||||||
; Convert from 1.77MHz to 1MHz by multiplying by 9/16
|
; Convert from 1.77MHz to 1MHz by multiplying by 9/16
|
||||||
|
|
||||||
; first multiply by 8
|
; first multiply by 8
|
||||||
asl AY_REGISTERS+11 ; 5
|
lda AY_REGISTERS+11 ; 3
|
||||||
|
asl ; 2
|
||||||
rol AY_REGISTERS+12 ; 5
|
rol AY_REGISTERS+12 ; 5
|
||||||
asl AY_REGISTERS+11 ; 5
|
asl ; 2
|
||||||
rol AY_REGISTERS+12 ; 5
|
rol AY_REGISTERS+12 ; 5
|
||||||
asl AY_REGISTERS+11 ; 5
|
asl ; 2
|
||||||
rol AY_REGISTERS+12 ; 5
|
rol AY_REGISTERS+12 ; 5
|
||||||
|
|
||||||
; add in original to get 9
|
; add in original to get 9
|
||||||
clc ; 2
|
clc ; 2
|
||||||
lda temp_word_l ; 4
|
|
||||||
adc AY_REGISTERS+11 ; 3
|
adc AY_REGISTERS+11 ; 3
|
||||||
sta AY_REGISTERS+11 ; 3
|
sta AY_REGISTERS+11 ; 3
|
||||||
lda temp_word_h ; 4
|
lda temp_word_h ; 4
|
||||||
adc AY_REGISTERS+12 ; 3
|
adc AY_REGISTERS+12 ; 3
|
||||||
sta AY_REGISTERS+12 ; 3
|
|
||||||
|
|
||||||
; divide by 16 to get proper value
|
; divide by 16 to get proper value
|
||||||
ror AY_REGISTERS+12 ; 5
|
ror ; 2
|
||||||
ror AY_REGISTERS+11 ; 5
|
ror AY_REGISTERS+11 ; 5
|
||||||
ror AY_REGISTERS+12 ; 5
|
ror ; 2
|
||||||
ror AY_REGISTERS+11 ; 5
|
ror AY_REGISTERS+11 ; 5
|
||||||
ror AY_REGISTERS+12 ; 5
|
ror ; 2
|
||||||
ror AY_REGISTERS+11 ; 5
|
ror AY_REGISTERS+11 ; 5
|
||||||
ror AY_REGISTERS+12 ; 5
|
ror ; 2
|
||||||
ror AY_REGISTERS+11 ; 5
|
ror AY_REGISTERS+11 ; 5
|
||||||
lda AY_REGISTERS+12 ; 3
|
|
||||||
and #$0f ; 2
|
and #$0f ; 2
|
||||||
sta AY_REGISTERS+12 ; 3
|
sta AY_REGISTERS+12 ; 3
|
||||||
|
|
||||||
@ -2060,15 +2054,13 @@ no_scale_e:
|
|||||||
|
|
||||||
lda pt3_envelope_type ; 4
|
lda pt3_envelope_type ; 4
|
||||||
cmp pt3_envelope_type_old ; 4
|
cmp pt3_envelope_type_old ; 4
|
||||||
|
sta pt3_envelope_type_old ; copy old to new ; 4
|
||||||
bne envelope_diff ; 2/3
|
bne envelope_diff ; 2/3
|
||||||
envelope_same:
|
envelope_same:
|
||||||
lda #$ff ; if same, store $ff ; 2
|
lda #$ff ; if same, store $ff ; 2
|
||||||
envelope_diff:
|
envelope_diff:
|
||||||
sta AY_REGISTERS+13 ; 3
|
sta AY_REGISTERS+13 ; 3
|
||||||
|
|
||||||
lda pt3_envelope_type ; 4
|
|
||||||
sta pt3_envelope_type_old ; copy old to new ; 4
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;==============================
|
;==============================
|
||||||
|
Loading…
x
Reference in New Issue
Block a user