emul: make blk operations much faster

It helps a bit with staging times.
This commit is contained in:
Virgil Dupras 2020-06-22 06:29:00 -04:00
parent 515890717f
commit 4939189233
4 changed files with 27 additions and 32 deletions

View File

@ -5,10 +5,13 @@ They all run on the same kind of virtual machine: A z80 CPU, 64K of RAM/ROM.
#include <string.h> #include <string.h>
#include "emul.h" #include "emul.h"
// Port for block reads. Write 2 bytes, MSB first, on that port and then // Port for block reads. Each read or write has to be done in 5 IO writes:
// read 1024 bytes from the DATA port. // 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 BLK_PORT 0x03
#define BLKDATA_PORT 0x04
#ifndef BLKFS_PATH #ifndef BLKFS_PATH
#error BLKFS_PATH needed #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 Machine m;
static ushort traceval = 0; static ushort traceval = 0;
static uint16_t blkid = 0; static uint64_t blkop = 0; // 5 bytes
static FILE *blkfp; static FILE *blkfp;
static uint8_t io_read(int unused, uint16_t addr) 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) static void iowr_blk(uint8_t val)
{ {
blkid <<= 8; blkop <<= 8;
blkid |= val; blkop |= val;
fseek(blkfp, blkid*1024, SEEK_SET); uint8_t rw = blkop >> 32;
} if (rw) {
uint16_t blkid = (blkop >> 16);
static uint8_t iord_blkdata() uint16_t dest = blkop & 0xffff;
{ blkop = 0;
return getc(blkfp); fseek(blkfp, blkid*1024, SEEK_SET);
} if (rw==2) { // write
fwrite(&m.mem[dest], 1024, 1, blkfp);
static void iowr_blkdata(uint8_t val) } else { // read
{ fread(&m.mem[dest], 1024, 1, blkfp);
putc(val, blkfp); }
}
} }
static uint8_t mem_read(int unused, uint16_t addr) static uint8_t mem_read(int unused, uint16_t addr)
@ -120,8 +124,6 @@ Machine* emul_init()
m.cpu.ioRead = io_read; m.cpu.ioRead = io_read;
m.cpu.ioWrite = io_write; m.cpu.ioWrite = io_write;
m.iowr[BLK_PORT] = iowr_blk; m.iowr[BLK_PORT] = iowr_blk;
m.iord[BLKDATA_PORT] = iord_blkdata;
m.iowr[BLKDATA_PORT] = iowr_blkdata;
return &m; return &m;
} }

Binary file not shown.

View File

@ -13,10 +13,6 @@
// This binary is also used for automated tests and those tests, when // This binary is also used for automated tests and those tests, when
// failing, send a non-zero value to RET_PORT to indicate failure // failing, send a non-zero value to RET_PORT to indicate failure
#define RET_PORT 0x01 #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 SETX_PORT 0x05
#define SETY_PORT 0x06 #define SETY_PORT 0x06

View File

@ -10,17 +10,14 @@
: (emit) 0 PC! ; : (emit) 0 PC! ;
: (key) 0 PC@ ; : (key) 0 PC@ ;
: EFS@ : EFS@
256 /MOD 3 PC! 3 PC! 1 3 PC! ( read )
1024 0 DO 256 /MOD 3 PC! 3 PC! ( blkid )
4 PC@ BLK( 256 /MOD 3 PC! 3 PC! ( dest )
BLK( I + C!
LOOP
; ;
: EFS! : EFS!
256 /MOD 3 PC! 3 PC! 2 3 PC! ( write )
1024 0 DO 256 /MOD 3 PC! 3 PC! ( blkid )
BLK( I + C@ 4 PC! BLK( 256 /MOD 3 PC! 3 PC! ( dest )
LOOP
; ;
: COLS 80 ; : LINES 32 ; : COLS 80 ; : LINES 32 ;
: AT-XY 6 PC! ( y ) 5 PC! ( x ) ; : AT-XY 6 PC! ( y ) 5 PC! ( x ) ;