68 lines
3.2 KiB
NASM
68 lines
3.2 KiB
NASM
; This is an implementation of The Sieve of Eratosthenes that finds all the primes between 2 and 255.
|
|
|
|
#Include print.asm
|
|
|
|
#Program
|
|
|
|
start:
|
|
; Search the list until we find a prime.
|
|
SETD DataTop
|
|
CCF ; Clear the carry flag. In later cycles, the carry flag will be set at the end of the next loop. We'll want it cleared.
|
|
RSTA
|
|
RSTB
|
|
findPrimeLoop:
|
|
LDB ; Load an element into B.
|
|
BRB foundPrime ; If it's zero, it's a prime.
|
|
INCA ; Increment A, our index.
|
|
INCD ; Increment the Data Pointer.
|
|
BRA end ; If A becomes zero, we've looked through the whole list without finding another prime.
|
|
BRI findPrimeLoop ; Keep searching for the next prime.
|
|
foundPrime:
|
|
; If we've found a prime, we should print it and mark it off the list so we don't print it again.
|
|
CALL printByteDecimal ; A contains our prime, so we can just call the print subroutine.
|
|
CALL blankSpace ; Put a space afterward to keep things easy to read.
|
|
INIB 0x01 ; Set B to 1.
|
|
STB ; Mark this prime off the list.
|
|
markMultiples:
|
|
; Now, we mark each multiple of this prime as nonprime until we reach the end of the list.
|
|
PSHD ; Save the Data Pointer to the stack.
|
|
POPB ; Pop its low byte into B.
|
|
ADD ; Add them together.
|
|
PSHQ ; Store the result back onto the stack.
|
|
POPD ; Pop the modified address into the Data Pointer.
|
|
INIB 0x01 ; Set B to 1.
|
|
STB ; Store B to mark the value as nonprime.
|
|
BRC start ; If the previous add overflowed, the next nonprime is outside the range of our list, so start over with a new prime.
|
|
BRI markMultiples ; Otherwise, loop again to mark the next multiple as nonprime.
|
|
end:
|
|
CALL lineFeed ; Print a linefeed to make it look nice.
|
|
HALT ; The program is done, we found all the primes!
|
|
|
|
|
|
|
|
|
|
#Data
|
|
|
|
; The table of our prime candidates. It has to begin on a page boundary: marking walks
|
|
; the pointer's low byte and treats the carry out as running off the end of the table,
|
|
; which only finds the right end if the table starts on one.
|
|
|
|
#Align 0x100
|
|
DataTop:
|
|
0x01 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
|
|
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
|
|
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
|
|
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
|
|
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
|
|
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
|
|
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
|
|
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
|
|
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
|
|
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
|
|
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
|
|
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
|
|
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
|
|
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
|
|
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
|
|
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
|