From 912d4d892a23a51090c55ac013f4a260893eed9c Mon Sep 17 00:00:00 2001 From: 4am Date: Tue, 10 Sep 2019 14:21:23 -0400 Subject: [PATCH] move font drawing routines to LC RAM 2 --- src/4cade.a | 5 ++++- src/constants.a | 4 ++-- src/glue.font.a | 38 ++++++++++++++++++++++++++++++++++++++ src/ui.font.a | 26 ++++++++++++++------------ 4 files changed, 58 insertions(+), 15 deletions(-) create mode 100644 src/glue.font.a diff --git a/src/4cade.a b/src/4cade.a index 9fd201cd6..d0f3309f0 100644 --- a/src/4cade.a +++ b/src/4cade.a @@ -80,7 +80,7 @@ RestoreStackNextTime !source "src/textrank.a" !source "src/parse.common.a" !source "src/parse.prefs.a" - !source "src/ui.font.a" + !source "src/glue.font.a" ; add new files above here so ui.common stays last !source "src/ui.common.a" MachineStatus @@ -104,9 +104,12 @@ gGamesListStore LastMover !pseudopc $D600 { !source "src/ui.font.data.a" + !source "src/ui.font.a" !source "src/prodos.impl.a" !if * > $DEFF { !error "code is too large: ends at ", * +; } else { +; !warn "LCRAM2 ends at ", * } } EvenLasterMover diff --git a/src/constants.a b/src/constants.a index ec45ee42c..e11b730a6 100644 --- a/src/constants.a +++ b/src/constants.a @@ -16,8 +16,8 @@ ; D000..D3FF - ProRWTS data ; D400..D5FF - ProRWTS code ; D600..D9FF - HGR font data -; DA00..DD5C - ProRWTS glue code -; DD5D..DFEF - unused +; DA00..DEE6 - ProRWTS glue code +; DEE7..DFEF - unused ; DFF0..DFFF - backup of stack (during gameplay and self-running demos) ;------------------------------------------------------------------------------ diff --git a/src/glue.font.a b/src/glue.font.a new file mode 100644 index 000000000..89bdd962e --- /dev/null +++ b/src/glue.font.a @@ -0,0 +1,38 @@ +;license:MIT +;(c) 2018-9 by 4am +; +; 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 +; - DrawPage +; - Draw40Chars +; - DrawString +; - DrawBuffer +; + +DrawPage + +READ_RAM2_WRITE_RAM2 + jsr DrawPageInternal + +READ_RAM1_WRITE_RAM1 + rts + +Draw40Chars + +READ_RAM2_WRITE_RAM2 + jsr Draw40CharsInternal + +READ_RAM1_WRITE_RAM1 + rts + +DrawString + +READ_RAM2_WRITE_RAM2 + jsr DrawStringInternal + +READ_RAM1_WRITE_RAM1 + rts + +DrawBuffer + +READ_RAM2_WRITE_RAM2 + jsr DrawBufferInternal + +READ_RAM1_WRITE_RAM1 + rts diff --git a/src/ui.font.a b/src/ui.font.a index 09299d9d6..dc7abec5a 100644 --- a/src/ui.font.a +++ b/src/ui.font.a @@ -3,14 +3,18 @@ ; ; 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 glue.font +; which handle bank switching for you. +; ; Public functions -; - DrawPage -; - Draw40Chars -; - DrawString -; - DrawBuffer +; - DrawPageInternal +; - Draw40CharsInternal +; - DrawStringInternal +; - DrawBufferInternal ; -DrawPage +DrawPageInternal ; A/Y contains address of character buffer ; carry bit clear -> draw on page 1 ; carry bit set -> draw on page 2 @@ -51,7 +55,7 @@ DrawPage +LDAY PTR plp php - jsr DrawBuffer + jsr DrawBufferInternal @skip inc SAVE ; skip carriage return lda SAVE ; advance PTR to start of next line clc @@ -65,7 +69,7 @@ DrawPage plp rts -Draw40Chars +Draw40CharsInternal ; A/Y contains address of character buffer ; carry bit clear -> draw on page 1 ; carry bit set -> draw on page 2 @@ -76,13 +80,13 @@ Draw40Chars ; clobbers A/X/Y jsr + ldx #40 - jsr DrawBuffer + jsr DrawBufferInternal inc VTAB + ldx #0 stx HTAB rts -DrawString +DrawStringInternal ; A/Y contains address of length-prefixed string ; carry bit clear -> draw on page 1 ; carry bit set -> draw on page 2 @@ -102,7 +106,7 @@ DrawString +LDAY PTR ; note: execution falls through here -DrawBuffer +DrawBufferInternal ; A/Y contains address of character buffer ; X contains buffer length (1..40) ; carry bit clear -> draw on page 1 @@ -174,7 +178,6 @@ DrawBuffer sta @row5+1 sta @row6+1 sta @row7+1 - +READ_RAM2_WRITE_RAM2 @loop @src ldy $FDFD,x lda FontDataRow0,y @@ -196,5 +199,4 @@ DrawBuffer inc HTAB dex bpl @loop - +READ_RAM1_WRITE_RAM1 rts