/************ Дизассемблер для микропроцессора типа 1816ВЕ39 ************/
?use80386
?resize TRUE
?parsecommandline TRUE

?include "file.h--"
?include "gwrite.h--"

byte K00="\tNOP";
byte K02="\tOUTL\tBUS,A\t;порт данных<-A";
byte K03="\tADD\tA,";
byte K04="\tJMP\t";
byte K05="\tEN\tI\t;разрешить внешние прерывания";
byte K07="\tDEC\tA\t;A--";
byte K08="\tINS\tA,BUS\t;стробир ввод данных из порта данных в A";
byte K09="\tIN\tA,P1\t;A<-порта P1";
byte K0A="\tIN\tA,P2\t;A<-порта P2";
byte K0C="\tMOVD\tA,P4\t;из порт P2 м-сх расширителя с номером 4 получ 4 младш бита, старшие =0";
byte K0D="\tMOVD\tA,P5\t;из порт P2 м-сх расширителя с номером 5 получ 4 младш бита, старшие =0";
byte K0E="\tMOVD\tA,P6\t;из порт P2 м-сх расширителя с номером 6 получ 4 младш бита, старшие =0";
byte K0F="\tMOVD\tA,P7\t;из порт P2 м-сх расширителя с номером 7 получ 4 младш бита, старшие =0";
byte K10="\tINC\t@R0\t;[R0]++";
byte K11="\tINC\t@R1\t;[R1]++";
byte K12="\tJB0\t";
byte K13="\tADDC\tA,";
byte K14="\tCALL\t";
byte K15="\tDIS\tI\t;запретить внешние прерывания";
byte K16="\tJTF\t";
byte K17="\tINC\tA\t;A++";
byte K18="\tINC\tR0\t;R0++";
byte K19="\tINC\tR1\t;R1++";
byte K1A="\tINC\tR2\t;R2++";
byte K1B="\tINC\tR3\t;R3++";
byte K1C="\tINC\tR4\t;R4++";
byte K1D="\tINC\tR5\t;R5++";
byte K1E="\tINC\tR6\t;R6++";
byte K1F="\tINC\tR7\t;R7++";
byte K20="\tXCH\tA,@R0\t;A><[R0]";
byte K21="\tXCH\tA,@R1\t;A><[R1]";
byte K23="\tMOV\tA,";
byte K24="\tJMP\t100H+";
byte K25="\tEN\tTCNTI\t;разрешить прерывания по таймеру";
byte K26="\tJNT0\t";
byte K27="\tCLR\tA\t;A=0";
byte K28="\tXCH\tA,R0\t;A><R0";
byte K29="\tXCH\tA,R1\t;A><R1";
byte K2A="\tXCH\tA,R2\t;A><R2";
byte K2B="\tXCH\tA,R3\t;A><R3";
byte K2C="\tXCH\tA,R4\t;A><R4";
byte K2D="\tXCH\tA,R5\t;A><R5";
byte K2E="\tXCH\tA,R6\t;A><R6";
byte K2F="\tXCH\tA,R7\t;A><R7";
byte K30="\tXCHD\tA,@R0\t;A><[R0]-только 4 младших бита";
byte K31="\tXCHD\tA,@R1\t;A><[R1]-только 4 младших бита";
byte K32="\tJB1\t";
byte K34="\tCALL\t100H+";
byte K35="\tDIS\tTCNTI\t;запретить прерывания по таймеру";
byte K36="\tJT0\t";
byte K37="\tCPL\tA\t;инвертировать A";
byte K39="\tOUTL\tP1,A\t;порт P1<-A";
byte K3A="\tOUTL\tP2,A\t;порт P2<-A";
byte K3C="\tMOVD\tP4,A\t;4младш бита A в порт P2 м-сх расширителя с номером 4";
byte K3D="\tMOVD\tP5,A\t;4младш бита A в порт P2 м-сх расширителя с номером 5";
byte K3E="\tMOVD\tP6,A\t;4младш бита A в порт P2 м-сх расширителя с номером 6";
byte K3F="\tMOVD\tP7,A\t;4младш бита A в порт P2 м-сх расширителя с номером 7";
byte K40="\tORL\tA,@R0\t;A|[R0]";
byte K41="\tORL\tA,@R1\t;A|[R1]";
byte K42="\tMOV\tA,T\t;получить содержимое таймера";
byte K43="\tORL\tA,";
byte K44="\tJMP\t200H+";
byte K45="\tSTRT\tCNT\t;запуск счетчика событий";
byte K46="\tJNT1\t";
byte K47="\tSWAP\tA\t;обмен 4 младших с 4 старшими битами A";
byte K48="\tORL\tA,R0\t;A|R0";
byte K49="\tORL\tA,R1\t;A|R1";
byte K4A="\tORL\tA,R2\t;A|R2";
byte K4B="\tORL\tA,R3\t;A|R3";
byte K4C="\tORL\tA,R4\t;A|R4";
byte K4D="\tORL\tA,R5\t;A|R5";
byte K4E="\tORL\tA,R6\t;A|R6";
byte K4F="\tORL\tA,R7\t;A|R7";
byte K50="\tANL\tA,@R0\t;A&[R0]";
byte K51="\tANL\tA,@R1\t;A&[R1]";
byte K52="\tJB2\t";
byte K53="\tANL\tA,";
byte K54="\tCALL\t200H+";
byte K55="\tSTRT\tT\t;запуск таймера";
byte K56="\tJT1\t";
byte K57="\tDA\tA\t;десятичная корекция";
byte K58="\tANL\tA,R0\t;A&R0";
byte K59="\tANL\tA,R1\t;A&R1";
byte K5A="\tANL\tA,R2\t;A&R2";
byte K5B="\tANL\tA,R3\t;A&R3";
byte K5C="\tANL\tA,R4\t;A&R4";
byte K5D="\tANL\tA,R5\t;A&R5";
byte K5E="\tANL\tA,R6\t;A&R6";
byte K5F="\tANL\tA,R7\t;A&R7";
byte K60="\tADD\tA,@R0\t;A+[R0]";
byte K61="\tADD\tA,@R1\t;A+[R1]";
byte K62="\tMOV\tT,A\t;установить таймер";
byte K64="\tJMP\t300H+";
byte K65="\tSTOP\tTCNT\t;останов таймера/счетчика событий";
byte K67="\tRRC\tA\t;>> с переносом";
byte K68="\tADD\tA,R0\t;A+R0";
byte K69="\tADD\tA,R1\t;A+R1";
byte K6A="\tADD\tA,R2\t;A+R2";
byte K6B="\tADD\tA,R3\t;A+R3";
byte K6C="\tADD\tA,R4\t;A+R4";
byte K6D="\tADD\tA,R5\t;A+R5";
byte K6E="\tADD\tA,R6\t;A+R6";
byte K6F="\tADD\tA,R7\t;A+R7";
byte K70="\tADDC\tA,@R0\t;A+[R0]+перенос";
byte K71="\tADDC\tA,@R1\t;A+[R1]+перенос";
byte K72="\tJB3\t";
byte K74="\tCALL\t300H+";
byte K75="\tENTO\tCLK\t;разрешение импульсов синхронизации";
byte K76="\tJF1\t";
byte K77="\tRR\tA\t;>> без переноса";
byte K78="\tADDC\tA,R0\t;A+R0+перенос";
byte K79="\tADDC\tA,R1\t;A+R1+перенос";
byte K7A="\tADDC\tA,R2\t;A+R2+перенос";
byte K7B="\tADDC\tA,R3\t;A+R3+перенос";
byte K7C="\tADDC\tA,R4\t;A+R4+перенос";
byte K7D="\tADDC\tA,R5\t;A+R5+перенос";
byte K7E="\tADDC\tA,R6\t;A+R6+перенос";
byte K7F="\tADDC\tA,R7\t;A+R7+перенос";
byte K80="\tMOVX\tA,@R0\t;A<-[R0] с внешней памяти";
byte K81="\tMOVX\tA,@R1\t;A<-[R1] с внешней памяти";
byte K83="\tRET";
byte K84="\tJMP\t400H+";
byte K85="\tCLR\tF0\t;флаг F0 уст в 0";
byte K86="\tJNI\t";
byte K88="\tOPL\tBUS,";
byte K89="\tORL\tP1,";
byte K8A="\tORL\tP2,";
byte K8C="\tORLD\tP4,A\t;порт P4 | A-четыре младших бита. A-неменяется;";
byte K8D="\tORLD\tP5,A\t;порт P5 | A-четыре младших бита. A-неменяется";
byte K8E="\tORLD\tP6,A\t;порт P6 | A-четыре младших бита. A-неменяется";
byte K8F="\tORLD\tP7,A\t;порт P7 | A-четыре младших бита. A-неменяется";
byte K90="\tMOVX\t@R0,A\t;во внешнюю память [R0]<-A";
byte K91="\tMOVX\t@R1,A\t;во внешнюю память [R1]<-A";
byte K92="\tJB4\t";
byte K93="\tRETR\t;возврат с востановлением регистра состояний";
byte K94="\tCALL\t400H+";
byte K95="\tCPL\tF0\t;инвертировать флаг F0";
byte K96="\tJNZ\t";
byte K97="\tCLR\tC\t;установить перенос в 0";
byte K98="\tANL\tBUS,";
byte K99="\tANL\tP1,";
byte K9A="\tANL\tP2,";
byte K9C="\tANLD\tP4,A\t;порт P4 & A-четыре младших бита. A-неменяется";
byte K9D="\tANLD\tP5,A\t;порт P5 & A-четыре младших бита. A-неменяется";
byte K9E="\tANLD\tP6,A\t;порт P6 & A-четыре младших бита. A-неменяется";
byte K9F="\tANLD\tP7,A\t;порт P7 & A-четыре младших бита. A-неменяется";
byte KA0="\tMOV\t@R0,A\t;[R0]<-A";
byte KA1="\tMOV\t@R1,A\t;[R1]<-A";
byte KA3="\tMOVP\tA,@A\t;содерж ячейки адресуемой A передается в A";
byte KA4="\tJMP\t500H+";
byte KA5="\tCLR\tF1\t;флаг F1 уст в 0";
byte KA7="\tCPL\tC\t;инвертировать перенос";
byte KA8="\tMOV\tR0,A\t;R0<-A";
byte KA9="\tMOV\tR1,A\t;R1<-A";
byte KAA="\tMOV\tR2,A\t;R2<-A";
byte KAB="\tMOV\tR3,A\t;R3<-A";
byte KAC="\tMOV\tR4,A\t;R4<-A";
byte KAD="\tMOV\tR5,A\t;R5<-A";
byte KAE="\tMOV\tR6,A\t;R6<-A";
byte KAF="\tMOV\tR7,A\t;R7<-A";
byte KB0="\tMOV\t@R0,";
byte KB1="\tMOV\t@R1,";
byte KB2="\tJB5\t";
byte KB3="\tJMPP\t@A\t;переход по адресу в [A]";
byte KB4="\tCALL\t500H+";
byte KB5="\tCPL\tF1\t;инвертировать флаг F1";
byte KB6="\tJF0\t";
byte KB8="\tMOV\tR0,";
byte KB9="\tMOV\tR1,";
byte KBA="\tMOV\tR2,";
byte KBB="\tMOV\tR3,";
byte KBC="\tMOV\tR4,";
byte KBD="\tMOV\tR5,";
byte KBE="\tMOV\tR6,";
byte KBF="\tMOV\tR7,";
byte KC4="\tJMP\t600H+";
byte KC5="\tSEL\tRB0\t;выбор нулевого банка рабочих регистров памяти";
byte KC6="\tJZ\t";
byte KC7="\tMOW\tA,PSW\t;получить регистр состояний";
byte KC8="\tDEC\tR0\t;R0--";
byte KC9="\tDEC\tR1\t;R1--";
byte KCA="\tDEC\tR2\t;R2--";
byte KCB="\tDEC\tR3\t;R3--";
byte KCC="\tDEC\tR4\t;R4--";
byte KCD="\tDEC\tR5\t;R5--";
byte KCE="\tDEC\tR6\t;R6--";
byte KCF="\tDEC\tR7\t;R7--";
byte KD0="\tXRL\tA,@R0\t;XOR A [R0]";
byte KD1="\tXRL\tA,@R1\t;XOR A [R1]";
byte KD2="\tJB6\t";
byte KD3="\tXRL\tA,";
byte KD4="\tCALL\t600H+";
byte KD5="\tSEL\tRB1\t;выбор первого банка рабочих регистров памяти";
byte KD7="\tMOW\tPSW,A\t;установить регистр состояний";
byte KD8="\tXRL\tA,R0\t;XOR A R0";
byte KD9="\tXRL\tA,R1\t;XOR A R1";
byte KDA="\tXRL\tA,R2\t;XOR A R2";
byte KDB="\tXRL\tA,R3\t;XOR A R3";
byte KDC="\tXRL\tA,R4\t;XOR A R4";
byte KDD="\tXRL\tA,R5\t;XOR A R5";
byte KDE="\tXRL\tA,R6\t;XOR A R6";
byte KDF="\tXRL\tA,R7\t;XOR A R7";
byte KE3="\tMOVP3\tA,@A\t;содерж ячейки в стр.3 и адр A, передается в A";
byte KE4="\tJMP\t700H+";
byte KE5="\tSEL\tMB0\t;выбор нулевого банка памяти";
byte KE6="\tJNC\t";
byte KE7="\tRL\tA\t;<< без переноса";
byte KE8="\tDJNZ\tR0,";
byte KE9="\tDJNZ\tR1,";
byte KEA="\tDJNZ\tR2,";
byte KEB="\tDJNZ\tR3,";
byte KEC="\tDJNZ\tR4,";
byte KED="\tDJNZ\tR5,";
byte KEE="\tDJNZ\tR6,";
byte KEF="\tDJNZ\tR7,";
byte KF0="\tMOV\tA,@R0\t;A<-[R0]";
byte KF1="\tMOV\tA,@R1\t;A<-[R1]";
byte KF2="\tJB7\t";
byte KF4="\tCALL\t700H+";
byte KF5="\tSEL\tMB1\t;выбор первого банка памяти";
byte KF6="\tJC\t";
byte KF7="\tRLC\tA\t;<< с переносом";
byte KF8="\tMOV\tA,R0\t;A<-R0";
byte KF9="\tMOV\tA,R1\t;A<-R1";
byte KFA="\tMOV\tA,R2\t;A<-R2";
byte KFB="\tMOV\tA,R3\t;A<-R3";
byte KFC="\tMOV\tA,R4\t;A<-R4";
byte KFD="\tMOV\tA,R5\t;A<-R5";
byte KFE="\tMOV\tA,R6\t;A<-R6";
byte KFF="\tMOV\tA,R7\t;A<-R7";

