/// @file /// A lightweight library for printing on the C64. /// /// Printing with this library is done by calling print_ function for each element // Commodore 64 PRG executable file .file [name="sieve-kc.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(__start) .const COUNT = $4000 .const SQRT_COUNT = $80 .label print_screen = $400 .label last_time = $a .label print_line_cursor = 4 .label Ticks = 8 .label Ticks_1 = 6 .label print_char_cursor = 2 .segment Code __start: { // unsigned int last_time lda #<0 sta.z last_time sta.z last_time+1 jsr main rts } main: { // start() jsr start // round() jsr round // round() jsr round // round() jsr round // round() jsr round // round() jsr round // round() jsr round // round() jsr round // round() jsr round // round() jsr round // round() jsr round // end() jsr end // } rts } start: { .label LAST_TIME = last_time // asm jsr $ffde sta LAST_TIME stx LAST_TIME+1 // } rts } round: { .label p = 4 .label S = 2 lda #Sieve sta.z p+1 __b1: // for(char* p=Sieve;pSieve+COUNT bcc __b2 bne !+ lda.z p cmp #Sieve adc #0 sta.z S+1 __b6: // while (S < Sieve + COUNT) lda.z S+1 cmp #>Sieve+COUNT bcc __b7 bne !+ lda.z S cmp #print_screen sta.z print_char_cursor+1 jsr print_uchar // print_uchar(BYTE0(w)) ldx.z w jsr print_uchar // } rts } // Print a newline print_ln: { lda #print_screen sta.z print_line_cursor+1 __b1: // print_line_cursor + 0x28 lda #$28 clc adc.z print_line_cursor sta.z print_line_cursor bcc !+ inc.z print_line_cursor+1 !: // while (print_line_cursor>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 } // Print a single char // void print_char(__register(A) char ch) print_char: { // *(print_char_cursor++) = ch ldy #0 sta (print_char_cursor),y // *(print_char_cursor++) = ch; inc.z print_char_cursor bne !+ inc.z print_char_cursor+1 !: // } rts } .segment Data print_hextab: .text "0123456789abcdef" .align $100 Sieve: .fill COUNT, 0