From e31527f5acdcb1fb8cbe0b35ef043c3b629629a0 Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Thu, 29 Oct 2020 12:34:02 -0400 Subject: [PATCH] Add word ROT> There are many situations where it can be useful. Worth it. --- blk/162 | 4 ++-- blk/308 | 10 +++++----- blk/309 | 4 +++- blk/354 | 4 ++-- blk/358 | 2 +- blk/454 | 8 ++++---- blk/455 | 4 ++-- blk/456 | 8 ++++---- cvm/forth.bin | Bin 5167 -> 5170 bytes cvm/vm.c | 5 +++++ cvm/xcomp.fs | 1 + doc/dict.txt | 1 + tests/all/test_ps.fs | 4 ++++ 13 files changed, 34 insertions(+), 21 deletions(-) create mode 100644 tests/all/test_ps.fs diff --git a/blk/162 b/blk/162 index 3c931c4..4f8c8f5 100644 --- a/blk/162 +++ b/blk/162 @@ -8,6 +8,6 @@ 0x4c _cmd DROP asprdy ; : aspf@ ( page a -- n, read word from flash ) SWAP aspfpgsz @ * OR ( addr ) 256 /MOD ( lsb msb ) - 2DUP 0 ROT ROT ( lsb msb 0 lsb msb ) + 2DUP 0 ROT> ( lsb msb 0 lsb msb ) 0x20 _cmd ( lsb msb low ) - ROT ROT 0 ROT ROT ( low 0 lsb msb ) 0x28 _cmd 8 LSHIFT OR ; + ROT> 0 ROT> ( low 0 lsb msb ) 0x28 _cmd 8 LSHIFT OR ; diff --git a/blk/308 b/blk/308 index b75639a..2a2f227 100644 --- a/blk/308 +++ b/blk/308 @@ -2,15 +2,15 @@ CODE ROT ( a b c -- b c a ) HL POP, ( C ) DE POP, ( B ) IY POP, ( A ) chkPS, DE PUSH, ( B ) HL PUSH, ( C ) IY PUSH, ( A ) ;CODE +CODE ROT> ( a b c -- c a b ) + HL POP, ( C ) DE POP, ( B ) IY POP, ( A ) chkPS, + HL PUSH, ( C ) IY PUSH, ( A ) DE PUSH, ( B ) +;CODE CODE DUP ( a -- a a ) HL POP, chkPS, HL PUSH, HL PUSH, ;CODE CODE ?DUP - HL POP, chkPS, - HL PUSH, + HL POP, chkPS, HL PUSH, HLZ, IFNZ, HL PUSH, THEN, ;CODE -CODE DROP ( a -- ) - HL POP, chkPS, -;CODE diff --git a/blk/309 b/blk/309 index ff456e1..fafcfd2 100644 --- a/blk/309 +++ b/blk/309 @@ -1,9 +1,11 @@ +CODE DROP ( a -- ) + HL POP, chkPS, +;CODE CODE SWAP ( a b -- b a ) HL POP, ( B ) DE POP, ( A ) chkPS, HL PUSH, ( B ) DE PUSH, ( A ) ;CODE - CODE OVER ( a b -- a b a ) HL POP, ( B ) DE POP, ( A ) chkPS, diff --git a/blk/354 b/blk/354 index b5f3088..d9512de 100644 --- a/blk/354 +++ b/blk/354 @@ -1,8 +1,8 @@ : ABORT (resSP) QUIT ; : = CMP NOT ; : < CMP -1 = ; : > CMP 1 = ; : 0< 32767 > ; : >= < NOT ; : <= > NOT ; : 0>= 0< NOT ; -: >< ( n l h -- f ) 2 PICK > ( n l f ) ROT ROT > AND ; -: =><= 2 PICK >= ( n l f ) ROT ROT >= AND ; +: >< ( n l h -- f ) 2 PICK > ( n l f ) ROT> > AND ; +: =><= 2 PICK >= ( n l f ) ROT> >= AND ; : MIN ( n n - n ) 2DUP > IF SWAP THEN DROP ; : MAX ( n n - n ) 2DUP < IF SWAP THEN DROP ; : NIP SWAP DROP ; : TUCK SWAP OVER ; diff --git a/blk/358 b/blk/358 index b6fc619..faad96c 100644 --- a/blk/358 +++ b/blk/358 @@ -4,7 +4,7 @@ SWAP '-' = IF 1+ THEN ( a len startat ) ( if we can do the whole string, success. if _pdacc returns false before, failure. ) - 0 ROT ROT ( len ) ( startat ) DO ( a r ) + 0 ROT> ( len ) ( startat ) DO ( a r ) OVER I + C@ ( a r c ) _pdacc ( a r f ) NOT IF DROP 1- 0 UNLOOP EXIT THEN LOOP ( a r ) ( if we had '-', we need to invert result. ) diff --git a/blk/454 b/blk/454 index a21f3a3..6bcdc43 100644 --- a/blk/454 +++ b/blk/454 @@ -1,12 +1,12 @@ CODE ROT ( a b c -- b c a ) 3 chkPS, CX POPx, BX POPx, AX POPx, - BX PUSHx, CX PUSHx, AX PUSHx, -;CODE + BX PUSHx, CX PUSHx, AX PUSHx, ;CODE +CODE ROT> ( a b c -- c a b ) 3 chkPS, + CX POPx, BX POPx, AX POPx, + CX PUSHx, AX PUSHx, BX PUSHx, ;CODE CODE DUP 1 chkPS, AX POPx, AX PUSHx, AX PUSHx, ;CODE CODE ?DUP 1 chkPS, AX POPx, AX AX ORxx, AX PUSHx, IFNZ, AX PUSHx, THEN, ;CODE -CODE DROP 1 chkPS, AX POPx, ;CODE -CODE SWAP AX POPx, BX POPx, AX PUSHx, BX PUSHx, ;CODE CODE OVER ( a b -- a b a ) 2 chkPS, DI SP MOVxx, AX [DI] 2 MOVx[]+, AX PUSHx, ;CODE CODE PICK diff --git a/blk/455 b/blk/455 index 23efa7d..35e061b 100644 --- a/blk/455 +++ b/blk/455 @@ -3,6 +3,8 @@ CODE (roll) ( "2 3 4 5 4 --> 2 4 5 5". See B311 ) SI SP MOVxx, SI CX ADDxx, DI SI MOVxx, DI 2 ADDxi, STD, REPZ, MOVSB, ;CODE +CODE SWAP AX POPx, BX POPx, AX PUSHx, BX PUSHx, ;CODE +CODE DROP 1 chkPS, AX POPx, ;CODE CODE 2DROP 2 chkPS, SP 4 ADDxi, ;CODE CODE 2DUP 2 chkPS, AX POPx, BX POPx, @@ -12,5 +14,3 @@ CODE S0 AX PS_ADDR MOVxI, AX PUSHx, ;CODE CODE 'S SP PUSHx, ;CODE CODE AND 2 chkPS, AX POPx, BX POPx, AX BX ANDxx, AX PUSHx, ;CODE -CODE OR 2 chkPS, - AX POPx, BX POPx, AX BX ORxx, AX PUSHx, ;CODE diff --git a/blk/456 b/blk/456 index 6f7a0d6..617f7db 100644 --- a/blk/456 +++ b/blk/456 @@ -1,9 +1,10 @@ +CODE OR 2 chkPS, + AX POPx, BX POPx, AX BX ORxx, AX PUSHx, ;CODE CODE XOR 2 chkPS, AX POPx, BX POPx, AX BX XORxx, AX PUSHx, ;CODE CODE NOT 1 chkPS, AX POPx, AX AX ORxx, - IFNZ, AX -1 MOVxI, THEN, AX INCx, AX PUSHx, -;CODE + IFNZ, AX -1 MOVxI, THEN, AX INCx, AX PUSHx, ;CODE CODE + 2 chkPS, AX POPx, BX POPx, AX BX ADDxx, AX PUSHx, ;CODE CODE - 2 chkPS, @@ -11,5 +12,4 @@ CODE - 2 chkPS, CODE * 2 chkPS, AX POPx, BX POPx, DX PUSHx, ( protect from MUL ) BX MULx, DX POPx, - AX PUSHx, -;CODE + AX PUSHx, ;CODE diff --git a/cvm/forth.bin b/cvm/forth.bin index 5a282b49e25ba93bc017f2e092f7935e0b83ec1c..c02c67a801202a7ea2eb8c16f0fa54865912f74a 100644 GIT binary patch literal 5170 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 PgTY3x-g>$9a%=w&mcE*Y literal 5167 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 353 LOAD ( xcomp core ) : (emit) 0 PC! ; : (key) 0 PC@ ; diff --git a/doc/dict.txt b/doc/dict.txt index 1b9d50b..6f8ad89 100644 --- a/doc/dict.txt +++ b/doc/dict.txt @@ -123,6 +123,7 @@ DUP a -- a a NIP a b -- b OVER a b -- a b a ROT a b c -- b c a +ROT> a b c -- c a b SWAP a b -- b a TUCK a b -- b a b 2DROP a a -- diff --git a/tests/all/test_ps.fs b/tests/all/test_ps.fs new file mode 100644 index 0000000..a7ed89b --- /dev/null +++ b/tests/all/test_ps.fs @@ -0,0 +1,4 @@ +42 43 44 ROT +42 #eq 44 #eq 43 #eq +42 43 44 ROT> +43 #eq 42 #eq 44 #eq