mirror of
https://gitlab.com/camelot/kickc.git
synced 2024-09-29 03:56:15 +00:00
151 lines
3.1 KiB
NASM
151 lines
3.1 KiB
NASM
// 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
|
|
lda #>FONT_HEX_PROTO
|
|
sta.z proto_hi+1
|
|
lda #<CHARSET
|
|
sta.z charset
|
|
lda #>CHARSET
|
|
sta.z charset+1
|
|
__b1:
|
|
lda #0
|
|
sta.z c1
|
|
lda #<FONT_HEX_PROTO
|
|
sta.z proto_lo
|
|
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
|