# 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

* A SMS that can run Collapse OS.
* A [PS/2 keyboard adapter](../kbd/README.md)

## 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.