Skip to content
Browse files

bass and loop in asm

  • Loading branch information...
1 parent 5f96c41 commit db7376f914e8588ec77ff4a3511d68ee3c0205af @dop3j0e committed Aug 11, 2012
Showing with 127 additions and 5 deletions.
  1. +14 −0 avr/Makefile
  2. +113 −5 avr/noiseplug.s
View
14 avr/Makefile
@@ -0,0 +1,14 @@
+all: flash
+
+noiseplug.elf: noiseplug.S
+ avr-gcc -Os -nostdlib -mmcu=attiny9 -o $@ $<
+
+noiseplug.hex: noiseplug.elf
+ avr-objcopy -O ihex $< $@
+
+flash: noiseplug.hex
+ avrdude -cavrisp2 -Pusb -pt8 -Uflash:w:$<:a
+
+dump: noiseplug.elf
+ avr-objdump -Sr $< | less
+
View
118 avr/noiseplug.s
@@ -25,7 +25,8 @@ PINB = 0x00
.comm bassosc, 2
.comm bassflange, 2
.comm arposc, 2
- ; leaves 10 bytes for stack
+ .comm boost, 1
+ ; leaves 9 bytes for stack
.section .text
@@ -51,6 +52,14 @@ __vector_4:
.size __vector_4, .-__vector_4
main_cont:
+ clr r31
+ ldi r30, 0x40
+
+clearsram:
+ st Z+, r16
+ sbrs r30, 5
+ rjmp clearsram
+
out CCP, r17
out CLKPSR, r16
ldi r17, 5
@@ -67,6 +76,7 @@ main_cont:
mainloop:
sleep
+ clr r16
lds r17, int_ctr
tst r17
brne mainloop
@@ -77,15 +87,113 @@ mainloop:
lds r18, i+1
lds r19, i+2
- subi r19, -1
- sbci r18, 0
- sbci r17, 0
+ subi r19, 0xff
+ sbci r18, 0xff
+ sbci r17, 0xff
+
+ ; if ((i >> 13) == 76) i = 16 << 13;
+ mov r20, r18
+ rol r20
+ mov r20, r17
+ rol r20
+ subi r20, 0x13
+ brne norestart
+
+ ldi r17, 2
+ clr r18
+norestart:
sts i, r17
sts i+1, r18
sts i+2, r19
+
+; ==== BASS ====
+ ; bassptr(r20) = (i >> 13) & 0xF
+ mov r20, r17
+ ror r20
+ mov r20, r18
+ ror r20
+ swap r20
+ andi r20, 0xF
+
+ ; if (i >> 19) & 1: bassptr |= 0x10
+ sbrc r17, 3
+ ori r20, 0x10
+
+ ; note = notes[bassline[bassptr]]
+ ldi r31, hi8(bassline+0x4000)
+ ldi r30, lo8(bassline)
+ add r30, r20
+ ld r20, Z
+ ldi r30, lo8(notes)
+ add r30, r20
+ ld r21, Z+
+ ld r20, Z
+
+ ; if (bassbeat[(i >> 10) & 7]): note <<= 1
+ mov r22, r18
+ lsr r22
+ lsr r22
+ andi r22, 7
+ ldi r30, lo8(bassbeat)
+ add r30, r22
+ ld r22, Z
+ tst r22 ; assuming this resets C
+ breq nobassbeat
+ rol r21
+ rol r20
- out OCR0AL, r18
+nobassbeat:
+ ; bassosc += note, ret = (bassosc >> 8) & 0x7F
+ lds r22, bassosc
+ lds r23, bassosc + 1
+ add r23, r21
+ adc r22, r20
+ sts bassosc, r22
+ sts bassosc + 1, r23
+ mov r24, r22
+ andi r24, 0x7F
+
+ ; bassflange += note + 1, ret += (bassflange >> 8) & 0x7F
+ lds r22, bassflange
+ lds r23, bassflange + 1
+ inc r21
+ add r23, r21
+ adc r22, r20
+ sts bassflange, r22
+ sts bassflange + 1, r23
+ andi r22, 0x7F
+ add r24, r22
+
+ ; if ((i >> 6) & 0xF) == 0xF: sample += (bass >> 2)
+ lsr r24
+ lsr r24
+ mov r20, r18
+ andi r20, 3
+ subi r20, 3
+ brne addbass
+ mov r20, r19
+ andi r20, 0xC0
+ subi r20, 0xC0
+ breq noaddbass
+
+addbass:
+ add r16, r24
+
+noaddbass:
+ out OCR0AL, r16
cbi PORTB, 2
rjmp mainloop
+
+ .org 0x100
+
+notes:
+ .word -1, 134, 159, 179, 201, 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
+ .byte 10, 10, 12, 12, 14, 14, 6, 6, 10, 10, 12, 12
+
+bassbeat:
+ .byte 0, 0, 1, 0, 0, 1, 0, 1

0 comments on commit db7376f

Please sign in to comment.
Something went wrong with that request. Please try again.