sw: bootrom: Improve performance and reduce size
This commit is contained in:
parent
49ccbea9e9
commit
e561c31691
@ -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
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user