Summary Files Commits Branches @commit @diff @stats
diff options
context:
space:
mode:
Commit8b54ad5f377b57324937b780408f287c992c0e14 (patch)
Author
 Syndamia <kamen@syndamia.com>
2025-08-03 10:43:31 +0300
Committer
 Syndamia <kamen@syndamia.com>
2025-08-03 10:43:31 +0300
Filesbe50b76914cf9baac8d0d5d7535168dcc971bd88
c64-programs-8b54ad5f377b57324937b780408f287c992c0e14.tar
c64-programs-8b54ad5f377b57324937b780408f287c992c0e14.tar.gz
c64-programs-8b54ad5f377b57324937b780408f287c992c0e14.zip
Parent131ea6c22d87eb40bc1db9bd4227f8f4b46af96d (diff)
feat(catalan): Implement multiplication with the accumulator subroutine
1 files changed, 44 insertions, 2 deletions
-rw-r--r--catalan/catalan.a6546
diff --git a/catalan/catalan.a65 b/catalan/catalan.a65
index 7dc73b0..3dd3168 100644
--- a/catalan/catalan.a65
+++ b/catalan/catalan.a65
@@ -3,6 +3,7 @@
hello .byt "HELLO, WORLD!",0
+// accumulator = a * b
#define multiply(a, b) .( :\
lda a ; if (a == 0) :\
beq return ; return 0 :\
@@ -21,6 +22,7 @@ loop clc ; do carry = 0 :\
return :\
.)
+// accumulator = a / b
#define divide(a, b) .( :\
lda b ; if (b == 0) :\
beq return ; return 0 :\
@@ -38,11 +40,51 @@ loop sec ; do carry = 1 :\
return txa :\
.)
-main print(hello)
- divide(#253, #5)
+cat_n .byt 1
+n .byt 0
+
+main
+ lda #3
+ sta multa_arg1
+ lda #14
+ jsr multa
putchar()
rts
+// a *= multa_arg1
+multa .(
+ beq return ; if (a == 0) return a
+ cmp #1 ; if (a == 1)
+ beq r_arg1 ; return arg1
+
+ ldx arg1 ; x = arg1
+ cpx #0 ; if (x == 0)
+ beq r_zero ; return 0
+ cpx #1 ; if (x == 1)
+ beq return ; return a
+
+ dex ; --x // accumulator already has the first value
+ sta addend ; addend = a
+loop clc ; do carry = 0
+ adc addend ; a += addend + carry
+ dex ; --x
+ cpx #1 ; while (x >= 1)
+ bcs loop
+
+return ora #0 ; Update flags, so they're accurate with the accumulator value
+ rts
+
+r_zero lda #0
+ rts
+
+r_arg1 lda arg1
+ rts
+
++multa_arg1
+arg1 .byt 0
+addend .byt 0
+.)
+
buffer .byt 0
// vim: noet ts=8 sw=0 lcs=tab\:\ \