diff options
| -rw-r--r-- | src/edbox.c | 3 | ||||
| -rw-r--r-- | src/irc.c | 5 | ||||
| -rw-r--r-- | src/memclear.h | 1 | ||||
| -rw-r--r-- | src/memclear.s | 33 | ||||
| -rw-r--r-- | src/screen.c | 11 |
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; } @@ -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) { |
