Очередное дополнение - введена команда MOVE - код 14:

[code]    WHEN 14 => -- MOVE
		PC[] = RStack.do[]; RStack.cmd[] = swap; PC[].ena = VCC;
		RStack.di[] = PC[] + 1;
		XR = !XR;
		IF !XR THEN
			TR[] = DI[]; TR[].ena = VCC; RD = GND;
			DStack.di[] = TR[]; DStack.cmd[] = push;
		ELSE
			DStack.cmd[] = pop; 
			TR[] = DStack.do[] - 1; WR = GND; TR[].ena = VCC;
		END IF;
		IF (TR[] == 0) and !XR THEN
			RCMD[] = (B"0000",RCMD[WIDTH-1..4]);
        ELSE
			RCMD[] = RCMD[];
		END IF;
	WHEN 15 => 
		RCMD[] = (B"0000",RCMD[WIDTH-1..4]);
END CASE; [/code]

картинка с симуляцией работы этой команды (и некоторых других):

[img]http://winglion.ru/Forth-CPU/simulator2.gif[/img]

подпрограмма пересылки блока выглядит так:

[code]CALL move

move:  LIT (адрес1) >R LIT (num) JNZ-MOVE-R>-RET (адрес2)
[/code]
адрес1 заталкивается в стек возвратов, 
на вершину стека данных ложится количество пересылок,
делается "переход" по адресу, "откуда брать данные" с отложенными командами снятия со стека возвратов адреса-приемника и возвратом в вызывающую программу

num слов пересылаются с адреса2 на адрес1

цикл пересылки состоит из двух тактов:

1. TR -> DStack, mem(PC) -> TR, PC+1 -> RStack, RStack -> PC, 
2. TR -> mem(PC), PC+1 -> RStack, RStack -> PC, DStack-1 -> TR

В первом такте проверяется условие TR==0, если оно выполняется, регистр команд сдвиагется на 4 бита и выполняются следующие команды. Иначе, регистр команд сохраняется и происходит продолжение выполнения пересылки.
Таким образом цикл пересылки крутится до тех пор, пока число на стеке данных не обнулится.



