From e561c31691ea0b5385e60f0169b5d90ab2e3ef10 Mon Sep 17 00:00:00 2001 From: Markus Koch Date: Wed, 7 Aug 2024 18:01:22 +0200 Subject: [PATCH] sw: bootrom: Improve performance and reduce size --- sw/bootrom/main.c | 42 ++++++++++++++---------------------------- 1 file changed, 14 insertions(+), 28 deletions(-) diff --git a/sw/bootrom/main.c b/sw/bootrom/main.c index b636f69..1a70744 100644 --- a/sw/bootrom/main.c +++ b/sw/bootrom/main.c @@ -22,6 +22,7 @@ __attribute__((noreturn)) void _start() { uint8_t opcode; uint8_t *ptr; uint32_t length; + uint32_t sr; /*while (1) { while (UART0_SR & UART0_SR_RX_DATA_EMPTY); @@ -32,52 +33,37 @@ __attribute__((noreturn)) void _start() { while (1) { while (UART0_SR & UART0_SR_RX_DATA_EMPTY); - c = UART0_DR; + c = (uint8_t)UART0_DR; + sr = (sr << 8) | c; state++; switch (state) { case 1: // Opcode opcode = c; - ptr = 0; - length = 0; if (c == 0) // NOP state = 0; break; - case 2: // Address - case 3: - case 4: - case 5: - ptr = (uint8_t*)(((uint32_t)ptr << 8) | c); - if (state != 5) - break; + case 5: // Address + ptr = (uint8_t*)sr; if (opcode == 3) { // Jump //((void (*)()) ptr)(); asm("jalr %0" : : "r"(ptr)); // Not sure why, but the jump above causes GCC to save variables to the stack at the beginning of this function __builtin_unreachable(); } break; - case 6: // Length - case 7: - case 8: - case 9: - length = (length << 8) | c; - if (state != 9) - break; + case 9: // Data + length = sr; if (opcode == 2) { // Read for (; length > 0; length--) { while (UART0_SR & UART0_SR_TX_FULL); - UART0_DR = *(ptr); - ptr++; + UART0_DR = *(ptr++); + } + } else { // Write + for (; length > 0; length--) { + while (UART0_SR & UART0_SR_RX_DATA_EMPTY); + *(ptr++) = UART0_DR; } - state = 0; - } - break; - case 10: // Write byte by byte - *(ptr++) = c; - if (--length == 0) { - state = 0; - } else { - state--; // Stay in this state } + state = 0; break; default: break;