80TO86 - ASM Wizard

Микропроцессор i8080, являющийся фактически пращуром современных процессоров, содержит значительное число технических решений, на долгое время определивших развитие микропроцессорной техники. Обладая сравнительно простой системой команд, i8080 и сегодня представляет собой удобный объект для изучения дисциплин связанных с разработкой микропроцессорных систем и их программированием на языке ассемблер.

Известно, что семейство микропроцессоров Intel является программно-совместимым снизу вверх. То есть, программы разработанные для микропроцессоров предыдущего поколения непосредственно выполняются на более развитых экземплярах. На этой лестнице субординации процессор i8080 стоит несколько особняком: программы, разработанные для i8080 не могут быть выполнены непосредственно на процессорах более старших семейств.

Между тем документация Intel утверждает, что исходные ассемблерные тексты программ для i8080 могут быть перекомпилированы в коды процессоров старших семейств с незначительными изменениями и исправлениями, учитывающими разницу в архитектуре этих процессоров. Также должна быть учтена разница в системных вызовах программ, работающих под управлением различных операционных систем.

Целью, поставленной при разработке данной программы, было предоставить пользователю возможность перенести разработки на платформе i8080 в систему команд микропроцессоров x86, причем сам процесс кроссплатформенного переноса предполагался максимально автоматизированным.

Содержание:

-	i8080 and i8086 Microprocessor Architecture;

-	Identical registers of microprocessors i8080 and i8086;

-	Analogues of commands;

-	How it works;

-	Limitations.


i8080 and i8086 Microprocessor Architecture

Архитектура микропроцессоров i8080 и i8086

Рассмотрим архитектуру рассматриваемых процессоров с целью выявить идентичность, на основе которой может быть выполнен автоматический кроссплатформенный перенос.

i8080

i8086

Сравнение архитектур позволяет провести следующие аналогии.

-	Identical registers of microprocessors i8080 and i8086;


Identical registers of microprocessors i8080 and i8086

Идентичные регистры микропроцессоров i8080 и i8086

Логично поставить в соответствие регистры процессоров i8080 и x86 следующим образом:

Регистр флагов F микропроцессора i8086 содержит 16 разрядов, но младшие его 8 разрядов соответствуют регистру флагов микропроцессора i8080.

Таким образом, программа, написанная в кодах микропроцессора i8080, может быть успешно перенесена на более развитые системы с минимальными усилиями. Набор команд i8086 содержит отдельные команды, облегчающие подобный перенос.

Замена PUSH PSW –	lahf push ax
Замена POP PSW –	pop ax sahf
С учетом проведенных аналогий регистров и регистровых пар можно предложить следующую таблицу аналогов команд.

-	i8086;


Analogues of commands

Сопряжение команд процессоров i8080 и i8086

i8080	i8086		i8080	i8086
ACI n	ADC AL,n		LHLD nn	MOV BX,WORD PTR DS: [nn]   или MOV BX, DS:[nn]
ADC r	ADC AL,r8		LXI r*,nn	MOV r16,nn
ADC M	ADC AL,[BX]		MOV r,r	MOV r8,r8
ADD r	ADD AL,r8		MOV r,M	MOV r8,BYTE PTR [BX]
ADD M	ADD AL,[BX]		MOV M,r	MOV BYTE PTR [BX],r8
ADI n	ADD AL,n		MVI r,n	MOV r8,n
ANA r	AND AL,r8		MVI M,n	MOV BYTE PTR [BX],n
ANA M	AND AL,[BX]		NOP	NOP
ANI n	AND AL,n		ORA r	OR AL,r8
CALL nn	CALL nn 4		ORA M	OR AL,BYTE PTR [BX]
CC nn	JNC LabelNC 1 CALL nn LabelNC:		ORI n	OR AL,n
CM nn	JNS LabelNS 1 CALL nn LabelNS:		OUT n	OUT n,AL
CMA	NOT AL		PCHL	JMP BX
CMC	CMC		POP r*	POP r16
CPI n	CMP AL,n		PUSH r*	PUSH r16
CMP r	CMP AL,r8		RAL	RCL AL,1
CMP M	CMP AL,BYTE PTR [BX]		RAR	RCR AL,1
CNC nn	JC LabelC 1 CALL nn LabelC:		RC	JNC $+3 RET
CNZ nn	JZ LabelZ 1 CALL nn LabelZ:		RET	RET
CP nn	JS LabelS 1 CALL nn LabelS:		RLC	ROL AL,1
CPE nn	JNP LabelNP 1 CALL nn LabelNP:		RM	JNS $+3 RET
CPO nn	JP LabelP 1 CALL nn LabelP:		RNC	JC $+3 RET
CZ nn	JNZ LabelNZ 1 CALL nn LabelNZ:		RNZ	JZ $+3 RET
DAA	DAA		RP	JS $+3 RET
DAD r*	ADD BX,r16		RPE	JNP $+3 RET
DCR r	DEC r8		RPO	JP $+3 RET
DCR M	DEC BYTE PTR [BX]		RRC	ROR AL,1
DCX r*	DEC r16		RST x	CLI CALL (100+x*8)
DI	CLI		RZ	JNZ $+3 RET
EI	STI		SBB r	SBB AL,r8
HLT	HLT		SBB M	SBB AL,BYTE PTR [BX]
IN n	IN AL,n		SBI n	SBB AL,n
INR r	INC r8		SHLD nn	MOV WORD PTR [nn],BX
INR M	INC BYTE PTR [BX]		SPHL	CLI MOV SP,BX 3 STI
INX r*	INC r16		STA nn	MOV BYTE PTR DS:[nn],AL MOV DS:[nn],AL MOV BYTE PTR Label,AL
JC nn	JNC LabelNC 1 JMP nn LabelNC:		STAX B	MOV BP,СX MOV BYTE PTR DS:[BP], AL
JM nn	JNS LabelNS 2 JMP nn LabelNS:		STAX D	MOV BP,DX MOV BYTE PTR DS:[BP], AL
JMP nn	JMP nn		STC	STC
JNC nn	JC LabelC 2 JMP nn LabelC:		SUB r	SUB AL,r8
JNZ nn	JZ LabelZ 2 JMP nn LabelZ:		SUB M	SUB AL,BYTE PTR [BX]
JP nn	JS LabelS 2 JMP nn LabelS:		SUI n	SUB AL,n
JPE nn	JNP LabelNP 2 JMP nn LabelNP:		XCHG	XCHG BX,DX
JPO nn	JP LabelP 2 JMP nn LabelP:		XRA r	XOR AL,r8
JZ nn	JNZ LabelNZ 2 JMP nn LabelNZ:		XRA M	XOR AL,BYTE PTR [BX]
LDA nn	MOV AL,BYTE PTR DS:[nn]   или MOV AL,DS:[nn]		XRI n	XOR AL,n
LDAX B	MOV BP,СX MOV AL,BYTE PTR DS: [BP]		XTHL	MOV  BP,SP XCHG BX,WORD PTR SS:[BP]
LDAX D	MOV BP,DX MOV AL,BYTE PTR DS: [BP]
Примечание: в таблице приняты следующие обозначения:

  n —   8-битный операнд (байт или номер порта);

nn — 16-битный операнд (слово или адрес);

 r  —  8-битный регистр общего назначения i8080;

 r*—  16-битная регистровая пара i8080;

r8 —  8-битный регистр общего назначения x86;

