Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .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
- .NOLIST
- .include "m48def.inc"
- .LIST
- .cseg
- .org 0x00
- rjmp start
- .org 0x09
- rjmp timer
- 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, 0b0011
- sts enable, r16
- ldi r16, 0b00000000
- sts waveform, r16
- ldi r16, 0x80
- sts chan1_tdut, r16
- sts chan2_tdut, r16
- sts chan3_tdut, r16
- sts chan4_tdut, r16
- ldi r16, 0xFF
- sts chan1_tvol, r16
- sts chan2_tvol, r16
- sts chan3_tvol, r16
- sts chan4_tvol, r16
- ldi r16, 0x01
- ldi r17, 0x00
- mov NOISEL, r16
- mov NOISEH, r17
- ldi r16, 0x00
- sts tick_timer, r16
- sts tick_timer + 1, r16
- ldi r16, 0xF0
- sts chan1_env + 1, r16
- sts chan2_env + 1, r16
- sts chan3_env + 1, r16
- sts chan4_env + 1, r16
- ldi r16, 0x00
- sts chan1_notes, r16
- ldi r16, 0x00
- sts chan2_notes, r16
- ldi r16, 0x00
- sts chan3_notes, r16
- ldi r16, 0x00
- sts chan4_notes, r16
- ldi r16, 0x00
- sts chan1_notes + 1, r16
- ldi r16, 0x00
- sts chan2_notes + 1, r16
- ldi r16, 0x00
- sts chan3_notes + 1, r16
- ldi r16, 0x00
- sts chan4_notes + 1, r16
- ldi r16, 0b0000
- sts note_on, r16
- sei
- loop:
- rjmp loop
- timer:
- mov r16, LEFT_BUF
- lsr r16
- lsr r16
- mov r17, RIGHT_BUF
- lsr r17
- lsr r17
- out portd, r16
- out portc, r17
- 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
- lds r16, tick_timer
- cpi r16, 0x00
- brne skip22
- lds r20, vol_slide_dir
- lds r16, chan1_tvol
- lds r17, chan1_vol_slide
- sbrc r20, 0
- rjmp up1b
- sbc r16, r17
- brcc down1b
- clr r16
- up1b:
- add r16, r17
- brcc down1b
- ser r16
- down1b:
- sts chan1_tvol, r16
- sts chan1_ptrm, r16
- lds r16, chan2_tvol
- lds r17, chan2_vol_slide
- sbrc r20, 1
- rjmp up2b
- sbc r16, r17
- brcc down2b
- clr r16
- up2b:
- add r16, r17
- brcc down2b
- ser r16
- down2b:
- sts chan2_tvol, r16
- sts chan2_ptrm, r16
- rjmp skip23
- skip22:
- rjmp skip2
- skip23:
- lds r16, chan3_tvol
- lds r17, chan3_vol_slide
- sbrc r20, 2
- rjmp up3b
- sbc r16, r17
- brcc down3b
- clr r16
- up3b:
- add r16, r17
- brcc down3b
- ser r16
- down3b:
- sts chan3_tvol, r16
- sts chan3_ptrm, r16
- lds r16, chan4_tvol
- lds r17, chan4_vol_slide
- sbrc r20, 3
- rjmp up4b
- sbc r16, r17
- brcc down4b
- clr r16
- up4b:
- add r16, r17
- brcc down4b
- ser r16
- down4b:
- sts chan4_tvol, r16
- sts chan4_ptrm, r16
- rjmp skip3
- skip2:
- rjmp skip
- skip3:
- lds r16, note_on
- lds r17, chan1_notes + 1
- cpi r17, 0x00
- breq skip11
- ori r16, 0b0001
- skip11:
- sbrs r16, 0
- rjmp skip7
- andi r16, 0b1110
- sts note_on, r16
- lds r16, chan1_notes
- lds r17, chan1_notes + 1
- rcall handle_note
- sts chan1_tpit, r16
- sts chan1_tpit + 1, r17
- skip7:
- lds r16, note_on
- lds r17, chan2_notes + 1
- cpi r17, 0x00
- breq skip12
- ori r16, 0b0010
- skip12:
- sbrs r16, 1
- rjmp skip8
- andi r16, 0b1101
- sts note_on, r16
- lds r16, chan2_notes
- lds r17, chan2_notes + 1
- rcall handle_note
- sts chan2_tpit, r16
- sts chan2_tpit + 1, r17
- skip8:
- lds r16, note_on
- lds r17, chan3_notes + 1
- cpi r17, 0x00
- breq skip13
- ori r16, 0b0100
- skip13:
- sbrs r16, 2
- rjmp skip9
- andi r16, 0b1011
- sts note_on, r16
- lds r16, chan3_notes
- lds r17, chan3_notes + 1
- rcall handle_note
- sts chan3_tpit, r16
- sts chan3_tpit + 1, r17
- skip9:
- lds r16, note_on
- lds r17, chan4_notes + 1
- cpi r17, 0x00
- breq skip14
- ori r16, 0b1000
- skip14:
- sbrs r16, 3
- rjmp skip10
- andi r16, 0b0111
- sts note_on, r16
- lds r16, chan4_notes
- lds r17, chan4_notes + 1
- rcall handle_note
- sts chan4_tpit, r16
- sts chan4_tpit + 1, r17
- skip10:
- lds CHAN1_FRQL, chan1_pvib
- lds CHAN1_FRQH, chan1_pvib + 1
- lds CHAN2_FRQL, chan2_pvib
- lds CHAN2_FRQH, chan2_pvib + 1
- lds CHAN3_FRQL, chan3_pvib
- lds CHAN3_FRQH, chan3_pvib + 1
- lds CHAN4_FRQL, chan4_pvib
- lds CHAN4_FRQH, chan4_pvib + 1
- lds r21, slide_timer
- inc r21
- cpi r21, 0x4
- brne skip15
- clr r21
- skip15:
- sts slide_timer, r21
- cpi r21, 0x00
- brne skip16
- ser r21
- rjmp skip17
- skip16:
- clr r21
- skip17:
- lds r20, pit_slide_dir
- lds r16, chan1_tpit
- lds r17, chan1_tpit + 1
- sbrs r21, 0
- rjmp skip18
- lds r18, chan1_pit_slide
- ldi r19, 0x00
- sbrc r20, 0
- rjmp up1
- cpi r17, 0x00
- brne down1a
- cpi r16, 0x00
- breq down1
- down1a:
- sbc r16, r18
- brcc down1
- dec r17
- rjmp down1
- up1:
- add r16, r18
- adc r17, r19
- down1:
- sts chan1_tpit, r16
- sts chan1_tpit + 1, r17
- skip18:
- sbrs r21, 0
- rjmp port1
- lds r18, chan1_port
- cpi r18, 0x00
- breq skip_port1
- cp CHAN1_FRQH, r17
- brlo higher1
- cp r17, CHAN1_FRQH
- brlo lower1
- cp CHAN1_FRQL, r16
- brlo higher1
- cp r16, CHAN1_FRQL
- brlo lower1
- rjmp skip_port1
- higher1:
- ldi r19, 0x00
- add CHAN1_FRQL, r18
- adc CHAN1_FRQH, r19
- cp r17, CHAN1_FRQH
- brlo skip_port1
- cp CHAN1_FRQH, r17
- brlo port1
- cp r16, CHAN1_FRQL
- brlo skip_port1
- rjmp port1
- lower1:
- clc
- sbc CHAN1_FRQL, r18
- brcc lower1a
- dec CHAN1_FRQH
- lower1a:
- cp CHAN1_FRQH, r17
- brlo skip_port1
- cp r17, CHAN1_FRQH
- brlo port1
- cp CHAN1_FRQL, r16
- brlo skip_port1
- rjmp port1
- skip_port1:
- mov CHAN1_FRQL, r16
- mov CHAN1_FRQH, r17
- port1:
- lds r16, chan2_tpit
- lds r17, chan2_tpit + 1
- sbrs r21, 0
- rjmp skip19
- lds r18, chan2_pit_slide
- ldi r19, 0x00
- sbrc r20, 1
- rjmp up2
- cpi r17, 0x00
- brne down2a
- cpi r16, 0x00
- breq down2
- down2a:
- sbc r16, r18
- brcc down2
- dec r17
- rjmp down2
- up2:
- add r16, r18
- adc r17, r19
- down2:
- sts chan2_tpit, r16
- sts chan2_tpit + 1, r17
- skip19:
- sbrs r21, 0
- rjmp port2
- lds r18, chan2_port
- cpi r18, 0x00
- breq skip_port2
- cp CHAN2_FRQH, r17
- brlo higher2
- cp r17, CHAN2_FRQH
- brlo lower2
- cp CHAN2_FRQL, r16
- brlo higher2
- cp r16, CHAN2_FRQL
- brlo lower2
- rjmp skip_port2
- higher2:
- ldi r19, 0x00
- add CHAN2_FRQL, r18
- adc CHAN2_FRQH, r19
- cp r17, CHAN2_FRQH
- brlo skip_port2
- cp CHAN2_FRQH, r17
- brlo port2
- cp r16, CHAN2_FRQL
- brlo skip_port2
- rjmp port2
- lower2:
- clc
- sbc CHAN2_FRQL, r18
- brcc lower2a
- dec CHAN2_FRQH
- lower2a:
- cp CHAN2_FRQH, r17
- brlo skip_port2
- cp r17, CHAN2_FRQH
- brlo port2
- cp CHAN2_FRQL, r16
- brlo skip_port2
- rjmp port2
- skip_port2:
- mov CHAN2_FRQL, r16
- mov CHAN2_FRQH, r17
- port2:
- lds r16, chan3_tpit
- lds r17, chan3_tpit + 1
- sbrs r21, 0
- rjmp skip20
- lds r18, chan3_pit_slide
- ldi r19, 0x00
- sbrc r20, 2
- rjmp up3
- cpi r17, 0x00
- brne down3a
- cpi r16, 0x00
- breq down3
- down3a:
- sbc r16, r18
- brcc down3
- dec r17
- rjmp down3
- up3:
- add r16, r18
- adc r17, r19
- down3:
- sts chan3_tpit, r16
- sts chan3_tpit + 1, r17
- skip20:
- sbrs r21, 0
- rjmp port3
- lds r18, chan3_port
- cpi r18, 0x00
- breq skip_port3
- cp CHAN3_FRQH, r17
- brlo higher3
- cp r17, CHAN3_FRQH
- brlo lower3
- cp CHAN3_FRQL, r16
- brlo higher3
- cp r16, CHAN3_FRQL
- brlo lower3
- rjmp skip_port3
- higher3:
- ldi r19, 0x00
- add CHAN3_FRQL, r18
- adc CHAN3_FRQH, r19
- cp r17, CHAN3_FRQH
- brlo skip_port3
- cp CHAN3_FRQH, r17
- brlo port3
- cp r16, CHAN3_FRQL
- brlo skip_port3
- rjmp port3
- lower3:
- clc
- sbc CHAN3_FRQL, r18
- brcc lower3a
- dec CHAN3_FRQH
- lower3a:
- cp CHAN3_FRQH, r17
- brlo skip_port3
- cp r17, CHAN3_FRQH
- brlo port3
- cp CHAN3_FRQL, r16
- brlo skip_port3
- rjmp port3
- skip_port3:
- mov CHAN3_FRQL, r16
- mov CHAN3_FRQH, r17
- port3:
- lds r16, chan4_tpit
- lds r17, chan4_tpit + 1
- sbrs r21, 0
- rjmp skip21
- lds r18, chan4_pit_slide
- ldi r19, 0x00
- sbrc r20, 3
- rjmp up4
- cpi r17, 0x00
- brne down4a
- cpi r16, 0x00
- breq down4
- down4a:
- sbc r16, r18
- brcc down4
- dec r17
- rjmp down4
- up4:
- add r16, r18
- adc r17, r19
- down4:
- sts chan4_tpit, r16
- sts chan4_tpit + 1, r17
- skip21:
- sbrs r21, 0
- rjmp port4
- lds r18, chan4_port
- cpi r18, 0x00
- breq skip_port4
- cp CHAN4_FRQH, r17
- brlo higher4
- cp r17, CHAN4_FRQH
- brlo lower4
- cp CHAN4_FRQL, r16
- brlo higher4
- cp r16, CHAN4_FRQL
- brlo lower4
- rjmp skip_port4
- higher4:
- ldi r19, 0x00
- add CHAN4_FRQL, r18
- adc CHAN4_FRQH, r19
- cp r17, CHAN4_FRQH
- brlo skip_port4
- cp CHAN4_FRQH, r17
- brlo port4
- cp r16, CHAN4_FRQL
- brlo skip_port4
- rjmp port4
- lower4:
- clc
- sbc CHAN4_FRQL, r18
- brcc lower4a
- dec CHAN4_FRQH
- lower4a:
- cp CHAN4_FRQH, r17
- brlo skip_port4
- cp r17, CHAN4_FRQH
- brlo port4
- cp CHAN4_FRQL, r16
- brlo skip_port4
- rjmp port4
- skip_port4:
- mov CHAN4_FRQL, r16
- mov CHAN4_FRQH, r17
- port4:
- sts chan1_pvib, CHAN1_FRQL
- sts chan1_pvib + 1, CHAN1_FRQH
- sts chan2_pvib, CHAN2_FRQL
- sts chan2_pvib + 1, CHAN2_FRQH
- sts chan3_pvib, CHAN3_FRQL
- sts chan3_pvib + 1, CHAN3_FRQH
- sts chan4_pvib, CHAN4_FRQL
- sts chan4_pvib + 1, CHAN4_FRQH
- lds r21, vibrato_timer
- inc r21
- cpi r21, 0x8
- brne skip27
- clr r21
- skip27:
- sts vibrato_timer, r21
- push r0
- push r1
- lds r16, chan1_tvib
- lds r17, chan1_vib
- mov r19, r17
- andi r17, 0xF0
- lsr r17
- andi r19, 0x0F
- cpi r21, 0x00
- brne skip26
- add r16, r17
- sts chan1_tvib, r16
- skip26:
- sbrc r16, 7
- com r16
- lsr r16
- lsr r16
- lsr r16
- mul r16, r19
- mov r16, r0
- lsr r16
- lsr r16
- lsr r16
- ldi r19, 0x00
- lds r18, chan1_fine
- add r16, r18
- add CHAN1_FRQL, r16
- adc CHAN1_FRQH, r19
- lds r16, chan2_tvib
- lds r17, chan2_vib
- mov r19, r17
- andi r17, 0xF0
- lsr r17
- andi r19, 0x0F
- cpi r21, 0x00
- brne skip30
- add r16, r17
- sts chan2_tvib, r16
- skip30:
- sbrc r16, 7
- com r16
- lsr r16
- lsr r16
- lsr r16
- mul r16, r19
- mov r16, r0
- lsr r16
- lsr r16
- lsr r16
- ldi r19, 0x00
- lds r18, chan2_fine
- add r16, r18
- add CHAN2_FRQL, r16
- adc CHAN2_FRQH, r19
- lds r16, chan3_tvib
- lds r17, chan3_vib
- mov r19, r17
- andi r17, 0xF0
- lsr r17
- andi r19, 0x0F
- cpi r21, 0x00
- brne skip28
- add r16, r17
- sts chan3_tvib, r16
- skip28:
- sbrc r16, 7
- com r16
- lsr r16
- lsr r16
- lsr r16
- mul r16, r19
- mov r16, r0
- lsr r16
- lsr r16
- lsr r16
- ldi r19, 0x00
- lds r18, chan3_fine
- add r16, r18
- add CHAN3_FRQL, r16
- adc CHAN3_FRQH, r19
- lds r16, chan4_tvib
- lds r17, chan4_vib
- mov r19, r17
- andi r17, 0xF0
- lsr r17
- andi r19, 0x0F
- cpi r21, 0x00
- brne skip29
- add r16, r17
- sts chan4_tvib, r16
- skip29:
- sbrc r16, 7
- com r16
- lsr r16
- lsr r16
- lsr r16
- mul r16, r19
- mov r16, r0
- lsr r16
- lsr r16
- lsr r16
- ldi r19, 0x00
- lds r18, chan4_fine
- add r16, r18
- add CHAN4_FRQL, r16
- adc CHAN4_FRQH, r19
- lds r16, chan1_ttrm
- lds r17, chan1_trm
- mov r19, r17
- andi r17, 0xF0
- lsr r17
- andi r19, 0x0F
- lsl r19
- lsl r19
- lsl r19
- lsl r19
- cpi r21, 0x00
- brne skip31
- add r16, r17
- sts chan1_ttrm, r16
- skip31:
- sbrc r16, 7
- com r16
- lsl r16
- mul r16, r19
- mov r16, r1
- lds r18, chan1_ptrm
- clc
- sbc r18, r16
- brcc skip32
- clr r18
- skip32:
- sts chan1_vol, r18
- lds r16, chan2_ttrm
- lds r17, chan2_trm
- mov r19, r17
- andi r17, 0xF0
- lsr r17
- andi r19, 0x0F
- lsl r19
- lsl r19
- lsl r19
- lsl r19
- cpi r21, 0x00
- brne skip33
- add r16, r17
- sts chan2_ttrm, r16
- skip33:
- sbrc r16, 7
- com r16
- lsl r16
- mul r16, r19
- mov r16, r1
- lds r18, chan2_ptrm
- clc
- sbc r18, r16
- brcc skip34
- clr r18
- skip34:
- sts chan2_vol, r18
- lds r16, chan3_ttrm
- lds r17, chan3_trm
- mov r19, r17
- andi r17, 0xF0
- lsr r17
- andi r19, 0x0F
- lsl r19
- lsl r19
- lsl r19
- lsl r19
- cpi r21, 0x00
- brne skip38
- add r16, r17
- sts chan3_ttrm, r16
- skip38:
- sbrc r16, 7
- com r16
- lsl r16
- mul r16, r19
- mov r16, r1
- lds r18, chan3_ptrm
- clc
- sbc r18, r16
- brcc skip35
- clr r18
- skip35:
- sts chan3_vol, r18
- lds r16, chan4_ttrm
- lds r17, chan4_trm
- mov r19, r17
- andi r17, 0xF0
- lsr r17
- andi r19, 0x0F
- lsl r19
- lsl r19
- lsl r19
- lsl r19
- cpi r21, 0x00
- brne skip36
- add r16, r17
- sts chan4_ttrm, r16
- skip36:
- sbrc r16, 7
- com r16
- lsl r16
- mul r16, r19
- mov r16, r1
- lds r18, chan4_ptrm
- clc
- sbc r18, r16
- brcc skip37
- clr r18
- skip37:
- sts chan4_vol, r18
- lds r16, chan1_tpwm
- lds r17, chan1_pwm
- mov r19, r17
- andi r17, 0xF0
- lsr r17
- lsr r17
- lsr r17
- lsr r17
- andi r19, 0x0F
- lsl r19
- lsl r19
- lsl r19
- lsl r19
- cpi r21, 0x00
- brne skip39
- add r16, r17
- sts chan1_tpwm, r16
- skip39:
- sbrc r16, 7
- com r16
- mul r16, r19
- mov r16, r1
- lds r18, chan1_tdut
- add r18, r16
- sts chan1_dut, r18
- lds r16, chan2_tpwm
- lds r17, chan2_pwm
- mov r19, r17
- andi r17, 0xF0
- lsr r17
- lsr r17
- lsr r17
- lsr r17
- andi r19, 0x0F
- lsl r19
- lsl r19
- lsl r19
- lsl r19
- cpi r21, 0x00
- brne skip40
- add r16, r17
- sts chan2_tpwm, r16
- skip40:
- sbrc r16, 7
- com r16
- mul r16, r19
- mov r16, r1
- lds r18, chan2_tdut
- add r18, r16
- sts chan2_dut, r18
- lds r16, chan3_tpwm
- lds r17, chan3_pwm
- mov r19, r17
- andi r17, 0xF0
- lsr r17
- lsr r17
- lsr r17
- lsr r17
- andi r19, 0x0F
- lsl r19
- lsl r19
- lsl r19
- lsl r19
- cpi r21, 0x00
- brne skip41
- add r16, r17
- sts chan3_tpwm, r16
- skip41:
- sbrc r16, 7
- com r16
- mul r16, r19
- mov r16, r1
- lds r18, chan3_tdut
- add r18, r16
- sts chan3_dut, r18
- lds r16, chan4_tpwm
- lds r17, chan4_pwm
- mov r19, r17
- andi r17, 0xF0
- lsr r17
- lsr r17
- lsr r17
- lsr r17
- andi r19, 0x0F
- lsl r19
- lsl r19
- lsl r19
- lsl r19
- cpi r21, 0x00
- brne skip42
- add r16, r17
- sts chan4_tpwm, r16
- skip42:
- sbrc r16, 7
- com r16
- mul r16, r19
- mov r16, r1
- lds r18, chan4_tdut
- add r18, r16
- sts chan4_dut, r18
- pop r1
- pop r0
- skip:
- lds r16, tick_timer
- inc r16
- sts tick_timer, r16
- reti
- handle_note:
- lds r18, arp_timer
- inc r18
- mov r19, r18
- lsr r19
- lsr r19
- lsr r19
- lsr r19
- lsr r19
- andi r19, 0b11
- cpi r19, 0b11
- brne skip5
- ldi r18, 0x0
- skip5:
- sts arp_timer, r18
- sbrc r19, 0
- rjmp arp1
- sbrc r19, 1
- rjmp arp2
- rjmp skip6
- arp1:
- andi r17, 0xF0
- add r16, r17
- brcc skip6
- ldi r18, 0x41
- add r16, r18
- arp2:
- lsl r17
- lsl r17
- lsl r17
- lsl r17
- add r16, r17
- brcc skip6
- ldi r18, 0x41
- add r16, r18
- skip6:
- rjmp note_freq
- note_freq:
- mov r19, r16
- 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
- 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
- return:
- 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:
- push r0
- push r1
- mul r17, r20
- mov r17, r1
- pop r1
- pop r0
- ret
- .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
- waveform: .byte 1
- enable: .byte 1
- tick_timer: .byte 1
- arp_timer: .byte 1
- slide_timer: .byte 1
- vibrato_timer: .byte 1
- note_on: .byte 1
- ; 0 - 3: note
- ; 4 - 7: octave
- ; 8 - 11: arp 1
- ; 12 - 15: arp 2
- chan1_notes: .byte 2
- chan2_notes: .byte 2
- chan3_notes: .byte 2
- chan4_notes: .byte 2
- chan1_tpit: .byte 2
- chan2_tpit: .byte 2
- chan3_tpit: .byte 2
- chan4_tpit: .byte 2
- chan1_tvol: .byte 1
- chan2_tvol: .byte 1
- chan3_tvol: .byte 1
- chan4_tvol: .byte 1
- chan1_tdut: .byte 1
- chan2_tdut: .byte 1
- chan3_tdut: .byte 1
- chan4_tdut: .byte 1
- ; 0 - down
- ; 1 - up
- vol_slide_dir: .byte 1
- pit_slide_dir: .byte 1
- chan1_vol_slide: .byte 1
- chan2_vol_slide: .byte 1
- chan3_vol_slide: .byte 1
- chan4_vol_slide: .byte 1
- chan1_pit_slide: .byte 1
- chan2_pit_slide: .byte 1
- chan3_pit_slide: .byte 1
- chan4_pit_slide: .byte 1
- chan1_port: .byte 1
- chan2_port: .byte 1
- chan3_port: .byte 1
- chan4_port: .byte 1
- ; 0 - 3: rate
- ; 4 - 7: depth
- 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_pwm: .byte 1
- chan2_pwm: .byte 1
- chan3_pwm: .byte 1
- chan4_pwm: .byte 1
- chan1_pvib: .byte 2
- chan2_pvib: .byte 2
- chan3_pvib: .byte 2
- chan4_pvib: .byte 2
- chan1_ptrm: .byte 2
- chan2_ptrm: .byte 2
- chan3_ptrm: .byte 2
- chan4_ptrm: .byte 2
- chan1_tvib: .byte 1
- chan2_tvib: .byte 1
- chan3_tvib: .byte 1
- chan4_tvib: .byte 1
- chan1_ttrm: .byte 1
- chan2_ttrm: .byte 1
- chan3_ttrm: .byte 1
- chan4_ttrm: .byte 1
- chan1_tpwm: .byte 1
- chan2_tpwm: .byte 1
- chan3_tpwm: .byte 1
- chan4_tpwm: .byte 1
- ; 0 - 3: attack
- ; 4 - 7: decay
- ; 8 - 11: sustain
- ; 12 - 15: release
- chan1_env: .byte 2
- chan2_env: .byte 2
- chan3_env: .byte 2
- chan4_env: .byte 2
- chan1_fine: .byte 1
- chan2_fine: .byte 1
- chan3_fine: .byte 1
- chan4_fine: .byte 1
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement