📄 dbg8051.pas
字号:
program Debugger8051;
uses WinTypes, WinProcs, WinDos, Win31, Objects, Strings, ToolHelp, BWCC,
DbgZmTypy, DbgAsm, DbgPliki, DbgClass, DbgWykonaj;
{$R DBG8051.RES}
{$D ADD Debugger 8051}
const
us_Reset=101; us_Nowy=102; us_Koniec=107;
us_EWczytaj=201; us_EWczytajHEX=202; us_EZapisz=203; us_EZapiszHex=204; us_EZapiszBajty=205;
us_EZapiszDeasm=206;
us_RWczytaj=301; us_RWczytajHex=302; us_RZapisz=303; us_RZapiszHex=304; us_RZapiszBajty=305;
us_IWczytaj=401; us_IWczytajHex=402; us_IZapisz=403; us_IZapiszHex=404; us_IZapiszBajty=405;
us_PulaFlip=505; us_SymbWczytaj=501; us_SymbZapisz=502; us_PulaWczytaj=503; us_PulaZapisz=504;
us_WykS=601; us_WykTu=602; us_WykAdr=603; us_WykRET=604; us_WykI=605; us_WykK=606;
us_WykAnim=607; us_WykAktual=608;
us_PrzerwZ0=701; us_PrzerwT0=702; us_PrzerwZ1=703; us_PrzerwT1=704; us_PrzerwTI=705;
us_PrzerwRI=706;
us_JezPL=801; us_JezEN=802; us_ZapRozm=803; us_WczytRozm=804; us_WyczyscListe=805;
us_WielkCzcionki=808; us_RAMInt128=806; us_RAMInt256=807; us_Wtyczki=900;
us_OknoIns=150; us_OknoRej=151; us_OknoBit=152; us_OknoROM=153; us_OknoRAM=154;
us_OknoRAMInt=155; us_OknoSymb=156; us_OknoStan=157; us_OknoBreak=158; us_OknoPorty=159;
us_OknoCalc=160; us_OknoTerminal=161;
us_OknoRozmiesc=170; us_OknoOdrysuj=171; us_OknoNastepne=172; us_OknoZamknij=173;
var
aktywne:boolean;
Meldunek:TMsg;
TabAkcel:THandle;
starydir,param0,progdir:array[0..63] of char;
wtrakciezmian:boolean;
procedure WykAnim(Okno:Hwnd;z:byte); forward;
procedure WykAktual(Okno:Hwnd;z:byte); forward;
procedure WykBigMem(Okno:HWnd;z:byte); forward;
procedure UruchomWtyczki(Okno:HWnd);
begin
IleWtyczek:=0;
end;
procedure ZakonczWtyczki(Okno:HWnd);
begin
end;
procedure WybranaWtyczka(Okno:HWnd;wParam:word);
var a:TFarProc;
m1,m2:HMenu;
begin
end;
procedure PrzywrocMenu(Okno:HWnd);
begin
if jezykpl then SetMenu(Okno,MenuGlownePL) else SetMenu(Okno,MenuGlowneEN);
end;
procedure ZmienJezyk(Okno:HWnd;polski:boolean);
var p,d:array[0..63] of char;
begin
if polski=jezykpl then Exit;
jezykpl:=polski;
PrzywrocMenu(Okno);
DoWszystkich(255,wm_Command,us_ZmianaJez,0);
FileSplit(StrPCopy(p,ParamStr(0)),d,nil,nil);
StrCat(d,'DBG8051.INI');
if polski then WritePrivateProfileString('Settings','Language','PL',d) else
WritePrivateProfileString('Settings','Language','EN',d);
ListaOkien;
end;
procedure Inicjuj(Okno:HWnd;jak:byte);
var
DC:HDC;
tmp:PChar;
szerwys:longint;
wielk,code:integer;
oldFont:HFont;
bold:integer;
p,d:array[0..63] of char;
jez:array[0..3] of char;
begin
intflipflop:=0; runprog:=0; RejPC:=0; licznikcykli:=0; licznikcykliwewn:=0;
wtrakciezmian:=false; poprz_int0:=true; poprz_int1:=true; poprz_t0:=true; poprz_t1:=true;
if jak=0 then
begin
FileSplit(StrPCopy(p,ParamStr(0)),d,nil,nil);
StrCat(d,'DBG8051.INI');
{pobieramy nazw?i wielko滄 czcionki "systemowej" z pliku .INI}
GetPrivateProfileString('Settings','FontOEM','',p,63,d);
if StrLen(p)=0 then
begin
wielk:=12;
StrCopy(p,'Terminal');
WritePrivateProfileString('Settings','FontOEM','Terminal,12',d);
end else
begin
if p[StrLen(p)-1]='B' then bold:=FW_BOLD else bold:=FW_NORMAL;
p[StrLen(p)-1]:=#0;
tmp:=StrRScan(p,',');
tmp^:=#0;
Val(StrPas(tmp+1),wielk,code);
end;
{tworzymy czcionk?OEM i zapami阾ujemy rozmiar znaku}
CzcionkaOEM:=CreateFont(-wielk,0,0,0,bold,0,0,0,OEM_CHARSET,
OUT_RASTER_PRECIS,CLIP_DEFAULT_PRECIS,DRAFT_QUALITY,0,p);
DC:=GetDC(Okno);
oldfont:=SelectObject(DC,CzcionkaOEM);
szerwys:=GetTextExtent(DC,'B',1);
FontOEMszer:=LoWord(szerwys);
FontOEMwys:=HiWord(szerwys);
SelectObject(DC,oldfont);
ReleaseDC(Okno,DC);
{pobieramy rozmiary pozosta硑ch element體}
RamkaSzer:=GetSystemMetrics(SM_CXFRAME)*2;
RamkaWys:=GetSystemMetrics(SM_CYFRAME)*2+GetSystemMetrics(SM_CYCAPTION);
WindaSzer:=GetSystemMetrics(SM_CXVSCROLL);
WindaWys:=GetSystemMetrics(SM_CYHSCROLL);
{dalsza jednorazowa inicjalizacja}
jezykpl:=true; aktywne:=true;
OknoAktualne:=0; OknoInstr:=0; OknoTerm:=0;
SymbROM:=New(PStrCollection,Init(100,100));
SymbRAM:=New(PStrCollection,Init(100,100));
SymbReg:=New(PStrCollection,Init(100,100));
SymbBit:=New(PStrCollection,Init(100,100));
SymbBrk:=New(PStrCollection,Init(100,100));
BlokPamROM:=GlobalAlloc(GHND or GMEM_NOCOMPACT,65536);
BlokPamRAM:=GlobalAlloc(GHND or GMEM_NOCOMPACT,65536);
BlokPamRAMInt:=GlobalAlloc(GHND or GMEM_NOCOMPACT,384);
selROM:=GlobalHandleToSel(BlokPamROM);
selRAM:=GlobalHandleToSel(BlokPamRAM);
selRAMInt:=GlobalHandleToSel(BlokPamRAMInt);
UruchomWtyczki(Okno);
GetPrivateProfileString('Settings','Language','xx',jez,3,d);
if StrComp(jez,'xx')=0 then WritePrivateProfileString('Settings','Language','PL',d) else
if StrComp(jez,'EN')=0 then ZmienJezyk(Okno,false);
if GetPrivateProfileInt('Settings','Animation',1,d)=1 then
WykAnim(Okno,1) else WykAnim(Okno,0);
if GetPrivateProfileInt('Settings','UpdatingPI',1,d)=1 then
WykAktual(Okno,1) else WykAktual(Okno,0);
if GetPrivateProfileInt('Settings','InternalMem',128,d)=128 then
WykBigMem(Okno,0) else WykBigMem(Okno,1);
WczytajListePlikow;
end;
SymbROM^.DeleteAll;
SymbRAM^.DeleteAll;
SymbReg^.DeleteAll;
SymbBit^.DeleteAll;
SymbBrk^.DeleteAll;
FillChar(Mem[selROM:0],65535,0); Mem[selROM:65535]:=0;
FillChar(Mem[selRAM:0],65535,0); Mem[selRAM:65535]:=0;
FillChar(Mem[selRAMInt:0],384,0);
Mem[selRAMInt:128]:=255; Mem[selRAMInt:144]:=255;
Mem[selRAMInt:160]:=255; Mem[selRAMInt:176]:=255; {P0-P3}
Mem[selRAMInt:129]:=7; {SP}
if jak=1 then
begin
if OknoInstr<>0 then
SendMessage(GetWindow(OknoInstr,gw_Child),wm_Command,us_OdnowCoTrzeba,0);
OdrysujWszystkie;
end;
end;
procedure NoToKoniec(Okno:HWnd);
begin
runprog:=0;
DoWszystkich(255,wm_Close,0,0);
ZakonczWtyczki(Okno);
GlobalFree(BlokPamROM);
GlobalFree(BlokPamRAM);
GlobalFree(BlokPamRAMInt);
Dispose(SymbROM,Done);
Dispose(SymbRAM,Done);
Dispose(SymbReg,Done);
Dispose(SymbBit,Done);
Dispose(SymbBrk,Done);
DeleteObject(CzcionkaOEM);
end;
procedure ResetProc(Okno:HWnd);
begin
intflipflop:=0; runprog:=0; licznikcykli:=0; licznikcykliwewn:=0; RejPC:=0;
poprz_int0:=true; poprz_int1:=true; poprz_t0:=true; poprz_t1:=true;
FillChar(Mem[selRAMInt:128],128,0);
Mem[selRAMInt:128]:=255; Mem[selRAMInt:144]:=255;
Mem[selRAMInt:160]:=255; Mem[selRAMInt:176]:=255; {P0-P3}
Mem[selRAMInt:129]:=7; {SP}
if OknoInstr<>0 then SendMessage(GetWindow(OknoInstr,gw_Child),wm_Command,us_OdnowCoTrzeba,0);
OdrysujWszystkie;
end;
function OdrysujAktyw(Okno:HWnd;k,w:word;l:longint):longint;
var
DC,m:HDC;
y1:integer;
b:HBitmap;
begin
if w=0 then aktywne:=false else aktywne:=true;
DefWindowProc(Okno,k,w,l);
DC:=GetWindowDC(Okno);
y1:=GetSystemMetrics(SM_CYFRAME);
m:=CreateCompatibleDC(DC);
if aktywne then b:=LoadBitmap(hInstance,'TYTUL') else b:=LoadBitmap(hInstance,'TYTULN');
SelectObject(m,b);
BitBlt(DC,GetSystemMetrics(SM_CXSIZE)+7,y1+1,80,16,m,0,0,SrcCopy);
DeleteDC(m);
DeleteObject(b);
ReleaseDC(Okno,DC);
OdrysujAktyw:=1;
end;
procedure Odrysuj(Okno:HWnd;k,w:word;l:longint);
var
DC,m:HDC;
y1:integer;
b:HBitmap;
begin
DefWindowProc(Okno,k,w,l);
DC:=GetWindowDC(Okno);
y1:=GetSystemMetrics(SM_CYFRAME);
m:=CreateCompatibleDC(DC);
if aktywne then b:=LoadBitmap(hInstance,'TYTUL') else b:=LoadBitmap(hInstance,'TYTULN');
SelectObject(m,b);
BitBlt(DC,GetSystemMetrics(SM_CXSIZE)+7,y1+1,80,16,m,0,0,SrcCopy);
DeleteDC(m);
DeleteObject(b);
DeleteDC(m);
ReleaseDC(Okno,DC);
end;
procedure WykTutaj(Okno:HWnd);
var off:word;
begin
if (runprog>0) or (OknoInstr=0) then
begin
MessageBeep(mb_IconHand);
Exit;
end;
SendMessage(OknoInstr,wm_Command,us_PodajAdres0,0);
end;
procedure WykTutaj1(Okno:HWnd;off:word);
begin
runto:=off;
runprog:=2;
SetMenu(Okno,MenuStop);
end;
procedure WykAdres(Okno:HWnd);
var
code,b:integer;
off:word;
begin
if runprog>0 then
begin
MessageBeep(mb_IconHand);
Exit;
end;
b:=PokazDialog('OFFSET',@FunOffset);
if (b<>1) or (Length(wynik)>4) or (wynik='') then Exit;
Val('$'+wynik,off,code);
if code<>0 then
begin
MessageBeep(mb_IconHand);
BWCCMessageBox(0,Napis1(1),Napis2(2),mb_OK or mb_TaskModal or mb_IconExclamation);
Exit;
end;
runto:=off;
runprog:=2;
SetMenu(Okno,MenuStop);
end;
procedure WykKrok(Okno:HWnd);
var i:byte;
begin
if runprog>0 then
begin
MessageBeep(mb_IconHand);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -