diff options
1 files changed, 41 insertions, 6 deletions
| -rw-r--r-- | isprime/isprime.oph.s | 47 |
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" |
