diff options
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\:\ \ |
