diff --git a/emul/emul.c b/emul/emul.c index 6075125..a2ff6c1 100644 --- a/emul/emul.c +++ b/emul/emul.c @@ -5,10 +5,13 @@ They all run on the same kind of virtual machine: A z80 CPU, 64K of RAM/ROM. #include #include "emul.h" -// Port for block reads. Write 2 bytes, MSB first, on that port and then -// read 1024 bytes from the DATA port. +// Port for block reads. Each read or write has to be done in 5 IO writes: +// 1 - r/w. 1 for read, 2 for write. +// 2 - blkid MSB +// 3 - blkid LSB +// 4 - dest addr MSB +// 5 - dest addr LSB #define BLK_PORT 0x03 -#define BLKDATA_PORT 0x04 #ifndef BLKFS_PATH #error BLKFS_PATH needed @@ -19,7 +22,7 @@ They all run on the same kind of virtual machine: A z80 CPU, 64K of RAM/ROM. static Machine m; static ushort traceval = 0; -static uint16_t blkid = 0; +static uint64_t blkop = 0; // 5 bytes static FILE *blkfp; static uint8_t io_read(int unused, uint16_t addr) @@ -47,19 +50,20 @@ static void io_write(int unused, uint16_t addr, uint8_t val) static void iowr_blk(uint8_t val) { - blkid <<= 8; - blkid |= val; - fseek(blkfp, blkid*1024, SEEK_SET); -} - -static uint8_t iord_blkdata() -{ - return getc(blkfp); -} - -static void iowr_blkdata(uint8_t val) -{ - putc(val, blkfp); + blkop <<= 8; + blkop |= val; + uint8_t rw = blkop >> 32; + if (rw) { + uint16_t blkid = (blkop >> 16); + uint16_t dest = blkop & 0xffff; + blkop = 0; + fseek(blkfp, blkid*1024, SEEK_SET); + if (rw==2) { // write + fwrite(&m.mem[dest], 1024, 1, blkfp); + } else { // read + fread(&m.mem[dest], 1024, 1, blkfp); + } + } } static uint8_t mem_read(int unused, uint16_t addr) @@ -120,8 +124,6 @@ Machine* emul_init() m.cpu.ioRead = io_read; m.cpu.ioWrite = io_write; m.iowr[BLK_PORT] = iowr_blk; - m.iord[BLKDATA_PORT] = iord_blkdata; - m.iowr[BLKDATA_PORT] = iowr_blkdata; return &m; } diff --git a/emul/forth.bin b/emul/forth.bin index 0357af0..af16521 100644 Binary files a/emul/forth.bin and b/emul/forth.bin differ diff --git a/emul/forth.c b/emul/forth.c index 1d476b5..7390c01 100644 --- a/emul/forth.c +++ b/emul/forth.c @@ -13,10 +13,6 @@ // This binary is also used for automated tests and those tests, when // failing, send a non-zero value to RET_PORT to indicate failure #define RET_PORT 0x01 -// Port for block reads. Write 2 bytes, MSB first, on that port and then -// read 1024 bytes from the DATA port. -#define BLK_PORT 0x03 -#define BLKDATA_PORT 0x04 #define SETX_PORT 0x05 #define SETY_PORT 0x06 diff --git a/emul/xcomp.fs b/emul/xcomp.fs index 63d0ad2..a8c48a7 100644 --- a/emul/xcomp.fs +++ b/emul/xcomp.fs @@ -10,17 +10,14 @@ : (emit) 0 PC! ; : (key) 0 PC@ ; : EFS@ - 256 /MOD 3 PC! 3 PC! - 1024 0 DO - 4 PC@ - BLK( I + C! - LOOP + 1 3 PC! ( read ) + 256 /MOD 3 PC! 3 PC! ( blkid ) + BLK( 256 /MOD 3 PC! 3 PC! ( dest ) ; : EFS! - 256 /MOD 3 PC! 3 PC! - 1024 0 DO - BLK( I + C@ 4 PC! - LOOP + 2 3 PC! ( write ) + 256 /MOD 3 PC! 3 PC! ( blkid ) + BLK( 256 /MOD 3 PC! 3 PC! ( dest ) ; : COLS 80 ; : LINES 32 ; : AT-XY 6 PC! ( y ) 5 PC! ( x ) ;