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

📄 main.pas

📁 delphi编制的nes模拟器--tNes
💻 PAS
📖 第 1 页 / 共 2 页
字号:
											 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 + -