mirror of
https://github.com/logicog/RTLPlayground.git
synced 2026-10-29 17:54:14 +08:00
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.
This commit is contained in:
1 parent
dd09be9dd0
commit
53f12a42c5
3 files changed
+12
-6
No files matched your search
@@ -3,6 +3,8 @@
|
|||||||
;
|
;
|
||||||
.globl _crc_value
|
.globl _crc_value
|
||||||
.globl _crc16
|
.globl _crc16
|
||||||
|
.globl _crc16_bank1
|
||||||
|
.globl __sdcc_banked_ret
|
||||||
.equ BANK, 0x96
|
.equ BANK, 0x96
|
||||||
; .equ DPS, 0x86
|
; .equ DPS, 0x86
|
||||||
; Variable in XMEM holding current CRC16 value, being updated
|
; Variable in XMEM holding current CRC16 value, being updated
|
||||||
@@ -18,7 +20,7 @@ _crc_value::
|
|||||||
.area HOME (CODE)
|
.area HOME (CODE)
|
||||||
.area CSEG (CODE)
|
.area CSEG (CODE)
|
||||||
; .area BANK1 (CODE)
|
; .area BANK1 (CODE)
|
||||||
_crc16:
|
_crc16_bank1:
|
||||||
mov BANK, #1
|
mov BANK, #1
|
||||||
push dph
|
push dph
|
||||||
push dpl
|
push dpl
|
||||||
@@ -52,6 +54,10 @@ _crc16:
|
|||||||
|
|
||||||
.area BANK1 (CODE)
|
.area BANK1 (CODE)
|
||||||
|
|
||||||
|
_crc16:
|
||||||
|
lcall _crc16_bank1
|
||||||
|
ljmp __sdcc_banked_ret
|
||||||
|
|
||||||
crc16_table_l:
|
crc16_table_l:
|
||||||
.byte #0x00, #0xc1, #0x81, #0x40, #0x01, #0xc0, #0x80, #0x41
|
.byte #0x00, #0xc1, #0x81, #0x40, #0x01, #0xc0, #0x80, #0x41
|
||||||
.byte #0x01, #0xc0, #0x80, #0x41, #0x00, #0xc1, #0x81, #0x40
|
.byte #0x01, #0xc0, #0x80, #0x41, #0x00, #0xc1, #0x81, #0x40
|
||||||
|
|||||||
+3
-3
@@ -89,7 +89,7 @@ __xdata uint32_t last_session_use;
|
|||||||
|
|
||||||
extern __xdata uint16_t crc_value;
|
extern __xdata uint16_t crc_value;
|
||||||
__xdata uint16_t crc_final;
|
__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)
|
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 (upload_settings.p[upload_settings.bptr] == boundary[bindex]) {
|
||||||
if (!bindex)
|
if (!bindex)
|
||||||
crc_final = crc_value;
|
crc_final = crc_value;
|
||||||
crc16(upload_settings.p + upload_settings.bptr);
|
crc16_bank1(upload_settings.p + upload_settings.bptr);
|
||||||
upload_settings.bptr++;
|
upload_settings.bptr++;
|
||||||
bindex++;
|
bindex++;
|
||||||
} else {
|
} else {
|
||||||
@@ -527,7 +527,7 @@ uint8_t stream_upload(void)
|
|||||||
write_len += bindex;
|
write_len += bindex;
|
||||||
bindex = 0;
|
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++];
|
flash_buf[write_len++] = upload_settings.p[upload_settings.bptr++];
|
||||||
if (write_len >= FLASH_PAGE_SIZE) {
|
if (write_len >= FLASH_PAGE_SIZE) {
|
||||||
dbg_string("len: "); dbg_short(write_len); dbg_char(' ');
|
dbg_string("len: "); dbg_short(write_len); dbg_char(' ');
|
||||||
|
|||||||
+2
-2
@@ -32,7 +32,7 @@ extern __xdata uint32_t flash_size;
|
|||||||
|
|
||||||
extern __xdata uint16_t crc_value;
|
extern __xdata uint16_t crc_value;
|
||||||
__xdata struct machine_runtime machine_detected;
|
__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 flash_default_config(void);
|
||||||
void early_boot_handle_button(void);
|
void early_boot_handle_button(void);
|
||||||
|
|
||||||
@@ -2095,7 +2095,7 @@ void check_and_flash_update_image(void)
|
|||||||
flash_read_bulk(flash_buf);
|
flash_read_bulk(flash_buf);
|
||||||
bptr = flash_buf;
|
bptr = flash_buf;
|
||||||
for (j = 0; j < FLASH_BUF_SIZE; j++) {
|
for (j = 0; j < FLASH_BUF_SIZE; j++) {
|
||||||
crc16(bptr++);
|
crc16_bank1(bptr++);
|
||||||
}
|
}
|
||||||
source += FLASH_BUF_SIZE;
|
source += FLASH_BUF_SIZE;
|
||||||
if (i%16 == 0) write_char('.');
|
if (i%16 == 0) write_char('.');
|
||||||
|
|||||||
Reference in new issue
Block a user