aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorB. Watson <urchlay@slackware.uk>2026-04-12 18:27:28 -0400
committerB. Watson <urchlay@slackware.uk>2026-04-12 18:27:40 -0400
commit6e8899b3b596f74282d21c75cbb7172bb6f9e086 (patch)
treec4cb9066a314234e1f05a1f96e9819a105da76a2
parentaa82c562dbbbdabac2acc43d5002bfe8b46ca646 (diff)
downloadfujinet-chat-6e8899b3b596f74282d21c75cbb7172bb6f9e086.tar.gz
Replace bzero() and memset() with smaller memclear(). 7658 bytes free.
-rw-r--r--src/edbox.c3
-rw-r--r--src/irc.c5
-rw-r--r--src/memclear.h1
-rw-r--r--src/memclear.s33
-rw-r--r--src/screen.c11
5 files changed, 45 insertions, 8 deletions
diff --git a/src/edbox.c b/src/edbox.c
index a82c3ee..7f232fd 100644
--- a/src/edbox.c
+++ b/src/edbox.c
@@ -6,6 +6,7 @@
#include "complete.h"
#include "keytab.h"
#include "irc.h"
+#include "memclear.h"
/* private API stuff (not in edbox.h) that's been rewritten in asm. */
void hide_cursor(void);
@@ -131,7 +132,7 @@ static void del_to_start(void) {
if(!edbox_pos) return;
memmove(edit_box, edit_box + edbox_pos, EDBOX_MAXPOS - edbox_pos);
edbox_len -= edbox_pos;
- bzero(edit_box + edbox_len, EDBOX_MAXPOS - edbox_len);
+ memclear(edit_box + edbox_len, EDBOX_MAXPOS - edbox_len);
edbox_pos = 0;
}
diff --git a/src/irc.c b/src/irc.c
index 14bef03..f87e9f2 100644
--- a/src/irc.c
+++ b/src/irc.c
@@ -14,6 +14,7 @@
#include "kgetc.h"
#include "streq.h"
#include "timers.h"
+#include "memclear.h"
#ifndef VERSION
#define VERSION "?????"
@@ -119,7 +120,7 @@ static void do_priv_nick(void) {
the compiled code smaller, but it grew by ~50 bytes. avoid.
*/
static void print_ping_time(char *p) {
- extern void calc_ping_time(unsigned int j);
+ extern void calc_ping_time(char *p);
scr_print_active("*** ");
scr_print_active(msg_src);
@@ -567,7 +568,7 @@ static void parse_msg(void) {
if(!*msgbuf) return;
msg_cmd = msg_text = msg_src = msg_dest = 0;
- memset(msg_args, 0, sizeof(msg_args));
+ memclear(msg_args, sizeof(msg_args));
/* first token is either the source (with a :) or a command (without) */
if(*msgbuf == ':') {
diff --git a/src/memclear.h b/src/memclear.h
new file mode 100644
index 0000000..042acdc
--- /dev/null
+++ b/src/memclear.h
@@ -0,0 +1 @@
+extern void memclear(const void *addr, unsigned int len);
diff --git a/src/memclear.s b/src/memclear.s
new file mode 100644
index 0000000..1bd7e89
--- /dev/null
+++ b/src/memclear.s
@@ -0,0 +1,33 @@
+ ; void memclear(const char *addr, unsigned int len)
+
+ ; really does have to be an int for the length.
+
+ ; this is basically bzero(), but optimized for size, not speed.
+ ; bzero() is around 2.3x as fast as this, but it's 3.3x as
+ ; much code.
+
+ .importzp ptr1, tmp1
+ .import popptr1
+ .export _memclear
+
+_memclear:
+ stx tmp1 ; hi byte of length
+ tax ; lo stays in X
+ bne @len_ok
+ lda tmp1
+ beq @ret ; if len == 0, don't do anything (just return)
+@len_ok:
+ jsr popptr1 ; addr arg in ptr1. leaves X alone, sets Y=0
+ tya ; A=0
+@loop:
+ sta (ptr1),y
+ iny
+ bne @y_ok
+ inc ptr1+1
+@y_ok:
+ dex
+ bne @loop
+ dec tmp1
+ bpl @loop
+@ret:
+ rts
diff --git a/src/screen.c b/src/screen.c
index 9793a8a..e2ed12c 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -6,6 +6,7 @@
#include "edbox.h"
#include "indic8.h"
#include "streq.h"
+#include "memclear.h"
#define SDLST ((u16 *)0x0230)
@@ -32,12 +33,12 @@ void scr_waitvcount_116(void) {
static void scr_clear(char s) {
if(bonus_addrs[s]) {
- memset(bonus_addrs[s], 0, 1000);
+ memclear(bonus_addrs[s], 1000);
strcpy(bonus_addrs[s], "This is bonus scrollback!");
}
- memset(screen_top_addrs[s], 0, 1000);
- memset(screen_bot_addrs[s], 0, 1000);
- memset(scr_names[s], 0, 32);
+ memclear(screen_top_addrs[s], 1000);
+ memclear(screen_bot_addrs[s], 1000);
+ memclear(scr_names[s], 32);
}
static void scr_scroll(char s) {
@@ -48,7 +49,7 @@ static void scr_scroll(char s) {
memmove(screen_top_addrs[s], screen_top_addrs[s] + 40, 960);
memmove(screen_top_addrs[s] + 960, screen_bot_addrs[s], 40);
memmove(screen_bot_addrs[s], screen_bot_addrs[s] + 40, 920);
- memset(screen_lastlines[s], 0, 40);
+ memclear(screen_lastlines[s], 40);
}
void scr_init(void) {