aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorB. Watson <urchlay@slackware.uk>2026-04-02 03:57:58 -0400
committerB. Watson <urchlay@slackware.uk>2026-04-02 03:58:15 -0400
commitab278aca29eebc23eb6538fb5060f51afb8dca86 (patch)
tree486d188812256aeb5f7d0073aaa8f5b38983d60c /src
parent63a7c424ac966f3b824b8bdfcb756f68052533a5 (diff)
downloadfujinet-chat-ab278aca29eebc23eb6538fb5060f51afb8dca86.tar.gz
Rewrite permute_nick() in asm. 5867 bytes free.
Diffstat (limited to 'src')
-rw-r--r--src/irc.c22
-rw-r--r--src/permute.s78
2 files changed, 79 insertions, 21 deletions
diff --git a/src/irc.c b/src/irc.c
index 2fdb8b8..9c2ccd8 100644
--- a/src/irc.c
+++ b/src/irc.c
@@ -363,27 +363,7 @@ static void do_mode(void) {
do_catchall(0);
}
-/* permutes last character (doesn't add one), so for "Bob" you get:
- Bo_, Bo1 through Bo9, BoA through BoZ
- Gives a total of 36 replacement nicks to try.
- Eventually we run out and start repeating, but by then the IRC
- server will have disconnected us.
- */
-static void permute_nick(void) {
- static char *last;
-
- last = conf->nick + strlen(conf->nick) - 1;
-
- if((*last >= '1' && *last < '9') || (*last >= 'A' && *last < 'Z')) {
- (*last)++;
- } else {
- switch(*last) {
- case '_': *last = '1'; break;
- case '9': *last = 'A'; break;
- default: *last = '_'; break;
- }
- }
-}
+extern void permute_nick(void);
/* see: https://defs.ircdocs.horse/ */
static void do_forward_chan(void) {
diff --git a/src/permute.s b/src/permute.s
new file mode 100644
index 0000000..d4206ea
--- /dev/null
+++ b/src/permute.s
@@ -0,0 +1,78 @@
+ .export _permute_nick
+ .importzp ptr1
+
+;permutes last character (doesn't add one), so for "Bob" you get:
+;Bo_, Bo1 through Bo9, BoA through BoZ
+;Gives a total of 36 replacement nicks to try.
+;Eventually we run out and start repeating, but by then the IRC
+;server will have disconnected us.
+
+;; static void permute_nick(void) {
+;; static char *last;
+;;
+;; last = conf->nick + strlen(conf->nick) - 1;
+;;
+;; if((*last >= '1' && *last < '9') || (*last >= 'A' && *last < 'Z')) {
+;; (*last)++;
+;; } else {
+;; switch(*last) {
+;; case '_': *last = '1'; break;
+;; case '9': *last = 'A'; break;
+;; default: *last = '_'; break;
+;; }
+;; }
+;; }
+
+;; WARNING: the address of conf->nick is hardcoded here as $0480.
+;; So is its length (25).
+
+ nick = $0480
+
+_permute_nick:
+ ldy #0
+@l1:
+ lda nick,y
+ beq perm
+ iny
+ cpy #$18 ; stop after 24 chars
+ bne @l1
+
+perm:
+ dey ; last non-null character.
+ lda nick,y
+
+ tax
+
+ cpx #'1'
+ bcc nonnum
+ cpx #'8'+1
+ bcc inc_and_ret
+
+nonnum:
+ cpx #'A'
+ bcc nonaplha
+ cpx #'Z'
+ bcc inc_and_ret
+
+nonaplha:
+ cpx #'_'
+ bne non_uscore
+ ldx #'1'
+ bne ret
+
+non_uscore:
+ cpx #'9'
+ bne non_9
+ ldx #'A'
+ bne ret
+
+non_9:
+ ldx #'_'
+ bne ret
+
+inc_and_ret:
+ inx
+ret:
+ txa
+ sta nick,y
+ rts