From 885e7db05433c01ea92b8e2e4a8de1287679e90a Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Sat, 24 Oct 2020 23:20:20 -0400 Subject: [PATCH] emul/8086: add BLK support --- emul/8086/Makefile | 7 ++----- emul/8086/forth.c | 39 +++++++++++++++++++++++++++++++++++++++ emul/8086/xcomp.fs | 7 +++++++ 3 files changed, 48 insertions(+), 5 deletions(-) diff --git a/emul/8086/Makefile b/emul/8086/Makefile index 7024d87..538c50e 100644 --- a/emul/8086/Makefile +++ b/emul/8086/Makefile @@ -7,11 +7,8 @@ BLKFS = $(CDIR)/blkfs .PHONY: all all: $(TARGETS) -forth: forth.c forth.bin $(OBJS) - $(CC) -DFBIN_PATH=\"`pwd`/forth.bin\" forth.c $(OBJS) -lncurses -o $@ - -emul.o: emul.c $(BLKFS) - $(CC) -DFBIN_PATH=\"`pwd`/forth.bin\" -DBLKFS_PATH=\"`pwd`/$(BLKFS)\" -c -o emul.o emul.c +forth: forth.c forth.bin $(OBJS) $(BLKFS) + $(CC) -DFBIN_PATH=\"`pwd`/forth.bin\" -DBLKFS_PATH=\"`pwd`/$(BLKFS)\" forth.c $(OBJS) -lncurses -o $@ forth.bin: xcomp.fs $(STAGE) $(CDIR)/stage < xcomp.fs > $@ diff --git a/emul/8086/forth.c b/emul/8086/forth.c index ee65b9f..6c55bbb 100644 --- a/emul/8086/forth.c +++ b/emul/8086/forth.c @@ -9,12 +9,16 @@ #ifndef FBIN_PATH #error FBIN_PATH needed #endif +#ifndef BLKFS_PATH +#error BLKFS_PATH needed +#endif extern uint8_t byteregtable[8]; extern union _bytewordregs_ regs; extern INTHOOK INTHOOKS[0x100]; static FILE *fp; +static FILE *blkfp; static int retcode = 0; WINDOW *bw, *dw, *w; @@ -22,6 +26,8 @@ WINDOW *bw, *dw, *w; INT 1: EMIT. AL = char to spit INT 2: KEY. AL = char read INT 3: AT-XY. AL = x, BL = y +INT 4: BLKREAD. AX = blkid, BX = dest addr +INT 5: BLKWRITE. AX = blkid, BX = src addr */ void int1() { @@ -46,12 +52,45 @@ void int3() { wmove(w, regs.byteregs[regbl], regs.byteregs[regal]); } +void int4() { + uint16_t blkid = getreg16(regax); + uint16_t dest = getreg16(regbx); + fseek(blkfp, blkid*1024, SEEK_SET); + for (int i=0; i<1024; i++) { + write86(dest+i, getc(blkfp)); + } +} + +void int5() { + uint16_t blkid = getreg16(regax); + uint16_t dest = getreg16(regbx); + fseek(blkfp, blkid*1024, SEEK_SET); + for (int i=0; i<1024; i++) { + putc(read86(dest+i), blkfp); + } +} + int main(int argc, char *argv[]) { INTHOOKS[1] = int1; INTHOOKS[2] = int2; INTHOOKS[3] = int3; + INTHOOKS[4] = int4; + INTHOOKS[5] = int5; reset86(); + fprintf(stderr, "Using blkfs %s\n", BLKFS_PATH); + blkfp = fopen(BLKFS_PATH, "r+"); + if (!blkfp) { + fprintf(stderr, "Can't open\n"); + return 1; + } + fseek(blkfp, 0, SEEK_END); + if (ftell(blkfp) < 100 * 1024) { + fclose(blkfp); + fprintf(stderr, "emul/blkfs too small, something's wrong, aborting.\n"); + return 1; + } + fseek(blkfp, 0, SEEK_SET); // initialize memory FILE *bfp = fopen(FBIN_PATH, "r"); if (!bfp) { diff --git a/emul/8086/xcomp.fs b/emul/8086/xcomp.fs index 0af65b9..acb444d 100644 --- a/emul/8086/xcomp.fs +++ b/emul/8086/xcomp.fs @@ -9,8 +9,15 @@ CODE (emit) AX POPx, 1 INT, ;CODE CODE (key) 2 INT, AH 0 MOVri, AX PUSHx, ;CODE : COLS 80 ; : LINES 25 ; CODE AT-XY ( x y ) BX POPx, AX POPx, 3 INT, ;CODE +CODE _ BX POPx, AX POPx, 4 INT, ;CODE +: EFS@ BLK( _ ; +CODE _ BX POPx, AX POPx, 5 INT, ;CODE +: EFS! BLK( _ ; 380 LOAD ( xcomp core high ) (entry) _ ( Update LATEST ) PC ORG @ 8 + ! +," BLK$ " +," ' EFS@ BLK@* ! " +," ' EFS! BLK!* ! " EOT, ORG @ 256 /MOD 2 PC! 2 PC! H@ 256 /MOD 2 PC! 2 PC!