Give the screen back: osTakeScreen, and the RAM disk earns its keep
A program that takes the whole screen leaves the shell a blank one, and
whatever was on it is gone. There was nowhere to put 48K of video memory on
a machine with 64K of Data Memory that CosmOS already lives in.
A DRIVE MADE OF MEMORY IS SOMEWHERE. The screen goes to a file on the
scratch drive - the first volatile drive found at boot - like any other
file, and comes back from handleExit alongside the vectors and console mode
already put back there. The filesystem does the allocating, so this
invented nothing: it is 196 pages of tiles, map and palette, with a block
on the front holding the cursor, the four scroll registers and the mode.
NOT AUTOMATIC, and that is the whole design. Saving on every program start
would be cheap enough; restoring on every exit would be wrong, because dir
and Files and Say print and stop and their output is the reason you ran
them. A program says it took the screen, and one that says nothing behaves
exactly as every program did before this existed.
It deleted thirty lines of Grid, and they were all wrong anyway: four
scroll registers put back by hand, the map filled with spaces, the cursor
sent home, palette bank 0 written out - and the other fifteen banks kept
Grid's colours, because there was nowhere to have kept the real ones. Grid
is 64 bytes smaller and gives back what was actually there.
The check compares the screen before against the screen after, CELL BY
CELL, and allows only the rows around the cursor to differ - found from
where the text ends rather than guessed at, because the first version
assumed the cursor was near the bottom of the screen and let three real
differences through.
Two things cost time and neither was the feature:
- An edit adding "SWI osTakeScreen" to Grid was in the same script as a
failing s.index, so the file was never written - and the COMMENT
describing the call did land, from a later edit. Grid documented a call
it did not make, and read as though it should have worked.
- docs.sh caught osTakeScreen having no row in the services table, which
is the check the service layer added for exactly this and the second
time it has earned itself.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E2JrLzFvuFX9fgi1LDRjrW
This commit is contained in:
co-authored by
Claude Opus 5
parent
04f1ffabd4
commit
ab72443b99
@@ -167,3 +167,14 @@
|
||||
; print it: a program that failed has already said so in words, and a number beside that
|
||||
; would be noise. This is for the thing that cannot read words.
|
||||
osLastStatus 0d35
|
||||
|
||||
; ---- Taking the screen, and giving it back ----
|
||||
;
|
||||
; Says that this program is about to use the whole screen and would like what is on it now put
|
||||
; back when it exits. Q is zero if that was arranged; anything else means it was not, which is
|
||||
; the ordinary answer on a machine with no volatile drive to keep it on - and a program told
|
||||
; no should carry on regardless, because it was going to before this existed.
|
||||
;
|
||||
; NOT AUTOMATIC, and that is the point: dir and Say print and stop, and their output is the
|
||||
; reason you ran them. Only a program that says it took the screen gets the screen put back.
|
||||
osTakeScreen 0d36
|
||||
|
||||
Reference in New Issue
Block a user