
 1000         .LI MOFF
 1010  *SAVE S.SUPER-FAST PRIMES IMPROVED
 1020         .OR $8000    SAFELY OUT OF WAY
 1030  *--------------------------------
 1040  BASE   .EQ $6000    BASE OF PRIME ARRAY
 1050  BEEP   .EQ $FF3A    BEEP THE SPEAKER
 1060  SQZZZZ .EQ 0,1
 1070  START  .EQ 2
 1080  COUNT  .EQ 4,5
 1090  *--------------------------------
 1100         .MA ZERO
 1110         STA ]1+$000,X
 1120         STA ]1+$100,X
 1130         STA ]1+$200,X
 1140         STA ]1+$300,X
 1150         STA ]1+$400,X
 1160         STA ]1+$500,X
 1170         STA ]1+$600,X
 1180         STA ]1+$700,X
 1190         .EM
 1200  *--------------------------------
 1210  *      MAIN CALLING ROUTINE
 1220  *
 1230  MAIN   LDA #-100   DO 1000 TIMES SO WE CAN MEASURE
 1240         STA COUNT    THE TIME IT TAKES
 1250         LDA /-100
 1260         STA COUNT+1
 1270         JSR BEEP     ANNOUNCE START
 1280  .1     JSR PRIME
 1290         INC COUNT
 1300         BNE .1
 1310         INC COUNT+1
 1320         BNE .1
 1330         JMP BEEP     SAY WE'RE DONE
 1340  *--------------------------------
 1350  *      PRIME ROUTINE
 1360  *      SETS ARRAY STARTING AT BASE
 1370  *      TO $FF IF NUMBER IS NOT PRIME
 1380  *      CHECKS ONLY ODD NUMBERS > 3
 1390  *      INC = INCREMENT OF KNOCKOUT
 1400  *      N = KNOCKOUT VARIABLE
 1410  *--------------------------------
 1420  PRIME
 1430         LDX #0
 1440         TXA          CLEAR WORKING ARRAY
 1450  .1     >ZERO BASE
 1460         >ZERO BASE+$0800
 1470         >ZERO BASE+$1000
 1480         >ZERO BASE+$1800
 1490         INX
 1500         BNE .1       NOT FINISHED CLEARING
 1530  *--------------------------------
 1540         LDA /BASE+4  POINT AT FIRST PRIME-SQUARED
 1550         STA SQZZZZ+1      (WHICH IS 3*3=9)
 1560         LDA #BASE+4
 1570         STA SQZZZZ
 1580         LDA #1       POINT AT FIRST PRIME (3)
 1590         BNE .4       ...ALWAYS
 1600  *--------------------------------
 1610  .2     TXA
 1620         ASL
 1630         ASL
 1640         ADC SQZZZZ
 1650         STA SQZZZZ
 1660         BCC .3
 1670         INC SQZZZZ+1
 1680  .3     LDA BASE,X   GET A POSSIBLE PRIME
 1690         BNE .8       THIS ONE HAS BEEN KNOCKED OUT
 1700         TXA
 1710  *--------------------------------
 1720  .4     STA START
 1730         ASL          INC = START*2 + 1
 1740         ADC #1
 1750         STA .7+1
 1760         LDA SQZZZZ+1 MOVE MULT TO N
 1770         STA .6+2
 1780         LDA SQZZZZ
 1790  .5     TAX
 1800         BEQ .9       ...SPECIAL CASE FOR X=0
 1810  *---STRIKE OUT MULTIPLES---------
 1820  .6     STA $FF00,X  REMEMBER THAT N IS REALLY AT .6+2
 1830  .7     ADC #*-*     N = N + INC
 1840         TAX
 1850         BCC .6       DONT'T BOTHER TO ADD, NO CARRY
 1860         CLC
 1870         INC .6+2      INC HIGH ORDER
 1880         BPL .5       ...NOT FINISHED
 1890  *--------------------------------
 1900         LDX START    GET OUR NEXT KNOCKOUT 
 1910  .8     INX          POINT AT NEXT ODD NUMBER
 1920         CPX #64      UP TO 127
 1930         BCC .2       WE'RE DONE IF X>127
 1940         RTS 
 1950  *--------------------------------
 1960  .9     LDA .6+2
 1970         STA .10+2
 1980  .10    STA $FF00
 1990         TXA
 2000         BEQ .7       ...ALWAYS
 2010  *--------------------------------