word OFSSTR={#K00,0X00,#K02,#K03,#K04,#K05,0X00,#K07,#K08,#K09,#K0A,0X00,#K0C,
						 #K0D,#K0E,#K0F,#K10,#K11,#K12,#K13,#K14,#K15,#K16,#K17,#K18,#K19,
						 #K1A,#K1B,#K1C,#K1D,#K1E,#K1F,#K20,#K21,0X00,#K23,#K24,#K25,#K26,
						 #K27,#K28,#K29,#K2A,#K2B,#K2C,#K2D,#K2E,#K2F,#K30,#K31,#K32,0X00,
						 #K34,#K35,#K36,#K37,0X00,#K39,#K3A,0X00,#K3C,#K3D,#K3E,#K3F,
						 #K40,#K41,#K42,#K43,#K44,#K45,#K46,#K47,#K48,#K49,#K4A,#K4B,#K4C,
						 #K4D,#K4E,#K4F,#K50,#K51,#K52,#K53,#K54,#K55,#K56,#K57,#K58,#K59,
						 #K5A,#K5B,#K5C,#K5D,#K5E,#K5F,#K60,#K61,#K62,0X00,#K64,#K65,0X00,
						 #K67,#K68,#K69,#K6A,#K6B,#K6C,#K6D,#K6E,#K6F,#K70,#K71,#K72,0X00,
						 #K74,#K75,#K76,#K77,#K78,#K79,#K7A,#K7B,#K7C,#K7D,#K7E,#K7F,
						 #K80,#K81,0X00,#K83,#K84,#K85,#K86,0X00,#K88,#K89,#K8A,0X00,#K8C,
						 #K8D,#K8E,#K8F,#K90,#K91,#K92,#K93,#K94,#K95,#K96,#K97,#K98,#K99,
						 #K9A,0X00,#K9C,#K9D,#K9E,#K9F,#KA0,#KA1,0X00,#KA3,#KA4,#KA5,0X00,
						 #KA7,#KA8,#KA9,#KAA,#KAB,#KAC,#KAD,#KAE,#KAF,#KB0,#KB1,#KB2,#KB3,
						 #KB4,#KB5,#KB6,0X00,#KB8,#KB9,#KBA,#KBB,#KBC,#KBD,#KBE,#KBF,
						 0X00,0X00,0X00,0X00,#KC4,#KC5,#KC6,#KC7,#KC8,#KC9,#KCA,#KCB,#KCC,
						 #KCD,#KCE,#KCF,#KD0,#KD1,#KD2,#KD3,#KD4,#KD5,0X00,#KD7,#KD8,#KD9,
						 #KDA,#KDB,#KDC,#KDD,#KDE,#KDF,0X00,0X00,0X00,#KE3,#KE4,#KE5,#KE6,
						 #KE7,#KE8,#KE9,#KEA,#KEB,#KEC,#KED,#KEE,#KEF,#KF0,#KF1,#KF2,0X00,
						 #KF4,#KF5,#KF6,#KF7,#KF8,#KF9,#KFA,#KFB,#KFC,#KFD,#KFE,#KFF};

byte TWOBYTE={0x03,0x04,0x12,0x13,0x14,0x16,0x23,0x24,0x26,0x32,0x34,0x36,0x43,
              0x44,0x46,0x52,0x53,0x54,0x56,0x64,0x72,0x74,0x76,0x84,0x86,0x88,
							0x89,0x8a,0x92,0x94,0x96,0x98,0x99,0x9a,0xa4,0xb2,0xb4,0xb6,0xb8,
							0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf,0xc4,0xc6,0xd2,0xd3,0xd4,0xe4,
							0xe6,0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef,0xf2,0xf4,0xf6,0XF6};
byte JMPS={0X12,0X16,0X26,0X32,0X36,0X46,0X52,0X56,0X72,0X76,
					 0X86,0X92,0X96,0XB2,0XB6,0XC6,0XD2,0XE6,0XE8,
					 0XE9,0XEA,0XEB,0XEC,0XED,0XEE,0XEF,0XF2,0XF6,0XF6};

?define COUNTTWOBYTE 65
?define COUNTJMPS    29

word FILEIN;	//адрес с именем файла
byte FILELST="        .LST";
byte FILEASM="        .ASB";
word SEGIN,SEGOUT,SEGMET;
word SIZEIN,SIZEOUT;	//разм входн файла,,разм выходного
word POZIN;	//позиция во входном
byte KOD,F2K,KOD2;

main()
{
	IF(@PARAMCOUNT()==0)return;
	FILEIN=@PARAMSTR(0);
	SEGIN=GETMEM(0X1000);
	SEGOUT=GETMEM(0X1000);
	SEGMET=GETMEM(0X1000);
	ES=SEGMET;
	DI=0;
	AX=0;
	CX=0X8000;
	$REPE
	$STOSW
	SIZEIN=readfile(FILEIN,SEGIN,0,-1);
	IF(AX==0){
		GWRITESTR("\nФайл ");
		GWRITESTR(FILEIN);
		GWRITESTR(" не найден.\n");
		return;
	}
//создать листинг
	CREATOUTF(#FILELST);
	do{
		SAVEPOZ(POZIN);
		SAVETAB();
		ES=SEGIN;
		BX=POZIN;
		KOD=ESBYTE[BX];
		SAVEBYTE(KOD);
		ES=CS;
		DI=#TWOBYTE;
		CX=COUNTTWOBYTE;
		AL=KOD;
		$REPNE
		$SCASB
		IF(CX<>0){
			F2K=TRUE;
			POZIN++;
			ES=SEGOUT;
			DI=SIZEOUT;
			AL=0X20;
			$STOSB
			SIZEOUT=DI;
			ES=SEGIN;
			BX=POZIN;
			KOD2=ESBYTE[BX];
			SAVEBYTE(KOD2);
		}
		ELSE F2K=FALSE;
		AX=KOD*2+#OFSSTR;
		BX><AX;
		SI=DSWORD[BX];
		IF(SI==0){
			SAVETAB();
			ES=SEGOUT;
			DI=SIZEOUT;
			AX=0X4244;
			$STOSW
			SIZEOUT=DI;
			SAVETAB();
			SAVEBYTE(KOD);
		}
		ELSE{
			ES=SEGOUT;
			DI=SIZEOUT;
			do{
				$LODSB
				$STOSB
			} while ( AL<>0 );
			SIZEOUT=DI-1;
			IF(F2K==TRUE){
				SAVEBYTE(KOD2);
				ES=SEGOUT;
				DI=SIZEOUT;
				AL='H';
				$STOSB
				SIZEOUT=DI;
			}
		}
		ES=SEGOUT;
		DI=SIZEOUT;
		AX=0X0A0D;
		$STOSW
		SIZEOUT=DI;
		POZIN++;
	} while ( POZIN<SIZEIN );
	writefile(#FILELST,SEGOUT,0,SIZEOUT);
//СОЗДАТЬ ФАЙЛ ASM
	CREATOUTF(#FILEASM);
//1 ПРОХОД ОБНАРУЖИТЬ ВСЕ МЕТКИ
	do{
		ES=SEGIN;
		BX=POZIN;
		KOD=ESBYTE[BX];
		ES=CS;
		DI=#TWOBYTE;
		CX=COUNTTWOBYTE;
		AL=KOD;
		$REPNE
		$SCASB
		IF(CX<>0){
			POZIN++;
			ES=SEGIN;
			BX=POZIN;
			KOD2=ESBYTE[BX];
//ПРОВЕРКА НА CALL
			AL=KOD&0X1F;
			IF(AL==0X14){
//ВЫЧИСЛИТЬ АДРЕС ПРОЦЕДУРЫ
				GETADR();
				ESBYTE[BX]='S';
			}
			ELSE IF(AL==0X04){
				GETADR();
				ESBYTE[BX]='L';
			}
			ELSE{
				ES=CS;
				DI=#JMPS;
				CX=COUNTJMPS;
				AL=KOD;
				$REPNE
				$SCASB
				IF(CX<>0){
//ПОЛУЧИТЬ АДРЕС
					BX=POZIN-1;
					BL=KOD2;
					ES=SEGMET;
					ESBYTE[BX]='L';
				}
			}
		}
		POZIN++;
	} while ( POZIN<SIZEIN );
//2 ПРОХОД - СОЗДАТЬ ТЕХТ
	CREATOUTF(#FILEASM);
	do{
//ПРОВЕРИТЬ ЕСТЬ ЛИ МЕТКА
		BX=POZIN;
		ES=SEGMET;
		AL=ESBYTE[BX];
		IF(AL<>0){
			ES=SEGOUT;
			DI=SIZEOUT;
			$STOSB
			SIZEOUT=DI;
			SAVEPOZ(POZIN);
			ES=SEGOUT;
			DI=SIZEOUT;
			AL=':';
			$STOSB
			SIZEOUT=DI;
		}
		SAVETAB();
		ES=SEGIN;
		BX=POZIN;
		KOD=ESBYTE[BX];
		AL=KOD&0X1F;
		IF(AL<>0X14){
			IF(AL<>0X04){
				AX=KOD;
			}
			ELSE AH=0;
		}
		ELSE AH=0;
		AX=AX*2+#OFSSTR;
		BX><AX;
		SI=DSWORD[BX];
		IF(SI==0){
			SAVETAB();
			ES=SEGOUT;
			DI=SIZEOUT;
			AX=0X4244;
			$STOSW
			SIZEOUT=DI;
			SAVETAB();
			SAVEBYTE(KOD);
		}
		else{
			ES=SEGOUT;
			DI=SIZEOUT;
			do{
				$LODSB
				$STOSB
			} while ( AL<>0 );
			SIZEOUT=DI-1;
			ES=CS;
			DI=#TWOBYTE;
			CX=COUNTTWOBYTE;
			AL=KOD;
			$REPNE
			$SCASB
			if(CX<>0){
				POZIN++;
				ES=SEGIN;
				BX=POZIN;
				KOD2=ESBYTE[BX];
//ПРОВЕРКА НА CALL
				AL=KOD&0X1F;
				IF(AL==0X14){
//ВЫЧИСЛИТЬ АДРЕС ПРОЦЕДУРЫ
					ES=SEGOUT;
					DI=SIZEOUT;
					AL='S';
					$STOSB
					SIZEOUT=DI;
					AL=KOD&0XE0>>5;
					AH=AL;
					AL=KOD2;
					SAVEPOZ();
				}
				ELSE IF(AL==0X04){
					ES=SEGOUT;
					DI=SIZEOUT;
					AL='L';
					$STOSB
					SIZEOUT=DI;
					AL=KOD&0XE0>>5;
					AH=AL;
					AL=KOD2;
					SAVEPOZ();
				}
				ELSE{
					ES=CS;
					DI=#JMPS;
					CX=COUNTJMPS;
					AL=KOD;
					$REPNE
					$SCASB
					IF(CX<>0){
//ПОЛУЧИТЬ АДРЕС
						ES=SEGOUT;
						DI=SIZEOUT;
						AL='L';
						$STOSB
						SIZEOUT=DI;
						AX=POZIN-1;
						AL=KOD2;
						SAVEPOZ();
					}
					ELSE{
						SAVEBYTE(KOD2);
						ES=SEGOUT;
						DI=SIZEOUT;
						AL='H';
						$STOSB
						SIZEOUT=DI;
					}
				}
			}
		}
		ES=SEGOUT;
		DI=SIZEOUT;
		AX=0X0A0D;
		$STOSW
		SIZEOUT=DI;
		POZIN++;
	} while ( POZIN<SIZEIN );
	writefile(#FILEASM,SEGOUT,0,SIZEOUT);
}

CREATOUTF()
{
	DI><AX;
	SI=FILEIN;
	ES=DS;
	CX=8;
	loop(CX){
		$LODSB
		IF(AL==0)||(AL=='.')BREAK;
		$STOSB
	}
	SIZEOUT=0;
	POZIN=0;
}

SAVEPOZ()
{
	ES=SEGOUT;
	DI=SIZEOUT;
	$XCHG	AH,AL
	DX = AX;
	AL>>=4;
	$CALL NEAR DOWN
	AL = DL;
	$CALL NEAR DOWN2
	AL = DH;
	AL>>=4;
	$CALL NEAR DOWN
	AL = DH;
DOWN2:
	AL &= 0x0F;
DOWN:
	IF( AL >= 10 ) AL +=7;
	AL += '0';
	$STOSB
	SIZEOUT=DI;
}

SAVETAB()
{
	ES=SEGOUT;
	DI=SIZEOUT;
	AL=0X09;
	$STOSB
	SIZEOUT=DI;
}

SAVEBYTE()
{
	ES=SEGOUT;
	DI=SIZEOUT;
	AH = AL;
	AL>>=4;
	$CALL NEAR DOWN
	AL = AH&0x0F;
DOWN:
	IF( AL >= 10 ) AL +=7;
	AL += '0';
	$STOSB
	SIZEOUT=DI;
}

GETADR()
{
	AL=KOD&0XE0>>5;
	BH=AL;
	BL=KOD2;
	ES=SEGMET;
}
