1
0
mirror of https://github.com/hsoft/collapseos.git synced 2024-11-24 01:08:06 +11:00

recipes/trs80: can now run zasm!

This commit is contained in:
Virgil Dupras 2020-02-23 14:51:19 -05:00
parent 2860a10f71
commit c3213e1e8c
6 changed files with 83 additions and 9 deletions

2
recipes/trs80/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
/cfsin/user.h
/cfsin/zasm

View File

@ -1,10 +1,30 @@
SHELLAPPS = zasm
APPTARGETS = ${SHELLAPPS:%=cfsin/%}
CFSTARGETS = $(APPTARGETS) cfsin/user.h
TARGET = os.bin TARGET = os.bin
BASEDIR = ../.. BASEDIR = ../..
ZASM = $(BASEDIR)/emul/zasm/zasm ZASM = $(BASEDIR)/emul/zasm/zasm
KERNEL = $(BASEDIR)/kernel KERNEL = $(BASEDIR)/kernel
APPS = $(BASEDIR)/apps APPS = $(BASEDIR)/apps
CFSPACK = $(BASEDIR)/tools/cfspack/cfspack
.PHONY: all .PHONY: all
all: $(TARGET) all: $(TARGET) floppy.cfs
$(TARGET): glue.asm $(TARGET): glue.asm
$(ZASM) $(KERNEL) $(APPS) < glue.asm > $@ $(ZASM) $(KERNEL) $(APPS) < glue.asm > $@
$(CFSPACK):
make -C $(BASEDIR)/tools/cfspack
floppy.cfs: $(CFSTARGETS) $(CFSPACK)
$(CFSPACK) cfsin > $@
$(APPTARGETS):
$(ZASM) $(KERNEL) $(APPS) user.h < $(APPS)/${@:cfsin/%=%}/glue.asm > $@
cfsin/user.h: user.h
cp user.h $@
.PHONY: clean
clean:
rm -f $(CFSTARGETS) floppy.cfs $(TARGET)

View File

@ -102,20 +102,20 @@ As stated in the overview, we need a program on the TRS-80 that:
That program has already been written, it's in `recv.asm` in this folder. You That program has already been written, it's in `recv.asm` in this folder. You
can get the binary with `zasm < recv.asm | xxd`. can get the binary with `zasm < recv.asm | xxd`.
It's designed to run from offset `0x4000` and write received data in `0x3000` It's designed to run from offset `0x5000` and write received data in `0x3000`
and onwards. and onwards.
How will you punch that in? The `debug` program! This very useful piece of How will you punch that in? The `debug` program! This very useful piece of
software is supplied in TRSDOS. To invoke it, first run `debug (on)` and then software is supplied in TRSDOS. To invoke it, first run `debug (on)` and then
press the `BREAK` key. You'll get the debug interface which allows you to punch press the `BREAK` key. You'll get the debug interface which allows you to punch
in any data in any memory address. Let's use `0x4000` which is the offset it's in any data in any memory address. Let's use `0x5000` which is the offset it's
designed for. designed for.
For reference: to go back to the TRSDOS prompt, it's `o<return>`. For reference: to go back to the TRSDOS prompt, it's `o<return>`.
First, display the `0x4000-0x403f` range with the `d4000<space>` command (I First, display the `0x5000-0x503f` range with the `d5000<space>` command (I
always press Enter by mistake, but it's space you need to press). Then, you can always press Enter by mistake, but it's space you need to press). Then, you can
begin punching in with `h4000<space>`. This will bring up a visual indicator of begin punching in with `h5000<space>`. This will bring up a visual indicator of
the address being edited. Punch in the stuff with a space in between each byte the address being edited. Punch in the stuff with a space in between each byte
and end the edit session with `x`. and end the edit session with `x`.
@ -141,10 +141,10 @@ before `02`.
If you want to save yourself typing for later sessions, why not save the If you want to save yourself typing for later sessions, why not save the
program you've painfully typed to disk? TRSDOS enables that easily. Let's say program you've painfully typed to disk? TRSDOS enables that easily. Let's say
that you typed your program at `0x4000` and that you want to save it to that you typed your program at `0x5000` and that you want to save it to
`RECV/CMD` on your second floppy drive, you'd do: `RECV/CMD` on your second floppy drive, you'd do:
dump recv/cmd:1 (start=x'4000',end=x'4030',tra='4000') dump recv/cmd:1 (start=x'5000',end=x'5030',tra='5000')
A memory range dumped this way will be re-loaded at the same offset through A memory range dumped this way will be re-loaded at the same offset through
`load recv/cmd:1`. Even better, `TRA` indicates when to jump after load when `load recv/cmd:1`. Even better, `TRA` indicates when to jump after load when
@ -158,7 +158,7 @@ debugger.
## Sending binary through the RS-232 port ## Sending binary through the RS-232 port
Once you're finished punching your program in memory, you can run it with Once you're finished punching your program in memory, you can run it with
`g4000<enter>` (not space). If you've saved it to disk, run `recv` instead. `g5000<enter>` (not space). If you've saved it to disk, run `recv` instead.
Because it's an infinite loop, your screen will freeze. You can start sending Because it's an infinite loop, your screen will freeze. You can start sending
your data. your data.
@ -222,3 +222,13 @@ writing `CFS\0\0\0\0` to the disk). If it doesn't error out, commands like
There is also a custom `recv` command that does the same "ping pong" as in There is also a custom `recv` command that does the same "ping pong" as in
`recv.asm`, but once. It puts the result in `A`. This can be useful to send down `recv.asm`, but once. It puts the result in `A`. This can be useful to send down
a raw CFS: you just need a while loop that repeatedly call `recv:putb a`. a raw CFS: you just need a while loop that repeatedly call `recv:putb a`.
## Assembling programs
Running `make` will yield a `floppy.cfs` file that you can dump on a disk. This
CFS contains a properly configured `zasm` as well as a test `hello.asm` file.
By mounting this CFS (running `fson` with the active device properly placed),
you can assemble and run a binary from `hello.asm` in the same way that you
would in any CFS-enabled shell. You'll then see those sweet "Assembled from a
TRS-80" words!

View File

@ -0,0 +1,11 @@
.inc "user.h"
ld hl, sAwesome
call printstr
xor a ; success
ret
sAwesome:
.db "Assembled from a TRS-80", 0x0d, 0

View File

@ -9,6 +9,21 @@
.org 0x3000 .org 0x3000
jp init jp init
; *** Jump Table ***
jp strncmp
jp upcase
jp findchar
jp printstr
jp blkSet
jp blkSel
jp _blkGetB
jp _blkPutB
jp _blkSeek
jp _blkTell
jp fsFindFN
jp fsOpen
jp fsGetB
.inc "err.h" .inc "err.h"
.inc "blkdev.h" .inc "blkdev.h"
.inc "fs.h" .inc "fs.h"
@ -142,7 +157,9 @@ basFindCmdExtra:
call basFindCmd call basFindCmd
ret z ret z
ld hl, .cmds ld hl, .cmds
jp basFindCmd call basFindCmd
ret z
jp basPgmHook
.cmds: .cmds:
.db "recv", 0 .db "recv", 0

14
recipes/trs80/user.h Normal file
View File

@ -0,0 +1,14 @@
.org 0x5800
.equ strncmp 0x3003
.equ upcase @+3
.equ findchar @+3
.equ printstr @+3
.equ blkSet @+3
.equ blkSel @+3
.equ _blkGetB @+3
.equ _blkPutB @+3
.equ _blkSeek @+3
.equ _blkTell @+3
.equ fsFindFN @+3
.equ fsOpen @+3
.equ fsGetB @+3