mirror of
https://github.com/hsoft/collapseos.git
synced 2024-11-26 12:58:06 +11:00
Compare commits
No commits in common. "9515d63d47396e31b7759f6da75af2df5eee1ec4" and "bab18216aad2830fd50bce893ba0b797ebbca5e4" have entirely different histories.
9515d63d47
...
bab18216aa
@ -1,10 +0,0 @@
|
|||||||
; kbd - TRS-80 keyboard
|
|
||||||
;
|
|
||||||
; Implement GetC for TRS-80's keyboard using the system's SVCs.
|
|
||||||
|
|
||||||
trs80GetC:
|
|
||||||
push de ; altered by SVC
|
|
||||||
ld a, 0x01 ; @KEY
|
|
||||||
rst 0x28 ; --> A
|
|
||||||
pop de
|
|
||||||
ret
|
|
@ -1,16 +0,0 @@
|
|||||||
; vid - TRS-80's video
|
|
||||||
;
|
|
||||||
; Implement PutC using TRS-80's SVC calls so that character it put on video
|
|
||||||
; display.
|
|
||||||
|
|
||||||
trs80PutC:
|
|
||||||
push af
|
|
||||||
push bc
|
|
||||||
push de ; altered by SVC
|
|
||||||
ld c, a
|
|
||||||
ld a, 0x02 ; @DSP
|
|
||||||
rst 0x28
|
|
||||||
pop de
|
|
||||||
pop bc
|
|
||||||
pop af
|
|
||||||
ret
|
|
@ -1,10 +0,0 @@
|
|||||||
TARGET = os.bin
|
|
||||||
BASEDIR = ../..
|
|
||||||
ZASM = $(BASEDIR)/emul/zasm/zasm
|
|
||||||
KERNEL = $(BASEDIR)/kernel
|
|
||||||
APPS = $(BASEDIR)/apps
|
|
||||||
|
|
||||||
.PHONY: all
|
|
||||||
all: $(TARGET)
|
|
||||||
$(TARGET): glue.asm
|
|
||||||
$(ZASM) $(KERNEL) $(APPS) < glue.asm > $@
|
|
@ -4,20 +4,7 @@ The TRS-80 (models 1, 3 and 4) are among the most popular z80 machines. They're
|
|||||||
very nicely designed and I got my hands on a 4p with two floppy disk drives and
|
very nicely designed and I got my hands on a 4p with two floppy disk drives and
|
||||||
a RS-232 port. In this recipe, we're going to get Collapse OS running on it.
|
a RS-232 port. In this recipe, we're going to get Collapse OS running on it.
|
||||||
|
|
||||||
![Collapse OS on a TRS-80 Model 4P](collapseos-on-trs80.jpg)
|
**This is a work in progress. Collapse OS doesn't run on it yet.**
|
||||||
|
|
||||||
## Not entirely standalone
|
|
||||||
|
|
||||||
Collapse OS uses the TRS-80 drivers rather than its own. On most TRS-80 models,
|
|
||||||
those drivers are on ROM, but in the case of the 4P model, those drivers are on
|
|
||||||
the TRSDOS disk (well, from what I understand, not all of it, but still, a big
|
|
||||||
part of it).
|
|
||||||
|
|
||||||
It would be preferable to develop drivers from scratch, but it represents a
|
|
||||||
significant effort for a modest payout (because it's only actually useful when
|
|
||||||
you want to use a 4P model that has no TRSDOS disk).
|
|
||||||
|
|
||||||
Maybe those drivers will be developed later, but it's not a priority for now.
|
|
||||||
|
|
||||||
## Floppy or RS-232?
|
## Floppy or RS-232?
|
||||||
|
|
||||||
@ -63,11 +50,6 @@ my knowledge. As far as I know, the COMM program doesn't allow this.
|
|||||||
What are we going to do? We're going to punch in a binary program to handle that
|
What are we going to do? We're going to punch in a binary program to handle that
|
||||||
kind of reception! You're gonna feel real badass about it too...
|
kind of reception! You're gonna feel real badass about it too...
|
||||||
|
|
||||||
## Building the binary
|
|
||||||
|
|
||||||
You can start the process by building the binary. Running `make` in this folder
|
|
||||||
will yield a `os.bin` file. You'll need it later.
|
|
||||||
|
|
||||||
## Testing serial communication
|
## Testing serial communication
|
||||||
|
|
||||||
The first step here is ensuring that you have bi-directional serial
|
The first step here is ensuring that you have bi-directional serial
|
||||||
@ -111,8 +93,6 @@ 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 `0x4000` which is the offset it's
|
||||||
designed for.
|
designed for.
|
||||||
|
|
||||||
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 `0x4000-0x403f` range with the `d4000<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 `h4000<space>`. This will bring up a visual indicator of
|
||||||
@ -137,6 +117,34 @@ driver was loaded in `0x0ff4` and the DCB address was 8 bytes after that, with
|
|||||||
a value of `0x0238`. Don't forget that z80 is little endian. `38` will come
|
a value of `0x0238`. Don't forget that z80 is little endian. `38` will come
|
||||||
before `02`.
|
before `02`.
|
||||||
|
|
||||||
|
## Sending data through the RS-232 port
|
||||||
|
|
||||||
|
Once you're finished punching your program in memory, you can run it with
|
||||||
|
`g4000<enter>` (not space). Because it's an infinite loop, your screen will
|
||||||
|
freeze. You can start sending your data.
|
||||||
|
|
||||||
|
To that end, there's the `tools/pingpong` program. It takes a device and a
|
||||||
|
filename to send. As a test, send anything, but make it go through
|
||||||
|
`tools/ttysafe` first (which just takes input from stdin and spits tty-safe
|
||||||
|
content to stdout).
|
||||||
|
|
||||||
|
On OpenBSD, the invocation can look like:
|
||||||
|
|
||||||
|
doas ./pingpong /dev/ttyU0 mystuff.ttysafe
|
||||||
|
|
||||||
|
You will be prompted for a key before the contents is sent. This is because on
|
||||||
|
OpenBSD, TTY configuration is lost as soon as the TTY is closed, which means
|
||||||
|
that you can't just run `stty` before running `pingpong`. So, what you'll do is,
|
||||||
|
before you press your key, run `doas stty -f /dev/ttyU0 300 raw` and then press
|
||||||
|
any key on the `pingpong` invocation.
|
||||||
|
|
||||||
|
If everything goes well, the program will send your contents, verifying every
|
||||||
|
byte echoed back, and then send a null char to indicate to the receiving end
|
||||||
|
that it's finished sending. This will end the infinite loop on the TRS-80 side
|
||||||
|
and return. That should bring you back to a refreshed debug display and you
|
||||||
|
should see your sent content in memory, at the specified address (`0x3040` if
|
||||||
|
you didn't change it).
|
||||||
|
|
||||||
## Saving that program for later
|
## Saving that program for later
|
||||||
|
|
||||||
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
|
||||||
@ -151,47 +159,4 @@ A memory range dumped this way will be re-loaded at the same offset through
|
|||||||
using the `RUN` command. Therefore, you can avoid all this work above in later
|
using the `RUN` command. Therefore, you can avoid all this work above in later
|
||||||
sessions by simply typing `recv` in the DOS prompt.
|
sessions by simply typing `recv` in the DOS prompt.
|
||||||
|
|
||||||
## Sending binary through the RS-232 port
|
**WIP: that's where we are for now...**
|
||||||
|
|
||||||
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.
|
|
||||||
Because it's an infinite loop, your screen will freeze. You can start sending
|
|
||||||
your data.
|
|
||||||
|
|
||||||
To that end, there's the `tools/pingpong` program. It takes a device and a
|
|
||||||
filename to send. Before you send the binary, make it go through
|
|
||||||
`tools/ttysafe` first (which just takes input from stdin and spits tty-safe
|
|
||||||
content to stdout):
|
|
||||||
|
|
||||||
./ttysafe < os.bin > os.ttysafe
|
|
||||||
|
|
||||||
On OpenBSD, the invocation can look like:
|
|
||||||
|
|
||||||
doas ./pingpong /dev/ttyU0 os.ttysafe
|
|
||||||
|
|
||||||
You will be prompted for a key before the contents is sent. This is because on
|
|
||||||
OpenBSD, TTY configuration is lost as soon as the TTY is closed, which means
|
|
||||||
that you can't just run `stty` before running `pingpong`. So, what you'll do is,
|
|
||||||
before you press your key, run `doas stty -f /dev/ttyU0 300 raw` and then press
|
|
||||||
any key on the `pingpong` invocation.
|
|
||||||
|
|
||||||
If everything goes well, the program will send your contents, verifying every
|
|
||||||
byte echoed back, and then send a null char to indicate to the receiving end
|
|
||||||
that it's finished sending. This will end the infinite loop on the TRS-80 side
|
|
||||||
and return. That should bring you back to a refreshed debug display and you
|
|
||||||
should see your sent content in memory, at the specified address (`0x3000` if
|
|
||||||
you didn't change it).
|
|
||||||
|
|
||||||
If there was no error during `pingpong`, the content should be exact.
|
|
||||||
Nevertheless, I recommend that you manually validate a few bytes using TRSDOS
|
|
||||||
debugger before carrying on.
|
|
||||||
|
|
||||||
## Running Collapse OS
|
|
||||||
|
|
||||||
If everything went well, you can run Collapse OS with `g3000<space>`. You'll
|
|
||||||
get a usable Collapse OS prompt!
|
|
||||||
|
|
||||||
Like with the `recv` program, nothing stops you from dumping that binary to a
|
|
||||||
floppy.
|
|
||||||
|
|
||||||
Have fun!
|
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 181 KiB |
@ -1,47 +0,0 @@
|
|||||||
; RAMSTART is a label at the end of the file
|
|
||||||
.equ RAMEND 0xcfff
|
|
||||||
|
|
||||||
; Free memory in TRSDOS starts at 0x3000
|
|
||||||
.org 0x3000
|
|
||||||
jp init
|
|
||||||
|
|
||||||
.inc "err.h"
|
|
||||||
.inc "ascii.h"
|
|
||||||
.inc "core.asm"
|
|
||||||
.inc "str.asm"
|
|
||||||
|
|
||||||
.inc "trs80/kbd.asm"
|
|
||||||
.inc "trs80/vid.asm"
|
|
||||||
|
|
||||||
.equ STDIO_RAMSTART RAMSTART
|
|
||||||
.equ STDIO_GETC trs80GetC
|
|
||||||
.equ STDIO_PUTC trs80PutC
|
|
||||||
.inc "stdio.asm"
|
|
||||||
|
|
||||||
; *** BASIC ***
|
|
||||||
|
|
||||||
; RAM space used in different routines for short term processing.
|
|
||||||
.equ SCRATCHPAD_SIZE STDIO_BUFSIZE
|
|
||||||
.equ SCRATCHPAD STDIO_RAMEND
|
|
||||||
.inc "lib/util.asm"
|
|
||||||
.inc "lib/ari.asm"
|
|
||||||
.inc "lib/parse.asm"
|
|
||||||
.inc "lib/fmt.asm"
|
|
||||||
.equ EXPR_PARSE parseLiteralOrVar
|
|
||||||
.inc "lib/expr.asm"
|
|
||||||
.inc "basic/util.asm"
|
|
||||||
.inc "basic/parse.asm"
|
|
||||||
.inc "basic/tok.asm"
|
|
||||||
.equ VAR_RAMSTART SCRATCHPAD+SCRATCHPAD_SIZE
|
|
||||||
.inc "basic/var.asm"
|
|
||||||
.equ BUF_RAMSTART VAR_RAMEND
|
|
||||||
.inc "basic/buf.asm"
|
|
||||||
.equ BAS_RAMSTART BUF_RAMEND
|
|
||||||
.inc "basic/main.asm"
|
|
||||||
|
|
||||||
init:
|
|
||||||
ld sp, RAMEND
|
|
||||||
call basInit
|
|
||||||
jp basStart
|
|
||||||
|
|
||||||
RAMSTART:
|
|
@ -14,13 +14,7 @@ all: $(TARGETS)
|
|||||||
.c.o:
|
.c.o:
|
||||||
$(CC) $(CFLAGS) -c $< -o $@
|
$(CC) $(CFLAGS) -c $< -o $@
|
||||||
|
|
||||||
$(MEMDUMP_TGT): $(MEMDUMP_TGT).c
|
$(TARGETS): $@.c $(OBJS)
|
||||||
$(BLKDUMP_TGT): $(BLKDUMP_TGT).c
|
|
||||||
$(UPLOAD_TGT): $(UPLOAD_TGT).c
|
|
||||||
$(FONTCOMPILE_TGT): $(FONTCOMPILE_TGT).c
|
|
||||||
$(TTYSAFE_TGT): $(TTYSAFE_TGT).c
|
|
||||||
$(PINGPONG_TGT): $(PINGPONG_TGT).c
|
|
||||||
$(TARGETS): $(OBJS)
|
|
||||||
$(CC) $(CFLAGS) $@.c $(OBJS) -o $@
|
$(CC) $(CFLAGS) $@.c $(OBJS) -o $@
|
||||||
|
|
||||||
.PHONY: clean
|
.PHONY: clean
|
||||||
|
Loading…
Reference in New Issue
Block a user