Start a program by typing its name
A word the shell has no command for is now looked for on the disk as "<name>.sbx", and if it is there it is loaded and started exactly as load and run would do it. Whatever followed the word reaches the program through osArgument by the same route as whatever follows run, so "Say hello there" and "Type notes.txt" work without either program knowing how it was started. load and run are unchanged and both stay. load is how the monitor puts an arbitrary file in front of itself, which typing a name deliberately cannot do: the extension is added rather than assumed, so "notes.txt" looks for notes.txt.sbx and a text file is unreachable by name whatever is inside it. Three things this had to get right: The built-ins are tried first and always win. The search hangs off the end of the dispatch chain, so a file called dir.sbx cannot become dir, and the commands worth trusting when the disk is what you are doubting stay trustworthy. The invoke disk carries a working dir.sbx so that this is checked rather than asserted. A file that is found but is broken says so. "not a program" and "I do not know" are different answers, and giving the second about a file sitting on the disk would send somebody looking in the wrong place. loadProgram therefore hands back a status as well as a message, since only "no file of that name" can fairly be reported as anything other than a fault. doLoad became that subroutine rather than being copied. It ends in RET instead of a jump to the prompt, and each way of failing sets its number and its text together so a new one cannot leave half of the answer behind. cosmosBreak moves because Break prints the pointers it was handed and those are the shell's leftovers, which a CALL now puts back. 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
dbe58db660
commit
2b0aeeefd4
@@ -20,6 +20,8 @@ for itself.
|
||||
- Loadable Applications: Validate SBEX files, copy their Program and Data segments into
|
||||
the addresses for which they were assembled, and start them at their declared entry
|
||||
point.
|
||||
- Invocation By Name: A word the shell has no command for is looked for on the disk as
|
||||
`<name>.sbx`, and loaded and started if it is there. Built-in commands are tried first.
|
||||
- Resident Services: Applications can print strings and numbers, read lines, receive their
|
||||
command arguments, read and write files, and return to the shell through named software
|
||||
interrupts.
|
||||
@@ -83,6 +85,7 @@ CosmOS currently provides these built-in commands:
|
||||
| `dir` | List the files on the mounted disk and their sizes. |
|
||||
| `load <file>` | Read and validate an SBEX application, then place its code and data where its header requests. |
|
||||
| `run [words]` | Start the loaded application and make the rest of the line available to it as an argument. |
|
||||
| `<name> [words]` | Any word the shell does not recognise is looked for on the disk as `<name>.sbx`, and loaded and started if it is there. |
|
||||
| `delete <file>` | Remove a file from the filesystem and release its blocks. |
|
||||
| `rename <file> <to>` | Give a file a different name without moving its contents. |
|
||||
| `monitor` | Enter monitor mode, in which the prompt becomes `*` and the commands below are also available. |
|
||||
@@ -115,9 +118,47 @@ For example:
|
||||
> run
|
||||
```
|
||||
|
||||
Loading and running are separate operations for now. A loaded program may be run again
|
||||
without being read from disk again, which is useful both as a monitor facility and as a
|
||||
test that CosmOS correctly restores its Stack and vector table after every run.
|
||||
Or, equivalently:
|
||||
|
||||
```text
|
||||
> Snake
|
||||
```
|
||||
|
||||
Loading and running remain separate operations, and both of them remain. A loaded program
|
||||
may be run again without being read from disk again, which is useful both as a monitor
|
||||
facility and as a test that CosmOS correctly restores its Stack and vector table after
|
||||
every run; and `load` is how the monitor puts an arbitrary file in front of itself, which
|
||||
is a thing typing a name deliberately cannot do.
|
||||
|
||||
### Starting An Application By Name:
|
||||
|
||||
A word the shell has no command for is not immediately an error. Before saying so, the
|
||||
shell adds `.sbx` to it unless it is already there, looks for a file of that name, and if
|
||||
one is there loads it and starts it exactly as `load` and `run` would. Whatever followed
|
||||
the word reaches the program through `osArgument`, the same way and by the same route as
|
||||
whatever follows `run`.
|
||||
|
||||
Three properties of this are deliberate:
|
||||
|
||||
**Built-in commands are tried first and always win.** The search happens only after the
|
||||
whole dispatch chain has failed to match, so a file named `dir.sbx` cannot become `dir`.
|
||||
The commands that are worth trusting when the disk is the thing being doubted stay
|
||||
trustworthy.
|
||||
|
||||
**The extension is what makes a file reachable by name.** Typing `notes` looks for
|
||||
`notes.sbx`, and typing `notes.txt` looks for `notes.txt.sbx`. A text file therefore
|
||||
cannot be started by typing what it is called, whatever happens to be inside it. Only
|
||||
`load` reaches a file by its literal name.
|
||||
|
||||
**A file that is found but is broken says so.** If `notes.sbx` exists and is not an SBEX
|
||||
program, typing `notes` reports `not a program` rather than `I do not know: notes`.
|
||||
Reporting an unknown command about a file that is sitting on the disk would send somebody
|
||||
looking in the wrong place.
|
||||
|
||||
Names are matched exactly, including case, because every other name on the filesystem is.
|
||||
A directory entry holds twenty two characters and four are spoken for by the extension, so
|
||||
eighteen is the longest a bare name can be; a longer word is reported as unknown, which is
|
||||
the truth, since no file of that name can exist.
|
||||
|
||||
CosmOS also boots without a disk. It reports that no filesystem was found, leaves the
|
||||
shell and memory monitor available, and refuses commands that require a mounted disk
|
||||
|
||||
Reference in New Issue
Block a user