mirror of
https://github.com/lscharen/iigs-game-engine.git
synced 2025-02-20 05:29:10 +00:00
Add second set of oscillators to output to L and R channels
This commit is contained in:
parent
b2ead87d25
commit
f6371f914e
168
demos/smb/apu.s
168
demos/smb/apu.s
@ -287,16 +287,24 @@ setup_doc_registers
|
|||||||
|
|
||||||
jsr access_doc_registers
|
jsr access_doc_registers
|
||||||
|
|
||||||
ldx #pulse1_sound_settings
|
ldx #pulse1_sound_settings_l
|
||||||
|
jsr copy_register_config
|
||||||
|
ldx #pulse1_sound_settings_r
|
||||||
jsr copy_register_config
|
jsr copy_register_config
|
||||||
|
|
||||||
ldx #pulse2_sound_settings
|
ldx #pulse2_sound_settings_l
|
||||||
|
jsr copy_register_config
|
||||||
|
ldx #pulse2_sound_settings_r
|
||||||
jsr copy_register_config
|
jsr copy_register_config
|
||||||
|
|
||||||
ldx #triangle_sound_settings
|
ldx #triangle_sound_settings_l
|
||||||
|
jsr copy_register_config
|
||||||
|
ldx #triangle_sound_settings_r
|
||||||
jsr copy_register_config
|
jsr copy_register_config
|
||||||
|
|
||||||
ldx #noise_sound_settings
|
ldx #noise_sound_settings_l
|
||||||
|
jsr copy_register_config
|
||||||
|
ldx #noise_sound_settings_r
|
||||||
jsr copy_register_config
|
jsr copy_register_config
|
||||||
|
|
||||||
rep #$20
|
rep #$20
|
||||||
@ -388,7 +396,7 @@ pulse2_oscillator = 2
|
|||||||
triangle_oscillator = 4
|
triangle_oscillator = 4
|
||||||
noise_oscillator = 6
|
noise_oscillator = 6
|
||||||
default_freq = 800
|
default_freq = 800
|
||||||
pulse1_sound_settings = *
|
pulse1_sound_settings_l = *
|
||||||
dfb $00+pulse1_oscillator,default_freq ; frequency low register
|
dfb $00+pulse1_oscillator,default_freq ; frequency low register
|
||||||
dfb $20+pulse1_oscillator,default_freq/256 ; frequency high register
|
dfb $20+pulse1_oscillator,default_freq/256 ; frequency high register
|
||||||
dfb $40+pulse1_oscillator,0 ; volume register, volume = 0
|
dfb $40+pulse1_oscillator,0 ; volume register, volume = 0
|
||||||
@ -396,7 +404,15 @@ pulse1_sound_settings = *
|
|||||||
dfb $c0+pulse1_oscillator,0 ; wavetable size register, 256 byte length
|
dfb $c0+pulse1_oscillator,0 ; wavetable size register, 256 byte length
|
||||||
dfb $a0+pulse1_oscillator,0 ; mode register, set to free run
|
dfb $a0+pulse1_oscillator,0 ; mode register, set to free run
|
||||||
|
|
||||||
pulse2_sound_settings = *
|
pulse1_sound_settings_r = *
|
||||||
|
dfb $01+pulse1_oscillator,default_freq ; frequency low register
|
||||||
|
dfb $21+pulse1_oscillator,default_freq/256 ; frequency high register
|
||||||
|
dfb $41+pulse1_oscillator,0 ; volume register, volume = 0
|
||||||
|
dfb $81+pulse1_oscillator,3 ; wavetable pointer register, point to $0300 by default (50% duty cycle)
|
||||||
|
dfb $c1+pulse1_oscillator,0 ; wavetable size register, 256 byte length
|
||||||
|
dfb $a1+pulse1_oscillator,$10 ; mode register, set to free run
|
||||||
|
|
||||||
|
pulse2_sound_settings_l = *
|
||||||
dfb $00+pulse2_oscillator,default_freq ; frequency low register
|
dfb $00+pulse2_oscillator,default_freq ; frequency low register
|
||||||
dfb $20+pulse2_oscillator,default_freq/256 ; frequency high register
|
dfb $20+pulse2_oscillator,default_freq/256 ; frequency high register
|
||||||
dfb $40+pulse2_oscillator,0 ; volume register, volume = 0
|
dfb $40+pulse2_oscillator,0 ; volume register, volume = 0
|
||||||
@ -404,7 +420,15 @@ pulse2_sound_settings = *
|
|||||||
dfb $c0+pulse2_oscillator,0 ; wavetable size register, 256 byte length
|
dfb $c0+pulse2_oscillator,0 ; wavetable size register, 256 byte length
|
||||||
dfb $a0+pulse2_oscillator,0 ; mode register, set to free run
|
dfb $a0+pulse2_oscillator,0 ; mode register, set to free run
|
||||||
|
|
||||||
triangle_sound_settings = *
|
pulse2_sound_settings_r = *
|
||||||
|
dfb $01+pulse2_oscillator,default_freq ; frequency low register
|
||||||
|
dfb $21+pulse2_oscillator,default_freq/256 ; frequency high register
|
||||||
|
dfb $41+pulse2_oscillator,0 ; volume register, volume = 0
|
||||||
|
dfb $81+pulse2_oscillator,3 ; wavetable pointer register, point to $0300 by default (50% duty cycle)
|
||||||
|
dfb $c1+pulse2_oscillator,0 ; wavetable size register, 256 byte length
|
||||||
|
dfb $a1+pulse2_oscillator,$10 ; mode register, set to free run
|
||||||
|
|
||||||
|
triangle_sound_settings_l = *
|
||||||
dfb $00+triangle_oscillator,default_freq ; frequency low register
|
dfb $00+triangle_oscillator,default_freq ; frequency low register
|
||||||
dfb $20+triangle_oscillator,default_freq/256 ; frequency high register
|
dfb $20+triangle_oscillator,default_freq/256 ; frequency high register
|
||||||
dfb $40+triangle_oscillator,0 ; volume register, volume = 0
|
dfb $40+triangle_oscillator,0 ; volume register, volume = 0
|
||||||
@ -412,7 +436,15 @@ triangle_sound_settings = *
|
|||||||
dfb $c0+triangle_oscillator,0 ; wavetable size register, 256 byte length
|
dfb $c0+triangle_oscillator,0 ; wavetable size register, 256 byte length
|
||||||
dfb $a0+triangle_oscillator,0 ; mode register, set to free run
|
dfb $a0+triangle_oscillator,0 ; mode register, set to free run
|
||||||
|
|
||||||
noise_sound_settings = *
|
triangle_sound_settings_r = *
|
||||||
|
dfb $01+triangle_oscillator,default_freq ; frequency low register
|
||||||
|
dfb $21+triangle_oscillator,default_freq/256 ; frequency high register
|
||||||
|
dfb $41+triangle_oscillator,0 ; volume register, volume = 0
|
||||||
|
dfb $81+triangle_oscillator,5 ; wavetable pointer register, point to $0500
|
||||||
|
dfb $c1+triangle_oscillator,0 ; wavetable size register, 256 byte length
|
||||||
|
dfb $a1+triangle_oscillator,$10 ; mode register, set to free run
|
||||||
|
|
||||||
|
noise_sound_settings_l = *
|
||||||
dfb $00+noise_oscillator,default_freq ; frequency low register
|
dfb $00+noise_oscillator,default_freq ; frequency low register
|
||||||
dfb $20+noise_oscillator,default_freq/256 ; frequency high register
|
dfb $20+noise_oscillator,default_freq/256 ; frequency high register
|
||||||
dfb $40+noise_oscillator,128 ; volume register, volume = 0
|
dfb $40+noise_oscillator,128 ; volume register, volume = 0
|
||||||
@ -420,6 +452,15 @@ noise_sound_settings = *
|
|||||||
dfb $c0+noise_oscillator,0 ; wavetable size register, 256 byte length
|
dfb $c0+noise_oscillator,0 ; wavetable size register, 256 byte length
|
||||||
dfb $a0+noise_oscillator,0 ; mode register, set to free run
|
dfb $a0+noise_oscillator,0 ; mode register, set to free run
|
||||||
|
|
||||||
|
noise_sound_settings_r = *
|
||||||
|
dfb $01+noise_oscillator,default_freq ; frequency low register
|
||||||
|
dfb $21+noise_oscillator,default_freq/256 ; frequency high register
|
||||||
|
dfb $41+noise_oscillator,128 ; volume register, volume = 0
|
||||||
|
dfb $81+noise_oscillator,6 ; wavetable pointer register, point to $0600
|
||||||
|
dfb $c1+noise_oscillator,0 ; wavetable size register, 256 byte length
|
||||||
|
dfb $a1+noise_oscillator,$10 ; mode register, set to free run
|
||||||
|
|
||||||
|
|
||||||
backup_interrupt_ptr ds 4
|
backup_interrupt_ptr ds 4
|
||||||
apu_mode ds 2
|
apu_mode ds 2
|
||||||
|
|
||||||
@ -703,22 +744,25 @@ update_doc_registers
|
|||||||
sta _apu_pulse1_last_period
|
sta _apu_pulse1_last_period
|
||||||
jsr get_pulse_freq ; return freq in 16-bit accumulator
|
jsr get_pulse_freq ; return freq in 16-bit accumulator
|
||||||
sep #$30
|
sep #$30
|
||||||
|
|
||||||
ldx #$00+pulse1_oscillator
|
ldx #$00+pulse1_oscillator
|
||||||
stx sound_address
|
jsr set_osc_register_pair
|
||||||
sta sound_data
|
; stx sound_address
|
||||||
|
; sta sound_data
|
||||||
ldx #$20+pulse1_oscillator
|
ldx #$20+pulse1_oscillator
|
||||||
stx sound_address
|
; stx sound_address
|
||||||
xba
|
xba
|
||||||
sta sound_data
|
jsr set_osc_register_pair
|
||||||
|
; sta sound_data
|
||||||
:freq_end_pulse1 sep #$30 ; redundent, but avoids extra branches
|
:freq_end_pulse1 sep #$30 ; redundent, but avoids extra branches
|
||||||
|
|
||||||
lda #$80+pulse1_oscillator
|
ldx #$80+pulse1_oscillator
|
||||||
sta sound_address
|
; sta sound_address
|
||||||
lda APU_PULSE1_REG1 ; Get the cycle duty bits
|
lda APU_PULSE1_REG1 ; Get the cycle duty bits
|
||||||
jsr set_pulse_duty_cycle
|
jsr set_pulse_duty_cycle
|
||||||
|
|
||||||
lda #$40+pulse1_oscillator
|
ldx #$40+pulse1_oscillator
|
||||||
sta sound_address
|
; sta sound_address
|
||||||
lda APU_PULSE1_REG1
|
lda APU_PULSE1_REG1
|
||||||
bit #PULSE_CONST_VOL_FLAG ; Check the constant volume bit
|
bit #PULSE_CONST_VOL_FLAG ; Check the constant volume bit
|
||||||
bne :set_volume_pulse1
|
bne :set_volume_pulse1
|
||||||
@ -727,11 +771,12 @@ update_doc_registers
|
|||||||
|
|
||||||
:mute_pulse1
|
:mute_pulse1
|
||||||
sep #$30
|
sep #$30
|
||||||
lda #$40+pulse1_oscillator
|
ldx #$40+pulse1_oscillator
|
||||||
sta sound_address
|
; sta sound_address
|
||||||
lda #0
|
lda #0
|
||||||
:set_volume_pulse1 jsr set_pulse_volume
|
:set_volume_pulse1 jsr set_pulse_volume
|
||||||
|
|
||||||
|
|
||||||
; Now do the second square wave
|
; Now do the second square wave
|
||||||
lda APU_PULSE2_MUTE ; If the sweep muted the channel, no output
|
lda APU_PULSE2_MUTE ; If the sweep muted the channel, no output
|
||||||
bne :mute_pulse2
|
bne :mute_pulse2
|
||||||
@ -748,21 +793,23 @@ update_doc_registers
|
|||||||
jsr get_pulse_freq ; return freq in 16-bic accumulator
|
jsr get_pulse_freq ; return freq in 16-bic accumulator
|
||||||
sep #$30
|
sep #$30
|
||||||
ldx #$00+pulse2_oscillator
|
ldx #$00+pulse2_oscillator
|
||||||
stx sound_address
|
; stx sound_address
|
||||||
sta sound_data
|
; sta sound_data
|
||||||
|
jsr set_osc_register_pair
|
||||||
ldx #$20+pulse2_oscillator
|
ldx #$20+pulse2_oscillator
|
||||||
stx sound_address
|
; stx sound_address
|
||||||
xba
|
xba
|
||||||
sta sound_data
|
; sta sound_data
|
||||||
|
jsr set_osc_register_pair
|
||||||
:freq_end_pulse2 sep #$30
|
:freq_end_pulse2 sep #$30
|
||||||
|
|
||||||
lda #$80+pulse2_oscillator
|
ldx #$80+pulse2_oscillator
|
||||||
sta sound_address
|
; sta sound_address
|
||||||
lda APU_PULSE2_REG1 ; Get the cycle duty bits
|
lda APU_PULSE2_REG1 ; Get the cycle duty bits
|
||||||
jsr set_pulse_duty_cycle
|
jsr set_pulse_duty_cycle
|
||||||
|
|
||||||
lda #$40+pulse2_oscillator
|
ldx #$40+pulse2_oscillator
|
||||||
sta sound_address
|
; sta sound_address
|
||||||
lda APU_PULSE2_REG1
|
lda APU_PULSE2_REG1
|
||||||
bit #PULSE_CONST_VOL_FLAG ; Check the constant volume bit
|
bit #PULSE_CONST_VOL_FLAG ; Check the constant volume bit
|
||||||
bne :set_volume_pulse2
|
bne :set_volume_pulse2
|
||||||
@ -770,8 +817,8 @@ update_doc_registers
|
|||||||
bra :set_volume_pulse2
|
bra :set_volume_pulse2
|
||||||
:mute_pulse2
|
:mute_pulse2
|
||||||
sep #$30
|
sep #$30
|
||||||
lda #$40+pulse2_oscillator
|
ldx #$40+pulse2_oscillator
|
||||||
sta sound_address
|
; sta sound_address
|
||||||
lda #0
|
lda #0
|
||||||
:set_volume_pulse2 jsr set_pulse_volume
|
:set_volume_pulse2 jsr set_pulse_volume
|
||||||
|
|
||||||
@ -802,23 +849,25 @@ update_doc_registers
|
|||||||
lsr
|
lsr
|
||||||
sep #$30
|
sep #$30
|
||||||
ldx #$00+triangle_oscillator
|
ldx #$00+triangle_oscillator
|
||||||
stx sound_address
|
; stx sound_address
|
||||||
sta sound_data
|
; sta sound_data
|
||||||
|
jsr set_osc_register_pair
|
||||||
ldx #$20+triangle_oscillator
|
ldx #$20+triangle_oscillator
|
||||||
stx sound_address
|
; stx sound_address
|
||||||
xba
|
xba
|
||||||
sta sound_data
|
; sta sound_data
|
||||||
|
jsr set_osc_register_pair
|
||||||
:freq_end_triangle sep #$30
|
:freq_end_triangle sep #$30
|
||||||
|
|
||||||
lda #$40+triangle_oscillator
|
ldx #$40+triangle_oscillator
|
||||||
sta sound_address
|
; sta sound_address
|
||||||
lda #12 ; Triangle is a bit softer than pulse channels
|
lda #12 ; Triangle is a bit softer than pulse channels
|
||||||
bra :set_volume_triangle
|
bra :set_volume_triangle
|
||||||
|
|
||||||
:mute_triangle
|
:mute_triangle
|
||||||
sep #$30
|
sep #$30
|
||||||
lda #$40+triangle_oscillator
|
ldx #$40+triangle_oscillator
|
||||||
sta sound_address
|
; sta sound_address
|
||||||
lda #0
|
lda #0
|
||||||
:set_volume_triangle jsr set_pulse_volume
|
:set_volume_triangle jsr set_pulse_volume
|
||||||
|
|
||||||
@ -828,24 +877,26 @@ update_doc_registers
|
|||||||
beq :mute_noise
|
beq :mute_noise
|
||||||
|
|
||||||
ldx #$00+noise_oscillator
|
ldx #$00+noise_oscillator
|
||||||
stx sound_address
|
; stx sound_address
|
||||||
lda APU_NOISE_CURRENT_PERIOD
|
lda APU_NOISE_CURRENT_PERIOD
|
||||||
sta sound_data
|
; sta sound_data
|
||||||
|
jsr set_osc_register_pair
|
||||||
ldx #$20+noise_oscillator
|
ldx #$20+noise_oscillator
|
||||||
stx sound_address
|
; stx sound_address
|
||||||
lda APU_NOISE_CURRENT_PERIOD+1
|
lda APU_NOISE_CURRENT_PERIOD+1
|
||||||
sta sound_data
|
; sta sound_data
|
||||||
|
jsr set_osc_register_pair
|
||||||
|
|
||||||
lda #$40+noise_oscillator
|
ldx #$40+noise_oscillator
|
||||||
sta sound_address
|
; sta sound_address
|
||||||
lda APU_NOISE_REG1
|
lda APU_NOISE_REG1
|
||||||
bit #NOISE_CONST_VOL_FLAG ; Check the constant volume bit
|
bit #NOISE_CONST_VOL_FLAG ; Check the constant volume bit
|
||||||
bne :set_volume_noise
|
bne :set_volume_noise
|
||||||
lda APU_NOISE_ENVELOPE
|
lda APU_NOISE_ENVELOPE
|
||||||
bra :set_volume_noise
|
bra :set_volume_noise
|
||||||
:mute_noise
|
:mute_noise
|
||||||
lda #$40+noise_oscillator
|
ldx #$40+noise_oscillator
|
||||||
sta sound_address
|
; sta sound_address
|
||||||
lda #0
|
lda #0
|
||||||
:set_volume_noise
|
:set_volume_noise
|
||||||
and #$0F
|
and #$0F
|
||||||
@ -860,7 +911,8 @@ update_doc_registers
|
|||||||
asl
|
asl
|
||||||
pha
|
pha
|
||||||
:high_pitch pla
|
:high_pitch pla
|
||||||
sta sound_data
|
; sta sound_data
|
||||||
|
jsr set_osc_register_pair
|
||||||
|
|
||||||
:not_timer
|
:not_timer
|
||||||
no_frame
|
no_frame
|
||||||
@ -875,17 +927,30 @@ no_frame
|
|||||||
clc
|
clc
|
||||||
rtl
|
rtl
|
||||||
|
|
||||||
|
; X = addr
|
||||||
|
; A = data
|
||||||
|
set_osc_register_pair
|
||||||
|
mx %11
|
||||||
|
stx sound_address
|
||||||
|
sta sound_data
|
||||||
|
inc sound_address
|
||||||
|
sta sound_data
|
||||||
|
rts
|
||||||
|
|
||||||
|
; X = addr
|
||||||
|
; A = duty cycle select
|
||||||
set_pulse_duty_cycle
|
set_pulse_duty_cycle
|
||||||
mx %11
|
mx %11
|
||||||
rol
|
rol
|
||||||
rol
|
rol
|
||||||
rol
|
rol
|
||||||
and #$03
|
and #$03
|
||||||
tax
|
tay
|
||||||
|
|
||||||
lda duty_cycle_page,x
|
lda duty_cycle_page,y
|
||||||
sta sound_data
|
jmp set_osc_register_pair
|
||||||
rts
|
; sta sound_data
|
||||||
|
; rts
|
||||||
|
|
||||||
set_pulse_volume
|
set_pulse_volume
|
||||||
and #$0F
|
and #$0F
|
||||||
@ -893,8 +958,9 @@ set_pulse_volume
|
|||||||
asl
|
asl
|
||||||
asl
|
asl
|
||||||
asl
|
asl
|
||||||
sta sound_data
|
jmp set_osc_register_pair
|
||||||
rts
|
; sta sound_data
|
||||||
|
; rts
|
||||||
|
|
||||||
; This is a bit different because we actually calculate a scan rate directly to match the
|
; This is a bit different because we actually calculate a scan rate directly to match the
|
||||||
; rate at which new samples are read form DOC RAM to the period of the noise channel
|
; rate at which new samples are read form DOC RAM to the period of the noise channel
|
||||||
|
Loading…
x
Reference in New Issue
Block a user