We can now assemble source files from within the shell!

This commit is contained in:
Virgil Dupras 2019-06-03 11:15:07 -04:00
parent 839ba91312
commit 082fa3431d
4 changed files with 47 additions and 6 deletions

View File

@ -11,3 +11,4 @@
* [Load code in RAM and run it](load-run-code.md) * [Load code in RAM and run it](load-run-code.md)
* [Using block devices](blockdev.md) * [Using block devices](blockdev.md)
* [Using the filesystem](fs.md) * [Using the filesystem](fs.md)
* [Assembling z80 source from the shell](zasm.md)

31
doc/zasm.md Normal file
View File

@ -0,0 +1,31 @@
# Assembling z80 source from the shell
In its current state, Collapse OS has all you need to assemble z80 source
from within the shell. What you need is:
* A mounted filesystem with `zasm` on it.
* A block device to read from (can be a file from mounted CFS)
* A block device to write to (can theoretically be a file, but technical
limitations temporary prevents us that. We'll use a mmap for now).
The emulated shell is already set up with all you need. If you want to run that
on a real machine, you'll have to make sure to provide these requirements.
The emulated shell has a `hello.asm` file in its mounted filesystem that is
ready to compile. It has two file handles 0 and 1, mapped to blk IDs 1 and 2.
We only use file handle 0 (blk ID 1) and then tell zasm to output to mmap which
is configured to start at `0xe00`
Collapse OS
> fopn 0 hello.asm ; open file in handle 0
> zasm 1 3 ; assemble opened file and spit result in mmap
> bsel 3 ; select mmap
> peek 5
210890CD3C ; looking good
> mptr 9000 ; hello.asm is configured to run from 0x9000
> load ff ; load compiled code from mmap
> peek 5
210890CD3C ; looking good
> call 00 0000
Assembled from the shell
> ; Awesome!

View File

@ -1,7 +1,9 @@
; named shell_.asm to avoid infinite include loop. ; named shell_.asm to avoid infinite include loop.
.equ RAMSTART 0x4000 .equ RAMSTART 0x4000
.equ KERNEL_RAMEND 0x5000 ; kernel ram is well under 0x100 bytes. We're giving us 0x200 bytes so that we
.equ USERCODE 0x9000 ; never worry about the stack.
.equ KERNEL_RAMEND 0x4200
.equ USERCODE KERNEL_RAMEND
.equ STDIO_PORT 0x00 .equ STDIO_PORT 0x00
.equ FS_DATA_PORT 0x01 .equ FS_DATA_PORT 0x01
.equ FS_SEEKL_PORT 0x02 .equ FS_SEEKL_PORT 0x02
@ -37,16 +39,21 @@
#include "parse.asm" #include "parse.asm"
.equ BLOCKDEV_RAMSTART RAMSTART .equ BLOCKDEV_RAMSTART RAMSTART
.equ BLOCKDEV_COUNT 3 .equ BLOCKDEV_COUNT 4
#include "blockdev.asm" #include "blockdev.asm"
; List of devices ; List of devices
.dw fsdevGetC, fsdevPutC, fsdevSeek, fsdevTell .dw fsdevGetC, fsdevPutC, fsdevSeek, fsdevTell
.dw stdoutGetC, stdoutPutC, stdoutSeek, stdoutTell .dw stdoutGetC, stdoutPutC, stdoutSeek, stdoutTell
.dw stdinGetC, stdinPutC, stdinSeek, stdinTell .dw stdinGetC, stdinPutC, stdinSeek, stdinTell
.dw mmapGetC, mmapPutC, mmapSeek, mmapTell
#include "blockdev_cmds.asm" #include "blockdev_cmds.asm"
.equ STDIO_RAMSTART BLOCKDEV_RAMEND .equ MMAP_RAMSTART BLOCKDEV_RAMEND
.equ MMAP_START 0xe000
#include "mmap.asm"
.equ STDIO_RAMSTART MMAP_RAMEND
#include "stdio.asm" #include "stdio.asm"
.equ FS_RAMSTART STDIO_RAMEND .equ FS_RAMSTART STDIO_RAMEND
@ -64,6 +71,8 @@
.equ PGM_CODEADDR USERCODE .equ PGM_CODEADDR USERCODE
#include "pgm.asm" #include "pgm.asm"
.out PGM_RAMEND
init: init:
di di
; setup stack ; setup stack

View File

@ -1,5 +1,5 @@
.equ USER_CODE 0x9000 .equ USER_CODE 0x4200
.equ USER_RAMSTART 0xa800 .equ USER_RAMSTART USER_CODE+0x1800
.equ FS_HANDLE_SIZE 8 .equ FS_HANDLE_SIZE 8
; *** JUMP TABLE *** ; *** JUMP TABLE ***