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

📄 cart.pas

📁 delphi编制的nes模拟器--tNes
💻 PAS
字号:
unit cart;

interface
uses
    Windows, SysUtils, Graphics, DXDraws, Dialogs;
type
    TRomHeader = record
        RomType: array[1..3] of char;
        Ctrl,
            PRGROM,
            CHRRAM,
            ROMctrl1,
            ROMctrl2: byte;
        Expansion: array[0..7] of char;
    end;

	TCart = class
	private
		swCtrl:Byte;
    public
        chrRom: array[0..$1FFF] of byte;
        prgRom: array[0..$FFFFF] of byte; //1 mbyte
        LBank: integer;
        HBank: integer;
        mirroring: integer;
        mapper: integer;
        RomSize: integer;
        VRomSize: integer;
		RomHeader: TRomHeader;

        constructor create();
        function LoadRom(filename: string): boolean;
        procedure mapperRom;
        procedure WriteByte(Addr:Word;data:Byte);
    end;
implementation

{ TCart }

constructor TCart.create;
begin

end;

function TCart.LoadRom(filename: string): boolean;
var
    f: file;

begin
  //RomFilename := ExtractFilename(filename);
  //RomPath     := ExtractFilePath(filename);

    AssignFile(F, filename);
    Reset(F, 1);
  { Header }
    BlockRead(F, ROMHeader, SizeOf(ROMHeader));
    if (ROMHeader.RomType <> 'NES') then
    begin
        showmessage('Unsupported file format.');
        Result := false;
        Exit;
    end;
    ROMSize := ROMHeader.PRGROM;
    VROMSize := ROMHeader.CHRRAM;
    mirroring := ((ROMHeader.ROMctrl1 and 8) shr 2) or (ROMHeader.ROMctrl1 and 1);
    mapper := (ROMHeader.ROMctrl1 shr 4) or (ROMHeader.ROMctrl2 and $F0);




    BlockRead(F, PrgRom, $4000 * ROMSize);

    BlockRead(F, ChrRom, $2000 * VROMSize);
    CloseFile(F);
	Result := true;


	
end;

procedure TCart.mapperRom;
begin
	case mapper of
	0:begin
		if romsize = 1 then
		begin
			LBank := $0000;
			HBank := $0000;
		end
		else
		begin
			LBank := $0000;
			HBank := $4000;
		end;
	  end;
	2:begin
		swCtrl:=0;
		LBank :=$0000;
		HBank :=$4000*7;
	  end;
	end;
end;

procedure TCart.WriteByte(Addr: Word; data: Byte);
begin
	case mapper of
	0:Exit;
	2:begin
		swCtrl:=data mod 7;
		LBank:=swCtrl*$4000;
		 
	  end;
   end;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -