www.pudn.com > DBG8051.rar > Dbgasm.pas


unit DbgAsm; 
 
interface 
 
uses WinTypes, DbgZmTypy; 
 
function  BtoREG(co:byte):string; 
function  Deasm(adr:word):string; 
function  JestRej(co:string):byte; 
function  JestBit(co:string):byte; 
function  Reasm(ad:word;co:KodRozk):PoAsm; 
procedure BajtyWstaw(Okno:HWnd;sel,adres,max:word;var adre:word); 
procedure WypelnijInstr(uchwyt:HWnd;adrptr:pointer); 
 
const TabIleCykli:array[0..255] of byte=( 
  1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1, 2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1, 
  2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1, 2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1, 
  2,2,1,2,1,1,1,1,1,1,1,1,1,1,1,1, 2,2,1,2,1,1,1,1,1,1,1,1,1,1,1,1, 
  2,2,1,2,1,1,1,1,1,1,1,1,1,1,1,1, 2,2,2,2,1,2,1,1,1,1,1,1,1,1,1,1, 
  2,2,2,2,4,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1, 
  2,2,1,2,4,1,2,2,2,2,2,2,2,2,2,2, 2,2,1,1,2,2,2,2,2,2,2,2,2,2,2,2, 
  2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 2,2,1,1,1,2,1,1,2,2,2,2,2,2,2,2, 
  2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1, 2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1); 
 
const TabIleBajtow:array[0..255] of byte=( 
  1,2,3,1,1,2,1,1,1,1,1,1,1,1,1,1, 3,2,3,1,1,2,1,1,1,1,1,1,1,1,1,1, 
  3,2,1,1,2,2,1,1,1,1,1,1,1,1,1,1, 3,2,1,1,2,2,1,1,1,1,1,1,1,1,1,1, 
  2,2,2,3,2,2,1,1,1,1,1,1,1,1,1,1, 2,2,2,3,2,2,1,1,1,1,1,1,1,1,1,1, 
  2,2,2,3,2,2,1,1,1,1,1,1,1,1,1,1, 2,2,2,1,2,3,2,2,2,2,2,2,2,2,2,2, 
  2,2,2,1,1,3,2,2,2,2,2,2,2,2,2,2, 3,2,2,1,2,2,1,1,1,1,1,1,1,1,1,1, 
  2,2,2,1,1,1,2,2,2,2,2,2,2,2,2,2, 2,2,2,1,3,3,3,3,3,3,3,3,3,3,3,3, 
  2,2,2,1,1,2,1,1,1,1,1,1,1,1,1,1, 2,2,2,1,1,3,1,1,2,2,2,2,2,2,2,2, 
  1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1, 1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1); 
 
implementation 
 
uses WinProcs, Strings, BWCC; 
 
{**************************************************} 
{ POCZĄTEK KODU PROCEDUR ASSEMBLERA I DEASSEMBLERA } 
{**************************************************} 
 
const Bity:array[0..255] of string[5]=( 
'20H.0','20H.1','20H.2','20H.3','20H.4','20H.5','20H.6','20H.7', 
'21H.0','21H.1','21H.2','21H.3','21H.4','21H.5','21H.6','21H.7', 
'22H.0','22H.1','22H.2','22H.3','22H.4','22H.5','22H.6','22H.7', 
'23H.0','23H.1','23H.2','23H.3','23H.4','23H.5','23H.6','23H.7', 
'24H.0','24H.1','24H.2','24H.3','24H.4','24H.5','24H.6','24H.7', 
'25H.0','25H.1','25H.2','25H.3','25H.4','25H.5','25H.6','25H.7', 
'26H.0','26H.1','26H.2','26H.3','26H.4','26H.5','26H.6','26H.7', 
'27H.0','27H.1','27H.2','27H.3','27H.4','27H.5','27H.6','27H.7', 
'28H.0','28H.1','28H.2','28H.3','28H.4','28H.5','28H.6','28H.7', 
'29H.0','29H.1','29H.2','29H.3','29H.4','29H.5','29H.6','29H.7', 
'2AH.0','2AH.1','2AH.2','2AH.3','2AH.4','2AH.5','2AH.6','2AH.7', 
'2BH.0','2BH.1','2BH.2','2BH.3','2BH.4','2BH.5','2BH.6','2BH.7', 
'2CH.0','2CH.1','2CH.2','2CH.3','2CH.4','2CH.5','2CH.6','2CH.7', 
'2DH.0','2DH.1','2DH.2','2DH.3','2DH.4','2DH.5','2DH.6','2DH.7', 
'2EH.0','2EH.1','2EH.2','2EH.3','2EH.4','2EH.5','2EH.6','2EH.7', 
'2FH.0','2FH.1','2FH.2','2FH.3','2FH.4','2FH.5','2FH.6','2FH.7', 
'P0.0','P0.1','P0.2','P0.3','P0.4','P0.5','P0.6','P0.7', 
'IT0','IE0','IT1','IE1','TR0','TF0','TR1','TF1', 
'P1.0','P1.1','P1.2','P1.3','P1.4','P1.5','P1.6','P1.7', 
'RI','TI','RB8','TB8','REN','SM2','SM1','SM0', 
'P2.0','P2.1','P2.2','P2.3','P2.4','P2.5','P2.6','P2.7', 
'EX0','ET0','EX1','ET1','ES','IE.5','IE.6','EA', 
'P3.0','P3.1','P3.2','P3.3','P3.4','P3.5','P3.6','P3.7', 
'PX0','PT0','PX1','PT1','PS','IP.5','IP.6','IP.7', 
'0C0H.0','0C0H.1','0C0H.2','0C0H.3','0C0H.4','0C0H.5','0C0H.6','0C0H.7', 
'0C8H.0','0C8H.1','0C8H.2','0C8H.3','0C8H.4','0C8H.5','0C8H.6','0C8H.7', 
'P','PSW.1','OV','RS0','RS1','F0','AC','CY', 
'0D8H.0','0D8H.1','0D8H.2','0D8H.3','0D8H.4','0D8H.5','0D8H.6','0D8H.7', 
'ACC.0','ACC.1','ACC.2','ACC.3','ACC.4','ACC.5','ACC.6','ACC.7', 
'0E8H.0','0E8H.1','0E8H.2','0E8H.3','0E8H.4','0E8H.5','0E8H.6','0E8H.7', 
'B.0','B.1','B.2','B.3','B.4','B.5','B.6','B.7', 
'0F8H.0','0F8H.1','0F8H.2','0F8H.3','0F8H.4','0F8H.5','0F8H.6','0F8H.7'); 
 
