From 8324edc5f7cd00f6abadebaf5ca58caca62e25a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20van=20Dorst?= Date: Sat, 18 Apr 2026 20:43:40 +0200 Subject: [PATCH 01/14] cmd_parser: Improve atoi_byte() and atoi_short(). Because no memory type is specified to the reference location, sdcc is using a helper function to access the location. But sdcc is using a register to tell the helper function which memory-type is used. This registers must also be preseved until all access to that location is done. --- cmd_parser.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/cmd_parser.c b/cmd_parser.c index c56105e..08f9659 100644 --- a/cmd_parser.c +++ b/cmd_parser.c @@ -169,30 +169,33 @@ uint8_t atoi_hex(uint8_t idx) } -uint8_t atoi_byte(register uint8_t *out, register uint8_t idx) +uint8_t atoi_byte(uint8_t __xdata *out, uint8_t idx) { - __xdata uint8_t err = 1; - *out = 0; + uint8_t err = 1; + uint8_t num = 0; while (isnumber(cmd_buffer[idx])) { err = 0; - *out = (*out * 10) + cmd_buffer[idx] - '0'; + num = (num * 10) + cmd_buffer[idx] - '0'; idx++; } + + *out = num; return err; } -uint8_t atoi_short(register uint16_t *vlan, register uint8_t idx) +uint8_t atoi_short(uint16_t __xdata *vlan, uint8_t idx) { - __xdata uint8_t err = 1; - *vlan = 0; + uint8_t err = 1; while (isnumber(cmd_buffer[idx])) { err = 0; - *vlan = (*vlan * 10) + cmd_buffer[idx] - '0'; + uint8_t val = cmd_buffer[idx] - '0'; + *vlan = (*vlan * 10) + val; idx++; } + return err; } From 642030c7b2b59a52b80ccc83bc37840afea26809 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20van=20Dorst?= Date: Sat, 18 Apr 2026 21:39:43 +0200 Subject: [PATCH 02/14] uip: de-__gptrget()-call in uip_add32() --- uip/uip.c | 2 +- uip/uip_arch.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/uip/uip.c b/uip/uip.c index 40c018c..6afd3be 100644 --- a/uip/uip.c +++ b/uip/uip.c @@ -241,7 +241,7 @@ __xdata struct uip_stats uip_stat; #if ! UIP_ARCH_ADD32 void -uip_add32(u8_t *op32, u16_t op16) +uip_add32(u8_t __xdata * op32, u16_t op16) { uip_acc32[3] = op32[3] + (op16 & 0xff); uip_acc32[2] = op32[2] + (op16 >> 8); diff --git a/uip/uip_arch.h b/uip/uip_arch.h index 71fd84b..5d408d9 100644 --- a/uip/uip_arch.h +++ b/uip/uip_arch.h @@ -81,7 +81,7 @@ * * \param op16 A 16-bit integer in host byte order. */ -void uip_add32(u8_t *op32, u16_t op16); +void uip_add32(u8_t __xdata * op32, u16_t op16); /** * Calculate the Internet checksum over a buffer. From 8134ca7ec74c409deb0bd1a506da86d44108f6ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20van=20Dorst?= Date: Sat, 18 Apr 2026 21:45:33 +0200 Subject: [PATCH 03/14] uip: de-__gptrget()-call in uip_ipaddr_copy() --- uip/uip.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/uip/uip.h b/uip/uip.h index 2433512..ac644f9 100644 --- a/uip/uip.h +++ b/uip/uip.h @@ -880,8 +880,8 @@ struct uip_udp_conn *uip_udp_new(uip_ipaddr_t *ripaddr, u16_t rport) __banked; */ #if !UIP_CONF_IPV6 #define uip_ipaddr_copy(dest, src) do { \ - ((u16_t *)dest)[0] = ((u16_t *)src)[0]; \ - ((u16_t *)dest)[1] = ((u16_t *)src)[1]; \ + ((u16_t __xdata *)dest)[0] = ((u16_t __xdata *)src)[0]; \ + ((u16_t __xdata *)dest)[1] = ((u16_t __xdata *)src)[1]; \ } while(0) #else /* !UIP_CONF_IPV6 */ #define uip_ipaddr_copy(dest, src) memcpy(dest, src, sizeof(uip_ip6addr_t)) From facc4afe400df439e397490ae437e5bd685e9966 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20van=20Dorst?= Date: Sat, 18 Apr 2026 21:48:55 +0200 Subject: [PATCH 04/14] uip: de-__gptrget()-call in timer_{set,reset,restart,exprired}() --- uip/timer.c | 8 ++++---- uip/timer.h | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/uip/timer.c b/uip/timer.c index cb52151..fd1531c 100644 --- a/uip/timer.c +++ b/uip/timer.c @@ -64,7 +64,7 @@ * */ void -timer_set(struct timer *t, clock_time_t interval) +timer_set(__xdata struct timer *t, clock_time_t interval) { t->interval = interval; t->start = clock_time(); @@ -84,7 +84,7 @@ timer_set(struct timer *t, clock_time_t interval) * \sa timer_restart() */ void -timer_reset(struct timer *t) +timer_reset(__xdata struct timer *t) { t->start += t->interval; } @@ -104,7 +104,7 @@ timer_reset(struct timer *t) * \sa timer_reset() */ void -timer_restart(struct timer *t) +timer_restart(__xdata struct timer *t) { t->start = clock_time(); } @@ -121,7 +121,7 @@ timer_restart(struct timer *t) * */ int -timer_expired(struct timer *t) +timer_expired(__xdata struct timer *t) { return (clock_time_t)(clock_time() - t->start) >= (clock_time_t)t->interval; } diff --git a/uip/timer.h b/uip/timer.h index 057bea4..ef13f78 100644 --- a/uip/timer.h +++ b/uip/timer.h @@ -76,10 +76,10 @@ struct timer { clock_time_t interval; }; -void timer_set(struct timer *t, clock_time_t interval); -void timer_reset(struct timer *t); -void timer_restart(struct timer *t); -int timer_expired(struct timer *t); +void timer_set(__xdata struct timer *t, clock_time_t interval); +void timer_reset(__xdata struct timer *t); +void timer_restart(__xdata struct timer *t); +int timer_expired(__xdata struct timer *t); #endif /* __TIMER_H__ */ From 791f68582de7bac79e9f488289a032019999fdad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20van=20Dorst?= Date: Sat, 18 Apr 2026 21:54:12 +0200 Subject: [PATCH 05/14] httpd: de-__gptrget()-call in string_to_html() --- httpd/page_impl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/httpd/page_impl.c b/httpd/page_impl.c index 270ddb3..09c60b0 100644 --- a/httpd/page_impl.c +++ b/httpd/page_impl.c @@ -97,7 +97,7 @@ void itoa_html(uint8_t v) char_to_html('0' + (v % 10)); } -void string_to_html(register char *s) +void string_to_html(__code char *s) { while (*s) char_to_html(*s++); } From 6c6d11ab33c36762767bc2be43e03718aac6c87b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20van=20Dorst?= Date: Sat, 18 Apr 2026 21:56:29 +0200 Subject: [PATCH 06/14] dhcp: de-__gptrget()-call in dhcp_print_ip() --- dhcp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dhcp.c b/dhcp.c index 9febcca..67c0e50 100644 --- a/dhcp.c +++ b/dhcp.c @@ -82,7 +82,7 @@ struct dhcp_pkt { __xdata uint32_t long_value; -void dhcp_print_ip(uint8_t *a) +void dhcp_print_ip(__xdata uint8_t *a) { itoa(a[0]); write_char('.'); itoa(a[1]); write_char('.'); From 3e599f0e06184dc0f23c225987969bddcc424720 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20van=20Dorst?= Date: Sat, 18 Apr 2026 22:27:55 +0200 Subject: [PATCH 07/14] dhcp: de-__gptrput()-call in ip_opt() --- dhcp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dhcp.c b/dhcp.c index 67c0e50..1a04168 100644 --- a/dhcp.c +++ b/dhcp.c @@ -216,7 +216,7 @@ void dhcp_send_request(void) } -void ip_opt(uint8_t * __xdata ip) +void ip_opt(__xdata uint8_t * ip) { dhcp_state.opt_ptr++; uint8_t len = DHCP_OPT[dhcp_state.opt_ptr++]; From 94bf4425baaf5f797606b9ef0b3b41909a6b4643 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20van=20Dorst?= Date: Sat, 18 Apr 2026 22:38:42 +0200 Subject: [PATCH 08/14] uip: de-__gptrput()-call access to struct uip_udp_conn --- dhcp.h | 2 +- uip/uip.c | 2 +- uip/uip.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dhcp.h b/dhcp.h index fdcc35d..991361b 100644 --- a/dhcp.h +++ b/dhcp.h @@ -35,7 +35,7 @@ struct dhcp_state { uint32_t rebind; uint32_t renewal; - struct uip_udp_conn *conn; + __xdata struct uip_udp_conn *conn; }; typedef struct dhcp_state uip_udp_appstate_t; diff --git a/uip/uip.c b/uip/uip.c index 6afd3be..653591a 100644 --- a/uip/uip.c +++ b/uip/uip.c @@ -465,7 +465,7 @@ uip_connect(register __xdata uip_ipaddr_t *ripaddr, __xdata u16_t rport) __banke #endif /* UIP_ACTIVE_OPEN */ /*---------------------------------------------------------------------------*/ #if UIP_UDP -struct uip_udp_conn * +__xdata struct uip_udp_conn * uip_udp_new(uip_ipaddr_t *ripaddr, u16_t rport) __banked { __xdata struct uip_udp_conn *conn; diff --git a/uip/uip.h b/uip/uip.h index ac644f9..58b3d6c 100644 --- a/uip/uip.h +++ b/uip/uip.h @@ -763,7 +763,7 @@ void uip_send(register __xdata const void *data, register uint16_t len) __banked * \return The uip_udp_conn structure for the new connection or NULL * if no connection could be allocated. */ -struct uip_udp_conn *uip_udp_new(uip_ipaddr_t *ripaddr, u16_t rport) __banked; +__xdata struct uip_udp_conn *uip_udp_new(uip_ipaddr_t *ripaddr, u16_t rport) __banked; /** * Removed a UDP connection. From e79e90dd35aeead0f475e0450f541c7112cf0482 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20van=20Dorst?= Date: Sat, 18 Apr 2026 22:43:25 +0200 Subject: [PATCH 09/14] cmd_parser: de-__gptrput()-call in vlan_ingress_mode_parse() --- cmd_parser.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd_parser.c b/cmd_parser.c index 08f9659..0bc8762 100644 --- a/cmd_parser.c +++ b/cmd_parser.c @@ -447,7 +447,7 @@ err: } -bool vlan_ingress_mode_parse(char c, vlan_ingress_mode_t *mode) +bool vlan_ingress_mode_parse(char c, __xdata vlan_ingress_mode_t *mode) { switch (c) { case 'u': From 52d943d5e4c011bee64effc0d4a7cc746ddac4dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20van=20Dorst?= Date: Sat, 18 Apr 2026 22:47:52 +0200 Subject: [PATCH 10/14] rtlplayground: de-__gptrput()-call in read_reg_timer() --- rtl837x_common.h | 2 +- rtlplayground.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rtl837x_common.h b/rtl837x_common.h index 7933687..2bb15b4 100644 --- a/rtl837x_common.h +++ b/rtl837x_common.h @@ -148,7 +148,7 @@ uint16_t strcpy(register __xdata uint8_t *dst, register const char *s); void tcpip_output(void); uint8_t read_flash(uint8_t bank, __code uint8_t *addr); void get_random_32(void); -void read_reg_timer(uint32_t * tmr); +void read_reg_timer(__xdata uint32_t * tmr); void sfp_print_info(uint8_t sfp); bool gpio_pin_test(uint8_t pin); void set_sys_led_state(uint8_t state); diff --git a/rtlplayground.c b/rtlplayground.c index 2da920e..2d90077 100644 --- a/rtlplayground.c +++ b/rtlplayground.c @@ -688,7 +688,7 @@ void cpy_4(__xdata uint8_t dest[], __xdata uint8_t source[]) } -void read_reg_timer(uint32_t * tmr) +void read_reg_timer(__xdata uint32_t * tmr) { uint8_t * val = (uint8_t *)tmr; SFR_REG_ADDR_U16 = RTL837X_REG_SEC_COUNTER; From d5709bcaf341c15675de85ac04945a3903c80484 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20van=20Dorst?= Date: Sat, 18 Apr 2026 23:20:47 +0200 Subject: [PATCH 11/14] fix atoi --- cmd_parser.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd_parser.c b/cmd_parser.c index 0bc8762..9b2b9b1 100644 --- a/cmd_parser.c +++ b/cmd_parser.c @@ -169,7 +169,7 @@ uint8_t atoi_hex(uint8_t idx) } -uint8_t atoi_byte(uint8_t __xdata *out, uint8_t idx) +uint8_t atoi_byte(__xdata uint8_t *out, uint8_t idx) { uint8_t err = 1; uint8_t num = 0; @@ -185,7 +185,7 @@ uint8_t atoi_byte(uint8_t __xdata *out, uint8_t idx) } -uint8_t atoi_short(uint16_t __xdata *vlan, uint8_t idx) +uint8_t atoi_short(__xdata uint16_t *vlan, uint8_t idx) { uint8_t err = 1; @@ -200,7 +200,7 @@ uint8_t atoi_short(uint16_t __xdata *vlan, uint8_t idx) } -uint8_t parse_ip(register uint8_t idx) +uint8_t parse_ip(uint8_t idx) { __xdata uint8_t b; From 50d06c61bcfe8669d5f96d91c2c02d0a4fc02644 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20van=20Dorst?= Date: Sat, 18 Apr 2026 23:28:09 +0200 Subject: [PATCH 12/14] change prototype uip_udp_new(), saves 1 sram. --- uip/uip.c | 2 +- uip/uip.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/uip/uip.c b/uip/uip.c index 653591a..98e18b5 100644 --- a/uip/uip.c +++ b/uip/uip.c @@ -466,7 +466,7 @@ uip_connect(register __xdata uip_ipaddr_t *ripaddr, __xdata u16_t rport) __banke /*---------------------------------------------------------------------------*/ #if UIP_UDP __xdata struct uip_udp_conn * -uip_udp_new(uip_ipaddr_t *ripaddr, u16_t rport) __banked +uip_udp_new(__xdata uip_ipaddr_t *ripaddr, u16_t rport) __banked { __xdata struct uip_udp_conn *conn; diff --git a/uip/uip.h b/uip/uip.h index 58b3d6c..718d607 100644 --- a/uip/uip.h +++ b/uip/uip.h @@ -763,7 +763,7 @@ void uip_send(register __xdata const void *data, register uint16_t len) __banked * \return The uip_udp_conn structure for the new connection or NULL * if no connection could be allocated. */ -__xdata struct uip_udp_conn *uip_udp_new(uip_ipaddr_t *ripaddr, u16_t rport) __banked; +__xdata struct uip_udp_conn *uip_udp_new(__xdata uip_ipaddr_t *ripaddr, u16_t rport) __banked; /** * Removed a UDP connection. From 224471d676188c75442ca0139bc964c0b3f00624 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20van=20Dorst?= Date: Sat, 18 Apr 2026 23:50:47 +0200 Subject: [PATCH 13/14] uip: move second argument to __xdata free up 4 sram bytes. --- uip/uip.c | 4 ++-- uip/uip.h | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/uip/uip.c b/uip/uip.c index 98e18b5..a15787a 100644 --- a/uip/uip.c +++ b/uip/uip.c @@ -466,7 +466,7 @@ uip_connect(register __xdata uip_ipaddr_t *ripaddr, __xdata u16_t rport) __banke /*---------------------------------------------------------------------------*/ #if UIP_UDP __xdata struct uip_udp_conn * -uip_udp_new(__xdata uip_ipaddr_t *ripaddr, u16_t rport) __banked +uip_udp_new(__xdata uip_ipaddr_t *ripaddr, __xdata u16_t rport) __banked { __xdata struct uip_udp_conn *conn; @@ -1901,7 +1901,7 @@ htons(u16_t val) } /*---------------------------------------------------------------------------*/ void -uip_send(register __xdata const void *data, register uint16_t len) __banked +uip_send(__xdata const void *data, __xdata uint16_t len) __banked { if(len > 0) { uip_slen = len; diff --git a/uip/uip.h b/uip/uip.h index 718d607..d28f295 100644 --- a/uip/uip.h +++ b/uip/uip.h @@ -495,7 +495,7 @@ void uip_unlisten(u16_t port) __banked; * or NULL if no connection could be allocated. * */ -__xdata struct uip_conn *uip_connect(register __xdata uip_ipaddr_t *ripaddr, __xdata u16_t port) __banked; +__xdata struct uip_conn *uip_connect(__xdata uip_ipaddr_t *ripaddr, __xdata u16_t port) __banked; @@ -535,7 +535,7 @@ __xdata struct uip_conn *uip_connect(register __xdata uip_ipaddr_t *ripaddr, __x * * \hideinitializer */ -void uip_send(register __xdata const void *data, register uint16_t len) __banked; +void uip_send(__xdata const void *data, __xdata uint16_t len) __banked; /** * The length of any incoming data that is currently avaliable (if avaliable) @@ -763,7 +763,7 @@ void uip_send(register __xdata const void *data, register uint16_t len) __banked * \return The uip_udp_conn structure for the new connection or NULL * if no connection could be allocated. */ -__xdata struct uip_udp_conn *uip_udp_new(__xdata uip_ipaddr_t *ripaddr, u16_t rport) __banked; +__xdata struct uip_udp_conn *uip_udp_new(__xdata uip_ipaddr_t *ripaddr, __xdata u16_t rport) __banked; /** * Removed a UDP connection. @@ -880,8 +880,8 @@ __xdata struct uip_udp_conn *uip_udp_new(__xdata uip_ipaddr_t *ripaddr, u16_t rp */ #if !UIP_CONF_IPV6 #define uip_ipaddr_copy(dest, src) do { \ - ((u16_t __xdata *)dest)[0] = ((u16_t __xdata *)src)[0]; \ - ((u16_t __xdata *)dest)[1] = ((u16_t __xdata *)src)[1]; \ + ((__xdata u16_t *)dest)[0] = ((__xdata u16_t *)src)[0]; \ + ((__xdata u16_t *)dest)[1] = ((__xdata u16_t *)src)[1]; \ } while(0) #else /* !UIP_CONF_IPV6 */ #define uip_ipaddr_copy(dest, src) memcpy(dest, src, sizeof(uip_ip6addr_t)) @@ -908,8 +908,8 @@ __xdata struct uip_udp_conn *uip_udp_new(__xdata uip_ipaddr_t *ripaddr, u16_t rp * \hideinitializer */ #if !UIP_CONF_IPV6 -#define uip_ipaddr_cmp(addr1, addr2) (((__xdata u16_t *)addr1)[0] == ((u16_t *)addr2)[0] && \ - ((__xdata u16_t *)addr1)[1] == ((u16_t *)addr2)[1]) +#define uip_ipaddr_cmp(addr1, addr2) (((__xdata u16_t *)addr1)[0] == ((__xdata u16_t *)addr2)[0] && \ + ((__xdata u16_t *)addr1)[1] == ((__xdata u16_t *)addr2)[1]) #define uip_ipaddr_cmpx(addr1, addr2) (((__xdata u16_t *)addr1)[0] == ((__xdata u16_t *)addr2)[0] && \ ((__xdata u16_t *)addr1)[1] == ((__xdata u16_t *)addr2)[1]) #define uip_ipaddr_cmpc(addr1, addr2) (((__xdata u16_t *)addr1)[0] == ((__code u16_t *)addr2)[0] && \ From 18225f5d2252823eecc8709505bd3298c05b3e6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20van=20Dorst?= Date: Sun, 19 Apr 2026 00:30:42 +0200 Subject: [PATCH 14/14] uip: more fix. --- uip/uip_arch.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uip/uip_arch.h b/uip/uip_arch.h index 5d408d9..f4547d6 100644 --- a/uip/uip_arch.h +++ b/uip/uip_arch.h @@ -81,7 +81,7 @@ * * \param op16 A 16-bit integer in host byte order. */ -void uip_add32(u8_t __xdata * op32, u16_t op16); +void uip_add32(__xdata u8_t * op32, u16_t op16); /** * Calculate the Internet checksum over a buffer.