Summary Files Commits Branches @commit @diff @stats
diff options
context:
space:
mode:
Commitcf970656bbca915938104a83290a358ba3c4bf17 (patch)
Author
 Syndamia <kamen@syndamia.com>
2025-08-01 11:41:52 +0300
Committer
 Syndamia <kamen@syndamia.com>
2025-08-01 11:41:52 +0300
Files362b9155379f51afc0ee6904d0370a37217d8799
c64-programs-cf970656bbca915938104a83290a358ba3c4bf17.tar
c64-programs-cf970656bbca915938104a83290a358ba3c4bf17.tar.gz
c64-programs-cf970656bbca915938104a83290a358ba3c4bf17.zip
Parent6d08ffeee63a9b4d114542eb9ee59589eed573d2 (diff)
feat(isprime): Implemented prime checking loop
2 files changed, 63 insertions, 12 deletions
-rw-r--r--isprime/isprime.oph.s46
-rw-r--r--isprime/kernal.oph.s29
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,