const Rej:array[128..255] of string[5]=( 
'P0','SP','DPL','DPH','','','','PCON','TCON','TMOD','TL0','TL1','TH0','TH1','','', 
'P1','','','','','','','','SCON','SBUF','','','','','','', 
'P2','','','','','','','','IE','','','','','','','', 
'P3','','','','','','','','IP','','','','','','','', 
'','','','','','','','','','','','','','','','', 
'PSW','','','','','','','','','','','','','','','', 
'ACC','','','','','','','','','','','','','','','', 
'B','','','','','','','','','','','','','','',''); 
 
{ Oznaczenia specjalne: ~ - rejestr         ^ - adres 12-bitowy   | - adres 16-bitowy       } 
{                       _ - liczba 8-bitowa * - bit               % - przesunięcie 8-bitowe } 
 
const TabASM:array[0..255] of string[14]=( 
'NOP','AJMP ^','LJMP |','RR A','INC A','INC ~','INC @R0','INC @R1','INC R0','INC R1','INC R2', 
'INC R3','INC R4','INC R5','INC R6','INC R7','','ACALL ^','LCALL |','RRC A','DEC A','DEC ~', 
'DEC @R0','DEC @R1','DEC R0','DEC R1','DEC R2','DEC R3','DEC R4','DEC R5','DEC R6','DEC R7','', 
'AJMP ^','RET','RL A','ADD A,#_','ADD A,~','ADD A,@R0','ADD A,@R1','ADD A,R0','ADD A,R1', 
'ADD A,R2','ADD A,R3','ADD A,R4','ADD A,R5','ADD A,R6','ADD A,R7','','ACALL ^','RETI','RLC A', 
'ADDC A,#_','ADDC A,~','ADDC A,@R0','ADDC A,@R1','ADDC A,R0','ADDC A,R1','ADDC A,R2', 
'ADDC A,R3','ADDC A,R4','ADDC A,R5','ADDC A,R6','ADDC A,R7','JC %','AJMP ^','ORL ~,A','', 
'ORL A,#_','ORL A,~','ORL A,@R0','ORL A,@R1','ORL A,R0','ORL A,R1','ORL A,R2','ORL A,R3', 
'ORL A,R4','ORL A,R5','ORL A,R6','ORL A,R7','JNC %','ACALL ^','ANL ~,A','','ANL A,#_','ANL A,~', 
'ANL A,@R0','ANL A,@R1','ANL A,R0','ANL A,R1','ANL A,R2','ANL A,R3','ANL A,R4','ANL A,R5', 
'ANL A,R6','ANL A,R7','JZ %','AJMP ^','XRL ~,A','','XRL A,#_','XRL A,~','XRL A,@R0','XRL A,@R1', 
'XRL A,R0','XRL A,R1','XRL A,R2','XRL A,R3','XRL A,R4','XRL A,R5','XRL A,R6','XRL A,R7','JNZ %', 
'ACALL ^','ORL C,*','JMP @A+DPTR','MOV A,#_','','MOV @R0,#_','MOV @R1,#_','MOV R0,#_', 
'MOV R1,#_','MOV R2,#_','MOV R3,#_','MOV R4,#_','MOV R5,#_','MOV R6,#_','MOV R7,#_','SJMP %', 
'AJMP ^','ANL C,*','MOVC A,@A+PC','DIV AB','','MOV ~,@R0','MOV ~,@R1','MOV ~,R0','MOV ~,R1', 
'MOV ~,R2','MOV ~,R3','MOV ~,R4','MOV ~,R5','MOV ~,R6','MOV ~,R7','MOV DPTR,#|','ACALL ^', 
'MOV *,C','MOVC A,@A+DPTR','SUBB A,#_','SUBB A,~','SUBB A,@R0','SUBB A,@R1','SUBB A,R0', 
'SUBB A,R1','SUBB A,R2','SUBB A,R3','SUBB A,R4','SUBB A,R5','SUBB A,R6','SUBB A,R7','ORL C,/*', 
'AJMP ^','MOV C,*','INC DPTR','MUL AB','???','MOV @R0,~','MOV @R1,~','MOV R0,~','MOV R1,~', 
'MOV R2,~','MOV R3,~','MOV R4,~','MOV R5,~','MOV R6,~','MOV R7,~','ANL C,/*','ACALL ^','CPL *', 
'CPL C','','','','','','','','','','','','','PUSH ~','AJMP ^','CLR *','CLR C','SWAP A', 
'XCH A,~','XCH A,@R0','XCH A,@R1','XCH A,R0','XCH A,R1','XCH A,R2','XCH A,R3','XCH A,R4', 
'XCH A,R5','XCH A,R6','XCH A,R7','POP ~','ACALL ^','SETB *','SETB C','DA A','','XCHD A,@R0', 
'XCHD A,@R1','DJNZ R0,%','DJNZ R1,%','DJNZ R2,%','DJNZ R3,%','DJNZ R4,%','DJNZ R5,%', 
'DJNZ R6,%','DJNZ R7,%','MOVX A,@DPTR','AJMP ^','MOVX A,@R0','MOVX A,@R1','CLR A','MOV A,~', 
'MOV A,@R0','MOV A,@R1','MOV A,R0','MOV A,R1','MOV A,R2','MOV A,R3','MOV A,R4','MOV A,R5', 
'MOV A,R6','MOV A,R7','MOVX @DPTR,A','ACALL ^','MOVX @R0,A','MOVX @R1,A','CPL A','MOV ~,A', 
'MOV @R0,A','MOV @R1,A','MOV R0,A','MOV R1,A','MOV R2,A','MOV R3,A','MOV R4,A','MOV R5,A', 
'MOV R6,A','MOV R7,A'); 
 
