Browse Source

asm arpeggio

Joachim Fenkes 8 years ago
parent
commit
fab67dc800
2 changed files with 112 additions and 3 deletions
  1. 4 1
      avr/Makefile
  2. 108 2
      avr/noiseplug.s

+ 4 - 1
avr/Makefile

@@ -1,6 +1,9 @@
 all: flash
 
-noiseplug.elf: noiseplug.S
+noiseplug.o: noiseplug.S
+	avr-gcc -Os -nostdlib -mmcu=attiny9 -o $@ -c $<
+
+noiseplug.elf: noiseplug.o
 	avr-gcc -Os -nostdlib -mmcu=attiny9 -o $@ $<
 
 noiseplug.hex: noiseplug.elf

+ 108 - 2
avr/noiseplug.s

@@ -31,6 +31,7 @@ PINB = 0x00
 .section .text
 
 __vectors:
+NULL:
 	clr r16
 	ldi r17, 0xD8
 	out PUEB, r16
@@ -181,15 +182,98 @@ addbass:
 	add r16, r24
 	
 noaddbass:	
+
+; ==== ARPEGGIO ====
+	; arpptr(r30) = arpseq1[arpseq2[i >> 16]][(i >> 14) & 3]
+	mov r30, r17
+	subi r30, lo8(NULL-arpseq2)
+	ld r30, Z
+	lsl r30
+	lsl r30
+	mov r20, r18
+	swap r20
+	lsr r20
+	lsr r20
+	andi r20, 3
+	or r30, r20
+	subi r30, lo8(NULL-arpseq1)
+	ld r30, Z
+	
+	; if (!(i & (1 << 13))): arpptr >>= 14
+	sbrs r18, 5
+	swap r30
+	
+	; arpptr = arpeggio[arpptr & 0xF][(i >> 8) & 1]
+	andi r30, 0xF
+	lsl r30
+	mov r20, r18
+	andi r20, 1
+	or r30, r20
+	subi r30, lo8(NULL-arpeggio)
+	ld r30, Z
+	
+	; if (!(i & 0x80)): arpptr >>= 14
+	sbrs r19, 7
+	swap r30
+	
+	; note = arpnotes[arpptr & 0xF]
+	andi r30, 0xF
+	lsl r30
+	subi r30, lo8(NULL-arpnotes)
+	ld r21, Z+
+	ld r20, Z
+	
+	; arp_osc += note
+	lds r22, arposc
+	lds r23, arposc + 1
+	add r23, r21
+	adc r22, r20	
+	sts arposc, r22		; keep r22 for later!
+	sts arposc + 1, r23
+	
+	; if (!(i >> 17)): break arp
+	mov r20, r17
+	lsr r20
+	breq noarp
+	
+	; r20 = arptiming[(i >> 12) & 3]
+	mov r30, r18
+	swap r30
+	andi r30, 3
+	subi r30, lo8(NULL-arptiming)
+	ld r20, Z
+	
+	; if (!((r20 << ((i >> 9) & 7)) & 0x80)): break arp
+	mov r21, r18
+	lsr r21
+	andi r21, 7
+	breq arptiming_noshift
+
+arptiming_shift:
+	lsl r20
+	subi r21, 1
+	brne arptiming_shift
+	
+arptiming_noshift:
+	sbrs r20, 7
+	rjmp noarp
+	
+	; if (arp_osc & (1 << 12)): sample += 35;
+	sbrc r22, 4
+	subi r16, -35
+	
+noarp:
 	out OCR0AL, r16
 	
 	cbi PORTB, 2
 	rjmp mainloop
 
-	.org 0x100
+	.org 0x300
 	
 notes:
-	.word 	-1, 134, 159, 179, 201, 213, 239, 268, 301, 319, 358, 401, 425, 451, 477, 536, 601, 637, 715
+	.word 	-1, 134, 159, 179, 201
+arpnotes:
+	.word	213, 239, 268, 301, 319, 358, 401, 425, 451, 477, 536, 601, 637, 715
 	
 bassline:
 	.byte	14, 14, 18, 12, 14, 14, 20, 12, 14, 14, 18, 8, 10, 10, 4, 8
@@ -197,3 +281,25 @@ bassline:
 
 bassbeat:
 	.byte	0, 0, 1, 0, 0, 1, 0, 1
+
+arpseq1:
+	.byte	0x00, 0x12, 0x00, 0x62
+	.byte	0x00, 0x12, 0x00, 0x17
+	.byte	0x00, 0x12, 0x00, 0x12
+	.byte	0x33, 0x22, 0x00, 0x45
+
+arpseq2:
+	.byte	0, 1, 0, 1, 0, 1, 0, 2, 3, 3
+
+arptiming:
+	.byte	0x0C, 0x30, 0xFB, 0x0C
+
+arpeggio:
+	.byte	0x24, 0x6A
+	.byte	0x46, 0x9C
+	.byte	0x13, 0x59
+	.byte	0x02, 0x47
+	.byte	0x24, 0x59
+	.byte	0x24, 0x58
+	.byte	0x57, 0xAD
+	.byte	0x35, 0x9B