test
Dependencies: SDFileSystem mbed-dev
Fork of Nucleo_Ex06_EMU by
Diff: pNesX.h
- Revision:
- 0:3dac1f1bc9e0
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pNesX.h Sun Apr 03 07:45:29 2016 +0000 @@ -0,0 +1,285 @@ +/*===================================================================*/ +/* */ +/* pNesX.h : NES Emulator for PSX */ +/* */ +/* 1999/11/03 Racoon New preparation */ +/* */ +/*===================================================================*/ + +#ifndef PNESX_H_INCLUDED +#define PNESX_H_INCLUDED + +/*-------------------------------------------------------------------*/ +/* Include files */ +/*-------------------------------------------------------------------*/ + +#include "pNesX_Types.h" + +/*-------------------------------------------------------------------*/ +/* NES resources */ +/*-------------------------------------------------------------------*/ + +#define RAM_SIZE 0x2000 +#define SRAM_SIZE 0x2000 +#define PPURAM_SIZE 0x4000 +#define SPRRAM_SIZE 256 + +/* RAM */ +extern BYTE RAM[]; + +/* SRAM */ +extern BYTE SRAM[]; + +/* ROM */ +extern BYTE *ROM; + +/* ROM BANK ( 8Kb * 4 ) */ +extern BYTE *ROMBANK0; +extern BYTE *ROMBANK1; +extern BYTE *ROMBANK2; +extern BYTE *ROMBANK3; + +/*-------------------------------------------------------------------*/ +/* PPU resources */ +/*-------------------------------------------------------------------*/ + +/* PPU RAM */ +extern BYTE PPURAM[]; + +/* VROM */ +extern BYTE *VROM; + +/* PPU BANK ( 1Kb * 16 ) */ +extern BYTE *PPUBANK[]; + +#define NAME_TABLE0 8 +#define NAME_TABLE1 9 +#define NAME_TABLE2 10 +#define NAME_TABLE3 11 + +#define NAME_TABLE_V_MASK 2 +#define NAME_TABLE_H_MASK 1 + +/* Sprite RAM */ +extern BYTE SPRRAM[]; + +#define SPR_Y 0 +#define SPR_CHR 1 +#define SPR_ATTR 2 +#define SPR_X 3 +#define SPR_ATTR_COLOR 0x3 +#define SPR_ATTR_V_FLIP 0x80 +#define SPR_ATTR_H_FLIP 0x40 +#define SPR_ATTR_PRI 0x20 + +/* PPU Register */ +extern BYTE PPU_R0; +extern BYTE PPU_R1; +extern BYTE PPU_R2; +extern BYTE PPU_R3; +extern BYTE PPU_R7; + +extern BYTE PPU_Scr_V; +extern BYTE PPU_Scr_V_Next; +extern BYTE PPU_Scr_V_Byte; +extern BYTE PPU_Scr_V_Byte_Next; +extern BYTE PPU_Scr_V_Bit; +extern BYTE PPU_Scr_V_Bit_Next; + +extern BYTE PPU_Scr_H; +extern BYTE PPU_Scr_H_Next; +extern BYTE PPU_Scr_H_Byte; +extern BYTE PPU_Scr_H_Byte_Next; +extern BYTE PPU_Scr_H_Bit; +extern BYTE PPU_Scr_H_Bit_Next; + +extern BYTE PPU_Latch_Flag; +extern WORD PPU_Addr; +extern WORD PPU_Increment; + +#define R0_NMI_VB 0x80 +#define R0_NMI_SP 0x40 +#define R0_SP_SIZE 0x20 +#define R0_BG_ADDR 0x10 +#define R0_SP_ADDR 0x08 +#define R0_INC_ADDR 0x04 +#define R0_NAME_ADDR 0x03 + +#define R1_BACKCOLOR 0xe0 +#define R1_SHOW_SP 0x10 +#define R1_SHOW_SCR 0x08 +#define R1_CLIP_SP 0x04 +#define R1_CLIP_BG 0x02 +#define R1_MONOCHROME 0x01 + +#define R2_IN_VBLANK 0x80 +#define R2_HIT_SP 0x40 +#define R2_MAX_SP 0x20 +#define R2_WRITE_FLAG 0x10 + +#define SCAN_TOP_OFF_SCREEN_START 0 +#define SCAN_ON_SCREEN_START 8 +#define SCAN_BOTTOM_OFF_SCREEN_START 232 +#define SCAN_POSTRENDER_START 240 +#define SCAN_VBLANK_START 245 +#define SCAN_VBLANK_END 261 + +#define SCAN_APU_CLK1 45 // 240Hz +#define SCAN_APU_CLK2 110 // 240Hz 120Hz +#define SCAN_APU_CLK3 176 // 240Hz +#define SCAN_APU_CLK4 241 // 240Hz 120Hz 60Hz + +/* Current Scanline */ +extern WORD PPU_Scanline; + +/* Scanline Table */ +extern BYTE PPU_ScanTable[]; + +/* Name Table Bank */ +extern BYTE PPU_NameTableBank; + +/* BG Base Address */ +extern BYTE *PPU_BG_Base; + +/* Sprite Base Address */ +extern BYTE *PPU_SP_Base; + +/* Sprite Height */ +extern WORD PPU_SP_Height; + +/* NES display size */ +#define NES_DISP_WIDTH 256 +#define NES_DISP_HEIGHT 224 + +/*-------------------------------------------------------------------*/ +/* Display and Others resouces */ +/*-------------------------------------------------------------------*/ + +/* Frame Skip */ +extern WORD FrameSkip; +extern WORD FrameCnt; + +//extern WORD DoubleFrame[ 2 ][ NES_DISP_WIDTH * NES_DISP_HEIGHT ]; +//extern WORD DoubleFrame[ 2 ][ NES_DISP_WIDTH ]; +extern WORD *WorkFrame; +extern WORD WorkFrameIdx; + +extern BYTE ChrBuf[]; + +extern BYTE ChrBufUpdate; + +extern WORD PalTable[]; + +/*-------------------------------------------------------------------*/ +/* APU and Pad resources */ +/*-------------------------------------------------------------------*/ + +extern BYTE APU_Reg[]; + +extern DWORD PAD1_Latch; +extern DWORD PAD2_Latch; +extern DWORD PAD_System; +extern DWORD PAD1_Bit; +extern DWORD PAD2_Bit; + +#define PAD_SYS_QUIT 1 +#define PAD_SYS_OK 2 +#define PAD_SYS_CANCEL 4 +#define PAD_SYS_UP 8 +#define PAD_SYS_DOWN 0x10 +#define PAD_SYS_LEFT 0x20 +#define PAD_SYS_RIGHT 0x40 + +#define PAD_PUSH(a,b) ( ( (a) & (b) ) != 0 ) + +/*-------------------------------------------------------------------*/ +/* Mapper Function */ +/*-------------------------------------------------------------------*/ + +/* Initialize Mapper */ +extern void (*MapperInit)(); +/* Write to Mapper */ +extern void (*MapperWrite)( WORD wAddr, BYTE byData ); +/* Callback at VSync */ +extern void (*MapperVSync)(); +/* Callback at HSync */ +extern void (*MapperHSync)(); + +/*-------------------------------------------------------------------*/ +/* ROM information */ +/*-------------------------------------------------------------------*/ + +/* .nes File Header */ +struct NesHeader_tag +{ + BYTE byID[ 4 ]; + BYTE byRomSize; + BYTE byVRomSize; + BYTE byInfo1; + BYTE byInfo2; + BYTE byReserve[ 8 ]; +}; + +/* .nes File Header */ +extern struct NesHeader_tag NesHeader; + +/* Mapper No. */ +extern BYTE MapperNo; + +/* Other */ +extern BYTE ROM_Mirroring; +extern BYTE ROM_SRAM; +extern BYTE ROM_Trainer; +extern BYTE ROM_FourScr; + +/*-------------------------------------------------------------------*/ +/* Function prototypes */ +/*-------------------------------------------------------------------*/ + +/* Initialize pNesX */ +void pNesX_Init(); + +/* Completion treatment */ +void pNesX_Fin(); + +/* Load a cassette */ +int pNesX_Load( const char *pszFileName ); + +/* Reset pNesX */ +int pNesX_Reset(); + +/* Initialize PPU */ +void pNesX_SetupPPU(); + +/* Set up a Mirroring of Name Table */ +void pNesX_Mirroring( int nType ); + +/* The main loop of pNesX */ +void pNesX_Main(); + +/* The loop of emulation */ +void pNesX_Cycle(); + +/* A function in H-Sync */ +int pNesX_HSync(); + +/* Render a scanline */ +void pNesX_DrawLine(); + +/* Get a position of scanline hits sprite #0 */ +void pNesX_GetSprHitY(); + +/* Develop character data */ +void pNesX_SetupChr(); + +/* Apu */ +void ApuInit(); +void ApuWrite(WORD wAddr, BYTE byData); +BYTE ApuRead(WORD wAddr); +void pNesX_ApuClk_240Hz(); +void pNesX_ApuClk_120Hz(); +void pNesX_ApuClk_60Hz(); + +#endif /* !PNESX_H_INCLUDED */ + +