Occasionally I see a really “nice little touch” that a programmer took the time to add. For instance, some programs will restore the screen to what it looked like before the program ran. I decided I would do this for a project I was working on, and thought I’d share the super simple routine:
* Save/Restore screen.
* lwasm savescreen.bas -fbasic -osavescreen.bas --map
org $3f00
* Test function.
start
* Save the screen.
bsr savescreensub * GOSUB savescreensub
* Fill screen.
ldx #SCREENSTART * X=Start of screen.
lda #255 * A=255 (orange block).
loop
sta ,x+ * Store A at X, X=X+1.
cmpx #SCREENEND * Compare X to SCREENEND.
ble loop * IF X<=SCREENEND, GOTO loop.
* Wait for keypress.
getkey
jsr [$a000] * Call POLCAT ROM routine.
beq getkey * If no key, GOTO getkey.
* Restore screen.
bsr restorescreensub * GOSUB restorescreensub
rts * RETURN
* Subroutine
SCREENSTART equ 1024 * Start of screen memory.
SCREENEND equ 1536 * Last byte of screen memory.
savescreensub
pshs x,y,d * Save registers we will use.
ldx #SCREENSTART * X=Start of screen.
ldy #screenbuf * Y=Start of buffer.
saveloop
ldd ,x++ * Load D with 2 bytes at X, X=X+2.
std ,y++ * Store D at Y, Y=Y+2.
cmpx #SCREENEND * Compare X to SCREENEND.
blt saveloop * If X<=SCREENEND, GOTO saveloop.
puls x,y,d,pc * Resture used registers and return.
*rts
restorescreensub
pshs x,y,d * Save registers we will use.
ldx #screenbuf * X=Start of buffer.
ldy #SCREENSTART * Y=Start of screen.
restoreloop
ldd ,x++ * Load D with 2 bytes at X, X=X+2.
std ,y++ * Store D at Y, Y=Y+2.
cmpy #1535 * Compare Y to SCREENEND.
blt restoreloop * If Y<=SCREENEND, GOTO restoreloop.
puls x,y,d,pc * Resture used registers and return.
*rts
* This would go in your data area.
screenbuf rmb SCREENEND-SCREENSTART+1
end
There are two routines – savescreensub and restorescreensub – named that way just so I would know they are subroutines designed to be called by bsr/lbsr/jsr.
They make use of a 512-byte buffer (in the case of the CoCo’s 32×16 screen).
savescreensub will copy all the bytes currently on the text screen over to the buffer. restorescreensub will copy all the saved bytes in the buffer back to the screen.
Some example code is provided.
What would you change?
Until next time…
