From a7dcb522c2ee85686ab1ff88dcc47a49addf5caf Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Mon, 6 Jul 2020 07:27:50 -0400 Subject: [PATCH] Make br cells 1 byte wide The 1 byte limitation has been effective for a while now, but I hadn't made the move yet, I wanted to see if the limitation would cause me problems. It doesn't. Doing this now slightly facilitates the IY->BC move in z80. Bootstrapping: if you try to recreate the CVM binary from the previous commit with this code, you'll have bootstrapping problems. The first bootstrap will compile a binary with 2-bytes wide cells but branching conditionals that yields 1-byte cells. That's bad. I got around the issue by temporarily inserting a "397 399 LOADR" instruction in cvm/xcomp.fs, right before the xcomp overrides. This way, I force 1-byte cells everywhere on the first compiliation, which then allows me to apply the logic change in cvm/vm.c and have a properly running binary. --- blk/297 | 7 ++++--- blk/298 | 2 +- blk/397 | 2 +- blk/398 | 8 ++++---- blk/399 | 4 ++-- blk/753 | 2 +- blk/806 | 7 ++++--- blk/807 | 2 +- cvm/forth.bin | Bin 5336 -> 5238 bytes cvm/vm.c | 10 +++++++--- 10 files changed, 25 insertions(+), 19 deletions(-) diff --git a/blk/297 b/blk/297 index da06ddb..84b1b94 100644 --- a/blk/297 +++ b/blk/297 @@ -1,7 +1,8 @@ CODE (br) L1 BSET ( used in ?br and loop ) PC ORG @ 0x3d + ! ( stable ABI JP ) - E 0 IY+ LDrIXY, D 1 IY+ LDrIXY, + E 0 IY+ LDrIXY, D 0 LDri, + 7 E BIT, IFNZ, D DECr, THEN, DE ADDIYd, ;CODE CODE (?br) @@ -9,6 +10,6 @@ PC ORG @ 0x41 + ! ( stable ABI JP ) HL POP, HLZ, JRZ, L1 BWR ( br + 1. False, branch ) - ( True, skip next 2 bytes and don't branch ) - IY INCd, IY INCd, + ( True, skip next byte and don't branch ) + IY INCd, ;CODE diff --git a/blk/298 b/blk/298 index 9b42883..5c88d37 100644 --- a/blk/298 +++ b/blk/298 @@ -6,7 +6,7 @@ PC ORG @ 0x45 + ! ( stable ABI JP ) A 1 IX+ LDrIXY, 1 IX- CP(IXY+), JRNZ, L1 BWR ( branch ) ( don't branch ) IX DECd, IX DECd, IX DECd, IX DECd, - IY INCd, IY INCd, + IY INCd, ;CODE diff --git a/blk/397 b/blk/397 index 8175820..f2628e9 100644 --- a/blk/397 +++ b/blk/397 @@ -1,7 +1,7 @@ ( Now we have "as late as possible" stuff. See B70 and B260. ) : _bchk DUP 0x7f + 0xff > IF LIT< br-ovfl (print) ABORT THEN ; : DO 0x33 ( 2>R ) , H@ ; IMMEDIATE -: LOOP 0x43 ( loop ) , H@ - _bchk , ; IMMEDIATE +: LOOP 0x43 ( loop ) , H@ - _bchk C, ; IMMEDIATE ( LEAVE is implemented in low xcomp ) : LITN 0x23 ( n ) , , ; ( gets its name at the very end. can't comment afterwards ) diff --git a/blk/398 b/blk/398 index 9d9ab3c..f5d0ad5 100644 --- a/blk/398 +++ b/blk/398 @@ -1,12 +1,12 @@ : IF ( -- a | a: br cell addr ) - 0x3f ( ?br ) , H@ 2 ALLOT ( br cell allot ) + 0x3f ( ?br ) , H@ 1 ALLOT ( br cell allot ) ; IMMEDIATE : THEN ( a -- | a: br cell addr ) - DUP H@ -^ _bchk SWAP ( a-H a ) ! + DUP H@ -^ _bchk SWAP ( a-H a ) C! ; IMMEDIATE : ELSE ( a1 -- a2 | a1: IF cell a2: ELSE cell ) 0x3b ( br ) , - 2 ALLOT + 1 ALLOT [COMPILE] THEN - H@ 2- ( push a. -2 for allot offset ) + H@ 1- ( push a. 1- for allot offset ) ; IMMEDIATE diff --git a/blk/399 b/blk/399 index 2cbd9f4..77e0abe 100644 --- a/blk/399 +++ b/blk/399 @@ -1,7 +1,7 @@ : LIT< 0x2b ( s ) , WORD DUP C@ 1+ MOVE, ; IMMEDIATE : BEGIN H@ ; IMMEDIATE -: AGAIN 0x3b ( br ) , H@ - _bchk , ; IMMEDIATE -: UNTIL 0x3f ( ?br ) , H@ - _bchk , ; IMMEDIATE +: AGAIN 0x3b ( br ) , H@ - _bchk C, ; IMMEDIATE +: UNTIL 0x3f ( ?br ) , H@ - _bchk C, ; IMMEDIATE : [ INTERPRET ; IMMEDIATE : ] R> DROP ; : COMPILE ' LITN ['] , , ; IMMEDIATE diff --git a/blk/753 b/blk/753 index efe3268..f7cc861 100644 --- a/blk/753 +++ b/blk/753 @@ -1,7 +1,7 @@ : OP1 CREATE C, DOES> C@ A, ; 0xc3 OP1 RETn, 0xfa OP1 CLI, 0xfb OP1 STI, 0xf4 OP1 HLT, 0xfc OP1 CLD, 0xfd OP1 STD, -0x90 OP1 NOP, +0x90 OP1 NOP, 0x98 OP1 CBW, 0xf3 OP1 REPZ, 0xf2 OP1 REPNZ, 0xac OP1 LODSB, 0xad OP1 LODSW, 0xa6 OP1 CMPSB, 0xa7 OP1 CMPSW, 0xa4 OP1 MOVSB, 0xa5 OP1 MOVSW, 0xae OP1 SCASB, diff --git a/blk/806 b/blk/806 index 91639e8..11e23f7 100644 --- a/blk/806 +++ b/blk/806 @@ -2,11 +2,12 @@ H@ 4 + XCURRENT ! ( make next CODE have 0 prev field ) CODE (br) L1 BSET ( used in ?br ) PC 0x3f - ORG @ 0x3d + ! ( stable abi ) - DI DX MOVxx, DI [DI] MOVx[], DX DI ADDxx, + DI DX MOVxx, AL [DI] MOVr[], AH AH XORrr, CBW, + DX AX ADDxx, ;CODE CODE (?br) PC 0x43 - ORG @ 0x41 + ! ( stable abi ) AX POPx, AX AX ORxx, JZ, L1 @ RPCs, ( False, branch ) - ( True, skip next 2 bytes and don't branch ) - DX INCx, DX INCx, + ( True, skip next byte and don't branch ) + DX INCx, ;CODE diff --git a/blk/807 b/blk/807 index ee43d6e..3a2a8c9 100644 --- a/blk/807 +++ b/blk/807 @@ -5,5 +5,5 @@ PC 0x47 - ORG @ 0x45 + ! ( stable abi ) AX [BP] 0 MOVx[]+, AX [BP] -2 CMPx[]+, JNZ, L1 @ RPCs, ( branch ) ( don't branch ) - BP 4 SUBxi, DX INCx, DX INCx, + BP 4 SUBxi, DX INCx, ;CODE diff --git a/cvm/forth.bin b/cvm/forth.bin index aa98a4112c7b7187b2d87951cffed8b43ce279f3..8d84cefa726b00e02f96e5348c9482fc8d8a02b8 100644 GIT binary patch literal 5238 zcma)AU2N0W6+hQ@Y{zyIhmX*XK;syQ9Va1}wo4mh$8j7m_^YqSFuf3mM@*iEhL+lqWO#j^ucupy^Sdgx$ITljF+=>Jy8DoQqX^0&F2znivaas$+|*+=k^ zKK`~Od=%zO^zqf2PxvU)pHKAhy(LAOt*JI{Zre+st^ZJxTYJ9c#P6%K1?XIMjz7K(dPgC!ou zW9fU##|!aH2tFvkyzuX^a!Y?I8>-W=2;n`+LejuCaa-Jy7%CK!*;0F>IKlJOgE+4^ zRLoK&Q(vuER7kG}Q`rGG1Qq}-%X`>OWux_C1$VdRPGtig4Tb@dJCzNZ{XSW+(1yT? zsfo#8quAA=TCkMmc}qrRfPZQzRay(tmx1?-6YLrFmL(+iz_Vi~rh=1}>vCD#67SCy zN?WByy{6uW2gyRg1$`lL1WwJIn3@A!OstpXGwki!AWHp0bwGH;sh2lZlhrLzmj;$J z&>eBZJHLE&u8Ui{2>GmVx~x~^3Vzo^$*yPwDj9w5 z?A1Ga^-d<0Z36pOAcS?xavhFj;s+Zw&UYV|P34I*1f`+GKE`@kRzTi4N~O!v14W6x z5UnZ87!bGc0ObpLfm*Q+t6Q3)lgD5vRx1>pRf<(mq?7Ue$$G@`qFjVM^J-OHkPDDB zluhSy`3*Rqi}IS>)wm<4j*lHX#xpC6UwlH79oJ<^r2%%sCZb(HcPPDa6C2AK6;)xJ zCrxDL!D;j;eab_`lU34Q_i-{n2lr{>J~RUs6W-M@G3hrQiY7zN*2o zq~$sD`og?^jza-5gw8)dHKA+Gep!0O%5qCYVvi%|{OC!h^b?UfT_>#NqIyqw0*J6j zgRJF_P4IOTbv|nOM1}B%kd8+1j9P~A+^XREQ>8w324?#|AYTcq4OkzsjG;odSu9s1 zCN8E{v+9*Pl(cM71lNOR7#s(Ru`X>O6Bw-{SBh1eA=?7rjw*b^?v_&SK&~**pc~b7 zdDUK)fTIHfdmPPhE+&&VZUH{2tELyQp?T*c~)gn=K)C?}Cl{otwc% zf-Ni7Fg(5jq3ph9O{TTBE3(bDj1F>-sUr-gQOk%%w|?pY_o^Q zr{-qPjx?bf(6X%CYey}-_j=S-`wctS3}ZkO1zSOM$?$%H95<@VMOBSPy4dv15VVy2UI>|1|RT!4YWs9YFw$!E#yJ~N8 z@ydycs8$$zmO^eZn5Q^dmM}E zZC6I!RIlS#bNaS|?sYix6FisEZMpB3!SqmZ55x90(D1I&ZLIf#x-6vUZB%nz($ax& zQrvkhzzBuZ8eAPlR$%sICH~2YIv? zJ?F7k%qQ4uXcbAb=_;eSBdY3uhP}XZ6O;2n7C=ZEX6MF^oosn->iGD~#N_n+muN@& z4r+#rBc3-sA*r9Ao;lt!H9gldF%3FWbhI|ZNVaajwCYJipY08Mul$)IDz$EsAHbFn ziec2UsBYLFt}Dx^Xujt)J64f9h9;cld4uzc`3aIR*XS*uhGw%={mDjACss!`l=TO{Jk#X;e)+{4_Eef ztBv&=>mihP0);*aL&~zT{!I@D6dpaBqRHW9;JNb&hL%5F2eDHV+_93e1<&^|wNwT{ zUTsX7KU{;pfuT%(6p3)&!yq_yFi?b?{dUTp`h}84+@2P}9%jZX|VGHL3KBOXz`fHVgPjSQA>n zY0#Xo`p9cg1zzI(4r9b{Ro7kfeB@2Y7nR*mGg88EEbB{#)qk!L&7`m0AnN6)RUCH=;B-BAIXJZP0((yMS=^ z=W-?9O1xd%mKXxX*`OM<#Y!MD5NmD(vtlWkl}oQoa82H!Ga}n1`pmtC$k? zc=B{@NL&g0^JeVS?0BxoB-p%$#eVFWlME+Q^&E1JGdp`8_#8)PI;T%hOpbW?Z84DB zf;Q|&fZ3=S*Id3qx9)_-^r&lVIB21zXV+{0{J^t00UHd=;kFT% qd|y+!rPm2jek9CQyOG1202A1jmbMm7GA&s5wYT^T=p*POX!{Snx{!SU literal 5336 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 0x7f ) { off -= 0x100; } + vm.IP += off; +} +static void _cbr_() { if (!pop()) { _br_(); } else { vm.IP++; } } static void _loop_() { word I = gw(vm.RS); I++; sw(vm.RS, I); if (I == gw(vm.RS-2)) { // don't branch popRS(); popRS(); - vm.IP += 2; + vm.IP++; } else { // branch _br_(); }