move font code out of LC2

This commit is contained in:
4am 2021-10-28 00:40:20 -04:00
parent d361a5fb8f
commit 9a7edbc42f
6 changed files with 156 additions and 187 deletions

View File

@ -133,8 +133,6 @@ gGlobalPrefsStore
; which is apparently one of the acceptable values) ; which is apparently one of the acceptable values)
gGamesListStore gGamesListStore
!word $FDFD ; SMC !word $FDFD ; SMC
StoreAYAndSwitchToBank2
+ST16 PTR
SwitchToBank2 SwitchToBank2
+READ_RAM2_WRITE_RAM2 +READ_RAM2_WRITE_RAM2
rts rts
@ -175,7 +173,6 @@ COPYSRC = *
!pseudopc hdddataend { !pseudopc hdddataend {
COPYDST = * COPYDST = *
!source "src/prodos.impl.lc2.a" !source "src/prodos.impl.lc2.a"
!source "src/ui.font.lc2.a"
!source "src/glue.prorwts2.lc2.a" !source "src/glue.prorwts2.lc2.a"
!source "src/glue.launch.lc2.a" !source "src/glue.launch.lc2.a"
!source "src/hw.accel.lc2.a" !source "src/hw.accel.lc2.a"
@ -189,7 +186,7 @@ COPYSRC = *
EvenLasterMover EvenLasterMover
FONTSRC = * FONTSRC = *
!pseudopc FONTDST { !pseudopc FONTDST {
!source "src/ui.font.data.lc2.a" !source "src/ui.font.data.a"
} }
!if RELBASE = $2000 { !if RELBASE = $2000 {
!ifdef PASS2 { !ifdef PASS2 {

View File

@ -10,7 +10,7 @@
; ...unused... ; ...unused...
; E000..E3FF - HGR font data ; E000..E3FF - HGR font data
; ...unused... ; ...unused...
; EA23..FFEE - main program code ; E962..FFEE - main program code
; FFEF..FFF9 - API functions and global constants available for main program ; FFEF..FFF9 - API functions and global constants available for main program
; code, prelaunchers, transition effects, &c. ; code, prelaunchers, transition effects, &c.
; (LoadFileDirect, Wait/UnwaitForVBL, MockingboardStuff, MachineStatus) ; (LoadFileDirect, Wait/UnwaitForVBL, MockingboardStuff, MachineStatus)
@ -19,8 +19,8 @@
; LC RAM BANK 2 ; LC RAM BANK 2
; D000..D3FF - ProRWTS data ; D000..D3FF - ProRWTS data
; D400..D6C3 - ProRWTS code ; D400..D6C3 - ProRWTS code
; D6C4..DB91 - HGR font code & ProRWTS glue code ; D6C4..DAB8 - ProRWTS glue code
; DB92..DB98 - backup of stack (during gameplay and self-running demos) ; DAB9..DABF - backup of stack (during gameplay and self-running demos)
; ...unused... ; ...unused...
; DBB4..DBFF - (de)acceleration function ; DBB4..DBFF - (de)acceleration function
; DC00..DFFF - unused ; DC00..DFFF - unused

View File

@ -70,7 +70,7 @@ Credits
ror ; draw on offscreen page ror ; draw on offscreen page
+LDADDR $800 +LDADDR $800
+ST16 PTR +ST16 PTR
;DrawPageInternal inlined here ;DrawPage inlined here
; ;
; PTR contains address of array of length-prefixed strings ; PTR contains address of array of length-prefixed strings
; length #$FF terminates ; length #$FF terminates
@ -86,11 +86,10 @@ Credits
ldx #0 ldx #0
stx VTAB stx VTAB
php ; save C, but Z=1 because of ldx #0 php ; save C, but Z=1 because of ldx #0
jsr SwitchToBank2
@drawLine @drawLine
lda $FF lda $FF
sta HTAB sta HTAB
jsr DrawStringInternal jsr DrawString_PTR_is_already_set
bmi @donePage bmi @donePage
clc clc
adc PTR adc PTR
@ -101,7 +100,6 @@ Credits
php php
beq @drawLine ; always branches beq @drawLine ; always branches
@donePage @donePage
jsr SwitchToBank1
plp plp
;end inline ;end inline
jsr ShowOtherPage ; show credits jsr ShowOtherPage ; show credits

View File

@ -3,29 +3,162 @@
; ;
; hi-res font drawing routines ; hi-res font drawing routines
; ;
; Glue functions that handle bank switching and calling the real font drawing routines
; that live in LC RAM 2 now.
;
; Public functions ; Public functions
; - Draw40Chars ; - Draw40Chars
; - DrawCenteredString ; - DrawCenteredString
; - DrawString ; - DrawString
; ;
DrawString
jsr StoreAYAndSwitchToBank2
jsr DrawStringInternal
; /!\ execution falls through here to JmpSwitch
JmpSwitch
jmp SwitchToBank1
Draw40Chars Draw40Chars
jsr SwitchToBank2 ; A/Y contains address of character buffer
jsr Draw40CharsInternal ; carry bit clear -> draw on page 1
beq JmpSwitch ; always ; carry bit set -> draw on page 2
; $25 contains textpage line (0..23) (this is the standard VTAB address)
; drawing starts at HTAB 0
; increments VTAB on exit
; sets HTAB to 0 on exit
; Z=1 on exit
; clobbers A/X/Y
jsr +
ldx #40
jsr .DrawBufferInternal
+ ldx #0
stx HTAB
rts
DrawCenteredString DrawCenteredString
jsr StoreAYAndSwitchToBank2 ; A/Y contains address of length-prefixed string
jsr DrawCenteredStringInternal ; carry bit clear -> draw on page 1
bne JmpSwitch ; always ; carry bit set -> draw on page 2
; $25 contains textpage line (0..23) (this is the standard VTAB address)
; clobbers A/X/Y
+ST16 PTR
php
ldy #0
lda #40
sec
sbc (PTR),y
lsr
sta HTAB
plp
jmp DrawString_PTR_is_already_set
DrawString
; A/Y contains address of length-prefixed string
; length can be 0
; carry bit clear -> draw on page 1
; carry bit set -> draw on page 2
; $24 contains starting column (0..39) (this is the standard HTAB address)
; $25 contains textpage line (0..23) (this is the standard VTAB address)
; clobbers A/X/Y
+ST16 PTR
DrawString_PTR_is_already_set
ldy #0
lda (PTR),y
inc PTR
bne +
inc PTR+1
+ tax
bpl +
rts
+
+LD16 PTR
; /!\ execution falls through here to .DrawBufferInternal
.DrawBufferInternal
; [private]
; A/Y contains address of character buffer
; X contains buffer length (0..40)
; carry bit clear -> draw on page 1
; carry bit set -> draw on page 2
; characters MUST have high bit off (0x00..0x7F)
; special characters (0x00..0x1F) will be drawn
; $24 contains starting column (0..39) (this is the standard HTAB address)
; $25 contains textpage line (0..23) (this is the standard VTAB address)
; all characters are drawn on the same line
; HTAB is incremented for each character
; clobbers X,Y
; increments VTAB on exit
; A=buffer length on exit
; N=0,Z=0 on exit
+ST16 DBISrc+1
php
lda VTAB
asl
asl
asl
; routine to calculate memory address within HGR page
; and self-modify addresses within draw loop that follows
; (routine clobbers A and Y but preserves X)
asl
tay
and #$F0
bpl @calc1
ora #$05
@calc1 bcc @calc2
ora #$0A
@calc2 asl
asl
sta @hgrlo+1
tya
and #$0E
adc #$10
asl @hgrlo+1
rol
plp
bcc +
eor #$60
clc
+
sta DBIRow0+2
adc #$04
sta DBIRow1+2
adc #$04
sta DBIRow2+2
adc #$04
sta DBIRow3+2
adc #$04
sta DBIRow4+2
adc #$04
sta DBIRow5+2
adc #$04
sta DBIRow6+2
adc #$04
sta DBIRow7+2
@hgrlo lda #$FD
adc HTAB
sta DBIRow0+1
sta DBIRow1+1
sta DBIRow2+1
sta DBIRow3+1
sta DBIRow4+1
sta DBIRow5+1
sta DBIRow6+1
sta DBIRow7+1
txa
pha
bpl + ; always branches because X is 0..40
DBILoop
DBISrc ldy $FDFD,x
lda FontDataRow0,y
DBIRow0 sta $FDFD,x
lda FontDataRow1,y
DBIRow1 sta $FDFD,x
lda FontDataRow2,y
DBIRow2 sta $FDFD,x
lda FontDataRow3,y
DBIRow3 sta $FDFD,x
lda FontDataRow4,y
DBIRow4 sta $FDFD,x
lda FontDataRow5,y
DBIRow5 sta $FDFD,x
lda FontDataRow6,y
DBIRow6 sta $FDFD,x
lda FontDataRow7,y
DBIRow7 sta $FDFD,x
inc HTAB
+ dex
bpl DBILoop
pla ; A = buffer length (passed in in X)
inc VTAB
rts

View File

@ -1,159 +0,0 @@
;license:MIT
;(c) 2018-2021 by 4am
;
; hi-res font drawing routines
;
; /!\ These live in LC RAM 2 and rely on the font data which is also in LC RAM 2. /!\
; Code in LC RAM 1 (which is most program code) should call the functions in ui.font
; which handle bank switching for you.
;
Draw40CharsInternal
; A/Y contains address of character buffer
; carry bit clear -> draw on page 1
; carry bit set -> draw on page 2
; $25 contains textpage line (0..23) (this is the standard VTAB address)
; drawing starts at HTAB 0
; increments VTAB on exit
; sets HTAB to 0 on exit
; Z=1 on exit
; clobbers A/X/Y
jsr +
ldx #40
jsr DrawBufferInternal
+ ldx #0
stx HTAB
rts
DrawCenteredStringInternal
; PTR contains address of length-prefixed string
; carry bit clear -> draw on page 1
; carry bit set -> draw on page 2
; $25 contains textpage line (0..23) (this is the standard VTAB address)
; clobbers A/X/Y
php
ldy #0
lda #40
sec
sbc (PTR),y
lsr
sta HTAB
plp
; /!\ execution falls through here to DrawStringInternal
DrawStringInternal
; PTR contains address of length-prefixed string
; length can be 0
; carry bit clear -> draw on page 1
; carry bit set -> draw on page 2
; $24 contains starting column (0..39) (this is the standard HTAB address)
; $25 contains textpage line (0..23) (this is the standard VTAB address)
; clobbers A/X/Y
ldy #0
lda (PTR),y
inc PTR
bne +
inc PTR+1
+ tax
bpl +
rts
+
+LD16 PTR
; /!\ execution falls through here to DrawBufferInternal
DrawBufferInternal
; A/Y contains address of character buffer
; X contains buffer length (0..40)
; carry bit clear -> draw on page 1
; carry bit set -> draw on page 2
; characters MUST have high bit off (0x00..0x7F)
; special characters (0x00..0x1F) will be drawn
; $24 contains starting column (0..39) (this is the standard HTAB address)
; $25 contains textpage line (0..23) (this is the standard VTAB address)
; all characters are drawn on the same line
; HTAB is incremented for each character
; clobbers X,Y
; increments VTAB on exit
; A=buffer length on exit
; N=0,Z=0 on exit
+ST16 DBISrc+1
php
lda VTAB
asl
asl
asl
; routine to calculate memory address within HGR page
; and self-modify addresses within draw loop that follows
; (routine clobbers A and Y but preserves X)
asl
tay
and #$F0
bpl @calc1
ora #$05
@calc1 bcc @calc2
ora #$0A
@calc2 asl
asl
sta @hgrlo+1
tya
and #$0E
adc #$10
asl @hgrlo+1
rol
plp
bcc +
eor #$60
clc
+
sta DBIRow0+2
adc #$04
sta DBIRow1+2
adc #$04
sta DBIRow2+2
adc #$04
sta DBIRow3+2
adc #$04
sta DBIRow4+2
adc #$04
sta DBIRow5+2
adc #$04
sta DBIRow6+2
adc #$04
sta DBIRow7+2
@hgrlo lda #$FD
adc HTAB
sta DBIRow0+1
sta DBIRow1+1
sta DBIRow2+1
sta DBIRow3+1
sta DBIRow4+1
sta DBIRow5+1
sta DBIRow6+1
sta DBIRow7+1
txa
pha
bpl + ; always branches because X is 0..40
DBILoop
DBISrc ldy $FDFD,x
lda FontDataRow0,y
DBIRow0 sta $FDFD,x
lda FontDataRow1,y
DBIRow1 sta $FDFD,x
lda FontDataRow2,y
DBIRow2 sta $FDFD,x
lda FontDataRow3,y
DBIRow3 sta $FDFD,x
lda FontDataRow4,y
DBIRow4 sta $FDFD,x
lda FontDataRow5,y
DBIRow5 sta $FDFD,x
lda FontDataRow6,y
DBIRow6 sta $FDFD,x
lda FontDataRow7,y
DBIRow7 sta $FDFD,x
inc HTAB
+ dex
bpl DBILoop
pla ; A = buffer length (passed in in X)
inc VTAB
rts