2019-04-16 02:06:27 +10:00
|
|
|
# shell
|
|
|
|
|
|
|
|
The shell is a text interface giving you access to commands to control your
|
|
|
|
machine. It is not built to be user friendly, but to minimize binary space and
|
|
|
|
maximize code simplicity.
|
|
|
|
|
|
|
|
We expect the user of this shell to work with a copy of the user guide within
|
|
|
|
reach.
|
|
|
|
|
|
|
|
It is its design goal, however, to give you the levers you need to control your
|
|
|
|
machine fully.
|
|
|
|
|
|
|
|
## Commands and arguments
|
|
|
|
|
|
|
|
You invoke a command by typing its name, followed by a list of arguments. All
|
|
|
|
numerical arguments have to be typed in hexadecimal form, without prefix or
|
|
|
|
suffix. Lowercase is fine. Single digit is fine for byte (not word) arguments
|
|
|
|
smaller than `0x10`. Example calls:
|
|
|
|
|
2019-04-16 10:42:12 +10:00
|
|
|
mptr 01ff
|
2019-04-16 02:06:27 +10:00
|
|
|
peek 4
|
2019-06-03 01:23:24 +10:00
|
|
|
poke 1f
|
2019-04-16 02:06:27 +10:00
|
|
|
call 00 0123
|
|
|
|
|
|
|
|
All numbers printed by the shell are in hexadecimals form.
|
|
|
|
|
|
|
|
Whenever a command is malformed, the shell will print `ERR` with a code. This
|
|
|
|
table describes those codes:
|
|
|
|
|
|
|
|
| Code | Description |
|
|
|
|
|------|---------------------------|
|
|
|
|
| `01` | Unknown command |
|
|
|
|
| `02` | Badly formatted arguments |
|
2019-04-16 10:38:25 +10:00
|
|
|
| `03` | Out of bounds |
|
2019-04-16 22:36:26 +10:00
|
|
|
| `04` | Unsupported command |
|
2019-05-13 05:38:58 +10:00
|
|
|
| `05` | I/O error |
|
2019-04-16 02:06:27 +10:00
|
|
|
|
2019-10-05 02:05:05 +10:00
|
|
|
Applications have their own error codes as well. If you see an error code that
|
|
|
|
isn't in this list, it's an application-specific error code.
|
|
|
|
|
2019-04-16 10:42:12 +10:00
|
|
|
## mptr
|
2019-04-16 02:06:27 +10:00
|
|
|
|
|
|
|
The shell has a global memory pointer (let's call it `memptr`) that is used by
|
|
|
|
other commands. This pointer is 2 bytes long and starts at `0x0000`. To move
|
2019-04-16 10:42:12 +10:00
|
|
|
it, you use the mptr command with the new pointer position. The command
|
2019-04-16 02:06:27 +10:00
|
|
|
prints out the new `memptr` (just to confirm that it has run). Example:
|
|
|
|
|
2019-04-16 10:42:12 +10:00
|
|
|
> mptr 42ff
|
2019-04-16 02:06:27 +10:00
|
|
|
42FF
|
|
|
|
|
|
|
|
## peek
|
|
|
|
|
|
|
|
Read memory targeted by `memptr` and prints its contents in hexadecimal form.
|
|
|
|
This command takes one byte argument (optional, default to 1), the number of
|
|
|
|
bytes we want to read. Example:
|
|
|
|
|
2019-04-16 10:42:12 +10:00
|
|
|
> mptr 0040
|
2019-04-16 02:06:27 +10:00
|
|
|
0040
|
|
|
|
> peek 2
|
|
|
|
ED56
|
|
|
|
|
2019-06-03 01:23:24 +10:00
|
|
|
## poke
|
2019-04-16 02:06:27 +10:00
|
|
|
|
|
|
|
Puts the serial console in input mode and waits for a specific number of
|
|
|
|
characters to be typed (that number being specified by a byte argument). These
|
|
|
|
characters will be literally placed in memory, one after the other, starting at
|
|
|
|
`memptr`.
|
|
|
|
|
|
|
|
Example:
|
|
|
|
|
2019-06-03 01:23:24 +10:00
|
|
|
> poke 5
|
2019-04-16 02:06:27 +10:00
|
|
|
Hello
|
|
|
|
> peek 5
|
|
|
|
48656C6C6F
|
|
|
|
|
|
|
|
## call
|
|
|
|
|
|
|
|
Calls the routine at `memptr`, setting the `A` and `HL` registers to the value
|
|
|
|
specified by its optional arguments (default to 0).
|
|
|
|
|
|
|
|
Be aware that this results in a call, not a jump, so your routine needs to
|
|
|
|
return if you don't want to break your system.
|
|
|
|
|
|
|
|
The following example works in the case where you've made yourself a jump table
|
|
|
|
in your glue code a `jp printstr` at `0x0004`:
|
|
|
|
|
2019-04-16 10:42:12 +10:00
|
|
|
> mptr a000
|
2019-04-16 02:06:27 +10:00
|
|
|
A000
|
2019-10-05 02:05:05 +10:00
|
|
|
> poke 6
|
2019-04-16 02:06:27 +10:00
|
|
|
Hello\0 (you can send a null char through a terminal with CTRL+@)
|
2019-04-16 10:42:12 +10:00
|
|
|
> mptr 0004
|
2019-04-16 02:06:27 +10:00
|
|
|
0004
|
|
|
|
> call 00 a000
|
|
|
|
Hello>
|