collapseos/recipes/sms/romasm
Virgil Dupras 019d05f64c Make the shell a userspace app
That's my mega-commit you've all been waiting for.

The code for the shell share more routines with userspace apps than with kernel
units, because, well, its behavior is that of a userspace app, not a device
driver.

This created a weird situation with libraries and jump tables. Some routine
belonging to the `kernel/` directory felt weird there.

And then comes `apps/basic`, which will likely share even more code with the
shell. I was seeing myself creating huge jump tables to reuse code from the
shell. It didn't feel right.

Moreover, we'll probably want basic-like apps to optionnally replace the shell.

So here I am with this huge change in the project structure. I didn't test all
recipes on hardware yet, I will do later. I might have broken some...

But now, the structure feels better and the line between what belongs to
`kernel` and what belongs to `apps` feels clearer.
2019-11-15 15:37:49 -05:00
..
.gitignore recipes/sms/romasm: first steps 2019-07-21 15:37:03 -04:00
glue.asm Make the shell a userspace app 2019-11-15 15:37:49 -05:00
Makefile Make the shell a userspace app 2019-11-15 15:37:49 -05:00
README.md recipes/sms/romasm: ed and zasm, fully functional! 2019-07-25 14:24:18 -04:00
user.h Make the shell a userspace app 2019-11-15 15:37:49 -05:00

zasm and ed from ROM

SMS' RAM is much tighter than in the RC2014, which makes the idea of loading apps like zasm and ed in memory before using it a bit wasteful. In this recipe, we'll include zasm and ed code directly in the kernel and expose them as shell commands.

Moreover, we'll carve ourselves a little 1K memory map to put a filesystem in there. This will give us a nice little system that can edit small source files compile them and run them.

Gathering parts

Build

There's nothing special with building this recipe. Like the base recipe, run make then copy os.sms to your destination medium.

If you look at the makefile, however, you'll see that we use a new trick here: we embed "apps" binaries directly in our ROM so that we don't have to load them in memory.

Usage

Alright, here's what we'll do: we'll author a source file, assemble it and run it, all on your SMS! Commands:

Collapse OS
> fnew 1 src
> ed src
: 1i
.org 0xc200
: 1a
ld hl, sFoo
: 2a
call 0x3f
: 3a
xor a
: 4a
ret
: 5a
sFoo: .db "foo", 0
: w
> fnew 1 dest
> fopn 0 src
> fopn 1 dest
> zasm 1 2
First pass
Second pass
> dest
foo>

Awesome right? Some precisions:

  • Our glue code specifies a USER_RAMSTART of 0xc200. This is where dest is loaded by the pgm shell hook.
  • 0x3f is the offset of printstr in the jump table of our glue code.
  • xor a is for the command to report as successful to the shell.