aboutsummaryrefslogtreecommitdiff
path: root/src/memclear.s
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 /src/memclear.s
parentaa82c562dbbbdabac2acc43d5002bfe8b46ca646 (diff)
downloadfujinet-chat-6e8899b3b596f74282d21c75cbb7172bb6f9e086.tar.gz
Replace bzero() and memset() with smaller memclear(). 7658 bytes free.
Diffstat (limited to 'src/memclear.s')
-rw-r--r--src/memclear.s33
1 files changed, 33 insertions, 0 deletions
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