From 5bb884c502ed1c1d49de93e8027b8c47db5e57e4 Mon Sep 17 00:00:00 2001 From: giomba Date: Tue, 10 Aug 2021 09:26:51 +0200 Subject: [PATCH] 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. --- main.S | 336 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--- main.c | 33 ------ 2 files changed, 324 insertions(+), 45 deletions(-) diff --git a/main.S b/main.S index 9e73528..addba7c 100644 --- a/main.S +++ b/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 diff --git a/main.c b/main.c index 39fae5e..13710ce 100644 --- a/main.c +++ b/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; - } - } - } -}