From 53f12a42c5059acc3e1139ee31827370d26ea047 Mon Sep 17 00:00:00 2001 From: d00f <8052722+DrDoof@users.noreply.github.com> Date: Wed, 9 Sep 2026 01:52:12 +0200 Subject: [PATCH] crc16: banked wrapper for cross-bank callers The lookup tables live in BANK1, so the routine switches the code bank to reach them with movc and never switches it back. That is the contract the __naked declaration already implied: same bank or common segment only. The name now says it. crc16_bank1 is the routine unchanged. crc16 becomes a __banked wrapper in BANK1, so a caller from another bank has its own bank put back by __sdcc_banked_ret. The two existing call sites take the direct path and pay nothing. --- crc16.asm | 8 +++++++- httpd/httpd.c | 6 +++--- rtlplayground.c | 4 ++-- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/crc16.asm b/crc16.asm index 4f1be7ae..f7fa2f9c 100644 --- a/crc16.asm +++ b/crc16.asm @@ -3,6 +3,8 @@ ; .globl _crc_value .globl _crc16 + .globl _crc16_bank1 + .globl __sdcc_banked_ret .equ BANK, 0x96 ; .equ DPS, 0x86 ; Variable in XMEM holding current CRC16 value, being updated @@ -18,7 +20,7 @@ _crc_value:: .area HOME (CODE) .area CSEG (CODE) ; .area BANK1 (CODE) -_crc16: +_crc16_bank1: mov BANK, #1 push dph push dpl @@ -52,6 +54,10 @@ _crc16: .area BANK1 (CODE) +_crc16: + lcall _crc16_bank1 + ljmp __sdcc_banked_ret + crc16_table_l: .byte #0x00, #0xc1, #0x81, #0x40, #0x01, #0xc0, #0x80, #0x41 .byte #0x01, #0xc0, #0x80, #0x41, #0x00, #0xc1, #0x81, #0x40 diff --git a/httpd/httpd.c b/httpd/httpd.c index cbb41b93..7eb28185 100644 --- a/httpd/httpd.c +++ b/httpd/httpd.c @@ -89,7 +89,7 @@ __xdata uint32_t last_session_use; extern __xdata uint16_t crc_value; __xdata uint16_t crc_final; -void crc16(__xdata uint8_t *v) __naked; +void crc16_bank1(__xdata uint8_t *v) __naked; inline uint8_t is_separator(uint8_t c) @@ -518,7 +518,7 @@ uint8_t stream_upload(void) if (upload_settings.p[upload_settings.bptr] == boundary[bindex]) { if (!bindex) crc_final = crc_value; - crc16(upload_settings.p + upload_settings.bptr); + crc16_bank1(upload_settings.p + upload_settings.bptr); upload_settings.bptr++; bindex++; } else { @@ -527,7 +527,7 @@ uint8_t stream_upload(void) write_len += bindex; bindex = 0; } - crc16(upload_settings.p + upload_settings.bptr); + crc16_bank1(upload_settings.p + upload_settings.bptr); flash_buf[write_len++] = upload_settings.p[upload_settings.bptr++]; if (write_len >= FLASH_PAGE_SIZE) { dbg_string("len: "); dbg_short(write_len); dbg_char(' '); diff --git a/rtlplayground.c b/rtlplayground.c index bbca65b3..23a3e192 100644 --- a/rtlplayground.c +++ b/rtlplayground.c @@ -32,7 +32,7 @@ extern __xdata uint32_t flash_size; extern __xdata uint16_t crc_value; __xdata struct machine_runtime machine_detected; -void crc16(__xdata uint8_t *v) __naked; +void crc16_bank1(__xdata uint8_t *v) __naked; void flash_default_config(void); void early_boot_handle_button(void); @@ -2095,7 +2095,7 @@ void check_and_flash_update_image(void) flash_read_bulk(flash_buf); bptr = flash_buf; for (j = 0; j < FLASH_BUF_SIZE; j++) { - crc16(bptr++); + crc16_bank1(bptr++); } source += FLASH_BUF_SIZE; if (i%16 == 0) write_char('.');