210 lines
6.1 KiB
Plaintext
210 lines
6.1 KiB
Plaintext
;license:MIT
|
|
;(c) 2020 by 4am
|
|
;
|
|
; font drawing routines
|
|
;
|
|
; Public functions:
|
|
; - DrawLargeCharacter
|
|
;
|
|
|
|
!macro COMPUTE_DRAW_ADDRESSES {
|
|
ldx charrow
|
|
lda HGRLO, x
|
|
sta $F0
|
|
sta $F2
|
|
inc $F2
|
|
lda HGRHI, x
|
|
sta $F1 ; ($F0) -> base address of top row to draw (used for upper-left block of each character)
|
|
sta $F3 ; ($F2) -> base address + 1 of top row to draw (used for upper-right block of each character)
|
|
ldx char ; X = 0-based index into LeftFontRow0 array for the character we're drawing
|
|
ldy HTAB
|
|
}
|
|
|
|
!macro INC_AND_RECOMPUTE_DRAW_ADDRESSES {
|
|
inc charrow
|
|
+COMPUTE_DRAW_ADDRESSES
|
|
}
|
|
|
|
;------------------------------------------------------------------------------
|
|
; DrawLargeCharacter
|
|
;
|
|
; in: A contains character (0x41..0x5A) or 0x00
|
|
; X contains logical line number (0x00..0x08)
|
|
; Y contains logical column number (0x00..0x0C)
|
|
; HGR row is (0x16 * X)
|
|
; which needs to total no more than 0xB0
|
|
; character will be drawn on HGR row, byte offset (GlobalLeftMargin + (3 * Y))
|
|
; which needs to total no more than 0x26
|
|
; out: preserves X/Y
|
|
; clobbers A/all flags
|
|
; clobbers $ED..$F7
|
|
;------------------------------------------------------------------------------
|
|
DrawLargeCharacter
|
|
sta original_char
|
|
beq +
|
|
and #$7F
|
|
sec
|
|
sbc #$40
|
|
bpl +
|
|
rts
|
|
+ sta char
|
|
stx @x+1
|
|
sty @y+1
|
|
jsr LogicalColumnToPhysicalColumn
|
|
sty HTAB
|
|
lda #$00
|
|
clc
|
|
bcc +
|
|
- adc #$16
|
|
+ dex
|
|
bpl -
|
|
sta charrow
|
|
|
|
+COMPUTE_DRAW_ADDRESSES
|
|
lda LeftFontRow0, x ; draw row 0, byte 0
|
|
sta ($F0), y
|
|
lda RightFontRow0, x ; draw row 0, byte 1
|
|
sta ($F2), y
|
|
|
|
+INC_AND_RECOMPUTE_DRAW_ADDRESSES
|
|
bit original_char
|
|
bmi +
|
|
lda LeftFontRow1, x ; draw row 1, byte 0
|
|
sta ($F0), y
|
|
lda RightFontRow1, x ; draw row 1, byte 1
|
|
sta ($F2), y
|
|
jmp ++
|
|
+ lda #0
|
|
sta ($F0), y
|
|
sta ($F2), y
|
|
++
|
|
+INC_AND_RECOMPUTE_DRAW_ADDRESSES
|
|
lda LeftFontRow2, x ; draw row 2, byte 0
|
|
sta ($F0), y
|
|
lda RightFontRow2, x ; draw row 2, byte 1
|
|
sta ($F2), y
|
|
|
|
+INC_AND_RECOMPUTE_DRAW_ADDRESSES
|
|
bit original_char
|
|
bmi +
|
|
lda LeftFontRow3, x ; draw row 3, byte 0
|
|
sta ($F0), y
|
|
lda RightFontRow3, x ; draw row 3, byte 1
|
|
sta ($F2), y
|
|
jmp ++
|
|
+ lda #0
|
|
sta ($F0), y
|
|
sta ($F2), y
|
|
++
|
|
+INC_AND_RECOMPUTE_DRAW_ADDRESSES
|
|
lda LeftFontRow4, x ; draw row 4, byte 0
|
|
sta ($F0), y
|
|
lda RightFontRow4, x ; draw row 4, byte 1
|
|
sta ($F2), y
|
|
|
|
+INC_AND_RECOMPUTE_DRAW_ADDRESSES
|
|
bit original_char
|
|
bmi +
|
|
lda LeftFontRow5, x ; draw row 5, byte 0
|
|
sta ($F0), y
|
|
lda RightFontRow5, x ; draw row 5, byte 1
|
|
sta ($F2), y
|
|
jmp ++
|
|
+ lda #0
|
|
sta ($F0), y
|
|
sta ($F2), y
|
|
++
|
|
+INC_AND_RECOMPUTE_DRAW_ADDRESSES
|
|
lda LeftFontRow6, x ; draw row 6, byte 0
|
|
sta ($F0), y
|
|
lda RightFontRow6, x ; draw row 6, byte 1
|
|
sta ($F2), y
|
|
|
|
+INC_AND_RECOMPUTE_DRAW_ADDRESSES
|
|
bit original_char
|
|
bmi +
|
|
lda LeftFontRow7, x ; draw row 7, byte 0
|
|
sta ($F0), y
|
|
lda RightFontRow7, x ; draw row 7, byte 1
|
|
sta ($F2), y
|
|
jmp ++
|
|
+ lda #0
|
|
sta ($F0), y
|
|
sta ($F2), y
|
|
++
|
|
+INC_AND_RECOMPUTE_DRAW_ADDRESSES
|
|
lda LeftFontRow8, x ; draw row 8, byte 0
|
|
sta ($F0), y
|
|
lda RightFontRow8, x ; draw row 8, byte 1
|
|
sta ($F2), y
|
|
|
|
+INC_AND_RECOMPUTE_DRAW_ADDRESSES
|
|
bit original_char
|
|
bmi +
|
|
lda LeftFontRow9, x ; draw row 9, byte 0
|
|
sta ($F0), y
|
|
lda RightFontRow9, x ; draw row 9, byte 1
|
|
sta ($F2), y
|
|
jmp ++
|
|
+ lda #0
|
|
sta ($F0), y
|
|
sta ($F2), y
|
|
++
|
|
+INC_AND_RECOMPUTE_DRAW_ADDRESSES
|
|
lda LeftFontRow10, x ; draw row 10, byte 0
|
|
sta ($F0), y
|
|
lda RightFontRow10, x ; draw row 10, byte 1
|
|
sta ($F2), y
|
|
|
|
+INC_AND_RECOMPUTE_DRAW_ADDRESSES
|
|
bit original_char
|
|
bmi +
|
|
lda LeftFontRow11, x ; draw row 11, byte 0
|
|
sta ($F0), y
|
|
lda RightFontRow11, x ; draw row 11, byte 1
|
|
sta ($F2), y
|
|
jmp ++
|
|
+ lda #0
|
|
sta ($F0), y
|
|
sta ($F2), y
|
|
++
|
|
+INC_AND_RECOMPUTE_DRAW_ADDRESSES
|
|
lda LeftFontRow12, x ; draw row 12, byte 0
|
|
sta ($F0), y
|
|
lda RightFontRow12, x ; draw row 12, byte 1
|
|
sta ($F2), y
|
|
|
|
+INC_AND_RECOMPUTE_DRAW_ADDRESSES
|
|
bit original_char
|
|
bmi +
|
|
lda LeftFontRow13, x ; draw row 13, byte 0
|
|
sta ($F0), y
|
|
lda RightFontRow13, x ; draw row 13, byte 1
|
|
sta ($F2), y
|
|
jmp ++
|
|
+ lda #0
|
|
sta ($F0), y
|
|
sta ($F2), y
|
|
++
|
|
+INC_AND_RECOMPUTE_DRAW_ADDRESSES
|
|
lda LeftFontRow14, x ; draw row 14, byte 0
|
|
sta ($F0), y
|
|
lda RightFontRow14, x ; draw row 14, byte 1
|
|
sta ($F2), y
|
|
|
|
+INC_AND_RECOMPUTE_DRAW_ADDRESSES
|
|
bit original_char
|
|
bmi +
|
|
lda LeftFontRow15, x ; draw row 15, byte 0
|
|
sta ($F0), y
|
|
lda RightFontRow15, x ; draw row 15, byte 1
|
|
sta ($F2), y
|
|
jmp ++
|
|
+ lda #0
|
|
sta ($F0), y
|
|
sta ($F2), y
|
|
++
|
|
@x ldx #$FD ; SMC
|
|
@y ldy #$FD ; SMC
|
|
rts
|