Summary Files Commits Branches @commit @diff @stats
path: root / catalan / math.a65
diff options
context:
space:
mode:
Commit8a50432af0d883ba9ff4680004c70b6dbbc7b445 (patch)
Author
 Syndamia <kamen@syndamia.com>
2025-08-03 11:12:53 +0300
Committer
 Syndamia <kamen@syndamia.com>
2025-08-03 11:12:53 +0300
Files30a8984694e09c74c7d72280dd8428ef637c0189 /catalan/math.a65
c64-programs-8a50432af0d883ba9ff4680004c70b6dbbc7b445.tar
c64-programs-8a50432af0d883ba9ff4680004c70b6dbbc7b445.tar.gz
c64-programs-8a50432af0d883ba9ff4680004c70b6dbbc7b445.zip
Parentc898780ae18a1864c2d98cb56a73dd535b208a5a (diff)
feat(catalan): Implement catalan and move math subroutines to a separate file
1 files changed, 70 insertions, 0 deletions
-rw-r--r--catalan/math.a6570
diff --git a/catalan/math.a65 b/catalan/math.a65
new file mode 100644
index 0000000..ea45675
--- /dev/null
+++ b/catalan/math.a65
@@ -0,0 +1,70 @@
+#ifndef CATALAN_MATH
+#define CATALAN_MATH
+
+; a *= multa_arg1
+multa .(
+ ora #0 ; Update flags, so they're accurate with the accumulator value
+ 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
+.)
+
+; a /= diva_arg1
+diva .(
+ ora #0 ; Update flags, so they're accurate with the accumulator value
+ beq return ; if (a == 0) return a
+
+ ldx arg1 ; x = arg1
+ cpx #0 ; if (x == 0)
+ beq r_zero ; return 0
+ cpx #1 ; if (x == 1)
+ beq return ; return a
+
+ stx subtrahend ; subtrahend = x
+ ldx #0 ; x = 0
+loop sec ; do carry = 1
+ sbc subtrahend ; a -= addend + !carry
+ inx ; ++x
+ cmp subtrahend ; while (a >= subtrahend)
+ bcs loop
+
+return txa
+ rts
+
+r_zero lda #0
+ rts
+
++diva_arg1
+arg1 .byt 0
+subtrahend .byt 0
+.)
+
+#endif /* CATALAN_MATH */
+// vim: noet ts=9 sw=0 lcs=tab\:\ \