hgr_font: clean things up a bit

This commit is contained in:
Vince Weaver 2023-08-23 21:07:25 -04:00
parent 8c8f764388
commit 68ae91fe7e
5 changed files with 232 additions and 170 deletions

View File

@ -37,7 +37,7 @@ bios_test:
ldy #>test1
ldx #1
stx VTAB
stx CV
ldx #0
@ -47,7 +47,7 @@ bios_test:
ldy #>test2
ldx #3
stx VTAB
stx CV
ldx #0
@ -57,7 +57,7 @@ bios_test:
ldy #>test3
ldx #5
stx VTAB
stx CV
ldx #0
@ -69,7 +69,7 @@ bios_test:
ldy #>test4
ldx #7
stx VTAB
stx CV
ldx #0
jsr DrawCondensedString
@ -80,7 +80,7 @@ bios_test:
ldy #>test5
ldx #9
stx VTAB
stx CV
ldx #0
jsr DrawCondensedString
@ -103,8 +103,8 @@ test4:
test5:
.byte 17,"@/\/\/\/\______ |"
.include "font_condensed.s"
.include "font_condensed_data.s"
.include "font_4am_condensed.s"
.include "font_4am_condensed_data.s"
.include "zx02_optim.s"

View File

@ -0,0 +1,218 @@
;license:MIT
;(c) 2023 by 4am
;
; drawing routines for Million Perfect Tiles Condensed
;
; Public functions:
; - DrawCondensedString
;
; VMW: commented, reformatted, minor changes, ca65 assembly
string_ptr = $FC ; word (used by DrawLargeString)
tmpx = $FE ; byte (used by DrawLargeCharacter, FindValidMove)
tmpy = $FF ; byte (used by DrawLargeCharacter, FindValidMove)
; Y location of the 16 supported lines
CondensedHGRTops:
.byte 7,18,29,40,51,62,73,84,95,106,117,128,139,150,161,172
;------------------------------------------------------------------------------
; DrawCondensedString
;
; in: A/Y points to length-prefixed string (Pascal style)
; X contains column number (0x00..0x27)
; $25 (CV) contains logical line number (0x00..0x0F)
; pointer is hidden
; out: clobbers all registers & flags
;------------------------------------------------------------------------------
DrawCondensedString:
; store the string location
sta string_ptr
sty string_ptr+1
stx CH ; save the X column offset
ldy #0
lda (string_ptr), Y ; get string length
tax ; store it in X
; 16 bit increment of string_ptr
inc string_ptr ; increment past the length
bne dcs_noflo
inc string_ptr+1
dcs_noflo:
; Load updated string pointer back into Y/A
lda string_ptr
ldy string_ptr+1
; /!\ execution falls through here to DrawCondensedBuffer
;------------------------------------------------------------------------------
; DrawCondensedBuffer
;
; in: A/Y contains address of character buffer (characters 0x19+ only)
; X contains buffer length (0x01..0x28)
; $24 (CH) contains starting column (0x00..0x27)
; $25 (CV) contains logical line number (0x00..0x0F)
; all characters are drawn on the same line
; CH is incremented for each character
; CV is NOT incremented
; out: clobbers all registers & flags
;------------------------------------------------------------------------------
DrawCondensedBuffer:
sta dcb_loop_smc+1 ; save string address
sty dcb_loop_smc+2 ; to smc location
dex ; ?
ldy CV ; lookup y-coord location
lda CondensedHGRTops, Y ; using lookup table
tay ;
; row0
lda hposn_low, Y ; get low memory offset
clc
adc CH ; add in x-coord
sta dcb_row0+4
lda hposn_high, Y ; get high memory offset
sta dcb_row0+5 ; save it out
iny ; go to next row
; row1
lda hposn_low, Y
adc CH
sta dcb_row1+4
lda hposn_high, Y
sta dcb_row1+5
iny
; row2
lda hposn_low, Y
adc CH
sta dcb_row2+4
lda hposn_high, Y
sta dcb_row2+5
iny
; row3
lda hposn_low, Y
adc CH
sta dcb_row3+4
lda hposn_high, Y
sta dcb_row3+5
iny
; row4
lda hposn_low, Y
adc CH
sta dcb_row4+4
lda hposn_high, Y
sta dcb_row4+5
iny
; row5
lda hposn_low, Y
adc CH
sta dcb_row5+4
lda hposn_high, Y
sta dcb_row5+5
iny
; row6
lda hposn_low, Y
adc CH
sta dcb_row6+4
lda hposn_high, Y
sta dcb_row6+5
iny
; row7
lda hposn_low, Y
adc CH
sta dcb_row7+4
lda hposn_high, Y
sta dcb_row7+5
iny
; row8
lda hposn_low, Y
adc CH
sta dcb_row8+4
lda hposn_high, Y
sta dcb_row8+5
iny
; row9
lda hposn_low, Y
adc CH
sta dcb_row9+4
lda hposn_high, Y
sta dcb_row9+5
dcb_loop:
dcb_loop_smc:
ldy $FDFD, X ; load next char into Y
; note we are going backward
; unrolled loop to write out each line
dcb_row0:
lda CondensedRow0-$19, Y ; get 1-byte font row
sta $FDFD, X ; write out to graphics mem
dcb_row1:
lda CondensedRow1-$19, Y
sta $FDFD, X
dcb_row2:
lda CondensedRow2-$19, Y
sta $FDFD, X
dcb_row3:
lda CondensedRow3-$19, Y
sta $FDFD, X
dcb_row4:
lda CondensedRow4-$19, Y
sta $FDFD, X
dcb_row5:
lda CondensedRow5-$19, Y
sta $FDFD, X
dcb_row6:
lda CondensedRow6-$19, Y
sta $FDFD, X
dcb_row7:
lda CondensedRow7-$19, Y
sta $FDFD, X
dcb_row8:
lda CondensedRow8-$19, Y
sta $FDFD, X
dcb_row9:
lda CondensedRow9-$19, Y
sta $FDFD, X
; increment to next char
inc CH ; not-needed for the routine
; I guess auto-points to next string
; decrement number of characters
dex ; we're traversing backward
bpl dcb_loop
rts

