diff options
| author | B. Watson <urchlay@slackware.uk> | 2026-04-12 18:27:28 -0400 |
|---|---|---|
| committer | B. Watson <urchlay@slackware.uk> | 2026-04-12 18:27:40 -0400 |
| commit | 6e8899b3b596f74282d21c75cbb7172bb6f9e086 (patch) | |
| tree | c4cb9066a314234e1f05a1f96e9819a105da76a2 /src/memclear.s | |
| parent | aa82c562dbbbdabac2acc43d5002bfe8b46ca646 (diff) | |
| download | fujinet-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.s | 33 |
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 |
