From 4b4c1a130a3ef64f3f788e2ebd46cfc3b0e121fc Mon Sep 17 00:00:00 2001 From: Syndamia Date: Fri, 1 Aug 2025 12:40:20 +0300 Subject: feat(isprime): Clean up and add comments for implementation --- isprime/isprime.oph.s | 85 +++++++++++++++++++++++++-------------------------- isprime/kernal.oph.s | 3 ++ 2 files changed, 45 insertions(+), 43 deletions(-) diff --git a/isprime/isprime.oph.s b/isprime/isprime.oph.s index 4066531..262e8f7 100644 --- a/isprime/isprime.oph.s +++ b/isprime/isprime.oph.s @@ -40,55 +40,54 @@ isprimex_cli: max: .byte 0 +; accumulator is zero if not prime and nonzero otherwise isprimex: .scope - sec ; if (number < 2) // equivalent to "number <= 1" - txa ; // a = x - sbc #2 ; // a -= 2 + 0 - 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 - - txa ; if (number % 2 == 0) - and #1 ; // number & 0b0001 == 0 - beq _end ; return False - - txa - `mod 3 ; if (number % 3 == 0) - beq _end ; return False - - 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) + cpx #2 ; if (x < 2) // x <= 1 + bcc _false ; return False + + cpx #4 ; if (x < 4) // x <= 3 + bcc _true + + txa ; a = x + and #1 ; if (a % 2 == 0) // a & 0b0001 == 0 + beq _end ; return False + + txa ; a = x + `mod 3 ; if (a % 3 == 0) + beq _end ; return False + + ldy #6 ; y = 6 + stx max ; max = x + lsr max ; max /= 2 + +_loop: cpy max ; do 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 +_true: lda #1 ; return True _end: rts -_false: lda #0 ; return False +_false: lda #0 ; return False rts .scend diff --git a/isprime/kernal.oph.s b/isprime/kernal.oph.s index 5dda4a4..8d4a69e 100644 --- a/isprime/kernal.oph.s +++ b/isprime/kernal.oph.s @@ -14,13 +14,16 @@ tax .macend +; print value (byte) at address as a number .macro printm lda _1 jsr printa .macend +; print register x as a number printx: txa ; a = x +; print register a as a number printa: .scope cmp #10 ; if (a < 10) -- cgit v1.3.1-23-gd82d