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

📄 nesppu.pas

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