diff options
| Commit | 5e9819bd6c535f42d68c896e21fa060d048aa43d (patch) | |
|---|---|---|
| Author | 2025-08-03 12:11:09 +0300 | |
| Committer | 2025-08-03 12:11:09 +0300 | |
| Files | 8d3368e46103c5d446acc73f466211703e15b535 | |
| c64-programs-5e9819bd6c535f42d68c896e21fa060d048aa43d.tar c64-programs-5e9819bd6c535f42d68c896e21fa060d048aa43d.tar.gz c64-programs-5e9819bd6c535f42d68c896e21fa060d048aa43d.zip | ||
| Parent | 9a0030d051bbfe54a987bf3628d9e87779276241 (diff) | |
feat(catalan): Implement number printing subroutine
3 files changed, 58 insertions, 23 deletions
| -rw-r--r-- | catalan/catalan.a65 | 31 | ||||
| -rw-r--r-- | catalan/math.a65 | 13 | ||||
| -rw-r--r-- | catalan/print.a65 | 37 |
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\:\ \ |
