From 57356e47b4168988be484b7de070e9318283a2f5 Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Sun, 2 Jun 2019 11:53:36 -0400 Subject: [PATCH] recipes/rc2014/sdcard: add instructions to write to SD card --- recipes/rc2014/sdcard/README.md | 42 ++++++++++++++++++++++++++++++--- recipes/rc2014/sdcard/glue.asm | 19 ++++++++------- 2 files changed, 50 insertions(+), 11 deletions(-) diff --git a/recipes/rc2014/sdcard/README.md b/recipes/rc2014/sdcard/README.md index 38121d2..1695839 100644 --- a/recipes/rc2014/sdcard/README.md +++ b/recipes/rc2014/sdcard/README.md @@ -90,8 +90,9 @@ World!": Then, insert your SD card in your SPI relay and boot the RC2014. -Run the `sdci` command which will initialize the card. Then, run `bsel 1` to -select the second blockdev, which is configured to be the sd card. +Run the `sdci` command which will initialize the card. The blockdev 0 is +already selected at initialization, but you could, to be sure, run `bsel 0` to +select the first blockdev, which is configured to be the sd card. Set your memory pointer to somewhere you can write to with `mptr 9000` and then you're ready to load your contents with `load d` (load the 13 bytes that you @@ -109,7 +110,6 @@ Then, you insert your SD card in your SPI relay and go: Collapse OS > sdci - > bsel 1 > fson > fls helo @@ -127,5 +127,41 @@ 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! +## Writing to a file in the SD card + +Now what we're going to do is to write back to a file on the SD card. From a +system with the SD card initialized and the FS mounted, do: + + > fopn 0 hello.txt + > bsel 1 + > mptr 9000 + 9000 + > load d + > peek d + 48656C6C6F20576F726C64210A + +Now that we have our "Hello World!\n" loaded in memory, let's modify it and make +it start with "XXX" and save it to the file. `sdcf` flushes the current SD card +buffer to the card. It's automatically ran whenever we change sector during a +read/write/seek, but was can also explicitly call it with `sdcf`. + + > poke 3 + [type "XXX"] + > peek d + 5858586C6F20576F726C64210A + > seek 00 0000 + 0000 + > save d + > sdcf + +The new "XXXlo World!\n" is now written to the card, at its proper place in CFS! +You can verify this by pulling out the card (no need to unmount it from Collapse +OS, but if you insert it again, you'll need to run `sdci` again), insert it in +your modern system and run: + + $ head -c 512 /dev/sdX | xxd + +You'll see your "XXXlo World!\n" somewhere, normally at offset `0x120`! + [schematic]: spirelay/spirelay.pdf [inspiration]: https://www.ecstaticlyrics.com/electronics/SPI/fast_z80_interface.html diff --git a/recipes/rc2014/sdcard/glue.asm b/recipes/rc2014/sdcard/glue.asm index e055ab5..8e81a5e 100644 --- a/recipes/rc2014/sdcard/glue.asm +++ b/recipes/rc2014/sdcard/glue.asm @@ -25,10 +25,9 @@ jp aciaInt .equ ACIA_RAMSTART RAMSTART #include "acia.asm" .equ BLOCKDEV_RAMSTART ACIA_RAMEND -.equ BLOCKDEV_COUNT 3 +.equ BLOCKDEV_COUNT 2 #include "blockdev.asm" ; List of devices -.dw aciaGetC, aciaPutC, 0, 0 .dw sdcGetC, sdcPutC, sdcSeek, sdcTell .dw blk2GetC, blk2PutC, blk2Seek, blk2Tell @@ -43,9 +42,10 @@ jp aciaInt #include "fs_cmds.asm" .equ SHELL_RAMSTART FS_RAMEND -.equ SHELL_EXTRA_CMD_COUNT 9 +.equ SHELL_EXTRA_CMD_COUNT 11 #include "shell.asm" -.dw sdcInitializeCmd, sdcFlushCmd, blkBselCmd, blkSeekCmd +.dw sdcInitializeCmd, sdcFlushCmd +.dw blkBselCmd, blkSeekCmd, blkLoadCmd, blkSaveCmd .dw fsOnCmd, flsCmd, fnewCmd, fdelCmd, fopnCmd #include "pgm.asm" @@ -61,16 +61,19 @@ init: ; setup stack ld hl, RAMEND ld sp, hl - im 1 + im 1 call aciaInit - xor a - ld de, BLOCKDEV_GETC - call blkSel + ld hl, aciaGetC + ld de, aciaPutC call stdioInit call shellInit ld hl, pgmShellHook ld (SHELL_CMDHOOK), hl + xor a + ld de, BLOCKDEV_GETC + call blkSel + ei jp shellLoop