/// @file /// C standard library string.h /// /// Functions to manipulate C strings and arrays. /// NULL pointer // Commodore 64 PRG executable file .file [name="sieve-min.prg", type="prg", segments="Program"] .segmentdef Program [segments="Basic, Code, Data"] .segmentdef Basic [start=$0801] .segmentdef Code [start=$80d] .segmentdef Data [startAfter="Code"] .segment Basic :BasicUpstart(main) .const COUNT = $4000 /* Up to what number? */ .const SQRT_COUNT = $80 .label SCREEN = $400 /* Sqrt of COUNT */ .label sieve = $1000 .label print_screen = $400 .label print_char_cursor = 2 .segment Code main: { .label i = 2 .label sieve_i = $c .label j = 6 .label s = 8 .label i_1 = $a .label __16 = 4 // memset(sieve, 0, COUNT) // Fill sieve with zeros jsr memset lda #sieve+2 sta.z sieve_i+1 lda #<2 sta.z i lda #>2 sta.z i+1 __b1: // while (i < SQRT_COUNT) lda.z i+1 bne !+ lda.z i cmp #SQRT_COUNT bcc __b2 !: lda #print_screen sta.z print_char_cursor+1 lda #<2 sta.z i_1 lda #>2 sta.z i_1+1 __b7: // for (i = 2; i < 0x04c7; ++i) lda.z i_1+1 cmp #>$4c7 bcc __b8 bne !+ lda.z i_1 cmp #<$4c7 bcc __b8 !: __b11: // (*(SCREEN+999))++; inc SCREEN+$3e7 jmp __b11 __b8: // if (!sieve[i]) lda.z i_1 clc adc #sieve sta.z __16+1 ldy #0 lda (__16),y cmp #0 bne __b9 // print_uint(i) jsr print_uint // print_char(' ') lda #' ' jsr print_char __b9: // for (i = 2; i < 0x04c7; ++i) inc.z i_1 bne !+ inc.z i_1+1 !: jmp __b7 __b2: // if (!*sieve_i) ldy #0 lda (sieve_i),y cmp #0 bne __b3 // unsigned int j = i*2 /* Prime number - mark all multiples */ lda.z i asl sta.z j lda.z i+1 rol sta.z j+1 // unsigned char* s = &sieve[j] lda.z j clc adc #sieve sta.z s+1 __b4: // while (j < COUNT) lda.z j+1 cmp #>COUNT bcc __b5 bne !+ lda.z j cmp #str sta.z dst+1 __b1: // for(char* dst = str; dst!=end; dst++) lda.z dst+1 cmp #>end bne __b2 lda.z dst cmp #>4 txa lsr lsr lsr lsr // print_char(print_hextab[b>>4]) tay lda print_hextab,y // Table of hexadecimal digits jsr print_char // b&0xf lda #$f axs #0 // print_char(print_hextab[b&0xf]) lda print_hextab,x jsr print_char // } rts } .segment Data print_hextab: .text "0123456789abcdef"