Summary Files Commits Branches @commit @diff @stats
diff options
context:
space:
mode:
Commit8260ce70ea43f3ad77bbe5c70366847077055a04 (patch)
Author
 Syndamia <kamen@syndamia.com>
2025-08-03 13:59:48 +0300
Committer
 Syndamia <kamen@syndamia.com>
2025-08-03 13:59:48 +0300
Filesfc031d16c6a3263b4e0672c0ab715c2b2e41808e
c64-programs-8260ce70ea43f3ad77bbe5c70366847077055a04.tar
c64-programs-8260ce70ea43f3ad77bbe5c70366847077055a04.tar.gz
c64-programs-8260ce70ea43f3ad77bbe5c70366847077055a04.zip
Parentbd6968203f502f3ffaa410c9a616e01d25698c9f (diff)
feat(catalan): Clean up implementation
4 files changed, 44 insertions, 49 deletions
-rw-r--r--catalan/basic_starter.a6514
-rw-r--r--catalan/catalan.a6556
-rw-r--r--catalan/math.a653
-rw-r--r--catalan/print.a6520
diff --git a/catalan/basic_starter.a65 b/catalan/basic_starter.a65
index 5242418..8257a4c 100644
--- a/catalan/basic_starter.a65
+++ b/catalan/basic_starter.a65
@@ -12,11 +12,12 @@
* Since in basic we need to provide a decimal string, but we store a decimal value, we need
* to do this complicated convertion.
*/
-#define main_addr_ch1 "0" + main / 10000
-#define main_addr_ch2 "0" + (main - main / 10000 * 10000) / 1000
-#define main_addr_ch3 "0" + (main - main / 1000 * 1000) / 100
-#define main_addr_ch4 "0" + (main - main / 100 * 100) / 10
-#define main_addr_ch5 "0" + main - main / 10 * 10
+#define addr_to_ch(addr) \
+ "0" + addr / 10000, \
+ "0" + (addr - addr / 10000 * 10000) / 1000, \
+ "0" + (addr - addr / 1000 * 1000) / 100, \
+ "0" + (addr - addr / 100 * 100) / 10, \
+ "0" + addr - addr / 10 * 10
.word $0801 ; Header -- addr 2049
* = $0801 ; Program Counter
@@ -24,8 +25,7 @@
.(
.word eol
.word 10
- .byt $9e," "
- .byt main_addr_ch1,main_addr_ch2,main_addr_ch3,main_addr_ch4,main_addr_ch5,0
+ .byt $9e," ",addr_to_ch(main),0
eol .word 0
.)
diff --git a/catalan/catalan.a65 b/catalan/catalan.a65
index 0f3cc33..b548db4 100644
--- a/catalan/catalan.a65
+++ b/catalan/catalan.a65
@@ -2,41 +2,22 @@
#include "print.a65"
#include "math.a65"
-hello .byt "HELLO, WORLD!",0
-newline .byt 13,0
-
main .(
- lda #3
- sta cat_n
- jsr catalan
- lda cat_Cn
- jsr printa
-/*
- ldy #0
-loop jsr catalan
- lda cat_Cn
- jsr printa
- lda #" "
- putchar()
- iny
- sty cat_n
- cpy #7
+ ldy #0 ; y = 0
+loop jsr catalan ; do catalan()
+ print_num(cat_Cn) ; print cat_Cn
+ putc(#" ") ; print ' '
+ iny ; ++y
+ sty cat_n ; cat_n = y
+ cpy #7 ; while (y < 7)
bcc loop
-*/
-
- rts
+return rts
.)
-/* a = x
- * a *= 4
- * a -= 2
- * b = x
- * ++b
- * a /= b
- * a *= cat_n
- * cat_n = a
- */
catalan .(
+ lda #1 ; a = 1
+ sta Cn ; Cn = a
+
lda n ; a = n
cmp #1 ; if (a < 1)
bcc return ; return
@@ -45,22 +26,20 @@ catalan .(
loop iny ; do ++y
tya ; a = y
+ applya(multa, multa_arg, #4)
; a *= 4
- starg(multa_arg, #4)
- jsr multa
sec ; a -= 2
sbc #2
+ applya(multa, multa_arg, Cn)
+ ; a *= Cn
+
iny ; ++y
sty divisor ; divisor = y
dey ; --y
+ applya(diva, diva_arg, divisor)
; a /= divisor
- starg(diva_arg, divisor)
- jsr diva
- ; a *= Cn
- starg(multa_arg, Cn)
- jsr multa
sta Cn ; Cn = a
cpy n ; while (y < n)
@@ -74,7 +53,4 @@ n .byt 0
divisor .byt 0
.)
-
-buffer .byt 0
-
// vim: noet ts=8 sw=0 lcs=tab\:\ \
diff --git a/catalan/math.a65 b/catalan/math.a65
index 3a93854..9662de7 100644
--- a/catalan/math.a65
+++ b/catalan/math.a65
@@ -8,8 +8,7 @@
pla ; pop a :\
.)
-#define applya(subroutine, valuea, arg, value) .( :\
- lda valuea :\
+#define applya(subroutine, arg, value) .( :\
starg(arg, value) :\
jsr subroutine :\
.)
diff --git a/catalan/print.a65 b/catalan/print.a65
index 655c162..f2b8776 100644
--- a/catalan/print.a65
+++ b/catalan/print.a65
@@ -4,7 +4,17 @@
#include "kernal.a65"
#include "math.a65"
+#define putc(char) .( :\
+ pha ; push a :\
+ lda char ; a = char :\
+ putchar() ; print a :\
+ pla ; push a :\
+.)
+
#define print(str) .( :\
+ pha :\
+ txa :\
+ pha :\
ldx #0 ; x = 0 :\
loop lda str, x ; while (_1[x] != 0) :\
beq end :\
@@ -12,6 +22,16 @@ loop lda str, x ; while (_1[x] != 0) :\
inx ; ++x :\
bne loop ; if (x == 0) break :\
end :\
+ pla :\
+ tax :\
+ pla :\
+.)
+
+#define print_num(value) .( :\
+ pha ; push a :\
+ lda value ; a = value :\
+ jsr printa ; print a :\
+ pla ; push a :\
.)
#define puta() .( :\