|
@@ -1,33 +1,34 @@
|
|
|
-/*
|
|
|
- * PPU emulation - The TI-NESulator Project
|
|
|
- * ppu.c
|
|
|
- *
|
|
|
- * Define and emulate the PPU (Picture Processing Unit) of the real NES
|
|
|
- *
|
|
|
- * Created by Manoel TRAPIER.
|
|
|
- * Copyright (c) 2003-2007 986Corp. All rights reserved.
|
|
|
- *
|
|
|
- * $LastChangedDate: 2007-04-06 17:17:01 +0200 (ven, 06 avr 2007) $
|
|
|
- * $Author: mtrapier $
|
|
|
- * $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/ppu.c $
|
|
|
- * $Revision: 32 $
|
|
|
- *
|
|
|
- */
|
|
|
+/*
|
|
|
+ * PPU emulation - The TI-NESulator Project
|
|
|
+ * ppu.c
|
|
|
+ *
|
|
|
+ * Define and emulate the PPU (Picture Processing Unit) of the real NES
|
|
|
+ *
|
|
|
+ * Created by Manoel TRAPIER.
|
|
|
+ * Copyright (c) 2003-2008 986Corp. All rights reserved.
|
|
|
+ *
|
|
|
+ * $LastChangedDate: 2007-04-06 17:17:01 +0200 (ven, 06 avr 2007) $
|
|
|
+ * $Author: mtrapier $
|
|
|
+ * $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/ppu.c $
|
|
|
+ * $Revision: 32 $
|
|
|
+ *
|
|
|
+ */
|
|
|
|
|
|
#include <allegro.h>
|
|
|
#include <stdio.h>
|
|
|
-#include <stdlib.h>
|
|
|
+#include <stdlib.h>
|
|
|
+
|
|
|
#include "ppu.h"
|
|
|
-#include "memory.h"
|
|
|
+#include "memory.h"
|
|
|
#include "M6502.h"
|
|
|
-
|
|
|
-#define __TINES_PLUGINS__
|
|
|
-#include "plugins.h"
|
|
|
+
|
|
|
+#define __TINES_PLUGINS__
|
|
|
+#include "plugins.h"
|
|
|
|
|
|
#define GetTileColor(tile,x1,y1) ( ( ppu.Memory[tile+y1] & (1<<(7-x1)) ) == 0 ? 0 : 1 ) | \
|
|
|
( ( ppu.Memory[tile+y1+8] & (1<<(7-x1)) ) == 0 ? 0 : 1<<1 )
|
|
|
-
|
|
|
-#define GetColor(col) (col&0xFF)
|
|
|
+
|
|
|
+#define GetColor(col) (col&0xFF)
|
|
|
|
|
|
extern PPU ppu;
|
|
|
extern BITMAP *Buffer;
|
|
@@ -37,22 +38,22 @@ unsigned long BgColor;
|
|
|
volatile extern int frame;
|
|
|
|
|
|
volatile extern unsigned long IPS, FPS;
|
|
|
-
|
|
|
-extern unsigned long ColorPalette[ 8 * 63 ];
|
|
|
-
|
|
|
-extern short IRQScanHit;
|
|
|
+
|
|
|
+extern unsigned long ColorPalette[ 8 * 63 ];
|
|
|
+
|
|
|
+extern short IRQScanHit;
|
|
|
|
|
|
byte NOBLIT = 0;
|
|
|
|
|
|
int InitPPU(PPU * ppu)
|
|
|
-{
|
|
|
+{
|
|
|
int i;
|
|
|
if ((ppu->Memory = (unsigned char *) malloc(0x4000)) == NULL)
|
|
|
return -1;
|
|
|
|
|
|
NOBLIT = 0;
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
|
|
|
/* Initializing register.. */
|
|
|
ppu->In_VBlank = 0;
|
|
@@ -83,28 +84,28 @@ int InitPPU(PPU * ppu)
|
|
|
ppu->DisplayAttributeTable = ~0;
|
|
|
ppu->DisplayPalette = ~0;
|
|
|
ppu->DisplayVRAM = ~0;
|
|
|
-
|
|
|
-
|
|
|
- /* Set PPU registers */
|
|
|
- set_page_rd_hook(0x20, ReadPPUReg);
|
|
|
- set_page_wr_hook(0x20, WritePPUReg);
|
|
|
-
|
|
|
- set_page_readable(0x20, true);
|
|
|
- set_page_writeable(0x20, true);
|
|
|
-
|
|
|
-
|
|
|
- /* Set PPU Ghost Registers */
|
|
|
- for(i = 0x21; i < 0x40; i++)
|
|
|
- set_page_ghost(i, true, 0x20);
|
|
|
-
|
|
|
- plugin_install_keypressHandler('i', DebugSprites);
|
|
|
- plugin_install_keypressHandler('I', DebugSprites);
|
|
|
-
|
|
|
- plugin_install_keypressHandler('u', DebugColor);
|
|
|
- plugin_install_keypressHandler('U', DebugColor);
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
+ /* Set PPU registers */
|
|
|
+ set_page_rd_hook(0x20, ReadPPUReg);
|
|
|
+ set_page_wr_hook(0x20, WritePPUReg);
|
|
|
+
|
|
|
+ set_page_readable(0x20, true);
|
|
|
+ set_page_writeable(0x20, true);
|
|
|
+
|
|
|
+
|
|
|
+ /* Set PPU Ghost Registers */
|
|
|
+ for(i = 0x21; i < 0x40; i++)
|
|
|
+ set_page_ghost(i, true, 0x20);
|
|
|
+
|
|
|
+ plugin_install_keypressHandler('i', DebugSprites);
|
|
|
+ plugin_install_keypressHandler('I', DebugSprites);
|
|
|
+
|
|
|
+ plugin_install_keypressHandler('u', DebugColor);
|
|
|
+ plugin_install_keypressHandler('U', DebugColor);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -269,7 +270,7 @@ void NewPPUDispSprite()
|
|
|
unsigned long Color;
|
|
|
PPUSprite sprite;
|
|
|
unsigned short bg;
|
|
|
- short SprtAddr;
|
|
|
+ short SprtAddr;
|
|
|
|
|
|
for (i = 63; i >= 0; i--)
|
|
|
{
|
|
@@ -550,19 +551,19 @@ void DebugSprites()
|
|
|
}
|
|
|
NOBLIT = 0;
|
|
|
}
|
|
|
-
|
|
|
-#define GetTilePos(addr,x,y) (addr+x+(y*32))
|
|
|
-
|
|
|
-void ppu_displayNameTables()
|
|
|
-{
|
|
|
+
|
|
|
+#define GetTilePos(addr,x,y) (addr+x+(y*32))
|
|
|
+
|
|
|
+void ppu_displayNameTables()
|
|
|
+{
|
|
|
int x, y, x1, y1, i;
|
|
|
|
|
|
unsigned long Reg2;
|
|
|
unsigned short ab_x, ab_y;
|
|
|
unsigned short Color;
|
|
|
unsigned short AttrByte;
|
|
|
-unsigned short TileID;
|
|
|
-
|
|
|
+unsigned short TileID;
|
|
|
+
|
|
|
if (ppu.DisplayAttributeTable)
|
|
|
{
|
|
|
/* NT 2000 */
|
|
@@ -795,8 +796,8 @@ unsigned short TileID;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
-}
|
|
|
+
|
|
|
+}
|
|
|
|
|
|
|
|
|
int
|
|
@@ -808,22 +809,22 @@ unsigned long Reg2;
|
|
|
unsigned short ab_x, ab_y;
|
|
|
unsigned long Color;
|
|
|
unsigned short AttrByte;
|
|
|
-unsigned short TileID;
|
|
|
+unsigned short TileID;
|
|
|
static short LAST_FPS = 0;
|
|
|
-unsigned char XScroll, YScroll;
|
|
|
+unsigned char XScroll, YScroll;
|
|
|
|
|
|
ppu.StatusRegister.b |= PPU_FLAG_SR_VBLANK;
|
|
|
|
|
|
- BgColor = ppu.Memory[0x3F00];//0xC0;
|
|
|
+ BgColor = ppu.Memory[0x3F00];//0xC0;
|
|
|
|
|
|
//goto NoDraw;
|
|
|
|
|
|
acquire_bitmap(Buffer);
|
|
|
|
|
|
clear_to_color(Buffer, GetColor(BgColor));
|
|
|
-
|
|
|
-
|
|
|
- ppu_displayNameTables();
|
|
|
+
|
|
|
+
|
|
|
+ ppu_displayNameTables();
|
|
|
|
|
|
if (ppu.ControlRegister2.s.Colour != 0)
|
|
|
printf("ppu.ColorEmphasis : %d\n", ppu.ControlRegister2.s.Colour);
|
|
@@ -839,7 +840,7 @@ unsigned char XScroll, YScroll;
|
|
|
* A faires les choses qui faut faire durant un lancé de vblank,
|
|
|
* comme dessiner par ex..
|
|
|
*/
|
|
|
-
|
|
|
+
|
|
|
|
|
|
if (((ppu.ControlRegister2.b & PPU_CR2_BGVISIBILITY) != 0) || ppu.ForceBgVisibility)
|
|
|
{
|
|
@@ -862,28 +863,28 @@ scanline start (if background and sprites are enabled):
|
|
|
v:0000 0100 0001 1111=t:0000 0100 0001 1111
|
|
|
1111 1198 7654 3210
|
|
|
5432 10
|
|
|
-*/
|
|
|
- if ((y == IRQScanHit)||(y == IRQScanHit + 1))
|
|
|
- printf("%s: IRQ Hit : bf Reg2: 0x%04X\n", __func__, ppu.VRAMAddrReg2.W);
|
|
|
-
|
|
|
-#define PPU_SSCAN_MASK 0x041F
|
|
|
+*/
|
|
|
+ if ((y == IRQScanHit)||(y == IRQScanHit + 1))
|
|
|
+ printf("%s: IRQ Hit : bf Reg2: 0x%04X\n", __func__, ppu.VRAMAddrReg2.W);
|
|
|
+
|
|
|
+#define PPU_SSCAN_MASK 0x041F
|
|
|
|
|
|
ppu.VRAMAddrReg2.W = (ppu.VRAMAddrReg2.W & (~PPU_SSCAN_MASK))
|
|
|
| (ppu.TimedTmpPtr[y] & PPU_SSCAN_MASK )
|
|
|
| 0x2000;
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
TileID = (PPU_Rd(ppu.VRAMAddrReg2.W) << 4)
|
|
|
| ppu.Bg_Pattern_Table;
|
|
|
|
|
|
- XScroll = ppu.TimedHScroll[y];
|
|
|
-
|
|
|
- if (y == IRQScanHit)
|
|
|
- printf("%s: IRQ Hit : Reg2: 0x%04X TmpPtr:0x%04X \n", __func__, ppu.VRAMAddrReg2.W, ppu.TimedTmpPtr[y]);
|
|
|
-
|
|
|
- if (y == IRQScanHit + 1)
|
|
|
- printf("%s: IRQ Hit + 1: Reg2: 0x%04X TmpPtr:0x%04X \n", __func__, ppu.VRAMAddrReg2.W, ppu.TimedTmpPtr[y]);
|
|
|
-
|
|
|
+ XScroll = ppu.TimedHScroll[y];
|
|
|
+
|
|
|
+ if (y == IRQScanHit)
|
|
|
+ printf("%s: IRQ Hit : Reg2: 0x%04X TmpPtr:0x%04X \n", __func__, ppu.VRAMAddrReg2.W, ppu.TimedTmpPtr[y]);
|
|
|
+
|
|
|
+ if (y == IRQScanHit + 1)
|
|
|
+ printf("%s: IRQ Hit + 1: Reg2: 0x%04X TmpPtr:0x%04X \n", __func__, ppu.VRAMAddrReg2.W, ppu.TimedTmpPtr[y]);
|
|
|
+
|
|
|
|
|
|
for (x = 0; x < 256; x++)
|
|
|
{
|
|
@@ -953,7 +954,7 @@ Y = (ppu.VRAMAddrReg2.W & 0x3E0) >> 5
|
|
|
/* if ((ppu.VRAMAddrReg2.W & 0x400))
|
|
|
ppu.VRAMAddrReg2.W &= ~0x400;
|
|
|
else
|
|
|
- ppu.VRAMAddrReg2.W |= 0x400;*/
|
|
|
+ ppu.VRAMAddrReg2.W |= 0x400;*/
|
|
|
ppu.VRAMAddrReg2.W ^= 0x400;
|
|
|
}
|
|
|
else
|
|
@@ -973,12 +974,12 @@ from this.. if you manually set the value above 29 (from either 2005 or
|
|
|
2006), the wrapping from 29 obviously won't happen, and attrib data will be
|
|
|
used as name table data. the "y scroll" still wraps to 0 from 31, but
|
|
|
without switching bit 11. this explains why writing 240+ to 'Y' in 2005
|
|
|
-appeared as a negative scroll value.
|
|
|
-
|
|
|
+appeared as a negative scroll value.
|
|
|
+
|
|
|
8421 8421 8421 8421
|
|
|
v:0000 0011 1110 0000
|
|
|
1111 1198 7654 3210
|
|
|
- 5432 10
|
|
|
+ 5432 10
|
|
|
|
|
|
*/
|
|
|
YScroll++;
|
|
@@ -993,13 +994,13 @@ v:0000 0011 1110 0000
|
|
|
/* if ((ppu.VRAMAddrReg2.W & 0x800))
|
|
|
ppu.VRAMAddrReg2.W &= ~0x800;
|
|
|
else
|
|
|
- ppu.VRAMAddrReg2.W |= 0x800;*/
|
|
|
-
|
|
|
+ ppu.VRAMAddrReg2.W |= 0x800;*/
|
|
|
+
|
|
|
ppu.VRAMAddrReg2.W ^= 0x800;
|
|
|
}
|
|
|
else
|
|
|
{ /* on incremente juste */
|
|
|
- ppu.VRAMAddrReg2.W = (ppu.VRAMAddrReg2.W & (~0x3F0))
|
|
|
+ ppu.VRAMAddrReg2.W = (ppu.VRAMAddrReg2.W & (~0x3F0))
|
|
|
| ((((ppu.VRAMAddrReg2.W & 0x3F0) >> 5) + 1) << 5);
|
|
|
}
|
|
|
}
|
|
@@ -1089,31 +1090,31 @@ v:0000 0011 1110 0000
|
|
|
}
|
|
|
|
|
|
for (i = 0; i < 240; i++)
|
|
|
- {
|
|
|
- _putpixel(Buffer, 257 + 0, i, 48);
|
|
|
+ {
|
|
|
+ _putpixel(Buffer, 257 + 0, i, 48);
|
|
|
|
|
|
- _putpixel(Buffer, 257 + 1, i, ((ppu.TimedTmpPtr[y]*4))&0xFF);
|
|
|
- _putpixel(Buffer, 257 + 2, i, ((ppu.TimedTmpPtr[y]*4)>>8)&0xFF);
|
|
|
- _putpixel(Buffer, 257 + 3, i, ((ppu.TimedTmpPtr[y]*4)>>16)&0xFF);
|
|
|
+ _putpixel(Buffer, 257 + 1, i, ((ppu.TimedTmpPtr[y]*4))&0xFF);
|
|
|
+ _putpixel(Buffer, 257 + 2, i, ((ppu.TimedTmpPtr[y]*4)>>8)&0xFF);
|
|
|
+ _putpixel(Buffer, 257 + 3, i, ((ppu.TimedTmpPtr[y]*4)>>16)&0xFF);
|
|
|
|
|
|
- _putpixel(Buffer, 257 + 4, i, ((ppu.TmpVScroll*4))&0xFF);
|
|
|
- _putpixel(Buffer, 257 + 5, i, ((ppu.TmpVScroll*4)>>8)&0xFF);
|
|
|
- _putpixel(Buffer, 257 + 6, i, ((ppu.TmpVScroll*4)>>16)&0xFF);
|
|
|
+ _putpixel(Buffer, 257 + 4, i, ((ppu.TmpVScroll*4))&0xFF);
|
|
|
+ _putpixel(Buffer, 257 + 5, i, ((ppu.TmpVScroll*4)>>8)&0xFF);
|
|
|
+ _putpixel(Buffer, 257 + 6, i, ((ppu.TmpVScroll*4)>>16)&0xFF);
|
|
|
|
|
|
- _putpixel(Buffer, 257 + 7, i, ((ppu.TimedHScroll[i]*4)) & 0xFF);
|
|
|
- _putpixel(Buffer, 257 + 8, i, ((ppu.TimedHScroll[i]*4)>>8) & 0xFF);
|
|
|
- _putpixel(Buffer, 257 + 9, i, ((ppu.TimedHScroll[i]*4)>>16)& 0xFF);
|
|
|
-
|
|
|
- _putpixel(Buffer, 257 + 10, i, 48);
|
|
|
+ _putpixel(Buffer, 257 + 7, i, ((ppu.TimedHScroll[i]*4)) & 0xFF);
|
|
|
+ _putpixel(Buffer, 257 + 8, i, ((ppu.TimedHScroll[i]*4)>>8) & 0xFF);
|
|
|
+ _putpixel(Buffer, 257 + 9, i, ((ppu.TimedHScroll[i]*4)>>16)& 0xFF);
|
|
|
+
|
|
|
+ _putpixel(Buffer, 257 + 10, i, 48);
|
|
|
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- if (IRQScanHit != -1)
|
|
|
- {
|
|
|
- line(Buffer, 257+12, IRQScanHit, 257+22, IRQScanHit, 10);
|
|
|
- line(Buffer, 257+12, IRQScanHit, 257+18, IRQScanHit-3, 10);
|
|
|
- line(Buffer, 257+12, IRQScanHit, 257+18, IRQScanHit+3, 10);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if (IRQScanHit != -1)
|
|
|
+ {
|
|
|
+ line(Buffer, 257+12, IRQScanHit, 257+22, IRQScanHit, 10);
|
|
|
+ line(Buffer, 257+12, IRQScanHit, 257+18, IRQScanHit-3, 10);
|
|
|
+ line(Buffer, 257+12, IRQScanHit, 257+18, IRQScanHit+3, 10);
|
|
|
}
|
|
|
|
|
|
NoDraw:
|
|
@@ -1140,7 +1141,7 @@ byte ReadPPUReg(byte RegID)
|
|
|
{
|
|
|
/* RegID is the nb of the reg 0-7 */
|
|
|
unsigned char ret;
|
|
|
- RegID &= 0x07;
|
|
|
+ RegID &= 0x07;
|
|
|
|
|
|
switch (RegID)
|
|
|
{
|
|
@@ -1187,12 +1188,12 @@ byte ReadPPUReg(byte RegID)
|
|
|
void WritePPUReg(byte RegID, byte val)
|
|
|
{
|
|
|
/* RegID is the nb of the reg 0-7 */
|
|
|
-
|
|
|
- RegID &= 0x07;
|
|
|
+
|
|
|
+ RegID &= 0x07;
|
|
|
|
|
|
switch (RegID)
|
|
|
{
|
|
|
- default:/* For not writeable reg */
|
|
|
+ default:/* For not writeable reg */
|
|
|
printf("WritePPU error\n");
|
|
|
break;
|
|
|
case 0: /* Control Register 1 */
|
|
@@ -1221,7 +1222,7 @@ t:0000 1100 0000 0000 = d:0000 0011
|
|
|
*/
|
|
|
ppu.TmpVRamPtr = ( (ppu.TmpVRamPtr & 0xF3FF)
|
|
|
| ( (ppu.ControlRegister1.s.NameTblAddr & 0x03) << 10 )
|
|
|
- );
|
|
|
+ );
|
|
|
|
|
|
break;
|
|
|
case 1: /* Control Register 2 */
|
|
@@ -1241,30 +1242,30 @@ t:0000 1100 0000 0000 = d:0000 0011
|
|
|
2005 first write:
|
|
|
t:0000 0000 0001 1111=d:1111 1000
|
|
|
x=d:00000111
|
|
|
-*/
|
|
|
+*/
|
|
|
//printf("2005[1st][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
|
|
ppu.VRAMAddrMode = 1;
|
|
|
|
|
|
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xFFE0) | ((val & 0xF8) >> 3));
|
|
|
ppu.HScroll = val & 0x7;
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
//printf("2005[1st][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
|
|
//printf("%d -> 2005 w1: 0x%04X (val: 0x%02X)\n", ScanLine, ppu.TmpVRamPtr, val);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
/*
|
|
|
-2005 second write:
|
|
|
-
|
|
|
- 1111 1100 0000 0000
|
|
|
- 5432 1098 7654 3210
|
|
|
-
|
|
|
- 8421 8421 8421 8421
|
|
|
+2005 second write:
|
|
|
+
|
|
|
+ 1111 1100 0000 0000
|
|
|
+ 5432 1098 7654 3210
|
|
|
+
|
|
|
+ 8421 8421 8421 8421
|
|
|
-------------------
|
|
|
t:0000 0011 1110 0000=d:1111 1000
|
|
|
t:0111 0000 0000 0000=d:0000 0111
|
|
|
-*/
|
|
|
+*/
|
|
|
//printf("2005[2nd][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
|
|
ppu.VRAMAddrMode = 0;
|
|
|
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & ~(0x03E0)) | ((val & 0xF8) << 2));
|
|
@@ -1273,8 +1274,8 @@ t:0111 0000 0000 0000=d:0000 0111
|
|
|
ppu.TmpVScroll = (val & 0x7);
|
|
|
//if (ppu.TmpVScroll != 0)
|
|
|
//printf("2002: TmpVScroll == %d \n", ppu.TmpVScroll);
|
|
|
-
|
|
|
- //printf("2005[2nd][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
|
|
+
|
|
|
+ //printf("2005[2nd][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
|
|
|
|
|
//printf("%d -> 2005 w2: 0x%04X (val: 0x%02X)\n", ScanLine, ppu.TmpVRamPtr, val);
|
|
|
|
|
@@ -1282,7 +1283,7 @@ t:0111 0000 0000 0000=d:0000 0111
|
|
|
break;
|
|
|
case 6: /* VRAM Address register 2 */
|
|
|
if (ppu.VRAMAddrMode == 0)
|
|
|
- {
|
|
|
+ {
|
|
|
//printf("2006[1st][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
|
|
ppu.VRAMAddrMode = 1;
|
|
|
/*
|
|
@@ -1291,12 +1292,12 @@ t:0011 1111 0000 0000 = d:0011 1111
|
|
|
t:1100 0000 0000 0000=0
|
|
|
*/
|
|
|
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0x00FF) | ((val&0x3F) << 8));
|
|
|
- //printf("2006[1st][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
|
|
+ //printf("2006[1st][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
|
|
|
|
|
//printf("%d -> 2006 w1: 0x%04X (val: 0x%02X)\n", ScanLine, ppu.TmpVRamPtr, val);
|
|
|
}
|
|
|
else
|
|
|
- {
|
|
|
+ {
|
|
|
//printf("2006[2nd][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
|
|
ppu.VRAMAddrMode = 0;
|
|
|
/*
|
|
@@ -1317,12 +1318,12 @@ v=t
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
-void FillSprRamDMA(byte value)
|
|
|
-{
|
|
|
- int i;
|
|
|
- for (i = 0x00; i < 0x100; i++)
|
|
|
- {
|
|
|
- ppu.SPRRAM[i] = ReadMemory( value, i);
|
|
|
- }
|
|
|
-}
|
|
|
+
|
|
|
+void FillSprRamDMA(byte value)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+ for (i = 0x00; i < 0x100; i++)
|
|
|
+ {
|
|
|
+ ppu.SPRRAM[i] = ReadMemory( value, i);
|
|
|
+ }
|
|
|
+}
|