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

📄 nesppu.pas

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