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.