Summary Files Commits Branches @commit @diff @stats
diff options
context:
space:
mode:
Commita2325fbab98108fd061913c3b42ff1b0325f8e27 (patch)
Author
 Syndamia <kamen@syndamia.com>
2025-07-31 11:32:59 +0300
Committer
 Syndamia <kamen@syndamia.com>
2025-07-31 11:32:59 +0300
Filesa05780fbd6ac05f6037d285d7e177764c95d4dfe
c64-programs-a2325fbab98108fd061913c3b42ff1b0325f8e27.tar
c64-programs-a2325fbab98108fd061913c3b42ff1b0325f8e27.tar.gz
c64-programs-a2325fbab98108fd061913c3b42ff1b0325f8e27.zip
Parentc1f0d07847f3652f1f4e63015f928b9a1c1bb825 (diff)
feat(isprime): Implement modulo operation
One implementation as macro, where we're dividing by a constant and a procedure where we're diving by memory value
1 files changed, 41 insertions, 6 deletions
-rw-r--r--isprime/isprime.oph.s47
diff --git a/isprime/isprime.oph.s b/isprime/isprime.oph.s
index 9fbc15e..e4824fa 100644
--- a/isprime/isprime.oph.s
+++ b/isprime/isprime.oph.s
@@ -6,16 +6,51 @@
.require "basic_starter.oph.s"
.require "kernal.oph.s"
-number: .word 1
+number: .word 15
main:
`lowercase
- lda number
+ jsr isprime ; a = isprime(number)
bne + ; if (a == 0)
- `print yes
- rts
-* `print no
- rts
+ `print no ; print "No"
+ rts ; return
+* `print yes ; else print "Yes"
+ rts ; return
+
+isprime:
+.scope
+ lda #1 ; if (number & 0b0001 == 0)
+ and number
+ beq _end ; return False
+ ;`mod number, 3 ; if (number % 3 == 0)
+ ;beq _end ; return False
+ lda number
+ ldx #3
+ stx mod_n
+ jsr mod_addr
+_end: rts
+.scend
+
+.macro mod ; 12 cycles (2+4+2+2+2) raw
+ sec ; carry = 0
+ lda _1 ; a = _1
+_loop: sbc #_2 ; do a -= _2 + carry
+ beq _end ; if (a == 0) break
+ bpl _loop ; while (a >= 0)
+_end:
+.macend
+
+mod_n: .word 0
+
+; a % mod_n
+mod_addr: ; 16 cycles (2+4+2+2+6) raw + 18 cycles (4+4+4+6) raw for arguments
+.scope
+ sec ; carry = 0
+_loop: sbc mod_n ; do a -= mod_n + carry
+ beq _end ; if (a == 0) break
+ bpl _loop ; while (a >= 0)
+_end: rts
+.scend
.charmap 'A, "abcdefghijklmnopqrstuvwxyz"
.charmap 'a, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"