Summary Files Commits Branches @commit @diff @stats
diff options
context:
space:
mode:
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"