User Tag List

Страница 2 из 5 ПерваяПервая 12345 ПоследняяПоследняя
Показано с 11 по 20 из 42

Тема: x80: CISC - уже не i8080, ещё не i8086

  1. #11

    Регистрация
    05.03.2010
    Адрес
    Ташкент
    Сообщений
    160
    Спасибо Благодарностей отдано 
    25
    Спасибо Благодарностей получено 
    66
    Поблагодарили
    41 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Lightbulb Наброски схем x80

    Кстaти, если считаете, что дешифрация всех этих команд аппаратно слишком сложно реализуется и без RISC-ядра и микрокода не обойтись, то вот набросок схемы узла выборки кода команды под LogiSim и Proteus.
    Узел считывает полный код команды вместе с префиксами, выдавая те же биты, что используются в шаблоне JavaScript-эмулятора.

    Естественно, имеется схема (устаревшая), которая считывает из памяти команды и переводит их в текст - аппаратный дизассемблер.
    Но из-за сложности работы с регистровым файлом, схемы частичного симулятора процессора пока не удалось разработать - не хватает опыта работы с кешом, чтобы расписать по тактам…

    P.S.: Это чтобы не быть голословным.
    Хоть какие-то наработки электронными узлами да имеются…
    Но опыта в целом - нет.
    Миниатюры Миниатюры Нажмите на изображение для увеличения. 

Название:	x80-reader-full.jpg 
Просмотров:	58 
Размер:	23.5 Кб 
ID:	72607   Нажмите на изображение для увеличения. 

