ML PRIMES
                      By Rick Kephart

  This program shows how to have the computer print out all the prime
numbers from 1 to 10,000. It was written using only the C-128's built-in
ML monitor.

  First, we prepare an area of memory with some non-zero value(s). This
routine will fill the area from $1400 to $3AFF ( 5120 to 15103), which is
9983 bytes (that's enough because the highest prime will be 9973), with
non-zero values:

1300  A9 00    LDA #$00
1302  85 FD    STA $FD;     Use zero-page addressing at $FD-$FE
1304  A8       TAY
1305  A9 14    LDA #$14
1307  85 FE    STA $FE;    Start at $1400

1309  91 FD    STA ($FD),Y
130B  C8       INY
130C  D0 FB    BNE $1309

130E  E6 FE    INC $FE
1310  A5 FE    LDA $FE
1312  C9 3B    CMP #$3B;    Stop when $3B00 is reached
1314  D0 F3    BNE $1309

  Now here is where the sieve is applied. Multiples of all numbers from 2
to 255 are eliminated. Since the square root of 10,000 is 100, it really
isn't necessary to go any higher than that, but to simplify programming
(at the cost of about one second of running time) this program goes all
the way to there, and checks all numbers and not just primes.

1316  A9 02    LDA #$02;    Start eliminations with "2"
1318  85 FC    STA $FC;     $FC holds the current number being eliminated

131A  A5 FC    LDA $FC;     We're not going to eliminate that number, but
131C  18       CLC;         rather every multiple of it, so we start by
131D  65 FC    ADC $FC;     doubling it
131F  85 FD    STA $FD;     And then store it in the zero-page pointer
1321  A9 14    LDA #$14;    The high byte will be $14
1323  69 00    ADC #$00;    Unless the doubling of $FC caused a carry
1325  85 FE    STA $FE

1327  A9 00    LDA #$00
1329  91 FD    STA ($FD),Y; Put a "0" in that space

132B  18       CLC;         Add the value in $FC to the pointer
132C  A5 FD    LDA $FD
132E  65 FC    ADC $FC
1330  85 FD    STA $FD
1332  A5 FE    LDA $FE
1334  69 00    ADC #$00
1336  85 FE    STA $FE

1338  C9 3B    CMP #$3B;    Go as high as $3AFF
133A  D0 EB    BNE $1327

133C  E6 FC    INC $FC;     All multiples from 2 to 255
133E  D0 DA    BNE $131A

  Now, all non-prime numbers have been eliminated, and they are ready to
be printed out.

1340  A9 0D    LDA #$0D;    First a carriage-return
1342  20 D2 FF JSR $FFD2

1345  A9 00    LDA #$00;    $FD and $FE will be used to count in Dcimal
mode
1347  85 FD    STA $FD
1349  85 FE    STA $FE

134B  A9 14    LDA #$14;    A dynamic pointer will be used at $1367
134D  8D 68 13 STA $1368
1350  A9 01    LDA #$01;    No need to start at 0
1352  8D 67 13 STA $1367

1355  78       SEI;         Use DEC mode to count so the number need not
be
1356  F8       SED;         converted from binary to decimal before
printing
1357  18       CLC
1358  A5 FD    LDA $FD
135A  69 01    ADC #$01
135C  85 FD    STA $FD
135E  A5 FE    LDA $FE
1360  69 00    ADC #$00
1362  85 FE    STA $FE
1364  D8       CLD
1365  58       CLI

1366  AD 00 3B LDA $1401;   Get the byte from memory and see if it's
prime
1369  F0 1E    BEQ $1389;   Not prime if it's zero

136B  A2 01    LDX #$01;    Get two bytes of decimal number

136D  A9 20    LDA #$20;    Print a space before it to separate it from
the
136F  20 D2 FF JSR $FFD2;   Previous number printed

1372  B5 FD    LDA $FD,X;   Print the first part of the number
1374  48       PHA
1375  4A       LSR
1376  4A       LSR
1377  4A       LSR
1378  4A       LSR
1379  09 30    ORA #$30
137B  20 D2 FF JSR $FFD2

137E  68       PLA;         Print the second part of the number
137F  29 0F    AND #$0F
1381  09 30    ORA #$30
1383  20 D2 FF JSR $FFD2

1386  CA       DEX;         Get the other byte
1387  F0 E9    BEQ $1372

1389  18       CLC;         Move up the dynamic pointer
138A  AD 67 13 LDA $1367
138D  69 01    ADC #$01
138F  8D 67 13 STA $1367
1392  AD 68 13 LDA $1368
1395  69 00    ADC #$00
1397  8D 68 13 STA $1368

139A  C9 3B    CMP #$3B;    Only go as high as $3AFF
139C  D0 B7    BNE $1355

139E  60       RTS;         End

You can write to me at .

Predicting Prime Numbers: Finding Prime Numbers

HOME Religion Latin  Mass Denton Prayer  Requests Homeschooling
Stories Art ******* Commodore Miniatures
England Italy Florida Musical Gregorian  Chant LPH  Resource  Center