diff --git a/demos/smb/Main.s b/demos/smb/Main.s index ac24834..a90d009 100644 --- a/demos/smb/Main.s +++ b/demos/smb/Main.s @@ -197,15 +197,15 @@ EvtLoop stz nmiCount ; sep #$20 -; lda #1 +; lda #0 ; stal ROMBase+$075f ; stal ROMBase+$0766 -; lda #2 +; lda #3 ; stal ROMBase+$0763 ; stal ROMBase+$075c -; lda #2 +; lda #4 ; stal ROMBase+$0767 ; stal ROMBase+$0760 ; rep #$30 @@ -252,15 +252,59 @@ EvtLoop sta BGToggle pha _GTEEnableBackground + brl EvtLoop :not_b cmp #'g' ; Re-enable VBL-drive game logic bne :not_g stz singleStepMode + brl EvtLoop :not_g - cmp #'r' ; Refresh + cmp #'a' ; Show how much time APU simulation is taking + bne :not_a + lda show_border + eor #$0001 + sta show_border + brl EvtLoop +:not_a + + cmp #'0' + bne :not_0 + stz APU_FORCE_OFF + brl EvtLoop +:not_0 + + cmp #'1' bne :not_1 + lda #$01 + jsr ToggleAPUChannel + brl EvtLoop +:not_1 + + cmp #'2' + bne :not_2 + lda #$02 + jsr ToggleAPUChannel + brl EvtLoop +:not_2 + + cmp #'3' + bne :not_3 + lda #$04 + jsr ToggleAPUChannel + brl EvtLoop +:not_3 + + cmp #'4' + bne :not_4 + lda #$08 + jsr ToggleAPUChannel + brl EvtLoop +:not_4 + + cmp #'r' ; Refresh + bne :not_r jsr CopyStatus lda ROMScreenEdge ; global tile index @@ -269,8 +313,9 @@ EvtLoop ldy #0 jsr CopyNametable brl EvtLoop -:not_1 - cmp #'1' +:not_r + + cmp #'v' bne :not_v lda ROMScreenEdge clc @@ -306,6 +351,19 @@ nmiCount dw 0 DPSave dw 0 LastAreaType dw 0 +; Toggle an APU control bit +ToggleAPUChannel + pha + lda #$0001 + stal APU_FORCE_OFF + pla + + sep #$30 + eorl APU_STATUS + jsl APU_STATUS_FORCE + rep #$30 + rts + ; Convert NES palette entries to IIgs ; X = NES palette (16 color indices) ; A = 32 byte array to write results diff --git a/demos/smb/apu.s b/demos/smb/apu.s index d75f762..a2a2362 100644 --- a/demos/smb/apu.s +++ b/demos/smb/apu.s @@ -108,6 +108,10 @@ copy_instruments_to_doc lda #$0600 jsr copy_noise + + lda #$8000 +; jsr gen_noise + rts ;-------------------------- @@ -193,6 +197,9 @@ copy_triangle mx %00 rts +; Generate random data from the NES APU LFSR. Make it long enough to sound good. +gen_noise + copy_noise sep #$30 mx %11 @@ -232,39 +239,39 @@ triangle_wave hex 60626466686a6c6e70727476787a7c7e noise_wave -; hex 8f968f763e6fd49ab1e564e295a9bcc9 -; hex 717b6629e6970b865dc0e0d840d32a96 -; hex 3bd4c5d407b78923d8c9766bea128e8a -; hex c9ee5ddbed3119ff14b4d9a44bfbb7c4 -; hex 7a56e26e8aac9ebf1653c0260446231b -; hex 73431495fc585e943edacf8f5bb970e6 -; hex 118dc361bee99c98f32d25f06a33715a -; hex 585344f7f3e2f3c36c37cfd78e40147f -; hex a4b20624ac633b42b3aac5407fac4ba9 -; hex a4d71a1d020a7757ea244b103f0b7a76 -; hex 9b533a60cda31e0fa2ce3491b55c4f26 -; hex ea47a61f661deec128129372c3471a9b -; hex f85c3c077168d413184a139440460950 -; hex dee3f9bdb65e162b08ed9231a72fb943 -; hex 1ba599be80dc2812afa63cc2317cdb1a -; hex 8d99d56327bc50dc975bee94754f561b + hex 8f968f763e6fd49ab1e564e295a9bcc9 + hex 717b6629e6970b865dc0e0d840d32a96 + hex 3bd4c5d407b78923d8c9766bea128e8a + hex c9ee5ddbed3119ff14b4d9a44bfbb7c4 + hex 7a56e26e8aac9ebf1653c0260446231b + hex 73431495fc585e943edacf8f5bb970e6 + hex 118dc361bee99c98f32d25f06a33715a + hex 585344f7f3e2f3c36c37cfd78e40147f + hex a4b20624ac633b42b3aac5407fac4ba9 + hex a4d71a1d020a7757ea244b103f0b7a76 + hex 9b533a60cda31e0fa2ce3491b55c4f26 + hex ea47a61f661deec128129372c3471a9b + hex f85c3c077168d413184a139440460950 + hex dee3f9bdb65e162b08ed9231a72fb943 + hex 1ba599be80dc2812afa63cc2317cdb1a + hex 8d99d56327bc50dc975bee94754f561b - hex 01ffffff0101ffffff01ffff01ff0101 - hex ffffffffffff0101ff0101ff01ffff01 - hex 01ff0101ffff01ffff0101ff01ff01ff - hex ffffffff0101010101ffff0101ff0101 - hex ffffff0101ff01ff010101ff01010101 - hex 0101ffffff01ffff01ff01ffff01ffff - hex ff01ffff0101ffff01ffffffffff01ff - hex ffffffffffff010101ffff01ff01ffff - hex 01ffffffff0101ffffffff0101ffff01 - hex ff01ff01ff01ffff0101ff01ffffffff - hex ffff010101ffffffff01010101ff0101 - hex ffffffffffffff01ff0101ffffff0101 - hex 01ff010101ff01ffffffffff01ffffff - hex 01ffffffff010101ff01ffff01ff01ff - hex ffffffff0101ff010101ff01ffffff01 - hex 0101010101ffff01ffff01010101ffff +; hex 01ffffff0101ffffff01ffff01ff0101 +; hex ffffffffffff0101ff0101ff01ffff01 +; hex 01ff0101ffff01ffff0101ff01ff01ff +; hex ffffffff0101010101ffff0101ff0101 +; hex ffffff0101ff01ff010101ff01010101 +; hex 0101ffffff01ffff01ff01ffff01ffff +; hex ff01ffff0101ffff01ffffffffff01ff +; hex ffffffffffff010101ffff01ff01ffff +; hex 01ffffffff0101ffffffff0101ffff01 +; hex ff01ff01ff01ffff0101ff01ffffffff +; hex ffff010101ffffffff01010101ff0101 +; hex ffffffffffffff01ff0101ffffff0101 +; hex 01ff010101ff01ffffffffff01ffffff +; hex 01ffffffff010101ff01ffff01ff01ff +; hex ffffffff0101ff010101ff01ffffff01 +; hex 0101010101ffff01ffff01010101ffff ;-------------------------- @@ -757,7 +764,21 @@ interrupt_handler = * lda #$40+noise_oscillator sta sound_address lda #0 -:set_volume_noise jsr set_pulse_volume +:set_volume_noise + and #$0F + asl + asl + asl + pha + lda APU_NOISE_REG3 ; Up the volume for low sounds + bit #$08 + beq :high_pitch + pla + asl + pha +:high_pitch pla + sta sound_data + :not_timer ldal show_border @@ -1155,19 +1176,30 @@ APU_NOISE_REG4_WRITE ENT ; Lookup from bottom 4 bits of NOISE_REG3 and pre-calculated ensoniq parameters NoisePeriodTable dw 4, 8, 16, 32, 64, 96, 128, 160, 202, 254, 380, 508, 762, 1016, 2034, 4068 -EsqNoiseFreqTable dw 8704, 4352, 2176, 1088, 544, 363, 272, 218, 172, 137, 92, 69, 46, 34, 17, 9 +;EsqNoiseFreqTable dw 8704, 4352, 2176, 1088, 544, 363, 272, 218, 172, 137, 92, 69, 46, 34, 17, 9 +EsqNoiseFreqTable dw 1088, 544, 272, 136, 68, 45,34,27,22,17,12,9,6,4,2,1 APU_FORCE_OFF dw 0 -APU_STATUS_WRITE ENT -; ldal APU_FORCE_OFF -; bne apu_status_exit - APU_STATUS_FORCE phb phk plb pha + bra force_entry + +APU_STATUS_WRITE ENT + phb + phk + plb + pha + + phx + ldx APU_FORCE_OFF + bne force_exit + plx + +force_entry sta APU_STATUS ; From NESDev Wiki: When the enabled bit is cleared (via $4015), the length counter is forced to 0 @@ -1200,6 +1232,10 @@ APU_STATUS_FORCE pla plb - -apu_status_exit + rtl + +force_exit + plx + pla + plb rtl