The VIC has the ability to display not only the charsets build into the rom, but also custom made ones. For each character 8 bytes are reserved so they represent 8×8 pixels. The Petscii Character '@' uses the first 8 bytes, the 'a' the second 8 bytes etc.
Contrary to the bitmap mode these 8×8 pixel blocks can be freely positioned on the screen. Advantageously the blocks can be ordered in a way so that the y coordinate equals the byte offset in the charset. Character '@' represents the y coordinates 0-7, character 'a' the coordinated 8-15 etc.
If you code an effect with rotation, for example a vector, than in a 16×16 square the edge chars are often not used at all. Than it is better to order the chars in a circular grid like this:
This has the advantage of covering a bigger area.
This code uses the ca65 assembler.
ichar ldx #0 initic txa ldy #0 i2 sta scrn,y clc adc #icharhigh iny cpy #icharwidth bne i2 lda i2+1 clc adc #scrwidth sta i2+1 bcc *+5 inc i2+2 inx cpx #icharhigh bne initic rts
The coordinates are passed in the X and Y registers.
plotpixel lda #<charset sta $fb ; ptr = (x / 8) * 128 txa lsr ; x / 8 lsr lsr lsr ; * 128 (16-bit) ror $fb adc #>charset sta $fc ; mask = 2 ^ (x & 3) txa and #%00000111 tax lda ($fb),y ora bitmask,x sta ($fb),y rts bitmask .byte $80,$40,$20,$10,$08,$04,$02,$01