// Shows a font where each char contains the number of the char (00-ff) /// @file /// Commodore 64 Registers and Constants /// @file /// The MOS 6526 Complex Interface Adapter (CIA) /// /// http://archive.6502.org/datasheets/mos_6526_cia_recreated.pdf // Commodore 64 PRG executable file .file [name="font-hex-show.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) /// $D018 VIC-II base addresses // @see #VICII_MEMORY .label D018 = $d018 .label SCREEN = $400 .label CHARSET = $2000 .segment Code main: { .const toD0181_return = (>(SCREEN&$3fff)*4)|(>CHARSET)/4&$f // *D018 = toD018(SCREEN, CHARSET) lda #toD0181_return sta D018 // init_font_hex(CHARSET) jsr init_font_hex ldx #0 // Show all chars on screen __b1: // SCREEN[c] = c txa sta SCREEN,x // for (byte c: 0..255) inx cpx #0 bne __b1 // } rts } // Make charset from proto chars // void init_font_hex(__zp(5) char *charset) init_font_hex: { .label __0 = $b .label idx = $a .label proto_lo = 7 .label charset = 5 .label c1 = 9 .label proto_hi = 2 .label c = 4 lda #0 sta.z c lda #FONT_HEX_PROTO sta.z proto_hi+1 lda #CHARSET sta.z charset+1 __b1: lda #0 sta.z c1 lda #FONT_HEX_PROTO sta.z proto_lo+1 __b2: // charset[idx++] = 0 lda #0 tay sta (charset),y lda #1 sta.z idx ldx #0 __b3: // proto_hi[i]<<4 txa tay lda (proto_hi),y asl asl asl asl sta.z __0 // proto_lo[i]<<1 txa tay lda (proto_lo),y asl // proto_hi[i]<<4 | proto_lo[i]<<1 ora.z __0 // charset[idx++] = proto_hi[i]<<4 | proto_lo[i]<<1 ldy.z idx sta (charset),y // charset[idx++] = proto_hi[i]<<4 | proto_lo[i]<<1; inc.z idx // for( byte i: 0..4) inx cpx #5 bne __b3 // charset[idx++] = 0 lda #0 ldy.z idx sta (charset),y // charset[idx++] = 0; iny // charset[idx++] = 0 sta (charset),y // proto_lo += 5 lda #5 clc adc.z proto_lo sta.z proto_lo bcc !+ inc.z proto_lo+1 !: // charset += 8 lda #8 clc adc.z charset sta.z charset bcc !+ inc.z charset+1 !: // for( byte c: 0..15 ) inc.z c1 lda #$10 cmp.z c1 bne __b2 // proto_hi += 5 lda #5 clc adc.z proto_hi sta.z proto_hi bcc !+ inc.z proto_hi+1 !: // for( byte c: 0..15 ) inc.z c lda #$10 cmp.z c bne __b1 // } rts } .segment Data // Bit patterns for symbols 0-f (3x5 pixels) used in font hex FONT_HEX_PROTO: .byte 2, 5, 5, 5, 2, 6, 2, 2, 2, 7, 6, 1, 2, 4, 7, 6, 1, 2, 1, 6, 5, 5, 7, 1, 1, 7, 4, 6, 1, 6, 3, 4, 6, 5, 2, 7, 1, 1, 1, 1, 2, 5, 2, 5, 2, 2, 5, 3, 1, 1, 2, 5, 7, 5, 5, 6, 5, 6, 5, 6, 2, 5, 4, 5, 2, 6, 5, 5, 5, 6, 7, 4, 6, 4, 7, 7, 4, 6, 4, 4