function BtoREG(co:byte):string; 
var t:string[5]; 
begin 
  if co<128 then BtoREG:=BtoHEX0(co)+'H' else 
  begin 
    t:=Rej[co]; 
    if t='' then BtoREG:=BtoHEX0(co)+'H' else BtoREG:=t; 
  end; 
end; 
 
function Deasm(adr:word):string; 
var 
  a,b,p:byte; 
  ad:word; 
  t:string[20]; 
begin 
  a:=Mem[selROM:adr]; 
  b:=Mem[selROM:adr+1]; 
  t:=TabASM[a]; 
  if t<>'' then 
  begin 
    p:=Pos(' ',t); 
    if p<>0 then t[p]:=#9; 
    p:=Pos('^',t); 
    if p<>0 then 
    begin 
      ad:=256*((Hi(adr+2) and 248) or (a shr 5))+b; 
      Delete(t,p,1); 
      Insert(WtoHEX(ad)+'H',t,p); 
      Deasm:=char(TabIleBajtow[a])+t; 
      Exit; 
    end; 
    p:=Pos('|',t); 
    if p<>0 then 
    begin 
      ad:=256*b+Mem[selROM:adr+2]; 
      Delete(t,p,1); 
      Insert(WtoHEX(ad)+'H',t,p); 
      Deasm:=char(TabIleBajtow[a])+t; 
      Exit; 
    end; 
    p:=Pos('~',t); 
    if p<>0 then 
    begin 
      Delete(t,p,1); 
      Insert(BtoREG(b),t,p); 
      Deasm:=char(TabIleBajtow[a])+t; 
      Exit; 
    end; 
    p:=Pos('*',t); 
    if p<>0 then 
    begin 
      Delete(t,p,1); 
      Insert(Bity[b],t,p); 
      Deasm:=char(TabIleBajtow[a])+t; 
      Exit; 
    end; 
    p:=Pos('_',t); 
    if p<>0 then 
    begin 
      Delete(t,p,1); 
      Insert(BtoHEX0(b)+'H',t,p); 
      Deasm:=char(TabIleBajtow[a])+t; 
      Exit; 
    end; 
    p:=Pos('%',t); 
    if p<>0 then 
    begin 
      Delete(t,p,1); 
      Insert(WtoHEX(adr+2+shortint(b))+'H',t,p); 
      Deasm:=char(TabIleBajtow[a])+t; 
      Exit; 
    end; 
    Deasm:=char(TabIleBajtow[a])+t; 
    Exit; 
  end; 
  Deasm:=#1'???';  {na wypadek gdybyśmy nie trafili w żadne z poniższych} 
  case a of 
    $10: Deasm:=#3'JBC'#9+Bity[b]+','+WtoHEX(adr+3+shortint(Mem[selROM:adr+2]))+'H'; 
    $20: Deasm:=#3'JB'#9+Bity[b]+','+WtoHEX(adr+3+shortint(Mem[selROM:adr+2]))+'H'; 
    $30: Deasm:=#3'JNB'#9+Bity[b]+','+WtoHEX(adr+3+shortint(Mem[selROM:adr+2]))+'H'; 
    $43: Deasm:=#3'ORL'#9+BtoREG(b)+',#'+BtoHEX0(Mem[selROM:adr+2])+'H'; 
    $53: Deasm:=#3'ANL'#9+BtoREG(b)+',#'+BtoHEX0(Mem[selROM:adr+2])+'H'; 
    $63: Deasm:=#3'XRL'#9+BtoREG(b)+',#'+BtoHEX0(Mem[selROM:adr+2])+'H'; 
    $75: Deasm:=#3'MOV'#9+BtoREG(b)+',#'+BtoHEX0(Mem[selROM:adr+2])+'H'; 
    $85: Deasm:=#3'MOV'#9+BtoREG(Mem[selROM:adr+2])+','+BtoREG(b); 
    $B4: Deasm:=#3'CJNE'#9'A,#'+BtoHEX0(b)+'H,'+WtoHEX(adr+3+shortint(Mem[selROM:adr+2]))+'H'; 
    $B5: Deasm:=#3'CJNE'#9'A,'+BtoREG(b)+','+WtoHEX(adr+3+shortint(Mem[selROM:adr+2]))+'H'; 
    $B6,$B7: Deasm:=#3'CJNE'#9'@R'+Chr(48+(a and 1))+',#'+BtoHEX0(b)+'H,'+ 
             WtoHEX(adr+3+shortint(Mem[selROM:adr+2]))+'H'; 
    $B8..$BF: Deasm:=#3'CJNE'#9'R'+Chr(48+(a and 7))+',#'+BtoHEX0(b)+'H,'+ 
              WtoHEX(adr+3+shortint(Mem[selROM:adr+2]))+'H'; 
    $D5: Deasm:=#3'DJNZ'#9+BtoREG(b)+','+WtoHEX(adr+3+shortint(Mem[selROM:adr+2]))+'H'; 
  end; 
end; 
 
function JestRej(co:string):byte; 
var 
  x:byte; 
  code:integer; 
begin 
  JestRej:=255; 
  for x:=128 to 254 do 
    if co=Rej[x] then 
    begin 
      JestRej:=x; 
      Exit; 
    end; 
  if UpCase(co[Length(co)])='H' then Val('$'+Copy(co,1,Length(co)-1),x,code) else Val(co,x,code); 
  if code=0 then JestRej:=x; 
end; 
 
function JestBit(co:string):byte; 
var x:byte; 
begin 
  JestBit:=255; 
  for x:=0 to 254 do 
    if co=Bity[x] then 
    begin 
      JestBit:=x; 
      break; 
    end; 
end; 
 
function Reasm(ad:word;co:KodRozk):PoAsm; 
var 
  tmp,tmp1:string[30]; 
  mn:string[5]; 
  n,x,num:byte; 
  rel:shortint; 
  tam:word; 
  code:integer; 
begin 
  tmp:=co; 
  for n:=1 to Length(tmp) do tmp[n]:=UpCase(tmp[n]); 
  while tmp[1]=' ' do Delete(tmp,1,1); 
  while tmp[Length(tmp)]=' ' do Delete(tmp,Length(tmp),1); 
  if tmp='DB' then 
  begin 
    BajtyWstaw(OknoAktualne,selROM,ad,$FFFF,tam); 
    Reasm:='GOGO'+char(Lo(tam))+char(Hi(tam)); 
    Exit; 
  end; 
  if Length(tmp)<3 then Exit; 
  Reasm:=''; 
  for n:=0 to 255 do 
    if TabASM[n]=tmp then 
    begin 
      if (Pos('~',tmp)<>0) or (Pos('^',tmp)<>0) or (Pos('|',tmp)<>0) or 
         (Pos('_',tmp)<>0) or (Pos('%',tmp)<>0) or (Pos('*',tmp)<>0) then Exit; 
      Reasm:=char(n); 
      Exit; 
    end; 
  if Length(tmp)<5 then Exit; 
  n:=Pos(' ',tmp); 
  if n=0 then Exit; 
  mn:=Copy(tmp,1,n-1); 
  Delete(tmp,1,n); 
  repeat 
    n:=Pos(' ',tmp); 
    if n<>0 then Delete(tmp,n,1); 
  until n=0; 
  if SymbROM^.Count>0 then 
    for tam:=0 to SymbROM^.Count-1 do 
    begin 
      tmp1:=UpCaseStr(Copy(StrPas(SymbROM^.At(tam)),5,255)); 
      n:=Pos(tmp1,UpCaseStr(tmp)); 
      if n>0 then 
      begin 
        Delete(tmp,n,Length(tmp1)+1); 
        Insert(UpCaseStr(Copy(StrPas(SymbROM^.At(tam)),1,4)),tmp,n); 
        break; 
      end; 
    end; 
  if (mn='ACALL') or (mn='AJMP') then 
  begin 
    if tmp[Length(tmp)]='H' then Delete(tmp,Length(tmp),1); 
    Val('$'+tmp,tam,code); 
    if code<>0 then Exit; 
    if ((ad+2) and $F800)<>(tam and $F800) then 
    begin 
      MessageBeep(mb_IconHand); 
      BWCCMessageBox(0,Napis1(13),Napis2(2),mb_OK or mb_TaskModal or mb_IconExclamation); 
      Exit; 
    end; 
    tam:=tam and $7FF; 
    if mn='ACALL' then 
      Reasm:=char((Hi(tam) shl 5) or $11)+char(Lo(tam)) else 
      Reasm:=char((Hi(tam) shl 5) or $01)+char(Lo(tam)); 
    Exit; 
  end; 
  if mn='SJMP' then 
  begin 
    if tmp[Length(tmp)]='H' then Delete(tmp,Length(tmp),1); 
    Val('$'+tmp,tam,code); 
    if code<>0 then Exit; 
    if (longint(tam)-ad-2<-128) or (longint(tam)-ad-2>127) then 
    begin 
      MessageBeep(mb_IconHand); 
      BWCCMessageBox(0,Napis1(14),Napis2(2),mb_OK or mb_TaskModal or mb_IconExclamation); 
      Exit; 
    end; 
    rel:=tam-ad-2; 
    Reasm:=#$80+char(rel); 
    Exit; 
  end; 
  if (mn='LCALL') or (mn='LJMP') then 
  begin 
    if tmp[Length(tmp)]='H' then Delete(tmp,Length(tmp),1); 
    Val('$'+tmp,tam,code); 
    if code<>0 then Exit; 
    if mn='LCALL' then 
      Reasm:=#$12+char(Hi(tam))+char(Lo(tam)) else 
      Reasm:=#2+char(Hi(tam))+char(Lo(tam)); 
    Exit; 
  end; 
  num:=$FF; 
  if mn='INC' then num:=0 else 
    if mn='DEC'  then num:=$10 else 
    if mn='ADD'  then num:=$20 else 
    if mn='ADDC' then num:=$30 else 
    if mn='ORL'  then num:=$40 else 
    if mn='ANL'  then num:=$50 else 
    if mn='XRL'  then num:=$60 else 
    if mn='SUBB' then num:=$90 else 
    if mn='XCH'  then num:=$C0 else 
    if mn='MOV'  then num:=$E0; 
  if not(num IN [0,$10,$FF]) then 
  begin 
    if (Copy(tmp,1,3)='A,#') and (num<>$C0) then 
    begin 
      Delete(tmp,1,3); 
      if tmp[Length(tmp)]='H' then 
        Val('$'+Copy(tmp,1,Length(tmp)-1),n,code) else Val(tmp,n,code); 
      if code<>0 then Exit; 
      if num=$E0 then Reasm:=#$74+char(n) else Reasm:=char(num+4)+char(n); 
      Exit; 
    end; 
    if Copy(tmp,1,2)='A,' then 
    begin 
      Delete(tmp,1,2); 
      n:=JestRej(tmp); 
      if n=255 then Exit; 
      Reasm:=char(num+5)+char(n); 
      Exit; 
    end; 
    if num=$E0 then 
    begin 
      if Pos(',',tmp)=0 then Exit; 
      if Copy(tmp,1,2)='C,' then 
      begin 
        n:=JestBit(Copy(tmp,3,255)); 
        if n=255 then Exit; 
        Reasm:=#$A2+char(n); 
        Exit; 
      end; 
      if Copy(tmp,Length(tmp)-1,2)=',C' then 
      begin 
        n:=JestBit(Copy(tmp,1,Length(tmp)-2)); 
        if n=255 then Exit; 
        Reasm:=#$92+char(n); 
        Exit; 
      end; 
      if Copy(tmp,1,6)='DPTR,#' then 
      begin 
        Delete(tmp,1,6); 
        if tmp[Length(tmp)]='H' then 
          Val('$'+Copy(tmp,1,Length(tmp)-1),tam,code) else Val(tmp,tam,code); 
        if code<>0 then Exit; 
        Reasm:=#$90+char(Hi(tam))+char(Lo(tam)); 
        Exit; 
      end; 
      if (tmp[1]='R') and (tmp[2] IN ['0'..'7']) then 
      begin 
        if tmp[4]='#' then 
        begin 
          x:=byte(tmp[2])-48; 
          Delete(tmp,1,4); 
          if tmp[Length(tmp)]='H' then 
            Val('$'+Copy(tmp,1,Length(tmp)-1),n,code) else Val(tmp,n,code); 
          if code<>0 then Exit; 
          Reasm:=char($78+x)+char(n); 
          Exit; 
        end; 
        x:=byte(tmp[2])-48; 
        n:=JestRej(Copy(tmp,4,255)); 
        if n=255 then Exit; 
        Reasm:=char($A8+x)+char(n); 
        Exit; 
      end; 
      if Copy(tmp,Length(tmp)-1,2)=',A' then 
      begin 
        n:=JestRej(Copy(tmp,1,Length(tmp)-2)); 
        if n=255 then Exit; 
        Reasm:=#$F5+char(n); 
        Exit; 
      end; 
      if (Copy(tmp,Length(tmp)-2,2)=',R') and (tmp[Length(tmp)] IN ['0'..'7']) then 
      begin 
        x:=byte(tmp[Length(tmp)])-48; 
        n:=JestRej(Copy(tmp,1,Length(tmp)-3)); 
        if n=255 then Exit; 
        Reasm:=char($88+x)+char(n); 
        Exit; 
      end; 
      if Copy(tmp,Length(tmp)-3,3)=',@R' then 
      begin 
        x:=byte(tmp[Length(tmp)])-48; 
        n:=JestRej(Copy(tmp,1,Length(tmp)-4)); 
        if n=255 then Exit; 
        Reasm:=char($86+x)+char(n); 
        Exit; 
      end; 
      if (Pos('#',tmp)=0) and (Pos('@',tmp)=0) then 
      begin 
        x:=JestRej(Copy(tmp,1,Pos(',',tmp)-1)); 
        if x=255 then Exit; 
        n:=JestRej(Copy(tmp,Pos(',',tmp)+1,255)); 
        if n=255 then Exit; 
        Reasm:=#$85+char(n)+char(x); 
        Exit; 
      end; 
      if (Pos('#',tmp)>0) and (Pos('@',tmp)=0) then 
      begin 
        x:=JestRej(Copy(tmp,1,Pos(',',tmp)-1)); 
        if x=255 then Exit; 
        Delete(tmp,1,Pos(',',tmp)+1); 
        if tmp[Length(tmp)]='H' then 
          Val('$'+Copy(tmp,1,Length(tmp)-1),n,code) else Val(tmp,n,code); 
        if code<>0 then Exit; 
        Reasm:=#$75+char(x)+char(n); 
        Exit; 
      end; 
      if (Copy(tmp,1,4)='@R0,') or (Copy(tmp,1,4)='@R1,') then 
      begin 
        x:=byte(tmp[3])-48; 
        Delete(tmp,1,4); 
        if tmp[1]='#' then 
        begin 
          if tmp[Length(tmp)]='H' then 
            Val('$'+Copy(tmp,2,Length(tmp)-1),n,code) else Val(Copy(tmp,2,255),n,code); 
          if code<>0 then Exit; 
          Reasm:=char($76+x)+char(n); 
          Exit; 
        end; 
        n:=JestRej(tmp); 
        if n=255 then Exit; 
        Reasm:=char($A6+x)+char(n); 
        Exit; 
      end; 
    end; 
    if num IN [$40,$50,$60] then 
    begin 
      if Copy(tmp,Length(tmp)-1,2)=',A' then 
      begin 
        Delete(tmp,Length(tmp)-1,2); 
        n:=JestRej(tmp); 
        if n=255 then Exit; 
        Reasm:=char(num+2)+char(n); 
        Exit; 
      end; 
      if Pos(',#',tmp)>0 then 
      begin 
        tmp1:=Copy(tmp,1,Pos(',#',tmp)-1); 
        Delete(tmp,1,Length(tmp1)+2); 
        n:=JestRej(tmp1); 
        if n=255 then Exit; 
        if tmp[Length(tmp)]='H' then 
          Val('$'+Copy(tmp,1,Length(tmp)-1),x,code) else Val(tmp,x,code); 
        if code<>0 then Exit; 
        Reasm:=char(num+3)+char(n)+char(x); 
        Exit; 
      end; 
    end; 
  end; 
  if num IN [0,$10] then 
  begin 
    n:=JestRej(tmp); 
    if n=255 then Exit; 
    Reasm:=char(num+5)+char(n); 
    Exit; 
  end; 
  if (num IN [$40,$50]) and (Copy(tmp,1,2)='C,') then 
  begin 
    if tmp[3]='/' then n:=JestBit(Copy(tmp,4,255)) else n:=JestBit(Copy(tmp,3,255)); 
    if n=255 then Exit; 
    if tmp[3]='/' then 
    begin 
      case num of 
        $40: Reasm:=#$A0+char(n); 
        $50: Reasm:=#$B0+char(n); 
      end; 
    end 
      else 
    begin 
      case num of 
        $40: Reasm:=#$72+char(n); 
        $50: Reasm:=#$82+char(n); 
      end; 
    end; 
    Exit; 
  end; 
  if mn='CJNE' then 
  begin 
    if Copy(tmp,1,3)='A,#' then 
    begin 
      Delete(tmp,1,3); 
      if tmp[Pos(',',tmp)-1]='H' then 
        Val('$'+Copy(tmp,1,Pos(',',tmp)-2),n,code) else Val(Copy(tmp,1,Pos(',',tmp)-1),n,code); 
      if code<>0 then Exit; 
      Delete(tmp,1,Pos(',',tmp)); 
      if tmp[Length(tmp)]='H' then Delete(tmp,Length(tmp),1); 
      Val('$'+tmp,tam,code); 
      if code<>0 then Exit; 
      if (longint(tam)-ad-3<-128) or (longint(tam)-ad-3>127) then 
      begin 
        MessageBeep(mb_IconHand); 
        BWCCMessageBox(0,Napis1(15),Napis2(2),mb_OK or mb_TaskModal or mb_IconExclamation); 
        Exit; 
      end; 
      rel:=tam-ad-3; 
      Reasm:=#$B4+char(n)+char(rel); 
      Exit; 
    end; 
    if Copy(tmp,1,2)='A,' then 
    begin 
      Delete(tmp,1,2); 
      n:=JestRej(Copy(tmp,1,Pos(',',tmp)-1)); 
      if n=255 then Exit; 
      Delete(tmp,1,Pos(',',tmp)); 
      if tmp[Length(tmp)]='H' then Delete(tmp,Length(tmp),1); 
      Val('$'+tmp,tam,code); 
      if code<>0 then Exit; 
      if (longint(tam)-ad-3<-128) or (longint(tam)-ad-3>127) then 
      begin 
        MessageBeep(mb_IconHand); 
        BWCCMessageBox(0,Napis1(15),Napis2(2),mb_OK or mb_TaskModal or mb_IconExclamation); 
        Exit; 
      end; 
      rel:=tam-ad-3; 
      Reasm:=#$B5+char(n)+char(rel); 
      Exit; 
    end; 
    if (tmp[1]='R') and (tmp[2] IN ['0'..'7']) and (Copy(tmp,3,2)=',#') then 
    begin 
      num:=byte(tmp[2])-48; 
      Delete(tmp,1,4); 
      if tmp[Pos(',',tmp)-1]='H' then 
        Val('$'+Copy(tmp,1,Pos(',',tmp)-2),n,code) else Val(Copy(tmp,1,Pos(',',tmp)-1),n,code); 
      if code<>0 then Exit; 
      Delete(tmp,1,Pos(',',tmp)); 
      if tmp[Length(tmp)]='H' then Delete(tmp,Length(tmp),1); 
      Val('$'+tmp,tam,code); 
      if code<>0 then Exit; 
      if (longint(tam)-ad-3<-128) or (longint(tam)-ad-3>127) then 
      begin 
        MessageBeep(mb_IconHand); 
        BWCCMessageBox(0,Napis1(15),Napis2(2),mb_OK or mb_TaskModal or mb_IconExclamation); 
        Exit; 
      end; 
      rel:=tam-ad-3; 
      Reasm:=char($B8+num)+char(n)+char(rel); 
      Exit; 
    end; 
    if (Copy(tmp,1,5)='@R0,#') or (Copy(tmp,1,5)='@R1,#') then 
    begin 
      num:=byte(tmp[3])-48; 
      Delete(tmp,1,5); 
      if tmp[Pos(',',tmp)-1]='H' then 
        Val('$'+Copy(tmp,1,Pos(',',tmp)-2),n,code) else Val(Copy(tmp,1,Pos(',',tmp)-1),n,code); 
      if code<>0 then Exit; 
      Delete(tmp,1,Pos(',',tmp)); 
      if tmp[Length(tmp)]='H' then Delete(tmp,Length(tmp),1); 
      Val('$'+tmp,tam,code); 
      if code<>0 then Exit; 
      if (longint(tam)-ad-3<-128) or (longint(tam)-ad-3>127) then 
      begin 
        MessageBeep(mb_IconHand); 
        BWCCMessageBox(0,Napis1(15),Napis2(2),mb_OK or mb_TaskModal or mb_IconExclamation); 
        Exit; 
      end; 
      rel:=tam-ad-3; 
      Reasm:=char($B6+num)+char(n)+char(rel); 
      Exit; 
    end; 
  end; 
  if (mn='CLR') or (mn='CPL') or (mn='SETB') then 
  begin 
    n:=JestBit(tmp); 
    if n=255 then Exit; 
    if mn='CLR' then begin Reasm:=#$C2+char(n); Exit; end; 
    if mn='CPL' then begin Reasm:=#$B2+char(n); Exit; end; 
    Reasm:=#$D2+char(n); Exit; 
  end; 
  if mn='DJNZ' then 
  begin 
    if (tmp[1]='R') and (tmp[2] IN ['0'..'7']) then 
    begin 
      num:=byte(tmp[2])-48; 
      Delete(tmp,1,3); 
      if tmp[Length(tmp)]='H' then Delete(tmp,Length(tmp),1); 
      Val('$'+tmp,tam,code); 
      if code<>0 then Exit; 
      if (longint(tam)-ad-2<-128) or (longint(tam)-ad-2>127) then 
      begin 
        MessageBeep(mb_IconHand); 
        BWCCMessageBox(0,Napis1(16),Napis2(2),mb_OK or mb_TaskModal or mb_IconExclamation); 
        Exit; 
      end; 
      rel:=tam-ad-2; 
      Reasm:=char($D8+num)+char(rel); 
      Exit; 
    end; 
    n:=JestRej(Copy(tmp,1,Pos(',',tmp)-1)); 
    if n=255 then Exit; 
    Delete(tmp,1,Pos(',',tmp)); 
    if tmp[Length(tmp)]='H' then Delete(tmp,Length(tmp),1); 
    Val('$'+tmp,tam,code); 
    if code<>0 then Exit; 
    if (longint(tam)-ad-3<-128) or (longint(tam)-ad-3>127) then 
    begin 
      MessageBeep(mb_IconHand); 
      BWCCMessageBox(0,Napis1(16),Napis2(2),mb_OK or mb_TaskModal or mb_IconExclamation); 
      Exit; 
    end; 
    rel:=tam-ad-3; 
    Reasm:=#$D5+char(n)+char(rel); 
    Exit; 
  end; 
  num:=$FF; 
  if mn='JBC' then num:=$10 else 
    if mn='JB'  then num:=$20 else 
    if mn='JNB' then num:=$30 else 
    if mn='JC'  then num:=$40 else 
    if mn='JNC' then num:=$50 else 
    if mn='JZ'  then num:=$60 else 
    if mn='JNZ' then num:=$70; 
  if num IN [$10,$20,$30] then 
  begin 
    n:=Pos(',',tmp); 
    if n=0 then Exit; 
    tmp1:=Copy(tmp,1,n-1); 
    Delete(tmp,1,n); 
    n:=JestBit(tmp1); 
    if n=255 then Exit; 
    if tmp[Length(tmp)]='H' then Delete(tmp,Length(tmp),1); 
    Val('$'+tmp,tam,code); 
    if code<>0 then Exit; 
    if (longint(tam)-ad-3<-128) or (longint(tam)-ad-3>127) then 
    begin 
      MessageBeep(mb_IconHand); 
      BWCCMessageBox(0,Napis1(17),Napis2(2),mb_OK or mb_TaskModal or mb_IconExclamation); 
      Exit; 
    end; 
    rel:=tam-ad-3; 
    Reasm:=char(num)+char(n)+char(rel); 
    Exit; 
  end; 
  if num IN [$40,$50,$60,$70] then 
  begin 
    if tmp[Length(tmp)]='H' then Delete(tmp,Length(tmp),1); 
    Val('$'+tmp,tam,code); 
    if code<>0 then Exit; 
    if (longint(tam)-ad-2<-128) or (longint(tam)-ad-2>127) then 
    begin 
      MessageBeep(mb_IconHand); 
      BWCCMessageBox(0,Napis1(18),Napis2(2),mb_OK or mb_TaskModal or mb_IconExclamation); 
      Exit; 
    end; 
    rel:=tam-ad-2; 
    Reasm:=char(num)+char(rel); 
    Exit; 
  end; 
  if (mn='POP') or (mn='PUSH') then 
  begin 
    n:=JestRej(tmp); 
    if n=255 then Exit; 
    if mn='POP' then Reasm:=#$D0+char(n) else Reasm:=#$C0+char(n); 
    Exit; 
  end; 
end; 
 
{************************************************} 
{ KONIEC KODU PROCEDUR ASSEMBLERA I DEASSEMBLERA } 
{************************************************} 
 
procedure BajtyWstawAuto(Okno:HWnd;sel,adres,max:word;var adre:word;co:string); 
var 
  wart:word; 
  n,x:byte; 
  b:integer; 
  tmp:string[40]; 
 
  procedure BWobetnijw; 
  begin 
    while wynik[1]=' ' do Delete(wynik,1,1); 
    while wynik[Length(wynik)]=' ' do Delete(wynik,Length(wynik),1); 
  end; 
 
  procedure BWobetnijt; 
  begin 
    while tmp[1]=' ' do Delete(tmp,1,1); 
    while tmp[Length(tmp)]=' ' do Delete(tmp,Length(tmp),1); 
  end; 
 
  procedure BWnapis; 
  var x:byte; 
  begin 
    if tmp='' then Exit; 
    for x:=1 to Length(tmp) do 
    begin 
      if (sel=selRAMInt) and bigmem and (adre>=128) then Mem[sel:adre+128]:=byte(tmp[x]) else 
        Mem[sel:adre]:=byte(tmp[x]); 
      if adre=128) then Mem[sel:adre+128]:=Hi(kl) else 
          Mem[sel:adre]:=Hi(kl); 
        if adre=128) then Mem[sel:adre+128]:=Lo(kl) else 
          Mem[sel:adre]:=Lo(kl); 
        if adre'' do 
  begin 
    BWobetnijw; 
    if wynik='' then Exit; 
    if wynik[1]=',' then Delete(wynik,1,1); 
    if wynik[1]=#39 then 
    begin 
      Delete(wynik,1,1); 
      n:=Pos(#39,wynik); 
      if n=0 then n:=Length(wynik) else Dec(n); 
      tmp:=Copy(wynik,1,n); 
      Delete(wynik,1,n); 
      if (wynik<>'') and (wynik[1]=#39) then Delete(wynik,1,1); 
      BWnapis; 
    end else 
    begin 
      n:=Pos(',',wynik); 
      if n=0 then n:=Length(wynik) else Dec(n); 
      tmp:=Copy(wynik,1,n); 
      Delete(wynik,1,n); 
      if (wynik<>'') and (wynik[1]=',') then Delete(wynik,1,1); 
      BWobetnijt; 
      if tmp='' then continue; 
      tmp:=UpCaseStr(tmp); 
      if tmp[Length(tmp)]=':' then BWetyk else 
      if tmp[Length(tmp)]='H' then 
      begin 
        wart:=HEXtoW(Copy(tmp,1,Length(tmp)-1)); 
        if wart<$100 then 
        begin 
          if (sel=selRAMInt) and bigmem and (adre>=128) then Mem[sel:adre+128]:=Lo(wart) else 
            Mem[sel:adre]:=Lo(wart); 
          if adre=128) then Mem[sel:adre+128]:=Lo(wart) else 
            Mem[sel:adre]:=Lo(wart); 
          if adre=128) then Mem[sel:adre+128]:=Hi(wart) else 
            Mem[sel:adre]:=Hi(wart); 
          if adre=128) then Mem[sel:adre+128]:=Lo(wart) else 
              Mem[sel:adre]:=Lo(wart); 
            if adre=128) then Mem[sel:adre+128]:=Lo(wart) else 
              Mem[sel:adre]:=Lo(wart); 
            if adre=128) then Mem[sel:adre+128]:=Hi(wart) else 
              Mem[sel:adre]:=Hi(wart); 
            if adre1) or (wynik='') then Exit; 
  BajtyWstawAuto(Okno,sel,adres,max,adre,wynik); 
end; 
 
procedure WypelnijInstr(uchwyt:HWnd;adrptr:pointer); 
type TAdresy=array[1..20] of word; 
var 
  adresy:^TAdresy; 
  q:string[30]; 
  w:string[50]; 
  e:array[0..50] of char; 
  dl,x,l:byte; 
  od:word; 
begin 
  adresy:=adrptr; 
  od:=adresy^[1]; 
  for l:=1 to 20 do 
  begin 
    adresy^[l]:=od; 
    q:=Deasm(od); 
    dl:=byte(q[1]); 
    Delete(q,1,1); 
    w:=WtoHEX(od)+':'#9; 
    for x:=1 to dl do w:=w+BtoHEX(Mem[selROM:od+x-1]); 
    w:=w+#9+q; 
    StrPCopy(e,w); 
    SendMessage(uchwyt,lb_AddString,0,longint(@e)); 
    if longint(od)+dl>65535 then Exit; 
    Inc(od,dl); 
  end; 
end; 
 
end.