📄 main.pas
字号:
end;
$3f00..$3f1f:Result:=ppu.ppu_mem[ppu.VRamAddr];
$3f30..$3fff:begin
ppu.VRamAddr:=ppu.VRamAddr and $3f1f;
Result:=ppu.ppu_mem[ppu.VRamAddr];
end;
end; //end case
d2 := (ppu.registers[0] shr 2) and 1;
if d2 = 0 then
increment := 1
else
increment := 32;
ppu.VRamAddr := ppu.VRamAddr + increment;
end;
end; //end case
end;
$4000..$4013,$4015:begin
snd.SetFrameTimes(FrameTimes);
Result:=snd.Snd_Read(addr);
end;
$4016,$4017:Result := padle.InputRead(addr);
//$4017:Result := padle.InputRead(addr);
$6000..$7fff:Result := cpu.CPU_Mem[addr];
$8000..$bfff:Result := cart.prgRom[cart.LBank + addr - $8000];
$c000..$ffff:Result := cart.prgRom[cart.HBank + addr - $C000];
else
Result:=0;
end;
end;
procedure TmainWin.Load1Click(Sender: TObject);
begin
// if doFullScreen in DXDraw.Options then
//mnuFreeROM.Click;
if OpenDialog1.Execute then
begin
if RomList.IndexOf(OpenDialog1.FileName)=-1 then
begin
RomList.Insert(0,OpenDialog1.FileName);
if RomList.Count>RomListNum then
RomList.Delete(RomListNum);
end;
RunNes(OpenDialog1.Filename);
end;
end;
procedure TmainWin.RunNes(romname: string);
var
cc: integer;
scanline: integer;
elaspetime:integer;
SprHeigh:Integer;
begin
cart.LoadRom(romname);
running := true;
cc := 0;
FrameTimes:=0;
scanline := 0;
VBlank := False;
cart.mapperRom;
cpu.Reset;
ppu.Reset;
copymemory(@ppu.ppu_mem, @cart.chrRom, $2000);
ppu.mir(cart.mirroring);
if Assigned(snd) then
snd.destory;
snd:=TSound.Create;
while running do
begin
// interrupt(cc,scanline); //wait interupt
while not WinActive do
begin
Application.ProcessMessages;
end;
elaspetime:=cc;
if cpu.CpuRun(cc) then
begin
elaspetime:=cc-elaspetime;
Inc(FrameTimes,elaspetime);
if (ppu.registers[0] and $20)>0 then
SprHeigh:=18
else SprHeigh:=10;
if scanline=ppu.SprRam[0]+SprHeigh then
ppu.registers[2]:=ppu.registers[2] or $40;
if cc >= 114 then
begin
if scanline < 240 then
begin
//ppu.BehindSprites;
ppu.RenderScanline(scanline);
end
else if scanline = 243 then
begin
if (ppu.registers[0] and $80) = $80 then
cpu.NMI(cc);
ppu.registers[2] := ppu.registers[2] or $80;
VBlank := True;
Application.ProcessMessages;
end else if scanline = 262 then
begin
scanline := -1;
ppu.registers[2] := ppu.registers[2] and $3F;
VBlank := false;
if (ppu.registers[1] and $10)=$10 then begin
ppu.BehindSprites;
ppu.FrontSprites;
end;
if (ppu.registers[1] and $8) = 8 then
ppu.ShowScreen;
//pb1.Canvas.Draw(0, 0, ppu.BGCanvas);
snd.SetFrameTimes(FrameTimes);
snd.EndFrame;
FrameTimes:=0;
end;
inc(scanline);
cc := 0;
end;
end
else
running := false;
end;
end;
procedure TmainWin.FormCreate(Sender: TObject);
var
i:Integer;
// path:string;
begin
//path:=ExtractFilePath(Application.Exename)+'config.ini';
RomList:=TStringList.Create;
RomListNum:=4;
for i := 0 to RomListNum-1 do
RomList.Add('');
iniconf:=TIniFile.Create(ExtractFilePath(Application.Exename)+'config.ini');
ReadConfig;
cart := TCart.create;
cpu := TCPU.Create;
cpu.memwrite := Mem_Write;
cpu.memread := Mem_Read;
cpu.Reset;
ppu := TPPU.create();
ppu.DXDraw := DXDraw;
padle := TInput.Create(dxi1, dxi2);
// snd:=TSound.Create;
// dbw := TDebugWin.Create(Self);
// dbw.Show;
FirstRead:=true;
WinActive:=True;
frmNTV:=nil;
end;
procedure TmainWin.Button1Click(Sender: TObject);
begin
//RunNes('D:\tnes\testnt\test.nes');
RunNes('d:\nes\NEStress.NES');
//runnes('D:\rom\zelda\zelda.nes');
//RunNes('d:\rom\rgb\mmxt.nes');
//RunNes('d:\rom\mmx\mmx.nes');
//RunNes('D:\rom\jumpy\jumpy.nes');
//RunNes('d:\rom\sprite\sprite.nes');
//RunNes('d:\rom\testRoms\JUNKROM.NES');
//RunNes('d:\rom\testRoms\cart.NES');
// RunNes('d:\rom\testRoms\tank.NES');
end;
procedure TmainWin.FormClose(Sender: TObject; var Action: TCloseAction);
begin
running := false;
pause := false;
WriteConfig;
iniconf.Destroy;
snd.destory;
end;
procedure TmainWin.SavePalette1Click(Sender: TObject);
var
f: file;
filename: string;
buf: array[0..$1F] of Byte;
begin
filename := InputBox('input filename', ' ', ' ');
AssignFile(f, filename);
if FileExists(filename) then
Reset(f, 1)
else Rewrite(f, 1);
CopyMemory(@buf, @ppu.ppu_mem[$3F00], $20);
BlockWrite(f, buf, $20);
closefile(f);
end;
procedure TmainWin.SaveSprRam1Click(Sender: TObject);
var
f: file;
filename: string;
buf: array[0..$FF] of Byte;
begin
filename := InputBox('input filename', ' ', ' ');
AssignFile(f, filename);
if FileExists(filename) then
Reset(f, 1)
else Rewrite(f, 1);
CopyMemory(@buf, @ppu.sprRam, 256);
BlockWrite(f, buf, 256);
closefile(f);
end;
procedure TmainWin.SavePatterntable1Click(Sender: TObject);
var
f: file;
filename: string;
buf: array[0..$2000] of Byte;
begin
filename := InputBox('input filename', ' ', ' ');
AssignFile(f, filename);
if FileExists(filename) then
Reset(f, 1)
else Rewrite(f, 1);
CopyMemory(@buf, @ppu.sprRam, $2000);
BlockWrite(f, buf, $2000);
closefile(f);
end;
procedure TmainWin.btn1Click(Sender: TObject);
begin
ppu.FSCanvas.SaveToFile('d:\fs.bmp');
end;
procedure TmainWin.NameTable01Click(Sender: TObject);
var
f: file;
filename: string;
buf: array[0..$3FF] of Byte;
begin
filename := InputBox('input filename', ' ', ' ');
AssignFile(f, filename);
if FileExists(filename) then
Reset(f, 1)
else Rewrite(f, 1);
CopyMemory(@buf, @ppu.ppu_mem[$2000], $400);
BlockWrite(f, buf, $400);
closefile(f);
end;
procedure TmainWin.NameTable11Click(Sender: TObject);
var
f: file;
filename: string;
buf: array[0..$3FF] of Byte;
begin
filename := InputBox('input filename', ' ', ' ');
AssignFile(f, filename);
if FileExists(filename) then
Reset(f, 1)
else Rewrite(f, 1);
CopyMemory(@buf, @ppu.ppu_mem[ppu.nametable[1]], $400);
BlockWrite(f, buf, $400);
closefile(f);
end;
procedure TmainWin.NameTable21Click(Sender: TObject);
var
f: file;
filename: string;
buf: array[0..$3FF] of Byte;
begin
filename := InputBox('input filename', ' ', ' ');
AssignFile(f, filename);
if FileExists(filename) then
Reset(f, 1)
else Rewrite(f, 1);
CopyMemory(@buf, @ppu.ppu_mem[ppu.nametable[2]], $400);
BlockWrite(f, buf, $400);
closefile(f);
end;
procedure TmainWin.NameTable31Click(Sender: TObject);
var
f: file;
filename: string;
buf: array[0..$3FF] of Byte;
begin
filename := InputBox('input filename', ' ', ' ');
AssignFile(f, filename);
if FileExists(filename) then
Reset(f, 1)
else Rewrite(f, 1);
CopyMemory(@buf, @ppu.ppu_mem[ppu.nametable[3]], $400);
BlockWrite(f, buf, $400);
closefile(f);
end;
procedure TmainWin.Exit1Click(Sender: TObject);
begin
Close;
end;
procedure TmainWin.File1Click(Sender: TObject);
var
i,index:Integer;
begin
index:=RomItem1.MenuIndex;
for i := 0 to (RomListNum-1) do
begin
File1.Items[index+i].Visible:=(Romlist.Strings[i]<>'');
File1.Items[index+i].Caption:=romlist.Strings[i];
end;
end;
procedure TmainWin.RomItem1Click(Sender: TObject);
var
index:Integer;
ItemClick:TMenuItem;
begin
ItemClick:=TMenuItem(Sender);
index:=ItemClick.MenuIndex-RomItem1.MenuIndex;
RunNes(RomList.Strings[index]);
end;
procedure TmainWin.Input1Click(Sender: TObject);
var
inp:TfrmInputSet;
begin
inp:=TfrmInputSet.Create(Self);
inp.ShowModal;
end;
procedure TmainWin.About1Click(Sender: TObject);
var
frmAbout:TfrmAbout;
begin
frmAbout:=TfrmAbout.Create(self);
frmAbout.ShowModal;
end;
procedure TmainWin.FormActivate(Sender: TObject);
begin
// WinActive:=True;
end;
procedure TmainWin.FormDeactivate(Sender: TObject);
begin
// WinActive:=False;
end;
procedure TmainWin.NameTableView1Click(Sender: TObject);
begin
frmNTV:=TfrmNTV.Create(self);
frmNTV.Show;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -