⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dbg8051.pas

📁 Borland Pascal写的8051单片机模拟仿真器。内有源码
💻 PAS
📖 第 1 页 / 共 3 页
字号:
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 + -