📄 nesppu.pas
字号:
unit nesppu;
interface
uses
Windows, SysUtils, Graphics, DXDraws, Dialogs;
type
TRGB = record
R: Byte;
G: Byte;
B: Byte;
end;
TLine512P = array[0..511] of Byte;
TLine256P = array[0..255] of Byte;
TLine8P = array[0..7] of Byte;
TPalType = array[0..63, 1..3] of byte;
TPPU = class
private
// BGCanvas: TBitmap; //background canvas
// BSCanvas:TBitmap; //behind sprite canvas
// FSCanvas:TBitmap; //front Sprite Canvas
BigNT:TBitmap;
SprCanvas: TBitmap;
TransColor: TColor;
procedure RenderSpritePixels(b0, b1, attr: Byte; i: integer);
procedure RenderSpritePixelsHF(b0, b1, attr: Byte; i: integer);
public
BSCanvas: TBitmap; //behind sprite canvas
FSCanvas: TBitmap; //front Sprite Canvas
BGCanvas: TBitmap; //background canvas
Line8: TLine8P;
Line256: TLIne256P;
Line512: TLine512P;
DXDraw: TDXDraw;
ppu_mem: array[0..$FFFF] of byte;
pattable: array[0..1] of word; //pattern table
nametable: array[0..3] of word;
at: array[0..3] of word;
pal: array[0..1] of word;
mirroring: integer;
registers: array[0..7] of word;
x_scroll: integer;
y_scroll: integer;
VRamAddr: Word;
SprRam: array[0..255] of byte;
constructor Create(); //0,horizontal mirroring;
//1,vertical mirroring;
//2,four-screen mirroring
destructor destory();
procedure mir(mir: Integer);
procedure ShowScreen();
procedure RenderScanline(slNum: integer);
procedure RenderBGPixels(b0, b1: byte; CurTileNO: integer; NtNo: integer);
procedure Reset();
procedure BehindSprites;
procedure FrontSprites;
procedure DrawASprite(Tiles, x, y, attr: Byte);
end;
implementation
uses
NTView;
var
SysColor: TPalType =
{(
($68, $68, $68), ($00, $40, $80), ($00, $00, $80), ($40, $00, $80),
($80, $00, $80), ($80, $00, $40), ($80, $00, $00), ($55, $00, $00),
($40, $40, $00), ($33, $50, $00), ($00, $50, $00), ($00, $50, $00),
($00, $40, $40), ($00, $00, $00), ($00, $00, $00), ($00, $00, $00),
($98, $98, $98), ($00, $80, $C0), ($40, $40, $C0), ($80, $00, $C0),
($C0, $00, $C0), ($C0, $00, $80), ($C0, $20, $20), ($C0, $40, $00),
($80, $80, $00), ($55, $80, $00), ($00, $80, $00), ($33, $80, $33),
($00, $80, $80), ($00, $00, $00), ($00, $00, $00), ($00, $00, $00),
($D0, $D0, $D0), ($40, $C0, $FF), ($80, $80, $FF), ($C0, $40, $FF),
($FF, $00, $FF), ($FF, $40, $C0), ($FF, $50, $50), ($FF, $80, $40),
($C0, $C0, $00), ($80, $C0, $00), ($00, $C0, $00), ($55, $C0, $55),
($00, $C0, $C0), ($33, $33, $33), ($00, $00, $00), ($00, $00, $00),
($FF, $FF, $FF), ($80, $FF, $FF), ($C0, $C0, $FF), ($FF, $80, $FF),
($FF, $40, $FF), ($FF, $80, $FF), ($FF, $80, $80), ($FF, $C0, $80),
($FF, $FF, $40), ($C0, $FF, $40), ($40, $FF, $40), ($AA, $FF, $AA),
($40, $FF, $FF), ($99, $99, $99), ($00, $00, $00), ($00, $00, $00)
); }
(
($80,$80,$80), ($00,$3D,$A6), ($0,$12,$B0), ($44,$00,$96),
($A1,$00,$5E), ($C7,$00,$28), ($BA,$06,$00), ($8C,$17,$00),
($5C,$2F,$00), ($10,$45,$00), ($05,$4A,$00), ($00,$47,$2E),
($00,$41,$66), ($00,$00,$00), ($05,$05,$05), ($05,$05,$05),
($C7,$C7,$C7), ($00,$77,$FF), ($21,$55,$FF), ($82,$37,$FA),
($EB,$2F,$B5), ($FF,$29,$50), ($FF,$22,$00), ($D6,$32,$00),
($C4,$62,$00), ($35,$80,$00), ($05,$8F,$00), ($00,$8A,$55),
($00,$99,$CC), ($21,$21,$21), ($09,$09,$09), ($09,$09,$09),
($FF,$FF,$FF), ($0F,$D7,$FF), ($69,$A2,$FF), ($D4,$80,$FF),
($FF,$45,$F3), ($FF,$61,$8B), ($FF,$88,$33), ($FF,$9C,$12),
($FA,$BC,$20), ($9F,$E3,$0E), ($2B,$F0,$35), ($0C,$F0,$A4),
($05,$FB,$FF), ($5E,$5E,$5E), ($0D,$0D,$0D), ($0D,$0D,$0D),
($FF,$FF,$FF), ($A6,$FC,$FF), ($B3,$EC,$FF), ($DA,$AB,$EB),
($FF,$A8,$F9), ($FF,$AB,$B3), ($FF,$D2,$B0), ($FF,$EF,$A6),
($FF,$F7,$9C), ($D7,$E8,$95), ($A6,$ED,$AF), ($A2,$F2,$DA),
($99,$FF,$FC), ($DD,$DD,$DD), ($11,$11,$11), ($11,$11,$11)
);
attributeSTable: array[0..959] of byte =
(
0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7,
0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7,
0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7,
0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7,
8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15,
8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15,
8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15,
8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15,
16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23,
16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23,
16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23,
16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23,
24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31,
24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31,
24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31,
24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31,
32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39,
32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39,
32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39,
32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39,
40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 47,
40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 47,
40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 47,
40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 47,
48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 51, 51, 51, 51, 52, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55,
48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 51, 51, 51, 51, 52, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55,
48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 51, 51, 51, 51, 52, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55,
48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 51, 51, 51, 51, 52, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55,
56, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 58, 59, 59, 59, 59, 60, 60, 60, 60, 61, 61, 61, 61, 62, 62, 62, 62, 63, 63, 63, 63,
56, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 58, 59, 59, 59, 59, 60, 60, 60, 60, 61, 61, 61, 61, 62, 62, 62, 62, 63, 63, 63, 63
);
attributeBitTable: array[0..959] of byte =
(
0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2,
0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2,
4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6,
4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6,
0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2,
0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2,
4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6,
4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6,
0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2,
0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2,
4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6,
4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6,
0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2,
0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2,
4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6,
4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6,
0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2,
0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2,
4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6,
4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6,
0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2,
0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2,
4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6,
4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6,
0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2,
0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2,
4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6,
4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6, 4, 4, 6, 6,
0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2,
0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2
);
{ TPPU }
/// <summary>
/// 256 色 位图快速拷贝 ,src位图的尺寸要小于dst的尺寸
/// </summary>
/// <param name="dst">目标位图</param>
/// <param name="x">拷贝到目标位图的横坐标</param>
/// <param name="y">拷贝到目标位图的纵坐标</param>
/// <param name="src">源位图</param>
procedure CopyBmpF(var dst: TBitmap; x, y: Integer;var src: TBitmap);
var
w, h, i: Integer;
p_Dst, p_Src: PByteArray;
begin
if (x > dst.Width) or (y > dst.Height) then Exit;
if src.Width > (dst.Width - x) then
w := dst.Width - x
else w := src.Width;
if src.Height > (dst.Height - y) then
h := dst.Height - y
else h := src.Height;
i := 0;
while i < h do begin
p_Dst := dst.ScanLine[y];
p_Src := src.ScanLine[i];
CopyMemory(@p_Dst[x], p_Src, w);
Inc(y);
Inc(i);
end;
end;
/// <summary>
/// 256 色 位图透明色拷贝 ,src位图的尺寸要小于dst的尺寸
/// </summary>
/// <param name="dst">目标位图</param>
/// <param name="x">拷贝到目标位图的横坐标</param>
/// <param name="y">拷贝到目标位图的纵坐标</param>
/// <param name="src">源位图</param>
/// <param name="TC">透明色</param>
procedure CopyBmpT(var dst: TBitmap; x, y: Integer;var src: TBitmap; tc: byte);
var
w, h, i, j, k: Integer;
p_Dst, p_Src: PByteArray;
begin
if (x > dst.Width) or (y > dst.Height) then Exit;
if src.Width > (dst.Width - x) then
w := dst.Width - x
else w := src.Width;
if src.Height > (dst.Height - y) then
h := dst.Height - y
else h := src.Height;
i := 0;
while i < h do begin
p_Dst := dst.ScanLine[y];
p_Src := src.ScanLine[i];
//CopyMemory(@p_Dst[x], p_Src, w);
j := x;
k := 0;
while k < w do begin
if p_Src[k] <> tc then
p_Dst[j] := p_Src[k];
Inc(j);
Inc(k);
end;
Inc(y);
Inc(i);
end;
end;
/// <summary>
///用一种颜色填充位图,适应256色位图
/// </summary>
/// <param name="Bmp"></param>
/// <param name="Color"></param>
procedure FillBmp(var Bmp:TBitmap;Color:Byte);
var
p:PByteArray;
begin
p:=bmp.ScanLine[bmp.height-1];
FillMemory(p,bmp.Height*bmp.Width,Color);
end;
procedure Tppu.RenderBGPixels(b0, b1: byte; CurTileNO: integer; NtNo: integer);
var
bit00, bit01, bit02, bit03, bit04, bit05, bit06, bit07,
bit10, bit11, bit12, bit13, bit14, bit15, bit16, bit17,
low2, Upper2, color_offset, color, at, palNo: byte;
PalAddr:Word;
begin
bit00 := b0 and $1;
bit01 := b0 and $2;
bit02 := b0 and $4;
bit03 := b0 and $8;
bit04 := b0 and $10;
bit05 := b0 and $20;
bit06 := b0 and $40;
bit07 := b0 and $80;
bit10 := b1 and $1;
bit11 := b1 and $2;
bit12 := b1 and $4;
bit13 := b1 and $8;
bit14 := b1 and $10;
bit15 := b1 and $20;
bit16 := b1 and $40;
bit17 := b1 and $80;
ppu_mem[$3f04]:=ppu_mem[$3f00];
ppu_mem[$3f08]:=ppu_mem[$3f00];
ppu_mem[$3f0c]:=ppu_mem[$3f00];
//palNo:=(Registers[0] shr 4) and $1; //select palette table no.
palNo:=0;
at := ppu_mem[nametable[NtNo] + $3C0 + attributeSTable[CurTileNO]];
at := (at shr attributeBitTable[CurTileNO]) and $3;
upper2 := at shl 2;
//0
low2 := (bit10 shl 1) or bit00;
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[7] := color and $3F; //2006.2.9 modifed
//1
low2 := bit11 or (bit01 shr 1);
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[6] := color and $3F; //2006.2.9 modifed
//2
low2 := (bit12 shr 1) or (bit02 shr 2);
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[5] := color and $3F; //2006.2.9 modifed
//3
low2 := (bit13 shr 2) or (bit03 shr 3);
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[4] := color and $3F; //2006.2.9 modifed
//4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -