program disas48(input,output);

type str2=string[2];
     str4=string[4];

var i,code:byte;
    cs : string [17];
    ss : string [30];
    in_file :file;
    pocet,pocet_prec:integer;
    buffer:array[0..2047] of byte;
    oname,name : string[14];
    max,pc:integer;
    out_file:text;

function hexa_byte( b:byte ): str2;
var i,j:byte;
    s : str2;
begin
 s:='';
 i:=8;
 repeat
  i:=i-4;
  j:=b shr i and 15;
  if j<10 then s:=s+chr(j+48)
          else s:=s+chr(j+55);
 until i=0;
 hexa_byte:=s
end;

function hexa_adr( adr:integer) : str4;
var s: str4;
    i : byte;
begin
 s:='';
 i:=adr shr 8;
 s:=s+hexa_byte(i);
 i:=lo(adr);s:=s+hexa_byte(i);
 hexa_adr:=s;
end;

procedure reco(code : byte) ;
begin
 case code of
 $68 : begin i:=1;cs:='ADD A,R0';end;
 $69 : begin i:=1;cs:='ADD A,R1';end;
 $6A : begin i:=1;cs:='ADD A,R2';end;
 $6B : begin i:=1;cs:='ADD A,R3';end;
 $6C : begin i:=1;cs:='ADD A,R4';end;
 $6D : begin i:=1;cs:='ADD A,R5';end;
 $6E : begin i:=1;cs:='ADD A,R6';end;
 $6F : begin i:=1;cs:='ADD A,R7';end;
 $60 : begin i:=1;cs:='ADD A,@R0';end;
 $61 : begin i:=1;cs:='ADD A,@R1';end;
 $03 : begin i:=2;cs:='ADD A,#';end;
 $78 : begin i:=1;cs:='ADDC A,R0';end;
 $79 : begin i:=1;cs:='ADDC A,R1';end;
 $7A : begin i:=1;cs:='ADDC A,R2';end;
 $7B : begin i:=1;cs:='ADDC A,R3';end;
 $7C : begin i:=1;cs:='ADDC A,R4';end;
 $7D : begin i:=1;cs:='ADDC A,R5';end;
 $7E : begin i:=1;cs:='ADDC A,R6';end;
 $7F : begin i:=1;cs:='ADDC A,R7';end;
 $70 : begin i:=1;cs:='ADDC A,@R0';end;
 $71 : begin i:=1;cs:='ADDC A,@R1';end;
 $13 : begin i:=2;cs:='ADDC A,#';end;
 $58 : begin i:=1;cs:='ANL A,R0';end;
 $59 : begin i:=1;cs:='ANL A,R1';end;
 $5A : begin i:=1;cs:='ANL A,R2';end;
 $5B : begin i:=1;cs:='ANL A,R3';end;
 $5C : begin i:=1;cs:='ANL A,R4';end;
 $5D : begin i:=1;cs:='ANL A,R5';end;
 $5E : begin i:=1;cs:='ANL A,R6';end;
 $5F : begin i:=1;cs:='ANL A,R7';end;
 $50 : begin i:=1;cs:='ANL A,@R0';end;
 $51 : begin i:=1;cs:='ANL A,@R1';end;
 $53 : begin i:=2;cs:='ANL A,#';end;
 $98 : begin i:=2;cs:='ANL BUS,#';end;
 $99 : begin i:=2;cs:='ANL P1,#';end;
 $9A : begin i:=2;cs:='ANL P2,#';end;
 $9C : begin i:=1;cs:='ANLD P4,A';end;
 $9D : begin i:=1;cs:='ANLD P5,A';end;
 $9E : begin i:=1;cs:='ANLD P6,A';end;
 $9F : begin i:=1;cs:='ANLD P7,A';end;
 $14 : begin i:=2;cs:='CALL 0';end;
 $34 : begin i:=2;cs:='CALL 1';end;
 $54 : begin i:=2;cs:='CALL 2';end;
 $74 : begin i:=2;cs:='CALL 3';end;
 $94 : begin i:=2;cs:='CALL 4';end;
 $B4 : begin i:=2;cs:='CALL 5';end;
 $D4 : begin i:=2;cs:='CALL 6';end;
 $F4 : begin i:=2;cs:='CALL 7';end;
 $27 : begin i:=1;cs:='CLR A';end;
 $97 : begin i:=1;cs:='CLR C';end;
 $A5 : begin i:=1;cs:='CLR F1';end;
 $85 : begin i:=1;cs:='CLR F0';end;
 $37 : begin i:=1;cs:='CPL A';end;
 $A7 : begin i:=1;cs:='CPL C';end;
 $95 : begin i:=1;cs:='CPL F0';end;
 $B5 : begin i:=1;cs:='CPL F1';end;
 $57 : begin i:=1;cs:='DA A';end;
 $07 : begin i:=1;cs:='DEC A';end;
 $C8 : begin i:=1;cs:='DEC R0';end;
 $C9 : begin i:=1;cs:='DEC R1';end;
 $CA : begin i:=1;cs:='DEC R2';end;
 $CB : begin i:=1;cs:='DEC R3';end;
 $CC : begin i:=1;cs:='DEC R4';end;
 $CD : begin i:=1;cs:='DEC R5';end;
 $CE : begin i:=1;cs:='DEC R6';end;
 $CF : begin i:=1;cs:='DEC R7';end;
 $15 : begin i:=1;cs:='DIS I';end;
 $35 : begin i:=1;cs:='DIS TCNTI';end;
 $E8 : begin i:=2;cs:='DJNZ R0,';end;
 $E9 : begin i:=2;cs:='DJNZ R1,';end;
 $EA : begin i:=2;cs:='DJNZ R2,';end;
 $EB : begin i:=2;cs:='DJNZ R3,';end;
 $EC : begin i:=2;cs:='DJNZ R4,';end;
 $ED : begin i:=2;cs:='DJNZ R5,';end;
 $EE : begin i:=2;cs:='DJNZ R6,';end;
 $EF : begin i:=2;cs:='DJNZ R7,';end;
 $05 : begin i:=1;cs:='EN I';end;
 $25 : begin i:=1;cs:='EN TCNTI';end;
 $75 : begin i:=1;cs:='ENT0 CLK';end;
 $09 : begin i:=1;cs:='IN A,P0';end;
 $0A : begin i:=1;cs:='IN A,P1';end;
 $17 : begin i:=1;cs:='INC A';end;
 $18 : begin i:=1;cs:='INC R0';end;
 $19 : begin i:=1;cs:='INC R1';end;
 $1A : begin i:=1;cs:='INC R2';end;
 $1B : begin i:=1;cs:='INC R3';end;
 $1C : begin i:=1;cs:='INC R4';end;
 $1D : begin i:=1;cs:='INC R5';end;
 $1E : begin i:=1;cs:='INC R6';end;
 $1F : begin i:=1;cs:='INC R7';end;
 $10 : begin i:=1;cs:='INC @R0';end;
 $11 : begin i:=1;cs:='INC @R1';end;
 $08 : begin i:=1;cs:='INS A,BUS';end;
 $12 : begin i:=2;cs:='JB0 ';end;
 $32 : begin i:=2;cs:='JB1 ';end;
 $52 : begin i:=2;cs:='JB2 ';end;
 $72 : begin i:=2;cs:='JB3 ';end;
 $92 : begin i:=2;cs:='JB4 ';end;
 $B2 : begin i:=2;cs:='JB5 ';end;
 $D2 : begin i:=2;cs:='JB6 ';end;
 $F2 : begin i:=2;cs:='JB7 ';end;
 $F6 : begin i:=2;cs:='JC ';end;
 $B6 : begin i:=2;cs:='JF0 ';end;
 $76 : begin i:=2;cs:='JF1 ';end;
 $04 : begin i:=2;cs:='JMP 0';end;
 $24 : begin i:=2;cs:='JMP 1';end;
 $44 : begin i:=2;cs:='JMP 2';end;
 $64 : begin i:=2;cs:='JMP 3';end;
 $84 : begin i:=2;cs:='JMP 4';end;
 $A4 : begin i:=2;cs:='JMP 5';end;
 $C4 : begin i:=2;cs:='JMP 6';end;
 $E4 : begin i:=2;cs:='JMP 7';end;
 $B3 : begin i:=1;cs:='JMPP @A';end;
 $E6 : begin i:=2;cs:='JNC ';end;
 $86 : begin i:=2;cs:='JNI ';end;
 $26 : begin i:=2;cs:='JNT0 ';end;
 $46 : begin i:=2;cs:='JNT1 ';end;
 $96 : begin i:=2;cs:='JNZ ';end;
 $16 : begin i:=2;cs:='JTF ';end;
 $36 : begin i:=2;cs:='JT0 ';end;
 $56 : begin i:=2;cs:='JT1 ';end;
 $C6 : begin i:=2;cs:='JZ ';end;
 $23 : begin i:=2;cs:='MOV A,#';end;
 $C7 : begin i:=1;cs:='MOV A,PSW';end;
 $F8 : begin i:=1;cs:='MOV A,R0';end;
 $F9 : begin i:=1;cs:='MOV A,R1';end;
 $FA : begin i:=1;cs:='MOV A,R2';end;
 $FB : begin i:=1;cs:='MOV A,R3';end;
 $FC : begin i:=1;cs:='MOV A,R4';end;
 $FD : begin i:=1;cs:='MOV A,R5';end;
 $FE : begin i:=1;cs:='MOV A,R6';end;
 $FF : begin i:=1;cs:='MOV A,R7';end;
 $F0 : begin i:=1;cs:='MOV A,@R0';end;
 $F1 : begin i:=1;cs:='MOV A,@R1';end;
 $42 : begin i:=1;cs:='MOV A,T';end;
 $D7 : begin i:=1;cs:='MOV PSW,A';end;
 $A8 : begin i:=1;cs:='MOV R0,A';end;
 $A9 : begin i:=1;cs:='MOV R1,A';end;
 $AA : begin i:=1;cs:='MOV R2,A';end;
 $AB : begin i:=1;cs:='MOV R3,A';end;
 $AC : begin i:=1;cs:='MOV R4,A';end;
 $AD : begin i:=1;cs:='MOV R5,A';end;
 $AE : begin i:=1;cs:='MOV R6,A';end;
 $AF : begin i:=1;cs:='MOV R7,A';end;
 $B8 : begin i:=2;cs:='MOV R0,#';end;
 $B9 : begin i:=2;cs:='MOV R1,#';end;
 $BA : begin i:=2;cs:='MOV R2,#';end;
 $BB : begin i:=2;cs:='MOV R3,#';end;
 $BC : begin i:=2;cs:='MOV R4,#';end;
 $BD : begin i:=2;cs:='MOV R5,#';end;
 $BE : begin i:=2;cs:='MOV R6,#';end;
 $BF : begin i:=2;cs:='MOV R7,#';end;
 $A0 : begin i:=1;cs:='MOV @R0,A';end;
 $A1 : begin i:=1;cs:='MOV @R1,A';end;
 $B0 : begin i:=2;cs:='MOV @R0,#';end;
 $B1 : begin i:=2;cs:='MOV @R1,#';end;
 $62 : begin i:=1;cs:='MOV T,A';end;
 $0C : begin i:=1;cs:='MOVD A,P4';end;
 $0D : begin i:=1;cs:='MOVD A,P5';end;
 $0E : begin i:=1;cs:='MOVD A,P6';end;
 $0F : begin i:=1;cs:='MOVD A,P7';end;
 $3C : begin i:=1;cs:='MOVD P4,A';end;
 $3D : begin i:=1;cs:='MOVD P5,A';end;
 $3E : begin i:=1;cs:='MOVD P6,A';end;
 $3F : begin i:=1;cs:='MOVD P7,A';end;
 $A3 : begin i:=1;cs:='MOVP A,@A';end;
 $E3 : begin i:=1;cs:='MOVP3 A,@A';end;
 $80 : begin i:=1;cs:='MOVX A,@R0';end;
 $81 : begin i:=1;cs:='MOVX A,@R1';end;
 $90 : begin i:=1;cs:='MOVX @R0,A';end;
 $91 : begin i:=1;cs:='MOVX @R1,A';end;
 $48 : begin i:=1;cs:='ORL A,R0';end;
 $49 : begin i:=1;cs:='ORL A,R1';end;
 $4A : begin i:=1;cs:='ORL A,R2';end;
 $4B : begin i:=1;cs:='ORL A,R3';end;
 $4C : begin i:=1;cs:='ORL A,R4';end;
 $4D : begin i:=1;cs:='ORL A,R5';end;
 $4E : begin i:=1;cs:='ORL A,R6';end;
 $4F : begin i:=1;cs:='ORL A,R7';end;
 $00 : begin i:=1;cs:='NOP';end;
 $40 : begin i:=1;cs:='ORL A,@R0';end;
 $41 : begin i:=1;cs:='ORL A,@R1';end;
 $43 : begin i:=2;cs:='ORL A,#';end;
 $88 : begin i:=2;cs:='ORL BUS,#';end;
 $89 : begin i:=2;cs:='ORL P1,#';end;
 $8A : begin i:=2;cs:='ORL P2,#';end;
 $8C : begin i:=1;cs:='ORLD P4,A';end;
 $8D : begin i:=1;cs:='ORLD P5,A';end;
 $8E : begin i:=1;cs:='ORLD P6,A';end;
 $8F : begin i:=1;cs:='ORLD P7,A';end;
 $02 : begin i:=1;cs:='OUTL BUS,A';end;
 $39 : begin i:=1;cs:='OUTL P1,A';end;
 $3A : begin i:=1;cs:='OUTL P2,A';end;
 $83 : begin i:=1;cs:='RET';end;
 $93 : begin i:=1;cs:='RETR';end;
 $E7 : begin i:=1;cs:='RL A';end;
 $F7 : begin i:=1;cs:='RLC A';end;
 $77 : begin i:=1;cs:='RR A';end;
 $67 : begin i:=1;cs:='RRC A';end;
 $E5 : begin i:=1;cs:='SEL MB0';end;
 $F5 : begin i:=1;cs:='SEL MB1';end;
 $C5 : begin i:=1;cs:='SEL RB0';end;
 $D5 : begin i:=1;cs:='SEL RB1';end;
 $65 : begin i:=1;cs:='STOP TCNT';end;
 $45 : begin i:=1;cs:='STRT CNT';end;
 $55 : begin i:=1;cs:='STRT T';end;
 $47 : begin i:=1;cs:='SWAP A';end;
 $28 : begin i:=1;cs:='XCH A,R0';end;
 $29 : begin i:=1;cs:='XCH A,R1';end;
 $2A : begin i:=1;cs:='XCH A,R2';end;
 $2B : begin i:=1;cs:='XCH A,R3';end;
 $2C : begin i:=1;cs:='XCH A,R4';end;
 $2D : begin i:=1;cs:='XCH A,R5';end;
 $2E : begin i:=1;cs:='XCH A,R6';end;
 $2F : begin i:=1;cs:='XCH A,R7';end;
 $20 : begin i:=1;cs:='XCH A,@R0';end;
 $21 : begin i:=1;cs:='XCH A,@R1';end;
 $30 : begin i:=1;cs:='XCHD A,@R0';end;
 $31 : begin i:=1;cs:='XCHD A,@R1';end;
 $D8 : begin i:=1;cs:='XRL A,R0';end;
 $D9 : begin i:=1;cs:='XRL A,R1';end;
 $DA : begin i:=1;cs:='XRL A,R2';end;
 $DB : begin i:=1;cs:='XRL A,R3';end;
 $DC : begin i:=1;cs:='XRL A,R4';end;
 $DD : begin i:=1;cs:='XRL A,R5';end;
 $DE : begin i:=1;cs:='XRL A,R6';end;
 $DF : begin i:=1;cs:='XRL A,R7';end;
 $D0 : begin i:=1;cs:='XRL A,@R0';end;
 $D1 : begin i:=1;cs:='XRL A,@R1';end;
 $D3 : begin i:=2;cs:='XRL A,#';end;
 else  begin i:=1;cs:='DB '+hexa_byte(code) end;
 end;
end;

begin
 clrscr;
 gotoxy(1,3);
 writeln('DIS 48  v1.0  II.87 ');
 writeln;
 write('input file name:');
 readln(name);
 write('output file name:');
 readln(oname);
 assign(in_file,name);
 reset(in_file);
 assign(out_file,oname);
 rewrite(out_file);
 blockread(in_file,buffer,16,pocet_prec);
 max:=128*pocet_prec-1;
 pc:=0;
 repeat
  reco(buffer[pc]);if i=2 then cs:=cs+hexa_byte(buffer[pc+1]);
  ss:=hexa_byte(buffer[pc]);
  if i=1 then  ss:=ss+'      '+cs
         else  ss:=ss+' '+hexa_byte(buffer[pc+1])+'   '+cs;
  writeln(out_file,hexa_adr(pc),': ',ss);
  pc:=pc+i;
 until pc>=max;
 close(out_file);
end.
