1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-06-03 07:29:37 +00:00
kickc/src/test/kc/sprite-font.c
2020-12-30 01:55:04 +01:00

144 lines
2.7 KiB
C

// Create a sprite font using lines
#include <c64.h>
#include <string.h>
char* const SCREEN = 0x0400;
char* const SPRITE = 0x2000;
char* const SPRITES = SCREEN+OFFSET_SPRITE_PTRS;
void* const GENERATOR = 0x0900;
void main() {
memset(SCREEN, ' ', 1000);
*SPRITES_ENABLE = 1;
SPRITES_XPOS[0] = 100;
SPRITES_YPOS[0] = 100;
SPRITES_COLOR[0] = WHITE;
SPRITES[0] = toSpritePtr(SPRITE);
memset(SPRITE,0,64);
asm { jsr GENERATOR }
}
kickasm (pc GENERATOR) {{
.label line_idx=$f6
.label line_def=$f7
.label line_xpos=$f7
.label line_ypos=$f8
.label line_xadd=$f9
.label line_yadd=$fa
.label line_len =$fb
.label xpos=$fc
.label ypos=$fd
.label sprite=$fe
init:
lda #<SPRITE
sta sprite
lda #>SPRITE
sta sprite+1
lda #0
sta line_idx
lines: // Draw a number of lines th make up a letter
ldy #0
ldx line_idx
!:
lda LINES,x
sta line_def,y
inx
iny
cpy #5
bne !-
stx line_idx
cpx #LINES_END-LINES+5
bcc !+
rts
!:
jsr line
jmp lines
line: // Draw a single line using uint[5.3] fixed point additions to xpos & ypos
lda line_xpos
lsr
lsr
lsr
sta xpos
lda line_ypos
lsr
lsr
lsr
sta ypos
jsr plot
clc
lda line_xpos
adc line_xadd
sta line_xpos
clc
lda line_ypos
adc line_yadd
sta line_ypos
dec line_len
bne line
rts
plot: // plots one point (xpos,ypos) into a sprite
ldx #7
lda xpos
axs #0 // X = xpos&7
lsr
lsr
lsr
clc
adc ypos
adc ypos
adc ypos
tay // Y = xpos/8+ypos*3
lda #0
sec
!:
ror
dex
bpl !- // A = xpos bit
ora (sprite),y
sta (sprite),y
rts
// Table with line definitions (uint[5.3] x_start, uint[5.3] y_start, uint[5.3] x_add, uint[5.3] y_add, uint8 length)
LINES:
/*
// A
linedef( 0, 20, 12, 0)
linedef( 11, 0, 23, 20)
linedef( 0, 11, 23, 11)
// B
linedef( 0, 0, 0, 20)
linedef( 0, 0, 23, 6)
linedef( 0, 10, 23, 4)
linedef( 0, 10, 23, 16)
linedef( 0, 20, 23, 14)
// C
*/
linedef( 0, 6, 12, 0)
linedef( 11, 0, 23, 6)
linedef( 0, 6, 0, 14)
linedef( 0, 14, 12, 20)
linedef( 11, 20, 23, 15)
LINES_END:
// Generates a line definition for a specific line
// Output format (uint[5.3] x_start, uint[5.3] y_start, uint[5.3] x_add, uint[5.3] y_add, uint8 length)
.macro linedef(from_x, from_y, to_x, to_y) {
.var d_x = to_x-from_x;
.var d_y = to_y-from_y;
.if(abs(d_x)<abs(d_y)) {
.var len = abs(d_y)
.byte 4+8*from_x, 4+8*from_y, 8*d_x/len, 8*d_y/len, len+1
} else {
.var len = abs(d_x)
.byte 4+8*from_x, 4+8*from_y, 8*d_x/len, 8*d_y/len, len+1
}
}
}}