hardwired jump table
This makes the microcontroller very application dependent, but may save use some headaches. The idea is to write a program to produce the code to show a complex drawing.
This commit is contained in:
parent
53da6b7171
commit
5bb884c502
336
main.S
336
main.S
@ -35,12 +35,14 @@ main:
|
||||
ldi r16, 1
|
||||
sts line, r16
|
||||
|
||||
; r0 always holds 0
|
||||
clr r0
|
||||
|
||||
call setup_c
|
||||
|
||||
sei ; global interrupt enable
|
||||
|
||||
1:
|
||||
call loop_c
|
||||
rjmp 1b
|
||||
|
||||
.global int_horizontal_sync
|
||||
@ -57,9 +59,10 @@ int_horizontal_sync: ; +3
|
||||
sts line, r30 ; +18
|
||||
sts line + 1, r31 ; +20
|
||||
cpi r31, 0 ; +21
|
||||
brne enter ; +22, +23
|
||||
cpi r30, VERTICAL_OFFSET ; +23
|
||||
brlo int_horizontal_sync_end ; +24
|
||||
breq enter ; +23
|
||||
jmp int_horizontal_sync_end
|
||||
# cpi r30, VERTICAL_OFFSET ; +23
|
||||
# brlo int_horizontal_sync_end ; +24
|
||||
|
||||
enter:
|
||||
; here, +23 or +24 cycles have passed since horizontal sync
|
||||
@ -97,16 +100,29 @@ int_timer_0:
|
||||
andi r31, 0xfd ; mask disable interrupt timer A
|
||||
sts TIMSK0, r31
|
||||
|
||||
; draw things
|
||||
ldi r30, lo8(line_buffer)
|
||||
ldi r31, hi8(line_buffer)
|
||||
clr r0
|
||||
ldi zl, pm_lo8(line_jump_table)
|
||||
ldi zh, pm_hi8(line_jump_table)
|
||||
|
||||
.rept LINE_BUFFER_SIZE
|
||||
ld r29, z+
|
||||
out IO(PORTB), r29
|
||||
nop
|
||||
.endr
|
||||
lds r29, line
|
||||
add zl, r29
|
||||
adc zh, r0
|
||||
add zl, r29
|
||||
adc zh, r0
|
||||
|
||||
ijmp
|
||||
|
||||
# ; draw things
|
||||
# ldi r30, lo8(line_buffer)
|
||||
# ldi r31, hi8(line_buffer)
|
||||
|
||||
#.rept LINE_BUFFER_SIZE
|
||||
# ld r29, z+
|
||||
# out IO(PORTB), r29
|
||||
# nop
|
||||
#.endr
|
||||
|
||||
jump_table_return_address:
|
||||
pop r29
|
||||
pop r30
|
||||
pop r31
|
||||
@ -139,4 +155,300 @@ int_vertical_sync_end:
|
||||
pop r31
|
||||
reti
|
||||
|
||||
.global line_0
|
||||
line_0:
|
||||
.rept 200
|
||||
nop
|
||||
.endr
|
||||
|
||||
sbi IO(PORTB), 4
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
cbi IO(PORTB), 4
|
||||
|
||||
.rept 50
|
||||
nop
|
||||
.endr
|
||||
|
||||
sbi IO(PORTB), 4
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
cbi IO(PORTB), 4
|
||||
|
||||
jmp jump_table_return_address
|
||||
|
||||
.global line_1
|
||||
line_1:
|
||||
.rept 50
|
||||
nop
|
||||
.endr
|
||||
|
||||
sbi IO(PORTB), 4
|
||||
nop
|
||||
nop
|
||||
cbi IO(PORTB), 4
|
||||
|
||||
jmp jump_table_return_address
|
||||
|
||||
line_jump_table:
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_1
|
||||
jmp line_1
|
||||
jmp line_1
|
||||
jmp line_1
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
jmp line_0
|
||||
|
||||
|
33
main.c
33
main.c
@ -18,38 +18,5 @@ ISR(TIMER0_COMPA_vect, ISR_NAKED) {
|
||||
}
|
||||
|
||||
void setup_c() {
|
||||
/*
|
||||
for (int i = 0; i < LINE_BUFFER_SIZE; ++i) {
|
||||
line_buffer[i] = (i % 2) ? 0x0 : 0xff;
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
void loop_c() {
|
||||
for (;;) {
|
||||
const int current_line = line;
|
||||
switch (current_line) {
|
||||
case 76: case 134: memcpy(line_buffer, "AAAAAAAAAAAAAAAAAAAAAA", 22); break;
|
||||
case 80: memcpy(line_buffer, "11111111AAAA1111111111", 22); break;
|
||||
case 84: memcpy(line_buffer, "111111111AAA1111111111", 22); break;
|
||||
case 88: case 98: memcpy(line_buffer, "11AAAAA111AA11AAAAAAAA", 22); break;
|
||||
case 92: memcpy(line_buffer, "11AAAAAA11AA11AAAAAAAA", 22); break;
|
||||
case 102: memcpy(line_buffer, "111111111AAA11111111AA", 22); break;
|
||||
case 106: memcpy(line_buffer, "11111111AAAA11111111AA", 22); break;
|
||||
case 110: memcpy(line_buffer, "11A111AAAAAA11AAAAAAAA", 22); break;
|
||||
case 114: memcpy(line_buffer, "11AA111AAAAA11AAAAAAAA", 22); break;
|
||||
case 118: memcpy(line_buffer, "11AAA111AAAA11AAAAAAAA", 22); break;
|
||||
case 122: memcpy(line_buffer, "11AAAA111AAA11AAAAAAAA", 22); break;
|
||||
case 126: memcpy(line_buffer, "11AAAAA111AA1111111111", 22); break;
|
||||
case 130: memcpy(line_buffer, "11AAAAAA11AA1111111111", 22); break;
|
||||
}
|
||||
line_buffer[60] = (current_line > 50 && current_line < 100) ? WHITE : BLACK;
|
||||
|
||||
if (current_line > 200 && current_line % 8 == 0) {
|
||||
const uint8_t current_number = frame >> 2;
|
||||
for (uint8_t i = 0; i < 8; ++i) {
|
||||
line_buffer[i] = ((current_number >> i) & 0x1) ? WHITE : BLACK;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user