View File

@ -1,156 +0,0 @@
;license:MIT
;(c) 2023 by 4am
;
; drawing routines for Million Perfect Tiles Condensed
;
; Public functions:
; - DrawCondensedString
;
string_ptr = $FC ; word (used by DrawLargeString)
tmpx = $FE ; byte (used by DrawLargeCharacter, FindValidMove)
tmpy = $FF ; byte (used by DrawLargeCharacter, FindValidMove)
CondensedHGRTops:
.byte 7,18,29,40,51,62,73,84,95,106,117,128,139,150,161,172
;------------------------------------------------------------------------------
; DrawCondensedString
;
; in: A/Y points to length-prefixed string (Pascal style)
; X contains column number (0x00..0x27)
; $25 (VTAB) contains logical line number (0x00..0x0F)
; pointer is hidden
; out: clobbers all registers & flags
;------------------------------------------------------------------------------
DrawCondensedString:
; +ST16 string_ptr ; macro
sta string_ptr
sty string_ptr+1
stx HTAB
ldy #0
lda (string_ptr), y
tax
inc string_ptr
bne dcs1
inc string_ptr+1
dcs1:
; +LD16 string_ptr
lda string_ptr
ldy string_ptr+1
; /!\ execution falls through here to DrawCondensedBuffer
;------------------------------------------------------------------------------
; DrawCondensedBuffer
;
; in: A/Y contains address of character buffer (characters 0x19+ only)
; X contains buffer length (0x01..0x28)
; $24 (HTAB) contains starting column (0x00..0x27)
; $25 (VTAB) contains logical line number (0x00..0x0F)
; all characters are drawn on the same line
; HTAB is incremented for each character
; VTAB is NOT incremented
; out: clobbers all registers & flags
;------------------------------------------------------------------------------
;DrawCondensedBuffer
; +ST16 @loop+1
sta @loop+1
sty @loop+2
dex
ldy VTAB
lda CondensedHGRTops, y
tay
lda hposn_low, y
clc
adc HTAB
sta @row0+1
lda hposn_high, y
sta @row0+2
iny
lda hposn_low, y
adc HTAB
sta @row1+1
lda hposn_high, y
sta @row1+2
iny
lda hposn_low, y
adc HTAB
sta @row2+1
lda hposn_high, y
sta @row2+2
iny
lda hposn_low, y
adc HTAB
sta @row3+1
lda hposn_high, y
sta @row3+2
iny
lda hposn_low, y
adc HTAB
sta @row4+1
lda hposn_high, y
sta @row4+2
iny
lda hposn_low, y
adc HTAB
sta @row5+1
lda hposn_high, y
sta @row5+2
iny
lda hposn_low, y
adc HTAB
sta @row6+1
lda hposn_high, y
sta @row6+2
iny
lda hposn_low, y
adc HTAB
sta @row7+1
lda hposn_high, y
sta @row7+2
iny
lda hposn_low, y
adc HTAB
sta @row8+1
lda hposn_high, y
sta @row8+2
iny
lda hposn_low, y
adc HTAB
sta @row9+1
lda hposn_high, y
sta @row9+2
@loop: ldy $FDFD, x
lda CondensedRow0-$19, y
@row0: sta $FDFD, x
lda CondensedRow1-$19, y
@row1: sta $FDFD, x
lda CondensedRow2-$19, y
@row2: sta $FDFD, x
lda CondensedRow3-$19, y
@row3: sta $FDFD, x
lda CondensedRow4-$19, y
@row4: sta $FDFD, x
lda CondensedRow5-$19, y
@row5: sta $FDFD, x
lda CondensedRow6-$19, y
@row6: sta $FDFD, x
lda CondensedRow7-$19, y
@row7: sta $FDFD, x
lda CondensedRow8-$19, y
@row8: sta $FDFD, x
lda CondensedRow9-$19, y
@row9: sta $FDFD, x
inc HTAB
dex
bpl @loop
rts

View File

@ -29,7 +29,7 @@ font_test:
ldy #>test1
ldx #1
stx VTAB
stx CV
ldx #0
@ -41,7 +41,7 @@ font_test:
ldy #>test2
ldx #3
stx VTAB
stx CV
ldx #0
@ -53,7 +53,7 @@ font_test:
ldy #>test3
ldx #5
stx VTAB
stx CV
ldx #0
@ -65,7 +65,7 @@ font_test:
ldy #>test4
ldx #7
stx VTAB
stx CV
ldx #0
jsr DrawCondensedString
@ -76,7 +76,7 @@ font_test:
ldy #>test5
ldx #9
stx VTAB
stx CV
ldx #0
jsr DrawCondensedString
@ -99,8 +99,8 @@ test4:
test5:
.byte 17,"@/\/\/\/\______ |"
.include "font_condensed.s"
.include "font_condensed_data.s"
.include "font_4am_condensed.s"
.include "font_4am_condensed_data.s"
hposn_low = $1713 ; 0xC0 bytes (lifetime, used by DrawLargeCharacter)