diff options
| Commit | a2325fbab98108fd061913c3b42ff1b0325f8e27 (patch) | |
|---|---|---|
| Author | 2025-07-31 11:32:59 +0300 | |
| Committer | 2025-07-31 11:32:59 +0300 | |
| Files | a05780fbd6ac05f6037d285d7e177764c95d4dfe | |
| c64-programs-a2325fbab98108fd061913c3b42ff1b0325f8e27.tar c64-programs-a2325fbab98108fd061913c3b42ff1b0325f8e27.tar.gz c64-programs-a2325fbab98108fd061913c3b42ff1b0325f8e27.zip | ||
| Parent | c1f0d07847f3652f1f4e63015f928b9a1c1bb825 (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.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" |
