diff options
| Commit | 8b54ad5f377b57324937b780408f287c992c0e14 (patch) | |
|---|---|---|
| Author | 2025-08-03 10:43:31 +0300 | |
| Committer | 2025-08-03 10:43:31 +0300 | |
| Files | be50b76914cf9baac8d0d5d7535168dcc971bd88 | |
| c64-programs-8b54ad5f377b57324937b780408f287c992c0e14.tar c64-programs-8b54ad5f377b57324937b780408f287c992c0e14.tar.gz c64-programs-8b54ad5f377b57324937b780408f287c992c0e14.zip | ||
| Parent | 131ea6c22d87eb40bc1db9bd4227f8f4b46af96d (diff) | |
feat(catalan): Implement multiplication with the accumulator subroutine
1 files changed, 44 insertions, 2 deletions
| -rw-r--r-- | catalan/catalan.a65 | 46 |
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\:\ \ |
