📄 nesppu.pas
字号:
low2 := (bit14 shr 3) or (bit04 shr 4);
color_offset := low2 or upper2;
PalAddr:= pal[palNo] + color_offset;
//if (PalAddr=$3f04) or (palAddr=$3f08) or (palAddr=$3f0c) then
// PalAddr:=$3f00;
color := ppu_mem[PalAddr];
Line8[3] := color and $3F; //2006.2.9 modifed
//5
low2 := (bit15 shr 4) or (bit05 shr 5);
color_offset := low2 or upper2;
PalAddr:= pal[palNo] + color_offset;
//if (PalAddr=$3f04) or (palAddr=$3f08) or (palAddr=$3f0c) then
// PalAddr:=$3f00;
color := ppu_mem[PalAddr];
Line8[2] := color and $3F; //2006.2.9 modifed
//6
low2 := (bit16 shr 5) or (bit06 shr 6);
color_offset := low2 or upper2;
PalAddr:= pal[palNo] + color_offset;
//if (PalAddr=$3f04) or (palAddr=$3f08) or (palAddr=$3f0c) then
// PalAddr:=$3f00;
color := ppu_mem[PalAddr];
Line8[1] := color and $3F; //2006.2.9 modifed
//7
low2 := (bit17 shr 6) or (bit07 shr 7);
color_offset := low2 or upper2;
PalAddr:= pal[palNo] + color_offset;
//if (PalAddr=$3f04) or (palAddr=$3f08) or (palAddr=$3f0c) then
// PalAddr:=$3f00;
color := ppu_mem[PalAddr];
Line8[0] := color and $3F; //2006.2.9 modifed
end;
procedure TPPU.ShowScreen();
begin
//form1.dxdraw1.Initialize;
//for x:=0 to 255 do
// form1.Image1.Canvas.Pixels[x,slNum]:=slColor[x];
//BSCanvas.Canvas.Draw(0, 0, BGCanvas);
// BGCanvas.Canvas.Draw(0, 0, BSCanvas);
// BGCanvas.Canvas.Draw(0, 0, FSCanvas);
if (registers[1] and $10)=$10 then begin
CopyBmpT(BSCanvas,0,0,BGCanvas,ppu_mem[$3f00]);
copybmpT(BGCanvas,0,0,BSCanvas,ppu_mem[$3f10]);
CopyBmpT(BGCanvas,0,0,FSCanvas,ppu_mem[$3f10]);
end;
//BitBlt(DXDraw.Surface.Canvas.Handle, 0, 0, 256, 240, BGCanvas.Canvas.Handle, 0, 0, SRCCOPY);
DXDraw.Surface.LoadFromGraphic(bgCanvas);
DXDraw.Surface.Canvas.Release;
DXDraw.Flip;
frmNTV.x:=x_scroll;
frmNTV.y:=y_scroll;
// frmNTV.showNT(bigNT);
end;
constructor TPPU.Create();
var
apal: PLogPalette;
hpal: HPALETTE;
i: Integer;
begin
pattable[0] := 0;
pattable[1] := $1000;
nametable[0] := $2000;
at[0] := $23C0;
pal[0] := $3F00;
pal[1] := $3F10;
BGCanvas := TBitmap.Create;
BGCanvas.Width := 256;
BGCanvas.Height := 240;
BGCanvas.PixelFormat := pf8bit;
BSCanvas := TBitmap.Create;
BSCanvas.Width := 256;
BSCanvas.Height := 240;
BSCanvas.PixelFormat := pf8bit;
FSCanvas := TBitmap.Create;
FSCanvas.Width := 256;
FSCanvas.Height := 240;
FSCanvas.PixelFormat := pf8bit;
SprCanvas := TBitmap.Create;
SprCanvas.Width := 8;
SprCanvas.Height := 8;
SprCanvas.PixelFormat := pf8bit;
BigNT:=TBitmap.Create;
BigNT.Width := 512;
BigNT.Height := 480;
BigNT.PixelFormat := pf8bit;
apal := nil;
try
GetMem(apal, sizeof(TLogPalette) + sizeof(TPaletteEntry) * 64);
apal.palVersion := $300;
apal.palNumEntries := 64;
for i := 0 to 63 do
begin
apal.palPalEntry[i].peRed := SysColor[i][1];
apal.palPalEntry[i].peGreen := SysColor[i][2];
apal.palPalEntry[i].peBlue := SysColor[i][3];
end;
hpal := CreatePalette(apal^);
if hpal <> 0 then begin
BGCanvas.Palette := hpal;
BSCanvas.Palette := hpal;
SprCanvas.Palette := hpal;
FSCanvas.Palette := hpal;
BigNT.Palette:=hpal;
end;
finally
FreeMem(apal);
end;
end;
procedure TPPU.RenderScanline(slNum: integer);
var
aTileY: integer;
startRow: integer;
CurNT, CurNT_RorL, CurNT_UorD: Integer;
x, y, i, offset: integer;
b0, b1, patNO: byte;
p: PByteArray;
begin
CurNT := Registers[0] and $3;
CurNT_RorL := CurNT xor 1;
CurNT_UorD := CurNT xor 2;
if y_scroll > 239 then
y_scroll := 0;
patNO := (Registers[0] shr 4) and $1; //select pattern table no.
aTileY := (slNum + y_scroll) mod 8;
startRow := ((slNum + y_scroll) div 8) * 32;
offset := startRow;
y := slNum + y_scroll;
if y < 240 then
begin
for i := 0 to 31 do
begin
b0 := ppu_mem[pattable[patNO] + ppu_mem[nametable[CurNT] + offset] * 16 + aTileY];
b1 := ppu_mem[pattable[patNO] + ppu_mem[nametable[CurNT] + offset] * 16 + aTileY + 8];
RenderBGPixels(b0, b1, offset, CurNT);
//for k := 0 to 7 do
//Line256[j*8+k]:=Line8[k];
copymemory(@Line512[i * 8], @Line8, 8);
inc(offset);
end;
offset := startRow;
for i := 32 to 63 do
begin
b0 := ppu_mem[pattable[patNO] + ppu_mem[nametable[CurNT_RorL] + offset] * 16 + aTileY];
b1 := ppu_mem[pattable[patNO] + ppu_mem[nametable[CurNT_RorL] + offset] * 16 + aTileY + 8];
RenderBGPixels(b0, b1, offset, CurNT_RorL);
//for k := 0 to 7 do
//Line256[j*8+k]:=Line8[k];
copymemory(@Line512[i * 8], @Line8, 8);
inc(offset);
end;
copymemory(@Line256, @Line512[x_scroll], 256) ;
p := BigNT.Scanline[slNum];
CopyMemory(p, @Line512, 512);
// frmNTV.showNT(bigNT);
end
else
begin
aTileY := (y - 240) mod 8;
startRow := ((y - 240) div 8) * 32;
offset := startRow;
for i := 0 to 31 do
begin
b0 := ppu_mem[pattable[patNO] + ppu_mem[nametable[CurNT_UorD] + offset] * 16 + aTileY];
b1 := ppu_mem[pattable[patNO] + ppu_mem[nametable[CurNT_UorD] + offset] * 16 + aTileY + 8];
RenderBGPixels(b0, b1, offset, CurNT_UorD);
//for k := 0 to 7 do
//Line256[j*8+k]:=Line8[k];
copymemory(@Line512[i * 8], @Line8, 8);
inc(offset);
end;
offset := startRow;
for i := 32 to 63 do
begin
b0 := ppu_mem[pattable[patNO] + ppu_mem[nametable[CurNT_UorD xor 1] + offset] * 16 + aTileY];
b1 := ppu_mem[pattable[patNO] + ppu_mem[nametable[CurNT_UorD xor 1] + offset] * 16 + aTileY + 8];
RenderBGPixels(b0, b1, offset, CurNT_UorD xor 1);
//for k := 0 to 7 do
//Line256[j*8+k]:=Line8[k];
copymemory(@Line512[i * 8], @Line8, 8);
inc(offset);
end;
copymemory(@Line256, @Line512[x_scroll], 256);
p := BigNT.Scanline[slNum+240];
CopyMemory(p, @Line512, 512);
// frmNTV.showNT(bigNT);
end;
//if not DXDraw.CanDraw then exit;
p := BGCanvas.Scanline[slNum];
CopyMemory(p, @Line256, 256);
{x:=0;
y:=0;
while x<256 do
begin
p[y]:=Line256[x].R;
p[y+1]:=Line256[x].G;
p[y+2]:=Line256[x].B;
Inc(y,3);
Inc(x);
end;
}
end;
procedure TPPU.mir(mir: Integer);
begin
mirroring := mir;
// mirroring := 2;
if mirroring = 0 then //horizontal
begin
nametable[1] := $2000;
at[1] := $23C0;
nametable[2] := $2400;
at[2] := $27C0;
nametable[3] := $2400;
at[3] := $27C0;
end;
if mirroring = 1 then //vertical
begin
nametable[1] := $2400;
at[1] := $27C0;
nametable[2] := $2000;
at[2] := $23C0;
nametable[3] := $2400;
at[3] := $27C0;
end;
if mirroring = 2 then //four-screen
begin
nametable[1] := $2400;
at[1] := $27C0;
nametable[2] := $2800;
at[2] := $2BC0;
nametable[3] := $2C00;
at[3] := $2FC0;
end;
end;
procedure TPPU.BehindSprites;
var
SID: Byte;
TileNo: Byte;
Attr: Byte;
x, y: Byte;
i: integer;
aOffset: byte;
begin
FillBmp(BSCanvas,ppu_mem[$3f10]);
sid := 0;
i := 252;
while i >= 0 do
begin
Attr := SprRam[i + 2];
if (Attr and $20) = $20 then
begin
x := SprRam[i + 3];
y := SprRam[i];
TileNo := SprRam[i + 1];
DrawASprite(TileNo, x, y, Attr);
CopyBmpT(BSCanvas,x,y+1,SprCanvas,ppu_mem[$3f00]);
Inc(SID);
end;
dec(i, 4);
end;
end;
procedure TPPU.FrontSprites;
var
SID: Byte;
TileNo: Byte;
Attr: Byte;
x, y: Byte;
i: integer;
aOffset: byte;
begin
FillBmp(FSCanvas,ppu_mem[$3f10]);
i := 252;
while i >= 0 do
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -