Summary Files Commits Branches @commit @diff @stats
diff options
context:
space:
mode:
Commit5e9819bd6c535f42d68c896e21fa060d048aa43d (patch)
Author
 Syndamia <kamen@syndamia.com>
2025-08-03 12:11:09 +0300
Committer
 Syndamia <kamen@syndamia.com>
2025-08-03 12:11:09 +0300
Files8d3368e46103c5d446acc73f466211703e15b535
c64-programs-5e9819bd6c535f42d68c896e21fa060d048aa43d.tar
c64-programs-5e9819bd6c535f42d68c896e21fa060d048aa43d.tar.gz
c64-programs-5e9819bd6c535f42d68c896e21fa060d048aa43d.zip
Parent9a0030d051bbfe54a987bf3628d9e87779276241 (diff)
feat(catalan): Implement number printing subroutine
3 files changed, 58 insertions, 23 deletions
-rw-r--r--catalan/catalan.a6531
-rw-r--r--catalan/math.a6513
-rw-r--r--catalan/print.a6537
diff --git a/catalan/catalan.a65 b/catalan/catalan.a65
index e7aeace..4b6c01f 100644
--- a/catalan/catalan.a65
+++ b/catalan/catalan.a65
@@ -4,28 +4,13 @@
hello .byt "HELLO, WORLD!",0
-#define store_in_memory(memory, value) .( :\
- pha ; push a :\
- lda value ; a = value :\
- sta memory ; memory = a :\
- pla ; pop a :\
-.)
-
-#define applya1(subroutine, valuea, arg1, value1) .( :\
- lda valuea :\
- store_in_memory(arg1, value1) :\
- jsr subroutine :\
-.)
-
main .(
- applya1(moda, #34, moda_arg, #5)
- clc
- adc #"0"
- putchar()
+ applya(diva, #65, diva_arg, #15)
+ jsr printa
- jsr catalan
- lda cat_n
- putchar()
+ ;jsr catalan
+ ;lda cat_n
+ ;putchar()
rts
.)
@@ -48,7 +33,7 @@ loop inx ; do ++x
txa ; a = x
; a *= 4
- store_in_memory(multa_arg, #4)
+ starg(multa_arg, #4)
jsr multa
sec ; a -= 2
sbc #2
@@ -58,10 +43,10 @@ loop inx ; do ++x
dex ; --x
; a /= divisor
- store_in_memory(diva_arg, divisor)
+ starg(diva_arg, divisor)
jsr diva
; a *= cat_n
- store_in_memory(multa_arg, cat_n)
+ starg(multa_arg, cat_n)
jsr multa
sta Cn ; Cn = a
diff --git a/catalan/math.a65 b/catalan/math.a65
index 667d651..3a93854 100644
--- a/catalan/math.a65
+++ b/catalan/math.a65
@@ -1,6 +1,19 @@
#ifndef CATALAN_MATH
#define CATALAN_MATH
+#define starg(name, value) .( :\
+ pha ; push a :\
+ lda value ; a = value :\
+ sta name ; name = a :\
+ pla ; pop a :\
+.)
+
+#define applya(subroutine, valuea, arg, value) .( :\
+ lda valuea :\
+ starg(arg, value) :\
+ jsr subroutine :\
+.)
+
; a *= multa_arg
multa .(
ora #0 ; Update flags, so they're accurate with the accumulator value
diff --git a/catalan/print.a65 b/catalan/print.a65
index f2038db..655c162 100644
--- a/catalan/print.a65
+++ b/catalan/print.a65
@@ -2,6 +2,7 @@
#define CATALAN_PRINT
#include "kernal.a65"
+#include "math.a65"
#define print(str) .( :\
ldx #0 ; x = 0 :\
@@ -13,5 +14,41 @@ loop lda str, x ; while (_1[x] != 0) :\
end :\
.)
+#define puta() .( :\
+ pha ; push a :\
+ clc ; carry = 0 :\
+ adc #"0" ; a += '0' + carry :\
+ putchar() :\
+ pla ; pop a :\
+.)
+
+; print decimal value of a
+printa .(
+ ora #0 ; Make sure flags correspond to accumulator value
+ cmp #10 ; if (a < 10)
+ bcc digit1
+ cmp #100 ; if (a < 100)
+ bcc digit2
+
+digit3 pha ; push a
+ starg(diva_arg, #100) ; a /= 100
+ jsr diva
+ puta()
+ pla ; pop a
+ starg(moda_arg, #100) ; a %= 100
+ jsr moda
+
+digit2 pha ; push a
+ starg(diva_arg, #10) ; a /= 10
+ jsr diva
+ puta()
+ pla ; pop a
+ starg(moda_arg, #10) ; a %= 10
+ jsr moda
+
+digit1 puta()
+ rts
+.)
+
#endif /* CATALAN_PRINT */
// vim: noet ts=8 sw=0 lcs=tab\:\ \