📄 cart.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 + -