A MIDI piano synthesizer that implements the Karplus Strong physical modeling algorithm.
Dependencies: mbed USBDevice PinDetect
my_leds.s@22:b800e1766647, 2016-04-25 (annotated)
- Committer:
- asuszek
- Date:
- Mon Apr 25 23:58:15 2016 +0000
- Revision:
- 22:b800e1766647
- Parent:
- 18:26d93c5b9bb6
Fixed LED bug
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
asuszek | 18:26d93c5b9bb6 | 1 | AREA binary_clock, CODE, READONLY |
asuszek | 18:26d93c5b9bb6 | 2 | EXPORT my_leds |
asuszek | 18:26d93c5b9bb6 | 3 | |
asuszek | 18:26d93c5b9bb6 | 4 | ; Define some constants to make things more readable. |
asuszek | 18:26d93c5b9bb6 | 5 | ALLLEDS EQU 0xB40000 ; Bit mask for all 4 LEDs. |
asuszek | 18:26d93c5b9bb6 | 6 | LEDBASEADDR EQU 0x2009C020 |
asuszek | 18:26d93c5b9bb6 | 7 | LEDSETOFF EQU 0x18 |
asuszek | 18:26d93c5b9bb6 | 8 | LEDCLROFF EQU 0x1C |
asuszek | 18:26d93c5b9bb6 | 9 | |
asuszek | 18:26d93c5b9bb6 | 10 | my_leds |
asuszek | 18:26d93c5b9bb6 | 11 | ; First clear all of the LEDs. |
asuszek | 18:26d93c5b9bb6 | 12 | LDR R1, =LEDBASEADDR |
asuszek | 18:26d93c5b9bb6 | 13 | LDR R2, =ALLLEDS |
asuszek | 18:26d93c5b9bb6 | 14 | STR R2, [R1, #LEDCLROFF] |
asuszek | 18:26d93c5b9bb6 | 15 | |
asuszek | 18:26d93c5b9bb6 | 16 | ; Make sure we only use the 4 LSBs. |
asuszek | 18:26d93c5b9bb6 | 17 | AND R0, R0, #0xF |
asuszek | 18:26d93c5b9bb6 | 18 | ; Reverse bits to make LED order more intuitive. |
asuszek | 18:26d93c5b9bb6 | 19 | RBIT R0, R0 |
asuszek | 18:26d93c5b9bb6 | 20 | LSR R0, R0, #28 |
asuszek | 18:26d93c5b9bb6 | 21 | |
asuszek | 18:26d93c5b9bb6 | 22 | ; Store the 4th bit in R2. |
asuszek | 18:26d93c5b9bb6 | 23 | UBFX R2, R0, #0x3, #0x1 |
asuszek | 18:26d93c5b9bb6 | 24 | ; Clear bit 4 of the input. |
asuszek | 18:26d93c5b9bb6 | 25 | BIC R0, R0, #0x8 |
asuszek | 18:26d93c5b9bb6 | 26 | ; If R2 is set, place a bit in bit 5. |
asuszek | 18:26d93c5b9bb6 | 27 | BFI R0, R2, #0x4, #0x1 |
asuszek | 18:26d93c5b9bb6 | 28 | |
asuszek | 18:26d93c5b9bb6 | 29 | ; Shift input right once to store and delete LSB. |
asuszek | 18:26d93c5b9bb6 | 30 | LSRS R0, R0, #1 |
asuszek | 18:26d93c5b9bb6 | 31 | |
asuszek | 18:26d93c5b9bb6 | 32 | ; Now bit 1 is stored in C and R0 contains bits 2, 3, and 4 starting at the LSB position. |
asuszek | 18:26d93c5b9bb6 | 33 | ; Shift R0 left to put bits 2, 3, and 4 in the correct position. |
asuszek | 18:26d93c5b9bb6 | 34 | LSL R0, R0, #20 |
asuszek | 18:26d93c5b9bb6 | 35 | |
asuszek | 18:26d93c5b9bb6 | 36 | ; Conditionally insert bit 1 into R0. |
asuszek | 18:26d93c5b9bb6 | 37 | ORRCS R0, R0, #0x040000 ; LED1 |
asuszek | 18:26d93c5b9bb6 | 38 | |
asuszek | 18:26d93c5b9bb6 | 39 | ; Now use our full mask to set correct LEDs. |
asuszek | 18:26d93c5b9bb6 | 40 | STR R0, [R1, #LEDSETOFF] |
asuszek | 18:26d93c5b9bb6 | 41 | |
asuszek | 18:26d93c5b9bb6 | 42 | ; Return |
asuszek | 18:26d93c5b9bb6 | 43 | BX LR |
asuszek | 18:26d93c5b9bb6 | 44 | ALIGN |
asuszek | 18:26d93c5b9bb6 | 45 | END |
asuszek | 18:26d93c5b9bb6 | 46 |