dos33fsprogs/graphics/hgr/hgr_font_4am/font_4am_condensed.s
2023-08-23 21:07:25 -04:00

219 lines
4.2 KiB
ArmAsm

;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