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 instrumnt which is a list of four effects to be applied per tick
- ; each channel has its own extra effect
- ;
- ; song format:
- ; 0x00 - tempo
- ; 0x01 - ticks per frame
- ; 0x02 - repeat low
- ; 0x03 - repeat high
- ; [0x10 - 0x4F] - instruments
- ; [0x50 - end] - frames
- ;
- ; instrument format:
- ; 0x00 - effect 1
- ; 0x01 - effect 2
- ; 0x02 - effect 3
- ; 0x03 - effect 4
- ;
- ; effect format:
- ; first nybble - effect
- ; second nybble - argument
- ;
- ; frame format:
- ; first byte - note
- ; second byte - volume
- ; third byte - instrument
- ; fourth byte - arppegio
- ;
- ; 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)
- .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
- .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, 0b0101
- sts enable, r16
- ldi r16, 0xFF
- sts chan1_vol, r16
- sts chan2_vol, r16
- sts chan3_vol, r16
- sts chan4_vol, r16
- ldi r16, 0x10
- sts chan1_dut, r16
- sts chan2_dut, r16
- sts chan3_dut, r16
- sts chan4_dut, r16
- ldi r16, 0b11111101
- sts waveform, r16
- ldi r16, LOW(392)
- ldi r17, HIGH(392)
- mov CHAN1_FRQL, r16
- mov CHAN1_FRQH, r17
- ldi r16, LOW(294)
- ldi r17, HIGH(294)
- mov CHAN2_FRQL, r16
- mov CHAN2_FRQH, r17
- ldi r16, LOW(349)
- ldi r17, HIGH(349)
- mov CHAN3_FRQL, r16
- mov CHAN3_FRQH, r17
- ldi r16, LOW(494)
- ldi r17, HIGH(494)
- mov CHAN4_FRQL, r16
- mov CHAN4_FRQH, r17
- 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
- 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
- .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
Advertisement
Add Comment
Please, Sign In to add comment