working lead, just need to shift it
This commit is contained in:
parent
cacd33a846
commit
94efc9ea5b
202
avr/noiseplug.s
202
avr/noiseplug.s
|
@ -15,13 +15,19 @@ PORTB = 0x02
|
||||||
DDRB = 0x01
|
DDRB = 0x01
|
||||||
PINB = 0x00
|
PINB = 0x00
|
||||||
|
|
||||||
|
LEADSIZE = 174
|
||||||
|
LEADINIT1 = 1601
|
||||||
|
LEADINIT2 = 3571
|
||||||
|
|
||||||
.section .bss
|
.section .bss
|
||||||
|
|
||||||
.comm int_ctr, 1
|
.comm int_ctr, 1
|
||||||
.comm i, 3
|
.comm i, 3
|
||||||
|
|
||||||
.comm lead1, 4
|
.comm lead1, 4
|
||||||
.comm lead2, 4
|
.comm lead2, 4
|
||||||
.comm lead3, 4
|
.comm lead3, 4
|
||||||
|
|
||||||
.comm bassosc, 2
|
.comm bassosc, 2
|
||||||
.comm bassflange, 2
|
.comm bassflange, 2
|
||||||
.comm arposc, 2
|
.comm arposc, 2
|
||||||
|
@ -56,10 +62,23 @@ main_cont:
|
||||||
clr r31
|
clr r31
|
||||||
ldi r30, 0x40
|
ldi r30, 0x40
|
||||||
|
|
||||||
clearsram:
|
clear_sram:
|
||||||
st Z+, r16
|
st Z+, r16
|
||||||
sbrs r30, 5
|
sbrs r30, 5
|
||||||
rjmp clearsram
|
rjmp clear_sram
|
||||||
|
|
||||||
|
; ldi r18, LEADSIZE
|
||||||
|
; sts leadptr1, r18
|
||||||
|
; sts leadptr2, r18
|
||||||
|
; sts leadptr3, r18
|
||||||
|
; ldi r18, hi8(LEADINIT1)
|
||||||
|
; sts leadosc2, r18
|
||||||
|
; ldi r18, lo8(LEADINIT1)
|
||||||
|
; sts leadosc2 + 1, r18
|
||||||
|
; ldi r18, hi8(LEADINIT2)
|
||||||
|
; sts leadosc3, r18
|
||||||
|
; ldi r18, lo8(LEADINIT2)
|
||||||
|
; sts leadosc3 + 1, r18
|
||||||
|
|
||||||
out CCP, r17
|
out CCP, r17
|
||||||
out CLKPSR, r16
|
out CLKPSR, r16
|
||||||
|
@ -263,11 +282,173 @@ arptiming_noshift:
|
||||||
subi r16, -35
|
subi r16, -35
|
||||||
|
|
||||||
noarp:
|
noarp:
|
||||||
|
|
||||||
|
; ==== LEAD ===
|
||||||
|
clr r29
|
||||||
|
ldi r28, lead1
|
||||||
|
ldi r24, 0
|
||||||
|
ldi r25, ~1
|
||||||
|
rcall lead_voice
|
||||||
|
add r16, r23
|
||||||
|
|
||||||
|
;ldi r28, lead2
|
||||||
|
;ldi r24, 4
|
||||||
|
;ldi r25, ~2
|
||||||
|
;rcall lead_voice
|
||||||
|
;lsr r23
|
||||||
|
;lsr r23
|
||||||
|
;add r16, r23
|
||||||
|
;lsr r23
|
||||||
|
;add r16, r23
|
||||||
|
|
||||||
|
;ldi r28, lead3
|
||||||
|
;ldi r24, 8
|
||||||
|
;ldi r25, ~4
|
||||||
|
;rcall lead_voice
|
||||||
|
;lsr r23
|
||||||
|
;lsr r23
|
||||||
|
;add r16, r23
|
||||||
|
|
||||||
out OCR0AL, r16
|
out OCR0AL, r16
|
||||||
|
|
||||||
cbi PORTB, 2
|
cbi PORTB, 2
|
||||||
rjmp mainloop
|
rjmp mainloop
|
||||||
|
|
||||||
|
; input:
|
||||||
|
; dataset pointer in Y
|
||||||
|
; inverted boost mask in r25
|
||||||
|
; voice delay (4 * voice_nr) in r24
|
||||||
|
; returns sample in r23
|
||||||
|
|
||||||
|
skiplead_top:
|
||||||
|
clr r23
|
||||||
|
ret
|
||||||
|
|
||||||
|
lead_voice:
|
||||||
|
ld r23, Y+ ; r23 = leadptr
|
||||||
|
cpi r23, LEADSIZE
|
||||||
|
brne noleadsetup
|
||||||
|
|
||||||
|
cpi r17, 4
|
||||||
|
brne skiplead_top
|
||||||
|
cp r18, r24 ; r24 no longer needed now!
|
||||||
|
brne skiplead_top
|
||||||
|
|
||||||
|
dec r28
|
||||||
|
ldi r20, -1
|
||||||
|
st Y+, r20
|
||||||
|
ldi r20, 1
|
||||||
|
st Y, r20
|
||||||
|
|
||||||
|
noleadsetup:
|
||||||
|
lds r26, boost ; r26 = boost
|
||||||
|
ld r27, Y ; r27 = leadtimer
|
||||||
|
|
||||||
|
; if (0 == (i & 0xFF)): clear boost
|
||||||
|
tst r19
|
||||||
|
brne checkleadtimer
|
||||||
|
|
||||||
|
and r26, r25
|
||||||
|
sts boost, r26
|
||||||
|
|
||||||
|
; if (0 == i & 0x1FF): leadtimer--
|
||||||
|
sbrc r18, 0
|
||||||
|
rjmp checkleadtimer
|
||||||
|
|
||||||
|
dec r27
|
||||||
|
st Y, r27
|
||||||
|
|
||||||
|
checkleadtimer:
|
||||||
|
; if (0 == leadtimer): leadptr++
|
||||||
|
tst r27
|
||||||
|
brne getleaddata
|
||||||
|
|
||||||
|
; leadptr++
|
||||||
|
dec r28
|
||||||
|
inc r23
|
||||||
|
st Y+, r23
|
||||||
|
|
||||||
|
getleaddata:
|
||||||
|
; leadptr(4..7) = leadseq[leadptr >> 4];
|
||||||
|
mov r30, r23
|
||||||
|
andi r23, 0xF
|
||||||
|
swap r30
|
||||||
|
andi r30, 0xF
|
||||||
|
subi r30, lo8(NULL-leadseq)
|
||||||
|
ld r30, Z
|
||||||
|
swap r30
|
||||||
|
or r30, r23
|
||||||
|
|
||||||
|
; data = leaddata[leadptr]
|
||||||
|
subi r30, lo8(NULL-leaddata)
|
||||||
|
ld r24, Z ; r24 = data!
|
||||||
|
|
||||||
|
; if (0 == leadtimer) {
|
||||||
|
neg r25
|
||||||
|
tst r27
|
||||||
|
brne noleadupdate
|
||||||
|
|
||||||
|
; leadtimer = leadtimes[data >> 5]
|
||||||
|
mov r30, r24
|
||||||
|
swap r30
|
||||||
|
lsr r30
|
||||||
|
andi r30, 7
|
||||||
|
subi r30, lo8(NULL-leadtimes)
|
||||||
|
ld r27, Z
|
||||||
|
st Y, r27
|
||||||
|
|
||||||
|
; boosts |= boostmask
|
||||||
|
or r26, r25
|
||||||
|
sts boost, r26
|
||||||
|
|
||||||
|
noleadupdate:
|
||||||
|
; data &= 0x1F
|
||||||
|
andi r24, 0x1F
|
||||||
|
|
||||||
|
; note = notes[data]
|
||||||
|
ldi r30, lo8(notes)
|
||||||
|
lsl r24
|
||||||
|
add r30, r24
|
||||||
|
ld r21, Z+
|
||||||
|
ld r20, Z
|
||||||
|
|
||||||
|
; leadosc += note
|
||||||
|
inc r28
|
||||||
|
ld r22, Y+
|
||||||
|
ld r23, Y
|
||||||
|
add r23, r21
|
||||||
|
adc r22, r20
|
||||||
|
st Y, r23
|
||||||
|
st -Y, r22
|
||||||
|
|
||||||
|
; sample = ((lead_osc >> 7) & 0x3F) + ((lead_osc >> 7) & 0x1F)
|
||||||
|
rol r23
|
||||||
|
rol r22
|
||||||
|
andi r22, 0x3F
|
||||||
|
mov r23, r22
|
||||||
|
andi r22, 0x1F
|
||||||
|
add r23, r22 ; r23 = final boosted sample!
|
||||||
|
|
||||||
|
; if (!(boost & boostmask)): take three quarters
|
||||||
|
and r26, r25
|
||||||
|
brne noreduce
|
||||||
|
|
||||||
|
lsr r23
|
||||||
|
mov r22, r23
|
||||||
|
lsr r23
|
||||||
|
add r23, r22
|
||||||
|
|
||||||
|
noreduce:
|
||||||
|
; if (data == 0) return 0;
|
||||||
|
tst r24
|
||||||
|
breq skiplead
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
skiplead:
|
||||||
|
clr r23
|
||||||
|
ret
|
||||||
|
|
||||||
.org 0x300
|
.org 0x300
|
||||||
|
|
||||||
notes:
|
notes:
|
||||||
|
@ -302,4 +483,19 @@ arpeggio:
|
||||||
.byte 0x24, 0x59
|
.byte 0x24, 0x59
|
||||||
.byte 0x24, 0x58
|
.byte 0x24, 0x58
|
||||||
.byte 0x57, 0xAD
|
.byte 0x57, 0xAD
|
||||||
.byte 0x35, 0x9B
|
.byte 0x35, 0x9B
|
||||||
|
|
||||||
|
leadtimes:
|
||||||
|
.byte 1, 2, 3, 4, 5, 6, 28, 14
|
||||||
|
|
||||||
|
leaddata:
|
||||||
|
.byte 0x67, 0x24, 0x20, 0x27, 0x20, 0x28, 0x89, 0x0, 0x28, 0x20, 0x27, 0x20, 0x28, 0x89, 0x0, 0x28
|
||||||
|
.byte 0x20, 0x27, 0x20, 0x28, 0x86, 0x0, 0x44, 0x0, 0x63, 0x24, 0x62, 0xA1, 0xE0, 0xE0, 0xE0, 0xE0
|
||||||
|
.byte 0x20, 0x29, 0x20, 0x2A, 0x8B, 0x0, 0x4E, 0x0, 0x6F, 0x30, 0x71, 0xAF, 0xE0, 0xE0, 0xE0, 0xE0
|
||||||
|
.byte 0x20, 0x29, 0x20, 0x2A, 0x8B, 0x0, 0x4E, 0x0, 0x6F, 0x30, 0x6F, 0xAC, 0xE0, 0xE0, 0xE0, 0xE0
|
||||||
|
.byte 0x65, 0x22, 0x20, 0x65, 0x26, 0x87, 0x0, 0x68, 0x69, 0x2B, 0xAA, 0xC0, 0x67, 0x24, 0x20, 0x67
|
||||||
|
.byte 0x28, 0x89, 0x0, 0x68, 0x69, 0x2B, 0xAA, 0xC0, 0x65, 0x22, 0x20, 0x65, 0x26, 0xA7, 0x28, 0x20
|
||||||
|
.byte 0x69, 0x2B, 0xAA, 0x29, 0x20, 0x68, 0x29, 0xAA, 0x2B, 0x20, 0x69, 0x28, 0x69, 0x67
|
||||||
|
|
||||||
|
leadseq:
|
||||||
|
.byte 0, 1, 0, 2, 0, 1, 0, 3, 4, 5, 6
|
||||||
|
|
Loading…
Reference in a new issue