Some more
This commit is contained in:
parent
735217df00
commit
02a8b24523
@ -3,7 +3,7 @@
|
||||
* NESCart.c
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
||||
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-05-02 18:37:41 +0200 (mer, 02 mai 2007) $
|
||||
* $Author: mtrapier $
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
* NESCart.h
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
||||
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-04-16 01:55:35 +0200 (lun, 16 avr 2007) $
|
||||
* $Author: godzil $
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
* mappers.h
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
||||
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
* memory.h - Taken from the Quick6502 project
|
||||
*
|
||||
* Created by Manoël Trapier on 18/09/06.
|
||||
* Copyright 2003-2007 986 Corp. All rights reserved.
|
||||
* Copyright 2003-2008 986 Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-04-05 16:30:20 +0200 (jeu, 05 avr 2007) $
|
||||
* $Author: mtrapier $
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
* paddle.h
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
||||
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-04-16 01:55:35 +0200 (lun, 16 avr 2007) $
|
||||
* $Author: godzil $
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
* plugins.h
|
||||
*
|
||||
* Created by Manoel TRAPIER on 02/04/07.
|
||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
||||
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
* ppu.debug.h
|
||||
*
|
||||
* Created by Manoël Trapier on 12/04/07.
|
||||
* Copyright 2003-2007 986 Corp. All rights reserved.
|
||||
* Copyright 2003-2008 986 Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-05-24 15:11:55 +0200 (jeu, 24 mai 2007) $
|
||||
* $Author: mtrapier $
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Define and emulate the PPU (Picture Processing Unit) of the real NES
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
||||
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-04-26 18:47:34 +0200 (jeu, 26 avr 2007) $
|
||||
* $Author: mtrapier $
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
* ppu.memory.h - Inspired from the memory manager of the Quick6502 Project.
|
||||
*
|
||||
* Created by Manoël Trapier on 12/04/07.
|
||||
* Copyright 2003-2007 986 Corp. All rights reserved.
|
||||
* Copyright 2003-2008 986 Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-05-24 15:11:55 +0200 (jeu, 24 mai 2007) $
|
||||
* $Author: mtrapier $
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
* types.h - Taken from the Quick6502 project
|
||||
*
|
||||
* Created by Manoël Trapier on 18/09/06.
|
||||
* Copyright 2003-2007 986 Corp. All rights reserved.
|
||||
* Copyright 2003-2008 986 Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-03-28 15:50:50 +0200 (mer, 28 mar 2007) $
|
||||
* $Author: mtrapier $
|
||||
|
||||
@ -1025,7 +1025,7 @@ int main(int argc, char *argv[])
|
||||
|
||||
Reset6502(&MainCPU);
|
||||
|
||||
MainCPU.Trace = 0;
|
||||
MainCPU.Trace = 1;
|
||||
|
||||
if (START_DEBUG)
|
||||
MainCPU.Trace = 1;
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
* aorom.h
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
||||
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-04-26 18:47:34 +0200 (jeu, 26 avr 2007) $
|
||||
* $Author: mtrapier $
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
* cnrom.c
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
||||
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-04-16 01:55:35 +0200 (lun, 16 avr 2007) $
|
||||
* $Author: godzil $
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
* cnrom.h
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
||||
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-04-16 01:55:35 +0200 (lun, 16 avr 2007) $
|
||||
* $Author: godzil $
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
* genericmapper.h
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
||||
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-04-16 01:55:35 +0200 (lun, 16 avr 2007) $
|
||||
* $Author: godzil $
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
* iremh3001.h
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
||||
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-04-16 01:55:35 +0200 (lun, 16 avr 2007) $
|
||||
* $Author: godzil $
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
* mmc1.h
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
||||
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-05-02 18:37:41 +0200 (mer, 02 mai 2007) $
|
||||
* $Author: mtrapier $
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
* mmc1.h
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
||||
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-05-02 18:37:41 +0200 (mer, 02 mai 2007) $
|
||||
* $Author: mtrapier $
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
* mmc3.h
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
||||
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-05-02 18:37:41 +0200 (mer, 02 mai 2007) $
|
||||
* $Author: mtrapier $
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
* mmc3.h
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
||||
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-05-02 18:37:41 +0200 (mer, 02 mai 2007) $
|
||||
* $Author: mtrapier $
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
* norom.c
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
||||
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-04-16 01:55:35 +0200 (lun, 16 avr 2007) $
|
||||
* $Author: godzil $
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
* norom.c
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
||||
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-04-16 01:55:35 +0200 (lun, 16 avr 2007) $
|
||||
* $Author: godzil $
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
* unrom.h
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
||||
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-04-16 01:55:35 +0200 (lun, 16 avr 2007) $
|
||||
* $Author: godzil $
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
* unrom.h
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
||||
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-04-16 01:55:35 +0200 (lun, 16 avr 2007) $
|
||||
* $Author: godzil $
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
* genericmapper.h
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
||||
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-04-16 01:55:35 +0200 (lun, 16 avr 2007) $
|
||||
* $Author: godzil $
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
* mmc1.h
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
||||
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-05-02 18:37:41 +0200 (mer, 02 mai 2007) $
|
||||
* $Author: mtrapier $
|
||||
@ -139,24 +139,24 @@ void mmc1_ApplyReg0Mod()
|
||||
|
||||
//printf("Change to reg0 done ! (0x%x)\n\tMiror flag : %d\n\tOneScreen Flag : %d\n\tPRG Size : %d\n\tPRG Area : %d\n\tVROM Switch size : %d\n", MMC1_reg0, MMC1_reg0 & MMC1_R0_MIRROR, MMC1_reg0 & MMC1_R0_ONESCREEN, MMC1_reg0 & MMC1_R0_PRGAREA, MMC1_reg0 & MMC1_R0_PRGSIZE, MMC1_reg0 & MMC1_R0_VROMSW);
|
||||
|
||||
switch (MMC1_reg0 & 0x03)
|
||||
{
|
||||
case 0:
|
||||
ppu_setScreenMode(PPU_SCMODE_SINGLE);
|
||||
ppu_setSingleScreen(PPU_SCREEN_000);
|
||||
break;
|
||||
case 1:
|
||||
ppu_setScreenMode(PPU_SCMODE_SINGLE);
|
||||
ppu_setSingleScreen(PPU_SCREEN_400);
|
||||
break;
|
||||
case 2:
|
||||
ppu_setScreenMode(PPU_SCMODE_NORMAL);
|
||||
ppu_setMirroring(PPU_MIRROR_VERTICAL);
|
||||
break;
|
||||
case 3:
|
||||
ppu_setScreenMode(PPU_SCMODE_NORMAL);
|
||||
ppu_setMirroring(PPU_MIRROR_HORIZTAL);
|
||||
break;
|
||||
switch (MMC1_reg0 & 0x03)
|
||||
{
|
||||
case 0:
|
||||
ppu_setScreenMode(PPU_SCMODE_SINGLE);
|
||||
ppu_setSingleScreen(PPU_SCREEN_000);
|
||||
break;
|
||||
case 1:
|
||||
ppu_setScreenMode(PPU_SCMODE_SINGLE);
|
||||
ppu_setSingleScreen(PPU_SCREEN_400);
|
||||
break;
|
||||
case 2:
|
||||
ppu_setScreenMode(PPU_SCMODE_NORMAL);
|
||||
ppu_setMirroring(PPU_MIRROR_VERTICAL);
|
||||
break;
|
||||
case 3:
|
||||
ppu_setScreenMode(PPU_SCMODE_NORMAL);
|
||||
ppu_setMirroring(PPU_MIRROR_HORIZTAL);
|
||||
break;
|
||||
}
|
||||
|
||||
if ( (OldSwitchArea != (MMC1_reg0 & MMC1_R0_PRGAREA)) && ((MMC1_reg0 & MMC1_R0_PRGSIZE) != 0 ) )
|
||||
@ -175,7 +175,7 @@ void mmc1_ApplyReg0Mod()
|
||||
|
||||
}
|
||||
|
||||
OldSwitchArea = (MMC1_reg0 & MMC1_R0_PRGAREA);
|
||||
OldSwitchArea = (MMC1_reg0 & MMC1_R0_PRGAREA);
|
||||
}
|
||||
|
||||
}
|
||||
@ -234,10 +234,10 @@ void mmc1_MapperWriteReg1(register byte Addr, register byte Value)
|
||||
|
||||
VROMBankNb = (MMC1_reg1 /* & MMC1_R1_VROMB1 */ );
|
||||
|
||||
if (Cart->VROMSize == 0)
|
||||
{
|
||||
if (Cart->VROMSize == 0)
|
||||
{
|
||||
printf("Try to change VROM but with didn't have any VROM ! [%04X]\n", VROMBankNb);
|
||||
return;
|
||||
return;
|
||||
}
|
||||
|
||||
if ( (MMC1_reg0 & MMC1_R0_VROMSW) != 0 )
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
* mappers.c
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
||||
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-05-31 18:00:41 +0200 (jeu, 31 mai 2007) $
|
||||
* $Author: mtrapier $
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
* memory.c - Taken from the Quick6502 project
|
||||
*
|
||||
* Created by Manoël Trapier on 18/09/06.
|
||||
* Copyright 2003-2007 986 Corp. All rights reserved.
|
||||
* Copyright 2003-2008 986 Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-05-02 18:37:41 +0200 (mer, 02 mai 2007) $
|
||||
* $Author: mtrapier $
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
* paddle.c
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
||||
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-05-02 18:37:41 +0200 (mer, 02 mai 2007) $
|
||||
* $Author: mtrapier $
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
* plugins.c
|
||||
*
|
||||
* Created by Manoel TRAPIER on 02/04/07.
|
||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
||||
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
|
||||
@ -1,20 +1,20 @@
|
||||
/*
|
||||
* PPU emulation - The TI-NESulator Project
|
||||
* oldppu.c
|
||||
*
|
||||
* Old code for the PPU, still here for unknown purposes
|
||||
*
|
||||
* 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-03-29 12:05:12 +0200 (jeu, 29 mar 2007) $
|
||||
* $Author: mtrapier $
|
||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/oldppu.c $
|
||||
* $Revision: 28 $
|
||||
*
|
||||
*/
|
||||
/*
|
||||
* PPU emulation - The TI-NESulator Project
|
||||
* oldppu.c
|
||||
*
|
||||
* Old code for the PPU, still here for unknown purposes
|
||||
*
|
||||
* 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-03-29 12:05:12 +0200 (jeu, 29 mar 2007) $
|
||||
* $Author: mtrapier $
|
||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/oldppu.c $
|
||||
* $Revision: 28 $
|
||||
*
|
||||
*/
|
||||
#include <allegro.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
237
src/ppu/ppu.24.c
237
src/ppu/ppu.24.c
@ -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)
|
||||
|
||||
#define GetColor(col) (col)
|
||||
|
||||
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;
|
||||
}
|
||||
@ -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,13 +809,13 @@ 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;
|
||||
|
||||
@ -836,7 +837,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,20 +863,20 @@ v:0000 0100 0001 1111=t:0000 0100 0001 1111
|
||||
1111 1198 7654 3210
|
||||
5432 10
|
||||
*/
|
||||
//if (y == 142)
|
||||
// printf("______________142 Ptr:0x%04X ____ 0x%04X\n", ppu.TimedTmpPtr[y], ppu.VRAMAddrReg2.W);
|
||||
//if (y == 142)
|
||||
// printf("______________142 Ptr:0x%04X ____ 0x%04X\n", ppu.TimedTmpPtr[y], ppu.VRAMAddrReg2.W);
|
||||
|
||||
ppu.VRAMAddrReg2.W = (ppu.VRAMAddrReg2.W & 0xFBE0)
|
||||
| ((ppu.TimedTmpPtr[y]) & 0x041F)
|
||||
| 0x2000;
|
||||
|
||||
//if (y == 142)
|
||||
|
||||
//if (y == 142)
|
||||
// printf("______________142 Ptr:0x%04X ____ 0x%04X\n", ppu.TimedTmpPtr[y], ppu.VRAMAddrReg2.W);
|
||||
|
||||
TileID = (PPU_Rd(ppu.VRAMAddrReg2.W) << 4)
|
||||
| ppu.Bg_Pattern_Table;
|
||||
|
||||
XScroll = ppu.TimedHScroll[y];
|
||||
XScroll = ppu.TimedHScroll[y];
|
||||
|
||||
for (x = 0; x < 256; x++)
|
||||
{
|
||||
@ -1072,31 +1073,31 @@ appeared as a negative scroll value.
|
||||
}
|
||||
|
||||
for (i = 0; i < 240; i++)
|
||||
{
|
||||
_putpixel8(Buffer, 257 + 0, i, 0xFFFFFFFF);
|
||||
{
|
||||
_putpixel8(Buffer, 257 + 0, i, 0xFFFFFFFF);
|
||||
|
||||
_putpixel8(Buffer, 257 + 1, i, ppu.TimedTmpPtr[y]*4 | 0xFF000000);
|
||||
_putpixel8(Buffer, 257 + 2, i, ppu.TimedTmpPtr[y]*4 | 0xFF000000);
|
||||
_putpixel8(Buffer, 257 + 3, i, ppu.TimedTmpPtr[y]*4 | 0xFF000000);
|
||||
_putpixel8(Buffer, 257 + 1, i, ppu.TimedTmpPtr[y]*4 | 0xFF000000);
|
||||
_putpixel8(Buffer, 257 + 2, i, ppu.TimedTmpPtr[y]*4 | 0xFF000000);
|
||||
_putpixel8(Buffer, 257 + 3, i, ppu.TimedTmpPtr[y]*4 | 0xFF000000);
|
||||
|
||||
_putpixel8(Buffer, 257 + 4, i, ppu.TmpVScroll*4 | 0xFF000000);
|
||||
_putpixel8(Buffer, 257 + 5, i, ppu.TmpVScroll*4 | 0xFF000000);
|
||||
_putpixel8(Buffer, 257 + 6, i, ppu.TmpVScroll*4 | 0xFF000000);
|
||||
_putpixel8(Buffer, 257 + 4, i, ppu.TmpVScroll*4 | 0xFF000000);
|
||||
_putpixel8(Buffer, 257 + 5, i, ppu.TmpVScroll*4 | 0xFF000000);
|
||||
_putpixel8(Buffer, 257 + 6, i, ppu.TmpVScroll*4 | 0xFF000000);
|
||||
|
||||
_putpixel8(Buffer, 257 + 7, i, ppu.TimedHScroll[i]*4 | 0xFF000000);
|
||||
_putpixel8(Buffer, 257 + 8, i, ppu.TimedHScroll[i]*4 | 0xFF000000);
|
||||
_putpixel8(Buffer, 257 + 9, i, ppu.TimedHScroll[i]*4 | 0xFF000000);
|
||||
|
||||
_putpixel8(Buffer, 257 + 10, i, 0xFFFFFFFF);
|
||||
_putpixel8(Buffer, 257 + 7, i, ppu.TimedHScroll[i]*4 | 0xFF000000);
|
||||
_putpixel8(Buffer, 257 + 8, i, ppu.TimedHScroll[i]*4 | 0xFF000000);
|
||||
_putpixel8(Buffer, 257 + 9, i, ppu.TimedHScroll[i]*4 | 0xFF000000);
|
||||
|
||||
_putpixel8(Buffer, 257 + 10, i, 0xFFFFFFFF);
|
||||
|
||||
}
|
||||
|
||||
|
||||
if (IRQScanHit != -1)
|
||||
{
|
||||
line(Buffer, 257+12, IRQScanHit, 257+22, IRQScanHit, 0xFF00FF);
|
||||
line(Buffer, 257+12, IRQScanHit, 257+18, IRQScanHit-3, 0xFF00FF);
|
||||
line(Buffer, 257+12, IRQScanHit, 257+18, IRQScanHit+3, 0xFF00FF);
|
||||
}
|
||||
|
||||
|
||||
if (IRQScanHit != -1)
|
||||
{
|
||||
line(Buffer, 257+12, IRQScanHit, 257+22, IRQScanHit, 0xFF00FF);
|
||||
line(Buffer, 257+12, IRQScanHit, 257+18, IRQScanHit-3, 0xFF00FF);
|
||||
line(Buffer, 257+12, IRQScanHit, 257+18, IRQScanHit+3, 0xFF00FF);
|
||||
}
|
||||
|
||||
NoDraw:
|
||||
@ -1123,7 +1124,7 @@ byte ReadPPUReg(byte RegID)
|
||||
{
|
||||
/* RegID is the nb of the reg 0-7 */
|
||||
unsigned char ret;
|
||||
RegID &= 0x07;
|
||||
RegID &= 0x07;
|
||||
|
||||
switch (RegID)
|
||||
{
|
||||
@ -1170,12 +1171,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 */
|
||||
@ -1224,30 +1225,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 & 0xFC1F) | ((val & 0xF8) << 2));
|
||||
@ -1256,8 +1257,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);
|
||||
|
||||
@ -1265,7 +1266,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;
|
||||
/*
|
||||
@ -1274,12 +1275,12 @@ t:0011 1111 0000 0000 = d:0011 1111
|
||||
t:1100 0000 0000 0000=0
|
||||
*/
|
||||
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xC0FF) | ((val&0x3F) << 8)) & 0x3FFF;
|
||||
//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;
|
||||
/*
|
||||
@ -1300,12 +1301,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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Define and emulate the PPU (Picture Processing Unit) of the real NES
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
||||
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-05-31 18:02:16 +0200 (jeu, 31 mai 2007) $
|
||||
* $Author: mtrapier $
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
* ppu.memory.c - Inspired from the memory manager of the Quick6502 Project.
|
||||
*
|
||||
* Created by Manoël Trapier on 12/04/07.
|
||||
* Copyright 2003-2007 986 Corp. All rights reserved.
|
||||
* Copyright 2003-2008 986 Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-05-24 15:11:55 +0200 (jeu, 24 mai 2007) $
|
||||
* $Author: mtrapier $
|
||||
|
||||
@ -1,25 +1,25 @@
|
||||
/*
|
||||
* 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-04 18:46:30 +0200 (mer, 04 avr 2007) $
|
||||
* $Author: mtrapier $
|
||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/ppu.c $
|
||||
* $Revision: 30 $
|
||||
*
|
||||
*/
|
||||
/*
|
||||
* 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-04 18:46:30 +0200 (mer, 04 avr 2007) $
|
||||
* $Author: mtrapier $
|
||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/ppu.c $
|
||||
* $Revision: 30 $
|
||||
*
|
||||
*/
|
||||
|
||||
#include <allegro.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/time.h>
|
||||
#include <time.h>
|
||||
|
||||
#include <sys/time.h>
|
||||
#include <time.h>
|
||||
|
||||
|
||||
#include "ppu.h"
|
||||
#include "M6502.h"
|
||||
@ -44,8 +44,8 @@ int InitPPU(PPU * ppu)
|
||||
return -1;
|
||||
|
||||
NOBLIT = 0;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* Initializing register.. */
|
||||
ppu->In_VBlank = 0;
|
||||
@ -533,16 +533,16 @@ unsigned short ab_x, ab_y;
|
||||
unsigned short Color;
|
||||
unsigned short AttrByte;
|
||||
unsigned short TileID;
|
||||
static short WaitTime = 7000;
|
||||
static short WaitTime = 7000;
|
||||
static short LAST_FPS = 0;
|
||||
unsigned char XScroll, YScroll;
|
||||
struct timeval timeStart, timeEnd;
|
||||
struct timeval timeStart, timeEnd;
|
||||
|
||||
ppu.StatusRegister.b |= PPU_FLAG_SR_VBLANK;
|
||||
|
||||
BgColor = ppu.Memory[0x3F00];//0xC0;
|
||||
|
||||
gettimeofday(&timeStart, NULL);
|
||||
|
||||
gettimeofday(&timeStart, NULL);
|
||||
|
||||
//goto NoDraw;
|
||||
|
||||
@ -833,15 +833,15 @@ v:0000 0100 0001 1111=t:0000 0100 0001 1111
|
||||
TileID = (PPU_Rd(ppu.VRAMAddrReg2.W) << 4)
|
||||
| ppu.Bg_Pattern_Table;
|
||||
|
||||
XScroll = ppu.TimedHScroll[y];
|
||||
|
||||
/*YScroll += ppu.TimedVScroll[y];*/
|
||||
/* printf("Y:%d -_- ", YScroll);
|
||||
if (ppu.TimedVScroll[y] != 0)
|
||||
{
|
||||
YScroll = ppu.TimedVScroll[y];
|
||||
printf("Y:%d", YScroll);
|
||||
}
|
||||
XScroll = ppu.TimedHScroll[y];
|
||||
|
||||
/*YScroll += ppu.TimedVScroll[y];*/
|
||||
/* printf("Y:%d -_- ", YScroll);
|
||||
if (ppu.TimedVScroll[y] != 0)
|
||||
{
|
||||
YScroll = ppu.TimedVScroll[y];
|
||||
printf("Y:%d", YScroll);
|
||||
}
|
||||
printf("\n");*/
|
||||
for (x = 0; x < 256; x++)
|
||||
{
|
||||
@ -1059,17 +1059,17 @@ NoDraw:
|
||||
release_bitmap(Buffer);
|
||||
|
||||
if (NOBLIT == 0)
|
||||
{
|
||||
{
|
||||
unsigned long TimeStart, TimeEnd;
|
||||
blit(Buffer, screen, 0, 0, 0, 0, 512 + 256, 480);
|
||||
//stretch_blit(Buffer, screen, 0, 0, 256, 240, 0, 0, 512, 480);
|
||||
gettimeofday(&timeEnd, NULL);
|
||||
|
||||
TimeStart = 1000000 * timeStart.tv_sec + timeStart.tv_usec;
|
||||
TimeEnd = 1000000 * timeEnd.tv_sec + timeEnd.tv_usec;
|
||||
|
||||
//printf("Start: %d\nEnd: %d\nResult: %d\n",TimeStart, TimeEnd, 16666 - (TimeEnd - TimeStart));
|
||||
WaitTime = 14000 - (TimeEnd - TimeStart);
|
||||
//stretch_blit(Buffer, screen, 0, 0, 256, 240, 0, 0, 512, 480);
|
||||
gettimeofday(&timeEnd, NULL);
|
||||
|
||||
TimeStart = 1000000 * timeStart.tv_sec + timeStart.tv_usec;
|
||||
TimeEnd = 1000000 * timeEnd.tv_sec + timeEnd.tv_usec;
|
||||
|
||||
//printf("Start: %d\nEnd: %d\nResult: %d\n",TimeStart, TimeEnd, 16666 - (TimeEnd - TimeStart));
|
||||
WaitTime = 14000 - (TimeEnd - TimeStart);
|
||||
if (!key[KEY_PGUP])
|
||||
usleep(WaitTime<0?0:WaitTime);
|
||||
}
|
||||
@ -1085,7 +1085,7 @@ byte ReadPPUReg(byte RegID)
|
||||
{
|
||||
/* RegID is the nb of the reg 0-7 */
|
||||
unsigned char ret;
|
||||
RegID &= 0x07;
|
||||
RegID &= 0x07;
|
||||
|
||||
switch (RegID)
|
||||
{
|
||||
@ -1132,12 +1132,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 */
|
||||
@ -1247,12 +1247,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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,24 +1,25 @@
|
||||
/*
|
||||
* 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 GetTileColor(tile,x1,y1) ( ( ppu.Memory[tile+y1] & (1<<(7-x1)) ) == 0 ? 0 : 1 ) | \
|
||||
@ -36,14 +37,14 @@ volatile extern unsigned long IPS, FPS;
|
||||
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;
|
||||
@ -74,19 +75,19 @@ 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);
|
||||
|
||||
|
||||
/* 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);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -532,19 +533,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 */
|
||||
@ -777,8 +778,8 @@ unsigned short TileID;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
@ -790,13 +791,13 @@ unsigned long Reg2;
|
||||
unsigned short ab_x, ab_y;
|
||||
unsigned short 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;
|
||||
|
||||
@ -818,7 +819,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)
|
||||
{
|
||||
@ -844,20 +845,20 @@ v:0000 0100 0001 1111=t:0000 0100 0001 1111
|
||||
1111 1198 7654 3210
|
||||
5432 10
|
||||
*/
|
||||
//if (y == 142)
|
||||
// printf("______________142 Ptr:0x%04X ____ 0x%04X\n", ppu.TimedTmpPtr[y], ppu.VRAMAddrReg2.W);
|
||||
//if (y == 142)
|
||||
// printf("______________142 Ptr:0x%04X ____ 0x%04X\n", ppu.TimedTmpPtr[y], ppu.VRAMAddrReg2.W);
|
||||
|
||||
ppu.VRAMAddrReg2.W = (ppu.VRAMAddrReg2.W & 0xFBE0)
|
||||
| ((ppu.TimedTmpPtr[y]) & 0x041F)
|
||||
| 0x2000;
|
||||
|
||||
//if (y == 142)
|
||||
|
||||
//if (y == 142)
|
||||
// printf("______________142 Ptr:0x%04X ____ 0x%04X\n", ppu.TimedTmpPtr[y], ppu.VRAMAddrReg2.W);
|
||||
|
||||
TileID = (PPU_Rd(ppu.VRAMAddrReg2.W) << 4)
|
||||
| ppu.Bg_Pattern_Table;
|
||||
|
||||
XScroll = ppu.TimedHScroll[y];
|
||||
XScroll = ppu.TimedHScroll[y];
|
||||
|
||||
for (x = 0; x < 256; x++)
|
||||
{
|
||||
@ -1091,7 +1092,7 @@ byte ReadPPUReg(byte RegID)
|
||||
{
|
||||
/* RegID is the nb of the reg 0-7 */
|
||||
unsigned char ret;
|
||||
RegID &= 0x07;
|
||||
RegID &= 0x07;
|
||||
|
||||
switch (RegID)
|
||||
{
|
||||
@ -1138,12 +1139,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 */
|
||||
@ -1192,30 +1193,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 & 0xFC1F) | ((val & 0xF8) << 2));
|
||||
@ -1224,8 +1225,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);
|
||||
|
||||
@ -1233,7 +1234,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;
|
||||
/*
|
||||
@ -1242,12 +1243,12 @@ t:0011 1111 0000 0000 = d:0011 1111
|
||||
t:1100 0000 0000 0000=0
|
||||
*/
|
||||
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xC0FF) | ((val&0x3F) << 8)) & 0x3FFF;
|
||||
//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;
|
||||
/*
|
||||
@ -1268,12 +1269,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);
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user