r16 – 16-битный регистр общего назначения x86;

 1  —  Система команд процессора x86 не содержит условных вызовов подпрограмм - поэтому сделана замена такой конструкцией.

 2  —  Условные переходы в системе команд процессора x86 являются 'короткими', т.е. переход осуществляется в пределах -128… +127 байт. При автоматической генерации кода, во избежание ошибок, справедливо будет заменить их конструкциями обхода и безусловного JMP на длинный адрес.

 3  —  В принципе обрамление  CLI   …   STI не обязательно, но порой весьма корректно;

 4  —  Команды типа CALL nn  и JMP nn  вызывают сложность при автоматической трансляции: форма типа CALL nn  и JMP nn вызывает ошибку трансляции типа Illegal immediate в тех случаях, если nn - число или внешняя метка. В таком случае переход на адрес nn может быть организован следующим образом:

CALL START-100+nn;

где START - метка, связанная с псевдооператором начального адреса программы ORG 100H.

Возможна замена команд типа CALL nn  и  JMP nn на CALL CS:nn  и  JMP CS:nn, в этом случае переход при трансляции будет осуществлен на адрес, храняшийся в ячейках памяти nn и nn+1, что позволяет осуществить табличный вызов внешних функций:

CALL	CS:Keyboard

...

Keyboard	EQU	0F803H

ORG	0F803H

DW	OFFSET SUB0F803H

Этот вариант предпочтителен при автоматической перекодировке, когда блок внешних вызовов функций BIOS можно дописать в конец программы в следующем виде:

ORG	0F800H;------------------ функции BIOS -----

BegBios:

DW	OFFSET SUB0F800H

DB	90H

DW	OFFSET SUB0F803H

DB	90H

DW	OFFSET SUB0F806H

DB	90H

...	; и т.д.

SUB0F800H:	MOV	AX,4C00H	; DOS Services  ah=function 4Ch

INT	21H	; terminate with al=return code

SUBF803H	PROC	NEAR	; AL = символ с клав. с ожиданием

WaitKey:

CALL	SUBF812H

JNZ	gotKey	; jmp if key is ready

JMP	WaitKey	; loop back and check for a key

gotKey:	MOV	AH,00H	; key is ready, get it

INT	16H	; now process the key

OR	AL,AL

JNZ	ExtKey

MOV	AL,AH

ExtKey:

RETN

SUBF803H	ENDP

...	; и т.д.

Замены в таблице приведены для создания исходного текста файла типа *.COM, если файл позже требуется преобразовать в *.EXE, то следует обратить внимание на сегментные регистры в строках типа MOV BYTE PTR [BX],b , поскольку только для *.COM файла справедливо, что CS = DS = SS, то есть, эти сегменты сгруппированы в одном.

-	How it works;


How it works

Пример работы с программой

1. Опцией Open открыть ассемблерный файл *.ASM или *.i80, и загрузить его в левое окно программы. Изначально предполагается, что этот файл – в кодировке KOI-8, а правое окно настроено на кодировку DOS. Если это не так, опцией Select Font можно выбрать необходимые кодировки для окон. Если в операционной системе шрифты DOS и KOI-8 не установлены, необходимые файлы распространяются вместе с программой.

2. Опцией Insert Bios выбрать (или отменить) возможность присоединения аналогов распространенных функций операционной системы популярных 8-битных компьютеров к перекодируемой программе.

3. Опцией Transcode начать перекодировку программы в мнемониках i8080 в текст ассемблера x86.

4. Просмотреть перекодированный файл в правом окне, внести необходимые изменения и сохранить его опцией Save.

Обычно полученный ассемблерный файл в мнемониках процессора x86 транслируется без синтаксических ошибок, что не отменяет работы над семантикой программы и её адаптацией к аппаратным особенностям платформы Intel.

-	Limitations;


Limitations

Ограничения

Следующие ограничения относятся к 80TO86 - ASM Wizard:

-	в системе должны быть установлены шрифты с раскладкой DOS и KOI-8 (прилагаются).

-	расширение транслируемого файла - *.i80.

-	сохраняемый файл не следует открывать до окончания процесса записи.

-	80TO86 - ASM Wizard.