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…