Название:	The_x80_fetch.jpg 
Просмотров:	62 
Размер:	22.5 Кб 
ID:	72608  

  2. #12

    Регистрация
    20.04.2006
    Адрес
    Санкт-Петербург
    Сообщений
    2,870
    Спасибо Благодарностей отдано 
    521
    Спасибо Благодарностей получено 
    251
    Поблагодарили
    225 сообщений
    Mentioned
    8 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Hunta Посмотреть сообщение
    Вы даже не поняли - про что я.

    Удачи.
    да понял я, в .опе наша российская радиационно-стойкая мэ...а сведения как её проектировать гостайна, чтобы американцам бабки на нас делать не мешать.

  3. #13

    Регистрация
    30.11.2015
    Адрес
    г. Самара
    Сообщений
    7,505
    Спасибо Благодарностей отдано 
    344
    Спасибо Благодарностей получено 
    712
    Поблагодарили
    594 сообщений
    Mentioned
    13 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от andrews Посмотреть сообщение
    да понял я, в .опе наша российская радиационно-стойкая мэ
    Как я и сказал - не поняли.

  4. #14

    Регистрация
    05.03.2010
    Адрес
    Ташкент
    Сообщений
    160
    Спасибо Благодарностей отдано 
    25
    Спасибо Благодарностей получено 
    66
    Поблагодарили
    41 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Hunta Посмотреть сообщение
    В данном случае, очевидно, предполагается программирование на ассемблере, но дружелюбности - не наблюдается. Болеe того, автор и сам попал в эту ловушку
    Системa команд того же z80 полна всяких исключений. Например, «LD A,[IX±d8]» неочевидным образом удлиняет команду на 1 байт для указания индекса смещения.
    То есть, последовательнее было бы под IX-префиксом расширять не «LD r,(HL)», а «LD r,d8». Тогда бы с добавлением префикса IX перед командой её размер не увеличивался бы. Что у меня и сделано:
    Код:
          A4 7F|MOV AL,0x7F
       44 A4 7F|MOV AL,[SP+0x7F]
    E4 44 A4 7F|MOV AL,[SP+AL+0x7F]
    /\ /\
    || ||
    || |+--\ Код
    || +---/ префикса SP
    ||
    |+-----\ Код
    +------/ префикса LOOP AL
    А так как в самом начале разработки у меня не было опыта построения ассемблера, то первые пробные программы под свой процессор я набирал голым дампом. Потому и система команд изначально у меня и сформировалась по принципу «сам код - и есть мнемоника.
    Где «A4» - «LOAD R4», а «AA» - «ALU:ADD» и «AB» - «ALU:SUB».
    Следовательно, «BC» - «BRANCH IF CARRY» и «BE» - «BRANCH IF EQUAL».
    Потому я и уверенно говорю, что код - дружелюбный! Конечно, если Вы решите программировать прямо дампом.
    А если синтаксис ассемблера не нравится, то он легко перебивается в строчках 4160…4274, где описаны все команды. То есть, под стиль z80 достаточно потратить минут 5 и перебить 95 строк из «MOV» в «LD», сменив квадратные скобки на круглые. А также и переименовать регистры. Это - дело вкуса. Я уже сказал, что вместо эмулятора у меня получился реальный движок, в котором и 68000 можно описать шаблоном…

    P.S.: Вы не внимательно читали: С самого начала я сказал, что решил попробовать сделать «перезагрузку процессоров Intel» и попытаться сделать так, каким мог быть сам i8080, а i8086 был бы обратно совместимым с i8080 на бинарном уровне.
    Если Вы ждали чуда, то чудо здесь не найдёте: В теме я поделился опытом «перезагрузки» изначально кривой архитектуры Intel с целью 8-битное сделать 16- и 32-битным.
    (Я читал документацию по z280 и ужаснулся тем же костылям, что сделали и с i8086, когда «за уши» тянули его в IA-32 и в IA-64…
    В IA-32 поддержка IA-16 почти искусственна в самом ядре. В моём x80 32-бит нет технически, но они поддерживаются уже в принципе…)

  5. #15

    Регистрация
    30.11.2015
    Адрес
    г. Самара
    Сообщений
    7,505
    Спасибо Благодарностей отдано 
    344
    Спасибо Благодарностей получено 
    712
    Поблагодарили
    594 сообщений
    Mentioned
    13 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Радио-86РК Посмотреть сообщение
    Системa команд того же z80 полна всяких исключений
    Я сказал, что она замечательная? Или что надо ей следовать?

    Цитата Сообщение от Радио-86РК Посмотреть сообщение
    С самого начала я сказал, что решил попробовать сделать «перезагрузку процессоров Intel» и попытаться сделать так, каким мог быть сам i8080, а i8086 был бы обратно совместимым с i8080 на бинарном уровне.
    Если Вы ждали чуда, то чудо здесь не найдёте: В теме я поделился опытом «перезагрузки» изначально кривой архитектуры Intel с целью 8-битное сделать 16- и 32-битным.
    Я внимательно читал. И Вы сделали изначально кривое ещё более кривым.

    - - - Добавлено - - -

    Цитата Сообщение от Радио-86РК Посмотреть сообщение
    Потому я и уверенно говорю, что код - дружелюбный! Конечно, если Вы решите программировать прямо дампом.
    Цитата Сообщение от Радио-86РК Посмотреть сообщение
    Где «A4»
    ADD 4
    Вот и вся дружелюбность.

    Цитата Сообщение от Радио-86РК Посмотреть сообщение
    Потому и система команд изначально у меня и сформировалась по принципу «сам код - и есть мнемоника.
    Поэтому это Вам привычно. А другим сходу будет нихера не понятно.
    Пример понятного

    MOV R0, R1
    ADD R0, R1

    Можете не отвечать, это было моё последнее сообщение здесь.

  6. #16

    Регистрация
    05.03.2010
    Адрес
    Ташкент
    Сообщений
    160
    Спасибо Благодарностей отдано 
    25
    Спасибо Благодарностей получено 
    66
    Поблагодарили
    41 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Arrow RISC'ов много, а x80 - один

    Цитата Сообщение от Hunta Посмотреть сообщение
    Можете не отвечать, это было моё последнее сообщение здесь.
    Тeм не менее, я отвечу, как минимум для тех, кто думает так же, но не ставит крест на интересе к данной теме…
    Цитата Сообщение от Hunta Посмотреть сообщение
    Поэтому это Вам привычно. А другим сходу будет нихера не понятно.
    Пример понятного
    Здесь критикуете именно синтаксис, так как в RISC-архитектурах традиционно и регистры не именуются, а индексируются. Так поступили и в IA-64 вводом регистров R8…R15.
    Однако, здесь важно внимательнее присмотреться к примеру:
    Код:
          A4 7F|MOV R4,0x7F
       55 A4 7F|MOV R4,[P5+0x7F]
    E6 55 A4 7F|MOV R4,[P5+R6+0x7F]
    Причём, в исходниках это прямо так и указано:
    Код:
    // Register descriptions
    // Pointers
    P1	BP	BP	BP
    P2	SI	SI	SI
    P3	DI	DI	DI
    P4	SP	SP	SP
    P5	BX	BX	DX
    P6	CX	CX	CX
    P7	DX	DX	DX
    
    // Regular
    R0	[BX]	_BX_	[BX]
    R1	BH	BH	BH
    R2	CH	CH	CH
    R3	DH	DH	DH
    R4	AL	AL	AL
    R5	BL	BL	BL
    R6	CL	CL	CL
    R7	DL	DL	DL
    Тем самым, в эмуляторе синтаксис «ALU7 R4,R0» заменяется на «CMP AL,[BX]». И алгоритм там прорабатывался несколько лет /!\, чтобы индексы регистров привести к Intel-стилю и АЛУ-код представить именами операций.

    Потому и код
    Код:
    MOV R0, R1
    ADD R0, R1
    изначально генерируется, но я приложил максимум усилий и трюков JavaScript с регулярными выражениями, чтобы нигде не чувствовался привкус RISC.

    В этом плане, моя система команд не хуже того же байт-кода Java-машины. Но, если Java-апплет голым дампом вручную очень сложно набить, то как виртуальная байт-машина мой x80 всё же на порядок дружелюбнее!

    Кстати, сейчас добавил пару строчек для экспорта шаблона…
    Как результат, вот дешифратор всех команд на:

    C/JavaScript: if…else

    Код:
    	// 18b'0XX_0XX_0000_0000_0000:
    	if(0x0000 == ($IC & 0x4FFF)} {
    		// HLT	
    		(CR(0,CR(0)|128)),_.EV = DO_ACCLAIM;
    	} else
    	// 18b'XXX_1XX_0000_0000_0000:
    	if(0x4000 == ($IC & 0x4FFF)} {
    		// PREFIX	SUPER
    		return 0;
    	} else
    	// 18b'1XX_XXX_0000_0XXX_0XXX:
    	if(0x0000 == ($IC & 0x0F88)} {
    		// PREFIX	R$X/P$Y
    		return	0;
    	} else
    	// 18b'XXX_X00_0XXX_0000_0000:
    	if(0x0000 == ($IC & 0x38FF)} {
    		// HLT	R$Z
    		FH($Z | 0);
    	} else
    	// 18b'111_X00_0XXX_0XXX_0XXX:
    	if(0x8000 == ($IC & 0xB888)} {
    		// HLT	P$Z/$Z
    		FH($Z | 8);
    	} else
    	// 18b'XXX_X00_0100_0000_0000:
    	if(0x0400 == ($IC & 0x3FFF)} {
    		// .$Y$X	
    		return 0;
    	} else
    	// 18b'XXX_X00_1000_0000_0000:
    	if(0x0800 == ($IC & 0x3FFF)} {
    		// .$Y$X	
    		return 0;
    	} else
    	// 18b'XXX_X00_1000_0XXX_0000:
    	if(0x0800 == ($IC & 0x3F8F)} {
    		// MOV	[0],R$Y
    		CR(0,R$Y())+ FL(0),_.IE=0;
    	} else
    	// 18b'XXX_X10_0100_0XXX_0000:
    	if(0x2400 == ($IC & 0x3F8F)} {
    		// .$Y$X	
    		return 0;
    	} else
    	// 18b'XXX_X10_1000_0XXX_0000:
    	if(0x2800 == ($IC & 0x3F8F)} {
    		// .$Y$X	
    		return 0;
    	} else
    	// 18b'XXX_X10_0100_0000_0XXX:
    	if(0x2400 == ($IC & 0x3FF8)} {
    		// MOV	R$X,[$Y]
    		R$X(CR($Y))+ FL(0),_.IE=0;
    	} else
    	// 18b'1XX_X10_0100_0XXX_0XXX:
    	if(0x2400 == ($IC & 0x3F88)} {
    		// MOV	R$X,[R$Y]
    		R$X(CTX(R$Y()))+ FL(0),_.IE=0;
    	} else
    	// 18b'XXX_X10_0100_0XXX_0XXX:
    	if(0x2400 == ($IC & 0x3F88)} {
    		// MOV	[R$X],R$Y
    		CTX(R$X(), R$Y())+ FL(0),_.IE=0;
    	} else
    	// 18b'101_X00_0XXX_0XXX_0XXX:
    	if(0x8000 == ($IC & 0xB888)} {
    		// XCHG	R$Z,R$Y
    		$1=R$Z(),R$Z(R$Y()),R$Y($1);
    	} else
    	// 18b'110_X00_0XXX_0XXX_0XXX:
    	if(0x0000 == ($IC & 0xB888)} {
    		// XCHG	P$Z,P$Y
    		$1=P$Z(),P$Z(P$Y()),P$Y($1);
    	} else
    	// 18b'XXX_X11_X100_0XXX_0000:
    	if(0x3400 == ($IC & 0x378F)} {
    		// .$Y$X	
    		return 0;
    	} else
    	// 18b'XXX_X11_X100_0000_0XXX:
    	if(0x3400 == ($IC & 0x37F8)} {
    		// .$Y$X	
    		return 0;
    	} else
    	// 18b'1XX_X11_X100_0XXX_0XXX:
    	if(0x3400 == ($IC & 0x3788)} {
    		// IN	R$X
    		R$X(PORT(R$X()));
    	} else
    	// 18b'XXX_X11_X100_0XXX_0XXX:
    	if(0x3400 == ($IC & 0x3788)} {
    		// OUT	R$X,R$Y
    		PORT(R$X(),R$Y());
    	} else
    	// 18b'XXX_XXX_0100_0XXX_1XXX:
    	if(0x0408 == ($IC & 0x0F88)} {
    		// BIT	R$X,$Y
    		$1=FL(),FL($1&0xFE)|((R$X()>>$Y)&1),R$X(~(~R$X()|(1<<$Y)))/*>*/;
    	} else
    	// 18b'0XX_X00_0000_0XXX_0XXX:
    	if(0x0000 == ($IC & 0x3F88)} {
    		// MOV	R$X,R$Y
    		R$X(R$Y());
    	} else
    	// 18b'XXX_X00_0XXX_0000_0XXX:
    	if(0x0000 == ($IC & 0x38F8)} {
    		// MOV	R$X,[$Z]
    		R$X(CR($Z));
    	} else
    	// 18b'XXX_X00_0XXX_0XXX_0000:
    	if(0x0000 == ($IC & 0x388F)} {
    		// MOV	[$Z],R$Y
    		CR($Z,R$Y());
    	} else
    	// 18b'0XX_X00_0100_0XXX_0XXX:
    	if(0x0400 == ($IC & 0x3F88)} {
    		// MOV	P$X,P$Y
    		P$X(P$Y());
    	} else
    	// 18b'XXX_X10_0100_0XXX_1XXX:
    	if(0x2408 == ($IC & 0x3F88)} {
    		// --	Z$Y
    		$1=ALU$X(DROP($Y),REG($Y)),REG($Y,$1),FL($1.hi());
    	} else
    	// 18b'XXX_XXX_0XXX_0XXX_1XXX:
    	if(0x0008 == ($IC & 0x0888)} {
    		// ALU$X	Z$Z,R$Y
    		$1=ALU$X(Z$Z(),R$Y()),Z$Z($1),FL($1.hi());
    	} else
    	// 18b'XXX_XXX_0100_1010_1XXX:
    	if(0x04A8 == ($IC & 0x0FF8)} {
    		// ADC	P$X,IB
    		$1=ALU$X(DROP(FH()),_.B),ACC($1),FL($1.hi());
    	} else
    	// 18b'XXX_XXX_0XXX_1010_1XXX:
    	if(0x00A8 == ($IC & 0x08F8)} {
    		// ALU$X	Z$Z,IB
    		$1=ALU$X(Z$Z(),_.B),Z$Z($1),FL($1.hi());
    	} else
    	// 18b'XXX_X00_0XXX_100X_XXXX:
    	if(0x0080 == ($IC & 0x38E0)} {
    		// PUSH	$VIB
    		HEAP(0x$V00 + _.B);
    	} else
    	// 18b'XXX_XXX_0000_1110_1110:
    	if(0x00EE == ($IC & 0x0FFF)} {
    		// NOP	
    		$Z;
    	} else
    	// 18b'XXX_XXX_0XXX_1110_1110:
    	if(0x00EE == ($IC & 0x08FF)} {
    		// NOP	$Z
    		$Z;
    	} else
    	// 18b'XXX_X0X_0000_1111_1110:
    	if(0x00FE == ($IC & 0x2FFF)} {
    		// DBG	0
    		HEAP(_.IP)+IP(JP(10>$T?0:1));
    		_.IF=true;
    	} else
    	// 18b'XXX_X0X_0000_1111_1111:
    	if(0x00FF == ($IC & 0x2FFF)} {
    		// DBG	
    		HEAP(_.IP)+IP(JP(10>$T?0:1));
    		_.IF=true;
    	} else
    	// 18b'111_XXX_0000_1100_1XXX:
    	if(0x80C8 == ($IC & 0x8FF8)} {
    		// INC	Q$X
    		Q$X(Q$X()+1);
    	} else
    	// 18b'111_XXX_0000_1101_1XXX:
    	if(0x80D8 == ($IC & 0x8FF8)} {
    		// DEC	Q$X
    		Q$X(Q$X()-1);
    	} else
    	// 18b'XXX_X00_0000_1100_1111:
    	if(0x00CF == ($IC & 0x3FFF)} {
    		// CMC	
    		FL(FL() ^ 2);
    	} else
    	// 18b'111_XXX_0XXX_1100_1XXX:
    	if(0x80C8 == ($IC & 0x88F8)} {
    		// ADD	Q$X,P$Z
    		$1=Q$X()+P$Z()+(_CF?0:0),$2=($1>>15)&2,FL((FL()& 0xD)|$2), Q$X($1);
    	} else
    	// 18b'111_XXX_0XXX_1101_1XXX:
    	if(0x80D8 == ($IC & 0x88F8)} {
    		// SUB	Q$X,P$Z
    		$1=Q$X()-P$Z()-(_CF?0:0),$2=($1>>15)&2,FL((FL()& 0xD)|$2), Q$X($1);
    	} else
    	// 18b'XXX_XXX_0000_1101_1110:
    	if(0x00DE == ($IC & 0x0FFF)} {
    		// DOZ	
    		CND7?(FH(1 | 8), FL((FL() & 0x02) | 0x05)):0;
    	} else
    	// 18b'XXX_XXX_0000_1101_1111:
    	if(0x00DF == ($IC & 0x0FFF)} {
    		// DONZ	
    		CND6?(FH(1 | 8), FL((FL() & 0x02) | 0x05)):0;
    	} else
    	// 18b'XXX_XXX_0XXX_1101_111X:
    	if(0x00DE == ($IC & 0x08FE)} {
    		// ---	
    		return 0;
    	} else
    	// 18b'XXX_XXX_0100_110X_1XXX:
    	if(0x04C8 == ($IC & 0x0FE8)} {
    		// ---	
    		$1=ACC(ALU$W(ACC())),FL($1.hi());
    	} else
    	// 18b'XXX_XXX_0XXX_1100_1110:
    	if(0x00CE == ($IC & 0x08FF)} {
    		// ALU1F	Z$Z
    		$1=Z$Z(ALU1F(Z$Z())),FL($1.hi());
    	} else
    	// 18b'XXX_XXX_0XXX_110X_1XXX:
    	if(0x00C8 == ($IC & 0x08E8)} {
    		// ALU$W	Z$Z
    		$1=Z$Z(ALU$W(Z$Z())),FL($1.hi());
    	} else
    	// 18b'XXX_X00_0000_1010_0XXX:
    	if(0x00A0 == ($IC & 0x3FF8)} {
    		// MOV	R$X,IB
    		R$X(_.B);
    	} else
    	// 18b'XXX_X00_X100_1011_0000:
    	if(0x04B0 == ($IC & 0x37FF)} {
    		// PUSH	$+IB
    		HEAP(IP()+_.A);
    	} else
    	// 18b'XXX_X0X_0000_1011_0XXX:
    	if(0x00B0 == ($IC & 0x2FF8)} {
    		// CCND$X	$+IB
    		CND$X?HEAP(IP())+IP(IP()+_.A):0;
    		_.IF=true;
    	} else
    	// 18b'XXX_XXX_0000_1100_0XXX:
    	if(0x00C0 == ($IC & 0x0FF8)} {
    		// INC	R$X
    		$1=ADD(R$X(),1),R$X($1),FL($1.hi());
    	} else
    	// 18b'XXX_XXX_0000_1101_0XXX:
    	if(0x00D0 == ($IC & 0x0FF8)} {
    		// DEC	R$X
    		$1=SUB(R$X(),1),R$X($1),FL($1.hi());
    	} else
    	// 18b'XXX_XXX_0XXX_1100_0XXX:
    	if(0x00C0 == ($IC & 0x08F8)} {
    		// ADD	P$Z,R$X
    		$1=(P$Z()+R$X()),P$X($1),FL($1.hi());
    	} else
    	// 18b'XXX_XXX_0XXX_1101_0XXX:
    	if(0x00D0 == ($IC & 0x08F8)} {
    		// SUB	P$Z,R$X
    		$1=(P$Z()+R$X()),P$X($1),FL($1.hi());
    	} else
    	// 18b'XXX_XXX_0XXX_1101_0XXX:
    	if(0x00D0 == ($IC & 0x08F8)} {
    		// DEC	R$X
    		$1=SUB(R$X(),1),R$X($1),FL($1.hi());
    	} else
    	// 18b'XXX_X00_0XXX_1010_0000:
    	if(0x00A0 == ($IC & 0x38FF)} {
    		// POP	[P$Z+IB]
    		DW(P$Z()+_.C,HEAP());
    	} else
    	// 18b'XXX_X00_0XXX_1010_0XXX:
    	if(0x00A0 == ($IC & 0x38F8)} {
    		// MOV	R$X,[P$Z+IB]
    		R$X(DB(P$Z()+_.C));
    	} else
    	// 18b'XXX_X00_111X_1011_0000:
    	if(0x0EB0 == ($IC & 0x3EFF)} {
    		// PUSH	[P$Z+IB]
    		HEAP(DW(P$Z()+_.C));
    	} else
    	// 18b'XXX_X00_0XXX_1011_0000:
    	if(0x00B0 == ($IC & 0x38FF)} {
    		// PUSH	[P$Z+IB]
    		HEAP(DW(P$Z()+_.C));
    	} else
    	// 18b'XXX_X00_0XXX_1011_0XXX:
    	if(0x00B0 == ($IC & 0x38F8)} {
    		// MOV	[P$Z+IB],R$X
    		DB(P$Z()+_.C,R$X());
    	} else
    	// 18b'XXX_X10_0000_1010_0XXX:
    	if(0x20A0 == ($IC & 0x3FF8)} {
    		// ---	IB
    		return 0;
    	} else
    	// 18b'XXX_X10_0000_1011_0XXX:
    	if(0x20B0 == ($IC & 0x3FF8)} {
    		// ---	IB
    		return 0;
    	} else
    	// 18b'XXX_X10_0XXX_1010_0XXX:
    	if(0x20A0 == ($IC & 0x38F8)} {
    		// MOV	R$X,[P$Z+ACC+IB]
    		R$X(DB(P$Z()+ACC()+_.C)),FL(0),_.IE=0;
    	} else
    	// 18b'XXX_X10_0XXX_1011_0XXX:
    	if(0x20B0 == ($IC & 0x38F8)} {
    		// MOV	[P$Z+ACC+IB],R$X
    		DB(P$Z()+ACC()+_.C,R$X()),FL(0),_.IE=0;
    	} else
    	// 18b'XXX_XXX_X100_1011_1XXX:
    	if(0x04B8 == ($IC & 0x07F8)} {
    		// ---	IB
    		return 0;
    	} else
    	// 18b'XXX_X00_X100_1011_1010:
    	if(0x04BA == ($IC & 0x37FF)} {
    		// LEA	+IB
    		DST(DST()+_.B);
    	} else
    	// 18b'XXX_X00_X100_1011_1XXX:
    	if(0x04B8 == ($IC & 0x37F8)} {
    		// MOV	[U$X],IB
    		DB(U$X(),_.B);
    	} else
    	// 18b'XXX_X00_1110_1011_1000:
    	if(0x0EB8 == ($IC & 0x3FFF)} {
    		// WAIT	
    		FL((FL() & 0x02) | 0x0D),trace.expression=0;
    	} else
    	// 18b'XXX_X00_1111_1011_1000:
    	if(0x0FB8 == ($IC & 0x3FFF)} {
    		// RET	
    		IP(HEAP());
    	} else
    	// 18b'XXX_X0X_0XXX_1011_1000:
    	if(0x00B8 == ($IC & 0x28FF)} {
    		// JMP	$+$UIB
    		IP(IP()+_.A);
    		_.IF=true;
    	} else
    	// 18b'XXX_XXX_0XXX_1011_1XXX:
    	if(0x00B8 == ($IC & 0x08F8)} {
    		// JCND$X	$+$UIB
    		CND$X?IP(IP()+_.A):0;
    		_.IF=true;
    	} else
    	// 18b'XXX_XXX_1111_1011_1XXX:
    	if(0x0FB8 == ($IC & 0x0FF8)} {
    		// RCND$X	
    		CND$X?IP(HEAP()):0;
    	} else
    	// 18b'1X1_X00_0000_1110_1XXX:
    	if(0x80E8 == ($IC & 0xBFF8)} {
    		// PUSH	U$X
    		HEAP(U$X());
    	} else
    	// 18b'1X1_X00_0000_1111_1XXX:
    	if(0x80F8 == ($IC & 0xBFF8)} {
    		// POP	U$X
    		U$X(HEAP());
    	} else
    	// 18b'XXX_X00_XXXX_1110_1111:
    	if(0x00EF == ($IC & 0x30FF)} {
    		// XCHG	P$Z,[SP]
    		$1=P$Z(),P$Z(DW(SP())), DW(SP(), $1);
    	} else
    	// 18b'XXX_X00_0000_1110_0000:
    	if(0x00E0 == ($IC & 0x3FFF)} {
    		// SKIP	
    		FH(1 | 8), FL((FL() & 0x02) | 0x05);
    	} else
    	// 18b'XXX_X10_0000_1110_0000:
    	if(0x20E0 == ($IC & 0x3FFF)} {
    		// SKIP	ACC
    		FH(1 | 8), FL((FL() & 0x02) | 0x05);
    	} else
    	// 18b'XXX_X00_0000_1110_0XXX:
    	if(0x00E0 == ($IC & 0x3FF8)} {
    		// LOOP	$X/R$X
    		FH($X | 8), FL((FL() & 0x02) | 0x09);
    	} else
    	// 18b'XXX_X00_0000_1110_1000:
    	if(0x00E8 == ($IC & 0x3FFF)} {
    		// DOC	
    		CND5?(FH(1 | 8), FL((FL() & 0x02) | 0x05)):0;
    	} else
    	// 18b'XXX_X00_0000_1110_1001:
    	if(0x00E9 == ($IC & 0x3FFF)} {
    		// DONC	
    		CND4?(FH(1 | 8), FL((FL() & 0x02) | 0x05)):0;
    	} else
    	// 18b'XXX_X00_0XXX_1110_1011:
    	if(0x00EB == ($IC & 0x38FF)} {
    		// LOOP	[R$Z]
    		FH(R$Z()|8),FL((FL() & 0x02) | 0x09);
    	} else
    	// 18b'XXX_X00_0XXX_1110_1100:
    	if(0x00EC == ($IC & 0x38FF)} {
    		// LOOP	R$Z
    		FH($Z), FL((FL() & 0x02) | 0x09);
    	} else
    	// 18b'XXX_X00_0XXX_1111_1011:
    	if(0x00FB == ($IC & 0x38FF)} {
    		// SKIP	[R$Z]
    		FH(R$Z()|8),FL((FL() & 0x02) | 0x05);
    	} else
    	// 18b'XXX_X00_0XXX_1111_1100:
    	if(0x00FC == ($IC & 0x38FF)} {
    		// SKIP	R$Z
    		FH($Z), FL((FL() & 0x02) | 0x05);
    	} else
    	// 18b'XXX_X00_0XXX_1111_1101:
    	if(0x00FD == ($IC & 0x38FF)} {
    		// SKIP	$Z
    		FH($Z | 8), FL((FL() & 0x02) | 0x05);
    	} else
    	// 18b'100_X0X_0XXX_1111_XXXX:
    	if(0x00F0 == ($IC & 0xA8F0)} {
    		// INT	$T
    		HEAP(_.IP)+IP(JP(10>$T?0:1));
    		_.IF=true;
    	} else
    	// 18b'XXX_XXX_1000_10XX_XXXX:
    	if(0x0880 == ($IC & 0x0FC0)} {
    		// Y$Y_X$X	IB
    		return 0;
    	} else
    	// 18b'XXX_XXX_XXXX_XXXX_XXXX:
    	if(0x0000 == ($IC & 0x0000)} {
    		// Y$Y_X$X	($M)
    		0;
    	}
    [свернуть]
    Или на System Verilog:

    Verilog

    Код:
    	case(IC)
    	18b'0XX_0XX_0000_0000_0000:	// HLT	
    		//(CR(0,CR(0)|128)),_.EV = DO_ACCLAIM;
    	18b'XXX_1XX_0000_0000_0000:	// PREFIX	SUPER
    		//return 0;
    	18b'1XX_XXX_0000_0XXX_0XXX:	// PREFIX	R$X/P$Y
    		//return	0;
    	18b'XXX_X00_0XXX_0000_0000:	// HLT	R$Z
    		//FH($Z | 0);
    	18b'111_X00_0XXX_0XXX_0XXX:	// HLT	P$Z/$Z
    		//FH($Z | 8);
    	18b'XXX_X00_0100_0000_0000:	// .$Y$X	
    		//return 0;
    	18b'XXX_X00_1000_0000_0000:	// .$Y$X	
    		//return 0;
    	18b'XXX_X00_1000_0XXX_0000:	// MOV	[0],R$Y
    		//CR(0,R$Y())+ FL(0),_.IE=0;
    	18b'XXX_X10_0100_0XXX_0000:	// .$Y$X	
    		//return 0;
    	18b'XXX_X10_1000_0XXX_0000:	// .$Y$X	
    		//return 0;
    	18b'XXX_X10_0100_0000_0XXX:	// MOV	R$X,[$Y]
    		//R$X(CR($Y))+ FL(0),_.IE=0;
    	18b'1XX_X10_0100_0XXX_0XXX:	// MOV	R$X,[R$Y]
    		//R$X(CTX(R$Y()))+ FL(0),_.IE=0;
    	18b'XXX_X10_0100_0XXX_0XXX:	// MOV	[R$X],R$Y
    		//CTX(R$X(), R$Y())+ FL(0),_.IE=0;
    	18b'101_X00_0XXX_0XXX_0XXX:	// XCHG	R$Z,R$Y
    		//$1=R$Z(),R$Z(R$Y()),R$Y($1);
    	18b'110_X00_0XXX_0XXX_0XXX:	// XCHG	P$Z,P$Y
    		//$1=P$Z(),P$Z(P$Y()),P$Y($1);
    	18b'XXX_X11_X100_0XXX_0000:	// .$Y$X	
    		//return 0;
    	18b'XXX_X11_X100_0000_0XXX:	// .$Y$X	
    		//return 0;
    	18b'1XX_X11_X100_0XXX_0XXX:	// IN	R$X
    		//R$X(PORT(R$X()));
    	18b'XXX_X11_X100_0XXX_0XXX:	// OUT	R$X,R$Y
    		//PORT(R$X(),R$Y());
    	18b'XXX_XXX_0100_0XXX_1XXX:	// BIT	R$X,$Y
    		//$1=FL(),FL($1&0xFE)|((R$X()>>$Y)&1),R$X(~(~R$X()|(1<<$Y)))/*>*/;
    	18b'0XX_X00_0000_0XXX_0XXX:	// MOV	R$X,R$Y
    		//R$X(R$Y());
    	18b'XXX_X00_0XXX_0000_0XXX:	// MOV	R$X,[$Z]
    		//R$X(CR($Z));
    	18b'XXX_X00_0XXX_0XXX_0000:	// MOV	[$Z],R$Y
    		//CR($Z,R$Y());
    	18b'0XX_X00_0100_0XXX_0XXX:	// MOV	P$X,P$Y
    		//P$X(P$Y());
    	18b'XXX_X10_0100_0XXX_1XXX:	// --	Z$Y
    		//$1=ALU$X(DROP($Y),REG($Y)),REG($Y,$1),FL($1.hi());
    	18b'XXX_XXX_0XXX_0XXX_1XXX:	// ALU$X	Z$Z,R$Y
    		//$1=ALU$X(Z$Z(),R$Y()),Z$Z($1),FL($1.hi());
    	18b'XXX_XXX_0100_1010_1XXX:	// ADC	P$X,IB
    		//$1=ALU$X(DROP(FH()),_.B),ACC($1),FL($1.hi());
    	18b'XXX_XXX_0XXX_1010_1XXX:	// ALU$X	Z$Z,IB
    		//$1=ALU$X(Z$Z(),_.B),Z$Z($1),FL($1.hi());
    	18b'XXX_X00_0XXX_100X_XXXX:	// PUSH	$VIB
    		//HEAP(0x$V00 + _.B);
    	18b'XXX_XXX_0000_1110_1110:	// NOP	
    		//$Z;
    	18b'XXX_XXX_0XXX_1110_1110:	// NOP	$Z
    		//$Z;
    	18b'XXX_X0X_0000_1111_1110:	// DBG	0
    		//HEAP(_.IP)+IP(JP(10>$T?0:1));
    		//_.IF=true;
    	18b'XXX_X0X_0000_1111_1111:	// DBG	
    		//HEAP(_.IP)+IP(JP(10>$T?0:1));
    		//_.IF=true;
    	18b'111_XXX_0000_1100_1XXX:	// INC	Q$X
    		//Q$X(Q$X()+1);
    	18b'111_XXX_0000_1101_1XXX:	// DEC	Q$X
    		//Q$X(Q$X()-1);
    	18b'XXX_X00_0000_1100_1111:	// CMC	
    		//FL(FL() ^ 2);
    	18b'111_XXX_0XXX_1100_1XXX:	// ADD	Q$X,P$Z
    		//$1=Q$X()+P$Z()+(_CF?0:0),$2=($1>>15)&2,FL((FL()& 0xD)|$2), Q$X($1);
    	18b'111_XXX_0XXX_1101_1XXX:	// SUB	Q$X,P$Z
    		//$1=Q$X()-P$Z()-(_CF?0:0),$2=($1>>15)&2,FL((FL()& 0xD)|$2), Q$X($1);
    	18b'XXX_XXX_0000_1101_1110:	// DOZ	
    		//CND7?(FH(1 | 8), FL((FL() & 0x02) | 0x05)):0;
    	18b'XXX_XXX_0000_1101_1111:	// DONZ	
    		//CND6?(FH(1 | 8), FL((FL() & 0x02) | 0x05)):0;
    	18b'XXX_XXX_0XXX_1101_111X:	// ---	
    		//return 0;
    	18b'XXX_XXX_0100_110X_1XXX:	// ---	
    		//$1=ACC(ALU$W(ACC())),FL($1.hi());
    	18b'XXX_XXX_0XXX_1100_1110:	// ALU1F	Z$Z
    		//$1=Z$Z(ALU1F(Z$Z())),FL($1.hi());
    	18b'XXX_XXX_0XXX_110X_1XXX:	// ALU$W	Z$Z
    		//$1=Z$Z(ALU$W(Z$Z())),FL($1.hi());
    	18b'XXX_X00_0000_1010_0XXX:	// MOV	R$X,IB
    		//R$X(_.B);
    	18b'XXX_X00_X100_1011_0000:	// PUSH	$+IB
    		//HEAP(IP()+_.A);
    	18b'XXX_X0X_0000_1011_0XXX:	// CCND$X	$+IB
    		//CND$X?HEAP(IP())+IP(IP()+_.A):0;
    		//_.IF=true;
    	18b'XXX_XXX_0000_1100_0XXX:	// INC	R$X
    		//$1=ADD(R$X(),1),R$X($1),FL($1.hi());
    	18b'XXX_XXX_0000_1101_0XXX:	// DEC	R$X
    		//$1=SUB(R$X(),1),R$X($1),FL($1.hi());
    	18b'XXX_XXX_0XXX_1100_0XXX:	// ADD	P$Z,R$X
    		//$1=(P$Z()+R$X()),P$X($1),FL($1.hi());
    	18b'XXX_XXX_0XXX_1101_0XXX:	// SUB	P$Z,R$X
    		//$1=(P$Z()+R$X()),P$X($1),FL($1.hi());
    	18b'XXX_XXX_0XXX_1101_0XXX:	// DEC	R$X
    		//$1=SUB(R$X(),1),R$X($1),FL($1.hi());
    	18b'XXX_X00_0XXX_1010_0000:	// POP	[P$Z+IB]
    		//DW(P$Z()+_.C,HEAP());
    	18b'XXX_X00_0XXX_1010_0XXX:	// MOV	R$X,[P$Z+IB]
    		//R$X(DB(P$Z()+_.C));
    	18b'XXX_X00_111X_1011_0000:	// PUSH	[P$Z+IB]
    		//HEAP(DW(P$Z()+_.C));
    	18b'XXX_X00_0XXX_1011_0000:	// PUSH	[P$Z+IB]
    		//HEAP(DW(P$Z()+_.C));
    	18b'XXX_X00_0XXX_1011_0XXX:	// MOV	[P$Z+IB],R$X
    		//DB(P$Z()+_.C,R$X());
    	18b'XXX_X10_0000_1010_0XXX:	// ---	IB
    		//return 0;
    	18b'XXX_X10_0000_1011_0XXX:	// ---	IB
    		//return 0;
    	18b'XXX_X10_0XXX_1010_0XXX:	// MOV	R$X,[P$Z+ACC+IB]
    		//R$X(DB(P$Z()+ACC()+_.C)),FL(0),_.IE=0;
    	18b'XXX_X10_0XXX_1011_0XXX:	// MOV	[P$Z+ACC+IB],R$X
    		//DB(P$Z()+ACC()+_.C,R$X()),FL(0),_.IE=0;
    	18b'XXX_XXX_X100_1011_1XXX:	// ---	IB
    		//return 0;
    	18b'XXX_X00_X100_1011_1010:	// LEA	+IB
    		//DST(DST()+_.B);
    	18b'XXX_X00_X100_1011_1XXX:	// MOV	[U$X],IB
    		//DB(U$X(),_.B);
    	18b'XXX_X00_1110_1011_1000:	// WAIT	
    		//FL((FL() & 0x02) | 0x0D),trace.expression=0;
    	18b'XXX_X00_1111_1011_1000:	// RET	
    		//IP(HEAP());
    	18b'XXX_X0X_0XXX_1011_1000:	// JMP	$+$UIB
    		//IP(IP()+_.A);
    		//_.IF=true;
    	18b'XXX_XXX_0XXX_1011_1XXX:	// JCND$X	$+$UIB
    		//CND$X?IP(IP()+_.A):0;
    		//_.IF=true;
    	18b'XXX_XXX_1111_1011_1XXX:	// RCND$X	
    		//CND$X?IP(HEAP()):0;
    	18b'1X1_X00_0000_1110_1XXX:	// PUSH	U$X
    		//HEAP(U$X());
    	18b'1X1_X00_0000_1111_1XXX:	// POP	U$X
    		//U$X(HEAP());
    	18b'XXX_X00_XXXX_1110_1111:	// XCHG	P$Z,[SP]
    		//$1=P$Z(),P$Z(DW(SP())), DW(SP(), $1);
    	18b'XXX_X00_0000_1110_0000:	// SKIP	
    		//FH(1 | 8), FL((FL() & 0x02) | 0x05);
    	18b'XXX_X10_0000_1110_0000:	// SKIP	ACC
    		//FH(1 | 8), FL((FL() & 0x02) | 0x05);
    	18b'XXX_X00_0000_1110_0XXX:	// LOOP	$X/R$X
    		//FH($X | 8), FL((FL() & 0x02) | 0x09);
    	18b'XXX_X00_0000_1110_1000:	// DOC	
    		//CND5?(FH(1 | 8), FL((FL() & 0x02) | 0x05)):0;
    	18b'XXX_X00_0000_1110_1001:	// DONC	
    		//CND4?(FH(1 | 8), FL((FL() & 0x02) | 0x05)):0;
    	18b'XXX_X00_0XXX_1110_1011:	// LOOP	[R$Z]
    		//FH(R$Z()|8),FL((FL() & 0x02) | 0x09);
    	18b'XXX_X00_0XXX_1110_1100:	// LOOP	R$Z
    		//FH($Z), FL((FL() & 0x02) | 0x09);
    	18b'XXX_X00_0XXX_1111_1011:	// SKIP	[R$Z]
    		//FH(R$Z()|8),FL((FL() & 0x02) | 0x05);
    	18b'XXX_X00_0XXX_1111_1100:	// SKIP	R$Z
    		//FH($Z), FL((FL() & 0x02) | 0x05);
    	18b'XXX_X00_0XXX_1111_1101:	// SKIP	$Z
    		//FH($Z | 8), FL((FL() & 0x02) | 0x05);
    	18b'100_X0X_0XXX_1111_XXXX:	// INT	$T
    		//HEAP(_.IP)+IP(JP(10>$T?0:1));
    		//_.IF=true;
    	18b'XXX_XXX_1000_10XX_XXXX:	// Y$Y_X$X	IB
    		//return 0;
    	18b'XXX_XXX_XXXX_XXXX_XXXX:	// Y$Y_X$X	($M)
    		//0;
    [свернуть]

    Естественно, это лишь примерный набросок / скелет, по которому уже нужно, так или иначе, описывать алгоритм работы каждой операции.
    (Хотя, знатоки JavaScript уже поняли, что «R$X(…)» синтаксически легальна и может учитывать «X» как младшие 3 бита кода инструкции. Тем самым, немного пошаманив, можно допилить эмулятор так, чтобы всё работало именно как и описано в шаблоне - без всяких конвертаций «R$X()» -> «R4()» -> «AL()», что занимает уйму времени при открытии эмулятора.
    Просто многие фишки JavaScript я не знал на момент разработки эмулятора и не догадался их использовать…)

    Естественно, это значительно упростит в дальнейшем разработку, так как от порядка описания команд зависит вся работа в целом и нельзя перепутать местами несколько условий из-за строжайшего мажоритарного приоритета.
    (В LogiSim-модели я немало мучался с индексированием инструкций, так как вручную тяжело придерживаться нужного логического порядка кодирования их…)

    P.S.: Чтобы было легче проникнуться затеей, относитесь к ней к подобию виртуальной Java-машины с дружественным байт-кодом и легко реализуемой в FPGA или ТТЛ.
    (В отличии от Java-процессора, который разрабатывали монстры индустрии и так до конца не справились с изначально поставленной задачей. Хоть первоначально и нацеливались на аппаратную реализацию с конкуренцией с Intel. Здесь я ни с кем конкурировать не собираюсь и систему команд продумываю без оглядки на ограничения в FPGA/ТТЛ. Хоть и реализация на ТТЛ-рассыпухие в перспективе и предусматривается…)
    Последний раз редактировалось Радио-86РК; 15.05.2020 в 21:12.

  7. #16
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  8. #17

    Регистрация
    24.01.2008
    Адрес
    Уфа
    Сообщений
    3,926
    Спасибо Благодарностей отдано 
    105
    Спасибо Благодарностей получено 
    290
    Поблагодарили
    216 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Hunta Посмотреть сообщение
    Пример понятного

    MOV R0, R1
    Ага, очень понятно: из R1 в R0 записать, или наоборот

  9. #18

    Регистрация
    30.11.2015
    Адрес
    г. Самара
    Сообщений
    7,505
    Спасибо Благодарностей отдано 
    344
    Спасибо Благодарностей получено 
    712
    Поблагодарили
    594 сообщений
    Mentioned
    13 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от b2m Посмотреть сообщение
    Ага, очень понятно: из R1 в R0 записать, или наоборот
    А это зависит от того, кто смотрит - пидипишник или кто другой Но даже в этом случае понятней, чем извращение A4 - LOAD R4
    К тому же у PDP - MOV R0, R1 - move r0 to r1 выглядит логичней, чем в варианте move r1 to r0 - скользим слева направо взглядом - и всё выглядит логичным.

  10. #19

    Регистрация
    20.04.2006
    Адрес
    Санкт-Петербург
    Сообщений
    2,870
    Спасибо Благодарностей отдано 
    521
    Спасибо Благодарностей получено 
    251
    Поблагодарили
    225 сообщений
    Mentioned
    8 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Тогда надо (from to) FT R1,R0 и если аккумулятор один FT R1, а указателей памяти если два FT M1,M0. Если же аккумулятором могут быть все регистры FTA R1,R0 R1+R0->R0
    FTS R1,R0 R1-R0->R0 FTSJZ IF( R1-R0=0) JMP адрес.
    С "аккумулятором" же дополнительно можно выполнять умножение и деление.
    В общем с архитектурами 8008, 8080 можно экспериментировать сколько угодно за счет того, что не все 256 кодов операций задействовано
    Последний раз редактировалось andrews; 16.05.2020 в 13:23.

  11. #20

    Регистрация
    24.01.2008
    Адрес
    Уфа
    Сообщений
    3,926
    Спасибо Благодарностей отдано 
    105
    Спасибо Благодарностей получено 
    290
    Поблагодарили
    216 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Hunta Посмотреть сообщение
    move r0 to r1 выглядит логичней
    move to r0 from r1 тоже логично

Страница 2 из 5 ПерваяПервая 12345 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Програмная эмуляция i8086 в ДВК
    от MM в разделе ДВК, УКНЦ
    Ответов: 21
    Последнее: 06.03.2019, 13:04
  2. Мнемоники i8080 vs Z80
    от Vladimir_S в разделе Разное
    Ответов: 153
    Последнее: 20.12.2016, 13:02
  3. Квадратный корень на i8080
    от shoorick в разделе Разное
    Ответов: 31
    Последнее: 25.08.2016, 14:04
  4. Код эмуляции i8080 на С
    от medvdv в разделе Эмуляторы отечественных компьютеров
    Ответов: 15
    Последнее: 27.03.2015, 03:43
  5. Эмулятор i8080
    от Higgins в разделе Разное
    Ответов: 2
    Последнее: 20.05.2011, 11:43

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •