2019-06-04 03:34:16 +10:00
|
|
|
# Assembling binaries
|
|
|
|
|
|
|
|
For a system to be able to self-reproduce, it needs to assemble source z80
|
|
|
|
assembly to binary.
|
|
|
|
|
|
|
|
## Goals
|
|
|
|
|
|
|
|
Have a RC2014 assemble a Collapse OS kernel with its source living on a CFS on
|
|
|
|
a SD card.
|
|
|
|
|
|
|
|
## Gathering parts
|
|
|
|
|
|
|
|
* Same parts as the [SD card recipe](../sdcard).
|
|
|
|
|
|
|
|
## The zasm binary
|
|
|
|
|
|
|
|
To achieve our goal in this recipe, we'll need a zasm binary on the SD card.
|
|
|
|
This zasm binary needs to be compiled with the right jump offsets for the kernel
|
|
|
|
we build in this recipe. These offsets are in `user.h` and are closely in sync
|
|
|
|
with the configuration in `glue.asm`.
|
|
|
|
|
|
|
|
`user.h` is then included in `apps/zasm/glue.asm`.
|
|
|
|
|
|
|
|
The makefile in this recipe takes care of compiling zasm with the proper
|
|
|
|
`user.h` file and place it in `cfsin/zasm`
|
|
|
|
|
|
|
|
## The userland source
|
|
|
|
|
|
|
|
The code we're going to compile is `cfsin/hello.asm`. As you can see, we also
|
|
|
|
include `user.h` in this source code or else `ld hl, sAwesome` would load the
|
|
|
|
wrong offset.
|
|
|
|
|
|
|
|
Because of this, the Makefile takes care of copying `user.h` in our filesystem.
|
|
|
|
|
|
|
|
## Preparing the card and kernel
|
|
|
|
|
|
|
|
After running `make`, you'll end up with `sdcard.cfs` which you can load the
|
|
|
|
same way you did in the SD card recipe.
|
|
|
|
|
|
|
|
You will also have `os.bin`, which you can flash on your EEPROM the same way
|
|
|
|
you already did before.
|
|
|
|
|
|
|
|
## Running it
|
|
|
|
|
|
|
|
Compiling and running `hello.asm` is done very much like in
|
|
|
|
[the shell emulator](../../../doc/zasm.md):
|
|
|
|
|
|
|
|
Collapse OS
|
|
|
|
> sdci
|
|
|
|
> fson
|
2019-12-12 06:05:34 +11:00
|
|
|
> fopen 0 hello.asm
|
2019-06-08 09:53:50 +10:00
|
|
|
> fnew 1 dest
|
2019-12-12 06:05:34 +11:00
|
|
|
> fopen 1 dest
|
2019-06-08 09:53:50 +10:00
|
|
|
> zasm 1 2
|
|
|
|
> dest
|
2019-06-04 03:34:16 +10:00
|
|
|
Assembled from a RC2014
|
2019-06-08 09:53:50 +10:00
|
|
|
>
|
2019-06-04 03:34:16 +10:00
|
|
|
|
|
|
|
That RC2014 is starting to feel powerful now, right?
|
2019-06-18 04:17:47 +10:00
|
|
|
|
|
|
|
## Test your hardware
|
|
|
|
|
|
|
|
Now that you have a fully functional filesystem that can load programs and run
|
|
|
|
them easily, you'll see that this recipe's CFS include a couple of programs
|
|
|
|
besides `zasm`. Among them, there's `sdct` that stress tests reading and
|
|
|
|
writing on the SD card and `memt` that stress tests RAM. You might be
|
|
|
|
interested in running them. Look at their description in `apps/`. All you need
|
|
|
|
to to do run them is to type their name.
|
|
|
|
|
|
|
|
## Assembling the kernel
|
|
|
|
|
|
|
|
Now let's go for something a little more fun! Jiu-jitsu? No, you're not going to
|
|
|
|
learn jiu-jitsu! You're going to assemble the kernel from within your RC2014!
|
|
|
|
|
|
|
|
The makefile doesn't prepare a CFS blob for this, let's learn to build that blob
|
|
|
|
yourself. First of all, we'll need to have what we already had in `sdcard.cfs`
|
|
|
|
because it has `zasm` and `user.h`. But we're going to add the contents of
|
|
|
|
the `/kernel/` directory to it.
|
|
|
|
|
|
|
|
$ cp ../../../kernel/*.{h,asm} cfsin
|
|
|
|
|
2019-06-19 12:07:44 +10:00
|
|
|
You'll also need your glue file:
|
2019-06-18 04:17:47 +10:00
|
|
|
|
2019-06-19 12:07:44 +10:00
|
|
|
$ cp glue.asm cfsin
|
2019-06-18 04:17:47 +10:00
|
|
|
|
|
|
|
You're now ready to re-make your CFS:
|
|
|
|
|
|
|
|
$ rm sdcard.cfs && make
|
|
|
|
|
|
|
|
Now you can write this into your card and boot Collapse OS:
|
|
|
|
|
|
|
|
Collapse OS
|
|
|
|
> sdci
|
|
|
|
> fson
|
|
|
|
> fopn 0 glue.asm
|
|
|
|
> fnew 10 dest
|
2019-12-12 06:05:34 +11:00
|
|
|
> fopen 1 dest
|
2019-06-19 12:07:44 +10:00
|
|
|
> zasm 1 2 # This takes a while. About 7 minutes.
|
2019-06-18 04:17:47 +10:00
|
|
|
> sdcf # success! sdcf flushes SD card buffers to the card.
|
2019-06-18 05:34:55 +10:00
|
|
|
|
|
|
|
Now let's go verify that we assembled the right thing. Pop out the card and
|
|
|
|
plug it in your "modern" computer. Pipe the device directly through `cfsunpack`
|
|
|
|
to unpack the FS into a directory (it will stop reading when it stops seeing
|
|
|
|
CFS blocks):
|
|
|
|
|
|
|
|
$ sudo cat /dev/sdX | ../../../tools/cfspack/cfsunpack cfsout
|
|
|
|
$ cmp cfsout/dest ../os.bin
|
|
|
|
|
|
|
|
They're the same! Your RC2014 assembled a full Collapse OS kernel all by itself!
|