Let the reset button reach a machine that has stopped

The gesture rebooted CosmOS and could not reboot picture.bin, which is the case it was added
for. picture.asm ends in HALT, and a halted machine runs no instructions - so nothing ever
reached the code that notices a reset, because a reset is noticed BETWEEN INSTRUCTIONS and
there are none. It only ever worked because CosmOS was still going.

Which is backwards: a machine that is not going anywhere is exactly the one worth restarting,
and it is the one that cannot hear a request by itself. The restart is lifted out of the run
loop into machineTakeReset, and the window asks every frame whether the machine is running or
not.

NAMED AS EMULATOR MAGIC, because it is. There is no reset line on this machine and no keyboard
controller to assert one; the window reaches in and sets the same flag the machine port sets.
When those are designed, a keyboard controller will have to see the gesture and pull reset
regardless of what the CPU is doing - which is the property that matters and the one a port
write can never have, since a port write needs a program willing and able to make it. The
shape of that is already visible here: asking every frame rather than leaving it to the
machine to notice is what a line does.

A restart now clears the cycle limit as well, since a machine stopped for reaching one is
another thing somebody would press the button over.

The three existing reset tests still pass, and they are the ones that matter: they exercise
the same restart through the machine port. What no test reaches is the gesture itself, which
exists only when there is a window.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E2JrLzFvuFX9fgi1LDRjrW
This commit is contained in:
Anachronaut
2026-08-29 14:48:31 -04:00
co-authored by Claude Opus 5
parent 8c6ed62044
commit adefce975b
4 changed files with 79 additions and 21 deletions
+11
View File
@@ -65,6 +65,17 @@ int machineRunning(const Machine *m);
// is the point of cutting it here rather than anywhere else.
void machineRunSlice(Machine *m);
// ---- Asking from outside, when nothing inside is asking ----
//
// A reset is normally noticed between instructions, which works when there are instructions.
// A HALTED MACHINE RUNS NONE, so a program that has finished - or faulted, or is a bare metal
// demo that ended with HALT - could ask to be restarted for ever and nothing would come along
// to hear it. That is exactly the machine somebody wants to restart.
//
// So a front end calls this every time round its own loop, whether the machine is running or
// not. Returns 1 if it started over.
int machineTakeReset(Machine *m);
void machineStop(Machine *m);
// Says how the run went and returns what the process should exit with.