diff options
| Commit | cf970656bbca915938104a83290a358ba3c4bf17 (patch) | |
|---|---|---|
| Author | 2025-08-01 11:41:52 +0300 | |
| Committer | 2025-08-01 11:41:52 +0300 | |
| Files | 362b9155379f51afc0ee6904d0370a37217d8799 | |
| c64-programs-cf970656bbca915938104a83290a358ba3c4bf17.tar c64-programs-cf970656bbca915938104a83290a358ba3c4bf17.tar.gz c64-programs-cf970656bbca915938104a83290a358ba3c4bf17.zip | ||
| Parent | 6d08ffeee63a9b4d114542eb9ee59589eed573d2 (diff) | |
feat(isprime): Implemented prime checking loop
2 files changed, 63 insertions, 12 deletions
| -rw-r--r-- | isprime/isprime.oph.s | 46 | ||||
| -rw-r--r-- | isprime/kernal.oph.s | 29 |
diff --git a/isprime/isprime.oph.s b/isprime/isprime.oph.s index e58852b..4066531 100644 --- a/isprime/isprime.oph.s +++ b/isprime/isprime.oph.s @@ -6,8 +6,8 @@ .require "basic_starter.oph.s" .require "kernal.oph.s" -.alias check_first 97 -.alias check_last 104 +.alias check_first 13 +.alias check_last 40 main: .scope @@ -38,12 +38,14 @@ isprimex_cli: * `print no ; else print "No" rts ; return +max: .byte 0 + isprimex: .scope sec ; if (number < 2) // equivalent to "number <= 1" txa ; // a = x sbc #2 ; // a -= 2 + 0 - bmi _negative ; return False + bmi _false ; return False sbc #2 ; if (number < 2) // since it was already subtracted, this is equal to "number < 4" or "number <= 3" bmi _end ; return True @@ -53,17 +55,41 @@ isprimex: beq _end ; return False txa - `mod 3 ; if (number % 3 == 0) + `mod 3 ; if (number % 3 == 0) beq _end ; return False - ;lda number - ;ldx #3 - ;stx mod_n - ;jsr mod_addr + ldy #6 ; y = 6 + stx max ; max = x + lsr max ; max /= 2 + +_loop: cpy max ; if (y >= max) + bcs _true ; return True + + dey ; --y + txa ; a = x + `mody ; if (a % y == 0) + beq _end ; return False + + iny ; ++y + iny ; ++y + txa ; a = x + `mody ; if (a % y == 0) + beq _end ; return False + + iny ; ++y + iny ; ++y + iny ; ++y + iny ; ++y + iny ; ++y + iny ; ++y + cpy #5 ; while (y < max) + bcc _loop + +_true: lda #1 ; return True _end: rts -_negative: lda #0 - rts +_false: lda #0 ; return False + rts .scend .charmap 'A, "abcdefghijklmnopqrstuvwxyz" diff --git a/isprime/kernal.oph.s b/isprime/kernal.oph.s index b39d212..5dda4a4 100644 --- a/isprime/kernal.oph.s +++ b/isprime/kernal.oph.s @@ -14,9 +14,15 @@ tax .macend -printx: +.macro printm + lda _1 + jsr printa +.macend + +printx: txa ; a = x + +printa: .scope - txa ; a = x cmp #10 ; if (a < 10) bcc _1digit cmp #100 ; if (a < 100) @@ -59,6 +65,25 @@ _end: buffer: .byte 0 +; a = a % MemoryAddress +.macro modm + cmp _1 ; if (a < _1) return + bcc _end + + sec ; carry = 1 +_loop: sbc _1 ; do a -= _1 + !carry + beq _end ; if (a == 0) break + cmp _1 ; while (a >= _1) + bcs _loop +_end: +.macend + +; a = a % y +.macro mody + sty buffer + `modm buffer +.macend + ; a = a / _1 .macro div ora #0 ; The CMP (and friends) instruction changes the carry and zero flag, |
