Put a reset button on the case, and stop Escape closing the window
ESCAPE WAS A BUG I LEFT. This machine sends Escape to the console like any other key, and Raylib closes a window on Escape unless it is told not to - so a program reading keys could be ended by one of them, taking whatever was in memory with it. SetExitKey(KEY_NULL), and it is a byte again. F12 is the reset button. A button on the case rather than a key the machine can see: nothing sends a function key to the console, so nothing can be surprised by one. It does what writing MACHINE_RESET does, which is that the machine starts the way it started - the boot chain runs again and finds whatever the disk now says to run. Which is what makes a bare metal program escapable. Once puts a demo in front of the next start and deletes the request before jumping, so a demo that has taken the whole machine is one keypress from the system coming back, instead of closing the window and opening it again. IT HAD TO REACH A MACHINE THAT IS WAITING, and that took two more things. A reset is acted on between instructions, and a machine blocked on a key is part way through one - so the button would have set a flag that nothing ever came along to notice, in exactly the situation a reset button is for. The wait ends now: the console is told its input is over, which it is for a machine about to stop existing. And the reset puts the console's input back - nothing pushed back, no line half gathered, and not at the end of input. That was already wrong before the button existed: a reset after the input ran out left a console that had run out afterwards, so a machine could be restarted once and then never typed at again. 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
13b20c8834
commit
f7657081be
@@ -631,6 +631,18 @@ static uint8_t pendingInterrupts[INTERRUPT_LINE_BYTES];
|
||||
// Whether somebody has asked the machine to start over, and taking that request away.
|
||||
static int resetWanted = 0;
|
||||
|
||||
void requestReset(void) {
|
||||
resetWanted = 1;
|
||||
}
|
||||
|
||||
void consoleResetInput(void) {
|
||||
consolePushback = -1;
|
||||
consoleEnded = 0;
|
||||
consoleLineLength = 0;
|
||||
consoleLineAt = 0;
|
||||
clearInterrupt(PORT_CONSOLE);
|
||||
}
|
||||
|
||||
int takeResetRequest(void) {
|
||||
int wanted = resetWanted;
|
||||
resetWanted = 0;
|
||||
|
||||
Reference in New Issue
Block a user