#include <stdio.h>

char *menom_array[256] =
{
     "NOP","X","OUTL BUS,A","ADD A,","JMP 00","EN I","X","DEC A",
     "INS A,BUS","IN A,P1","IN A,P2","X","MOVD A,P4","MOVD A,P5",
     "MOVD A,P6","MOVD A,P7",
     "INC @ R0","INC @ R1","JB0,","ADDC A,","CALL 00","DIS I","JTF ","INC A",
     "INC R0","INC R1","INC R2","INC R3","INC R4","INC R5","INC R6","INC R7",
     "XCHA,@ R0","XCHA,@ R1","X","MOV A,","JMP 01","EN TCNTI","JNT0,","CLR A",
     "XCH A,R0","XCH A,R1","XCH A,R2","XCH A,R3","XCH A,R4","XCH A,R5","XCH A,R6","XCH A,R7",
     "XCHD A,@ R0","XCHD A,@ R1","JB1,","X","CALL 01","DIS TCNTI","JT0,","CPL A",
     "X","OUTL P1,A","OUTL P2,A","X","MOVD P4,A","MOVD P5,A","MOVD P6,A","MOVD P7,A",
     "ORL A,@ R0","ORL A,@ R1","MOV A,T","ORL A,","JMP 02","STRT CNT","JNT1,","SWAP A",
     "ORL A,R0","ORL A,R1","ORL A,R2","ORL A,R3","ORL A,R4","ORL A,R5","ORL A,R6","ORL A,R7",
     "ANL A,@ R0","ANL A,@ R1","JB2,","ANL A,","CALL 02","STRT T","JT1,","DAA A",
     "ANL A,R0","ANL A,R1","ANL A,R2","ANL A,R3","ANL A,R4","ANL A,R5","ANL A,R6","ANL A,R7",
     "ADD A,@ R0","ADD A,@ R1","MOV T,A","X","JMP 03","STOP TCNT","X","RRC A",
     "ADD A,R0","ADD A,R1","ADD A,R2","ADD A,R3","ADD A,R4","ADD A,R5","ADD A,R6","ADD A,R7",
     "ADC A,@ R0","ADC A,@ R1","JB3,","X","CALL 03","ENTO CLK","JF1,","RR A",
     "ADC A,R0","ADC A,R1","ADC A,R2","ADC A,R3","ADC A,R4","ADC A,R5","ADC A,R6","ADC A,R7",
     "MOVX A,@ R0","MOVX A,@ R1","X","RET","JMP 04","CLR F0","JNI,","X",
     "ORL BUS,","ORL P1,","ORL P2,","X","ORLD P4,A","ORLD P5,A","ORLD P6,A","ORLD P7,A",
     "MOVX @ R0,A","MOVX @ R1,A","JB4,","RETR","CALL 04","CPL F0","JNZ,","CLR C",
     "X","ANL P1,","ANL P2,","X","ANLD P4,A","ANLD P5,A","ANLD P6,A","ANLD P7,A",
     "MOV @ R0,A","MOV @ R1,A","X","MOVP A,@ A","JMP 05","CLR F1","X","CPL C",
     "MOV R0,A","MOV R1,A","MOV R2,A","MOV R3,A","MOV R4,A","MOV R5,A","MOV R6,A","MOV R7,A",
     "MOV @ R0,","MOV @ R1,","JB5 ","JMPP @ A","CALL 05","CPL F1","JF0 ","X",
     "MOV R0,","MOV R1,","MOV R2,","MOV R3,","MOV R4,","MOV R5,","MOV R6,","MOV R7,",
     "X","X","X","X","JMP 06","SEL RB0","JZ ","MOV A,PSW",
     "DEC R0","DEC R1","DEC R2","DEC R3","DEC R4","DEC R5","DEC R6","DEC R7",
     "XRL A,@ R0","XRL A,@ R1","JB6 ","XRL A,","CALL 06","SEL RB1","X","MOV PSW,A",
     "XRL A,R0","XRL A,R1","XRL A,R2","XRL A,R3","XRL A,R4","XRL A,R5","XRL A,R6","XRL A,R7",
     "X","X","X","MOVP3 A,@ A","JMP 07","SEL MB0","JNC ","RL A",
     "DJNZ R0, ","DJNZ R1, ","DJNZ R2, ","DJNZ R3, ","DJNZ R4, ","DJNZ R5, ","DJNZ R6, ","DJNZ R7, ",
     "MOV A,@ R0","MOV A,@ R1","JB7 ","X","CALL 07","SEL MB1","JC ","RLC A",
     "MOV A,R0","MOV A,R1","MOV A,R2","MOV A,R3","MOV A,R4","MOV A,R5","MOV A,R6","MOV A,R7"
};

int count_array[256] =
{
     0,2,0,1,1,0,2,0,0,0,0,2,0,0,0,0,
     0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,
     0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,
     0,0,1,2,1,0,1,0,2,0,0,2,0,0,0,0,
     0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,
     0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,
     0,0,0,2,1,0,2,0,0,0,0,0,0,0,0,0,
     0,0,1,2,1,0,1,0,0,0,0,0,0,0,0,0,
     0,0,2,0,1,0,1,2,1,1,1,2,0,0,0,0,
     0,0,1,0,1,0,1,0,2,1,1,2,0,0,0,0,
     0,0,2,0,1,0,2,0,0,0,0,0,0,0,0,0,
     1,1,1,0,1,0,1,2,1,1,1,1,1,1,1,1,
     2,2,2,2,1,0,1,0,0,0,0,0,0,0,0,0,
     0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,
     2,2,2,0,1,0,1,0,1,1,1,1,1,1,1,1,
     0,0,1,2,1,0,1,0,0,0,0,0,0,0,0,0
};

int main(int argc, char** argv)
{
	FILE* infile;
	unsigned char data, data1, data2;
	int offset=0, len, d;

	
	if (argc!=2) return -1;
	infile = fopen(argv[1], "r");
	
	while ((d=fgetc(infile))!=EOF)
	{
		data = (unsigned char)d;
		len = count_array[data];
		if (len == 0)
		{
			printf("%.4X: %.2X         %s\n", offset, data, menom_array[data]);
			offset++;
		}
		else if (len == 1)
		{
			data1=fgetc(infile);
			printf("%.4X: %.2X  %.2X     %s%.2X\n", offset, data, data1, menom_array[data], data1);
			offset+=2;
		}
		else if (len == 2)
		{
			printf("%.4X: %.2X       ILLEGAL\n", offset, data);
			offset++;
		}			
		
	}
}
