recipes/rc2014/sdcard: mount filesystem!
This commit is contained in:
parent
312e95479e
commit
6b1679c811
1
recipes/rc2014/sdcard/.gitignore
vendored
Normal file
1
recipes/rc2014/sdcard/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
cfsin/helo
|
@ -1,4 +1,4 @@
|
|||||||
TARGETS = os.bin
|
TARGETS = os.bin cfsin/helo
|
||||||
TOOLS = ../../../tools
|
TOOLS = ../../../tools
|
||||||
ZASM = $(TOOLS)/emul/zasm/zasm
|
ZASM = $(TOOLS)/emul/zasm/zasm
|
||||||
CFSPACK = $(TOOLS)/cfspack/cfspack
|
CFSPACK = $(TOOLS)/cfspack/cfspack
|
||||||
@ -6,6 +6,7 @@ CFSPACK = $(TOOLS)/cfspack/cfspack
|
|||||||
.PHONY: all
|
.PHONY: all
|
||||||
all: $(TARGETS) sdcard.cfs
|
all: $(TARGETS) sdcard.cfs
|
||||||
os.bin: glue.asm
|
os.bin: glue.asm
|
||||||
|
cfsin/helo: helo.asm
|
||||||
$(TARGETS):
|
$(TARGETS):
|
||||||
$(ZASM) < $< > $@
|
$(ZASM) < $< > $@
|
||||||
|
|
||||||
|
@ -98,5 +98,35 @@ you're ready to load your contents with `load d` (load the 13 bytes that you
|
|||||||
wrote to your sd card earlier. You can then `peek d` and see that your
|
wrote to your sd card earlier. You can then `peek d` and see that your
|
||||||
"Hello World!\n" got loaded in memory!
|
"Hello World!\n" got loaded in memory!
|
||||||
|
|
||||||
|
## Mounting a filesystem from the SD card
|
||||||
|
|
||||||
|
The Makefile compiles `helo.asm` in `cfsin` and then packs `cfsin` into a CFS
|
||||||
|
filesystem into the `sdcard.cfs` file. That can be mounted by Collapse OS!
|
||||||
|
|
||||||
|
$ cat sdcard.cfs > /dev/sdX
|
||||||
|
|
||||||
|
Then, you insert your SD card in your SPI relay and go:
|
||||||
|
|
||||||
|
Collapse OS
|
||||||
|
> mptr 9000
|
||||||
|
9000
|
||||||
|
> sdci
|
||||||
|
> bsel 1
|
||||||
|
> fson
|
||||||
|
> fls
|
||||||
|
helo
|
||||||
|
hello.txt
|
||||||
|
> fopn 0 helo
|
||||||
|
> load 10
|
||||||
|
> peek 10
|
||||||
|
210690C3030048656C6C6F210D0A0000
|
||||||
|
> call 00 0000
|
||||||
|
Hello!
|
||||||
|
>
|
||||||
|
|
||||||
|
Now let that sink in for a minute. You've just mounted a filesystem on a SD
|
||||||
|
card, loaded a file from it in memory and executed that file, all that on a
|
||||||
|
kernel that weights less than 3 kilobytes!
|
||||||
|
|
||||||
[schematic]: spirelay/spirelay.pdf
|
[schematic]: spirelay/spirelay.pdf
|
||||||
[inspiration]: https://www.ecstaticlyrics.com/electronics/SPI/fast_z80_interface.html
|
[inspiration]: https://www.ecstaticlyrics.com/electronics/SPI/fast_z80_interface.html
|
||||||
|
@ -5,20 +5,14 @@
|
|||||||
.equ ACIA_CTL 0x80 ; Control and status. RS off.
|
.equ ACIA_CTL 0x80 ; Control and status. RS off.
|
||||||
.equ ACIA_IO 0x81 ; Transmit. RS on.
|
.equ ACIA_IO 0x81 ; Transmit. RS on.
|
||||||
|
|
||||||
jp init
|
jp init ; 3 bytes
|
||||||
|
|
||||||
; *** JUMP TABLE ***
|
; *** Jump Table ***
|
||||||
; Why not use this unused space between 0x03 and 0x38 for a jump table?
|
jp printstr
|
||||||
jp printstr
|
jp fsOpen
|
||||||
jp printHex
|
jp fsSeek
|
||||||
jp sdcInitialize
|
jp fsTell
|
||||||
jp sdcSendRecv
|
jp fsGetC
|
||||||
jp sdcWaitResp
|
|
||||||
jp sdcCmd
|
|
||||||
jp sdcCmdR1
|
|
||||||
jp sdcCmdR7
|
|
||||||
jp sdcReadBlk
|
|
||||||
jp sdcSetBlkSize
|
|
||||||
|
|
||||||
; interrupt hook
|
; interrupt hook
|
||||||
.fill 0x38-$
|
.fill 0x38-$
|
||||||
@ -29,21 +23,28 @@ jp aciaInt
|
|||||||
.equ ACIA_RAMSTART RAMSTART
|
.equ ACIA_RAMSTART RAMSTART
|
||||||
#include "acia.asm"
|
#include "acia.asm"
|
||||||
.equ BLOCKDEV_RAMSTART ACIA_RAMEND
|
.equ BLOCKDEV_RAMSTART ACIA_RAMEND
|
||||||
.equ BLOCKDEV_COUNT 2
|
.equ BLOCKDEV_COUNT 3
|
||||||
#include "blockdev.asm"
|
#include "blockdev.asm"
|
||||||
; List of devices
|
; List of devices
|
||||||
.dw aciaGetC, aciaPutC, 0, 0
|
.dw aciaGetC, aciaPutC, 0, 0
|
||||||
.dw sdcGetC, 0, 0, 0
|
.dw sdcGetC, 0, sdcSeek, sdcTell
|
||||||
|
.dw blk2GetC, blk2PutC, blk2Seek, blk2Tell
|
||||||
|
|
||||||
#include "blockdev_cmds.asm"
|
#include "blockdev_cmds.asm"
|
||||||
|
|
||||||
.equ STDIO_RAMSTART BLOCKDEV_RAMEND
|
.equ STDIO_RAMSTART BLOCKDEV_RAMEND
|
||||||
#include "stdio.asm"
|
#include "stdio.asm"
|
||||||
|
|
||||||
.equ SHELL_RAMSTART STDIO_RAMEND
|
.equ FS_RAMSTART STDIO_RAMEND
|
||||||
.equ SHELL_EXTRA_CMD_COUNT 4
|
.equ FS_HANDLE_COUNT 1
|
||||||
|
#include "fs.asm"
|
||||||
|
#include "fs_cmds.asm"
|
||||||
|
|
||||||
|
.equ SHELL_RAMSTART FS_RAMEND
|
||||||
|
.equ SHELL_EXTRA_CMD_COUNT 8
|
||||||
#include "shell.asm"
|
#include "shell.asm"
|
||||||
.dw sdcInitializeCmd, blkBselCmd, blkSeekCmd, sdcInitializeCmd
|
.dw sdcInitializeCmd, blkBselCmd, blkSeekCmd
|
||||||
|
.dw fsOnCmd, flsCmd, fnewCmd, fdelCmd, fopnCmd
|
||||||
|
|
||||||
.equ SDC_RAMSTART SHELL_RAMEND
|
.equ SDC_RAMSTART SHELL_RAMEND
|
||||||
.equ SDC_PORT_CSHIGH 6
|
.equ SDC_PORT_CSHIGH 6
|
||||||
@ -67,3 +68,20 @@ init:
|
|||||||
ei
|
ei
|
||||||
jp shellLoop
|
jp shellLoop
|
||||||
|
|
||||||
|
; *** blkdev 2: file handle 0 ***
|
||||||
|
|
||||||
|
blk2GetC:
|
||||||
|
ld de, FS_HANDLES
|
||||||
|
jp fsGetC
|
||||||
|
|
||||||
|
blk2PutC:
|
||||||
|
ld de, FS_HANDLES
|
||||||
|
jp fsPutC
|
||||||
|
|
||||||
|
blk2Seek:
|
||||||
|
ld de, FS_HANDLES
|
||||||
|
jp fsSeek
|
||||||
|
|
||||||
|
blk2Tell:
|
||||||
|
ld de, FS_HANDLES
|
||||||
|
jp fsTell
|
||||||
|
10
recipes/rc2014/sdcard/helo.asm
Normal file
10
recipes/rc2014/sdcard/helo.asm
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
; prints "Hello!" on screen
|
||||||
|
.equ printstr 0x03
|
||||||
|
|
||||||
|
.org 0x9000
|
||||||
|
|
||||||
|
ld hl, sHello
|
||||||
|
jp printstr ; return
|
||||||
|
|
||||||
|
sHello:
|
||||||
|
.db "Hello!", 0x0d, 0x0a, 0
|
Loading…
Reference in New Issue
Block a user