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 5a282b4..c02c67a 100644 Binary files a/cvm/forth.bin and b/cvm/forth.bin differ diff --git a/cvm/vm.c b/cvm/vm.c index 3bc6aa0..b73e052 100644 --- a/cvm/vm.c +++ b/cvm/vm.c @@ -184,6 +184,10 @@ static void ROT() { // a b c -- b c a word c = pop(); word b = pop(); word a = pop(); push(b); push(c); push(a); } +static void ROTR() { // a b c -- c a b + word c = pop(); word b = pop(); word a = pop(); + push(c); push(a); push(b); +} static void DUP() { // a -- a a word a = pop(); push(a); push(a); } @@ -387,6 +391,7 @@ VM* VM_init(char *blkfs_path) { native(RSHIFT); native(LSHIFT); native(TICKS); + native(ROTR); vm.IP = gw(0x04) + 1; // BOOT sw(SYSVARS+0x02, gw(0x08)); // CURRENT sw(SYSVARS+0x04, gw(0x08)); // HERE diff --git a/cvm/xcomp.fs b/cvm/xcomp.fs index 79aefbf..af50a31 100644 --- a/cvm/xcomp.fs +++ b/cvm/xcomp.fs @@ -69,6 +69,7 @@ H@ 4 + XCURRENT ! ( make next CODE have 0 prev field ) 0x35 CODE RSHIFT 0x36 CODE LSHIFT 0x37 CODE TICKS +0x38 CODE ROT> 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