From 4939189233c649a6e0544eefcb5ba700de008ac0 Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Mon, 22 Jun 2020 06:29:00 -0400 Subject: [PATCH] emul: make blk operations much faster It helps a bit with staging times. --- emul/emul.c | 40 +++++++++++++++++++++------------------- emul/forth.bin | Bin 6174 -> 6180 bytes emul/forth.c | 4 ---- emul/xcomp.fs | 15 ++++++--------- 4 files changed, 27 insertions(+), 32 deletions(-) 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 0357af013680c80a66f484b8236a62a043167cab..af165211c0cece7de50633dbc85e55367e897770 100644 GIT binary patch delta 846 zcma)4O-NKx6h3$E%&6ncyuW$xX+Pv7^P^MdLX$#FpE;(?=rE%&{UL%fm1MN2HbO=i zxQLJgK`k;EDI%lVwJ2v14AfePHj*w{#6S?%!bPuh-xLIGTDsfYxIAjH8e7i^8;R!vLi)l9(L?qE(@%j4lb%)3q^@A$$BU9IZ=PM8U=nwsbqkv?MM|u z<}&?0;6!YKBAW7E=EF|;053}>PRYY;0iVmd{#Y(SS@QcV=(9$%WBV1j#opmZ`DDB( zy>WN&io8t~j=%+P0lXmO6r~(gYzvOH0b`3ifv1$769uIxiO+(ze50dJ%)g{8DHcow z2`H)@CGIv`QcUXUh86b{*ro#2g+^ThY~m*+(IQ6QvLmtu$H&u|NgAjkMO|V6c^-8Y zi2L3x*lXCKMm-ynDR1C}dZu|%6fmO8x9ym*= zA9e*Bv^Wc5pVq++;Z-fhO*w%NwMKqdGx4?7TqD$cvm^Lf>-CxPI=C*)l%)u^htBDP zAt5U1nd9QccpcBiXQ2$6!Ji?+lTae^3^wZFE=i{a_qH}T_t8T@5sIrD)))CYqbS_! zcapu;WLP8%cv;`GFRyPhqvit-@hkc~e6erRCB!dIo}X=rftT61s;6T@iQnm8f=7H< zpQE+j=LP!zrA(W`Cd2fQdie!*8*x^~X(Ptcc-zRaW!y9pG0&TVce&0P$Gp{C2t8jz5-y!@mJ~a=M-7>p>0k+!Hf&c&j delta 901 zcmZ`%T}V@57=FL=o%u88&N(|fn}xPioHNS=MaZPu+2%5~Hg+uR*A@)_v+ybyWEq8c z6MR<+3j!02F0yXCsWTF~@Oq$KMG@-d@Je@>Ngs@KqUW1mHSta zOGL&pDiDhpU2ICadO9P`!mr|9K?mK?KtP@<$VfUw`fEy+wNwQX<*N2i73r@<&4QH2 zP9q+$0!83{$gl>vfr#v=e2``(g^kOn+Hc7PvS?|ld@Fi|C8|S5lLzjQN3sc7$!68T zug4ODO$yv28|(ufPKtqF!MHv74netg~K+*Rm}s@-|C3E;i3OxQZ1L=(P&Hnox@hqYm!e@6hp` zVILibYF8X4Sl|+N{Ve9$KGjF6SXk{QZ7i*}dK9?@O-BZdK{qNtwwoZAyl&A=@qwza z*J^Vmclf>NVLR#xt0Lz>n4ZW=9@gU=)%;FwwBM4Z&qNc2`D>TGaK`IXPNa?bg9#Zd zWD~cr3R|>5S`?3*VjiuLR5QO;M}q9UR^OM@=4p=LR-&=9Av*$iTwb9-_{}A>_rz7n zU(?zwd@au5T6|NQNJ_);&cIS_|uZqB^2 z<-i)4o}5fxpGn0GoJM}abeE50*@UZ=gc)-gWRZPxwKs%aULlPK6p9!j74Bl>2H317 z2=KJV!VbIr*nPuY=L@^|SzU0zZL+KCm^VLz(g_7((fB|F$GT58Y8Kg=y9cR1yZe3v D8y4zH 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 ) ;