LDC R0, #100 // n
LDC R1, #1   // incrementor
LDC R2, #2   // addr
LDC R3, #1   // value (all start as prime)

fill:
STR R3, 0(R2)
ADD R2, R2, R1
SUB R4, R0, R2
JMPN R4, filldone
JMP fill

LDC R2, #2  // addr
sieve:
SUB R7, R0, R2
JMPN R7, sievedone
NOP //LDR R4, 0(R2)
NOP //ADD R2, R2, R1
NOP //JMPZ R4, sieve
NOP //SUB R2, R2, R1
LDC R4, #2 // multiplier
LDC R6, #0 // value (composite)
inner:
MUL R5, R4, R2
SUB R7, R0, R5
JMPN R7, innerdone
STR R6, 0(R5)
ADD R4, R4, R1
JMP inner
innerdone:
ADD R2, R2, R1
JMP sieve
sievedone:

LDC R2, #2  // addr
display:
SUB R7, R0, R2
JMPN R7, displaydone
LDR R4, 0(R2)
ADD R2, R2, R1
JMPZ R4, display
SUB R15, R2, R1 // R15 <- prime
NOP //ADD R2, R2, R1
JMP display
displaydone:

END
