Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; sound generation:
- ; two output channels buffers
- ; four software channels
- ; first two hard-panned to left, second two hard-panned to right
- ; each channel switchable between either pulse, triangle, saw, and noise
- ; 16-bit oscilators and frequencies for each channel
- ; 4-bit fine tuners for each channel
- ; 8-bit volumes for each channel
- ; 8-bit duty cycle settings for each channel
- ; enable bits for each channel
- ;
- ; music generation:
- ; tempo
- ; ticks per frame
- ; repeat section
- ; each channel has three notes that are arpeggiated to modulate the target frequency
- ; each channel has its own target frequency
- ; each channel has its own frequency sweep speed which is the amount added or substracted from the channel frequency per tick until the target frequency is reached
- ; each channel has its own target volume
- ; each channel has its own volume sweep speed which is the amount added or substracted from the channel volume per tick until the target volume is reached
- ; each channel has its own vibrato settings split between depth and rate which control the effective target frequency
- ; each channel has its own tremolo settings split between depth and rate which control the effective target volume
- ; each channel has its own effect that is to be applied per tick
- ;
- ; song format:
- ; 0x00 - tempo
- ; 0x01 - ticks per frame
- ; 0x02 - repeat low
- ; 0x03 - repeat high
- ; [0x10 - end] - frames
- ;
- ; frame format:
- ; first byte - note
- ; second byte - volume
- ; third byte - effect
- ; fourth byte - arppegio
- ;
- ; effect format:
- ; first nybble - effect
- ; second nybble - argument
- ;
- ; note format:
- ; first nybble - note
- ; second nybble - octave
- ;
- ; notes:
- ; 0x0 - null
- ; 0x1 - same as root (for arppegio notes)
- ; 0x2 - stop
- ; 0x3 - revive
- ; 0x4 - C
- ; 0x5 - C#
- ; 0x6 - D
- ; 0x7 - D#
- ; 0x8 - E
- ; 0x9 - F
- ; 0xA - F#
- ; 0xB - G
- ; 0xC - G#
- ; 0xD - A
- ; 0xE - A#
- ; 0xF - B
- ;
- ; arppegio format:
- ; first nybble - note 2 (above octave of note 1)
- ; second nybble - note 3 (above octave of note 1)
- ;
- ; effects:
- ; 0 - null
- ; 1 - stop effect
- ; 2 - set vibrato rate
- ; 3 - set vibrato depth
- ; 4 - set tremolo rate
- ; 5 - set tremolo depth
- ; 6 - portamento to note
- ; 7 - volume slide
- ; 8 - increment duty cycle
- ; 9 - set duty cycle
- ; A - set waveform
- ; B - increment volume
- ; C - decrement volume
- ; D - set finetune
- .define NOTE_C 262
- .define NOTE_Cs 277
- .define NOTE_D 294
- .define NOTE_Ds 311
- .define NOTE_E 330
- .define NOTE_F 349
- .define NOTE_Fs 370
- .define NOTE_G 392
- .define NOTE_Gs 415
- .define NOTE_A 440
- .define NOTE_As 466
- .define NOTE_B 494
- .def LEFT_BUF = r2
- .def RIGHT_BUF = r3
- .def CHAN1_OSCL = r4
- .def CHAN1_OSCH = r5
- .def CHAN2_OSCL = r6
- .def CHAN2_OSCH = r7
- .def CHAN3_OSCL = r8
- .def CHAN3_OSCH = r9
- .def CHAN4_OSCL = r10
- .def CHAN4_OSCH = r11
- .def CHAN1_FRQL = r12
- .def CHAN1_FRQH = r13
- .def CHAN2_FRQL = r14
- .def CHAN2_FRQH = r15
- .def CHAN3_FRQL = r24
- .def CHAN3_FRQH = r25
- .def CHAN4_FRQL = r26
- .def CHAN4_FRQH = r27
- .def NOISEL = r0
- .def NOISEH = r1
- .def EFF_DIR = r18
- .NOLIST
- .include "m48def.inc"
- .LIST
- .cseg
- .org 0x00
- rjmp start
- .org 0x09
- rjmp timer
- .org 0x40
- start:
- ldi r16, LOW(RAMEND)
- out spl, r16
- ldi r16, HIGH(RAMEND)
- out sph, r16
- ldi r16, 1
- sts TIMSK2, r16
- ldi r16, 0b001
- sts TCCR2B, r16
- ldi r16, 0xFF
- out ddrd, r16
- out ddrc, r16
- ldi r16, 0xFF
- mov LEFT_BUF, r16
- mov RIGHT_BUF, r16
- ldi r16, 0x01
- mov NOISEL, r16
- ldi r16, 0x00
- mov NOISEH, r16
- ldi r16, 0b0000
- sts enable, r16
- ldi r16, 0x08
- sts tempo, r16
- ldi r16, 0x04
- sts speed, r16
- ldi r16, 0x00
- sts chan1_eff, r16
- sts chan2_eff, r16
- sts chan3_eff, r16
- sts chan4_eff, r16
- ldi r16, 0x0F
- sts chan1_vib, r16
- sts chan2_vib, r16
- sts chan3_vib, r16
- sts chan4_vib, r16
- ldi r16, 0x0F
- sts chan1_trm, r16
- sts chan2_trm, r16
- sts chan3_trm, r16
- sts chan4_trm, r16
- ldi r16, 0x80
- sts chan1_tvol, r16
- sts chan2_tvol, r16
- sts chan3_tvol, r16
- sts chan4_tvol, r16
- ldi r16, 0x80
- sts chan1_dut, r16
- sts chan2_dut, r16
- sts chan3_dut, r16
- sts chan4_dut, r16
- ldi r16, 0x44
- sts chan1_notes, r16
- sts chan2_notes, r16
- sts chan3_notes, r16
- sts chan4_notes, r16
- ldi r16, 0x00
- sts chan1_notes + 1, r16
- sts chan2_notes + 1, r16
- sts chan3_notes + 1, r16
- sts chan4_notes + 1, r16
- ldi r16, 0b00000000
- sts waveform, r16
- ldi r16, 0x01
- sts repeat, r16
- ldi ZL, LOW(song_data << 1)
- ldi ZH, HIGH(song_data << 1)
- sei
- loop:
- rjmp loop
- note_freq:
- mov r16, r19
- lsr r16
- lsr r16
- lsr r16
- lsr r16
- cpi r16, 0x04
- breq setc
- cpi r16, 0x05
- breq setcs
- cpi r16, 0x06
- breq setd
- cpi r16, 0x07
- breq setds
- cpi r16, 0x08
- breq sete
- cpi r16, 0x09
- breq setf
- cpi r16, 0x0A
- breq setfs
- cpi r16, 0x0B
- breq setg
- cpi r16, 0x0C
- breq setgs
- cpi r16, 0x0D
- breq seta
- cpi r16, 0x0E
- breq setas
- cpi r16, 0x0F
- breq setb
- ret
- setc:
- ldi r16, LOW(NOTE_C)
- ldi r17, HIGH(NOTE_C)
- rjmp skip4
- setcs:
- ldi r16, LOW(NOTE_Cs)
- ldi r17, HIGH(NOTE_Cs)
- rjmp skip4
- setd:
- ldi r16, LOW(NOTE_D)
- ldi r17, HIGH(NOTE_D)
- rjmp skip4
- setds:
- ldi r16, LOW(NOTE_Ds)
- ldi r17, HIGH(NOTE_Ds)
- rjmp skip4
- sete:
- ldi r16, LOW(NOTE_E)
- ldi r17, HIGH(NOTE_E)
- rjmp skip4
- setf:
- ldi r16, LOW(NOTE_F)
- ldi r17, HIGH(NOTE_F)
- rjmp skip4
- setfs:
- ldi r16, LOW(NOTE_Fs)
- ldi r17, HIGH(NOTE_Fs)
- rjmp skip4
- setg:
- ldi r16, LOW(NOTE_G)
- ldi r17, HIGH(NOTE_G)
- rjmp skip4
- setgs:
- ldi r16, LOW(NOTE_Gs)
- ldi r17, HIGH(NOTE_Gs)
- rjmp skip4
- seta:
- ldi r16, LOW(NOTE_A)
- ldi r17, HIGH(NOTE_A)
- rjmp skip4
- setas:
- ldi r16, LOW(NOTE_As)
- ldi r17, HIGH(NOTE_As)
- rjmp skip4
- setb:
- ldi r16, LOW(NOTE_B)
- ldi r17, HIGH(NOTE_B)
- rjmp skip4
- skip4:
- andi r19, 0x0F
- cpi r19, 0x01
- breq seto1
- cpi r19, 0x02
- breq seto2
- cpi r19, 0x03
- breq seto3
- cpi r19, 0x04
- breq seto4
- cpi r19, 0x05
- breq seto5
- cpi r19, 0x06
- breq seto6
- cpi r19, 0x07
- breq seto7
- cpi r19, 0x08
- breq seto8
- ret
- seto1:
- lsr r17
- ror r16
- lsr r17
- ror r16
- lsr r17
- ror r16
- ret
- seto2:
- lsr r17
- ror r16
- lsr r17
- ror r16
- ret
- seto3:
- lsr r17
- ror r16
- ret
- seto4:
- ret
- seto5:
- lsl r16
- rol r17
- ret
- seto6:
- lsl r16
- rol r17
- lsl r16
- rol r17
- ret
- seto7:
- lsl r16
- rol r17
- lsl r16
- rol r17
- lsl r16
- rol r17
- ret
- seto8:
- lsl r16
- rol r17
- lsl r16
- rol r17
- lsl r16
- rol r17
- lsl r16
- rol r17
- ret
- track:
- cpi ZH, HIGH(song_end << 1)
- brlo continue
- brne loopback
- cpi ZL, LOW(song_end << 1)
- brlo continue
- loopback:
- ldi ZL, LOW(song_data << 1)
- ldi ZH, HIGH(song_data << 1)
- lds r20, repeat
- ldi r21, 0x00
- lsl r20
- rol r21
- lsl r20
- rol r21
- lsl r20
- rol r21
- lsl r20
- rol r21
- add ZL, r20
- adc ZH, r21
- continue:
- ldi r20, 0b0001
- rcall load_command
- ldi r20, 0b0010
- rcall load_command
- ldi r20, 0b0100
- rcall load_command
- ldi r20, 0b1000
- rcall load_command
- ret
- load_command:
- lpm r19, Z+
- rcall handle_note
- lpm r19, Z+
- rcall handle_volume
- lpm r19, Z+
- rcall handle_effect
- lpm r19, Z+
- rcall handle_arps
- ret
- handle_note:
- mov r16, r19
- lsr r16
- lsr r16
- lsr r16
- lsr r16
- cpi r16, 0x00
- breq end_note
- cpi r16, 0x01
- breq end_note
- cpi r16, 0x02
- breq stop_note
- cpi r16, 0x03
- breq start_note
- sbrc r20, 0
- sts chan1_notes, r19
- sbrc r20, 1
- sts chan2_notes, r19
- sbrc r20, 2
- sts chan3_notes, r19
- sbrc r20, 3
- sts chan4_notes, r19
- rjmp start_note
- stop_note:
- lds r21, enable
- sbrc r20, 0
- andi r21, 0b1110
- sbrc r20, 1
- andi r21, 0b1101
- sbrc r20, 2
- andi r21, 0b1011
- sbrc r20, 3
- andi r21, 0b0111
- sts enable, r21
- ret
- start_note:
- lds r21, enable
- sbrc r20, 0
- ori r21, 0b0001
- sbrc r20, 1
- ori r21, 0b0010
- sbrc r20, 2
- ori r21, 0b0100
- sbrc r20, 3
- ori r21, 0b1000
- sts enable, r21
- ret
- end_note:
- ret
- handle_volume:
- cpi r19, 0x00
- breq end_vol
- sbrc r20, 0
- sts chan1_tvol, r19
- sbrc r20, 1
- sts chan2_tvol, r19
- sbrc r20, 2
- sts chan3_tvol, r19
- sbrc r20, 3
- sts chan4_tvol, r19
- end_vol:
- ret
- handle_effect:
- cpi r19, 0x00
- breq end_eff
- sbrc r20, 0
- sts chan1_eff, r19
- sbrc r20, 1
- sts chan2_eff, r19
- sbrc r20, 2
- sts chan3_eff, r19
- sbrc r20, 3
- sts chan4_eff, r19
- end_eff:
- ret
- handle_arps:
- sbrc r20, 0
- sts chan1_notes + 1, r19
- sbrc r20, 1
- sts chan2_notes + 1, r19
- sbrc r20, 2
- sts chan3_notes + 1, r19
- sbrc r20, 3
- sts chan4_notes + 1, r19
- ret
- arpeggio:
- mov r21, r19
- andi r21, 0xF0
- cpi r16, 1
- breq first
- cpi r16, 2
- breq second
- ret
- first:
- andi r20, 0xF0
- andi r19, 0x0F
- cpi r20, 4
- brlo nope2
- cp r21, r20
- brlo nope
- inc r19
- nope:
- or r19, r20
- ret
- second:
- lsl r20
- lsl r20
- lsl r20
- lsl r20
- andi r19, 0x0F
- cpi r20, 4
- brlo nope2
- cp r21, r20
- brlo nope
- inc r19
- nope2:
- or r19, r21
- ret
- music:
- clr r18
- sts music_timer, r18
- sts music_timer + 1, r18
- lds r16, tick_timer
- mov r17, r16
- lsr r17
- lsr r17
- lsr r17
- lsr r17
- andi r16, 0x0F
- inc r17
- lds r18, speed
- cp r17, r18
- brlo no_track
- rcall track
- clr r17
- rjmp okay
- no_track:
- lsl r17
- lsl r17
- lsl r17
- lsl r17
- okay:
- push r16
- push r17
- lds r22, waveform
- lds r16, chan1_eff
- lds r17, chan1_trm
- lds r18, chan1_vib
- lds r19, chan1_dut
- lds r23, chan1_tvol
- rcall apply_effect
- sts chan1_trm, r17
- sts chan1_vib, r18
- sts chan1_dut, r19
- sts chan1_tvol, r23
- sbrs r21, 3
- rjmp skipwav1
- andi r21, 0b0011
- andi r22, 0b11111100
- or r22, r21
- skipwav1:
- lds r16, chan2_eff
- lds r17, chan2_trm
- lds r18, chan2_vib
- lds r19, chan2_dut
- lds r23, chan2_tvol
- lsr r21
- lsr r21
- rcall apply_effect
- sts chan2_trm, r17
- sts chan2_vib, r18
- sts chan2_dut, r19
- sts chan2_tvol, r23
- sbrs r21, 3
- rjmp skipwav2
- andi r21, 0b0011
- andi r22, 0b11110011
- lsl r21
- lsl r21
- or r22, r21
- skipwav2:
- lds r16, chan3_eff
- lds r17, chan3_trm
- lds r18, chan3_vib
- lds r19, chan3_dut
- lds r23, chan3_tvol
- rcall apply_effect
- sts chan3_trm, r17
- sts chan3_vib, r18
- sts chan3_dut, r19
- sts chan3_tvol, r23
- sbrs r21, 3
- rjmp skipwav3
- andi r21, 0b0011
- andi r22, 0b11001111
- lsl r21
- lsl r21
- lsl r21
- lsl r21
- or r22, r21
- skipwav3:
- lds r16, chan4_eff
- lds r17, chan4_trm
- lds r18, chan4_vib
- lds r19, chan4_dut
- lds r23, chan4_tvol
- rcall apply_effect
- sts chan4_trm, r17
- sts chan4_vib, r18
- sts chan4_dut, r19
- sts chan4_tvol, r23
- sbrs r21, 3
- rjmp skipwav4
- andi r21, 0b0011
- andi r22, 0b00111111
- lsl r21
- lsl r21
- lsl r21
- lsl r21
- lsl r21
- lsl r21
- or r22, r21
- skipwav4:
- sts waveform, r22
- pop r17
- pop r16
- lds r18, fine_tune
- push r17
- push r16
- lds r19, chan1_notes
- lds r20, chan1_notes + 1
- rcall arpeggio
- rcall note_freq
- lds r21, chan1_vib
- mov r22, CHAN1_FRQL
- mov r23, CHAN1_FRQH
- rcall sweep
- mov CHAN1_FRQL, r22
- mov CHAN1_FRQH, r23
- mov r19, r18
- andi r19, 0x0F
- add CHAN1_FRQL, r19
- pop r16
- push r16
- lds r19, chan2_notes
- lds r20, chan2_notes + 1
- rcall arpeggio
- rcall note_freq
- lds r21, chan2_vib
- mov r22, CHAN2_FRQL
- mov r23, CHAN2_FRQH
- rcall sweep
- mov CHAN2_FRQL, r22
- mov CHAN2_FRQH, r23
- lsr r18
- lsr r18
- lsr r18
- lsr r18
- add CHAN2_FRQL, r18
- lds r18, fine_tune + 1
- pop r16
- push r16
- lds r19, chan3_notes
- lds r20, chan3_notes + 1
- rcall arpeggio
- rcall note_freq
- lds r21, chan3_vib
- mov r22, CHAN3_FRQL
- mov r23, CHAN3_FRQH
- rcall sweep
- mov CHAN3_FRQL, r22
- mov CHAN3_FRQH, r23
- mov r19, r18
- andi r19, 0x0F
- add CHAN3_FRQL, r19
- pop r16
- push r16
- lds r19, chan4_notes
- lds r20, chan4_notes + 1
- rcall arpeggio
- rcall note_freq
- lds r21, chan4_vib
- mov r22, CHAN4_FRQL
- mov r23, CHAN4_FRQH
- rcall sweep
- mov CHAN4_FRQL, r22
- mov CHAN4_FRQH, r23
- lsr r18
- lsr r18
- lsr r18
- lsr r18
- add CHAN4_FRQL, r18
- pop r16
- pop r17
- inc r16
- cpi r16, 3
- brlo lower
- clr r16
- lower:
- or r17, r16
- sts tick_timer, r17
- lds r16, chan1_trm
- lds r17, chan1_vol
- lds r18, chan1_tvol
- rcall vol_sweep
- sts chan1_vol, r17
- lds r16, chan2_trm
- lds r17, chan2_vol
- lds r18, chan2_tvol
- rcall vol_sweep
- sts chan2_vol, r17
- lds r16, chan3_trm
- lds r17, chan3_vol
- lds r18, chan3_tvol
- rcall vol_sweep
- sts chan3_vol, r17
- lds r16, chan4_trm
- lds r17, chan4_vol
- lds r18, chan4_tvol
- rcall vol_sweep
- sts chan4_vol, r17
- ret
- apply_effect:
- clr r21
- mov r20, r16
- lsr r16
- lsr r16
- lsr r16
- lsr r16
- andi r20, 0x0F
- cpi r16, 0x2
- breq set_vib_rate
- cpi r16, 0x3
- breq set_vib_depth
- cpi r16, 0x4
- breq set_trm_rate
- cpi r16, 0x5
- breq set_trm_depth
- cpi r16, 0x6
- breq set_portamento
- cpi r16, 0x7
- breq set_vol_slide
- cpi r16, 0x8
- breq inc_dut
- cpi r16, 0x9
- breq set_dut
- cpi r16, 0xA
- breq set_wav
- cpi r16, 0xB
- breq inc_vol
- cpi r16, 0xC
- breq dec_vol
- ret
- set_vib_rate:
- lsl r20
- lsl r20
- lsl r20
- lsl r20
- andi r18, 0x0F
- or r18, r20
- ret
- set_vib_depth:
- andi r18, 0xF0
- or r18, r20
- ret
- set_trm_rate:
- lsl r20
- lsl r20
- lsl r20
- lsl r20
- andi r17, 0x0F
- or r17, r20
- ret
- set_trm_depth:
- andi r17, 0xF0
- or r17, r20
- ret
- set_portamento:
- lsl r20
- lsl r20
- lsl r20
- lsl r20
- mov r18, r20
- ret
- set_vol_slide:
- lsl r20
- lsl r20
- lsl r20
- lsl r20
- mov r17, r20
- ret
- inc_dut:
- add r19, r20
- ret
- set_dut:
- lsl r20
- lsl r20
- lsl r20
- lsl r20
- mov r19, r20
- ret
- set_wav:
- ldi r21, 0b1000
- or r21, r20
- ret
- inc_vol:
- add r23, r20
- brcs inc_vol1
- ret
- inc_vol1:
- ldi r23, 0xFF
- ret
- dec_vol:
- sub r23, r20
- brcs dec_vol1
- ret
- dec_vol1:
- ldi r23, 0x00
- ret
- vol_sweep:
- lsr r16
- lsr r16
- lsr r16
- lsr r16
- cpi r16, 0
- breq vol_equal
- cp r17, r18
- brlo vol_smaller
- cp r18, r17
- brlo vol_bigger
- rjmp vol_equal
- vol_smaller:
- add r17, r16
- cp r18, r17
- brlo vol_equal
- ret
- vol_bigger:
- sub r17, r16
- cp r17, r18
- brlo vol_equal
- ret
- vol_equal:
- mov r17, r18
- ret
- sweep:
- lsr r21
- lsr r21
- lsr r21
- lsr r21
- lsl r21
- cpi r21, 0
- breq equal
- cp r23, r17
- brlo smaller
- cp r17, r23
- brlo bigger
- cp r22, r16
- brlo smaller
- cp r16, r22
- brlo bigger
- rjmp equal
- bigger:
- sub r22, r21
- brcc yeah
- dec r23
- yeah:
- rjmp done_big
- done_big:
- cp r23, r17
- brlo equal
- cp r17, r23
- brlo return2
- cp r22, r16
- brlo equal
- rjmp return2
- smaller:
- clr r19
- add r22, r21
- adc r23, r19
- rjmp done_small
- done_small:
- cp r23, r17
- brlo return2
- cp r17, r23
- brlo equal
- cp r22, r16
- brlo return2
- cp r16, r22
- brlo equal
- rjmp return2
- equal:
- mov r22, r16
- mov r23, r17
- return2:
- ret
- timer:
- mov r16, LEFT_BUF
- lsr r16
- lsr r16
- mov r17, RIGHT_BUF
- lsr r17
- lsr r17
- out portd, r16
- out portc, r17
- lds r16, music_timer
- lds r17, music_timer + 1
- ldi r18, 0
- ldi r19, 1
- add r16, r19
- adc r17, r18
- sts music_timer, r16
- sts music_timer + 1, r17
- lds r18, tempo
- cp r17, r18
- brlo no_music
- rcall music
- no_music:
- clr LEFT_BUF
- clr RIGHT_BUF
- add CHAN1_OSCL, CHAN1_FRQL
- adc CHAN1_OSCH, CHAN1_FRQH
- add CHAN2_OSCL, CHAN2_FRQL
- adc CHAN2_OSCH, CHAN2_FRQH
- add CHAN3_OSCL, CHAN3_FRQL
- adc CHAN3_OSCH, CHAN3_FRQH
- add CHAN4_OSCL, CHAN4_FRQL
- adc CHAN4_OSCH, CHAN4_FRQH
- lds r16, waveform
- lds r22, enable
- mov r18, r16
- andi r18, 0b00000011
- mov r19, CHAN1_OSCH
- lds r20, chan1_vol
- lds r21, chan1_dut
- rcall generate
- sbrc r22, 0
- add LEFT_BUF, r17
- lsr r16
- lsr r16
- mov r18, r16
- andi r18, 0b00000011
- mov r19, CHAN2_OSCH
- lds r20, chan2_vol
- lds r21, chan2_dut
- rcall generate
- sbrc r22, 1
- add LEFT_BUF, r17
- lsr r16
- lsr r16
- mov r18, r16
- andi r18, 0b00000011
- mov r19, CHAN3_OSCH
- lds r20, chan3_vol
- lds r21, chan3_dut
- rcall generate
- sbrc r22, 2
- add RIGHT_BUF, r17
- lsr r16
- lsr r16
- mov r18, r16
- andi r18, 0b00000011
- mov r19, CHAN4_OSCH
- lds r20, chan4_vol
- lds r21, chan4_dut
- rcall generate
- sbrc r22, 3
- add RIGHT_BUF, r17
- reti
- generate:
- clr r17
- cpi r18, 0b00
- breq gen_pulse
- cpi r18, 0b01
- breq gen_triangle
- cpi r18, 0b10
- breq gen_saw
- cpi r18, 0b11
- breq gen_noise
- ret
- gen_pulse:
- cp r19, r21
- brlo return
- mov r17, r20
- lsr r17
- lsr r17
- ret
- gen_triangle:
- mov r17, r19
- sbrc r19, 7
- com r17
- rjmp apply_volume
- ret
- gen_saw:
- mov r17, r19
- lsr r17
- lsr r17
- rjmp apply_volume
- ret
- gen_noise:
- clr r21
- clr r19
- sbrc NOISEH, 6
- ser r21
- sbrc NOISEL, 3
- ser r19
- eor r19, r21
- clr r21
- lsl NOISEH
- lsl NOISEL
- adc NOISEH, r21
- sbrc r19, 0
- inc NOISEL
- mov r17, NOISEL
- lsr r17
- rjmp apply_volume
- ret
- apply_volume:
- sbrc r20, 7
- rjmp return
- lsr r17
- sbrc r20, 6
- rjmp return
- lsr r17
- sbrc r20, 5
- rjmp return
- lsr r17
- sbrc r20, 4
- rjmp return
- lsr r17
- sbrc r20, 3
- rjmp return
- lsr r17
- sbrc r20, 2
- rjmp return
- lsr r17
- sbrc r20, 1
- rjmp return
- lsr r17
- return:
- ret
- song_data:
- .db 0x00, 0x00, 0xA0, 0x00 ; pulse 1
- .db 0x00, 0x00, 0xA0, 0x00 ; pulse 2
- .db 0x00, 0x00, 0xA1, 0x00 ; triangle
- .db 0x00, 0x00, 0xA3, 0x00 ; noise
- .db 0x44, 0xFF, 0xCf, 0x00 ; pulse 1
- .db 0x42, 0xFF, 0x88, 0x00 ; pulse 2
- .db 0xB4, 0x70, 0x00, 0x00 ; triangle
- .db 0x40, 0x30, 0xCf, 0x00 ; noise
- .db 0x00, 0x00, 0x92, 0x00 ; pulse 1
- .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
- .db 0x00, 0x00, 0x00, 0x00 ; triangle
- .db 0x20, 0x00, 0x00, 0x00 ; noise
- .db 0x44, 0xFF, 0xCf, 0x00 ; pulse 1
- .db 0x43, 0xFF, 0x00, 0x00 ; pulse 2
- .db 0x75, 0x00, 0x00, 0x00 ; triangle
- .db 0x40, 0x20, 0x00, 0x00 ; noise
- .db 0x44, 0xFF, 0x00, 0x00 ; pulse 1
- .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
- .db 0x00, 0x00, 0x00, 0x00 ; triangle
- .db 0x20, 0x00, 0x00, 0x00 ; noise
- .db 0x44, 0xFF, 0x00, 0x00 ; pulse 1
- .db 0x73, 0xFF, 0x00, 0x00 ; pulse 2
- .db 0xB4, 0x00, 0x00, 0x00 ; triangle
- .db 0x40, 0x50, 0x00, 0x00 ; noise
- .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
- .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
- .db 0x45, 0x00, 0x00, 0x00 ; triangle
- .db 0x20, 0x00, 0x00, 0x00 ; noise
- .db 0xE3, 0xFF, 0x00, 0x00 ; pulse 1
- .db 0x43, 0xFF, 0x00, 0x00 ; pulse 2
- .db 0x75, 0x00, 0x00, 0x00 ; triangle
- .db 0x40, 0x20, 0x00, 0x00 ; noise
- .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
- .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
- .db 0x45, 0x00, 0x00, 0x00 ; triangle
- .db 0x20, 0x00, 0x00, 0x00 ; noise
- .db 0x44, 0xFF, 0x00, 0x00 ; pulse 1
- .db 0x42, 0xFF, 0x00, 0x00 ; pulse 2
- .db 0xB4, 0x00, 0x00, 0x00 ; triangle
- .db 0x40, 0x30, 0x00, 0x00 ; noise
- .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
- .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
- .db 0x20, 0x00, 0x00, 0x00 ; triangle
- .db 0x20, 0x00, 0x00, 0x00 ; noise
- .db 0x00, 0x80, 0x00, 0x00 ; pulse 1
- .db 0x43, 0xFF, 0x00, 0x00 ; pulse 2
- .db 0x75, 0x00, 0x00, 0x00 ; triangle
- .db 0x40, 0x20, 0x00, 0x00 ; noise
- .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
- .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
- .db 0x20, 0x00, 0x00, 0x00 ; triangle
- .db 0x20, 0x00, 0x00, 0x00 ; noise
- .db 0x64, 0xFF, 0x00, 0x00 ; pulse 1
- .db 0x63, 0xFF, 0x00, 0x00 ; pulse 2
- .db 0xB4, 0x00, 0x00, 0x00 ; triangle
- .db 0x40, 0x50, 0x00, 0x00 ; noise
- .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
- .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
- .db 0x45, 0x00, 0x00, 0x00 ; triangle
- .db 0x20, 0x00, 0x00, 0x00 ; noise
- .db 0x00, 0x80, 0x00, 0x00 ; pulse 1
- .db 0x43, 0xFF, 0x00, 0x00 ; pulse 2
- .db 0x75, 0x00, 0x00, 0x00 ; triangle
- .db 0x40, 0x20, 0x00, 0x00 ; noise
- .db 0x74, 0xFF, 0x00, 0x00 ; pulse 1
- .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
- .db 0x45, 0x00, 0x00, 0x00 ; triangle
- .db 0x20, 0x00, 0x00, 0x00 ; noise
- .db 0xC3, 0xFF, 0x00, 0x00 ; pulse 1
- .db 0xE1, 0xFF, 0x00, 0x00 ; pulse 2
- .db 0x94, 0x00, 0x00, 0x00 ; triangle
- .db 0x40, 0x30, 0x00, 0x00 ; noise
- .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
- .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
- .db 0x20, 0x00, 0x00, 0x00 ; triangle
- .db 0x20, 0x00, 0x00, 0x00 ; noise
- .db 0x00, 0x80, 0x00, 0x00 ; pulse 1
- .db 0xE2, 0xFF, 0x00, 0x00 ; pulse 2
- .db 0x65, 0x00, 0x00, 0x00 ; triangle
- .db 0x40, 0x20, 0x00, 0x00 ; noise
- .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
- .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
- .db 0x20, 0x00, 0x00, 0x00 ; triangle
- .db 0x20, 0x00, 0x00, 0x00 ; noise
- .db 0x00, 0x30, 0x00, 0x00 ; pulse 1
- .db 0x63, 0xFF, 0x00, 0x00 ; pulse 2
- .db 0x94, 0x00, 0x00, 0x00 ; triangle
- .db 0x40, 0x50, 0x00, 0x00 ; noise
- .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
- .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
- .db 0xE4, 0x00, 0x00, 0x00 ; triangle
- .db 0x20, 0x00, 0x00, 0x00 ; noise
- .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
- .db 0xE2, 0xFF, 0x00, 0x00 ; pulse 2
- .db 0x65, 0x00, 0x00, 0x00 ; triangle
- .db 0x40, 0x20, 0x00, 0x00 ; noise
- .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
- .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
- .db 0xE4, 0x00, 0x00, 0x00 ; triangle
- .db 0x20, 0x00, 0x00, 0x00 ; noise
- .db 0xB3, 0xFF, 0x00, 0x00 ; pulse 1
- .db 0xF1, 0xFF, 0x00, 0x00 ; pulse 2
- .db 0xB4, 0x00, 0x00, 0x00 ; triangle
- .db 0x40, 0x30, 0x00, 0x00 ; noise
- .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
- .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
- .db 0x20, 0x00, 0x00, 0x00 ; triangle
- .db 0x20, 0x00, 0x00, 0x00 ; noise
- .db 0x00, 0x80, 0x00, 0x00 ; pulse 1
- .db 0xF2, 0xFF, 0x00, 0x00 ; pulse 2
- .db 0x65, 0x00, 0x00, 0x00 ; triangle
- .db 0x40, 0x20, 0x00, 0x00 ; noise
- .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
- .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
- .db 0x20, 0x00, 0x00, 0x00 ; triangle
- .db 0x40, 0x30, 0x00, 0x00 ; noise
- .db 0x00, 0x30, 0x00, 0x00 ; pulse 1
- .db 0x63, 0xFF, 0x00, 0x00 ; pulse 2
- .db 0xB4, 0x00, 0x00, 0x00 ; triangle
- .db 0x40, 0x50, 0x00, 0x00 ; noise
- .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
- .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
- .db 0x65, 0x00, 0x00, 0x00 ; triangle
- .db 0x20, 0x00, 0x00, 0x00 ; noise
- .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
- .db 0xF2, 0xFF, 0x00, 0x00 ; pulse 2
- .db 0x95, 0x00, 0x00, 0x00 ; triangle
- .db 0x40, 0x20, 0x00, 0x00 ; noise
- .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
- .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
- .db 0x65, 0x00, 0x00, 0x00 ; triangle
- .db 0x40, 0x30, 0x00, 0x00 ; noise
- .db 0x00, 0x00, 0x92, 0x00 ; pulse 1
- .db 0x42, 0xFF, 0x88, 0x00 ; pulse 2
- .db 0xB4, 0x70, 0x00, 0x00 ; triangle
- .db 0x40, 0x30, 0x00, 0x00 ; noise
- .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
- .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
- .db 0x00, 0x00, 0x00, 0x00 ; triangle
- .db 0x20, 0x00, 0x00, 0x00 ; noise
- .db 0x44, 0xFF, 0xCf, 0x00 ; pulse 1
- .db 0x43, 0xFF, 0x00, 0x00 ; pulse 2
- .db 0x75, 0x00, 0x00, 0x00 ; triangle
- .db 0x40, 0x20, 0x00, 0x00 ; noise
- .db 0x44, 0xFF, 0x00, 0x00 ; pulse 1
- .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
- .db 0x00, 0x00, 0x00, 0x00 ; triangle
- .db 0x20, 0x00, 0x00, 0x00 ; noise
- .db 0x44, 0xFF, 0x00, 0x00 ; pulse 1
- .db 0x73, 0xFF, 0x00, 0x00 ; pulse 2
- .db 0xB4, 0x00, 0x00, 0x00 ; triangle
- .db 0x40, 0x50, 0x00, 0x00 ; noise
- .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
- .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
- .db 0x45, 0x00, 0x00, 0x00 ; triangle
- .db 0x20, 0x00, 0x00, 0x00 ; noise
- .db 0xE3, 0xFF, 0x00, 0x00 ; pulse 1
- .db 0x43, 0xFF, 0x00, 0x00 ; pulse 2
- .db 0x75, 0x00, 0x00, 0x00 ; triangle
- .db 0x40, 0x20, 0x00, 0x00 ; noise
- .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
- .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
- .db 0x45, 0x00, 0x00, 0x00 ; triangle
- .db 0x20, 0x00, 0x00, 0x00 ; noise
- .db 0x44, 0xFF, 0x00, 0x00 ; pulse 1
- .db 0x42, 0xFF, 0x00, 0x00 ; pulse 2
- .db 0xB4, 0x00, 0x00, 0x00 ; triangle
- .db 0x40, 0x30, 0x00, 0x00 ; noise
- .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
- .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
- .db 0x20, 0x00, 0x00, 0x00 ; triangle
- .db 0x20, 0x00, 0x00, 0x00 ; noise
- .db 0x44, 0xFF, 0x00, 0x00 ; pulse 1
- .db 0x43, 0xFF, 0x00, 0x00 ; pulse 2
- .db 0x75, 0x00, 0x00, 0x00 ; triangle
- .db 0x40, 0x20, 0x00, 0x00 ; noise
- .db 0x64, 0xFF, 0x00, 0x00 ; pulse 1
- .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
- .db 0x20, 0x00, 0x00, 0x00 ; triangle
- .db 0x20, 0x00, 0x00, 0x00 ; noise
- .db 0x74, 0xFF, 0x00, 0x00 ; pulse 1
- .db 0x63, 0xFF, 0x00, 0x00 ; pulse 2
- .db 0xB4, 0x00, 0x00, 0x00 ; triangle
- .db 0x40, 0x50, 0x00, 0x00 ; noise
- .db 0x64, 0xFF, 0x00, 0x00 ; pulse 1
- .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
- .db 0x45, 0x00, 0x00, 0x00 ; triangle
- .db 0x20, 0x00, 0x00, 0x00 ; noise
- .db 0x44, 0xFF, 0x00, 0x00 ; pulse 1
- .db 0x43, 0xFF, 0x00, 0x00 ; pulse 2
- .db 0x75, 0x00, 0x00, 0x00 ; triangle
- .db 0x40, 0x20, 0x00, 0x00 ; noise
- .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
- .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
- .db 0x45, 0x00, 0x00, 0x00 ; triangle
- .db 0x20, 0x00, 0x00, 0x00 ; noise
- .db 0x94, 0xFF, 0x00, 0x00 ; pulse 1
- .db 0x92, 0xFF, 0x00, 0x00 ; pulse 2
- .db 0xC4, 0x00, 0x00, 0x00 ; triangle
- .db 0x40, 0x30, 0x00, 0x00 ; noise
- .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
- .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
- .db 0x20, 0x00, 0x00, 0x00 ; triangle
- .db 0x20, 0x00, 0x00, 0x00 ; noise
- .db 0x00, 0x80, 0x00, 0x00 ; pulse 1
- .db 0x93, 0xFF, 0x00, 0x00 ; pulse 2
- .db 0x75, 0x00, 0x00, 0x00 ; triangle
- .db 0x40, 0x20, 0x00, 0x00 ; noise
- .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
- .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
- .db 0x20, 0x00, 0x00, 0x00 ; triangle
- .db 0x20, 0x00, 0x00, 0x00 ; noise
- .db 0x00, 0x30, 0x00, 0x00 ; pulse 1
- .db 0xC3, 0xFF, 0x00, 0x00 ; pulse 2
- .db 0xC4, 0x00, 0x00, 0x00 ; triangle
- .db 0x40, 0x50, 0x00, 0x00 ; noise
- .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
- .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
- .db 0x45, 0x00, 0x00, 0x00 ; triangle
- .db 0x20, 0x00, 0x00, 0x00 ; noise
- .db 0xB4, 0xFF, 0x00, 0x00 ; pulse 1
- .db 0x93, 0xFF, 0x00, 0x00 ; pulse 2
- .db 0x75, 0x00, 0x00, 0x00 ; triangle
- .db 0x40, 0x20, 0x00, 0x00 ; noise
- .db 0xC4, 0xFF, 0x00, 0x00 ; pulse 1
- .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
- .db 0x45, 0x00, 0x00, 0x00 ; triangle
- .db 0x40, 0x20, 0x00, 0x00 ; noise
- .db 0xB4, 0xFF, 0x00, 0x00 ; pulse 1
- .db 0xB2, 0xFF, 0x00, 0x00 ; pulse 2
- .db 0xB4, 0x00, 0x00, 0x00 ; triangle
- .db 0x40, 0x30, 0x00, 0x00 ; noise
- .db 0xB5, 0xFF, 0x00, 0x00 ; pulse 1
- .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
- .db 0x20, 0x00, 0x00, 0x00 ; triangle
- .db 0x20, 0x00, 0x00, 0x00 ; noise
- .db 0x94, 0xFF, 0x00, 0x00 ; pulse 1
- .db 0xB3, 0xFF, 0x00, 0x00 ; pulse 2
- .db 0xB5, 0x00, 0x00, 0x00 ; triangle
- .db 0x40, 0x20, 0x00, 0x00 ; noise
- .db 0x95, 0xFF, 0x00, 0x00 ; pulse 1
- .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
- .db 0x20, 0x00, 0x00, 0x00 ; triangle
- .db 0x20, 0x00, 0x00, 0x00 ; noise
- .db 0x74, 0xFF, 0x00, 0x00 ; pulse 1
- .db 0xF3, 0xFF, 0x00, 0x00 ; pulse 2
- .db 0xF4, 0x00, 0x00, 0x00 ; triangle
- .db 0x40, 0x50, 0x00, 0x00 ; noise
- .db 0x75, 0xFF, 0x00, 0x00 ; pulse 1
- .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
- .db 0x65, 0x00, 0x00, 0x00 ; triangle
- .db 0x20, 0x00, 0x00, 0x00 ; noise
- .db 0x64, 0xFF, 0x00, 0x00 ; pulse 1
- .db 0xB3, 0xFF, 0x00, 0x00 ; pulse 2
- .db 0x95, 0x00, 0x00, 0x00 ; triangle
- .db 0x40, 0x50, 0x00, 0x00 ; noise
- .db 0x65, 0xFF, 0x00, 0x00 ; pulse 1
- .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
- .db 0x65, 0x00, 0x00, 0x00 ; triangle
- .db 0x40, 0x50, 0x00, 0x00 ; noise
- song_end:
- .dseg
- chan1_vol: .byte 1
- chan2_vol: .byte 1
- chan3_vol: .byte 1
- chan4_vol: .byte 1
- chan1_dut: .byte 1
- chan2_dut: .byte 1
- chan3_dut: .byte 1
- chan4_dut: .byte 1
- fine_tune: .byte 2
- waveform: .byte 1
- enable: .byte 1
- music_timer: .byte 2
- tick_timer: .byte 1
- tempo: .byte 1
- speed: .byte 1
- repeat: .byte 1
- chan1_tvol: .byte 1
- chan2_tvol: .byte 1
- chan3_tvol: .byte 1
- chan4_tvol: .byte 1
- chan1_notes: .byte 2
- chan2_notes: .byte 2
- chan3_notes: .byte 2
- chan4_notes: .byte 2
- chan1_vib: .byte 1
- chan2_vib: .byte 1
- chan3_vib: .byte 1
- chan4_vib: .byte 1
- chan1_trm: .byte 1
- chan2_trm: .byte 1
- chan3_trm: .byte 1
- chan4_trm: .byte 1
- chan1_eff: .byte 1
- chan2_eff: .byte 1
- chan3_eff: .byte 1
- chan4_eff: .byte 1
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement