; RETURN and CALL are built-in assembler macros, not actual instructions SYMBOL SIEVE_SIZE 62 SYMBOL SIEVE_WORDS 32 SYMBOL TO_SIEVE 33 SYMBOL V_I 34 SYMBOL V_I2 35 SYMBOL RET 36 SYMBOL TEMP 37 SYMBOL ZERO 38 MAIN LDI 0 STA V_I STB ZERO FILL_LOOP LDI 0 LDM V_I LDM STA LDI 1 qADD V_I STB LDI SIEVE_WORDS qEQL V_I JZ FILL_LOOP LDI 3 STA V_I LDI 0 STA V_I2 SIEVE_LOOP CALL IS_IN_SIVE LDI 0 qEQL RET JZ NOT_PRIME LDA V_I STA 63 CALL MARK_MULTIPLES NOT_PRIME LDI 2 qADD V_I STB LDI 1 qADD V_I2 STB LDI SIEVE_SIZE qMAG V_I JNZ SIEVE_LOOP HALT NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP JMP HALT IS_IN_SIVE LDM V_I2 LDM LDA STA RET RETURN MARK_MULTIPLES LDA V_I2 STA TEMP MARK_LOOP LDI 1 // sieve[i] = 1 LDM TEMP LDM STA LDA V_I qADD TEMP STB LDI 0 // Integer overflow exit condition qADC ZERO JNZ MARK_LOOP_END LDI SIEVE_WORDS // i > size size exit condition qMAG TEMP JNZ MARK_LOOP MARK_LOOP_END RETURN