Index: apps/plugins/CATEGORIES =================================================================== --- apps/plugins/CATEGORIES (revision 14814) +++ apps/plugins/CATEGORIES (working copy) @@ -1,3 +1,4 @@ +infones,games alpine_cdc,apps battery_bench,apps blackjack,games Index: apps/plugins/viewers.config =================================================================== --- apps/plugins/viewers.config (revision 14814) +++ apps/plugins/viewers.config (working copy) @@ -1,3 +1,4 @@ +nes,games/infones,0 ch8,viewers/chip8,0 txt,viewers/viewer,1 nfo,viewers/viewer,1 Index: apps/plugins/infones/InfoNES.c =================================================================== --- apps/plugins/infones/InfoNES.c (revision 0) +++ apps/plugins/infones/InfoNES.c (revision 0) @@ -0,0 +1,1198 @@ +/*===================================================================*/ +/* */ +/* InfoNES.cpp : NES Emulator for Win32, Linux(x86), Linux(PS2) */ +/* */ +/* 2000/05/18 InfoNES Project ( based on pNesX ) */ +/* */ +/*===================================================================*/ + +/*------------------------------------------------------------------- + * File List : + * + * [NES Hardware] + * InfoNES.cpp + * InfoNES.h + * K6502_rw.h + * + * [Mapper function] + * InfoNES_Mapper.cpp + * InfoNES_Mapper.h + * + * [The function which depends on a system] + * InfoNES_System_ooo.cpp (ooo is a system name. win, ...) + * InfoNES_System.h + * + * [CPU] + * K6502.cpp + * K6502.h + * + * [Others] + * InfoNES_Types.h + * + --------------------------------------------------------------------*/ + +/*-------------------------------------------------------------------*/ +/* Include files */ +/*-------------------------------------------------------------------*/ + +#include "InfoNES.h" +#include "InfoNES_System.h" +#include "InfoNES_Mapper.h" +#include "InfoNES_pAPU.h" +#include "K6502.h" + +/*-------------------------------------------------------------------*/ +/* NES resources */ +/*-------------------------------------------------------------------*/ + +/* RAM */ +BYTE RAM[ RAM_SIZE ]; + +/* SRAM */ +BYTE SRAM[ SRAM_SIZE ]; + +/* ROM */ +//BYTE ROM[0xffff]; +BYTE *ROM; +//BYTE filler[0xffff]; +//int *ROM; + +/* SRAM BANK ( 8Kb ) */ +BYTE *SRAMBANK; + +/* ROM BANK ( 8Kb * 4 ) */ +BYTE *ROMBANK0; +BYTE *ROMBANK1; +BYTE *ROMBANK2; +BYTE *ROMBANK3; + +/*-------------------------------------------------------------------*/ +/* PPU resources */ +/*-------------------------------------------------------------------*/ + +/* PPU RAM */ +BYTE PPURAM[ PPURAM_SIZE ]; + +/* VROM */ +//BYTE VROM[0x8000]; +BYTE *VROM; + +/* PPU BANK ( 1Kb * 16 ) */ +BYTE *PPUBANK[ 16 ]; + +/* Sprite RAM */ +BYTE SPRRAM[ SPRRAM_SIZE ]; + +/* PPU Register */ +BYTE PPU_R0; +BYTE PPU_R1; +BYTE PPU_R2; +BYTE PPU_R3; +BYTE PPU_R7; + +/* Vertical scroll value */ +BYTE PPU_Scr_V; +BYTE PPU_Scr_V_Next; +BYTE PPU_Scr_V_Byte; +BYTE PPU_Scr_V_Byte_Next; +BYTE PPU_Scr_V_Bit; +BYTE PPU_Scr_V_Bit_Next; + +/* Horizontal scroll value */ +BYTE PPU_Scr_H; +BYTE PPU_Scr_H_Next; +BYTE PPU_Scr_H_Byte; +BYTE PPU_Scr_H_Byte_Next; +BYTE PPU_Scr_H_Bit; +BYTE PPU_Scr_H_Bit_Next; + +/* PPU Address */ +WORD PPU_Addr; + +/* PPU Address */ +WORD PPU_Temp; + +/* The increase value of the PPU Address */ +WORD PPU_Increment; + +/* Current Scanline */ +WORD PPU_Scanline; + +/* Scanline Table */ +BYTE PPU_ScanTable[ 263 ]; + +/* Name Table Bank */ +BYTE PPU_NameTableBank; + +/* BG Base Address */ +BYTE *PPU_BG_Base; + +/* Sprite Base Address */ +BYTE *PPU_SP_Base; + +/* Sprite Height */ +WORD PPU_SP_Height; + +/* Sprite #0 Scanline Hit Position */ +int SpriteJustHit; + +/* VRAM Write Enable ( 0: Disable, 1: Enable ) */ +BYTE byVramWriteEnable; + +/* PPU Address and Scroll Latch Flag*/ +BYTE PPU_Latch_Flag; + +/* Up and Down Clipping Flag ( 0: non-clip, 1: clip ) */ +BYTE PPU_UpDown_Clip; + +/* Frame IRQ ( 0: Disabled, 1: Enabled )*/ +BYTE FrameIRQ_Enable; +WORD FrameStep; + +/*-------------------------------------------------------------------*/ +/* Display and Others resouces */ +/*-------------------------------------------------------------------*/ + +/* Frame Skip */ +WORD FrameSkip; +WORD FrameCnt; + +/* Display Buffer */ +#if 0 +WORD DoubleFrame[ 2 ][ NES_DISP_WIDTH * NES_DISP_HEIGHT ]; +WORD *WorkFrame; +WORD WorkFrameIdx; +#else +WORD WorkFrame[ NES_DISP_WIDTH * NES_DISP_HEIGHT ]; +#endif + +/* Character Buffer */ +BYTE ChrBuf[ 256 * 2 * 8 * 8 ]; + +/* Update flag for ChrBuf */ +BYTE ChrBufUpdate; + +/* Palette Table */ +WORD PalTable[ 32 ]; + +/* Table for Mirroring */ +BYTE PPU_MirrorTable[][ 4 ] = +{ + { NAME_TABLE0, NAME_TABLE0, NAME_TABLE1, NAME_TABLE1 }, + { NAME_TABLE0, NAME_TABLE1, NAME_TABLE0, NAME_TABLE1 }, + { NAME_TABLE1, NAME_TABLE1, NAME_TABLE1, NAME_TABLE1 }, + { NAME_TABLE0, NAME_TABLE0, NAME_TABLE0, NAME_TABLE0 }, + { NAME_TABLE0, NAME_TABLE1, NAME_TABLE2, NAME_TABLE3 }, + { NAME_TABLE0, NAME_TABLE0, NAME_TABLE0, NAME_TABLE1 } +}; + +/*-------------------------------------------------------------------*/ +/* APU and Pad resources */ +/*-------------------------------------------------------------------*/ + +/* APU Register */ +BYTE APU_Reg[ 0x18 ]; + +/* APU Mute ( 0:OFF, 1:ON ) */ +int APU_Mute = 0; + +/* Pad data */ +DWORD PAD1_Latch; +DWORD PAD2_Latch; +DWORD PAD_System; +DWORD PAD1_Bit; +DWORD PAD2_Bit; + +/*-------------------------------------------------------------------*/ +/* Mapper Function */ +/*-------------------------------------------------------------------*/ + +/* Initialize Mapper */ +void (*MapperInit)(); +/* Write to Mapper */ +void (*MapperWrite)( WORD wAddr, BYTE byData ); +/* Write to SRAM */ +void (*MapperSram)( WORD wAddr, BYTE byData ); +/* Write to Apu */ +void (*MapperApu)( WORD wAddr, BYTE byData ); +/* Read from Apu */ +BYTE (*MapperReadApu)( WORD wAddr ); +/* Callback at VSync */ +void (*MapperVSync)(); +/* Callback at HSync */ +void (*MapperHSync)(); +/* Callback at PPU read/write */ +void (*MapperPPU)( WORD wAddr ); +/* Callback at Rendering Screen 1:BG, 0:Sprite */ +void (*MapperRenderScreen)( BYTE byMode ); + +/*-------------------------------------------------------------------*/ +/* ROM information */ +/*-------------------------------------------------------------------*/ + +/* .nes File Header */ +struct NesHeader_tag NesHeader; + +/* Mapper Number */ +BYTE MapperNo; + +/* Mirroring 0:Horizontal 1:Vertical */ +BYTE ROM_Mirroring; +/* It has SRAM */ +BYTE ROM_SRAM; +/* It has Trainer */ +BYTE ROM_Trainer; +/* Four screen VRAM */ +BYTE ROM_FourScr; + +/*===================================================================*/ +/* */ +/* InfoNES_Init() : Initialize InfoNES */ +/* */ +/*===================================================================*/ +void InfoNES_Init() +{ +/* + * Initialize InfoNES + * + * Remarks + * Initialize K6502 and Scanline Table. + */ + int nIdx; + + // Initialize 6502 + K6502_Init(); + + // Initialize Scanline Table + for ( nIdx = 0; nIdx < 263; ++nIdx ) + { + if ( nIdx < SCAN_ON_SCREEN_START ) + PPU_ScanTable[ nIdx ] = SCAN_ON_SCREEN; + else + if ( nIdx < SCAN_BOTTOM_OFF_SCREEN_START ) + PPU_ScanTable[ nIdx ] = SCAN_ON_SCREEN; + else + if ( nIdx < SCAN_UNKNOWN_START ) + PPU_ScanTable[ nIdx ] = SCAN_ON_SCREEN; + else + if ( nIdx < SCAN_VBLANK_START ) + PPU_ScanTable[ nIdx ] = SCAN_UNKNOWN; + else + PPU_ScanTable[ nIdx ] = SCAN_VBLANK; + } +} + +/*===================================================================*/ +/* */ +/* InfoNES_Fin() : Completion treatment */ +/* */ +/*===================================================================*/ +void InfoNES_Fin() +{ +/* + * Completion treatment + * + * Remarks + * Release resources + */ + // Finalize pAPU + InfoNES_pAPUDone(); + + // Release a memory for ROM + InfoNES_ReleaseRom(); +} + +/*===================================================================*/ +/* */ +/* InfoNES_Load() : Load a cassette */ +/* */ +/*===================================================================*/ +int InfoNES_Load( const char *pszFileName ) +{ +/* + * Load a cassette + * + * Parameters + * const char *pszFileName (Read) + * File name of ROM image + * + * Return values + * 0 : It was finished normally. + * -1 : An error occurred. + * + * Remarks + * Read a ROM image in the memory. + * Reset InfoNES. + */ + + // Release a memory for ROM + InfoNES_ReleaseRom(); + + // Read a ROM image in the memory + if ( InfoNES_ReadRom( pszFileName ) < 0 ) + return -1; + + // Reset InfoNES + if ( InfoNES_Reset() < 0 ) + return -1; + + // Successful + return 0; +} + +/*===================================================================*/ +/* */ +/* InfoNES_Reset() : Reset InfoNES */ +/* */ +/*===================================================================*/ +int InfoNES_Reset() +{ +/* + * Reset InfoNES + * + * Return values + * 0 : Normally + * -1 : Non support mapper + * + * Remarks + * Initialize Resources, PPU and Mapper. + * Reset CPU. + */ + + int nIdx; + + /*-------------------------------------------------------------------*/ + /* Get information on the cassette */ + /*-------------------------------------------------------------------*/ + + // Get Mapper Number + MapperNo = NesHeader.byInfo1 >> 4; + //MapperNo = 4; + + // Check bit counts of Mapper No. + for ( nIdx = 4; nIdx < 8 && NesHeader.byReserve[ nIdx ] == 0; ++nIdx ) + ; + + if ( nIdx == 8 ) + { + // Mapper Number is 8bits + MapperNo |= ( NesHeader.byInfo2 & 0xf0 ); + } + + // Get information on the ROM + ROM_Mirroring = NesHeader.byInfo1 & 1; + ROM_SRAM = NesHeader.byInfo1 & 2; + ROM_Trainer = NesHeader.byInfo1 & 4; + ROM_FourScr = NesHeader.byInfo1 & 8; + + /*-------------------------------------------------------------------*/ + /* Initialize resources */ + /*-------------------------------------------------------------------*/ + + // Clear RAM + InfoNES_MemorySet( RAM, 0, sizeof RAM ); + + // Reset frame skip and frame count + FrameSkip = 0; + FrameCnt = 0; + +#if 0 + // Reset work frame + WorkFrame = DoubleFrame[ 0 ]; + WorkFrameIdx = 0; +#endif + + // Reset update flag of ChrBuf + ChrBufUpdate = 0xff; + + // Reset palette table + InfoNES_MemorySet( PalTable, 0, sizeof PalTable ); + + // Reset APU register + InfoNES_MemorySet( APU_Reg, 0, sizeof APU_Reg ); + + // Reset joypad + PAD1_Latch = PAD2_Latch = PAD_System = 0; + PAD1_Bit = PAD2_Bit = 0; + + /*-------------------------------------------------------------------*/ + /* Initialize PPU */ + /*-------------------------------------------------------------------*/ + + InfoNES_SetupPPU(); + + /*-------------------------------------------------------------------*/ + /* Initialize pAPU */ + /*-------------------------------------------------------------------*/ + + InfoNES_pAPUInit(); + + /*-------------------------------------------------------------------*/ + /* Initialize Mapper */ + /*-------------------------------------------------------------------*/ + + // Get Mapper Table Index + for ( nIdx = 0; MapperTable[ nIdx ].nMapperNo != -1; ++nIdx ) + { + if ( MapperTable[ nIdx ].nMapperNo == MapperNo ) + break; + } + + if ( MapperTable[ nIdx ].nMapperNo == -1 ) + { + // Non support mapper + InfoNES_MessageBox( "Mapper #%d is unsupported.\n", MapperNo ); + return -1; + } + + // Set up a mapper initialization function + MapperTable[ nIdx ].pMapperInit(); + + /*-------------------------------------------------------------------*/ + /* Reset CPU */ + /*-------------------------------------------------------------------*/ + + K6502_Reset(); + + // Successful + return 0; +} + +/*===================================================================*/ +/* */ +/* InfoNES_SetupPPU() : Initialize PPU */ +/* */ +/*===================================================================*/ +void InfoNES_SetupPPU() +{ +/* + * Initialize PPU + * + */ + int nPage; + + // Clear PPU and Sprite Memory + InfoNES_MemorySet( PPURAM, 0, sizeof PPURAM ); + InfoNES_MemorySet( SPRRAM, 0, sizeof SPRRAM ); + + // Reset PPU Register + PPU_R0 = PPU_R1 = PPU_R2 = PPU_R3 = PPU_R7 = 0; + + // Reset latch flag + PPU_Latch_Flag = 0; + + // Reset up and down clipping flag + PPU_UpDown_Clip = 0; + + FrameStep = 0; + FrameIRQ_Enable = 0; + + // Reset Scroll values + PPU_Scr_V = PPU_Scr_V_Next = PPU_Scr_V_Byte = PPU_Scr_V_Byte_Next = PPU_Scr_V_Bit = PPU_Scr_V_Bit_Next = 0; + PPU_Scr_H = PPU_Scr_H_Next = PPU_Scr_H_Byte = PPU_Scr_H_Byte_Next = PPU_Scr_H_Bit = PPU_Scr_H_Bit_Next = 0; + + // Reset PPU address + PPU_Addr = 0; + PPU_Temp = 0; + + // Reset scanline + PPU_Scanline = 0; + + // Reset hit position of sprite #0 + SpriteJustHit = 0; + + // Reset information on PPU_R0 + PPU_Increment = 1; + PPU_NameTableBank = NAME_TABLE0; + PPU_BG_Base = ChrBuf; + PPU_SP_Base = ChrBuf + 256 * 64; + PPU_SP_Height = 8; + + // Reset PPU banks + for ( nPage = 0; nPage < 16; ++nPage ) + PPUBANK[ nPage ] = &PPURAM[ nPage * 0x400 ]; + + /* Mirroring of Name Table */ + InfoNES_Mirroring( ROM_Mirroring ); + + /* Reset VRAM Write Enable */ + byVramWriteEnable = ( NesHeader.byVRomSize == 0 ) ? 1 : 0; +} + +/*===================================================================*/ +/* */ +/* InfoNES_Mirroring() : Set up a Mirroring of Name Table */ +/* */ +/*===================================================================*/ +void InfoNES_Mirroring( int nType ) +{ +/* + * Set up a Mirroring of Name Table + * + * Parameters + * int nType (Read) + * Mirroring Type + * 0 : Horizontal + * 1 : Vertical + * 2 : One Screen 0x2400 + * 3 : One Screen 0x2000 + * 4 : Four Screen + * 5 : Special for Mapper #233 + */ + + PPUBANK[ NAME_TABLE0 ] = &PPURAM[ PPU_MirrorTable[ nType ][ 0 ] * 0x400 ]; + PPUBANK[ NAME_TABLE1 ] = &PPURAM[ PPU_MirrorTable[ nType ][ 1 ] * 0x400 ]; + PPUBANK[ NAME_TABLE2 ] = &PPURAM[ PPU_MirrorTable[ nType ][ 2 ] * 0x400 ]; + PPUBANK[ NAME_TABLE3 ] = &PPURAM[ PPU_MirrorTable[ nType ][ 3 ] * 0x400 ]; +} + +/*===================================================================*/ +/* */ +/* InfoNES_Main() : The main loop of InfoNES */ +/* */ +/*===================================================================*/ +void InfoNES_Main() +{ +/* + * The main loop of InfoNES + * + */ + + // Initialize InfoNES + InfoNES_Init(); + + // Main loop + while ( 1 ) + { + /*-------------------------------------------------------------------*/ + /* To the menu screen */ + /*-------------------------------------------------------------------*/ + if ( InfoNES_Menu() == -1 ) + break; // Quit + + /*-------------------------------------------------------------------*/ + /* Start a NES emulation */ + /*-------------------------------------------------------------------*/ + InfoNES_Cycle(); + } + + // Completion treatment + InfoNES_Fin(); +} + +/*===================================================================*/ +/* */ +/* InfoNES_Cycle() : The loop of emulation */ +/* */ +/*===================================================================*/ +void InfoNES_Cycle() +{ +/* + * The loop of emulation + * + */ + +#if 0 + // Set the PPU adress to the buffered value + if ( ( PPU_R1 & R1_SHOW_SP ) || ( PPU_R1 & R1_SHOW_SCR ) ) + PPU_Addr = PPU_Temp; +#endif + + // Emulation loop + for (;;) + { + int nStep; + + // Set a flag if a scanning line is a hit in the sprite #0 + if ( SpriteJustHit == PPU_Scanline && + PPU_ScanTable[ PPU_Scanline ] == SCAN_ON_SCREEN ) + { + // # of Steps to execute before sprite #0 hit + nStep = SPRRAM[ SPR_X ] * STEP_PER_SCANLINE / NES_DISP_WIDTH; + + // Execute instructions + K6502_Step( nStep ); + + // Set a sprite hit flag + if ( ( PPU_R1 & R1_SHOW_SP ) && ( PPU_R1 & R1_SHOW_SCR ) ) + PPU_R2 |= R2_HIT_SP; + + // NMI is required if there is necessity + if ( ( PPU_R0 & R0_NMI_SP ) && ( PPU_R1 & R1_SHOW_SP ) ) + NMI_REQ; + + // Execute instructions + K6502_Step( STEP_PER_SCANLINE - nStep ); + } + else + { + // Execute instructions + K6502_Step( STEP_PER_SCANLINE ); + } + + // Frame IRQ in H-Sync + FrameStep += STEP_PER_SCANLINE; + if ( FrameStep > STEP_PER_FRAME && FrameIRQ_Enable ) + { + FrameStep %= STEP_PER_FRAME; + IRQ_REQ; + APU_Reg[ 0x4015 ] |= 0x40; + } + + // A mapper function in H-Sync + MapperHSync(); + + // A function in H-Sync + if ( InfoNES_HSync() == -1 ) + return; // To the menu screen + + // HSYNC Wait + InfoNES_Wait(); + } +} + +/*===================================================================*/ +/* */ +/* InfoNES_HSync() : A function in H-Sync */ +/* */ +/*===================================================================*/ +int InfoNES_HSync() +{ +/* + * A function in H-Sync + * + * Return values + * 0 : Normally + * -1 : Exit an emulation + */ + + /*-------------------------------------------------------------------*/ + /* Render a scanline */ + /*-------------------------------------------------------------------*/ + if ( FrameCnt == 0 && + PPU_ScanTable[ PPU_Scanline ] == SCAN_ON_SCREEN ) + { + InfoNES_DrawLine(); + } + + /*-------------------------------------------------------------------*/ + /* Set new scroll values */ + /*-------------------------------------------------------------------*/ + PPU_Scr_V = PPU_Scr_V_Next; + PPU_Scr_V_Byte = PPU_Scr_V_Byte_Next; + PPU_Scr_V_Bit = PPU_Scr_V_Bit_Next; + + PPU_Scr_H = PPU_Scr_H_Next; + PPU_Scr_H_Byte = PPU_Scr_H_Byte_Next; + PPU_Scr_H_Bit = PPU_Scr_H_Bit_Next; + + /*-------------------------------------------------------------------*/ + /* Next Scanline */ + /*-------------------------------------------------------------------*/ + PPU_Scanline = ( PPU_Scanline == SCAN_VBLANK_END ) ? 0 : PPU_Scanline + 1; + + /*-------------------------------------------------------------------*/ + /* Operation in the specific scanning line */ + /*-------------------------------------------------------------------*/ + switch ( PPU_Scanline ) + { + case SCAN_TOP_OFF_SCREEN: + // Reset a PPU status + PPU_R2 = 0; + + // Set up a character data + if ( NesHeader.byVRomSize == 0 && FrameCnt == 0 ) + InfoNES_SetupChr(); + + // Get position of sprite #0 + InfoNES_GetSprHitY(); + break; + + case SCAN_UNKNOWN_START: + if ( FrameCnt == 0 ) + { + // Transfer the contents of work frame on the screen + InfoNES_LoadFrame(); + +#if 0 + // Switching of the double buffer + WorkFrameIdx = 1 - WorkFrameIdx; + WorkFrame = DoubleFrame[ WorkFrameIdx ]; +#endif + } + break; + + case SCAN_VBLANK_START: + // FrameCnt + 1 + FrameCnt = ( FrameCnt >= FrameSkip ) ? 0 : FrameCnt + 1; + + // Set a V-Blank flag + PPU_R2 = R2_IN_VBLANK; + + // Reset latch flag + PPU_Latch_Flag = 0; + + // pAPU Sound function in V-Sync + if ( !APU_Mute ) + InfoNES_pAPUVsync(); + + // A mapper function in V-Sync + MapperVSync(); + + // Get the condition of the joypad + InfoNES_PadState( &PAD1_Latch, &PAD2_Latch, &PAD_System ); + + // NMI on V-Blank + if ( PPU_R0 & R0_NMI_VB ) + NMI_REQ; + + // Exit an emulation if a QUIT button is pushed + if ( PAD_PUSH( PAD_System, PAD_SYS_QUIT ) ) + return -1; // Exit an emulation + + break; + } + + // Successful + return 0; +} + +/*===================================================================*/ +/* */ +/* InfoNES_DrawLine() : Render a scanline */ +/* */ +/*===================================================================*/ +void InfoNES_DrawLine() +{ +/* + * Render a scanline + * + */ + + int nX; + int nY; + int nY4; + int nYBit; + WORD *pPalTbl; + BYTE *pAttrBase; + WORD *pPoint; + int nNameTable; + BYTE *pbyNameTable; + BYTE *pbyChrData; + BYTE *pSPRRAM; + int nAttr; + int nSprCnt; + int nIdx; + int nSprData; + BYTE bySprCol; + BYTE pSprBuf[ NES_DISP_WIDTH + 7 ]; + + /*-------------------------------------------------------------------*/ + /* Render Background */ + /*-------------------------------------------------------------------*/ + + /* MMC5 VROM switch */ + MapperRenderScreen( 1 ); + + // Pointer to the render position + pPoint = &WorkFrame[ PPU_Scanline * NES_DISP_WIDTH ]; + + // Clear a scanline if screen is off + if ( !( PPU_R1 & R1_SHOW_SCR ) ) + { + InfoNES_MemorySet( pPoint, 0, NES_DISP_WIDTH << 1 ); + } + else + { + nNameTable = PPU_NameTableBank; + + nY = PPU_Scr_V_Byte + ( PPU_Scanline >> 3 ); + + nYBit = PPU_Scr_V_Bit + ( PPU_Scanline & 7 ); + + if ( nYBit > 7 ) + { + ++nY; + nYBit &= 7; + } + nYBit <<= 3; + + if ( nY > 29 ) + { + // Next NameTable (An up-down direction) + nNameTable ^= NAME_TABLE_V_MASK; + nY -= 30; + } + + nX = PPU_Scr_H_Byte; + + nY4 = ( ( nY & 2 ) << 1 ); + + /*-------------------------------------------------------------------*/ + /* Rendering of the block of the left end */ + /*-------------------------------------------------------------------*/ + + pbyNameTable = PPUBANK[ nNameTable ] + nY * 32 + nX; + pbyChrData = PPU_BG_Base + ( *pbyNameTable << 6 ) + nYBit; + pAttrBase = PPUBANK[ nNameTable ] + 0x3c0 + ( nY / 4 ) * 8; + pPalTbl = &PalTable[ ( ( ( pAttrBase[ nX >> 2 ] >> ( ( nX & 2 ) + nY4 ) ) & 3 ) << 2 ) ]; + + for ( nIdx = PPU_Scr_H_Bit; nIdx < 8; ++nIdx ) + { + *( pPoint++ ) = pPalTbl[ pbyChrData[ nIdx ] ]; + } + + // Callback at PPU read/write + MapperPPU( PATTBL( pbyChrData ) ); + + ++nX; + ++pbyNameTable; + + /*-------------------------------------------------------------------*/ + /* Rendering of the left table */ + /*-------------------------------------------------------------------*/ + + for ( ; nX < 32; ++nX ) + { + pbyChrData = PPU_BG_Base + ( *pbyNameTable << 6 ) + nYBit; + pPalTbl = &PalTable[ ( ( ( pAttrBase[ nX >> 2 ] >> ( ( nX & 2 ) + nY4 ) ) & 3 ) << 2 ) ]; + + pPoint[ 0 ] = pPalTbl[ pbyChrData[ 0 ] ]; + pPoint[ 1 ] = pPalTbl[ pbyChrData[ 1 ] ]; + pPoint[ 2 ] = pPalTbl[ pbyChrData[ 2 ] ]; + pPoint[ 3 ] = pPalTbl[ pbyChrData[ 3 ] ]; + pPoint[ 4 ] = pPalTbl[ pbyChrData[ 4 ] ]; + pPoint[ 5 ] = pPalTbl[ pbyChrData[ 5 ] ]; + pPoint[ 6 ] = pPalTbl[ pbyChrData[ 6 ] ]; + pPoint[ 7 ] = pPalTbl[ pbyChrData[ 7 ] ]; + pPoint += 8; + + // Callback at PPU read/write + MapperPPU( PATTBL( pbyChrData ) ); + + ++pbyNameTable; + } + + // Holizontal Mirror + nNameTable ^= NAME_TABLE_H_MASK; + + pbyNameTable = PPUBANK[ nNameTable ] + nY * 32; + pAttrBase = PPUBANK[ nNameTable ] + 0x3c0 + ( nY / 4 ) * 8; + + /*-------------------------------------------------------------------*/ + /* Rendering of the right table */ + /*-------------------------------------------------------------------*/ + + for ( nX = 0; nX < PPU_Scr_H_Byte; ++nX ) + { + pbyChrData = PPU_BG_Base + ( *pbyNameTable << 6 ) + nYBit; + pPalTbl = &PalTable[ ( ( ( pAttrBase[ nX >> 2 ] >> ( ( nX & 2 ) + nY4 ) ) & 3 ) << 2 ) ]; + + pPoint[ 0 ] = pPalTbl[ pbyChrData[ 0 ] ]; + pPoint[ 1 ] = pPalTbl[ pbyChrData[ 1 ] ]; + pPoint[ 2 ] = pPalTbl[ pbyChrData[ 2 ] ]; + pPoint[ 3 ] = pPalTbl[ pbyChrData[ 3 ] ]; + pPoint[ 4 ] = pPalTbl[ pbyChrData[ 4 ] ]; + pPoint[ 5 ] = pPalTbl[ pbyChrData[ 5 ] ]; + pPoint[ 6 ] = pPalTbl[ pbyChrData[ 6 ] ]; + pPoint[ 7 ] = pPalTbl[ pbyChrData[ 7 ] ]; + pPoint += 8; + + // Callback at PPU read/write + MapperPPU( PATTBL( pbyChrData ) ); + + ++pbyNameTable; + } + + /*-------------------------------------------------------------------*/ + /* Rendering of the block of the right end */ + /*-------------------------------------------------------------------*/ + + pbyChrData = PPU_BG_Base + ( *pbyNameTable << 6 ) + nYBit; + pPalTbl = &PalTable[ ( ( ( pAttrBase[ nX >> 2 ] >> ( ( nX & 2 ) + nY4 ) ) & 3 ) << 2 ) ]; + for ( nIdx = 0; nIdx < PPU_Scr_H_Bit; ++nIdx ) + { + pPoint[ nIdx ] = pPalTbl[ pbyChrData[ nIdx ] ]; + } + + // Callback at PPU read/write + MapperPPU( PATTBL( pbyChrData ) ); + + /*-------------------------------------------------------------------*/ + /* Backgroud Clipping */ + /*-------------------------------------------------------------------*/ + if ( !( PPU_R1 & R1_CLIP_BG ) ) + { + WORD *pPointTop; + + pPointTop = &WorkFrame[ PPU_Scanline * NES_DISP_WIDTH ]; + InfoNES_MemorySet( pPointTop, 0, 8 << 1 ); + } + + /*-------------------------------------------------------------------*/ + /* Clear a scanline if up and down clipping flag is set */ + /*-------------------------------------------------------------------*/ + if ( PPU_UpDown_Clip && + ( SCAN_ON_SCREEN_START > PPU_Scanline || PPU_Scanline > SCAN_BOTTOM_OFF_SCREEN_START ) ) + { + WORD *pPointTop; + + pPointTop = &WorkFrame[ PPU_Scanline * NES_DISP_WIDTH ]; + InfoNES_MemorySet( pPointTop, 0, NES_DISP_WIDTH << 1 ); + } + } + + /*-------------------------------------------------------------------*/ + /* Render a sprite */ + /*-------------------------------------------------------------------*/ + + /* MMC5 VROM switch */ + MapperRenderScreen( 0 ); + + if ( PPU_R1 & R1_SHOW_SP ) + { + // Reset Scanline Sprite Count + PPU_R2 &= ~R2_MAX_SP; + + // Reset sprite buffer + InfoNES_MemorySet( pSprBuf, 0, sizeof pSprBuf ); + + // Render a sprite to the sprite buffer + nSprCnt = 0; + for ( pSPRRAM = SPRRAM + ( 63 << 2 ); pSPRRAM >= SPRRAM; pSPRRAM -= 4 ) + { + nY = pSPRRAM[ SPR_Y ] + 1; + if ( nY > PPU_Scanline || nY + PPU_SP_Height <= PPU_Scanline ) + continue; // Next sprite + + /*-------------------------------------------------------------------*/ + /* A sprite in scanning line */ + /*-------------------------------------------------------------------*/ + + // Holizontal Sprite Count +1 + ++nSprCnt; + + nAttr = pSPRRAM[ SPR_ATTR ]; + nYBit = PPU_Scanline - nY; + nYBit = ( nAttr & SPR_ATTR_V_FLIP ) ? ( PPU_SP_Height - nYBit - 1 ) << 3 : nYBit << 3; + + if ( PPU_R0 & R0_SP_SIZE ) + { + // Sprite size 8x16 + if ( pSPRRAM[ SPR_CHR ] & 1 ) + { + pbyChrData = ChrBuf + 256 * 64 + ( ( pSPRRAM[ SPR_CHR ] & 0xfe ) << 6 ) + nYBit; + } + else + { + pbyChrData = ChrBuf + ( ( pSPRRAM[ SPR_CHR ] & 0xfe ) << 6 ) + nYBit; + } + } + else + { + // Sprite size 8x8 + pbyChrData = PPU_SP_Base + ( pSPRRAM[ SPR_CHR ] << 6 ) + nYBit; + } + + nAttr ^= SPR_ATTR_PRI; + bySprCol = ( nAttr & ( SPR_ATTR_COLOR | SPR_ATTR_PRI ) ) << 2; + nX = pSPRRAM[ SPR_X ]; + + if ( nAttr & SPR_ATTR_H_FLIP ) + { + // Horizontal flip + if ( pbyChrData[ 7 ] ) + pSprBuf[ nX ] = bySprCol | pbyChrData[ 7 ]; + if ( pbyChrData[ 6 ] ) + pSprBuf[ nX + 1 ] = bySprCol | pbyChrData[ 6 ]; + if ( pbyChrData[ 5 ] ) + pSprBuf[ nX + 2 ] = bySprCol | pbyChrData[ 5 ]; + if ( pbyChrData[ 4 ] ) + pSprBuf[ nX + 3 ] = bySprCol | pbyChrData[ 4 ]; + if ( pbyChrData[ 3 ] ) + pSprBuf[ nX + 4 ] = bySprCol | pbyChrData[ 3 ]; + if ( pbyChrData[ 2 ] ) + pSprBuf[ nX + 5 ] = bySprCol | pbyChrData[ 2 ]; + if ( pbyChrData[ 1 ] ) + pSprBuf[ nX + 6 ] = bySprCol | pbyChrData[ 1 ]; + if ( pbyChrData[ 0 ] ) + pSprBuf[ nX + 7 ] = bySprCol | pbyChrData[ 0 ]; + } + else + { + // Non flip + if ( pbyChrData[ 0 ] ) + pSprBuf[ nX ] = bySprCol | pbyChrData[ 0 ]; + if ( pbyChrData[ 1 ] ) + pSprBuf[ nX + 1 ] = bySprCol | pbyChrData[ 1 ]; + if ( pbyChrData[ 2 ] ) + pSprBuf[ nX + 2 ] = bySprCol | pbyChrData[ 2 ]; + if ( pbyChrData[ 3 ] ) + pSprBuf[ nX + 3 ] = bySprCol | pbyChrData[ 3 ]; + if ( pbyChrData[ 4 ] ) + pSprBuf[ nX + 4 ] = bySprCol | pbyChrData[ 4 ]; + if ( pbyChrData[ 5 ] ) + pSprBuf[ nX + 5 ] = bySprCol | pbyChrData[ 5 ]; + if ( pbyChrData[ 6 ] ) + pSprBuf[ nX + 6 ] = bySprCol | pbyChrData[ 6 ]; + if ( pbyChrData[ 7 ] ) + pSprBuf[ nX + 7 ] = bySprCol | pbyChrData[ 7 ]; + } + } + + // Rendering sprite + pPoint -= ( NES_DISP_WIDTH - PPU_Scr_H_Bit ); + for ( nX = 0; nX < NES_DISP_WIDTH; ++nX ) + { + nSprData = pSprBuf[ nX ]; + if ( nSprData && ( nSprData & 0x80 || pPoint[ nX ] & 0x8000 ) ) + { + pPoint[ nX ] = PalTable[ ( nSprData & 0xf ) + 0x10 ]; + } + } + + /*-------------------------------------------------------------------*/ + /* Sprite Clipping */ + /*-------------------------------------------------------------------*/ + if ( !( PPU_R1 & R1_CLIP_SP ) ) + { + WORD *pPointTop; + + pPointTop = &WorkFrame[ PPU_Scanline * NES_DISP_WIDTH ]; + InfoNES_MemorySet( pPointTop, 0, 8 << 1 ); + } + + if ( nSprCnt >= 8 ) + PPU_R2 |= R2_MAX_SP; // Set a flag of maximum sprites on scanline + } +} + +/*===================================================================*/ +/* */ +/* InfoNES_GetSprHitY() : Get a position of scanline hits sprite #0 */ +/* */ +/*===================================================================*/ +void InfoNES_GetSprHitY() +{ +/* + * Get a position of scanline hits sprite #0 + * + */ + + int nYBit; + DWORD *pdwChrData; + int nOff; + + int nLine; + + if ( SPRRAM[ SPR_ATTR ] & SPR_ATTR_V_FLIP ) + { + // Vertical flip + nYBit = ( PPU_SP_Height - 1 ) << 3; + nOff = -2; + } + else + { + // Non flip + nYBit = 0; + nOff = 2; + } + + if ( PPU_R0 & R0_SP_SIZE ) + { + // Sprite size 8x16 + if ( SPRRAM[ SPR_CHR ] & 1 ) + { + pdwChrData = (DWORD *)( ChrBuf + 256 * 64 + ( ( SPRRAM[ SPR_CHR ] & 0xfe ) << 6 ) + nYBit ); + } + else + { + pdwChrData = (DWORD * )( ChrBuf + ( ( SPRRAM[ SPR_CHR ] & 0xfe ) << 6 ) + nYBit ); + } + } + else + { + // Sprite size 8x8 + pdwChrData = (DWORD *)( PPU_SP_Base + ( SPRRAM[ SPR_CHR ] << 6 ) + nYBit ); + } + + if ( ( SPRRAM[ SPR_Y ] + 1 <= SCAN_UNKNOWN_START ) && ( SPRRAM[SPR_Y] > 0 ) ) + { + for ( nLine = 0; nLine < PPU_SP_Height; nLine++ ) + { + if ( pdwChrData[ 0 ] | pdwChrData[ 1 ] ) + { + // Scanline hits sprite #0 + SpriteJustHit = SPRRAM[SPR_Y] + 1 + nLine; + nLine = SCAN_VBLANK_END; + } + pdwChrData += nOff; + } + } else { + // Scanline didn't hit sprite #0 + SpriteJustHit = SCAN_UNKNOWN_START + 1; + } +} + +/*===================================================================*/ +/* */ +/* InfoNES_SetupChr() : Develop character data */ +/* */ +/*===================================================================*/ +void InfoNES_SetupChr() +{ +/* + * Develop character data + * + */ + + BYTE *pbyBGData; + BYTE byData1; + BYTE byData2; + int nIdx; + int nY; + int nOff; + static BYTE *pbyPrevBank[ 8 ]; + int nBank; + + for ( nBank = 0; nBank < 8; ++nBank ) + { + if ( pbyPrevBank[ nBank ] == PPUBANK[ nBank ] && !( ( ChrBufUpdate >> nBank ) & 1 ) ) + continue; // Next bank + + /*-------------------------------------------------------------------*/ + /* An address is different from the last time */ + /* or */ + /* An update flag is being set */ + /*-------------------------------------------------------------------*/ + + for ( nIdx = 0; nIdx < 64; ++nIdx ) + { + nOff = ( nBank << 12 ) + ( nIdx << 6 ); + + for ( nY = 0; nY < 8; ++nY ) + { + pbyBGData = PPUBANK[ nBank ] + ( nIdx << 4 ) + nY; + + byData1 = ( ( pbyBGData[ 0 ] >> 1 ) & 0x55 ) | ( pbyBGData[ 8 ] & 0xAA ); + byData2 = ( pbyBGData[ 0 ] & 0x55 ) | ( ( pbyBGData[ 8 ] << 1 ) & 0xAA ); + + ChrBuf[ nOff ] = ( byData1 >> 6 ) & 3; + ChrBuf[ nOff + 1 ] = ( byData2 >> 6 ) & 3; + ChrBuf[ nOff + 2 ] = ( byData1 >> 4 ) & 3; + ChrBuf[ nOff + 3 ] = ( byData2 >> 4 ) & 3; + ChrBuf[ nOff + 4 ] = ( byData1 >> 2 ) & 3; + ChrBuf[ nOff + 5 ] = ( byData2 >> 2 ) & 3; + ChrBuf[ nOff + 6 ] = byData1 & 3; + ChrBuf[ nOff + 7 ] = byData2 & 3; + + nOff += 8; + } + } + // Keep this address + pbyPrevBank[ nBank ] = PPUBANK[ nBank ]; + } + + // Reset update flag + ChrBufUpdate = 0; +} Index: apps/plugins/infones/readme.txt.outdated =================================================================== --- apps/plugins/infones/readme.txt.outdated (revision 0) +++ apps/plugins/infones/readme.txt.outdated (revision 0) @@ -0,0 +1,4 @@ +1: extract the source files to $ROCKBOX/apps/plugins/ines +2: add "ines" to $ROCKBOX/apps/plugins/Subdirs +3: make in your $BUILD directory (as you usually would) +4: add "nes,games/ines" to you /.rockbox/viewer.config file on your DAP \ No newline at end of file Index: apps/plugins/infones/mapper/InfoNES_Mapper_191.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_191.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_191.c (revision 0) @@ -0,0 +1,141 @@ +/*===================================================================*/ +/* */ +/* Mapper 191 : SACHEN Super Cartridge Xin1 (Ver.1-9), Q-BOY Support */ +/* */ +/*===================================================================*/ + +BYTE Map191_Reg[8]; +BYTE Map191_Prg0, Map191_Prg1; +BYTE Map191_Chr0, Map191_Chr1, Map191_Chr2, Map191_Chr3; +BYTE Map191_Highbank; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 191 */ +/*-------------------------------------------------------------------*/ +void Map191_Init() +{ + /* Initialize Mapper */ + MapperInit = Map191_Init; + + /* Write to Mapper */ + MapperWrite = Map0_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map191_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Initialize Registers */ + for( int i = 0; i < 8; i++ ) { + Map191_Reg[i] = 0x00; + } + + /* Set ROM Banks */ + Map191_Prg0 = 0; + // Map191_Prg1 = 1; + Map191_Set_CPU_Banks(); + + /* Set PPU Banks */ + Map191_Chr0 = 0; + Map191_Chr1 = 0; + Map191_Chr2 = 0; + Map191_Chr3 = 0; + Map191_Highbank = 0; + Map191_Set_PPU_Banks(); + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 191 Write to APU Function */ +/*-------------------------------------------------------------------*/ +void Map191_Apu( WORD wAddr, BYTE byData ) +{ + switch( wAddr ) { + case 0x4100: + Map191_Reg[0]=byData; + break; + case 0x4101: + Map191_Reg[1]=byData; + switch( Map191_Reg[0] ) { + case 0: + Map191_Chr0=byData&7; + Map191_Set_PPU_Banks(); + break; + case 1: + Map191_Chr1=byData&7; + Map191_Set_PPU_Banks(); + break; + case 2: + Map191_Chr2=byData&7; + Map191_Set_PPU_Banks(); + break; + case 3: + Map191_Chr3=byData&7; + Map191_Set_PPU_Banks(); + break; + case 4: + Map191_Highbank=byData&7; + Map191_Set_PPU_Banks(); + break; + case 5: + Map191_Prg0=byData&7; + Map191_Set_CPU_Banks(); + break; + case 7: + if( byData & 0x02 ) InfoNES_Mirroring( 0 ); + else InfoNES_Mirroring( 1 ); + break; + } + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 191 Set CPU Banks Function */ +/*-------------------------------------------------------------------*/ +void Map191_Set_CPU_Banks() +{ + ROMBANK0 = ROMPAGE( ((Map191_Prg0<<2) + 0 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE( ((Map191_Prg0<<2) + 1 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMPAGE( ((Map191_Prg0<<2) + 2 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK3 = ROMPAGE( ((Map191_Prg0<<2) + 3 ) % ( NesHeader.byRomSize << 1 ) ); +}; + +/*-------------------------------------------------------------------*/ +/* Mapper 191 Set PPU Banks Function */ +/*-------------------------------------------------------------------*/ +void Map191_Set_PPU_Banks() +{ + if ( NesHeader.byVRomSize > 0 ) { + PPUBANK[ 0 ] = VROMPAGE( ((((Map191_Highbank<<3)+Map191_Chr0)<<2)+0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( ((((Map191_Highbank<<3)+Map191_Chr0)<<2)+1 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( ((((Map191_Highbank<<3)+Map191_Chr1)<<2)+2 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( ((((Map191_Highbank<<3)+Map191_Chr1)<<2)+3 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 4 ] = VROMPAGE( ((((Map191_Highbank<<3)+Map191_Chr2)<<2)+0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( ((((Map191_Highbank<<3)+Map191_Chr2)<<2)+1 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE( ((((Map191_Highbank<<3)+Map191_Chr3)<<2)+2 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( ((((Map191_Highbank<<3)+Map191_Chr3)<<2)+3 ) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_119.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_119.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_119.c (revision 0) @@ -0,0 +1,249 @@ +/*===================================================================*/ +/* */ +/* Mapper 119 : TQ-ROM */ +/* */ +/*===================================================================*/ + +BYTE Map119_Reg[8]; +BYTE Map119_Prg0, Map119_Prg1; +BYTE Map119_Chr01, Map119_Chr23, Map119_Chr4, Map119_Chr5, Map119_Chr6, Map119_Chr7; +BYTE Map119_WeSram; + +BYTE Map119_IRQ_Enable; +BYTE Map119_IRQ_Counter; +BYTE Map119_IRQ_Latch; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 119 */ +/*-------------------------------------------------------------------*/ +void Map119_Init() +{ + /* Initialize Mapper */ + MapperInit = Map119_Init; + + /* Write to Mapper */ + MapperWrite = Map119_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map119_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set Registers */ + for( int i = 0; i < 8; i++ ) { + Map119_Reg[i] = 0x00; + } + + /* Set ROM Banks */ + Map119_Prg0 = 0; + Map119_Prg1 = 1; + Map119_Set_CPU_Banks(); + + /* Set PPU Banks */ + Map119_Chr01 = 0; + Map119_Chr23 = 2; + Map119_Chr4 = 4; + Map119_Chr5 = 5; + Map119_Chr6 = 6; + Map119_Chr7 = 7; + Map119_Set_PPU_Banks(); + + Map119_WeSram = 0; // Disable + Map119_IRQ_Enable = 0; // Disable + Map119_IRQ_Counter = 0; + Map119_IRQ_Latch = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 119 Write Function */ +/*-------------------------------------------------------------------*/ +void Map119_Write( WORD wAddr, BYTE byData ) +{ + switch( wAddr & 0xE001 ) { + case 0x8000: + Map119_Reg[0] = byData; + Map119_Set_CPU_Banks(); + Map119_Set_PPU_Banks(); + break; + case 0x8001: + Map119_Reg[1] = byData; + + switch( Map119_Reg[0] & 0x07 ) { + case 0x00: + if( NesHeader.byVRomSize > 0 ) { + Map119_Chr01 = byData & 0xFE; + Map119_Set_PPU_Banks(); + } + break; + case 0x01: + if( NesHeader.byVRomSize > 0 ) { + Map119_Chr23 = byData & 0xFE; + Map119_Set_PPU_Banks(); + } + break; + case 0x02: + if( NesHeader.byVRomSize > 0 ) { + Map119_Chr4 = byData; + Map119_Set_PPU_Banks(); + } + break; + case 0x03: + if( NesHeader.byVRomSize > 0 ) { + Map119_Chr5 = byData; + Map119_Set_PPU_Banks(); + } + break; + case 0x04: + if( NesHeader.byVRomSize > 0 ) { + Map119_Chr6 = byData; + Map119_Set_PPU_Banks(); + } + break; + case 0x05: + if( NesHeader.byVRomSize > 0 ) { + Map119_Chr7 = byData; + Map119_Set_PPU_Banks(); + } + break; + case 0x06: + Map119_Prg0 = byData; + Map119_Set_CPU_Banks(); + break; + case 0x07: + Map119_Prg1 = byData; + Map119_Set_CPU_Banks(); + break; + } + break; + case 0xA000: + Map119_Reg[2] = byData; + if( !ROM_FourScr ) { + if( byData & 0x01 ) InfoNES_Mirroring( 0 ); + else InfoNES_Mirroring( 1 ); + } + break; + case 0xA001: + Map119_Reg[3] = byData; + break; + case 0xC000: + Map119_Reg[4] = byData; + Map119_IRQ_Counter = byData; + break; + case 0xC001: + Map119_Reg[5] = byData; + Map119_IRQ_Latch = byData; + break; + case 0xE000: + Map119_Reg[6] = byData; + Map119_IRQ_Enable = 0; + Map119_IRQ_Counter = Map119_IRQ_Latch; + break; + case 0xE001: + Map119_Reg[7] = byData; + Map119_IRQ_Enable = 1; + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 119 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map119_HSync() +{ + if( ( /* PPU_Scanline >= 0 && */ PPU_Scanline <= 239) ) { + if( PPU_R1 & R1_SHOW_SCR || PPU_R1 & R1_SHOW_SP ) { + if( Map119_IRQ_Enable ) { + if( !(Map119_IRQ_Counter--) ) { + Map119_IRQ_Counter = Map119_IRQ_Latch; + IRQ_REQ; + } + } + } + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 119 Set CPU Banks Function */ +/*-------------------------------------------------------------------*/ +void Map119_Set_CPU_Banks() +{ + if( Map119_Reg[0] & 0x40 ) { + ROMBANK0 = ROMLASTPAGE( 1 ); + ROMBANK1 = ROMPAGE( Map119_Prg1 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMPAGE( Map119_Prg0 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK3 = ROMLASTPAGE( 0 ); + } else { + ROMBANK0 = ROMPAGE( Map119_Prg0 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE( Map119_Prg1 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 119 Set PPU Banks Function */ +/*-------------------------------------------------------------------*/ +void Map119_Set_PPU_Banks() +{ + if( Map119_Reg[0]&0x80 ) { + if(Map119_Chr4&0x40) PPUBANK[ 0 ] = CRAMPAGE(Map119_Chr4&0x07); + else PPUBANK[ 0 ] = VROMPAGE(Map119_Chr4 % (NesHeader.byRomSize<<1)); + if(Map119_Chr5&0x40) PPUBANK[ 1 ] = CRAMPAGE(Map119_Chr5&0x07); + else PPUBANK[ 1 ] = VROMPAGE(Map119_Chr5 % (NesHeader.byRomSize<<1)); + if(Map119_Chr6&0x40) PPUBANK[ 2 ] = CRAMPAGE(Map119_Chr6&0x07); + else PPUBANK[ 2 ] = VROMPAGE(Map119_Chr6 % (NesHeader.byRomSize<<1)); + if(Map119_Chr7&0x40) PPUBANK[ 3 ] = CRAMPAGE(Map119_Chr7&0x07); + else PPUBANK[ 3 ] = VROMPAGE(Map119_Chr7 % (NesHeader.byRomSize<<1)); + + if((Map119_Chr01+0)&0x40) PPUBANK[ 4 ] = CRAMPAGE((Map119_Chr01+0)&0x07); + else PPUBANK[ 4 ] = VROMPAGE((Map119_Chr01+0) % (NesHeader.byVRomSize<<3)); + if((Map119_Chr01+1)&0x40) PPUBANK[ 5 ] = CRAMPAGE((Map119_Chr01+1)&0x07); + else PPUBANK[ 5 ] = VROMPAGE((Map119_Chr01+1) % (NesHeader.byVRomSize<<3)); + if((Map119_Chr23+0)&0x40) PPUBANK[ 6 ] = CRAMPAGE((Map119_Chr23+0)&0x07); + else PPUBANK[ 6 ] = VROMPAGE((Map119_Chr23+0) % (NesHeader.byVRomSize<<3)); + if((Map119_Chr23+1)&0x40) PPUBANK[ 7 ] = CRAMPAGE((Map119_Chr23+1)&0x07); + else PPUBANK[ 7 ] = VROMPAGE((Map119_Chr23+1) % (NesHeader.byVRomSize<<3)); + } else { + if((Map119_Chr01+0)&0x40) PPUBANK[ 0 ] = CRAMPAGE((Map119_Chr01+0)&0x07); + else PPUBANK[ 0 ] = VROMPAGE((Map119_Chr01+0) % (NesHeader.byVRomSize<<3)); + if((Map119_Chr01+1)&0x40) PPUBANK[ 1 ] = CRAMPAGE((Map119_Chr01+1)&0x07); + else PPUBANK[ 1 ] = VROMPAGE((Map119_Chr01+1) % (NesHeader.byVRomSize<<3)); + if((Map119_Chr23+0)&0x40) PPUBANK[ 2 ] = CRAMPAGE((Map119_Chr23+0)&0x07); + else PPUBANK[ 2 ] = VROMPAGE((Map119_Chr23+0) % (NesHeader.byVRomSize<<3)); + if((Map119_Chr23+1)&0x40) PPUBANK[ 3 ] = CRAMPAGE((Map119_Chr23+1)&0x07); + else PPUBANK[ 3 ] = VROMPAGE((Map119_Chr23+1) % (NesHeader.byVRomSize<<3)); + + if(Map119_Chr4&0x40) PPUBANK[ 4 ] = CRAMPAGE(Map119_Chr4&0x07); + else PPUBANK[ 4 ] = VROMPAGE(Map119_Chr4 % (NesHeader.byVRomSize<<3)); + if(Map119_Chr5&0x40) PPUBANK[ 5 ] = CRAMPAGE(Map119_Chr5&0x07); + else PPUBANK[ 5 ] = VROMPAGE(Map119_Chr5 % (NesHeader.byVRomSize<<3)); + if(Map119_Chr6&0x40) PPUBANK[ 6 ] = CRAMPAGE(Map119_Chr6&0x07); + else PPUBANK[ 6 ] = VROMPAGE(Map119_Chr6 % (NesHeader.byVRomSize<<3)); + if(Map119_Chr7&0x40) PPUBANK[ 7 ] = CRAMPAGE(Map119_Chr7&0x07); + else PPUBANK[ 7 ] = VROMPAGE(Map119_Chr7 % (NesHeader.byVRomSize<<3)); + } + InfoNES_SetupChr(); +} + Index: apps/plugins/infones/mapper/InfoNES_Mapper_093.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_093.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_093.c (revision 0) @@ -0,0 +1,74 @@ +/*===================================================================*/ +/* */ +/* Mapper 93 (74161/32) */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 93 */ +/*-------------------------------------------------------------------*/ +void Map93_Init() +{ + /* Initialize Mapper */ + MapperInit = Map93_Init; + + /* Write to Mapper */ + MapperWrite = Map0_Write; + + /* Write to SRAM */ + MapperSram = Map93_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 93 Write to Sram Function */ +/*-------------------------------------------------------------------*/ +void Map93_Sram( WORD wAddr, BYTE byData ) +{ + /* Set ROM Banks */ + if ( wAddr == 0x6000 ) + { + byData <<= 1; + byData %= ( NesHeader.byRomSize << 1 ); + + ROMBANK0 = ROMPAGE( byData ); + ROMBANK1 = ROMPAGE( byData + 1 ); + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_255.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_255.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_255.c (revision 0) @@ -0,0 +1,133 @@ +/*===================================================================*/ +/* */ +/* Mapper 255 : 110-in-1 */ +/* */ +/*===================================================================*/ + +BYTE Map255_Reg[4]; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 255 */ +/*-------------------------------------------------------------------*/ +void Map255_Init() +{ + /* Initialize Mapper */ + MapperInit = Map255_Init; + + /* Write to Mapper */ + MapperWrite = Map255_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map255_Apu; + + /* Read from APU */ + MapperReadApu = Map255_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set Registers */ + InfoNES_Mirroring( 1 ); + + Map255_Reg[0] = 0; + Map255_Reg[1] = 0; + Map255_Reg[2] = 0; + Map255_Reg[3] = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 255 Write Function */ +/*-------------------------------------------------------------------*/ +void Map255_Write( WORD wAddr, BYTE byData ) +{ + BYTE byPrg = (wAddr & 0x0F80)>>7; + int nChr = (wAddr & 0x003F); + int nBank = (wAddr & 0x4000)>>14; + + if( wAddr & 0x2000 ) { + InfoNES_Mirroring( 0 ); + } else { + InfoNES_Mirroring( 1 ); + } + + if( wAddr & 0x1000 ) { + if( wAddr & 0x0040 ) { + ROMBANK0 = ROMPAGE((0x80*nBank+byPrg*4+2) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE((0x80*nBank+byPrg*4+3) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE((0x80*nBank+byPrg*4+2) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE((0x80*nBank+byPrg*4+3) % (NesHeader.byRomSize<<1)); + } else { + ROMBANK0 = ROMPAGE((0x80*nBank+byPrg*4+0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE((0x80*nBank+byPrg*4+1) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE((0x80*nBank+byPrg*4+0) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE((0x80*nBank+byPrg*4+1) % (NesHeader.byRomSize<<1)); + } + } else { + ROMBANK0 = ROMPAGE((0x80*nBank+byPrg*4+0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE((0x80*nBank+byPrg*4+1) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE((0x80*nBank+byPrg*4+2) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE((0x80*nBank+byPrg*4+3) % (NesHeader.byRomSize<<1)); + } + + PPUBANK[ 0 ] = VROMPAGE((0x200*nBank+nChr*8+0) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 1 ] = VROMPAGE((0x200*nBank+nChr*8+1) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 2 ] = VROMPAGE((0x200*nBank+nChr*8+2) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 3 ] = VROMPAGE((0x200*nBank+nChr*8+3) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 4 ] = VROMPAGE((0x200*nBank+nChr*8+4) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 5 ] = VROMPAGE((0x200*nBank+nChr*8+5) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 6 ] = VROMPAGE((0x200*nBank+nChr*8+6) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 7 ] = VROMPAGE((0x200*nBank+nChr*8+7) % (NesHeader.byVRomSize<<3)); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 255 Write to APU Function */ +/*-------------------------------------------------------------------*/ +void Map255_Apu( WORD wAddr, BYTE byData ) +{ + if( wAddr >= 0x5800 ) { + Map255_Reg[wAddr&0x0003] = byData & 0x0F; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 255 Read from APU Function */ +/*-------------------------------------------------------------------*/ +BYTE Map255_ReadApu( WORD wAddr ) +{ + if( wAddr >= 0x5800 ) { + return Map255_Reg[wAddr&0x0003] & 0x0F; + } else { + return wAddr>>8; + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_076.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_076.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_076.c (revision 0) @@ -0,0 +1,120 @@ +/*===================================================================*/ +/* */ +/* Mapper 76 (Namcot 109) */ +/* */ +/*===================================================================*/ + +BYTE Map76_Reg; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 76 */ +/*-------------------------------------------------------------------*/ +void Map76_Init() +{ + /* Initialize Mapper */ + MapperInit = Map76_Init; + + /* Write to Mapper */ + MapperWrite = Map76_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 76 Write Function */ +/*-------------------------------------------------------------------*/ +void Map76_Write( WORD wAddr, BYTE byData ) +{ + switch ( wAddr ) + { + case 0x8000: + Map76_Reg = byData; + break; + + case 0x8001: + switch ( Map76_Reg & 0x07 ) + { + case 0x02: + byData <<= 1; + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 0 ] = VROMPAGE( byData ); + PPUBANK[ 1 ] = VROMPAGE( byData + 1 ); + InfoNES_SetupChr(); + break; + + case 0x03: + byData <<= 1; + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 2 ] = VROMPAGE( byData ); + PPUBANK[ 3 ] = VROMPAGE( byData + 1 ); + InfoNES_SetupChr(); + break; + + case 0x04: + byData <<= 1; + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 4 ] = VROMPAGE( byData ); + PPUBANK[ 5 ] = VROMPAGE( byData + 1 ); + InfoNES_SetupChr(); + break; + + case 0x05: + byData <<= 1; + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 6 ] = VROMPAGE( byData ); + PPUBANK[ 7 ] = VROMPAGE( byData + 1 ); + InfoNES_SetupChr(); + break; + + case 0x06: + byData %= ( NesHeader.byRomSize << 1 ); + ROMBANK0 = ROMPAGE( byData ); + break; + + case 0x07: + byData %= ( NesHeader.byRomSize << 1 ); + ROMBANK1 = ROMPAGE( byData ); + break; + } + break; + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_097.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_097.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_097.c (revision 0) @@ -0,0 +1,83 @@ +/*===================================================================*/ +/* */ +/* Mapper 97 (74161/32 Irem) */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 97 */ +/*-------------------------------------------------------------------*/ +void Map97_Init() +{ + /* Initialize Mapper */ + MapperInit = Map97_Init; + + /* Write to Mapper */ + MapperWrite = Map97_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMLASTPAGE( 1 ); + ROMBANK1 = ROMLASTPAGE( 0 ); + ROMBANK2 = ROMPAGE( 0 ); + ROMBANK3 = ROMPAGE( 1 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 97 Write Function */ +/*-------------------------------------------------------------------*/ +void Map97_Write( WORD wAddr, BYTE byData ) +{ + /* Set ROM Banks */ + if ( wAddr < 0xc000 ) + { + BYTE byPrgBank = byData & 0x0f; + + byPrgBank <<= 1; + byPrgBank %= ( NesHeader.byRomSize << 1 ); + + ROMBANK2 = ROMPAGE( byPrgBank ); + ROMBANK3 = ROMPAGE( byPrgBank + 1 ); + + if ( ( byData & 0x80 ) == 0 ) + { + InfoNES_Mirroring( 0 ); + } else { + InfoNES_Mirroring( 1 ); + } + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_001.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_001.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_001.c (revision 0) @@ -0,0 +1,373 @@ +/*===================================================================*/ +/* */ +/* Mapper 1 */ +/* */ +/*===================================================================*/ + +BYTE Map1_Regs[ 4 ]; +DWORD Map1_Cnt; +BYTE Map1_Latch; +WORD Map1_Last_Write_Addr; + +enum Map1_Size_t +{ + Map1_SMALL, + Map1_512K, + Map1_1024K +}; + +//Map1_Size_t Map1_Size; +/*enum Map1_Size +{ + Map1_SMALL, + Map1_512K, + Map1_1024K + +}*/ +enum Map1_Size_t Map1_Size; + +DWORD Map1_256K_base; +DWORD Map1_swap; + +// these are the 4 ROM banks currently selected +DWORD Map1_bank1; +DWORD Map1_bank2; +DWORD Map1_bank3; +DWORD Map1_bank4; + +DWORD Map1_HI1; +DWORD Map1_HI2; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 1 */ +/*-------------------------------------------------------------------*/ +void Map1_Init() +{ + DWORD size_in_K; + + /* Initialize Mapper */ + MapperInit = Map1_Init; + + /* Write to Mapper */ + MapperWrite = Map1_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Initialize State Registers */ + Map1_Cnt = 0; + Map1_Latch = 0x00; + + Map1_Regs[ 0 ] = 0x0c; + Map1_Regs[ 1 ] = 0x00; + Map1_Regs[ 2 ] = 0x00; + Map1_Regs[ 3 ] = 0x00; + + size_in_K = ( NesHeader.byRomSize << 1 ) * 8; + + if ( size_in_K == 1024 ) + { + Map1_Size = Map1_1024K; + } + else if(size_in_K == 512) + { + Map1_Size = Map1_512K; + } + else + { + Map1_Size = Map1_SMALL; + } + + Map1_256K_base = 0; // use first 256K + Map1_swap = 0; + + if( Map1_Size == Map1_SMALL ) + { + // set two high pages to last two banks + Map1_HI1 = ( NesHeader.byRomSize << 1 ) - 2; + Map1_HI2 = ( NesHeader.byRomSize << 1 ) - 1; + } + else + { + // set two high pages to last two banks of current 256K region + Map1_HI1 = ( 256 / 8 ) - 2; + Map1_HI2 = ( 256 / 8 ) - 1; + } + + // set CPU bank pointers + Map1_bank1 = 0; + Map1_bank2 = 1; + Map1_bank3 = Map1_HI1; + Map1_bank4 = Map1_HI2; + + /* Set ROM Banks */ + Map1_set_ROM_banks(); + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +void Map1_set_ROM_banks() +{ + ROMBANK0 = ROMPAGE( ( (Map1_256K_base << 5) + (Map1_bank1 & ((256/8)-1)) ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE( ( (Map1_256K_base << 5) + (Map1_bank2 & ((256/8)-1)) ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMPAGE( ( (Map1_256K_base << 5) + (Map1_bank3 & ((256/8)-1)) ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK3 = ROMPAGE( ( (Map1_256K_base << 5) + (Map1_bank4 & ((256/8)-1)) ) % ( NesHeader.byRomSize << 1 ) ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 1 Write Function */ +/*-------------------------------------------------------------------*/ +void Map1_Write( WORD wAddr, BYTE byData ) +{ +/* + * MMC1 + */ + DWORD dwRegNum; + + // if write is to a different reg, reset + if( ( wAddr & 0x6000 ) != ( Map1_Last_Write_Addr & 0x6000 ) ) + { + Map1_Cnt = 0; + Map1_Latch = 0x00; + } + Map1_Last_Write_Addr = wAddr; + + // if bit 7 set, reset and return + if ( byData & 0x80 ) + { + Map1_Cnt = 0; + Map1_Latch = 0x00; + return; + } + + if ( byData & 0x01 ) Map1_Latch |= ( 1 << Map1_Cnt ); + Map1_Cnt++; + if( Map1_Cnt < 5 ) return; + + dwRegNum = ( wAddr & 0x7FFF ) >> 13; + Map1_Regs[ dwRegNum ] = Map1_Latch; + + Map1_Cnt = 0; + Map1_Latch = 0x00; + + switch( dwRegNum ) + { + case 0: + { + // set mirroring + if( Map1_Regs[0] & 0x02 ) + { + if( Map1_Regs[0] & 0x01 ) + { + InfoNES_Mirroring( 0 ); + } + else + { + InfoNES_Mirroring( 1 ); + } + } + else + { + // one-screen mirroring + if( Map1_Regs[0] & 0x01 ) + { + InfoNES_Mirroring( 2 ); + } + else + { + InfoNES_Mirroring( 3 ); + } + } + } + break; + + case 1: + { + BYTE byBankNum = Map1_Regs[1]; + + if ( Map1_Size == Map1_1024K ) + { + if ( Map1_Regs[0] & 0x10 ) + { + if ( Map1_swap ) + { + Map1_256K_base = (Map1_Regs[1] & 0x10) >> 4; + if(Map1_Regs[0] & 0x08) + { + Map1_256K_base |= ((Map1_Regs[2] & 0x10) >> 3); + } + Map1_set_ROM_banks(); + Map1_swap = 0; + } + else + { + Map1_swap = 1; + } + } + else + { + // use 1st or 4th 256K banks + Map1_256K_base = ( Map1_Regs[1] & 0x10 ) ? 3 : 0; + Map1_set_ROM_banks(); + } + } + else if((Map1_Size == Map1_512K) && (!NesHeader.byVRomSize)) + { + Map1_256K_base = (Map1_Regs[1] & 0x10) >> 4; + Map1_set_ROM_banks(); + } + else if ( NesHeader.byVRomSize ) + { + // set VROM bank at $0000 + if ( Map1_Regs[0] & 0x10 ) + { + // swap 4K + byBankNum <<= 2; + PPUBANK[ 0 ] = VROMPAGE( (byBankNum+0) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 1 ] = VROMPAGE( (byBankNum+1) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 2 ] = VROMPAGE( (byBankNum+2) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 3 ] = VROMPAGE( (byBankNum+3) % (NesHeader.byVRomSize << 3) ); + InfoNES_SetupChr(); + } + else + { + // swap 8K + byBankNum <<= 2; + PPUBANK[ 0 ] = VROMPAGE( (byBankNum+0) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 1 ] = VROMPAGE( (byBankNum+1) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 2 ] = VROMPAGE( (byBankNum+2) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 3 ] = VROMPAGE( (byBankNum+3) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 4 ] = VROMPAGE( (byBankNum+4) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 5 ] = VROMPAGE( (byBankNum+5) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 6 ] = VROMPAGE( (byBankNum+6) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 7 ] = VROMPAGE( (byBankNum+7) % (NesHeader.byVRomSize << 3) ); + InfoNES_SetupChr(); + } + } + } + break; + + case 2: + { + BYTE byBankNum = Map1_Regs[2]; + + if((Map1_Size == Map1_1024K) && (Map1_Regs[0] & 0x08)) + { + if(Map1_swap) + { + Map1_256K_base = (Map1_Regs[1] & 0x10) >> 4; + Map1_256K_base |= ((Map1_Regs[2] & 0x10) >> 3); + Map1_set_ROM_banks(); + Map1_swap = 0; + } + else + { + Map1_swap = 1; + } + } + + if(!NesHeader.byVRomSize) + { + if ( Map1_Regs[ 0 ] & 0x10 ) + { + byBankNum <<= 2; +#if 0 + PPUBANK[ 4 ] = VRAMPAGE0( byBankNum+0 ); + PPUBANK[ 5 ] = VRAMPAGE0( byBankNum+1 ); + PPUBANK[ 6 ] = VRAMPAGE0( byBankNum+2 ); + PPUBANK[ 7 ] = VRAMPAGE0( byBankNum+3 ); +#else + PPUBANK[ 4 ] = CRAMPAGE( byBankNum+0 ); + PPUBANK[ 5 ] = CRAMPAGE( byBankNum+1 ); + PPUBANK[ 6 ] = CRAMPAGE( byBankNum+2 ); + PPUBANK[ 7 ] = CRAMPAGE( byBankNum+3 ); +#endif + InfoNES_SetupChr(); + break; + } + } + + // set 4K VROM bank at $1000 + if(Map1_Regs[0] & 0x10) + { + // swap 4K + byBankNum <<= 2; + PPUBANK[ 4 ] = VROMPAGE( (byBankNum+0) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 5 ] = VROMPAGE( (byBankNum+1) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 6 ] = VROMPAGE( (byBankNum+2) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 7 ] = VROMPAGE( (byBankNum+3) % (NesHeader.byVRomSize << 3) ); + InfoNES_SetupChr(); + } + } + break; + + case 3: + { + BYTE byBankNum = Map1_Regs[3]; + + // set ROM bank + if ( Map1_Regs[0] & 0x08 ) + { + // 16K of ROM + byBankNum <<= 1; + + if ( Map1_Regs[0] & 0x04 ) + { + // 16K of ROM at $8000 + Map1_bank1 = byBankNum; + Map1_bank2 = byBankNum+1; + Map1_bank3 = Map1_HI1; + Map1_bank4 = Map1_HI2; + } + else + { + // 16K of ROM at $C000 + if(Map1_Size == Map1_SMALL) + { + Map1_bank1 = 0; + Map1_bank2 = 1; + Map1_bank3 = byBankNum; + Map1_bank4 = byBankNum+1; + } + } + } + else + { + // 32K of ROM at $8000 + byBankNum <<= 1; + + Map1_bank1 = byBankNum; + Map1_bank2 = byBankNum+1; + if(Map1_Size == Map1_SMALL) + { + Map1_bank3 = byBankNum+2; + Map1_bank4 = byBankNum+3; + } + } + Map1_set_ROM_banks(); + } + break; + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_201.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_201.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_201.c (revision 0) @@ -0,0 +1,85 @@ +/*===================================================================*/ +/* */ +/* Mapper 201 (21-in-1) */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 201 */ +/*-------------------------------------------------------------------*/ +void Map201_Init() +{ + /* Initialize Mapper */ + MapperInit = Map201_Init; + + /* Write to Mapper */ + MapperWrite = Map201_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 0 ); + ROMBANK3 = ROMPAGE( 1 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 201 Write Function */ +/*-------------------------------------------------------------------*/ +void Map201_Write( WORD wAddr, BYTE byData ) +{ + BYTE byBank = (BYTE)wAddr & 0x03; + if (!(wAddr&0x08) ) + byBank = 0; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE(((byBank<<2)+0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE(((byBank<<2)+1) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE(((byBank<<2)+2) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE(((byBank<<2)+3) % (NesHeader.byRomSize<<1)); + + /* Set PPU Banks */ + PPUBANK[0] = VROMPAGE(((byBank<<3)+0) % (NesHeader.byVRomSize<<3)); + PPUBANK[1] = VROMPAGE(((byBank<<3)+1) % (NesHeader.byVRomSize<<3)); + PPUBANK[2] = VROMPAGE(((byBank<<3)+2) % (NesHeader.byVRomSize<<3)); + PPUBANK[3] = VROMPAGE(((byBank<<3)+3) % (NesHeader.byVRomSize<<3)); + PPUBANK[4] = VROMPAGE(((byBank<<3)+4) % (NesHeader.byVRomSize<<3)); + PPUBANK[5] = VROMPAGE(((byBank<<3)+5) % (NesHeader.byVRomSize<<3)); + PPUBANK[6] = VROMPAGE(((byBank<<3)+6) % (NesHeader.byVRomSize<<3)); + PPUBANK[7] = VROMPAGE(((byBank<<3)+7) % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); +} + Index: apps/plugins/infones/mapper/InfoNES_Mapper_022.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_022.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_022.c (revision 0) @@ -0,0 +1,163 @@ +/*===================================================================*/ +/* */ +/* Mapper 22 (Konami VRC2 type A) */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 22 */ +/*-------------------------------------------------------------------*/ +void Map22_Init() +{ + int nPage; + /* Initialize Mapper */ + MapperInit = Map22_Init; + + /* Write to Mapper */ + MapperWrite = Map22_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 22 Write Function */ +/*-------------------------------------------------------------------*/ +void Map22_Write( WORD wAddr, BYTE byData ) +{ + switch ( wAddr ) + { + case 0x8000: + /* Set ROM Banks */ + byData %= ( NesHeader.byRomSize << 1 ); + ROMBANK0 = ROMPAGE( byData ); + break; + + case 0x9000: + /* Name Table Mirroring */ + switch ( byData & 0x03 ) + { + case 0: + InfoNES_Mirroring( 1 ); /* Vertical */ + break; + case 1: + InfoNES_Mirroring( 0 ); /* Horizontal */ + break; + case 2: + InfoNES_Mirroring( 2 ); /* One Screen 0x2000 */ + break; + case 3: + InfoNES_Mirroring( 3 ); /* One Screen 0x2400 */ + break; + } + break; + + case 0xa000: + /* Set ROM Banks */ + byData %= ( NesHeader.byRomSize << 1 ); + ROMBANK1 = ROMPAGE( byData ); + break; + + case 0xb000: + /* Set PPU Banks */ + byData >>= 1; + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 0 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0xb001: + /* Set PPU Banks */ + byData >>= 1; + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 1 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0xc000: + /* Set PPU Banks */ + byData >>= 1; + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 2 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0xc001: + /* Set PPU Banks */ + byData >>= 1; + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 3 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0xd000: + /* Set PPU Banks */ + byData >>= 1; + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 4 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0xd001: + /* Set PPU Banks */ + byData >>= 1; + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 5 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0xe000: + /* Set PPU Banks */ + byData >>= 1; + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 6 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0xe001: + /* Set PPU Banks */ + byData >>= 1; + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 7 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_005.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_005.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_005.c (revision 0) @@ -0,0 +1,541 @@ +/*===================================================================*/ +/* */ +/* Mapper 5 (MMC5) */ +/* */ +/*===================================================================*/ + +BYTE Map5_Wram[ 0x2000 * 8 ]; +BYTE Map5_Ex_Ram[ 0x400 ]; +BYTE Map5_Ex_Vram[ 0x400 ]; +BYTE Map5_Ex_Nam[ 0x400 ]; + +BYTE Map5_Prg_Reg[ 8 ]; +BYTE Map5_Wram_Reg[ 8 ]; +BYTE Map5_Chr_Reg[ 8 ][ 2 ]; + +BYTE Map5_IRQ_Enable; +BYTE Map5_IRQ_Status; +BYTE Map5_IRQ_Line; + +DWORD Map5_Value0; +DWORD Map5_Value1; + +BYTE Map5_Wram_Protect0; +BYTE Map5_Wram_Protect1; +BYTE Map5_Prg_Size; +BYTE Map5_Chr_Size; +BYTE Map5_Gfx_Mode; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 5 */ +/*-------------------------------------------------------------------*/ +void Map5_Init() +{ + int nPage; + BYTE byPage; + + /* Initialize Mapper */ + MapperInit = Map5_Init; + + /* Write to Mapper */ + MapperWrite = Map5_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map5_Apu; + + /* Read from APU */ + MapperReadApu = Map5_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map5_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map5_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMLASTPAGE( 0 ); + ROMBANK1 = ROMLASTPAGE( 0 ); + ROMBANK2 = ROMLASTPAGE( 0 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set PPU Banks */ + for ( nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + + /* Initialize State Registers */ + for ( nPage = 4; nPage < 8; ++nPage ) + { + Map5_Prg_Reg[ nPage ] = ( NesHeader.byRomSize << 1 ) - 1; + Map5_Wram_Reg[ nPage ] = 0xff; + } + Map5_Wram_Reg[ 3 ] = 0xff; + + for ( byPage = 4; byPage < 8; ++byPage ) + { + Map5_Chr_Reg[ byPage ][ 0 ] = byPage; + Map5_Chr_Reg[ byPage ][ 1 ] = ( byPage & 0x03 ) + 4; + } + + InfoNES_MemorySet( Map5_Wram, 0x00, sizeof( Map5_Wram ) ); + InfoNES_MemorySet( Map5_Ex_Ram, 0x00, sizeof( Map5_Ex_Ram ) ); + InfoNES_MemorySet( Map5_Ex_Vram, 0x00, sizeof( Map5_Ex_Vram ) ); + InfoNES_MemorySet( Map5_Ex_Nam, 0x00, sizeof( Map5_Ex_Nam ) ); + + Map5_Prg_Size = 3; + Map5_Wram_Protect0 = 0; + Map5_Wram_Protect1 = 0; + Map5_Chr_Size = 3; + Map5_Gfx_Mode = 0; + + Map5_IRQ_Enable = 0; + Map5_IRQ_Status = 0; + Map5_IRQ_Line = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 5 Read from APU Function */ +/*-------------------------------------------------------------------*/ +BYTE Map5_ReadApu( WORD wAddr ) +{ + BYTE byRet = (BYTE)( wAddr >> 8 ); + + switch ( wAddr ) + { + case 0x5204: + byRet = Map5_IRQ_Status; + Map5_IRQ_Status = 0; + break; + + case 0x5205: + byRet = (BYTE)( ( Map5_Value0 * Map5_Value1 ) & 0x00ff ); + break; + + case 0x5206: + byRet = (BYTE)( ( ( Map5_Value0 * Map5_Value1 ) & 0xff00 ) >> 8 ); + break; + + default: + if ( 0x5c00 <= wAddr && wAddr <= 0x5fff ) + { + byRet = Map5_Ex_Ram[ wAddr - 0x5c00 ]; + } + break; + } + return byRet; +} + +/*-------------------------------------------------------------------*/ +/* Mapper 5 Write to APU Function */ +/*-------------------------------------------------------------------*/ +void Map5_Apu( WORD wAddr, BYTE byData ) +{ + int nPage; + + switch ( wAddr ) + { + case 0x5100: + Map5_Prg_Size = byData & 0x03; + break; + + case 0x5101: + Map5_Chr_Size = byData & 0x03; + break; + + case 0x5102: + Map5_Wram_Protect0 = byData & 0x03; + break; + + case 0x5103: + Map5_Wram_Protect1 = byData & 0x03; + break; + + case 0x5104: + Map5_Gfx_Mode = byData & 0x03; + break; + + case 0x5105: + for ( nPage = 0; nPage < 4; nPage++ ) + { + BYTE byNamReg; + + byNamReg = byData & 0x03; + byData = byData >> 2; + + switch ( byNamReg ) + { + case 0: +#if 1 + PPUBANK[ nPage + 8 ] = VRAMPAGE( 0 ); +#else + PPUBANK[ nPage + 8 ] = CRAMPAGE( 8 ); +#endif + break; + case 1: +#if 1 + PPUBANK[ nPage + 8 ] = VRAMPAGE( 1 ); +#else + PPUBANK[ nPage + 8 ] = CRAMPAGE( 9 ); +#endif + break; + case 2: + PPUBANK[ nPage + 8 ] = Map5_Ex_Vram; + break; + case 3: + PPUBANK[ nPage + 8 ] = Map5_Ex_Nam; + break; + } + } + break; + + case 0x5106: + InfoNES_MemorySet( Map5_Ex_Nam, byData, 0x3c0 ); + break; + + case 0x5107: + byData &= 0x03; + byData = byData | ( byData << 2 ) | ( byData << 4 ) | ( byData << 6 ); + InfoNES_MemorySet( &( Map5_Ex_Nam[ 0x3c0 ] ), byData, 0x400 - 0x3c0 ); + break; + + case 0x5113: + Map5_Wram_Reg[ 3 ] = byData & 0x07; + SRAMBANK = Map5_ROMPAGE( byData & 0x07 ); + break; + + case 0x5114: + case 0x5115: + case 0x5116: + case 0x5117: + Map5_Prg_Reg[ wAddr & 0x07 ] = byData; + Map5_Sync_Prg_Banks(); + break; + + case 0x5120: + case 0x5121: + case 0x5122: + case 0x5123: + case 0x5124: + case 0x5125: + case 0x5126: + case 0x5127: + Map5_Chr_Reg[ wAddr & 0x07 ][ 0 ] = byData; + Map5_Sync_Prg_Banks(); + break; + + case 0x5128: + case 0x5129: + case 0x512a: + case 0x512b: + Map5_Chr_Reg[ ( wAddr & 0x03 ) + 0 ][ 1 ] = byData; + Map5_Chr_Reg[ ( wAddr & 0x03 ) + 4 ][ 1 ] = byData; + break; + + case 0x5200: + case 0x5201: + case 0x5202: + /* Nothing to do */ + break; + + case 0x5203: + if ( Map5_IRQ_Line >= 0x40 ) + { + Map5_IRQ_Line = byData; + } else { + Map5_IRQ_Line += byData; + } + break; + + case 0x5204: + Map5_IRQ_Enable = byData; + break; + + case 0x5205: + Map5_Value0 = byData; + break; + + case 0x5206: + Map5_Value1 = byData; + break; + + default: + if ( 0x5000 <= wAddr && wAddr <= 0x5015 ) + { + /* Extra Sound */ + } else + if ( 0x5c00 <= wAddr && wAddr <= 0x5fff ) + { + switch ( Map5_Gfx_Mode ) + { + case 0: + Map5_Ex_Vram[ wAddr - 0x5c00 ] = byData; + break; + case 2: + Map5_Ex_Ram[ wAddr - 0x5c00 ] = byData; + break; + } + } + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 5 Write to SRAM Function */ +/*-------------------------------------------------------------------*/ +void Map5_Sram( WORD wAddr, BYTE byData ) +{ + if ( Map5_Wram_Protect0 == 0x02 && Map5_Wram_Protect1 == 0x01 ) + { + if ( Map5_Wram_Reg[ 3 ] != 0xff ) + { + Map5_Wram[ 0x2000 * Map5_Wram_Reg[ 3 ] + ( wAddr - 0x6000) ] = byData; + } + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 5 Write Function */ +/*-------------------------------------------------------------------*/ +void Map5_Write( WORD wAddr, BYTE byData ) +{ + if ( Map5_Wram_Protect0 == 0x02 && Map5_Wram_Protect1 == 0x01 ) + { + switch ( wAddr & 0xe000 ) + { + case 0x8000: /* $8000-$9fff */ + if ( Map5_Wram_Reg[ 4 ] != 0xff ) + { + Map5_Wram[ 0x2000 * Map5_Wram_Reg[ 4 ] + ( wAddr - 0x8000) ] = byData; + } + break; + + case 0xa000: /* $a000-$bfff */ + if ( Map5_Wram_Reg[ 5 ] != 0xff ) + { + Map5_Wram[ 0x2000 * Map5_Wram_Reg[ 5 ] + ( wAddr - 0xa000) ] = byData; + } + break; + + case 0xc000: /* $c000-$dfff */ + if ( Map5_Wram_Reg[ 6 ] != 0xff ) + { + Map5_Wram[ 0x2000 * Map5_Wram_Reg[ 6 ] + ( wAddr - 0xc000) ] = byData; + } + break; + } + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 5 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map5_HSync() +{ + if ( PPU_Scanline <= 240 ) + { + if ( PPU_Scanline == Map5_IRQ_Line ) + { + Map5_IRQ_Status |= 0x80; + + if ( Map5_IRQ_Enable && Map5_IRQ_Line < 0xf0 ) + { + IRQ_REQ; + } + if ( Map5_IRQ_Line >= 0x40 ) + { + Map5_IRQ_Enable = 0; + } + } + } else { + Map5_IRQ_Status |= 0x40; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 5 Rendering Screen Function */ +/*-------------------------------------------------------------------*/ +void Map5_RenderScreen( BYTE byMode ) +{ + DWORD dwPage[ 8 ]; + + switch ( Map5_Chr_Size ) + { + case 0: + dwPage[ 7 ] = ( (DWORD)Map5_Chr_Reg[7][byMode] << 3 ) % ( NesHeader.byVRomSize << 3 ); + + PPUBANK[ 0 ] = VROMPAGE( dwPage[ 7 ] + 0 ); + PPUBANK[ 1 ] = VROMPAGE( dwPage[ 7 ] + 1 ); + PPUBANK[ 2 ] = VROMPAGE( dwPage[ 7 ] + 2 ); + PPUBANK[ 3 ] = VROMPAGE( dwPage[ 7 ] + 3 ); + PPUBANK[ 4 ] = VROMPAGE( dwPage[ 7 ] + 4 ); + PPUBANK[ 5 ] = VROMPAGE( dwPage[ 7 ] + 5 ); + PPUBANK[ 6 ] = VROMPAGE( dwPage[ 7 ] + 6 ); + PPUBANK[ 7 ] = VROMPAGE( dwPage[ 7 ] + 7 ); + InfoNES_SetupChr(); + break; + + case 1: + dwPage[ 3 ] = ( (DWORD)Map5_Chr_Reg[3][byMode] << 2 ) % ( NesHeader.byVRomSize << 3 ); + dwPage[ 7 ] = ( (DWORD)Map5_Chr_Reg[7][byMode] << 2 ) % ( NesHeader.byVRomSize << 3 ); + + PPUBANK[ 0 ] = VROMPAGE( dwPage[ 3 ] + 0 ); + PPUBANK[ 1 ] = VROMPAGE( dwPage[ 3 ] + 1 ); + PPUBANK[ 2 ] = VROMPAGE( dwPage[ 3 ] + 2 ); + PPUBANK[ 3 ] = VROMPAGE( dwPage[ 3 ] + 3 ); + PPUBANK[ 4 ] = VROMPAGE( dwPage[ 7 ] + 0 ); + PPUBANK[ 5 ] = VROMPAGE( dwPage[ 7 ] + 1 ); + PPUBANK[ 6 ] = VROMPAGE( dwPage[ 7 ] + 2 ); + PPUBANK[ 7 ] = VROMPAGE( dwPage[ 7 ] + 3 ); + InfoNES_SetupChr(); + break; + + case 2: + dwPage[ 1 ] = ( (DWORD)Map5_Chr_Reg[1][byMode] << 1 ) % ( NesHeader.byVRomSize << 3 ); + dwPage[ 3 ] = ( (DWORD)Map5_Chr_Reg[3][byMode] << 1 ) % ( NesHeader.byVRomSize << 3 ); + dwPage[ 5 ] = ( (DWORD)Map5_Chr_Reg[5][byMode] << 1 ) % ( NesHeader.byVRomSize << 3 ); + dwPage[ 7 ] = ( (DWORD)Map5_Chr_Reg[7][byMode] << 1 ) % ( NesHeader.byVRomSize << 3 ); + + PPUBANK[ 0 ] = VROMPAGE( dwPage[ 1 ] + 0 ); + PPUBANK[ 1 ] = VROMPAGE( dwPage[ 1 ] + 1 ); + PPUBANK[ 2 ] = VROMPAGE( dwPage[ 3 ] + 0 ); + PPUBANK[ 3 ] = VROMPAGE( dwPage[ 3 ] + 1 ); + PPUBANK[ 4 ] = VROMPAGE( dwPage[ 5 ] + 0 ); + PPUBANK[ 5 ] = VROMPAGE( dwPage[ 5 ] + 1 ); + PPUBANK[ 6 ] = VROMPAGE( dwPage[ 7 ] + 0 ); + PPUBANK[ 7 ] = VROMPAGE( dwPage[ 7 ] + 1 ); + InfoNES_SetupChr(); + break; + + default: + dwPage[ 0 ] = (DWORD)Map5_Chr_Reg[0][byMode] % ( NesHeader.byVRomSize << 3 ); + dwPage[ 1 ] = (DWORD)Map5_Chr_Reg[1][byMode] % ( NesHeader.byVRomSize << 3 ); + dwPage[ 2 ] = (DWORD)Map5_Chr_Reg[2][byMode] % ( NesHeader.byVRomSize << 3 ); + dwPage[ 3 ] = (DWORD)Map5_Chr_Reg[3][byMode] % ( NesHeader.byVRomSize << 3 ); + dwPage[ 4 ] = (DWORD)Map5_Chr_Reg[4][byMode] % ( NesHeader.byVRomSize << 3 ); + dwPage[ 5 ] = (DWORD)Map5_Chr_Reg[5][byMode] % ( NesHeader.byVRomSize << 3 ); + dwPage[ 6 ] = (DWORD)Map5_Chr_Reg[6][byMode] % ( NesHeader.byVRomSize << 3 ); + dwPage[ 7 ] = (DWORD)Map5_Chr_Reg[7][byMode] % ( NesHeader.byVRomSize << 3 ); + + PPUBANK[ 0 ] = VROMPAGE( dwPage[ 0 ] ); + PPUBANK[ 1 ] = VROMPAGE( dwPage[ 1 ] ); + PPUBANK[ 2 ] = VROMPAGE( dwPage[ 2 ] ); + PPUBANK[ 3 ] = VROMPAGE( dwPage[ 3 ] ); + PPUBANK[ 4 ] = VROMPAGE( dwPage[ 4 ] ); + PPUBANK[ 5 ] = VROMPAGE( dwPage[ 5 ] ); + PPUBANK[ 6 ] = VROMPAGE( dwPage[ 6 ] ); + PPUBANK[ 7 ] = VROMPAGE( dwPage[ 7 ] ); + InfoNES_SetupChr(); + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 5 Sync Program Banks Function */ +/*-------------------------------------------------------------------*/ +void Map5_Sync_Prg_Banks( void ) +{ + switch( Map5_Prg_Size ) + { + case 0: + Map5_Wram_Reg[ 4 ] = 0xff; + Map5_Wram_Reg[ 5 ] = 0xff; + Map5_Wram_Reg[ 6 ] = 0xff; + + ROMBANK0 = ROMPAGE( ( (Map5_Prg_Reg[7] & 0x7c) + 0 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE( ( (Map5_Prg_Reg[7] & 0x7c) + 1 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMPAGE( ( (Map5_Prg_Reg[7] & 0x7c) + 2 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK3 = ROMPAGE( ( (Map5_Prg_Reg[7] & 0x7c) + 3 ) % ( NesHeader.byRomSize << 1 ) ); + break; + + case 1: + if ( Map5_Prg_Reg[ 5 ] & 0x80 ) + { + Map5_Wram_Reg[ 4 ] = 0xff; + Map5_Wram_Reg[ 5 ] = 0xff; + ROMBANK0 = ROMPAGE( ( (Map5_Prg_Reg[7] & 0x7e) + 0 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE( ( (Map5_Prg_Reg[7] & 0x7e) + 1 ) % ( NesHeader.byRomSize << 1 ) ); + } else { + Map5_Wram_Reg[ 4 ] = ( Map5_Prg_Reg[ 5 ] & 0x06 ) + 0; + Map5_Wram_Reg[ 5 ] = ( Map5_Prg_Reg[ 5 ] & 0x06 ) + 1; + ROMBANK0 = Map5_ROMPAGE( Map5_Wram_Reg[ 4 ] ); + ROMBANK1 = Map5_ROMPAGE( Map5_Wram_Reg[ 5 ] ); + } + + Map5_Wram_Reg[ 6 ] = 0xff; + ROMBANK2 = ROMPAGE( ( (Map5_Prg_Reg[7] & 0x7e) + 0 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK3 = ROMPAGE( ( (Map5_Prg_Reg[7] & 0x7e) + 1 ) % ( NesHeader.byRomSize << 1 ) ); + break; + + case 2: + if ( Map5_Prg_Reg[ 5 ] & 0x80 ) + { + Map5_Wram_Reg[ 4 ] = 0xff; + Map5_Wram_Reg[ 5 ] = 0xff; + ROMBANK0 = ROMPAGE( ( (Map5_Prg_Reg[5] & 0x7e) + 0 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE( ( (Map5_Prg_Reg[5] & 0x7e) + 1 ) % ( NesHeader.byRomSize << 1 ) ); + } else { + Map5_Wram_Reg[ 4 ] = ( Map5_Prg_Reg[ 5 ] & 0x06 ) + 0; + Map5_Wram_Reg[ 5 ] = ( Map5_Prg_Reg[ 5 ] & 0x06 ) + 1; + ROMBANK0 = Map5_ROMPAGE( Map5_Wram_Reg[ 4 ] ); + ROMBANK1 = Map5_ROMPAGE( Map5_Wram_Reg[ 5 ] ); + } + + if ( Map5_Prg_Reg[ 6 ] & 0x80 ) + { + Map5_Wram_Reg[ 6 ] = 0xff; + ROMBANK2 = ROMPAGE( (Map5_Prg_Reg[6] & 0x7f) % ( NesHeader.byRomSize << 1 ) ); + } else { + Map5_Wram_Reg[ 6 ] = Map5_Prg_Reg[ 6 ] & 0x07; + ROMBANK2 = Map5_ROMPAGE( Map5_Wram_Reg[ 6 ] ); + } + + ROMBANK3 = ROMPAGE( (Map5_Prg_Reg[7] & 0x7f) % ( NesHeader.byRomSize << 1 ) ); + break; + + default: + if ( Map5_Prg_Reg[ 4 ] & 0x80 ) + { + Map5_Wram_Reg[ 4 ] = 0xff; + ROMBANK0 = ROMPAGE( (Map5_Prg_Reg[4] & 0x7f) % ( NesHeader.byRomSize << 1 ) ); + } else { + Map5_Wram_Reg[ 4 ] = Map5_Prg_Reg[ 4 ] & 0x07; + ROMBANK0 = Map5_ROMPAGE( Map5_Wram_Reg[ 4 ] ); + } + + if ( Map5_Prg_Reg[ 5 ] & 0x80 ) + { + Map5_Wram_Reg[ 5 ] = 0xff; + ROMBANK1 = ROMPAGE( (Map5_Prg_Reg[5] & 0x7f) % ( NesHeader.byRomSize << 1 ) ); + } else { + Map5_Wram_Reg[ 5 ] = Map5_Prg_Reg[ 5 ] & 0x07; + ROMBANK1 = Map5_ROMPAGE( Map5_Wram_Reg[ 5 ] ); + } + + if ( Map5_Prg_Reg[ 6 ] & 0x80 ) + { + Map5_Wram_Reg[ 6 ] = 0xff; + ROMBANK2 = ROMPAGE( (Map5_Prg_Reg[6] & 0x7f) % ( NesHeader.byRomSize << 1 ) ); + } else { + Map5_Wram_Reg[ 6 ] = Map5_Prg_Reg[ 6 ] & 0x07; + ROMBANK2 = Map5_ROMPAGE( Map5_Wram_Reg[ 6 ] ); + } + + ROMBANK3 = ROMPAGE( (Map5_Prg_Reg[7] & 0x7f) % ( NesHeader.byRomSize << 1 ) ); + break; + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_222.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_222.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_222.c (revision 0) @@ -0,0 +1,107 @@ +/*===================================================================*/ +/* */ +/* Mapper 222 */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 222 */ +/*-------------------------------------------------------------------*/ +void Map222_Init() +{ + /* Initialize Mapper */ + MapperInit = Map222_Init; + + /* Write to Mapper */ + MapperWrite = Map222_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set Mirroring */ + InfoNES_Mirroring( 1 ); + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 222 Write Function */ +/*-------------------------------------------------------------------*/ +void Map222_Write( WORD wAddr, BYTE byData ) +{ + switch( wAddr & 0xF003 ) { + case 0x8000: + ROMBANK0 = ROMPAGE( byData % ( NesHeader.byRomSize << 1 ) ); + break; + case 0xA000: + ROMBANK1 = ROMPAGE( byData % ( NesHeader.byRomSize << 1 ) ); + break; + case 0xB000: + PPUBANK[ 0 ] = VROMPAGE( byData % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + case 0xB002: + PPUBANK[ 1 ] = VROMPAGE( byData % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + case 0xC000: + PPUBANK[ 2 ] = VROMPAGE( byData % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + case 0xC002: + PPUBANK[ 3 ] = VROMPAGE( byData % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + case 0xD000: + PPUBANK[ 4 ] = VROMPAGE( byData % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + case 0xD002: + PPUBANK[ 5 ] = VROMPAGE( byData % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + case 0xE000: + PPUBANK[ 6 ] = VROMPAGE( byData % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + case 0xE002: + PPUBANK[ 7 ] = VROMPAGE( byData % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_060.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_060.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_060.c (revision 0) @@ -0,0 +1,89 @@ +/*===================================================================*/ +/* */ +/* Mapper 60 */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 60 */ +/*-------------------------------------------------------------------*/ +void Map60_Init() +{ + /* Initialize Mapper */ + MapperInit = Map60_Init; + + /* Write to Mapper */ + MapperWrite = Map60_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 60 Write Function */ +/*-------------------------------------------------------------------*/ +void Map60_Write( WORD wAddr, BYTE byData ) +{ + if( wAddr & 0x80 ) { + ROMBANK0 = ROMPAGE((((wAddr&0x70)>>3)+0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE((((wAddr&0x70)>>3)+1) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE((((wAddr&0x70)>>3)+0) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE((((wAddr&0x70)>>3)+1) % (NesHeader.byRomSize<<1)); + } else { + ROMBANK0 = ROMPAGE((((wAddr&0x70)>>3)+0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE((((wAddr&0x70)>>3)+1) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE((((wAddr&0x70)>>3)+2) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE((((wAddr&0x70)>>3)+3) % (NesHeader.byRomSize<<1)); + } + + + PPUBANK[ 0 ] = VROMPAGE((((wAddr&0x07)<<3)+0) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 1 ] = VROMPAGE((((wAddr&0x07)<<3)+1) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 2 ] = VROMPAGE((((wAddr&0x07)<<3)+2) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 3 ] = VROMPAGE((((wAddr&0x07)<<3)+3) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 4 ] = VROMPAGE((((wAddr&0x07)<<3)+4) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 5 ] = VROMPAGE((((wAddr&0x07)<<3)+5) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 6 ] = VROMPAGE((((wAddr&0x07)<<3)+6) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 7 ] = VROMPAGE((((wAddr&0x07)<<3)+7) % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + + if( byData & 0x08 ) InfoNES_Mirroring( 0 ); + else InfoNES_Mirroring( 1 ); +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_043.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_043.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_043.c (revision 0) @@ -0,0 +1,138 @@ +/*===================================================================*/ +/* */ +/* Mapper 43 (SMB2J) */ +/* */ +/*===================================================================*/ + +DWORD Map43_IRQ_Cnt; +BYTE Map43_IRQ_Enable; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 43 */ +/*-------------------------------------------------------------------*/ +void Map43_Init() +{ + /* Initialize Mapper */ + MapperInit = Map43_Init; + + /* Write to Mapper */ + MapperWrite = Map43_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map43_Apu; + + /* Read from APU */ + MapperReadApu = Map43_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map43_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = ROMPAGE( 2 ); + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 1 ); + ROMBANK1 = ROMPAGE( 0 ); + ROMBANK2 = ROMPAGE( 4 ); + ROMBANK3 = ROMPAGE( 9 ); + + /* Initialize State Registers */ + Map43_IRQ_Enable = 1; + Map43_IRQ_Cnt = 0; + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 43 Read from APU Function */ +/*-------------------------------------------------------------------*/ +BYTE Map43_ReadApu( WORD wAddr ) +{ + if ( 0x5000 <= wAddr && wAddr < 0x6000 ) + { + return ROM[ 0x2000*8 + 0x1000 + (wAddr - 0x5000) ]; + } + return (BYTE)(wAddr >> 8); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 43 Write to APU Function */ +/*-------------------------------------------------------------------*/ +void Map43_Apu( WORD wAddr, BYTE byData ) +{ + if( (wAddr&0xF0FF) == 0x4022 ) + { + switch( byData&0x07 ) + { + case 0x00: + case 0x02: + case 0x03: + case 0x04: + ROMBANK2 = ROMPAGE( 4 ); + break; + case 0x01: + ROMBANK2 = ROMPAGE( 3 ); + break; + case 0x05: + ROMBANK2 = ROMPAGE( 7 ); + break; + case 0x06: + ROMBANK2 = ROMPAGE( 5 ); + break; + case 0x07: + ROMBANK2 = ROMPAGE( 6 ); + break; + } + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 43 Write Function */ +/*-------------------------------------------------------------------*/ +void Map43_Write( WORD wAddr, BYTE byData ) +{ + if( wAddr == 0x8122 ) { + if( byData&0x03 ) { + Map43_IRQ_Enable = 1; + } else { + Map43_IRQ_Cnt = 0; + Map43_IRQ_Enable = 0; + } + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 43 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map43_HSync() +{ + if( Map43_IRQ_Enable ) + { + Map43_IRQ_Cnt += 114; + if( Map43_IRQ_Cnt >= 4096 ) { + Map43_IRQ_Cnt -= 4096; + IRQ_REQ; + } + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_107.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_107.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_107.c (revision 0) @@ -0,0 +1,82 @@ +/*===================================================================*/ +/* */ +/* Mapper 107 : Magic Dragon Mapper */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 107 */ +/*-------------------------------------------------------------------*/ +void Map107_Init() +{ + /* Initialize Mapper */ + MapperInit = Map107_Init; + + /* Write to Mapper */ + MapperWrite = Map107_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 107 Write Function */ +/*-------------------------------------------------------------------*/ +void Map107_Write( WORD wAddr, BYTE byData ) +{ + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( ( (((byData>>1)&0x03)<<2) + 0 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE( ( (((byData>>1)&0x03)<<2) + 1 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMPAGE( ( (((byData>>1)&0x03)<<2) + 2 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK3 = ROMPAGE( ( (((byData>>1)&0x03)<<2) + 3 ) % ( NesHeader.byRomSize << 1 ) ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) { + PPUBANK[ 0 ] = VROMPAGE( ( ((byData&0x07)<<3) + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( ( ((byData&0x07)<<3) + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( ( ((byData&0x07)<<3) + 2 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( ( ((byData&0x07)<<3) + 3 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 4 ] = VROMPAGE( ( ((byData&0x07)<<3) + 4 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( ( ((byData&0x07)<<3) + 5 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE( ( ((byData&0x07)<<3) + 6 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( ( ((byData&0x07)<<3) + 7 ) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_026.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_026.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_026.c (revision 0) @@ -0,0 +1,201 @@ +/*===================================================================*/ +/* */ +/* Mapper 26 (Konami VRC 6V) */ +/* */ +/*===================================================================*/ + +BYTE Map26_IRQ_Enable; +BYTE Map26_IRQ_Cnt; +BYTE Map26_IRQ_Latch; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 26 */ +/*-------------------------------------------------------------------*/ +void Map26_Init() +{ + int nPage; + /* Initialize Mapper */ + MapperInit = Map26_Init; + + /* Write to Mapper */ + MapperWrite = Map26_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map26_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Initialize IRQ Registers */ + Map26_IRQ_Enable = 0; + Map26_IRQ_Cnt = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 26 Write Function */ +/*-------------------------------------------------------------------*/ +void Map26_Write( WORD wAddr, BYTE byData ) +{ + switch ( wAddr ) + { + /* Set ROM Banks */ + case 0x8000: + byData <<= 1; + byData %= ( NesHeader.byRomSize << 1 ); + + ROMBANK0 = ROMPAGE( byData + 0 ); + ROMBANK1 = ROMPAGE( byData + 1 ); + break; + + /* Name Table Mirroring */ + case 0xb003: + switch ( byData & 0x7f ) + { + case 0x08: + case 0x2c: + InfoNES_Mirroring( 2 ); /* One Screen 0x2400 */ + break; + case 0x20: + InfoNES_Mirroring( 1 ); /* Vertical */ + break; + case 0x24: + InfoNES_Mirroring( 0 ); /* Horizontal */ + break; + case 0x28: + InfoNES_Mirroring( 3 ); /* One Screen 0x2000 */ + break; + } + break; + + /* Set ROM Banks */ + case 0xc000: + byData %= ( NesHeader.byRomSize << 1 ); + ROMBANK2 = ROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + /* Set PPU Bank */ + case 0xd000: + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 0 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0xd001: + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 2 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0xd002: + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 1 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0xd003: + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 3 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0xe000: + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 4 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0xe001: + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 6 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0xe002: + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 5 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0xe003: + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 7 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + /* Set IRQ Registers */ + case 0xf000: + Map26_IRQ_Latch = byData; + break; + + case 0xf001: + Map26_IRQ_Enable = byData & 0x01; + break; + + case 0xf002: + Map26_IRQ_Enable = byData & 0x03; + + if ( Map26_IRQ_Enable & 0x02 ) + { + Map26_IRQ_Cnt = Map26_IRQ_Latch; + } + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 26 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map26_HSync() +{ +/* + * Callback at HSync + * + */ + if ( Map26_IRQ_Enable & 0x03 ) + { + if ( Map26_IRQ_Cnt >= 0xfe ) + { + IRQ_REQ; + Map26_IRQ_Cnt = Map26_IRQ_Latch; + Map26_IRQ_Enable = 0; + } else { + Map26_IRQ_Cnt++; + } + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_243.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_243.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_243.c (revision 0) @@ -0,0 +1,133 @@ +/*===================================================================*/ +/* */ +/* Mapper 243 (Pirates) */ +/* */ +/*===================================================================*/ + +BYTE Map243_Regs[4]; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 243 */ +/*-------------------------------------------------------------------*/ +void Map243_Init() +{ + /* Initialize Mapper */ + MapperInit = Map243_Init; + + /* Write to Mapper */ + MapperWrite = Map0_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map243_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( int nPage = 0; nPage < 8; ++nPage ) + { + PPUBANK[ nPage ] = VROMPAGE( nPage ); + } + InfoNES_SetupChr(); + } + + /* Initialize state registers */ + Map243_Regs[0] = Map243_Regs[1] = Map243_Regs[2] = Map243_Regs[3] = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 243 Write to Apu Function */ +/*-------------------------------------------------------------------*/ +void Map243_Apu( WORD wAddr, BYTE byData ) +{ + if ( wAddr == 0x4100 ) + { + Map243_Regs[0] = byData; + } + else if ( wAddr == 0x4101 ) + { + switch ( Map243_Regs[0] & 0x07 ) + { + case 0x02: + Map243_Regs[1] = byData & 0x01; + break; + + case 0x00: + case 0x04: + case 0x07: + Map243_Regs[2] = ( byData & 0x01 ) << 1; + break; + + /* Set ROM Banks */ + case 0x05: + ROMBANK0 = ROMPAGE( ( byData * 4 + 0 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE( ( byData * 4 + 1 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMPAGE( ( byData * 4 + 2 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK3 = ROMPAGE( ( byData * 4 + 3 ) % ( NesHeader.byRomSize << 1 ) ); + break; + + case 0x06: + Map243_Regs[3] = ( byData & 0x03 ) << 2; + break; + } + + /* Set PPU Banks */ + if ( ( NesHeader.byVRomSize << 3 ) <= 64 ) + { + BYTE chr_bank = ( Map243_Regs[2] + Map243_Regs[3] ) >> 1; + + PPUBANK[ 0 ] = VROMPAGE( ( chr_bank * 8 + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( ( chr_bank * 8 + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( ( chr_bank * 8 + 2 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( ( chr_bank * 8 + 3 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 4 ] = VROMPAGE( ( chr_bank * 8 + 4 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( ( chr_bank * 8 + 5 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE( ( chr_bank * 8 + 6 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( ( chr_bank * 8 + 7 ) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + } + else + { + BYTE chr_bank = Map243_Regs[1] + Map243_Regs[2] + Map243_Regs[3]; + + PPUBANK[ 0 ] = VROMPAGE( ( chr_bank * 8 + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( ( chr_bank * 8 + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( ( chr_bank * 8 + 2 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( ( chr_bank * 8 + 3 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 4 ] = VROMPAGE( ( chr_bank * 8 + 4 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( ( chr_bank * 8 + 5 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE( ( chr_bank * 8 + 6 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( ( chr_bank * 8 + 7 ) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + } + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_009.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_009.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_009.c (revision 0) @@ -0,0 +1,231 @@ +/*===================================================================*/ +/* */ +/* Mapper 9 (MMC2) */ +/* */ +/*===================================================================*/ + +struct Map9_Latch +{ + BYTE lo_bank; + BYTE hi_bank; + BYTE state; +}; + +struct Map9_Latch latch1; +struct Map9_Latch latch2; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 9 */ +/*-------------------------------------------------------------------*/ +void Map9_Init() +{ + int nPage; + + /* Initialize Mapper */ + MapperInit = Map9_Init; + + /* Write to Mapper */ + MapperWrite = Map9_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map9_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMLASTPAGE( 2 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Init Latch Selector */ + latch1.state = 0xfe; + latch1.lo_bank = 0; + latch1.hi_bank = 0; + latch2.state = 0xfe; + latch2.lo_bank = 0; + latch2.hi_bank = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 9 Write Function */ +/*-------------------------------------------------------------------*/ +void Map9_Write( WORD wAddr, BYTE byData ) +{ + WORD wMapAddr; + + wMapAddr = wAddr & 0xf000; + switch ( wMapAddr ) + { + case 0xa000: + /* Set ROM Banks */ + byData %= ( NesHeader.byRomSize << 1 ); + ROMBANK0 = ROMPAGE( byData ); + break; + + case 0xb000: + /* Number of 4K Banks to Number of 1K Banks */ + byData %= ( NesHeader.byVRomSize << 1 ); + byData <<= 2; + + /* Latch Control */ + latch1.lo_bank = byData; + + if (0xfd == latch1.state) + { + /* Set PPU Banks */ + PPUBANK[ 0 ] = VROMPAGE( byData ); + PPUBANK[ 1 ] = VROMPAGE( byData + 1 ); + PPUBANK[ 2 ] = VROMPAGE( byData + 2 ); + PPUBANK[ 3 ] = VROMPAGE( byData + 3 ); + InfoNES_SetupChr(); + } + break; + + case 0xc000: + /* Number of 4K Banks to Number of 1K Banks */ + byData %= ( NesHeader.byVRomSize << 1 ); + byData <<= 2; + + /* Latch Control */ + latch1.hi_bank = byData; + + if (0xfe == latch1.state) + { + /* Set PPU Banks */ + PPUBANK[ 0 ] = VROMPAGE( byData ); + PPUBANK[ 1 ] = VROMPAGE( byData + 1 ); + PPUBANK[ 2 ] = VROMPAGE( byData + 2 ); + PPUBANK[ 3 ] = VROMPAGE( byData + 3 ); + InfoNES_SetupChr(); + } + break; + + case 0xd000: + /* Number of 4K Banks to Number of 1K Banks */ + byData %= ( NesHeader.byVRomSize << 1 ); + byData <<= 2; + + /* Latch Control */ + latch2.lo_bank = byData; + + if (0xfd == latch2.state) + { + /* Set PPU Banks */ + PPUBANK[ 4 ] = VROMPAGE( byData ); + PPUBANK[ 5 ] = VROMPAGE( byData + 1 ); + PPUBANK[ 6 ] = VROMPAGE( byData + 2 ); + PPUBANK[ 7 ] = VROMPAGE( byData + 3 ); + InfoNES_SetupChr(); + } + break; + + case 0xe000: + /* Number of 4K Banks to Number of 1K Banks */ + byData %= ( NesHeader.byVRomSize << 1 ); + byData <<= 2; + + /* Latch Control */ + latch2.hi_bank = byData; + + if (0xfe == latch2.state) + { + /* Set PPU Banks */ + PPUBANK[ 4 ] = VROMPAGE( byData ); + PPUBANK[ 5 ] = VROMPAGE( byData + 1 ); + PPUBANK[ 6 ] = VROMPAGE( byData + 2 ); + PPUBANK[ 7 ] = VROMPAGE( byData + 3 ); + InfoNES_SetupChr(); + } + break; + + case 0xf000: + /* Name Table Mirroring */ + InfoNES_Mirroring( byData & 0x01 ? 0 : 1); + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 9 PPU Function */ +/*-------------------------------------------------------------------*/ +void Map9_PPU( WORD wAddr ) +{ + /* Control Latch Selector */ + switch ( wAddr & 0x3ff0 ) + { + case 0x0fd0: + /* Latch Control */ + latch1.state = 0xfd; + /* Set PPU Banks */ + PPUBANK[ 0 ] = VROMPAGE( latch1.lo_bank ); + PPUBANK[ 1 ] = VROMPAGE( latch1.lo_bank + 1 ); + PPUBANK[ 2 ] = VROMPAGE( latch1.lo_bank + 2 ); + PPUBANK[ 3 ] = VROMPAGE( latch1.lo_bank + 3 ); + InfoNES_SetupChr(); + break; + + case 0x0fe0: + /* Latch Control */ + latch1.state = 0xfe; + /* Set PPU Banks */ + PPUBANK[ 0 ] = VROMPAGE( latch1.hi_bank ); + PPUBANK[ 1 ] = VROMPAGE( latch1.hi_bank + 1 ); + PPUBANK[ 2 ] = VROMPAGE( latch1.hi_bank + 2 ); + PPUBANK[ 3 ] = VROMPAGE( latch1.hi_bank + 3 ); + InfoNES_SetupChr(); + break; + + case 0x1fd0: + /* Latch Control */ + latch2.state = 0xfd; + /* Set PPU Banks */ + PPUBANK[ 4 ] = VROMPAGE( latch2.lo_bank ); + PPUBANK[ 5 ] = VROMPAGE( latch2.lo_bank + 1 ); + PPUBANK[ 6 ] = VROMPAGE( latch2.lo_bank + 2 ); + PPUBANK[ 7 ] = VROMPAGE( latch2.lo_bank + 3 ); + InfoNES_SetupChr(); + break; + + case 0x1fe0: + /* Latch Control */ + latch2.state = 0xfe; + /* Set PPU Banks */ + PPUBANK[ 4 ] = VROMPAGE( latch2.hi_bank ); + PPUBANK[ 5 ] = VROMPAGE( latch2.hi_bank + 1 ); + PPUBANK[ 6 ] = VROMPAGE( latch2.hi_bank + 2 ); + PPUBANK[ 7 ] = VROMPAGE( latch2.hi_bank + 3 ); + InfoNES_SetupChr(); + break; + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_064.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_064.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_064.c (revision 0) @@ -0,0 +1,224 @@ +/*===================================================================*/ +/* */ +/* Mapper 64 (Tengen RAMBO-1) */ +/* */ +/*===================================================================*/ + +BYTE Map64_Cmd; +BYTE Map64_Prg; +BYTE Map64_Chr; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 64 */ +/*-------------------------------------------------------------------*/ +void Map64_Init() +{ + /* Initialize Mapper */ + MapperInit = Map64_Init; + + /* Write to Mapper */ + MapperWrite = Map64_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMLASTPAGE( 0 ); + ROMBANK1 = ROMLASTPAGE( 0 ); + ROMBANK2 = ROMLASTPAGE( 0 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Initialize state flag */ + Map64_Cmd = 0x00; + Map64_Prg = 0x00; + Map64_Chr = 0x00; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 64 Write Function */ +/*-------------------------------------------------------------------*/ +void Map64_Write( WORD wAddr, BYTE byData ) +{ + switch ( wAddr ) + { + case 0x8000: + /* Set state flag */ + Map64_Cmd = byData & 0x0f; + Map64_Prg = ( byData & 0x40 ) >> 6; + Map64_Chr = ( byData & 0x80 ) >> 7; + break; + + case 0x8001: + switch ( Map64_Cmd ) + { + case 0x00: + /* Set PPU Banks */ + byData %= ( NesHeader.byVRomSize << 3 ); + if ( Map64_Chr ) + { + PPUBANK[ 4 ] = VROMPAGE( byData ); + PPUBANK[ 5 ] = VROMPAGE( byData + 1 ); + } else { + PPUBANK[ 0 ] = VROMPAGE( byData ); + PPUBANK[ 1 ] = VROMPAGE( byData + 1 ); + } + InfoNES_SetupChr(); + break; + + case 0x01: + /* Set PPU Banks */ + byData %= ( NesHeader.byVRomSize << 3 ); + if ( Map64_Chr ) + { + PPUBANK[ 6 ] = VROMPAGE( byData ); + PPUBANK[ 7 ] = VROMPAGE( byData + 1 ); + } else { + PPUBANK[ 2 ] = VROMPAGE( byData ); + PPUBANK[ 3 ] = VROMPAGE( byData + 1 ); + } + InfoNES_SetupChr(); + break; + + case 0x02: + /* Set PPU Banks */ + byData %= ( NesHeader.byVRomSize << 3 ); + if ( Map64_Chr ) + { + PPUBANK[ 0 ] = VROMPAGE( byData ); + } else { + PPUBANK[ 4 ] = VROMPAGE( byData ); + } + InfoNES_SetupChr(); + break; + + case 0x03: + /* Set PPU Banks */ + byData %= ( NesHeader.byVRomSize << 3 ); + if ( Map64_Chr ) + { + PPUBANK[ 1 ] = VROMPAGE( byData ); + } else { + PPUBANK[ 5 ] = VROMPAGE( byData ); + } + InfoNES_SetupChr(); + break; + + case 0x04: + /* Set PPU Banks */ + byData %= ( NesHeader.byVRomSize << 3 ); + if ( Map64_Chr ) + { + PPUBANK[ 2 ] = VROMPAGE( byData ); + } else { + PPUBANK[ 6 ] = VROMPAGE( byData ); + } + InfoNES_SetupChr(); + break; + + case 0x05: + /* Set PPU Banks */ + byData %= ( NesHeader.byVRomSize << 3 ); + if ( Map64_Chr ) + { + PPUBANK[ 3 ] = VROMPAGE( byData ); + } else { + PPUBANK[ 7 ] = VROMPAGE( byData ); + } + InfoNES_SetupChr(); + break; + + case 0x06: + /* Set ROM Banks */ + byData %= ( NesHeader.byRomSize << 1 ); + if ( Map64_Prg ) + { + ROMBANK1 = ROMPAGE( byData ); + } else { + ROMBANK0 = ROMPAGE( byData ); + } + break; + + case 0x07: + /* Set ROM Banks */ + byData %= ( NesHeader.byRomSize << 1 ); + if ( Map64_Prg ) + { + ROMBANK2 = ROMPAGE( byData ); + } else { + ROMBANK1 = ROMPAGE( byData ); + } + break; + + case 0x08: + /* Set PPU Banks */ + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 1 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0x09: + /* Set PPU Banks */ + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 3 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0x0f: + /* Set ROM Banks */ + byData %= ( NesHeader.byRomSize << 1 ); + if ( Map64_Prg ) + { + ROMBANK0 = ROMPAGE( byData ); + } else { + ROMBANK2 = ROMPAGE( byData ); + } + break; + } + break; + + default: + switch ( wAddr & 0xf000 ) + { + case 0xa000: + /* Name Table Mirroring */ + InfoNES_Mirroring( byData & 0x01 ); + break; + + default: + break; + } + break; + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_226.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_226.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_226.c (revision 0) @@ -0,0 +1,95 @@ +/*===================================================================*/ +/* */ +/* Mapper 226 : 76-in-1 */ +/* */ +/*===================================================================*/ + +BYTE Map226_Reg[2]; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 226 */ +/*-------------------------------------------------------------------*/ +void Map226_Init() +{ + /* Initialize Mapper */ + MapperInit = Map226_Init; + + /* Write to Mapper */ + MapperWrite = Map226_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + + /* Initialize Registers */ + Map226_Reg[0] = 0; + Map226_Reg[1] = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 226 Write Function */ +/*-------------------------------------------------------------------*/ +void Map226_Write( WORD wAddr, BYTE byData ) +{ + if( wAddr & 0x0001 ) { + Map226_Reg[1] = byData; + } else { + Map226_Reg[0] = byData; + } + + if( Map226_Reg[0] & 0x40 ) { + InfoNES_Mirroring( 1 ); + } else { + InfoNES_Mirroring( 0 ); + } + + BYTE byBank = ((Map226_Reg[0]&0x1E)>>1)|((Map226_Reg[0]&0x80)>>3)|((Map226_Reg[1]&0x01)<<5); + + if( Map226_Reg[0] & 0x20 ) { + if( Map226_Reg[0] & 0x01 ) { + ROMBANK0 = ROMPAGE(((byBank<<2)+2) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE(((byBank<<2)+3) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE(((byBank<<2)+2) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE(((byBank<<2)+3) % (NesHeader.byRomSize<<1)); + } else { + ROMBANK0 = ROMPAGE(((byBank<<2)+0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE(((byBank<<2)+1) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE(((byBank<<2)+0) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE(((byBank<<2)+1) % (NesHeader.byRomSize<<1)); + } + } else { + ROMBANK0 = ROMPAGE(((byBank<<2)+0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE(((byBank<<2)+1) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE(((byBank<<2)+2) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE(((byBank<<2)+3) % (NesHeader.byRomSize<<1)); + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_047.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_047.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_047.c (revision 0) @@ -0,0 +1,291 @@ +/*===================================================================*/ +/* */ +/* Mapper 47 (MMC) */ +/* */ +/*===================================================================*/ + +BYTE Map47_Regs[ 8 ]; +DWORD Map47_Rom_Bank; +DWORD Map47_Prg0, Map47_Prg1; +DWORD Map47_Chr01, Map47_Chr23; +DWORD Map47_Chr4, Map47_Chr5, Map47_Chr6, Map47_Chr7; + +#define Map47_Chr_Swap() ( Map47_Regs[ 0 ] & 0x80 ) +#define Map47_Prg_Swap() ( Map47_Regs[ 0 ] & 0x40 ) + +BYTE Map47_IRQ_Enable; +BYTE Map47_IRQ_Cnt; +BYTE Map47_IRQ_Latch; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 47 */ +/*-------------------------------------------------------------------*/ +void Map47_Init() +{ + /* Initialize Mapper */ + MapperInit = Map47_Init; + + /* Write to Mapper */ + MapperWrite = Map47_Write; + + /* Write to SRAM */ + MapperSram = Map47_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map47_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Initialize State Registers */ + for ( int nPage = 0; nPage < 8; nPage++ ) + { + Map47_Regs[ nPage ] = 0x00; + } + + /* Set ROM Banks */ + Map47_Rom_Bank = 0; + Map47_Prg0 = 0; + Map47_Prg1 = 1; + Map47_Set_CPU_Banks(); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + Map47_Chr01 = 0; + Map47_Chr23 = 2; + Map47_Chr4 = 4; + Map47_Chr5 = 5; + Map47_Chr6 = 6; + Map47_Chr7 = 7; + Map47_Set_PPU_Banks(); + } else { + Map47_Chr01 = Map47_Chr23 = 0; + Map47_Chr4 = Map47_Chr5 = Map47_Chr6 = Map47_Chr7 = 0; + } + + /* Initialize IRQ Registers */ + Map47_IRQ_Enable = 0; + Map47_IRQ_Cnt = 0; + Map47_IRQ_Latch = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 47 Write to Sram Function */ +/*-------------------------------------------------------------------*/ +void Map47_Sram( WORD wAddr, BYTE byData ) +{ + switch ( wAddr ) + { + case 0x6000: + Map47_Rom_Bank = byData & 0x01; + Map47_Set_CPU_Banks(); + Map47_Set_PPU_Banks(); + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 47 Write Function */ +/*-------------------------------------------------------------------*/ +void Map47_Write( WORD wAddr, BYTE byData ) +{ + DWORD dwBankNum; + + switch ( wAddr & 0xe001 ) + { + case 0x8000: + Map47_Regs[ 0 ] = byData; + Map47_Set_PPU_Banks(); + Map47_Set_CPU_Banks(); + break; + + case 0x8001: + Map47_Regs[ 1 ] = byData; + dwBankNum = Map47_Regs[ 1 ]; + + switch ( Map47_Regs[ 0 ] & 0x07 ) + { + /* Set PPU Banks */ + case 0x00: + if ( NesHeader.byVRomSize > 0 ) + { + dwBankNum &= 0xfe; + Map47_Chr01 = dwBankNum; + Map47_Set_PPU_Banks(); + } + break; + + case 0x01: + if ( NesHeader.byVRomSize > 0 ) + { + dwBankNum &= 0xfe; + Map47_Chr23 = dwBankNum; + Map47_Set_PPU_Banks(); + } + break; + + case 0x02: + if ( NesHeader.byVRomSize > 0 ) + { + Map47_Chr4 = dwBankNum; + Map47_Set_PPU_Banks(); + } + break; + + case 0x03: + if ( NesHeader.byVRomSize > 0 ) + { + Map47_Chr5 = dwBankNum; + Map47_Set_PPU_Banks(); + } + break; + + case 0x04: + if ( NesHeader.byVRomSize > 0 ) + { + Map47_Chr6 = dwBankNum; + Map47_Set_PPU_Banks(); + } + break; + + case 0x05: + if ( NesHeader.byVRomSize > 0 ) + { + Map47_Chr7 = dwBankNum; + Map47_Set_PPU_Banks(); + } + break; + + /* Set ROM Banks */ + case 0x06: + Map47_Prg0 = dwBankNum; + Map47_Set_CPU_Banks(); + break; + + case 0x07: + Map47_Prg1 = dwBankNum; + Map47_Set_CPU_Banks(); + break; + } + break; + + case 0xa000: + Map47_Regs[ 3 ] = byData; + break; + + case 0xc000: + Map47_Regs[ 4 ] = byData; + Map47_IRQ_Cnt = Map47_Regs[ 4 ]; + break; + + case 0xc001: + Map47_Regs[ 5 ] = byData; + Map47_IRQ_Latch = Map47_Regs[ 5 ]; + break; + + case 0xe000: + Map47_Regs[ 6 ] = byData; + Map47_IRQ_Enable = 0; + break; + + case 0xe001: + Map47_Regs[ 7 ] = byData; + Map47_IRQ_Enable = 1; + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 47 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map47_HSync() +{ +/* + * Callback at HSync + * + */ + if ( Map47_IRQ_Enable ) + { + if ( /* 0 <= PPU_Scanline && */ PPU_Scanline <= 239 ) + { + if ( PPU_R1 & R1_SHOW_SCR || PPU_R1 & R1_SHOW_SP ) + { + if ( !( --Map47_IRQ_Cnt ) ) + { + Map47_IRQ_Cnt = Map47_IRQ_Latch; + IRQ_REQ; + } + } + } + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 47 Set CPU Banks Function */ +/*-------------------------------------------------------------------*/ +void Map47_Set_CPU_Banks() +{ + if ( Map47_Prg_Swap() ) + { + ROMBANK0 = ROMPAGE( ( ( Map47_Rom_Bank << 4 ) + 14 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE( ( ( Map47_Rom_Bank << 4 ) + Map47_Prg1 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMPAGE( ( ( Map47_Rom_Bank << 4 ) + Map47_Prg0 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK3 = ROMPAGE( ( ( Map47_Rom_Bank << 4 ) + 15 ) % ( NesHeader.byRomSize << 1 ) ); + } else { + ROMBANK0 = ROMPAGE( ( ( Map47_Rom_Bank << 4 ) + Map47_Prg0 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE( ( ( Map47_Rom_Bank << 4 ) + Map47_Prg1 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMPAGE( ( ( Map47_Rom_Bank << 4 ) + 14 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK3 = ROMPAGE( ( ( Map47_Rom_Bank << 4 ) + 15 ) % ( NesHeader.byRomSize << 1 ) ); + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 47 Set PPU Banks Function */ +/*-------------------------------------------------------------------*/ +void Map47_Set_PPU_Banks() +{ + if ( NesHeader.byVRomSize > 0 ) + { + if ( Map47_Chr_Swap() ) + { + PPUBANK[ 0 ] = VROMPAGE( ( ( Map47_Rom_Bank << 7 ) + Map47_Chr4 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( ( ( Map47_Rom_Bank << 7 ) + Map47_Chr5 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( ( ( Map47_Rom_Bank << 7 ) + Map47_Chr6 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( ( ( Map47_Rom_Bank << 7 ) + Map47_Chr7 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 4 ] = VROMPAGE( ( ( Map47_Rom_Bank << 7 ) + ( Map47_Chr01 + 0 ) ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( ( ( Map47_Rom_Bank << 7 ) + ( Map47_Chr01 + 1 ) ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE( ( ( Map47_Rom_Bank << 7 ) + ( Map47_Chr23 + 0 ) ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( ( ( Map47_Rom_Bank << 7 ) + ( Map47_Chr23 + 1 ) ) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + } else { + PPUBANK[ 0 ] = VROMPAGE( ( ( Map47_Rom_Bank << 7 ) + ( Map47_Chr01 + 0 ) ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( ( ( Map47_Rom_Bank << 7 ) + ( Map47_Chr01 + 1 ) ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( ( ( Map47_Rom_Bank << 7 ) + ( Map47_Chr23 + 0 ) ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( ( ( Map47_Rom_Bank << 7 ) + ( Map47_Chr23 + 1 ) ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 4 ] = VROMPAGE( ( ( Map47_Rom_Bank << 7 ) + Map47_Chr4 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( ( ( Map47_Rom_Bank << 7 ) + Map47_Chr5 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE( ( ( Map47_Rom_Bank << 7 ) + Map47_Chr6 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( ( ( Map47_Rom_Bank << 7 ) + Map47_Chr7 ) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + } + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_183.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_183.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_183.c (revision 0) @@ -0,0 +1,228 @@ +/*===================================================================*/ +/* */ +/* Mapper 183 : Gimmick (Bootleg) */ +/* */ +/*===================================================================*/ + +BYTE Map183_Reg[8]; +BYTE Map183_IRQ_Enable; +int Map183_IRQ_Counter; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 183 */ +/*-------------------------------------------------------------------*/ +void Map183_Init() +{ + /* Initialize Mapper */ + MapperInit = Map183_Init; + + /* Write to Mapper */ + MapperWrite = Map183_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map183_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Initialize Registers */ + for( int i = 0; i < 8; i++ ) { + Map183_Reg[i] = i; + } + Map183_IRQ_Enable = 0; + Map183_IRQ_Counter = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 183 Write Function */ +/*-------------------------------------------------------------------*/ +void Map183_Write( WORD wAddr, BYTE byData ) +{ + switch( wAddr ) { + case 0x8800: + ROMBANK0 = ROMPAGE( byData % (NesHeader.byRomSize << 1) ); + break; + case 0xA800: + ROMBANK1 = ROMPAGE( byData % (NesHeader.byRomSize << 1) ); + break; + case 0xA000: + ROMBANK2 = ROMPAGE( byData % (NesHeader.byRomSize << 1) ); + break; + + case 0xB000: + Map183_Reg[0] = (Map183_Reg[0]&0xF0)|(byData&0x0F); + PPUBANK[ 0 ] = VROMPAGE( Map183_Reg[0] % (NesHeader.byVRomSize << 3) ); + InfoNES_SetupChr(); + break; + case 0xB004: + Map183_Reg[0] = (Map183_Reg[0]&0x0F)|((byData&0x0F)<<4); + PPUBANK[ 0 ] = VROMPAGE( Map183_Reg[0] % (NesHeader.byVRomSize << 3) ); + InfoNES_SetupChr(); + break; + case 0xB008: + Map183_Reg[1] = (Map183_Reg[1]&0xF0)|(byData&0x0F); + PPUBANK[ 1 ] = VROMPAGE( Map183_Reg[1] % (NesHeader.byVRomSize << 3) ); + InfoNES_SetupChr(); + break; + case 0xB00C: + Map183_Reg[1] = (Map183_Reg[1]&0x0F)|((byData&0x0F)<<4); + PPUBANK[ 1 ] = VROMPAGE( Map183_Reg[1] % (NesHeader.byVRomSize << 3) ); + InfoNES_SetupChr(); + break; + + case 0xC000: + Map183_Reg[2] = (Map183_Reg[2]&0xF0)|(byData&0x0F); + PPUBANK[ 2 ] = VROMPAGE( Map183_Reg[2] % (NesHeader.byVRomSize << 3) ); + InfoNES_SetupChr(); + break; + case 0xC004: + Map183_Reg[2] = (Map183_Reg[2]&0x0F)|((byData&0x0F)<<4); + PPUBANK[ 2 ] = VROMPAGE( Map183_Reg[2] % (NesHeader.byVRomSize << 3) ); + InfoNES_SetupChr(); + break; + case 0xC008: + Map183_Reg[3] = (Map183_Reg[3]&0xF0)|(byData&0x0F); + PPUBANK[ 3 ] = VROMPAGE( Map183_Reg[3] % (NesHeader.byVRomSize << 3) ); + InfoNES_SetupChr(); + break; + case 0xC00C: + Map183_Reg[3] = (Map183_Reg[3]&0x0F)|((byData&0x0F)<<4); + PPUBANK[ 3 ] = VROMPAGE( Map183_Reg[3] % (NesHeader.byVRomSize << 3) ); + InfoNES_SetupChr(); + break; + + case 0xD000: + Map183_Reg[4] = (Map183_Reg[4]&0xF0)|(byData&0x0F); + PPUBANK[ 4 ] = VROMPAGE( Map183_Reg[4] % (NesHeader.byVRomSize << 3) ); + InfoNES_SetupChr(); + break; + case 0xD004: + Map183_Reg[4] = (Map183_Reg[4]&0x0F)|((byData&0x0F)<<4); + PPUBANK[ 4 ] = VROMPAGE( Map183_Reg[4] % (NesHeader.byVRomSize << 3) ); + InfoNES_SetupChr(); + break; + case 0xD008: + Map183_Reg[5] = (Map183_Reg[5]&0xF0)|(byData&0x0F); + PPUBANK[ 5 ] = VROMPAGE( Map183_Reg[5] % (NesHeader.byVRomSize << 3) ); + InfoNES_SetupChr(); + break; + case 0xD00C: + Map183_Reg[5] = (Map183_Reg[5]&0x0F)|((byData&0x0F)<<4); + PPUBANK[ 5 ] = VROMPAGE( Map183_Reg[5] % (NesHeader.byVRomSize << 3) ); + InfoNES_SetupChr(); + break; + + case 0xE000: + Map183_Reg[6] = (Map183_Reg[6]&0xF0)|(byData&0x0F); + PPUBANK[ 6 ] = VROMPAGE( Map183_Reg[6] % (NesHeader.byVRomSize << 3) ); + InfoNES_SetupChr(); + break; + case 0xE004: + Map183_Reg[6] = (Map183_Reg[6]&0x0F)|((byData&0x0F)<<4); + PPUBANK[ 6 ] = VROMPAGE( Map183_Reg[6] % (NesHeader.byVRomSize << 3) ); + InfoNES_SetupChr(); + break; + case 0xE008: + Map183_Reg[7] = (Map183_Reg[3]&0xF0)|(byData&0x0F); + PPUBANK[ 7 ] = VROMPAGE( Map183_Reg[7] % (NesHeader.byVRomSize << 3) ); + InfoNES_SetupChr(); + break; + case 0xE00C: + Map183_Reg[7] = (Map183_Reg[3]&0x0F)|((byData&0x0F)<<4); + PPUBANK[ 7 ] = VROMPAGE( Map183_Reg[7] % (NesHeader.byVRomSize << 3) ); + InfoNES_SetupChr(); + break; + + case 0x9008: + if( byData == 1 ) { + for( int i = 0; i < 8; i++ ) { + Map183_Reg[i] = i; + } + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) { + PPUBANK[ 0 ] = VROMPAGE( 0 ); + PPUBANK[ 1 ] = VROMPAGE( 1 ); + PPUBANK[ 2 ] = VROMPAGE( 2 ); + PPUBANK[ 3 ] = VROMPAGE( 3 ); + PPUBANK[ 4 ] = VROMPAGE( 4 ); + PPUBANK[ 5 ] = VROMPAGE( 5 ); + PPUBANK[ 6 ] = VROMPAGE( 6 ); + PPUBANK[ 7 ] = VROMPAGE( 7 ); + InfoNES_SetupChr(); + } + } + break; + + case 0x9800: + if( byData == 0 ) InfoNES_Mirroring( 1 ); + else if( byData == 1 ) InfoNES_Mirroring( 0 ); + else if( byData == 2 ) InfoNES_Mirroring( 2 ); + else if( byData == 3 ) InfoNES_Mirroring( 3 ); + break; + + case 0xF000: + Map183_IRQ_Counter = (Map183_IRQ_Counter&0xFF00)|byData; + break; + case 0xF004: + Map183_IRQ_Counter = (Map183_IRQ_Counter&0x00FF)|(byData<<8); + break; + case 0xF008: + Map183_IRQ_Enable = byData; + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 183 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map183_HSync() +{ + if( Map183_IRQ_Enable & 0x02 ) { + if( Map183_IRQ_Counter <= 113 ) { + Map183_IRQ_Counter = 0; + IRQ_REQ; + } else { + Map183_IRQ_Counter -= 113; + } + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_085.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_085.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_085.c (revision 0) @@ -0,0 +1,192 @@ +/*===================================================================*/ +/* */ +/* Mapper 85 (Konami VRC7) */ +/* */ +/*===================================================================*/ + +BYTE Map85_Chr_Ram[ 0x100 * 0x400 ]; +BYTE Map85_Regs[ 1 ]; +BYTE Map85_IRQ_Enable; +BYTE Map85_IRQ_Cnt; +BYTE Map85_IRQ_Latch; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 85 */ +/*-------------------------------------------------------------------*/ +void Map85_Init() +{ + /* Initialize Mapper */ + MapperInit = Map85_Init; + + /* Write to Mapper */ + MapperWrite = Map85_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map85_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set PPU Banks */ + PPUBANK[ 0 ] = Map85_VROMPAGE( 0 ); + PPUBANK[ 1 ] = Map85_VROMPAGE( 0 ); + PPUBANK[ 2 ] = Map85_VROMPAGE( 0 ); + PPUBANK[ 3 ] = Map85_VROMPAGE( 0 ); + PPUBANK[ 4 ] = Map85_VROMPAGE( 0 ); + PPUBANK[ 5 ] = Map85_VROMPAGE( 0 ); + PPUBANK[ 6 ] = Map85_VROMPAGE( 0 ); + PPUBANK[ 7 ] = Map85_VROMPAGE( 0 ); + InfoNES_SetupChr(); + + /* Initialize State Registers */ + Map85_Regs[ 0 ] = 0; + Map85_IRQ_Enable = 0; + Map85_IRQ_Cnt = 0; + Map85_IRQ_Latch = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 85 Write Function */ +/*-------------------------------------------------------------------*/ +void Map85_Write( WORD wAddr, BYTE byData ) +{ + switch( wAddr & 0xf030 ) + { + case 0x8000: + byData %= ( NesHeader.byRomSize << 1 ); + ROMBANK0 = ROMPAGE( byData ); + break; + + case 0x8010: + byData %= ( NesHeader.byRomSize << 1 ); + ROMBANK1 = ROMPAGE( byData ); + break; + + case 0x9000: + byData %= ( NesHeader.byRomSize << 1 ); + ROMBANK2 = ROMPAGE( byData ); + break; + + case 0x9010: + case 0x9030: + /* Extra Sound */ + + case 0xa000: + PPUBANK[ 0 ] = Map85_VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0xa010: + PPUBANK[ 1 ] = Map85_VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0xb000: + PPUBANK[ 2 ] = Map85_VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0xb010: + PPUBANK[ 3 ] = Map85_VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0xc000: + PPUBANK[ 4 ] = Map85_VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0xc010: + PPUBANK[ 5 ] = Map85_VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0xd000: + PPUBANK[ 6 ] = Map85_VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0xd010: + PPUBANK[ 7 ] = Map85_VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + /* Name Table Mirroring */ + case 0xe000: + switch ( byData & 0x03 ) + { + case 0x00: + InfoNES_Mirroring( 1 ); + break; + case 0x01: + InfoNES_Mirroring( 0 ); + break; + case 0x02: + InfoNES_Mirroring( 3 ); + break; + case 0x03: + InfoNES_Mirroring( 2 ); + break; + } + break; + + case 0xe010: + Map85_IRQ_Latch = 0xff - byData; + break; + + case 0xf000: + Map85_Regs[ 0 ] = byData & 0x01; + Map85_IRQ_Enable = ( byData & 0x02 ) >> 1; + Map85_IRQ_Cnt = Map85_IRQ_Latch; + break; + + case 0xf010: + Map85_IRQ_Enable = Map85_Regs[ 0 ]; + Map85_IRQ_Cnt = Map85_IRQ_Latch; + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 85 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map85_HSync() +{ + if ( Map85_IRQ_Enable ) + { + if ( Map85_IRQ_Cnt == 0 ) + { + IRQ_REQ; + Map85_IRQ_Enable = 0; + } else { + Map85_IRQ_Cnt--; + } + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_068.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_068.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_068.c (revision 0) @@ -0,0 +1,170 @@ +/*===================================================================*/ +/* */ +/* Mapper 68 (Sunsoft Mapper #4) */ +/* */ +/*===================================================================*/ + +BYTE Map68_Regs[4]; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 68 */ +/*-------------------------------------------------------------------*/ +void Map68_Init() +{ + /* Initialize Mapper */ + MapperInit = Map68_Init; + + /* Write to Mapper */ + MapperWrite = Map68_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Initialize state flag */ + for ( int i = 0; i < 4; i++ ) + Map68_Regs[ i ] = 0x00; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 68 Write Function */ +/*-------------------------------------------------------------------*/ +void Map68_Write( WORD wAddr, BYTE byData ) +{ + switch( wAddr ) + { + case 0x8000: + /* Set PPU Banks */ + byData %= ( NesHeader.byVRomSize << 2 ); + byData <<= 1; + PPUBANK[ 0 ] = VROMPAGE( byData ); + PPUBANK[ 1 ] = VROMPAGE( byData + 1); + InfoNES_SetupChr(); + break; + + case 0x9000: + /* Set PPU Banks */ + byData %= ( NesHeader.byVRomSize << 2 ); + byData <<= 1; + PPUBANK[ 2 ] = VROMPAGE( byData ); + PPUBANK[ 3 ] = VROMPAGE( byData + 1); + InfoNES_SetupChr(); + break; + + case 0xA000: + /* Set PPU Banks */ + byData %= ( NesHeader.byVRomSize << 2 ); + byData <<= 1; + PPUBANK[ 4 ] = VROMPAGE( byData ); + PPUBANK[ 5 ] = VROMPAGE( byData + 1); + InfoNES_SetupChr(); + break; + + case 0xB000: + /* Set PPU Banks */ + byData %= ( NesHeader.byVRomSize << 2 ); + byData <<= 1; + PPUBANK[ 6 ] = VROMPAGE( byData ); + PPUBANK[ 7 ] = VROMPAGE( byData + 1); + InfoNES_SetupChr(); + break; + + case 0xC000: + Map68_Regs[ 2 ] = byData; + Map68_SyncMirror(); + break; + + case 0xD000: + Map68_Regs[ 3 ] = byData; + Map68_SyncMirror(); + break; + + case 0xE000: + Map68_Regs[ 0 ] = ( byData & 0x10 ) >> 4; + Map68_Regs[ 1 ] = byData & 0x03; + Map68_SyncMirror(); + break; + + case 0xF000: + /* Set ROM Banks */ + byData %= NesHeader.byRomSize; + byData <<= 1; + ROMBANK0 = ROMPAGE( byData ); + ROMBANK1 = ROMPAGE( byData + 1 ); + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 68 Sub Function */ +/*-------------------------------------------------------------------*/ +void Map68_SyncMirror( void ) +{ + if ( Map68_Regs[ 0 ] ) + { + switch( Map68_Regs[ 1 ] ) + { + case 0x00: + PPUBANK[ 8 ] = VROMPAGE( Map68_Regs[ 2 ] + 0x80 ); + PPUBANK[ 9 ] = VROMPAGE( Map68_Regs[ 3 ] + 0x80 ); + PPUBANK[ 10 ] = VROMPAGE( Map68_Regs[ 2 ] + 0x80 ); + PPUBANK[ 11 ] = VROMPAGE( Map68_Regs[ 3 ] + 0x80 ); + break; + + case 0x01: + PPUBANK[ 8 ] = VROMPAGE( Map68_Regs[ 2 ] + 0x80 ); + PPUBANK[ 9 ] = VROMPAGE( Map68_Regs[ 2 ] + 0x80 ); + PPUBANK[ 10 ] = VROMPAGE( Map68_Regs[ 3 ] + 0x80 ); + PPUBANK[ 11 ] = VROMPAGE( Map68_Regs[ 3 ] + 0x80 ); + break; + + case 0x02: + PPUBANK[ 8 ] = VROMPAGE( Map68_Regs[ 2 ] + 0x80 ); + PPUBANK[ 9 ] = VROMPAGE( Map68_Regs[ 2 ] + 0x80 ); + PPUBANK[ 10 ] = VROMPAGE( Map68_Regs[ 2 ] + 0x80 ); + PPUBANK[ 11 ] = VROMPAGE( Map68_Regs[ 2 ] + 0x80 ); + break; + + case 0x03: + PPUBANK[ 8 ] = VROMPAGE( Map68_Regs[ 3 ] + 0x80 ); + PPUBANK[ 9 ] = VROMPAGE( Map68_Regs[ 3 ] + 0x80 ); + PPUBANK[ 10 ] = VROMPAGE( Map68_Regs[ 3 ] + 0x80 ); + PPUBANK[ 11 ] = VROMPAGE( Map68_Regs[ 3 ] + 0x80 ); + break; + } + InfoNES_SetupChr(); + } + else + { + InfoNES_Mirroring( Map68_Regs[ 1 ] ); + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_187.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_187.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_187.c (revision 0) @@ -0,0 +1,293 @@ +/*===================================================================*/ +/* */ +/* Mapper 187 : Street Fighter Zero 2 97 */ +/* */ +/*===================================================================*/ + +BYTE Map187_Prg[4]; +int Map187_Chr[8]; +BYTE Map187_Bank[8]; + +BYTE Map187_ExtMode; +BYTE Map187_ChrMode; +BYTE Map187_ExtEnable; + +BYTE Map187_IRQ_Enable; +BYTE Map187_IRQ_Counter; +BYTE Map187_IRQ_Latch; +BYTE Map187_IRQ_Occur; +BYTE Map187_LastWrite; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 187 */ +/*-------------------------------------------------------------------*/ +void Map187_Init() +{ + /* Initialize Mapper */ + MapperInit = Map187_Init; + + /* Write to Mapper */ + MapperWrite = Map187_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map187_Apu; + + /* Read from APU */ + MapperReadApu = Map187_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map187_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set Registers */ + for( int i = 0; i < 8; i++ ) { + Map187_Chr[i] = 0x00; + Map187_Bank[i] = 0x00; + } + + /* Set ROM Banks */ + Map187_Prg[0] = (NesHeader.byRomSize<<1)-4; + Map187_Prg[1] = (NesHeader.byRomSize<<1)-3; + Map187_Prg[2] = (NesHeader.byRomSize<<1)-2; + Map187_Prg[3] = (NesHeader.byRomSize<<1)-1; + Map187_Set_CPU_Banks(); + + Map187_ExtMode = 0; + Map187_ChrMode = 0; + Map187_ExtEnable = 0; + + Map187_IRQ_Enable = 0; + Map187_IRQ_Counter = 0; + Map187_IRQ_Latch = 0; + + Map187_LastWrite = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 187 Write Function */ +/*-------------------------------------------------------------------*/ +void Map187_Write( WORD wAddr, BYTE byData ) +{ + Map187_LastWrite = byData; + switch( wAddr ) { + case 0x8003: + Map187_ExtEnable = 0xFF; + Map187_ChrMode = byData; + if( (byData&0xF0) == 0 ) { + Map187_Prg[2] = (NesHeader.byRomSize<<1)-2; + Map187_Set_CPU_Banks(); + } + break; + + case 0x8000: + Map187_ExtEnable = 0; + Map187_ChrMode = byData; + break; + + case 0x8001: + if( !Map187_ExtEnable ) { + switch( Map187_ChrMode & 7 ) { + case 0: + byData &= 0xFE; + Map187_Chr[4] = (int)byData+0x100; + Map187_Chr[5] = (int)byData+0x100+1; + Map187_Set_PPU_Banks(); + break; + case 1: + byData &= 0xFE; + Map187_Chr[6] = (int)byData+0x100; + Map187_Chr[7] = (int)byData+0x100+1; + Map187_Set_PPU_Banks(); + break; + case 2: + Map187_Chr[0] = byData; + Map187_Set_PPU_Banks(); + break; + case 3: + Map187_Chr[1] = byData; + Map187_Set_PPU_Banks(); + break; + case 4: + Map187_Chr[2] = byData; + Map187_Set_PPU_Banks(); + break; + case 5: + Map187_Chr[3] = byData; + Map187_Set_PPU_Banks(); + break; + case 6: + if( (Map187_ExtMode&0xA0)!=0xA0 ) { + Map187_Prg[0] = byData; + Map187_Set_CPU_Banks(); + } + break; + case 7: + if( (Map187_ExtMode&0xA0)!=0xA0 ) { + Map187_Prg[1] = byData; + Map187_Set_CPU_Banks(); + } + break; + default: + break; + } + } else { + switch( Map187_ChrMode ) { + case 0x2A: + Map187_Prg[1] = 0x0F; + break; + case 0x28: + Map187_Prg[2] = 0x17; + break; + case 0x26: + break; + default: + break; + } + Map187_Set_CPU_Banks(); + } + Map187_Bank[Map187_ChrMode&7] = byData; + break; + + case 0xA000: + if( byData & 0x01 ) { + InfoNES_Mirroring( 0 ); + } else { + InfoNES_Mirroring( 1 ); + } + break; + case 0xA001: + break; + + case 0xC000: + Map187_IRQ_Counter = byData; + Map187_IRQ_Occur = 0; + break; + case 0xC001: + Map187_IRQ_Latch = byData; + Map187_IRQ_Occur = 0; + break; + case 0xE000: + case 0xE002: + Map187_IRQ_Enable = 0; + Map187_IRQ_Occur = 0; + break; + case 0xE001: + case 0xE003: + Map187_IRQ_Enable = 1; + Map187_IRQ_Occur = 0; + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 187 Write to APU Function */ +/*-------------------------------------------------------------------*/ +void Map187_Apu( WORD wAddr, BYTE byData ) +{ + Map187_LastWrite = byData; + if( wAddr == 0x5000 ) { + Map187_ExtMode = byData; + if( byData & 0x80 ) { + if( byData & 0x20 ) { + Map187_Prg[0] = ((byData&0x1E)<<1)+0; + Map187_Prg[1] = ((byData&0x1E)<<1)+1; + Map187_Prg[2] = ((byData&0x1E)<<1)+2; + Map187_Prg[3] = ((byData&0x1E)<<1)+3; + } else { + Map187_Prg[2] = ((byData&0x1F)<<1)+0; + Map187_Prg[3] = ((byData&0x1F)<<1)+1; + } + } else { + Map187_Prg[0] = Map187_Bank[6]; + Map187_Prg[1] = Map187_Bank[7]; + Map187_Prg[2] = (NesHeader.byRomSize<<1)-2; + Map187_Prg[3] = (NesHeader.byRomSize<<1)-1; + } + Map187_Set_CPU_Banks(); + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 187 Read from APU Function */ +/*-------------------------------------------------------------------*/ +BYTE Map187_ReadApu( WORD wAddr ) +{ + switch( Map187_LastWrite&0x03 ) { + case 0: + return 0x83; + case 1: + return 0x83; + case 2: + return 0x42; + case 3: + return 0x00; + } + return 0; +} + +/*-------------------------------------------------------------------*/ +/* Mapper 187 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map187_HSync() +{ + if( ( /* PPU_Scanline >= 0 && */ PPU_Scanline <= 239) ) { + if( PPU_R1 & R1_SHOW_SCR || PPU_R1 & R1_SHOW_SP ) { + if( Map187_IRQ_Enable ) { + if( !Map187_IRQ_Counter ) { + Map187_IRQ_Counter--; + Map187_IRQ_Enable = 0; + Map187_IRQ_Occur = 0xFF; + } else { + Map187_IRQ_Counter--; + } + } + } + } + if ( Map187_IRQ_Occur ) { + IRQ_REQ; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 187 Set CPU Banks Function */ +/*-------------------------------------------------------------------*/ +void Map187_Set_CPU_Banks() +{ + ROMBANK0 = ROMPAGE(((Map187_Prg[0]<<2)+0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE(((Map187_Prg[1]<<2)+1) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE(((Map187_Prg[2]<<2)+2) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE(((Map187_Prg[3]<<2)+3) % (NesHeader.byRomSize<<1)); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 187 Set PPU Banks Function */ +/*-------------------------------------------------------------------*/ +void Map187_Set_PPU_Banks() +{ + PPUBANK[ 0 ] = VROMPAGE(((Map187_Chr[0]<<3)+0) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 1 ] = VROMPAGE(((Map187_Chr[1]<<3)+1) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 2 ] = VROMPAGE(((Map187_Chr[2]<<3)+2) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 3 ] = VROMPAGE(((Map187_Chr[3]<<3)+3) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 4 ] = VROMPAGE(((Map187_Chr[4]<<3)+4) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 5 ] = VROMPAGE(((Map187_Chr[5]<<3)+5) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 6 ] = VROMPAGE(((Map187_Chr[6]<<3)+6) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 7 ] = VROMPAGE(((Map187_Chr[7]<<3)+7) % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_089.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_089.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_089.c (revision 0) @@ -0,0 +1,94 @@ +/*===================================================================*/ +/* */ +/* Mapper 89 (Sunsoft) */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 89 */ +/*-------------------------------------------------------------------*/ +void Map89_Init() +{ + /* Initialize Mapper */ + MapperInit = Map89_Init; + + /* Write to Mapper */ + MapperWrite = Map89_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 89 Write Function */ +/*-------------------------------------------------------------------*/ +void Map89_Write( WORD wAddr, BYTE byData ) +{ + if ( ( wAddr & 0xFF00 ) == 0xC000 ) + { + BYTE byPrgBank = (byData & 0x70) >> 4; + BYTE byChrBank = ((byData & 0x80) >> 4) | (byData & 0x07); + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( (byPrgBank*2+0) % (NesHeader.byRomSize << 1) ); + ROMBANK1 = ROMPAGE( (byPrgBank*2+1) % (NesHeader.byRomSize << 1) ); + + PPUBANK[ 0 ] = VROMPAGE( (byChrBank*8+0) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 1 ] = VROMPAGE( (byChrBank*8+1) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 2 ] = VROMPAGE( (byChrBank*8+2) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 3 ] = VROMPAGE( (byChrBank*8+3) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 4 ] = VROMPAGE( (byChrBank*8+4) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 5 ] = VROMPAGE( (byChrBank*8+5) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 6 ] = VROMPAGE( (byChrBank*8+6) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 7 ] = VROMPAGE( (byChrBank*8+7) % (NesHeader.byVRomSize << 3) ); + InfoNES_SetupChr(); + + if ( byData & 0x08 ) + { + InfoNES_Mirroring( 2 ); + } + else + { + InfoNES_Mirroring( 3 ); + } + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_010.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_010.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_010.c (revision 0) @@ -0,0 +1,233 @@ +/*===================================================================*/ +/* */ +/* Mapper 10 (MMC4) */ +/* */ +/*===================================================================*/ + +struct Map10_Latch +{ + BYTE lo_bank; + BYTE hi_bank; + BYTE state; +}; + +struct Map10_Latch latch3; // Latch Selector #1 +struct Map10_Latch latch4; // Latch Selector #2 + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 10 */ +/*-------------------------------------------------------------------*/ +void Map10_Init() +{ + int nPage; + + /* Initialize Mapper */ + MapperInit = Map10_Init; + + /* Write to Mapper */ + MapperWrite = Map10_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map10_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Init Latch Selector */ + latch3.state = 0xfe; + latch3.lo_bank = 0; + latch3.hi_bank = 0; + latch4.state = 0xfe; + latch4.lo_bank = 0; + latch4.hi_bank = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 10 Write Function */ +/*-------------------------------------------------------------------*/ +void Map10_Write( WORD wAddr, BYTE byData ) +{ + WORD wMapAddr; + + wMapAddr = wAddr & 0xf000; + switch ( wMapAddr ) + { + case 0xa000: + /* Set ROM Banks */ + byData %= NesHeader.byRomSize; + byData <<= 1; + ROMBANK0 = ROMPAGE( byData ); + ROMBANK1 = ROMPAGE( byData + 1 ); + break; + + case 0xb000: + /* Number of 4K Banks to Number of 1K Banks */ + byData %= ( NesHeader.byVRomSize << 1 ); + byData <<= 2; + + /* Latch Control */ + latch3.lo_bank = byData; + + if (0xfd == latch3.state) + { + /* Set PPU Banks */ + PPUBANK[ 0 ] = VROMPAGE( byData ); + PPUBANK[ 1 ] = VROMPAGE( byData + 1 ); + PPUBANK[ 2 ] = VROMPAGE( byData + 2 ); + PPUBANK[ 3 ] = VROMPAGE( byData + 3 ); + InfoNES_SetupChr(); + } + break; + + case 0xc000: + /* Number of 4K Banks to Number of 1K Banks */ + byData %= ( NesHeader.byVRomSize << 1 ); + byData <<= 2; + + /* Latch Control */ + latch3.hi_bank = byData; + + if (0xfe == latch3.state) + { + /* Set PPU Banks */ + PPUBANK[ 0 ] = VROMPAGE( byData ); + PPUBANK[ 1 ] = VROMPAGE( byData + 1 ); + PPUBANK[ 2 ] = VROMPAGE( byData + 2 ); + PPUBANK[ 3 ] = VROMPAGE( byData + 3 ); + InfoNES_SetupChr(); + } + break; + + case 0xd000: + /* Number of 4K Banks to Number of 1K Banks */ + byData %= ( NesHeader.byVRomSize << 1 ); + byData <<= 2; + + /* Latch Control */ + latch4.lo_bank = byData; + + if (0xfd == latch4.state) + { + /* Set PPU Banks */ + PPUBANK[ 4 ] = VROMPAGE( byData ); + PPUBANK[ 5 ] = VROMPAGE( byData + 1 ); + PPUBANK[ 6 ] = VROMPAGE( byData + 2 ); + PPUBANK[ 7 ] = VROMPAGE( byData + 3 ); + InfoNES_SetupChr(); + } + break; + + case 0xe000: + /* Number of 4K Banks to Number of 1K Banks */ + byData %= ( NesHeader.byVRomSize << 1 ); + byData <<= 2; + + /* Latch Control */ + latch4.hi_bank = byData; + + if (0xfe == latch4.state) + { + /* Set PPU Banks */ + PPUBANK[ 4 ] = VROMPAGE( byData ); + PPUBANK[ 5 ] = VROMPAGE( byData + 1 ); + PPUBANK[ 6 ] = VROMPAGE( byData + 2 ); + PPUBANK[ 7 ] = VROMPAGE( byData + 3 ); + InfoNES_SetupChr(); + } + break; + + case 0xf000: + /* Name Table Mirroring */ + InfoNES_Mirroring( byData & 0x01 ? 0 : 1); + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 10 PPU Function */ +/*-------------------------------------------------------------------*/ +void Map10_PPU( WORD wAddr ) +{ + /* Control Latch Selector */ + switch ( wAddr & 0x3ff0 ) + { + case 0x0fd0: + /* Latch Control */ + latch3.state = 0xfd; + /* Set PPU Banks */ + PPUBANK[ 0 ] = VROMPAGE( latch3.lo_bank ); + PPUBANK[ 1 ] = VROMPAGE( latch3.lo_bank + 1 ); + PPUBANK[ 2 ] = VROMPAGE( latch3.lo_bank + 2 ); + PPUBANK[ 3 ] = VROMPAGE( latch3.lo_bank + 3 ); + InfoNES_SetupChr(); + break; + + case 0x0fe0: + /* Latch Control */ + latch3.state = 0xfe; + /* Set PPU Banks */ + PPUBANK[ 0 ] = VROMPAGE( latch3.hi_bank ); + PPUBANK[ 1 ] = VROMPAGE( latch3.hi_bank + 1 ); + PPUBANK[ 2 ] = VROMPAGE( latch3.hi_bank + 2 ); + PPUBANK[ 3 ] = VROMPAGE( latch3.hi_bank + 3 ); + InfoNES_SetupChr(); + break; + + case 0x1fd0: + /* Latch Control */ + latch4.state = 0xfd; + /* Set PPU Banks */ + PPUBANK[ 4 ] = VROMPAGE( latch4.lo_bank ); + PPUBANK[ 5 ] = VROMPAGE( latch4.lo_bank + 1 ); + PPUBANK[ 6 ] = VROMPAGE( latch4.lo_bank + 2 ); + PPUBANK[ 7 ] = VROMPAGE( latch4.lo_bank + 3 ); + InfoNES_SetupChr(); + break; + + case 0x1fe0: + /* Latch Control */ + latch4.state = 0xfe; + /* Set PPU Banks */ + PPUBANK[ 4 ] = VROMPAGE( latch4.hi_bank ); + PPUBANK[ 5 ] = VROMPAGE( latch4.hi_bank + 1 ); + PPUBANK[ 6 ] = VROMPAGE( latch4.hi_bank + 2 ); + PPUBANK[ 7 ] = VROMPAGE( latch4.hi_bank + 3 ); + InfoNES_SetupChr(); + break; + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_112.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_112.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_112.c (revision 0) @@ -0,0 +1,300 @@ +/*===================================================================*/ +/* */ +/* Mapper 112 (Pirates) */ +/* */ +/*===================================================================*/ + +BYTE Map112_Regs[8]; +DWORD Map112_Prg0,Map112_Prg1; +DWORD Map112_Chr01,Map112_Chr23,Map112_Chr4,Map112_Chr5,Map112_Chr6,Map112_Chr7; + +BYTE Map112_IRQ_Enable; /* IRQs enabled */ +BYTE Map112_IRQ_Cnt; /* IRQ scanline counter, decreasing */ +BYTE Map112_IRQ_Latch; /* IRQ scanline counter latch */ + +#define Map112_Chr_Swap() ( Map112_Regs[0] & 0x80 ) +#define Map112_Prg_Swap() ( Map112_Regs[0] & 0x40 ) + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 112 */ +/*-------------------------------------------------------------------*/ +void Map112_Init() +{ + /* Initialize Mapper */ + MapperInit = Map112_Init; + + /* Write to Mapper */ + MapperWrite = Map112_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map112_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* clear registers FIRST!!! */ + for(int i = 0; i < 8; i++) + { + Map112_Regs[i] = 0x00; + } + + /* set CPU bank pointers */ + Map112_Prg0 = 0; + Map112_Prg1 = 1; + Map112_Set_CPU_Banks(); + + /* set VROM banks */ + if ( NesHeader.byVRomSize > 0 ) + { + Map112_Chr01 = 0; + Map112_Chr23 = 2; + Map112_Chr4 = 4; + Map112_Chr5 = 5; + Map112_Chr6 = 6; + Map112_Chr7 = 7; + Map112_Set_PPU_Banks(); + } + else + { + Map112_Chr01 = Map112_Chr23 = Map112_Chr4 = Map112_Chr5 = Map112_Chr6 = Map112_Chr7 = 0; + } + + Map112_IRQ_Enable = 0; + Map112_IRQ_Cnt = 0; + Map112_IRQ_Latch = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 112 Write Function */ +/*-------------------------------------------------------------------*/ +void Map112_Write( WORD wAddr, BYTE byData ) +{ + DWORD dwBankNum; + + /* Set ROM Banks */ + switch( wAddr & 0xE001 ) + { + case 0x8000: + Map112_Regs[0] = byData; + Map112_Set_PPU_Banks(); + Map112_Set_CPU_Banks(); + break; + + case 0xA000: + Map112_Regs[1] = byData; + dwBankNum = Map112_Regs[1]; + switch ( Map112_Regs[0] & 0x07 ) + { + case 0x02: + if ( NesHeader.byVRomSize > 0 ) + { + dwBankNum &= 0xfe; + Map112_Chr01 = dwBankNum; + Map112_Set_PPU_Banks(); + } + break; + + case 0x03: + if ( NesHeader.byVRomSize > 0 ) + { + dwBankNum &= 0xfe; + Map112_Chr23 = dwBankNum; + Map112_Set_PPU_Banks(); + } + break; + + case 0x04: + if ( NesHeader.byVRomSize > 0 ) + { + Map112_Chr4 = dwBankNum; + Map112_Set_PPU_Banks(); + } + break; + + case 0x05: + if ( NesHeader.byVRomSize > 0 ) + { + Map112_Chr5 = dwBankNum; + Map112_Set_PPU_Banks(); + } + break; + + case 0x06: + if ( NesHeader.byVRomSize > 0 ) + { + Map112_Chr6 = dwBankNum; + Map112_Set_PPU_Banks(); + } + break; + + case 0x07: + if ( NesHeader.byVRomSize > 0 ) + { + Map112_Chr7 = dwBankNum; + Map112_Set_PPU_Banks(); + } + break; + + case 0x00: + Map112_Prg0 = dwBankNum; + Map112_Set_CPU_Banks(); + break; + + case 0x01: + Map112_Prg1 = dwBankNum; + Map112_Set_CPU_Banks(); + break; + } + break; + + case 0x8001: + Map112_Regs[2] = byData; + if ( !ROM_FourScr ) + { + if ( byData & 0x01 ) + { + InfoNES_Mirroring( 1 ); /* Vertical */ + } + else + { + InfoNES_Mirroring( 0 ); /* Horizontal */ + } + } + break; + + case 0xA001: + Map112_Regs[3] = byData; + break; + + case 0xC000: + Map112_Regs[4] = byData; + Map112_IRQ_Cnt = Map112_Regs[4]; + break; + + case 0xC001: + Map112_Regs[5] = byData; + Map112_IRQ_Latch = Map112_Regs[5]; + break; + + case 0xE000: + Map112_Regs[6] = byData; + Map112_IRQ_Enable = 0; + + if ( byData ) + { + InfoNES_Mirroring( 0 ); /* Horizontal */ + } + else + { + InfoNES_Mirroring( 1 ); /* Vertical */ + } + break; + + case 0xE001: + Map112_Regs[7] = byData; + Map112_IRQ_Enable = 1; + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 112 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map112_HSync() +{ +/* + * Callback at HSync + * + */ + if ( Map112_IRQ_Enable ) + { + if ( /* 0 <= PPU_Scanline && */ PPU_Scanline <= 239 ) + { + if ( PPU_R1 & R1_SHOW_SCR || PPU_R1 & R1_SHOW_SP ) + { + if ( !( Map112_IRQ_Cnt-- ) ) + { + Map112_IRQ_Cnt = Map112_IRQ_Latch; + IRQ_REQ; + } + } + } + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 112 Set CPU Banks Function */ +/*-------------------------------------------------------------------*/ +void Map112_Set_CPU_Banks() +{ + /* Set ROM Banks */ + if ( Map112_Prg_Swap() ) + { + ROMBANK0 = ROMLASTPAGE( 1 ); + ROMBANK1 = ROMPAGE( Map112_Prg1 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMPAGE( Map112_Prg0 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK3 = ROMLASTPAGE( 0 ); + } + else + { + ROMBANK0 = ROMPAGE( Map112_Prg0 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE( Map112_Prg1 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 112 Set PPU Banks Function */ +/*-------------------------------------------------------------------*/ +void Map112_Set_PPU_Banks() +{ + if ( NesHeader.byVRomSize > 0 ) + { + if ( Map112_Chr_Swap() ) + { + PPUBANK[ 0 ] = VROMPAGE( Map112_Chr4 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( Map112_Chr5 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( Map112_Chr6 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( Map112_Chr7 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 4 ] = VROMPAGE( ( Map112_Chr01 + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( ( Map112_Chr01 + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE( ( Map112_Chr23 + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( ( Map112_Chr23 + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + } + else + { + PPUBANK[ 0 ] = VROMPAGE( ( Map112_Chr01 + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( ( Map112_Chr01 + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( ( Map112_Chr23 + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( ( Map112_Chr23 + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 4 ] = VROMPAGE( Map112_Chr4 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( Map112_Chr5 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE( Map112_Chr6 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( Map112_Chr7 % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + } + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_231.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_231.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_231.c (revision 0) @@ -0,0 +1,83 @@ +/*===================================================================*/ +/* */ +/* Mapper 231 : 20-in-1 */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 231 */ +/*-------------------------------------------------------------------*/ +void Map231_Init() +{ + /* Initialize Mapper */ + MapperInit = Map231_Init; + + /* Write to Mapper */ + MapperWrite = Map231_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 231 Write Function */ +/*-------------------------------------------------------------------*/ +void Map231_Write( WORD wAddr, BYTE byData ) +{ + BYTE byBank = wAddr & 0x1E; + + if( wAddr & 0x0020 ) { + ROMBANK0 = ROMPAGE(((byBank<<1)+0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE(((byBank<<1)+1) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE(((byBank<<1)+2) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE(((byBank<<1)+3) % (NesHeader.byRomSize<<1)); + } else { + ROMBANK0 = ROMPAGE(((byBank<<1)+0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE(((byBank<<1)+1) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE(((byBank<<1)+0) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE(((byBank<<1)+1) % (NesHeader.byRomSize<<1)); + } + + if( wAddr & 0x0080 ) { + InfoNES_Mirroring( 0 ); + } else { + InfoNES_Mirroring( 1 ); + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_133.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_133.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_133.c (revision 0) @@ -0,0 +1,83 @@ +/*===================================================================*/ +/* */ +/* Mapper 133 : SACHEN CHEN */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 133 */ +/*-------------------------------------------------------------------*/ +void Map133_Init() +{ + /* Initialize Mapper */ + MapperInit = Map133_Init; + + /* Write to Mapper */ + MapperWrite = Map0_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map133_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 133 Write to APU Function */ +/*-------------------------------------------------------------------*/ +void Map133_Apu( WORD wAddr, BYTE byData ) +{ + if ( wAddr == 0x4120 ) { + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( ((byData&0x04) + 0 ) % (NesHeader.byRomSize << 1) ); + ROMBANK1 = ROMPAGE( ((byData&0x04) + 1 ) % (NesHeader.byRomSize << 1) ); + ROMBANK2 = ROMPAGE( ((byData&0x04) + 2 ) % (NesHeader.byRomSize << 1) ); + ROMBANK3 = ROMPAGE( ((byData&0x04) + 3 ) % (NesHeader.byRomSize << 1) ); + + /* Set PPU Banks */ + PPUBANK[ 0 ] = VROMPAGE( (((byData&0x03)<<3) + 0) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 1 ] = VROMPAGE( (((byData&0x03)<<3) + 1) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 2 ] = VROMPAGE( (((byData&0x03)<<3) + 2) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 3 ] = VROMPAGE( (((byData&0x03)<<3) + 3) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 4 ] = VROMPAGE( (((byData&0x03)<<3) + 4) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 5 ] = VROMPAGE( (((byData&0x03)<<3) + 5) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 6 ] = VROMPAGE( (((byData&0x03)<<3) + 6) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 7 ] = VROMPAGE( (((byData&0x03)<<3) + 7) % (NesHeader.byVRomSize << 3) ); + InfoNES_SetupChr(); + } + //Map133_Wram[ wAddr & 0x1fff ] = byData; +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_116.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_116.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_116.c (revision 0) @@ -0,0 +1,239 @@ +/*===================================================================*/ +/* */ +/* Mapper 116 : CartSaint : Yuu Yuu AV Kyoretsuden */ +/* */ +/*===================================================================*/ + +BYTE Map116_Reg[8]; +BYTE Map116_Prg0, Map116_Prg1, Map116_Prg2, Map116_Prg3; +BYTE Map116_Prg0L, Map116_Prg1L; +BYTE Map116_Chr0, Map116_Chr1, Map116_Chr2, Map116_Chr3; +BYTE Map116_Chr4, Map116_Chr5, Map116_Chr6, Map116_Chr7; + +BYTE Map116_IRQ_Enable; +BYTE Map116_IRQ_Counter; +BYTE Map116_IRQ_Latch; + +BYTE Map116_ExPrgSwitch; +BYTE Map116_ExChrSwitch; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 116 */ +/*-------------------------------------------------------------------*/ +void Map116_Init() +{ + /* Initialize Mapper */ + MapperInit = Map116_Init; + + /* Write to Mapper */ + MapperWrite = Map116_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map116_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Initialize Registers */ + for( int i = 0; i < 8; i++ ) { + Map116_Reg[i] = 0x00; + } + + Map116_Prg0 = Map116_Prg0L = 0; + Map116_Prg1 = Map116_Prg1L = 1; + Map116_Prg2 = ( NesHeader.byRomSize << 1 ) - 2; + Map116_Prg3 = ( NesHeader.byRomSize << 1 ) - 1; + + Map116_ExPrgSwitch = 0; + Map116_ExChrSwitch = 0; + + /* Set ROM Banks */ + Map116_Set_CPU_Banks(); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) { + Map116_Chr0 = 0; + Map116_Chr1 = 1; + Map116_Chr2 = 2; + Map116_Chr3 = 3; + Map116_Chr4 = 4; + Map116_Chr5 = 5; + Map116_Chr6 = 6; + Map116_Chr7 = 7; + Map116_Set_PPU_Banks(); + } else { + Map116_Chr0 = Map116_Chr2 = Map116_Chr4 = Map116_Chr5 = Map116_Chr6 = Map116_Chr7 = 0; + Map116_Chr1 = Map116_Chr3 = 1; + } + + Map116_IRQ_Enable = 0; /* Disable */ + Map116_IRQ_Counter = 0; + Map116_IRQ_Latch = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 116 Write Function */ +/*-------------------------------------------------------------------*/ +void Map116_Write( WORD wAddr, BYTE byData ) +{ + switch( wAddr & 0xE001 ) { + case 0x8000: + Map116_Reg[0] = byData; + Map116_Set_CPU_Banks(); + Map116_Set_PPU_Banks(); + break; + case 0x8001: + Map116_Reg[1] = byData; + switch( Map116_Reg[0] & 0x07 ) { + case 0x00: + Map116_Chr0 = byData & 0xFE; + Map116_Chr1 = Map116_Chr0+1; + Map116_Set_PPU_Banks(); + break; + case 0x01: + Map116_Chr2 = byData & 0xFE; + Map116_Chr3 = Map116_Chr2+1; + Map116_Set_PPU_Banks(); + break; + case 0x02: + Map116_Chr4 = byData; + Map116_Set_PPU_Banks(); + break; + case 0x03: + Map116_Chr5 = byData; + Map116_Set_PPU_Banks(); + break; + case 0x04: + Map116_Chr6 = byData; + Map116_Set_PPU_Banks(); + break; + case 0x05: + Map116_Chr7 = byData; + Map116_Set_PPU_Banks(); + break; + case 0x06: + Map116_Prg0 = byData; + Map116_Set_CPU_Banks(); + break; + case 0x07: + Map116_Prg1 = byData; + Map116_Set_CPU_Banks(); + break; + } + break; + case 0xA000: + Map116_Reg[2] = byData; + if ( !ROM_FourScr ) { + if( byData & 0x01 ) InfoNES_Mirroring( 0 ); + else InfoNES_Mirroring( 1 ); + } + break; + case 0xA001: + Map116_Reg[3] = byData; + break; + case 0xC000: + Map116_Reg[4] = byData; + Map116_IRQ_Counter = byData; + Map116_IRQ_Enable = 0xFF; + break; + case 0xC001: + Map116_Reg[5] = byData; + Map116_IRQ_Latch = byData; + break; + case 0xE000: + Map116_Reg[6] = byData; + Map116_IRQ_Enable = 0; + break; + case 0xE001: + Map116_Reg[7] = byData; + Map116_IRQ_Enable = 0xFF; + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 116 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map116_HSync() +{ + if( ( /* PPU_Scanline >= 0 && */ PPU_Scanline <= 239) ) { + if( PPU_R1 & R1_SHOW_SCR || PPU_R1 & R1_SHOW_SP ) { + if( Map116_IRQ_Enable ) { + if( !(Map116_IRQ_Counter--) ) { + Map116_IRQ_Counter = Map116_IRQ_Latch; + IRQ_REQ; + } + } + } + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 116 Set CPU Banks Function */ +/*-------------------------------------------------------------------*/ +void Map116_Set_CPU_Banks() +{ + if( Map116_Reg[0] & 0x40 ) { + ROMBANK0 = ROMPAGE( ( NesHeader.byRomSize << 1 ) - 2 ); + ROMBANK1 = ROMPAGE( Map116_Prg1 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMPAGE( Map116_Prg0 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK3 = ROMPAGE( ( NesHeader.byRomSize << 1 ) - 1 ); + } else { + ROMBANK0 = ROMPAGE( Map116_Prg0 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE( Map116_Prg1 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMPAGE( ( NesHeader.byRomSize << 1 ) - 2 ); + ROMBANK3 = ROMPAGE( ( NesHeader.byRomSize << 1 ) - 1 ); + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 116 Set PPU Banks Function */ +/*-------------------------------------------------------------------*/ +void Map116_Set_PPU_Banks() +{ + if ( NesHeader.byVRomSize > 0 ) { + if( Map116_Reg[0] & 0x80 ) { + PPUBANK[ 0 ] = VROMPAGE( ((Map116_ExChrSwitch<<8)+Map116_Chr4) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 1 ] = VROMPAGE( ((Map116_ExChrSwitch<<8)+Map116_Chr5) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 2 ] = VROMPAGE( ((Map116_ExChrSwitch<<8)+Map116_Chr6) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 3 ] = VROMPAGE( ((Map116_ExChrSwitch<<8)+Map116_Chr7) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 4 ] = VROMPAGE( ((Map116_ExChrSwitch<<8)+Map116_Chr0) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 5 ] = VROMPAGE( ((Map116_ExChrSwitch<<8)+Map116_Chr1) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 6 ] = VROMPAGE( ((Map116_ExChrSwitch<<8)+Map116_Chr2) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 7 ] = VROMPAGE( ((Map116_ExChrSwitch<<8)+Map116_Chr3) % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + } else { + PPUBANK[ 0 ] = VROMPAGE( ((Map116_ExChrSwitch<<8)+Map116_Chr0) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 1 ] = VROMPAGE( ((Map116_ExChrSwitch<<8)+Map116_Chr1) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 2 ] = VROMPAGE( ((Map116_ExChrSwitch<<8)+Map116_Chr2) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 3 ] = VROMPAGE( ((Map116_ExChrSwitch<<8)+Map116_Chr3) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 4 ] = VROMPAGE( ((Map116_ExChrSwitch<<8)+Map116_Chr4) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 5 ] = VROMPAGE( ((Map116_ExChrSwitch<<8)+Map116_Chr5) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 6 ] = VROMPAGE( ((Map116_ExChrSwitch<<8)+Map116_Chr6) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 7 ] = VROMPAGE( ((Map116_ExChrSwitch<<8)+Map116_Chr7) % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + } + } +} + Index: apps/plugins/infones/mapper/InfoNES_Mapper_090.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_090.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_090.c (revision 0) @@ -0,0 +1,414 @@ +/*===================================================================*/ +/* */ +/* Mapper 90 (PC-JY-??) */ +/* */ +/*===================================================================*/ + +BYTE Map90_Prg_Reg[ 4 ]; +BYTE Map90_Chr_Low_Reg[ 8 ]; +BYTE Map90_Chr_High_Reg[ 8 ]; +BYTE Map90_Nam_Low_Reg[ 4 ]; +BYTE Map90_Nam_High_Reg[ 4 ]; + +BYTE Map90_Prg_Bank_Size; +BYTE Map90_Prg_Bank_6000; +BYTE Map90_Prg_Bank_E000; +BYTE Map90_Chr_Bank_Size; +BYTE Map90_Mirror_Mode; +BYTE Map90_Mirror_Type; + +DWORD Map90_Value1; +DWORD Map90_Value2; + +BYTE Map90_IRQ_Enable; +BYTE Map90_IRQ_Cnt; +BYTE Map90_IRQ_Latch; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 90 */ +/*-------------------------------------------------------------------*/ +void Map90_Init() +{ + /* Initialize Mapper */ + MapperInit = Map90_Init; + + /* Write to Mapper */ + MapperWrite = Map90_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map90_Apu; + + /* Read from APU */ + MapperReadApu = Map90_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map90_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMLASTPAGE( 3 ); + ROMBANK1 = ROMLASTPAGE( 2 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Initialize IRQ Registers */ + Map90_IRQ_Cnt = 0; + Map90_IRQ_Latch = 0; + Map90_IRQ_Enable = 0; + + for ( BYTE byPage = 0; byPage < 4; byPage++ ) + { + Map90_Prg_Reg[ byPage ] = ( NesHeader.byRomSize << 1 ) - 4 + byPage; + Map90_Nam_Low_Reg[ byPage ] = 0; + Map90_Nam_High_Reg[ byPage ] = 0; + Map90_Chr_Low_Reg[ byPage ] = byPage; + Map90_Chr_High_Reg[ byPage ] = 0; + Map90_Chr_Low_Reg[ byPage + 4 ] = byPage + 4; + Map90_Chr_High_Reg[ byPage + 4 ] = 0; + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 90 Write to APU Function */ +/*-------------------------------------------------------------------*/ +void Map90_Apu( WORD wAddr, BYTE byData ) +{ + switch ( wAddr ) + { + case 0x5000: + Map90_Value1 = byData; + break; + + case 0x5001: + Map90_Value2 = byData; + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 90 Read from APU Function */ +/*-------------------------------------------------------------------*/ +BYTE Map90_ReadApu( WORD wAddr ) +{ + if ( wAddr == 0x5000 ) + { + return ( BYTE )( ( Map90_Value1 * Map90_Value2 ) & 0x00ff ); + } else { + return ( BYTE )( wAddr >> 8 ); + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 90 Write Function */ +/*-------------------------------------------------------------------*/ +void Map90_Write( WORD wAddr, BYTE byData ) +{ + switch ( wAddr ) + { + /* Set ROM Banks */ + case 0x8000: + case 0x8001: + case 0x8002: + case 0x8003: + Map90_Prg_Reg[ wAddr & 0x03 ] = byData; + Map90_Sync_Prg_Banks(); + break; + + case 0x9000: + case 0x9001: + case 0x9002: + case 0x9003: + case 0x9004: + case 0x9005: + case 0x9006: + case 0x9007: + Map90_Chr_Low_Reg[ wAddr & 0x07 ] = byData; + Map90_Sync_Chr_Banks(); + break; + + case 0xa000: + case 0xa001: + case 0xa002: + case 0xa003: + case 0xa004: + case 0xa005: + case 0xa006: + case 0xa007: + Map90_Chr_High_Reg[ wAddr & 0x07 ] = byData; + Map90_Sync_Chr_Banks(); + break; + + case 0xb000: + case 0xb001: + case 0xb002: + case 0xb003: + Map90_Nam_Low_Reg[ wAddr & 0x03 ] = byData; + Map90_Sync_Mirror(); + break; + + case 0xb004: + case 0xb005: + case 0xb006: + case 0xb007: + Map90_Nam_High_Reg[ wAddr & 0x03 ] = byData; + Map90_Sync_Mirror(); + break; + + case 0xc002: + Map90_IRQ_Enable = 0; + break; + + case 0xc003: + case 0xc004: + if ( Map90_IRQ_Enable == 0 ) + { + Map90_IRQ_Enable = 1; + Map90_IRQ_Cnt = Map90_IRQ_Latch; + } + break; + + case 0xc005: + Map90_IRQ_Cnt = byData; + Map90_IRQ_Latch = byData; + break; + + case 0xd000: + Map90_Prg_Bank_6000 = byData & 0x80; + Map90_Prg_Bank_E000 = byData & 0x04; + Map90_Prg_Bank_Size = byData & 0x03; + Map90_Chr_Bank_Size = ( byData & 0x18 ) >> 3; + Map90_Mirror_Mode = byData & 0x20; + + Map90_Sync_Prg_Banks(); + Map90_Sync_Chr_Banks(); + Map90_Sync_Mirror(); + break; + + case 0xd001: + Map90_Mirror_Type = byData & 0x03; + Map90_Sync_Mirror(); + break; + + case 0xd003: + /* Bank Page*/ + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 90 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map90_HSync() +{ +/* + * Callback at HSync + * + */ + if ( /* 0 <= PPU_Scanline && */ PPU_Scanline <= 239 ) + { + if ( PPU_R1 & R1_SHOW_SCR || PPU_R1 & R1_SHOW_SP ) + { + if ( Map90_IRQ_Cnt == 0 ) + { + if ( Map90_IRQ_Enable ) + { + IRQ_REQ; + } + Map90_IRQ_Latch = 0; + Map90_IRQ_Enable = 0; + } else { + Map90_IRQ_Cnt--; + } + } + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 90 Sync Mirror Function */ +/*-------------------------------------------------------------------*/ +void Map90_Sync_Mirror( void ) +{ + BYTE byPage; + DWORD dwNamBank[ 4 ]; + + for ( byPage = 0; byPage < 4; byPage++ ) + { + dwNamBank[ byPage ] = + ( (DWORD)Map90_Nam_High_Reg[ byPage ] << 8 ) | (DWORD)Map90_Nam_Low_Reg[ byPage ]; + } + + if ( Map90_Mirror_Mode ) + { + for ( byPage = 0; byPage < 4; byPage++ ) + { + if ( !Map90_Nam_High_Reg[ byPage ] && ( Map90_Nam_Low_Reg[ byPage ] == byPage ) ) + { + Map90_Mirror_Mode = 0; + } + } + + if ( Map90_Mirror_Mode ) + { + PPUBANK[ NAME_TABLE0 ] = VROMPAGE( dwNamBank[ 0 ] % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ NAME_TABLE1 ] = VROMPAGE( dwNamBank[ 1 ] % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ NAME_TABLE2 ] = VROMPAGE( dwNamBank[ 2 ] % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ NAME_TABLE3 ] = VROMPAGE( dwNamBank[ 3 ] % ( NesHeader.byVRomSize << 3 ) ); + } + } else { + switch ( Map90_Mirror_Type ) + { + case 0x00: + InfoNES_Mirroring( 1 ); + break; + + case 0x01: + InfoNES_Mirroring( 0 ); + break; + + default: + InfoNES_Mirroring( 3 ); + break; + } + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 90 Sync Char Banks Function */ +/*-------------------------------------------------------------------*/ +void Map90_Sync_Chr_Banks( void ) +{ + BYTE byPage; + DWORD dwChrBank[ 8 ]; + + for ( byPage = 0; byPage < 8; byPage++ ) + { + dwChrBank[ byPage ] = + ( (DWORD)Map90_Chr_High_Reg[ byPage ] << 8 ) | (DWORD)Map90_Chr_Low_Reg[ byPage ]; + } + + switch ( Map90_Chr_Bank_Size ) + { + case 0: + PPUBANK[ 0 ] = VROMPAGE( ( ( dwChrBank[ 0 ] << 3 ) + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( ( ( dwChrBank[ 0 ] << 3 ) + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( ( ( dwChrBank[ 0 ] << 3 ) + 2 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( ( ( dwChrBank[ 0 ] << 3 ) + 3 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 4 ] = VROMPAGE( ( ( dwChrBank[ 0 ] << 3 ) + 4 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( ( ( dwChrBank[ 0 ] << 3 ) + 5 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE( ( ( dwChrBank[ 0 ] << 3 ) + 6 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( ( ( dwChrBank[ 0 ] << 3 ) + 7 ) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 1: + PPUBANK[ 0 ] = VROMPAGE( ( ( dwChrBank[ 0 ] << 2 ) + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( ( ( dwChrBank[ 0 ] << 2 ) + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( ( ( dwChrBank[ 0 ] << 2 ) + 2 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( ( ( dwChrBank[ 0 ] << 2 ) + 3 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 4 ] = VROMPAGE( ( ( dwChrBank[ 4 ] << 2 ) + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( ( ( dwChrBank[ 4 ] << 2 ) + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE( ( ( dwChrBank[ 4 ] << 2 ) + 2 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( ( ( dwChrBank[ 4 ] << 2 ) + 3 ) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 2: + PPUBANK[ 0 ] = VROMPAGE( ( ( dwChrBank[ 0 ] << 1 ) + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( ( ( dwChrBank[ 0 ] << 1 ) + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( ( ( dwChrBank[ 2 ] << 1 ) + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( ( ( dwChrBank[ 2 ] << 1 ) + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 4 ] = VROMPAGE( ( ( dwChrBank[ 4 ] << 1 ) + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( ( ( dwChrBank[ 4 ] << 1 ) + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE( ( ( dwChrBank[ 6 ] << 1 ) + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( ( ( dwChrBank[ 6 ] << 1 ) + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + default: + PPUBANK[ 0 ] = VROMPAGE( dwChrBank[ 0 ] % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( dwChrBank[ 1 ] % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( dwChrBank[ 2 ] % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( dwChrBank[ 3 ] % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 4 ] = VROMPAGE( dwChrBank[ 4 ] % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( dwChrBank[ 5 ] % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE( dwChrBank[ 6 ] % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( dwChrBank[ 7 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 90 Sync Program Banks Function */ +/*-------------------------------------------------------------------*/ +void Map90_Sync_Prg_Banks( void ) +{ + switch ( Map90_Prg_Bank_Size ) + { + case 0: + ROMBANK0 = ROMLASTPAGE( 3 ); + ROMBANK1 = ROMLASTPAGE( 2 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + break; + + case 1: + ROMBANK0 = ROMPAGE( ( ( Map90_Prg_Reg[ 1 ] << 1 ) + 0 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE( ( ( Map90_Prg_Reg[ 1 ] << 1 ) + 1 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + break; + + case 2: + if ( Map90_Prg_Bank_E000 ) + { + ROMBANK0 = ROMPAGE( Map90_Prg_Reg[ 0 ] % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE( Map90_Prg_Reg[ 1 ] % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMPAGE( Map90_Prg_Reg[ 2 ] % ( NesHeader.byRomSize << 1 ) ); + ROMBANK3 = ROMPAGE( Map90_Prg_Reg[ 3 ] % ( NesHeader.byRomSize << 1 ) ); + } else { + if ( Map90_Prg_Bank_6000 ) + { + SRAMBANK = ROMPAGE( Map90_Prg_Reg[ 3 ] % ( NesHeader.byRomSize << 1 ) ); + } + ROMBANK0 = ROMPAGE( Map90_Prg_Reg[ 0 ] % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE( Map90_Prg_Reg[ 1 ] % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMPAGE( Map90_Prg_Reg[ 2 ] % ( NesHeader.byRomSize << 1 ) ); + ROMBANK3 = ROMLASTPAGE( 0 ); + } + break; + + default: + /* 8k in reverse mode? */ + ROMBANK0 = ROMPAGE( Map90_Prg_Reg[ 3 ] % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE( Map90_Prg_Reg[ 2 ] % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMPAGE( Map90_Prg_Reg[ 1 ] % ( NesHeader.byRomSize << 1 ) ); + ROMBANK3 = ROMPAGE( Map90_Prg_Reg[ 0 ] % ( NesHeader.byRomSize << 1 ) ); + break; + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_018.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_018.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_018.c (revision 0) @@ -0,0 +1,269 @@ +/*===================================================================*/ +/* */ +/* Mapper 18 (Jaleco SS8806) */ +/* */ +/*===================================================================*/ + +BYTE Map18_Regs[11]; +BYTE Map18_IRQ_Enable; +WORD Map18_IRQ_Latch; +WORD Map18_IRQ_Cnt; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 18 */ +/*-------------------------------------------------------------------*/ +void Map18_Init() +{ + int i; + /* Initialize Mapper */ + MapperInit = Map18_Init; + + /* Write to Mapper */ + MapperWrite = Map18_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map18_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Initialize Regs */ + for ( i = 0; i < sizeof( Map18_Regs ); i++ ) + { + Map18_Regs[ i ] = 0; + } + Map18_IRQ_Enable = 0; + Map18_IRQ_Latch = 0; + Map18_IRQ_Cnt = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 18 Write Function */ +/*-------------------------------------------------------------------*/ +void Map18_Write( WORD wAddr, BYTE byData ) +{ + switch( wAddr ) + { + /* Set ROM Banks */ + case 0x8000: + Map18_Regs[ 0 ] = ( Map18_Regs[ 0 ] & 0xf0 ) | ( byData & 0x0f ); + ROMBANK0 = ROMPAGE( Map18_Regs[ 0 ] % ( NesHeader.byRomSize << 1 ) ); + break; + + case 0x8001: + Map18_Regs[ 0 ] = ( Map18_Regs[ 0 ] & 0x0f ) | ( ( byData & 0x0f ) << 4 ); + ROMBANK0 = ROMPAGE( Map18_Regs[ 0 ] % ( NesHeader.byRomSize << 1 ) ); + break; + + case 0x8002: + Map18_Regs[ 1 ] = ( Map18_Regs[ 1 ] & 0xf0 ) | ( byData & 0x0f ); + ROMBANK1 = ROMPAGE( Map18_Regs[ 1 ] % ( NesHeader.byRomSize << 1 ) ); + break; + + case 0x8003: + Map18_Regs[ 1 ] = ( Map18_Regs[ 1 ] & 0x0f ) | ( ( byData & 0x0f ) << 4 ); + ROMBANK1 = ROMPAGE( Map18_Regs[ 1 ] % ( NesHeader.byRomSize << 1 ) ); + break; + + case 0x9000: + Map18_Regs[ 2 ] = ( Map18_Regs[ 2 ] & 0xf0 ) | ( byData & 0x0f ); + ROMBANK2 = ROMPAGE( Map18_Regs[ 2 ] % ( NesHeader.byRomSize << 1 ) ); + break; + + case 0x9001: + Map18_Regs[ 2 ] = ( Map18_Regs[ 2 ] & 0x0f ) | ( ( byData & 0x0f ) << 4 ); + ROMBANK2 = ROMPAGE( Map18_Regs[ 2 ] % ( NesHeader.byRomSize << 1 ) ); + break; + + /* Set PPU Banks */ + case 0xA000: + Map18_Regs[ 3 ] = ( Map18_Regs[ 3 ] & 0xf0 ) | ( byData & 0x0f ); + PPUBANK[ 0 ] = VROMPAGE( Map18_Regs[ 3 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xA001: + Map18_Regs[ 3 ] = ( Map18_Regs[ 3 ] & 0x0f ) | ( ( byData & 0x0f ) << 4 ); + PPUBANK[ 0 ] = VROMPAGE( Map18_Regs[ 3 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xA002: + Map18_Regs[ 4 ] = ( Map18_Regs[ 4 ] & 0xf0 ) | ( byData & 0x0f ); + PPUBANK[ 1 ] = VROMPAGE( Map18_Regs[ 4 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xA003: + Map18_Regs[ 4 ] = ( Map18_Regs[ 4 ] & 0x0f ) | ( ( byData & 0x0f ) << 4 ); + PPUBANK[ 1 ] = VROMPAGE( Map18_Regs[ 4 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xB000: + Map18_Regs[ 5 ] = ( Map18_Regs[ 5 ] & 0xf0 ) | ( byData & 0x0f ); + PPUBANK[ 2 ] = VROMPAGE( Map18_Regs[ 5 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xB001: + Map18_Regs[ 5 ] = ( Map18_Regs[ 5 ] &0x0f ) | ( ( byData & 0x0f ) << 4 ); + PPUBANK[ 2 ] = VROMPAGE( Map18_Regs[ 5 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xB002: + Map18_Regs[ 6 ] = ( Map18_Regs[ 6 ] & 0xf0 ) | ( byData & 0x0f ); + PPUBANK[ 3 ] = VROMPAGE( Map18_Regs[ 6 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xB003: + Map18_Regs[ 6 ] = ( Map18_Regs[ 6 ] & 0x0f ) | ( ( byData & 0x0f ) << 4 ); + PPUBANK[ 3 ] = VROMPAGE( Map18_Regs[ 6 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xC000: + Map18_Regs[ 7 ] = ( Map18_Regs[ 7 ] & 0xf0 ) | ( byData & 0x0f ); + PPUBANK[ 4 ] = VROMPAGE( Map18_Regs[ 7 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xC001: + Map18_Regs[ 7 ] = ( Map18_Regs[ 7 ] & 0x0f ) | ( ( byData & 0x0f ) << 4 ); + PPUBANK[ 4 ] = VROMPAGE( Map18_Regs[ 7 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xC002: + Map18_Regs[ 8 ] = ( Map18_Regs[ 8 ] & 0xf0 ) | ( byData & 0x0f ); + PPUBANK[ 5 ] = VROMPAGE( Map18_Regs[ 8 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xC003: + Map18_Regs[ 8 ] = ( Map18_Regs[ 8 ] & 0x0f ) | ( ( byData & 0x0f ) << 4 ); + PPUBANK[ 5 ] = VROMPAGE( Map18_Regs[ 8 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xD000: + Map18_Regs[ 9 ] = ( Map18_Regs[ 9 ] & 0xf0 ) | ( byData & 0x0f ); + PPUBANK[ 6 ] = VROMPAGE( Map18_Regs[ 9 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xD001: + Map18_Regs[ 9 ] = ( Map18_Regs[ 9 ] & 0x0f ) | ( ( byData & 0x0f ) << 4 ); + PPUBANK[ 6 ] = VROMPAGE( Map18_Regs[ 9 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xD002: + Map18_Regs[ 10 ] = ( Map18_Regs[ 10 ] & 0xf0 ) | ( byData & 0x0f ); + PPUBANK[ 7 ] = VROMPAGE( Map18_Regs[ 10 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xD003: + Map18_Regs[ 10 ] = ( Map18_Regs[ 10 ] & 0x0f ) | ( ( byData & 0x0f ) << 4 ); + PPUBANK[ 7 ] = VROMPAGE( Map18_Regs[ 10 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xE000: + Map18_IRQ_Latch = ( Map18_IRQ_Latch & 0xfff0 ) | ( byData & 0x0f ); + break; + + case 0xE001: + Map18_IRQ_Latch = ( Map18_IRQ_Latch & 0xff0f ) | ( ( byData & 0x0f ) << 4 ); + break; + + case 0xE002: + Map18_IRQ_Latch = ( Map18_IRQ_Latch & 0xf0ff ) | ( ( byData & 0x0f ) << 8 ); + break; + + case 0xE003: + Map18_IRQ_Latch = ( Map18_IRQ_Latch & 0x0fff ) | ( ( byData & 0x0f ) << 12 ); + break; + + case 0xF000: + if ( ( byData & 0x01 ) == 0 ) + { + Map18_IRQ_Cnt = 0; + } else { + Map18_IRQ_Cnt = Map18_IRQ_Latch; + } + break; + + case 0xF001: + Map18_IRQ_Enable = byData & 0x01; + break; + + /* Name Table Mirroring */ + case 0xF002: + switch ( byData & 0x03 ) + { + case 0: + InfoNES_Mirroring( 0 ); /* Horizontal */ + break; + case 1: + InfoNES_Mirroring( 1 ); /* Vertical */ + break; + case 2: + InfoNES_Mirroring( 3 ); /* One Screen 0x2000 */ + break; + } + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 18 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map18_HSync() +{ +/* + * Callback at HSync + * + */ + if ( Map18_IRQ_Enable ) + { + if ( Map18_IRQ_Cnt <= 113 ) + { + IRQ_REQ; + Map18_IRQ_Cnt = 0; + Map18_IRQ_Enable = 0; + } else { + Map18_IRQ_Cnt -= 113; + } + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_252.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_252.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_252.c (revision 0) @@ -0,0 +1,218 @@ +/*===================================================================*/ +/* */ +/* Mapper 252 : Sangokushi - Chuugen no hasha */ +/* */ +/*===================================================================*/ + +BYTE Map252_Reg[9]; +BYTE Map252_IRQ_Enable; +BYTE Map252_IRQ_Counter; +BYTE Map252_IRQ_Latch; +BYTE Map252_IRQ_Occur; +int Map252_IRQ_Clock; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 252 */ +/*-------------------------------------------------------------------*/ +void Map252_Init() +{ + /* Initialize Mapper */ + MapperInit = Map252_Init; + + /* Write to Mapper */ + MapperWrite = Map252_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map252_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set Registers */ + for( int i = 0; i < 9; i++ ) { + Map252_Reg[i] = i; + } + + Map252_IRQ_Enable = 0; + Map252_IRQ_Counter = 0; + Map252_IRQ_Latch = 0; + Map252_IRQ_Clock = 0; + Map252_IRQ_Occur = 0; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 252 Write Function */ +/*-------------------------------------------------------------------*/ +void Map252_Write( WORD wAddr, BYTE byData ) +{ + if( (wAddr & 0xF000) == 0x8000 ) { + ROMBANK0 = ROMPAGE( byData % (NesHeader.byRomSize<<1)); + return; + } + if( (wAddr & 0xF000) == 0xA000 ) { + ROMBANK1 = ROMPAGE( byData % (NesHeader.byRomSize<<1)); + return; + } + switch( wAddr & 0xF00C ) { + case 0xB000: + Map252_Reg[0] = (Map252_Reg[0] & 0xF0) | (byData & 0x0F); + PPUBANK[ 0 ] = VROMPAGE(Map252_Reg[0] % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + break; + case 0xB004: + Map252_Reg[0] = (Map252_Reg[0] & 0x0F) | ((byData & 0x0F) << 4); + PPUBANK[ 0 ] = VROMPAGE(Map252_Reg[0] % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + break; + case 0xB008: + Map252_Reg[1] = (Map252_Reg[1] & 0xF0) | (byData & 0x0F); + PPUBANK[ 1 ] = VROMPAGE(Map252_Reg[1] % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + break; + case 0xB00C: + Map252_Reg[1] = (Map252_Reg[1] & 0x0F) | ((byData & 0x0F) << 4); + PPUBANK[ 1 ] = VROMPAGE(Map252_Reg[1] % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + break; + + case 0xC000: + Map252_Reg[2] = (Map252_Reg[2] & 0xF0) | (byData & 0x0F); + PPUBANK[ 2 ] = VROMPAGE(Map252_Reg[2] % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + break; + case 0xC004: + Map252_Reg[2] = (Map252_Reg[2] & 0x0F) | ((byData & 0x0F) << 4); + PPUBANK[ 2 ] = VROMPAGE(Map252_Reg[2] % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + break; + case 0xC008: + Map252_Reg[3] = (Map252_Reg[3] & 0xF0) | (byData & 0x0F); + PPUBANK[ 3 ] = VROMPAGE(Map252_Reg[3] % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + break; + case 0xC00C: + Map252_Reg[3] = (Map252_Reg[3] & 0x0F) | ((byData & 0x0F) << 4); + PPUBANK[ 3 ] = VROMPAGE(Map252_Reg[3] % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + break; + + case 0xD000: + Map252_Reg[4] = (Map252_Reg[4] & 0xF0) | (byData & 0x0F); + PPUBANK[ 4 ] = VROMPAGE(Map252_Reg[4] % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + break; + case 0xD004: + Map252_Reg[4] = (Map252_Reg[4] & 0x0F) | ((byData & 0x0F) << 4); + PPUBANK[ 4 ] = VROMPAGE(Map252_Reg[4] % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + break; + case 0xD008: + Map252_Reg[5] = (Map252_Reg[5] & 0xF0) | (byData & 0x0F); + PPUBANK[ 5 ] = VROMPAGE(Map252_Reg[5] % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + break; + case 0xD00C: + Map252_Reg[5] = (Map252_Reg[5] & 0x0F) | ((byData & 0x0F) << 4); + PPUBANK[ 5 ] = VROMPAGE(Map252_Reg[5] % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + break; + + case 0xE000: + Map252_Reg[6] = (Map252_Reg[6] & 0xF0) | (byData & 0x0F); + PPUBANK[ 6 ] = VROMPAGE(Map252_Reg[6] % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + break; + case 0xE004: + Map252_Reg[6] = (Map252_Reg[6] & 0x0F) | ((byData & 0x0F) << 4); + PPUBANK[ 6 ] = VROMPAGE(Map252_Reg[6] % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + break; + case 0xE008: + Map252_Reg[7] = (Map252_Reg[7] & 0xF0) | (byData & 0x0F); + PPUBANK[ 7 ] = VROMPAGE(Map252_Reg[7] % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + break; + case 0xE00C: + Map252_Reg[7] = (Map252_Reg[7] & 0x0F) | ((byData & 0x0F) << 4); + PPUBANK[ 7 ] = VROMPAGE(Map252_Reg[7] % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + break; + + case 0xF000: + Map252_IRQ_Latch = (Map252_IRQ_Latch & 0xF0) | (byData & 0x0F); + Map252_IRQ_Occur = 0; + break; + case 0xF004: + Map252_IRQ_Latch = (Map252_IRQ_Latch & 0x0F) | ((byData & 0x0F) << 4); + Map252_IRQ_Occur = 0; + break; + + case 0xF008: + Map252_IRQ_Enable = byData & 0x03; + if( Map252_IRQ_Enable & 0x02 ) { + Map252_IRQ_Counter = Map252_IRQ_Latch; + Map252_IRQ_Clock = 0; + } + Map252_IRQ_Occur = 0; + break; + + case 0xF00C: + Map252_IRQ_Enable = (Map252_IRQ_Enable & 0x01) * 3; + Map252_IRQ_Occur = 0; + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 252 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map252_HSync() +{ + if( Map252_IRQ_Enable & 0x02 ) { + if( Map252_IRQ_Counter == 0xFF ) { + Map252_IRQ_Occur = 0xFF; + Map252_IRQ_Counter = Map252_IRQ_Latch; + Map252_IRQ_Enable = (Map252_IRQ_Enable & 0x01) * 3; + } else { + Map252_IRQ_Counter++; + } + } + if( Map252_IRQ_Occur ) { + IRQ_REQ; + } +} + Index: apps/plugins/infones/mapper/InfoNES_Mapper_235.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_235.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_235.c (revision 0) @@ -0,0 +1,126 @@ +/*===================================================================*/ +/* */ +/* Mapper 235 : 150-in-1 */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 235 */ +/*-------------------------------------------------------------------*/ +void Map235_Init() +{ + /* Initialize Mapper */ + MapperInit = Map235_Init; + + /* Write to Mapper */ + MapperWrite = Map235_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set Registers */ + for( int i = 0; i < 0x2000; i++ ) { + DRAM[i] = 0xFF; + } + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 235 Write Function */ +/*-------------------------------------------------------------------*/ +void Map235_Write( WORD wAddr, BYTE byData ) +{ + BYTE byPrg = ((wAddr&0x0300)>>3)|(wAddr&0x001F); + BYTE byBus = 0; + + if( (NesHeader.byRomSize<<1) == 64*2 ) { + // 100-in-1 + switch( wAddr & 0x0300 ) { + case 0x0000: break; + case 0x0100: byBus = 1; break; + case 0x0200: byBus = 1; break; + case 0x0300: byBus = 1; break; + } + } else if( (NesHeader.byRomSize<<1) == 128*2 ) { + // 150-in-1 + switch( wAddr & 0x0300 ) { + case 0x0000: break; + case 0x0100: byBus = 1; break; + case 0x0200: byPrg = (byPrg&0x1F)|0x20; break; + case 0x0300: byBus = 1; break; + } + } else if( (NesHeader.byRomSize<<1) == 192*2 ) { + // 150-in-1 + switch( wAddr & 0x0300 ) { + case 0x0000: break; + case 0x0100: byBus = 1; break; + case 0x0200: byPrg = (byPrg&0x1F)|0x20; break; + case 0x0300: byPrg = (byPrg&0x1F)|0x40; break; + } + } else if( (NesHeader.byRomSize<<1) == 256*2 ) { + } + + if( wAddr & 0x0800 ) { + if( wAddr & 0x1000 ) { + ROMBANK0 = ROMPAGE(((byPrg<<2)+2) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE(((byPrg<<2)+3) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE(((byPrg<<2)+2) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE(((byPrg<<2)+3) % (NesHeader.byRomSize<<1)); + } else { + ROMBANK0 = ROMPAGE(((byPrg<<2)+0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE(((byPrg<<2)+1) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE(((byPrg<<2)+0) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE(((byPrg<<2)+1) % (NesHeader.byRomSize<<1)); + } + } else { + ROMBANK0 = ROMPAGE(((byPrg<<2)+0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE(((byPrg<<2)+1) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE(((byPrg<<2)+2) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE(((byPrg<<2)+3) % (NesHeader.byRomSize<<1)); + } + + if( byBus ) { + ROMBANK0 = DRAM; + ROMBANK1 = DRAM; + ROMBANK2 = DRAM; + ROMBANK3 = DRAM; + } + + if( wAddr & 0x0400 ) { + InfoNES_Mirroring( 3 ); + } else if( wAddr & 0x2000 ) { + InfoNES_Mirroring( 0 ); + } else { + InfoNES_Mirroring( 1 ); + } +} + Index: apps/plugins/infones/mapper/InfoNES_Mapper_073.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_073.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_073.c (revision 0) @@ -0,0 +1,127 @@ +/*===================================================================*/ +/* */ +/* Mapper 73 (Konami VRC 3) */ +/* */ +/*===================================================================*/ + +BYTE Map73_IRQ_Enable; +DWORD Map73_IRQ_Cnt; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 73 */ +/*-------------------------------------------------------------------*/ +void Map73_Init() +{ + /* Initialize Mapper */ + MapperInit = Map73_Init; + + /* Write to Mapper */ + MapperWrite = Map73_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map73_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Initialize IRQ Registers */ + Map73_IRQ_Enable = 0; + Map73_IRQ_Cnt = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 73 Write Function */ +/*-------------------------------------------------------------------*/ +void Map73_Write( WORD wAddr, BYTE byData ) +{ + switch ( wAddr ) + { + case 0x8000: + Map73_IRQ_Cnt = ( Map73_IRQ_Cnt & 0xfff0 ) | ( byData & 0x0f ); + break; + + case 0x9000: + Map73_IRQ_Cnt = ( Map73_IRQ_Cnt & 0xff0f ) | ( ( byData & 0x0f ) << 4 ); + break; + + case 0xa000: + Map73_IRQ_Cnt = ( Map73_IRQ_Cnt & 0xf0ff ) | ( ( byData & 0x0f ) << 8 ); + break; + + case 0xb000: + Map73_IRQ_Cnt = ( Map73_IRQ_Cnt & 0x0fff ) | ( ( byData & 0x0f ) << 12 ); + break; + + case 0xc000: + Map73_IRQ_Enable = byData; + break; + + /* Set ROM Banks */ + case 0xf000: + byData <<= 1; + byData %= ( NesHeader.byRomSize << 1 ); + ROMBANK0 = ROMPAGE( byData ); + ROMBANK1 = ROMPAGE( byData + 1 ); + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 73 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map73_HSync() +{ +/* + * Callback at HSync + * + */ +#if 1 + if ( Map73_IRQ_Enable & 0x02 ) + { + if ( ( Map73_IRQ_Cnt += STEP_PER_SCANLINE ) > 0xffff ) + { + Map73_IRQ_Cnt &= 0xffff; + IRQ_REQ; + Map73_IRQ_Enable = 0; + } + } +#else + if ( Map73_IRQ_Enable ) + { + if ( Map73_IRQ_Cnt > 0xffff - 114 ) + { + IRQ_REQ; + Map73_IRQ_Enable = 0; + } else { + Map73_IRQ_Cnt += 114; + } + } +#endif +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_094.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_094.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_094.c (revision 0) @@ -0,0 +1,68 @@ +/*===================================================================*/ +/* */ +/* Mapper 94 (74161/32 Capcom) */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 94 */ +/*-------------------------------------------------------------------*/ +void Map94_Init() +{ + /* Initialize Mapper */ + MapperInit = Map94_Init; + + /* Write to Mapper */ + MapperWrite = Map94_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 94 Write Function */ +/*-------------------------------------------------------------------*/ +void Map94_Write( WORD wAddr, BYTE byData ) +{ + switch ( wAddr & 0xfff0 ) + { + /* Set ROM Banks */ + case 0xff00: + byData = ( byData & 0x1c ) >> 2; + byData <<= 1; + byData %= ( NesHeader.byRomSize << 1 ); + ROMBANK0 = ROMPAGE( byData ); + ROMBANK1 = ROMPAGE( byData + 1 ); + break; + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_077.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_077.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_077.c (revision 0) @@ -0,0 +1,79 @@ +/*===================================================================*/ +/* */ +/* Mapper 77 (Irem Early Mapper #0) */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 77 */ +/*-------------------------------------------------------------------*/ +void Map77_Init() +{ + /* Initialize Mapper */ + MapperInit = Map77_Init; + + /* Write to Mapper */ + MapperWrite = Map77_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + + /* VRAM Write Enabled */ + byVramWriteEnable = 1; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 77 Write Function */ +/*-------------------------------------------------------------------*/ +void Map77_Write( WORD wAddr, BYTE byData ) +{ + BYTE byRomBank = byData & 0x07; + BYTE byChrBank = ( byData & 0xf0 ) >> 4; + + /* Set ROM Banks */ + byRomBank <<= 2; + byRomBank %= ( NesHeader.byRomSize << 1 ); + + ROMBANK0 = ROMPAGE( byRomBank ); + ROMBANK1 = ROMPAGE( byRomBank + 1 ); + ROMBANK2 = ROMPAGE( byRomBank + 2 ); + ROMBANK3 = ROMPAGE( byRomBank + 3 ); + + /* Set PPU Banks */ + byChrBank <<= 1; + byChrBank %= ( NesHeader.byVRomSize << 3 ); + + PPUBANK[ 0 ] = VROMPAGE( byChrBank ); + PPUBANK[ 1 ] = VROMPAGE( byChrBank + 1 ); + InfoNES_SetupChr(); +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_100.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_100.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_100.c (revision 0) @@ -0,0 +1,291 @@ +/*===================================================================*/ +/* */ +/* Mapper 100 : Nestile MMC 3 */ +/* */ +/*===================================================================*/ + +BYTE Map100_Reg[8]; +BYTE Map100_Prg0, Map100_Prg1, Map100_Prg2, Map100_Prg3; +BYTE Map100_Chr0, Map100_Chr1, Map100_Chr2, Map100_Chr3; +BYTE Map100_Chr4, Map100_Chr5, Map100_Chr6, Map100_Chr7; + +BYTE Map100_IRQ_Enable; +BYTE Map100_IRQ_Cnt; +BYTE Map100_IRQ_Latch; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 100 */ +/*-------------------------------------------------------------------*/ +void Map100_Init() +{ + /* Initialize Mapper */ + MapperInit = Map100_Init; + + /* Write to Mapper */ + MapperWrite = Map100_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map100_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + Map100_Chr0 = 0; + Map100_Chr1 = 1; + Map100_Chr2 = 2; + Map100_Chr3 = 3; + Map100_Chr4 = 4; + Map100_Chr5 = 5; + Map100_Chr6 = 6; + Map100_Chr7 = 7; + Map100_Set_PPU_Banks(); + } else { + Map100_Chr0 = Map100_Chr2 = Map100_Chr4 = Map100_Chr5 = Map100_Chr6 = Map100_Chr7 = 0; + Map100_Chr1 = Map100_Chr3 = 1; + } + + /* Set IRQ Registers */ + Map100_IRQ_Enable = 0; + Map100_IRQ_Cnt = 0; + Map100_IRQ_Latch = 0; + for( int i = 0; i < 8; i++ ) { Map100_Reg[ i ] = 0x00; } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 100 Write Function */ +/*-------------------------------------------------------------------*/ +void Map100_Write( WORD wAddr, BYTE byData ) +{ + switch ( wAddr & 0xE001 ) + { + case 0x8000: + Map100_Reg[0] = byData; + break; + + case 0x8001: + Map100_Reg[1] = byData; + + switch ( Map100_Reg[0] & 0xC7 ) { + case 0x00: + if ( NesHeader.byVRomSize > 0 ) { + Map100_Chr0 = byData&0xFE; + Map100_Chr1 = Map100_Chr0+1; + Map100_Set_PPU_Banks(); + } + break; + + case 0x01: + if ( NesHeader.byVRomSize > 0 ) { + Map100_Chr2 = byData&0xFE; + Map100_Chr3 = Map100_Chr2+1; + Map100_Set_PPU_Banks(); + } + break; + + case 0x02: + if ( NesHeader.byVRomSize > 0 ) { + Map100_Chr4 = byData; + Map100_Set_PPU_Banks(); + } + break; + + case 0x03: + if ( NesHeader.byVRomSize > 0 ) { + Map100_Chr5 = byData; + Map100_Set_PPU_Banks(); + } + break; + + case 0x04: + if ( NesHeader.byVRomSize > 0 ) { + Map100_Chr6 = byData; + Map100_Set_PPU_Banks(); + } + break; + + case 0x05: + if ( NesHeader.byVRomSize > 0 ) { + Map100_Chr7 = byData; + Map100_Set_PPU_Banks(); + } + break; + + case 0x06: + Map100_Prg0 = byData; + Map100_Set_CPU_Banks(); + break; + + case 0x07: + Map100_Prg1 = byData; + Map100_Set_CPU_Banks(); + break; + + case 0x46: + Map100_Prg2 = byData; + Map100_Set_CPU_Banks(); + break; + + case 0x47: + Map100_Prg3 = byData; + Map100_Set_CPU_Banks(); + break; + + case 0x80: + if ( NesHeader.byVRomSize > 0 ) { + Map100_Chr4 = byData&0xFE; + Map100_Chr5 = Map100_Chr4+1; + Map100_Set_PPU_Banks(); + } + break; + + case 0x81: + if ( NesHeader.byVRomSize > 0 ) { + Map100_Chr6 = byData&0xFE; + Map100_Chr7 = Map100_Chr6+1; + Map100_Set_PPU_Banks(); + } + break; + + case 0x82: + if ( NesHeader.byVRomSize > 0 ) { + Map100_Chr0 = byData; + Map100_Set_PPU_Banks(); + } + break; + + case 0x83: + if ( NesHeader.byVRomSize > 0 ) { + Map100_Chr1 = byData; + Map100_Set_PPU_Banks(); + } + break; + + case 0x84: + if ( NesHeader.byVRomSize > 0 ) { + Map100_Chr2 = byData; + Map100_Set_PPU_Banks(); + } + break; + + case 0x85: + if( NesHeader.byVRomSize > 0 ) { + Map100_Chr3 = byData; + Map100_Set_PPU_Banks(); + } + break; + + } + break; + + case 0xA000: + Map100_Reg[2] = byData; + if ( !ROM_FourScr ) + { + if( byData & 0x01 ) InfoNES_Mirroring( 0 ); + else InfoNES_Mirroring( 1 ); + } + break; + + case 0xA001: + Map100_Reg[3] = byData; + break; + + case 0xC000: + Map100_Reg[4] = byData; + Map100_IRQ_Cnt = byData; + break; + + case 0xC001: + Map100_Reg[5] = byData; + Map100_IRQ_Latch = byData; + break; + + case 0xE000: + Map100_Reg[6] = byData; + Map100_IRQ_Enable = 0; + break; + + case 0xE001: + Map100_Reg[7] = byData; + Map100_IRQ_Enable = 0xFF; + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 100 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map100_HSync() +{ + if( ( /* PPU_Scanline >= 0 && */ PPU_Scanline <= 239) ) { + if ( PPU_R1 & R1_SHOW_SCR || PPU_R1 & R1_SHOW_SP ) { + if( Map100_IRQ_Enable ) { + if( !(Map100_IRQ_Cnt--) ) { + Map100_IRQ_Cnt = Map100_IRQ_Latch; + IRQ_REQ; + } + } + } + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 100 Set CPU Banks Function */ +/*-------------------------------------------------------------------*/ +void Map100_Set_CPU_Banks() +{ + ROMBANK0 = ROMPAGE( Map100_Prg0 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE( Map100_Prg1 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMPAGE( Map100_Prg2 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK3 = ROMPAGE( Map100_Prg3 % ( NesHeader.byRomSize << 1 ) ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 100 Set PPU Banks Function */ +/*-------------------------------------------------------------------*/ +void Map100_Set_PPU_Banks() +{ + if ( NesHeader.byVRomSize > 0 ) + { + PPUBANK[ 0 ] = VROMPAGE( Map100_Chr0 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( Map100_Chr1 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( Map100_Chr2 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( Map100_Chr3 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 4 ] = VROMPAGE( Map100_Chr4 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( Map100_Chr5 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE( Map100_Chr6 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( Map100_Chr7 % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + } +} + Index: apps/plugins/infones/mapper/InfoNES_Mapper_002.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_002.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_002.c (revision 0) @@ -0,0 +1,63 @@ +/*===================================================================*/ +/* */ +/* Mapper 2 (UNROM) */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 2 */ +/*-------------------------------------------------------------------*/ +void Map2_Init() +{ + /* Initialize Mapper */ + MapperInit = Map2_Init; + + /* Write to Mapper */ + MapperWrite = Map2_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 2 Write Function */ +/*-------------------------------------------------------------------*/ +void Map2_Write( WORD wAddr, BYTE byData ) +{ + /* Set ROM Banks */ + byData %= NesHeader.byRomSize; + byData <<= 1; + + ROMBANK0 = ROMPAGE( byData ); + ROMBANK1 = ROMPAGE( byData + 1 ); +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_202.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_202.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_202.c (revision 0) @@ -0,0 +1,111 @@ +/*===================================================================*/ +/* */ +/* Mapper 202 (150-in-1) */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 202 */ +/*-------------------------------------------------------------------*/ +void Map202_Init() +{ + /* Initialize Mapper */ + MapperInit = Map202_Init; + + /* Write to Mapper */ + MapperWrite = Map202_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map202_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 12 ); + ROMBANK1 = ROMPAGE( 13 ); + ROMBANK2 = ROMPAGE( 14 ); + ROMBANK3 = ROMPAGE( 15 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 202 Write to APU Function */ +/*-------------------------------------------------------------------*/ +void Map202_Apu( WORD wAddr, BYTE byData ) +{ + Map202_WriteSub( wAddr, byData ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 202 Write Function */ +/*-------------------------------------------------------------------*/ +void Map202_Write( WORD wAddr, BYTE byData ) +{ + Map202_WriteSub( wAddr, byData ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 202 Write Sub Function */ +/*-------------------------------------------------------------------*/ +void Map202_WriteSub( WORD wAddr, BYTE byData ) +{ + int bank = (wAddr>>1) & 0x07; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE(((bank<<1)+0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE(((bank<<1)+1) % (NesHeader.byRomSize<<1)); + + if ((wAddr&0x0c) == 0x0c) { + ROMBANK2 = ROMPAGE((((bank+1)<<1)+0) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE((((bank+1)<<1)+1) % (NesHeader.byRomSize<<1)); + } else { + ROMBANK2 = ROMPAGE((((bank+0)<<1)+0) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE((((bank+0)<<1)+1) % (NesHeader.byRomSize<<1)); + } + + /* Set PPU Banks */ + PPUBANK[0] = VROMPAGE(((bank<<3)+0) % (NesHeader.byVRomSize<<3)); + PPUBANK[1] = VROMPAGE(((bank<<3)+1) % (NesHeader.byVRomSize<<3)); + PPUBANK[2] = VROMPAGE(((bank<<3)+2) % (NesHeader.byVRomSize<<3)); + PPUBANK[3] = VROMPAGE(((bank<<3)+3) % (NesHeader.byVRomSize<<3)); + PPUBANK[4] = VROMPAGE(((bank<<3)+4) % (NesHeader.byVRomSize<<3)); + PPUBANK[5] = VROMPAGE(((bank<<3)+5) % (NesHeader.byVRomSize<<3)); + PPUBANK[6] = VROMPAGE(((bank<<3)+6) % (NesHeader.byVRomSize<<3)); + PPUBANK[7] = VROMPAGE(((bank<<3)+7) % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + + if ( wAddr & 0x01 ) { + InfoNES_Mirroring( 0 ); + } else { + InfoNES_Mirroring( 1 ); + } +} + Index: apps/plugins/infones/mapper/InfoNES_Mapper_040.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_040.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_040.c (revision 0) @@ -0,0 +1,112 @@ +/*===================================================================*/ +/* */ +/* Mapper 40 (SMB2J) */ +/* */ +/*===================================================================*/ + +BYTE Map40_IRQ_Enable; +DWORD Map40_Line_To_IRQ; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 40 */ +/*-------------------------------------------------------------------*/ +void Map40_Init() +{ + int nPage; + /* Initialize Mapper */ + MapperInit = Map40_Init; + + /* Write to Mapper */ + MapperWrite = Map40_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map40_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = ROMPAGE( 6 ); + + /* Initialize IRQ Registers */ + Map40_IRQ_Enable = 0; + Map40_Line_To_IRQ = 0; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 4 ); + ROMBANK1 = ROMPAGE( 5 ); + ROMBANK2 = ROMPAGE( 0 ); + ROMBANK3 = ROMPAGE( 7 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 40 Write Function */ +/*-------------------------------------------------------------------*/ +void Map40_Write( WORD wAddr, BYTE byData ) +{ + switch ( wAddr & 0xe000 ) + { + case 0x8000: + Map40_IRQ_Enable = 0; + break; + + case 0xa000: + Map40_IRQ_Enable = 1; + Map40_Line_To_IRQ = 37; + break; + + case 0xc000: + break; + + case 0xe000: + /* Set ROM Banks */ + ROMBANK2 = ROMPAGE ( ( byData & 0x07 ) % ( NesHeader.byRomSize << 1 ) ); + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 40 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map40_HSync() +{ +/* + * Callback at HSync + * + */ + if ( Map40_IRQ_Enable ) + { + if ( ( --Map40_Line_To_IRQ ) <= 0 ) + { + IRQ_REQ; + } + } +} + +/* End of InfoNES_Mapper_40.cpp */ Index: apps/plugins/infones/mapper/InfoNES_Mapper_023.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_023.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_023.c (revision 0) @@ -0,0 +1,294 @@ +/*===================================================================*/ +/* */ +/* Mapper 23 (Konami VRC2 type B) */ +/* */ +/*===================================================================*/ + +BYTE Map23_Regs[ 9 ]; + +BYTE Map23_IRQ_Enable; +BYTE Map23_IRQ_Cnt; +BYTE Map23_IRQ_Latch; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 23 */ +/*-------------------------------------------------------------------*/ +void Map23_Init() +{ + int nPage; + /* Initialize Mapper */ + MapperInit = Map23_Init; + + /* Write to Mapper */ + MapperWrite = Map23_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Initialize State Flag */ + Map23_Regs[ 0 ] = 0; + Map23_Regs[ 1 ] = 1; + Map23_Regs[ 2 ] = 2; + Map23_Regs[ 3 ] = 3; + Map23_Regs[ 4 ] = 4; + Map23_Regs[ 5 ] = 5; + Map23_Regs[ 6 ] = 6; + Map23_Regs[ 7 ] = 7; + Map23_Regs[ 8 ] = 0; + + Map23_IRQ_Enable = 0; + Map23_IRQ_Cnt = 0; + Map23_IRQ_Latch = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 23 Write Function */ +/*-------------------------------------------------------------------*/ +void Map23_Write( WORD wAddr, BYTE byData ) +{ + switch ( wAddr ) + { + case 0x8000: + case 0x8004: + case 0x8008: + case 0x800c: + byData %= ( NesHeader.byRomSize << 1 ); + + if ( Map23_Regs[ 8 ] ) + { + ROMBANK2 = ROMPAGE( byData ); + } else { + ROMBANK0 = ROMPAGE( byData ); + } + break; + + case 0x9000: + switch ( byData & 0x03 ) + { + case 0x00: + InfoNES_Mirroring( 1 ); + break; + case 0x01: + InfoNES_Mirroring( 0 ); + break; + case 0x02: + InfoNES_Mirroring( 3 ); + break; + case 0x03: + InfoNES_Mirroring( 2 ); + break; + } + break; + + case 0x9008: + Map23_Regs[ 8 ] = byData & 0x02; + break; + + case 0xa000: + case 0xa004: + case 0xa008: + case 0xa00c: + byData %= ( NesHeader.byRomSize << 1 ); + ROMBANK1 = ROMPAGE( byData ); + break; + + case 0xb000: + Map23_Regs[ 0 ] = ( Map23_Regs[ 0 ] & 0xf0 ) | ( byData & 0x0f ); + PPUBANK[ 0 ] = VROMPAGE( Map23_Regs[ 0 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xb001: + case 0xb004: + Map23_Regs[ 0 ] = ( Map23_Regs[ 0 ] & 0x0f ) | ( ( byData & 0x0f ) << 4 ); + PPUBANK[ 0 ] = VROMPAGE( Map23_Regs[ 0 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xb002: + case 0xb008: + Map23_Regs[ 1 ] = ( Map23_Regs[ 1 ] & 0xf0 ) | ( byData & 0x0f ); + PPUBANK[ 1 ] = VROMPAGE( Map23_Regs[ 1 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xb003: + case 0xb00c: + Map23_Regs[ 1 ] = ( Map23_Regs[ 1 ] & 0x0f ) | ( ( byData & 0x0f ) << 4 ); + PPUBANK[ 1 ] = VROMPAGE( Map23_Regs[ 1 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xc000: + Map23_Regs[ 2 ] = ( Map23_Regs[ 2 ] & 0xf0 ) | ( byData & 0x0f ); + PPUBANK[ 2 ] = VROMPAGE( Map23_Regs[ 2 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xc001: + case 0xc004: + Map23_Regs[ 2 ] = ( Map23_Regs[ 2 ] & 0x0f ) | ( ( byData & 0x0f ) << 4 ); + PPUBANK[ 2 ] = VROMPAGE( Map23_Regs[ 2 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xc002: + case 0xc008: + Map23_Regs[ 3 ] = ( Map23_Regs[ 3 ] & 0xf0 ) | ( byData & 0x0f ); + PPUBANK[ 3 ] = VROMPAGE( Map23_Regs[ 3 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xc003: + case 0xc00c: + Map23_Regs[ 3 ] = ( Map23_Regs[ 3 ] & 0x0f ) | ( ( byData & 0x0f ) << 4 ); + PPUBANK[ 3 ] = VROMPAGE( Map23_Regs[ 3 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xd000: + Map23_Regs[ 4 ] = ( Map23_Regs[ 4 ] & 0xf0 ) | ( byData & 0x0f ); + PPUBANK[ 4 ] = VROMPAGE( Map23_Regs[ 4 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xd001: + case 0xd004: + Map23_Regs[ 4 ] = ( Map23_Regs[ 4 ] & 0x0f ) | ( ( byData & 0x0f ) << 4 ); + PPUBANK[ 4 ] = VROMPAGE( Map23_Regs[ 4 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xd002: + case 0xd008: + Map23_Regs[ 5 ] = ( Map23_Regs[ 5 ] & 0xf0 ) | ( byData & 0x0f ); + PPUBANK[ 5 ] = VROMPAGE( Map23_Regs[ 5 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xd003: + case 0xd00c: + Map23_Regs[ 5 ] = ( Map23_Regs[ 5 ] & 0x0f ) | ( ( byData & 0x0f ) << 4 ); + PPUBANK[ 5 ] = VROMPAGE( Map23_Regs[ 5 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xe000: + Map23_Regs[ 6 ] = ( Map23_Regs[ 6 ] & 0xf0 ) | ( byData & 0x0f ); + PPUBANK[ 6 ] = VROMPAGE( Map23_Regs[ 6 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xe001: + case 0xe004: + Map23_Regs[ 6 ] = ( Map23_Regs[ 6 ] & 0x0f ) | ( ( byData & 0x0f ) << 4 ); + PPUBANK[ 6 ] = VROMPAGE( Map23_Regs[ 6 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xe002: + case 0xe008: + Map23_Regs[ 7 ] = ( Map23_Regs[ 7 ] & 0xf0 ) | ( byData & 0x0f ); + PPUBANK[ 7 ] = VROMPAGE( Map23_Regs[ 7 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xe003: + case 0xe00c: + Map23_Regs[ 7 ] = ( Map23_Regs[ 7 ] & 0x0f ) | ( ( byData & 0x0f ) << 4 ); + PPUBANK[ 7 ] = VROMPAGE( Map23_Regs[ 7 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xf000: + Map23_IRQ_Latch = ( Map23_IRQ_Latch & 0xf0 ) | ( byData & 0x0f ); + break; + + case 0xf004: + Map23_IRQ_Latch = ( Map23_IRQ_Latch & 0xf0 ) | ( ( byData & 0x0f ) << 4 ); + break; + + case 0xf008: + Map23_IRQ_Enable = byData & 0x03; + if ( Map23_IRQ_Enable & 0x02 ) + { + Map23_IRQ_Cnt = Map23_IRQ_Latch; + } + break; + + case 0xf00c: + if ( Map23_IRQ_Enable & 0x01 ) + { + Map23_IRQ_Enable |= 0x02; + } else { + Map23_IRQ_Enable &= 0x01; + } + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 23 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map23_HSync() +{ +/* + * Callback at HSync + * + */ + if ( Map23_IRQ_Enable & 0x02 ) + { + if ( Map23_IRQ_Cnt == 0xff ) + { + IRQ_REQ; + + Map23_IRQ_Cnt = Map23_IRQ_Latch; + if ( Map23_IRQ_Enable & 0x01 ) + { + Map23_IRQ_Enable |= 0x02; + } else { + Map23_IRQ_Enable &= 0x01; + } + } else { + Map23_IRQ_Cnt++; + } + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_240.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_240.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_240.c (revision 0) @@ -0,0 +1,82 @@ +/*===================================================================*/ +/* */ +/* Mapper 240 : Gen Ke Le Zhuan */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 240 */ +/*-------------------------------------------------------------------*/ +void Map240_Init() +{ + /* Initialize Mapper */ + MapperInit = Map240_Init; + + /* Write to Mapper */ + MapperWrite = Map0_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map240_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 240 Write to APU Function */ +/*-------------------------------------------------------------------*/ +void Map240_Apu( WORD wAddr, BYTE byData ) +{ + if( wAddr>=0x4020 && wAddr<0x6000 ) { + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE((((byData&0xF0)>>2)+0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE((((byData&0xF0)>>2)+1) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE((((byData&0xF0)>>2)+2) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE((((byData&0xF0)>>2)+3) % (NesHeader.byRomSize<<1)); + + /* Set PPU Banks */ + PPUBANK[ 0 ] = VROMPAGE((((byData&0x0F)<<3)+0) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 1 ] = VROMPAGE((((byData&0x0F)<<3)+1) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 2 ] = VROMPAGE((((byData&0x0F)<<3)+2) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 3 ] = VROMPAGE((((byData&0x0F)<<3)+3) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 4 ] = VROMPAGE((((byData&0x0F)<<3)+4) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 5 ] = VROMPAGE((((byData&0x0F)<<3)+5) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 6 ] = VROMPAGE((((byData&0x0F)<<3)+6) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 7 ] = VROMPAGE((((byData&0x0F)<<3)+7) % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_006.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_006.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_006.c (revision 0) @@ -0,0 +1,158 @@ +/*===================================================================*/ +/* */ +/* Mapper 6 (FFE) */ +/* */ +/*===================================================================*/ + +BYTE Map6_IRQ_Enable; +DWORD Map6_IRQ_Cnt; +BYTE Map6_Chr_Ram[ 0x2000 * 4 ]; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 6 */ +/*-------------------------------------------------------------------*/ +void Map6_Init() +{ + int nPage; + + /* Initialize Mapper */ + MapperInit = Map6_Init; + + /* Write to Mapper */ + MapperWrite = Map6_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map6_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map6_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 14 ); + ROMBANK3 = ROMPAGE( 15 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( nPage = 0; nPage < 8; ++nPage ) + { + PPUBANK[ nPage ] = VROMPAGE( nPage ); + } + InfoNES_SetupChr(); + } + else + { + for ( nPage = 0; nPage < 8; ++nPage ) + { + PPUBANK[ nPage ] = Map6_VROMPAGE( nPage ); + } + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 6 Write to APU Function */ +/*-------------------------------------------------------------------*/ +void Map6_Apu( WORD wAddr, BYTE byData ) +{ + switch ( wAddr ) + { + /* Name Table Mirroring */ + case 0x42fe: + if ( byData & 0x10 ) + { + InfoNES_Mirroring( 2 ); + } else { + InfoNES_Mirroring( 3 ); + } + break; + + case 0x42ff: + if ( byData & 0x10 ) + { + InfoNES_Mirroring( 0 ); + } else { + InfoNES_Mirroring( 1 ); + } + break; + + case 0x4501: + Map6_IRQ_Enable = 0; + break; + + case 0x4502: + Map6_IRQ_Cnt = ( Map6_IRQ_Cnt & 0xff00 ) | (DWORD)byData; + break; + + case 0x4503: + Map6_IRQ_Cnt = ( Map6_IRQ_Cnt & 0x00ff ) | ( (DWORD)byData << 8 ); + Map6_IRQ_Enable = 1; + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 6 Write Function */ +/*-------------------------------------------------------------------*/ +void Map6_Write( WORD wAddr, BYTE byData ) +{ + BYTE byPrgBank = ( byData & 0x3c ) >> 2; + BYTE byChrBank = byData & 0x03; + + /* Set ROM Banks */ + byPrgBank <<= 1; + byPrgBank %= ( NesHeader.byRomSize << 1 ); + + ROMBANK0 = ROMPAGE( byPrgBank ); + ROMBANK1 = ROMPAGE( byPrgBank + 1 ); + + /* Set PPU Banks */ + PPUBANK[ 0 ] = &Map6_Chr_Ram[ byChrBank * 0x2000 + 0 * 0x400 ]; + PPUBANK[ 1 ] = &Map6_Chr_Ram[ byChrBank * 0x2000 + 1 * 0x400 ]; + PPUBANK[ 2 ] = &Map6_Chr_Ram[ byChrBank * 0x2000 + 2 * 0x400 ]; + PPUBANK[ 3 ] = &Map6_Chr_Ram[ byChrBank * 0x2000 + 3 * 0x400 ]; + PPUBANK[ 4 ] = &Map6_Chr_Ram[ byChrBank * 0x2000 + 4 * 0x400 ]; + PPUBANK[ 5 ] = &Map6_Chr_Ram[ byChrBank * 0x2000 + 5 * 0x400 ]; + PPUBANK[ 6 ] = &Map6_Chr_Ram[ byChrBank * 0x2000 + 6 * 0x400 ]; + PPUBANK[ 7 ] = &Map6_Chr_Ram[ byChrBank * 0x2000 + 7 * 0x400 ]; + InfoNES_SetupChr(); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 6 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map6_HSync() +{ + if ( Map6_IRQ_Enable ) + { + Map6_IRQ_Cnt += 133; + if ( Map6_IRQ_Cnt >= 0xffff ) + { + IRQ_REQ; + Map6_IRQ_Cnt = 0; + } + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_061.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_061.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_061.c (revision 0) @@ -0,0 +1,80 @@ +/*===================================================================*/ +/* */ +/* Mapper 61 */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 61 */ +/*-------------------------------------------------------------------*/ +void Map61_Init() +{ + /* Initialize Mapper */ + MapperInit = Map61_Init; + + /* Write to Mapper */ + MapperWrite = Map61_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 61 Write Function */ +/*-------------------------------------------------------------------*/ +void Map61_Write( WORD wAddr, BYTE byData ) +{ + BYTE byBank; + + switch( wAddr & 0x30 ) { + case 0x00: + case 0x30: + ROMBANK0 = ROMPAGE((((wAddr&0x0F)<<2)+0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE((((wAddr&0x0F)<<2)+1) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE((((wAddr&0x0F)<<2)+2) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE((((wAddr&0x0F)<<2)+3) % (NesHeader.byRomSize<<1)); + break; + case 0x10: + case 0x20: + byBank = ((wAddr & 0x0F)<<1)|((wAddr&0x20)>>4); + + ROMBANK0 = ROMPAGE(((byBank<<1)+0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE(((byBank<<1)+1) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE(((byBank<<1)+0) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE(((byBank<<1)+1) % (NesHeader.byRomSize<<1)); + break; + } + + if( wAddr & 0x80 ) InfoNES_Mirroring( 0 ); + else InfoNES_Mirroring( 1 ); +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_044.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_044.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_044.c (revision 0) @@ -0,0 +1,296 @@ +/*===================================================================*/ +/* */ +/* Mapper 44 (Nin1) */ +/* */ +/*===================================================================*/ + +BYTE Map44_Regs[ 8 ]; +DWORD Map44_Rom_Bank; +DWORD Map44_Prg0, Map44_Prg1; +DWORD Map44_Chr01, Map44_Chr23; +DWORD Map44_Chr4, Map44_Chr5, Map44_Chr6, Map44_Chr7; + +#define Map44_Chr_Swap() ( Map44_Regs[ 0 ] & 0x80 ) +#define Map44_Prg_Swap() ( Map44_Regs[ 0 ] & 0x40 ) + +BYTE Map44_IRQ_Enable; +BYTE Map44_IRQ_Cnt; +BYTE Map44_IRQ_Latch; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 44 */ +/*-------------------------------------------------------------------*/ +void Map44_Init() +{ + /* Initialize Mapper */ + MapperInit = Map44_Init; + + /* Write to Mapper */ + MapperWrite = Map44_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map44_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Initialize State Registers */ + for ( int nPage = 0; nPage < 8; nPage++ ) + { + Map44_Regs[ nPage ] = 0x00; + } + + /* Set ROM Banks */ + Map44_Rom_Bank = 0; + Map44_Prg0 = 0; + Map44_Prg1 = 1; + Map44_Set_CPU_Banks(); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + Map44_Chr01 = 0; + Map44_Chr23 = 2; + Map44_Chr4 = 4; + Map44_Chr5 = 5; + Map44_Chr6 = 6; + Map44_Chr7 = 7; + Map44_Set_PPU_Banks(); + } else { + Map44_Chr01 = Map44_Chr23 = 0; + Map44_Chr4 = Map44_Chr5 = Map44_Chr6 = Map44_Chr7 = 0; + } + + /* Initialize IRQ Registers */ + Map44_IRQ_Enable = 0; + Map44_IRQ_Cnt = 0; + Map44_IRQ_Latch = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 44 Write Function */ +/*-------------------------------------------------------------------*/ +void Map44_Write( WORD wAddr, BYTE byData ) +{ + DWORD dwBankNum; + + switch ( wAddr & 0xe001 ) + { + case 0x8000: + Map44_Regs[ 0 ] = byData; + Map44_Set_PPU_Banks(); + Map44_Set_CPU_Banks(); + break; + + case 0x8001: + Map44_Regs[ 1 ] = byData; + dwBankNum = Map44_Regs[ 1 ]; + + switch ( Map44_Regs[ 0 ] & 0x07 ) + { + /* Set PPU Banks */ + case 0x00: + if ( NesHeader.byVRomSize > 0 ) + { + dwBankNum &= 0xfe; + Map44_Chr01 = dwBankNum; + Map44_Set_PPU_Banks(); + } + break; + + case 0x01: + if ( NesHeader.byVRomSize > 0 ) + { + dwBankNum &= 0xfe; + Map44_Chr23 = dwBankNum; + Map44_Set_PPU_Banks(); + } + break; + + case 0x02: + if ( NesHeader.byVRomSize > 0 ) + { + Map44_Chr4 = dwBankNum; + Map44_Set_PPU_Banks(); + } + break; + + case 0x03: + if ( NesHeader.byVRomSize > 0 ) + { + Map44_Chr5 = dwBankNum; + Map44_Set_PPU_Banks(); + } + break; + + case 0x04: + if ( NesHeader.byVRomSize > 0 ) + { + Map44_Chr6 = dwBankNum; + Map44_Set_PPU_Banks(); + } + break; + + case 0x05: + if ( NesHeader.byVRomSize > 0 ) + { + Map44_Chr7 = dwBankNum; + Map44_Set_PPU_Banks(); + } + break; + + /* Set ROM Banks */ + case 0x06: + Map44_Prg0 = dwBankNum; + Map44_Set_CPU_Banks(); + break; + + case 0x07: + Map44_Prg1 = dwBankNum; + Map44_Set_CPU_Banks(); + break; + } + break; + + case 0xa000: + Map44_Regs[ 2 ] = byData; + + if ( !ROM_FourScr ) + { + if ( byData & 0x01 ) + { + InfoNES_Mirroring( 0 ); + } else { + InfoNES_Mirroring( 1 ); + } + } + break; + + case 0xa001: + Map44_Rom_Bank = byData & 0x07; + if ( Map44_Rom_Bank == 7 ) + { + Map44_Rom_Bank = 6; + } + Map44_Set_CPU_Banks(); + Map44_Set_PPU_Banks(); + break; + + case 0xc000: + Map44_Regs[ 4 ] = byData; + Map44_IRQ_Cnt = Map44_Regs[ 4 ]; + break; + + case 0xc001: + Map44_Regs[ 5 ] = byData; + Map44_IRQ_Latch = Map44_Regs[ 5 ]; + break; + + case 0xe000: + Map44_Regs[ 6 ] = byData; + Map44_IRQ_Enable = 0; + break; + + case 0xe001: + Map44_Regs[ 7 ] = byData; + Map44_IRQ_Enable = 1; + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 44 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map44_HSync() +{ +/* + * Callback at HSync + * + */ + if ( Map44_IRQ_Enable ) + { + if ( /* 0 <= PPU_Scanline && */ PPU_Scanline <= 239 ) + { + if ( PPU_R1 & R1_SHOW_SCR || PPU_R1 & R1_SHOW_SP ) + { + if ( !( Map44_IRQ_Cnt-- ) ) + { + Map44_IRQ_Cnt = Map44_IRQ_Latch; + IRQ_REQ; + } + } + } + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 44 Set CPU Banks Function */ +/*-------------------------------------------------------------------*/ +void Map44_Set_CPU_Banks() +{ + if ( Map44_Prg_Swap() ) + { + ROMBANK0 = ROMPAGE( ( ( Map44_Rom_Bank << 4 ) + 14 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE( ( ( Map44_Rom_Bank << 4 ) + Map44_Prg1 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMPAGE( ( ( Map44_Rom_Bank << 4 ) + Map44_Prg0 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK3 = ROMPAGE( ( ( Map44_Rom_Bank << 4 ) + 15 ) % ( NesHeader.byRomSize << 1 ) ); + } else { + ROMBANK0 = ROMPAGE( ( ( Map44_Rom_Bank << 4 ) + Map44_Prg0 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE( ( ( Map44_Rom_Bank << 4 ) + Map44_Prg1 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMPAGE( ( ( Map44_Rom_Bank << 4 ) + 14 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK3 = ROMPAGE( ( ( Map44_Rom_Bank << 4 ) + 15 ) % ( NesHeader.byRomSize << 1 ) ); + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 44 Set PPU Banks Function */ +/*-------------------------------------------------------------------*/ +void Map44_Set_PPU_Banks() +{ + if ( NesHeader.byVRomSize > 0 ) + { + if ( Map44_Chr_Swap() ) + { + PPUBANK[ 0 ] = VROMPAGE( ( ( Map44_Rom_Bank << 7 ) + Map44_Chr4 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( ( ( Map44_Rom_Bank << 7 ) + Map44_Chr5 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( ( ( Map44_Rom_Bank << 7 ) + Map44_Chr6 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( ( ( Map44_Rom_Bank << 7 ) + Map44_Chr7 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 4 ] = VROMPAGE( ( ( Map44_Rom_Bank << 7 ) + Map44_Chr01 + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( ( ( Map44_Rom_Bank << 7 ) + Map44_Chr01 + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE( ( ( Map44_Rom_Bank << 7 ) + Map44_Chr23 + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( ( ( Map44_Rom_Bank << 7 ) + Map44_Chr23 + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + } else { + PPUBANK[ 0 ] = VROMPAGE( ( ( Map44_Rom_Bank << 7 ) + Map44_Chr01 + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( ( ( Map44_Rom_Bank << 7 ) + Map44_Chr01 + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( ( ( Map44_Rom_Bank << 7 ) + Map44_Chr23 + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( ( ( Map44_Rom_Bank << 7 ) + Map44_Chr23 + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 4 ] = VROMPAGE( ( ( Map44_Rom_Bank << 7 ) + Map44_Chr4 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( ( ( Map44_Rom_Bank << 7 ) + Map44_Chr5 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE( ( ( Map44_Rom_Bank << 7 ) + Map44_Chr6 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( ( ( Map44_Rom_Bank << 7 ) + Map44_Chr7 ) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + } + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_180.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_180.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_180.c (revision 0) @@ -0,0 +1,71 @@ +/*===================================================================*/ +/* */ +/* Mapper 180 (Nichibutsu) */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 180 */ +/*-------------------------------------------------------------------*/ +void Map180_Init() +{ + /* Initialize Mapper */ + MapperInit = Map180_Init; + + /* Write to Mapper */ + MapperWrite = Map180_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 180 Write Function */ +/*-------------------------------------------------------------------*/ +void Map180_Write( WORD wAddr, BYTE byData ) +{ + /* Set ROM Banks */ + byData &= 0x07; + byData <<= 1; + byData %= ( NesHeader.byRomSize << 1 ); + ROMBANK2 = ROMPAGE( byData ); + ROMBANK3 = ROMPAGE( byData + 1 ); +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_108.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_108.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_108.c (revision 0) @@ -0,0 +1,59 @@ +/*===================================================================*/ +/* */ +/* Mapper 108 */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 108 */ +/*-------------------------------------------------------------------*/ +void Map108_Init() +{ + /* Initialize Mapper */ + MapperInit = Map108_Init; + + /* Write to Mapper */ + MapperWrite = Map108_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = ROMPAGE( 0 ); + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0xC % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE( 0xD % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMPAGE( 0xE % ( NesHeader.byRomSize << 1 ) ); + ROMBANK3 = ROMPAGE( 0xF % ( NesHeader.byRomSize << 1 ) ); + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 108 Write Function */ +/*-------------------------------------------------------------------*/ +void Map108_Write( WORD wAddr, BYTE byData ) +{ + /* Set SRAM Banks */ + SRAMBANK = ROMPAGE( byData % ( NesHeader.byRomSize << 1 ) ); +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_082.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_082.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_082.c (revision 0) @@ -0,0 +1,181 @@ +/*===================================================================*/ +/* */ +/* Mapper 82 (Taito X1-17) */ +/* */ +/*===================================================================*/ + +BYTE Map82_Regs[ 1 ]; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 82 */ +/*-------------------------------------------------------------------*/ +void Map82_Init() +{ + /* Initialize Mapper */ + MapperInit = Map82_Init; + + /* Write to Mapper */ + MapperWrite = Map0_Write; + + /* Write to SRAM */ + MapperSram = Map82_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Name Table Mirroring */ + InfoNES_Mirroring( 1 ); + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 82 Write to SRAM Function */ +/*-------------------------------------------------------------------*/ +void Map82_Sram( WORD wAddr, BYTE byData ) +{ + switch ( wAddr ) + { + /* Set PPU Banks */ + case 0x7ef0: + byData &= 0xfe; + byData %= ( NesHeader.byVRomSize << 3 ); + + if ( Map82_Regs[ 0 ] ) + { + PPUBANK[ 4 ] = VROMPAGE( byData ); + PPUBANK[ 5 ] = VROMPAGE( byData + 1 ); + } else { + PPUBANK[ 0 ] = VROMPAGE( byData ); + PPUBANK[ 1 ] = VROMPAGE( byData + 1 ); + } + InfoNES_SetupChr(); + break; + + case 0x7ef1: + byData &= 0xfe; + byData %= ( NesHeader.byVRomSize << 3 ); + + if ( Map82_Regs[ 0 ] ) + { + PPUBANK[ 6 ] = VROMPAGE( byData ); + PPUBANK[ 7 ] = VROMPAGE( byData + 1 ); + } else { + PPUBANK[ 2 ] = VROMPAGE( byData ); + PPUBANK[ 3 ] = VROMPAGE( byData + 1 ); + } + InfoNES_SetupChr(); + break; + + case 0x7ef2: + byData %= ( NesHeader.byVRomSize << 3 ); + + if ( !Map82_Regs[ 0 ] ) + { + PPUBANK[ 4 ] = VROMPAGE( byData ); + } else { + PPUBANK[ 0 ] = VROMPAGE( byData ); + } + InfoNES_SetupChr(); + break; + + case 0x7ef3: + byData %= ( NesHeader.byVRomSize << 3 ); + + if ( !Map82_Regs[ 0 ] ) + { + PPUBANK[ 5 ] = VROMPAGE( byData ); + } else { + PPUBANK[ 1 ] = VROMPAGE( byData ); + } + InfoNES_SetupChr(); + break; + + case 0x7ef4: + byData %= ( NesHeader.byVRomSize << 3 ); + + if ( !Map82_Regs[ 0 ] ) + { + PPUBANK[ 6 ] = VROMPAGE( byData ); + } else { + PPUBANK[ 2 ] = VROMPAGE( byData ); + } + InfoNES_SetupChr(); + break; + + case 0x7ef5: + byData %= ( NesHeader.byVRomSize << 3 ); + + if ( !Map82_Regs[ 0 ] ) + { + PPUBANK[ 7 ] = VROMPAGE( byData ); + } else { + PPUBANK[ 3 ] = VROMPAGE( byData ); + } + InfoNES_SetupChr(); + break; + + /* Name Table Mirroring */ + case 0x7ef6: + Map82_Regs[ 0 ] = byData & 0x02; + + if ( byData & 0x01 ) + { + InfoNES_Mirroring( 1 ); + } else { + InfoNES_Mirroring( 0 ); + } + + /* Set ROM Banks */ + case 0x7efa: + byData >>= 2; + byData %= ( NesHeader.byRomSize << 1 ); + ROMBANK0 = ROMPAGE( byData ); + break; + + case 0x7efb: + byData >>= 2; + byData %= ( NesHeader.byRomSize << 1 ); + ROMBANK1 = ROMPAGE( byData ); + break; + + case 0x7efc: + byData >>= 2; + byData %= ( NesHeader.byRomSize << 1 ); + ROMBANK2 = ROMPAGE( byData ); + break; + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_244.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_244.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_244.c (revision 0) @@ -0,0 +1,72 @@ +/*===================================================================*/ +/* */ +/* Mapper 244 */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 244 */ +/*-------------------------------------------------------------------*/ +void Map244_Init() +{ + /* Initialize Mapper */ + MapperInit = Map244_Init; + + /* Write to Mapper */ + MapperWrite = Map244_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 244 Write Function */ +/*-------------------------------------------------------------------*/ +void Map244_Write( WORD wAddr, BYTE byData ) +{ + if( wAddr>=0x8065 && wAddr<=0x80A4 ) { + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE(((((wAddr-0x8065)&0x3)<<2)+0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE(((((wAddr-0x8065)&0x3)<<2)+1) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE(((((wAddr-0x8065)&0x3)<<2)+2) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE(((((wAddr-0x8065)&0x3)<<2)+3) % (NesHeader.byRomSize<<1)); + } + + if( wAddr>=0x80A5 && wAddr<=0x80E4 ) { + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE(((((wAddr-0x80A5)&0x7)<<2)+0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE(((((wAddr-0x80A5)&0x7)<<2)+1) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE(((((wAddr-0x80A5)&0x7)<<2)+2) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE(((((wAddr-0x80A5)&0x7)<<2)+3) % (NesHeader.byRomSize<<1)); + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_227.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_227.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_227.c (revision 0) @@ -0,0 +1,92 @@ +/*===================================================================*/ +/* */ +/* Mapper 227 : 1200-in-1 */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 227 */ +/*-------------------------------------------------------------------*/ +void Map227_Init() +{ + /* Initialize Mapper */ + MapperInit = Map227_Init; + + /* Write to Mapper */ + MapperWrite = Map227_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 0 ); + ROMBANK3 = ROMPAGE( 1 ); + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 227 Write Function */ +/*-------------------------------------------------------------------*/ +void Map227_Write( WORD wAddr, BYTE byData ) +{ + BYTE byBank = ((wAddr&0x0100)>>4)|((wAddr&0x0078)>>3); + + if( wAddr & 0x0001 ) { + ROMBANK0 = ROMPAGE(((byBank<<2)+0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE(((byBank<<2)+1) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE(((byBank<<2)+2) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE(((byBank<<2)+3) % (NesHeader.byRomSize<<1)); + } else { + if( wAddr & 0x0004 ) { + ROMBANK0 = ROMPAGE(((byBank<<2)+2) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE(((byBank<<2)+3) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE(((byBank<<2)+2) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE(((byBank<<2)+3) % (NesHeader.byRomSize<<1)); + } else { + ROMBANK0 = ROMPAGE(((byBank<<2)+0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE(((byBank<<2)+1) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE(((byBank<<2)+0) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE(((byBank<<2)+1) % (NesHeader.byRomSize<<1)); + } + } + + if( !(wAddr & 0x0080) ) { + if( wAddr & 0x0200 ) { + ROMBANK2 = ROMPAGE((((byBank&0x1C)<<2)+14) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE((((byBank&0x1C)<<2)+15) % (NesHeader.byRomSize<<1)); + } else { + ROMBANK2 = ROMPAGE((((byBank&0x1C)<<2)+0) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE((((byBank&0x1C)<<2)+1) % (NesHeader.byRomSize<<1)); + } + } + if( wAddr & 0x0002 ) { + InfoNES_Mirroring( 0 ); + } else { + InfoNES_Mirroring( 1 ); + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_065.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_065.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_065.c (revision 0) @@ -0,0 +1,172 @@ +/*===================================================================*/ +/* */ +/* Mapper 65 (Irem H3001) */ +/* */ +/*===================================================================*/ + +BYTE Map65_IRQ_Enable; +DWORD Map65_IRQ_Cnt; +DWORD Map65_IRQ_Latch; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 65 */ +/*-------------------------------------------------------------------*/ +void Map65_Init() +{ + /* Initialize Mapper */ + MapperInit = Map65_Init; + + /* Write to Mapper */ + MapperWrite = Map65_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map65_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 65 Write Function */ +/*-------------------------------------------------------------------*/ +void Map65_Write( WORD wAddr, BYTE byData ) +{ + switch ( wAddr ) + { + case 0x8000: + ROMBANK0 = ROMPAGE( byData % ( NesHeader.byRomSize << 1) ); + break; + + case 0x9000: + if ( byData & 0x40 ) + { + InfoNES_Mirroring( 1 ); + } else { + InfoNES_Mirroring( 0 ); + } + break; + + case 0x9003: + Map65_IRQ_Enable = byData & 0x80; + break; + + case 0x9004: + Map65_IRQ_Cnt = Map65_IRQ_Latch; + break; + + case 0x9005: + Map65_IRQ_Latch = ( Map65_IRQ_Latch & 0x00ff ) | ((DWORD)byData << 8 ); + break; + + case 0x9006: + Map65_IRQ_Latch = ( Map65_IRQ_Latch & 0xff00 ) | (DWORD)byData; + break; + + /* Set PPU Banks */ + case 0xb000: + PPUBANK[ 0 ] = VROMPAGE( byData % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xb001: + PPUBANK[ 1 ] = VROMPAGE( byData % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xb002: + PPUBANK[ 2 ] = VROMPAGE( byData % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xb003: + PPUBANK[ 3 ] = VROMPAGE( byData % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xb004: + PPUBANK[ 4 ] = VROMPAGE( byData % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xb005: + PPUBANK[ 5 ] = VROMPAGE( byData % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xb006: + PPUBANK[ 6 ] = VROMPAGE( byData % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xb007: + PPUBANK[ 7 ] = VROMPAGE( byData % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + /* Set ROM Banks */ + case 0xa000: + ROMBANK1 = ROMPAGE( byData % ( NesHeader.byRomSize << 1) ); + break; + + case 0xc000: + ROMBANK2 = ROMPAGE( byData % ( NesHeader.byRomSize << 1) ); + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 65 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map65_HSync() +{ +/* + * Callback at HSync + * + */ + if ( Map65_IRQ_Enable ) + { + if ( Map65_IRQ_Cnt <= 113 ) + { + IRQ_REQ; + Map65_IRQ_Enable = 0; + Map65_IRQ_Cnt = 0xffff; + } else { + Map65_IRQ_Cnt -= 113; + } + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_048.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_048.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_048.c (revision 0) @@ -0,0 +1,175 @@ +/*===================================================================*/ +/* */ +/* Mapper 48 (Taito TC0190V) */ +/* */ +/*===================================================================*/ + +BYTE Map48_Regs[ 1 ]; +BYTE Map48_IRQ_Enable; +BYTE Map48_IRQ_Cnt; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 48 */ +/*-------------------------------------------------------------------*/ +void Map48_Init() +{ + /* Initialize Mapper */ + MapperInit = Map48_Init; + + /* Write to Mapper */ + MapperWrite = Map48_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map48_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Initialize IRQ Registers */ + Map48_Regs[ 0 ] = 0; + Map48_IRQ_Enable = 0; + Map48_IRQ_Cnt = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 48 Write Function */ +/*-------------------------------------------------------------------*/ +void Map48_Write( WORD wAddr, BYTE byData ) +{ + switch ( wAddr ) + { + case 0x8000: + /* Name Table Mirroring */ + if ( !Map48_Regs[ 0 ] ) + { + if ( byData & 0x40 ) + { + InfoNES_Mirroring( 0 ); + } else { + InfoNES_Mirroring( 1 ); + } + } + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( byData % ( NesHeader.byRomSize << 1 ) ); + break; + + case 0x8001: + /* Set ROM Banks */ + ROMBANK1 = ROMPAGE( byData % ( NesHeader.byRomSize << 1 ) ); + break; + + /* Set PPU Banks */ + case 0x8002: + PPUBANK[ 0 ] = VROMPAGE( ( ( byData << 1 ) + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( ( ( byData << 1 ) + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0x8003: + PPUBANK[ 2 ] = VROMPAGE( ( ( byData << 1 ) + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( ( ( byData << 1 ) + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xa000: + PPUBANK[ 4 ] = VROMPAGE( ( ( byData << 1 ) + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xa001: + PPUBANK[ 5 ] = VROMPAGE( ( ( byData << 1 ) + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xa002: + PPUBANK[ 6 ] = VROMPAGE( ( ( byData << 1 ) + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xa003: + PPUBANK[ 7 ] = VROMPAGE( ( ( byData << 1 ) + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xc000: + Map48_IRQ_Cnt = byData; + break; + + case 0xc001: + Map48_IRQ_Enable = byData & 0x01; + break; + + case 0xe000: + /* Name Table Mirroring */ + if ( byData & 0x40 ) + { + InfoNES_Mirroring( 0 ); + } else { + InfoNES_Mirroring( 1 ); + } + Map48_Regs[ 0 ] = 1; + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 48 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map48_HSync() +{ +/* + * Callback at HSync + * + */ + if ( Map48_IRQ_Enable ) + { + if ( /* 0 <= PPU_Scanline && */ PPU_Scanline <= 239 ) + { + if ( PPU_R1 & R1_SHOW_SCR || PPU_R1 & R1_SHOW_SP ) + { + if ( Map48_IRQ_Cnt == 0xff ) + { + IRQ_REQ; + Map48_IRQ_Enable = 0; + } else { + Map48_IRQ_Cnt++; + } + } + } + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_086.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_086.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_086.c (revision 0) @@ -0,0 +1,95 @@ +/*===================================================================*/ +/* */ +/* Mapper 86 (Jaleco) */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 86 */ +/*-------------------------------------------------------------------*/ +void Map86_Init() +{ + /* Initialize Mapper */ + MapperInit = Map86_Init; + + /* Write to Mapper */ + MapperWrite = Map0_Write; + + /* Write to SRAM */ + MapperSram = Map86_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 86 Write to Sram Function */ +/*-------------------------------------------------------------------*/ +void Map86_Sram( WORD wAddr, BYTE byData ) +{ + BYTE byChrBank; + BYTE byPrgBank; + + switch ( wAddr ) + { + case 0x6000: + byChrBank = byData & 0x03 | ( byData & 0x40 ) >> 4; + byPrgBank = ( byData & 0x30 ) >> 4; + + byPrgBank = ( byPrgBank << 2 ) % ( NesHeader.byRomSize << 1 ); + byChrBank = ( byChrBank << 3 ) % ( NesHeader.byVRomSize << 3 ); + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( byPrgBank + 0 ); + ROMBANK1 = ROMPAGE( byPrgBank + 1 ); + ROMBANK2 = ROMPAGE( byPrgBank + 2 ); + ROMBANK3 = ROMPAGE( byPrgBank + 3 ); + + /* Set PPU Banks */ + PPUBANK[ 0 ] = VROMPAGE( byChrBank + 0 ); + PPUBANK[ 1 ] = VROMPAGE( byChrBank + 1 ); + PPUBANK[ 2 ] = VROMPAGE( byChrBank + 2 ); + PPUBANK[ 3 ] = VROMPAGE( byChrBank + 3 ); + PPUBANK[ 4 ] = VROMPAGE( byChrBank + 4 ); + PPUBANK[ 5 ] = VROMPAGE( byChrBank + 5 ); + PPUBANK[ 6 ] = VROMPAGE( byChrBank + 6 ); + PPUBANK[ 7 ] = VROMPAGE( byChrBank + 7 ); + InfoNES_SetupChr(); + break; + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_248.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_248.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_248.c (revision 0) @@ -0,0 +1,235 @@ +/*===================================================================*/ +/* */ +/* Mapper 248 : Bao Qing Tian */ +/* */ +/*===================================================================*/ + +BYTE Map248_Reg[8]; +BYTE Map248_Prg0, Map248_Prg1; +BYTE Map248_Chr01, Map248_Chr23, Map248_Chr4, Map248_Chr5, Map248_Chr6, Map248_Chr7; +BYTE Map248_WeSram; + +BYTE Map248_IRQ_Enable; +BYTE Map248_IRQ_Counter; +BYTE Map248_IRQ_Latch; +BYTE Map248_IRQ_Request; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 248 */ +/*-------------------------------------------------------------------*/ +void Map248_Init() +{ + /* Initialize Mapper */ + MapperInit = Map248_Init; + + /* Write to Mapper */ + MapperWrite = Map248_Write; + + /* Write to SRAM */ + MapperSram = Map248_Sram; + + /* Write to APU */ + MapperApu = Map248_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map248_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set Registers */ + for( int i = 0; i < 8; i++ ) { + Map248_Reg[i] = 0x00; + } + + /* Set ROM Banks */ + Map248_Prg0 = 0; + Map248_Prg1 = 1; + Map248_Set_CPU_Banks(); + + /* Set PPU Banks */ + Map248_Chr01 = 0; + Map248_Chr23 = 2; + Map248_Chr4 = 4; + Map248_Chr5 = 5; + Map248_Chr6 = 6; + Map248_Chr7 = 7; + Map248_Set_PPU_Banks(); + + Map248_WeSram = 0; // Disable + Map248_IRQ_Enable = 0; // Disable + Map248_IRQ_Counter = 0; + Map248_IRQ_Latch = 0; + Map248_IRQ_Request = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 248 Write Function */ +/*-------------------------------------------------------------------*/ +void Map248_Write( WORD wAddr, BYTE byData ) +{ + switch( wAddr & 0xE001 ) { + case 0x8000: + Map248_Reg[0] = byData; + Map248_Set_CPU_Banks(); + Map248_Set_PPU_Banks(); + break; + case 0x8001: + Map248_Reg[1] = byData; + + switch( Map248_Reg[0] & 0x07 ) { + case 0x00: + Map248_Chr01 = byData & 0xFE; + Map248_Set_PPU_Banks(); + break; + case 0x01: + Map248_Chr23 = byData & 0xFE; + Map248_Set_PPU_Banks(); + break; + case 0x02: + Map248_Chr4 = byData; + Map248_Set_PPU_Banks(); + break; + case 0x03: + Map248_Chr5 = byData; + Map248_Set_PPU_Banks(); + break; + case 0x04: + Map248_Chr6 = byData; + Map248_Set_PPU_Banks(); + break; + case 0x05: + Map248_Chr7 = byData; + Map248_Set_PPU_Banks(); + break; + case 0x06: + Map248_Prg0 = byData; + Map248_Set_CPU_Banks(); + break; + case 0x07: + Map248_Prg1 = byData; + Map248_Set_CPU_Banks(); + break; + } + break; + case 0xA000: + Map248_Reg[2] = byData; + if( !ROM_FourScr ) { + if( byData & 0x01 ) { + InfoNES_Mirroring( 0 ); + } else { + InfoNES_Mirroring( 1 ); + } + } + break; + case 0xC000: + Map248_IRQ_Enable=0; + Map248_IRQ_Latch=0xBE; + Map248_IRQ_Counter =0xBE; + break; + case 0xC001: + Map248_IRQ_Enable=1; + Map248_IRQ_Latch=0xBE; + Map248_IRQ_Counter=0xBE; + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 248 Write to SRAM Function */ +/*-------------------------------------------------------------------*/ +void Map248_Sram( WORD wAddr, BYTE byData ) +{ + ROMBANK0 = ROMPAGE(((byData<<1)+0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE(((byData<<1)+1) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 248 Write to APU Function */ +/*-------------------------------------------------------------------*/ +void Map248_Apu( WORD wAddr, BYTE byData ) +{ + Map248_Sram( wAddr, byData ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 248 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map248_HSync() +{ + if( ( /* PPU_Scanline >= 0 && */ PPU_Scanline <= 239) ) { + if( PPU_R1 & R1_SHOW_SCR || PPU_R1 & R1_SHOW_SP ) { + if( Map248_IRQ_Enable ) { + if( !(Map248_IRQ_Counter--) ) { + Map248_IRQ_Counter = Map248_IRQ_Latch; + IRQ_REQ; + } + } + } + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 248 Set CPU Banks Function */ +/*-------------------------------------------------------------------*/ +void Map248_Set_CPU_Banks() +{ + if( Map248_Reg[0] & 0x40 ) { + ROMBANK0 = ROMLASTPAGE( 1 ); + ROMBANK1 = ROMPAGE(Map248_Prg1 % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE(Map248_Prg0 % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMLASTPAGE( 0 ); + } else { + ROMBANK0 = ROMPAGE(Map248_Prg0 % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE(Map248_Prg1 % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 248 Set PPU Banks Function */ +/*-------------------------------------------------------------------*/ +void Map248_Set_PPU_Banks() +{ + if( NesHeader.byRomSize > 0 ) { + if( Map248_Reg[0] & 0x80 ) { + PPUBANK[ 0 ] = VROMPAGE(Map248_Chr4 % (NesHeader.byVRomSize<<3)); + PPUBANK[ 1 ] = VROMPAGE(Map248_Chr5 % (NesHeader.byVRomSize<<3)); + PPUBANK[ 2 ] = VROMPAGE(Map248_Chr6 % (NesHeader.byVRomSize<<3)); + PPUBANK[ 3 ] = VROMPAGE(Map248_Chr7 % (NesHeader.byVRomSize<<3)); + PPUBANK[ 4 ] = VROMPAGE((Map248_Chr01+0) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 5 ] = VROMPAGE((Map248_Chr01+1) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 6 ] = VROMPAGE((Map248_Chr23+0) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 7 ] = VROMPAGE((Map248_Chr23+1) % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + } else { + PPUBANK[ 0 ] = VROMPAGE((Map248_Chr01+0) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 1 ] = VROMPAGE((Map248_Chr01+1) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 2 ] = VROMPAGE((Map248_Chr23+0) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 3 ] = VROMPAGE((Map248_Chr23+1) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 4 ] = VROMPAGE(Map248_Chr4 % (NesHeader.byVRomSize<<3)); + PPUBANK[ 5 ] = VROMPAGE(Map248_Chr5 % (NesHeader.byVRomSize<<3)); + PPUBANK[ 6 ] = VROMPAGE(Map248_Chr6 % (NesHeader.byVRomSize<<3)); + PPUBANK[ 7 ] = VROMPAGE(Map248_Chr7 % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + } + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_069.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_069.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_069.c (revision 0) @@ -0,0 +1,176 @@ +/*===================================================================*/ +/* */ +/* Mapper 69 (Sunsoft FME-7) */ +/* */ +/*===================================================================*/ + +BYTE Map69_IRQ_Enable; +DWORD Map69_IRQ_Cnt; +BYTE Map69_Regs[ 1 ]; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 69 */ +/*-------------------------------------------------------------------*/ +void Map69_Init() +{ + /* Initialize Mapper */ + MapperInit = Map69_Init; + + /* Write to Mapper */ + MapperWrite = Map69_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map69_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Initialize IRQ Reg */ + Map69_IRQ_Enable = 0; + Map69_IRQ_Cnt = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 69 Write Function */ +/*-------------------------------------------------------------------*/ +void Map69_Write( WORD wAddr, BYTE byData ) +{ + switch ( wAddr ) + { + case 0x8000: + Map69_Regs[ 0 ] = byData & 0x0f; + break; + + case 0xA000: + switch ( Map69_Regs[ 0 ] ) + { + /* Set PPU Banks */ + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ Map69_Regs[ 0 ] ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + /* Set ROM Banks */ +#if 0 + case 0x08: + if ( !( byData & 0x40 ) ) + { + byData %= ( NesHeader.byRomSize << 1 ); + SRAMBANK = ROMPAGE( byData ); + } + break; +#endif + + case 0x09: + byData %= ( NesHeader.byRomSize << 1 ); + ROMBANK0 = ROMPAGE( byData ); + break; + + case 0x0a: + byData %= ( NesHeader.byRomSize << 1 ); + ROMBANK1 = ROMPAGE( byData ); + break; + + case 0x0b: + byData %= ( NesHeader.byRomSize << 1 ); + ROMBANK2 = ROMPAGE( byData ); + break; + + /* Name Table Mirroring */ + case 0x0c: + switch ( byData & 0x03 ) + { + case 0: + InfoNES_Mirroring( 1 ); /* Vertical */ + break; + case 1: + InfoNES_Mirroring( 0 ); /* Horizontal */ + break; + case 2: + InfoNES_Mirroring( 3 ); /* One Screen 0x2400 */ + break; + case 3: + InfoNES_Mirroring( 2 ); /* One Screen 0x2000 */ + break; + } + break; + + case 0x0d: + Map69_IRQ_Enable = byData; + break; + + case 0x0e: + Map69_IRQ_Cnt = ( Map69_IRQ_Cnt & 0xff00) | (DWORD)byData; + break; + + case 0x0f: + Map69_IRQ_Cnt = ( Map69_IRQ_Cnt & 0x00ff) | ( (DWORD)byData << 8 ); + break; + } + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 69 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map69_HSync() +{ +/* + * Callback at HSync + * + */ + if ( Map69_IRQ_Enable ) + { + if ( Map69_IRQ_Cnt <= 113 ) + { + IRQ_REQ; + Map69_IRQ_Cnt = 0; + } else { + Map69_IRQ_Cnt -= 113; + } + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_188.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_188.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_188.c (revision 0) @@ -0,0 +1,95 @@ +/*===================================================================*/ +/* */ +/* Mapper 188 (Bandai) */ +/* */ +/*===================================================================*/ + +BYTE Map188_Dummy[ 0x2000 ]; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 188 */ +/*-------------------------------------------------------------------*/ +void Map188_Init() +{ + /* Initialize Mapper */ + MapperInit = Map188_Init; + + /* Write to Mapper */ + MapperWrite = Map188_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = Map188_Dummy; + + /* Set ROM Banks */ + if ( ( NesHeader.byRomSize << 1 ) > 16 ) + { + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 14 ); + ROMBANK3 = ROMPAGE( 15 ); + } else { + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + } + + /* Magic Code */ + Map188_Dummy[ 0 ] = 0x03; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 188 Write Function */ +/*-------------------------------------------------------------------*/ +void Map188_Write( WORD wAddr, BYTE byData ) +{ + /* Set ROM Banks */ + if ( byData ) + { + if ( byData & 0x10 ) + { + byData = ( byData & 0x07 ) << 1; + ROMBANK0 = ROMPAGE( ( byData + 0 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE( ( byData + 1 ) % ( NesHeader.byRomSize << 1 ) ); + } else { + byData <<= 1; + ROMBANK0 = ROMPAGE( ( byData + 16 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE( ( byData + 17 ) % ( NesHeader.byRomSize << 1 ) ); + } + } + else + { + if ( ( NesHeader.byRomSize << 1 ) == 0x10 ) + { + ROMBANK0 = ROMPAGE( 14 ); + ROMBANK1 = ROMPAGE( 15 ); + } else { + ROMBANK0 = ROMPAGE( 16 ); + ROMBANK1 = ROMPAGE( 17 ); + } + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_011.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_011.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_011.c (revision 0) @@ -0,0 +1,89 @@ +/*===================================================================*/ +/* */ +/* Mapper 11 (Color Dreams) */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 11 */ +/*-------------------------------------------------------------------*/ +void Map11_Init() +{ + int nPage; + + /* Initialize Mapper */ + MapperInit = Map11_Init; + + /* Write to Mapper */ + MapperWrite = Map11_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Name Table Mirroring */ + InfoNES_Mirroring( 1 ); + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 11 Write Function */ +/*-------------------------------------------------------------------*/ +void Map11_Write( WORD wAddr, BYTE byData ) +{ + BYTE byPrgBank = ( byData & 0x01 ) << 2; + BYTE byChrBank = ( ( byData & 0x70 ) >> 4 ) << 3; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( ( byPrgBank + 0 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE( ( byPrgBank + 1 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMPAGE( ( byPrgBank + 2 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK3 = ROMPAGE( ( byPrgBank + 3 ) % ( NesHeader.byRomSize << 1 ) ); + + /* Set PPU Banks */ + PPUBANK[ 0 ] = VROMPAGE( ( byChrBank + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( ( byChrBank + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( ( byChrBank + 2 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( ( byChrBank + 3 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 4 ] = VROMPAGE( ( byChrBank + 4 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( ( byChrBank + 5 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE( ( byChrBank + 6 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( ( byChrBank + 7 ) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_113.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_113.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_113.c (revision 0) @@ -0,0 +1,150 @@ +/*===================================================================*/ +/* */ +/* Mapper 113 (PC-Sachen/Hacker) */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 113 */ +/*-------------------------------------------------------------------*/ +void Map113_Init() +{ + /* Initialize Mapper */ + MapperInit = Map113_Init; + + /* Write to Mapper */ + MapperWrite = Map113_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map113_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 113 Write to Apu Function */ +/*-------------------------------------------------------------------*/ +void Map113_Apu( WORD wAddr, BYTE byData ) +{ + BYTE byPrgBank, byChrBank; + + switch ( wAddr ) + { + case 0x4100: + case 0x4111: + case 0x4120: + case 0x4900: + byPrgBank = byData >> 3; + + if ( ( NesHeader.byRomSize << 1 ) <= 8 && ( NesHeader.byVRomSize << 3 ) == 128 ) + { + byChrBank = ( ( byData >> 3 ) & 0x08 ) + ( byData & 0x07 ); + } else { + byChrBank = byData & 0x07; + } + + /* Set ROM Banks */ + byPrgBank = ( byPrgBank << 2 ) % ( NesHeader.byRomSize << 1 ); + + ROMBANK0 = ROMPAGE( byPrgBank + 0 ); + ROMBANK1 = ROMPAGE( byPrgBank + 1 ); + ROMBANK2 = ROMPAGE( byPrgBank + 2 ); + ROMBANK3 = ROMPAGE( byPrgBank + 3 ); + + /* Set PPU Banks */ + byChrBank = ( byChrBank << 3 ) % ( NesHeader.byVRomSize << 3 ); + + PPUBANK[ 0 ] = VROMPAGE( byChrBank + 0 ); + PPUBANK[ 1 ] = VROMPAGE( byChrBank + 1 ); + PPUBANK[ 2 ] = VROMPAGE( byChrBank + 2 ); + PPUBANK[ 3 ] = VROMPAGE( byChrBank + 3 ); + PPUBANK[ 4 ] = VROMPAGE( byChrBank + 4 ); + PPUBANK[ 5 ] = VROMPAGE( byChrBank + 5 ); + PPUBANK[ 6 ] = VROMPAGE( byChrBank + 6 ); + PPUBANK[ 7 ] = VROMPAGE( byChrBank + 7 ); + + InfoNES_SetupChr(); + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 113 Write Function */ +/*-------------------------------------------------------------------*/ +void Map113_Write( WORD wAddr, BYTE byData ) +{ + BYTE byPrgBank, byChrBank; + + switch ( wAddr ) + { + case 0x8008: + case 0x8009: + byPrgBank = byData >> 3; + + if ( ( NesHeader.byRomSize << 1 ) <= 8 && ( NesHeader.byVRomSize << 3 ) == 128 ) + { + byChrBank = ( ( byData >> 3 ) & 0x08 ) + ( byData & 0x07 ); + } else { + byChrBank = byData & 0x07; + } + + /* Set ROM Banks */ + byPrgBank = ( byPrgBank << 2 ) % ( NesHeader.byRomSize << 1 ); + + ROMBANK0 = ROMPAGE( byPrgBank + 0 ); + ROMBANK1 = ROMPAGE( byPrgBank + 1 ); + ROMBANK2 = ROMPAGE( byPrgBank + 2 ); + ROMBANK3 = ROMPAGE( byPrgBank + 3 ); + + /* Set PPU Banks */ + byChrBank = ( byChrBank << 3 ) % ( NesHeader.byVRomSize << 3 ); + + PPUBANK[ 0 ] = VROMPAGE( byChrBank + 0 ); + PPUBANK[ 1 ] = VROMPAGE( byChrBank + 1 ); + PPUBANK[ 2 ] = VROMPAGE( byChrBank + 2 ); + PPUBANK[ 3 ] = VROMPAGE( byChrBank + 3 ); + PPUBANK[ 4 ] = VROMPAGE( byChrBank + 4 ); + PPUBANK[ 5 ] = VROMPAGE( byChrBank + 5 ); + PPUBANK[ 6 ] = VROMPAGE( byChrBank + 6 ); + PPUBANK[ 7 ] = VROMPAGE( byChrBank + 7 ); + + InfoNES_SetupChr(); + break; + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_032.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_032.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_032.c (revision 0) @@ -0,0 +1,108 @@ +/*===================================================================*/ +/* */ +/* Mapper 32 (Irem G-101) */ +/* */ +/*===================================================================*/ + +BYTE Map32_Saved; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 32 */ +/*-------------------------------------------------------------------*/ +void Map32_Init() +{ + int nPage; + /* Initialize Mapper */ + MapperInit = Map32_Init; + + /* Write to Mapper */ + MapperWrite = Map32_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Initialize state flag */ + Map32_Saved = 0x00; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 32 Write Function */ +/*-------------------------------------------------------------------*/ +void Map32_Write( WORD wAddr, BYTE byData ) +{ + switch ( wAddr & 0xf000 ) + { + case 0x8000: + /* Set ROM Banks */ + byData %= ( NesHeader.byRomSize << 1 ); + + if ( Map32_Saved & 0x02 ) + { + ROMBANK2 = ROMPAGE( byData ); + } else { + ROMBANK0 = ROMPAGE( byData ); + } + break; + + case 0x9000: + Map32_Saved = byData; + + // Name Table Mirroring + InfoNES_Mirroring( byData & 0x01 ); + break; + + case 0xa000: + /* Set ROM Banks */ + byData %= ( NesHeader.byRomSize << 1 ); + ROMBANK1 = ROMPAGE( byData ); + break; + + case 0xb000: + /* Set PPU Banks */ + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ wAddr & 0x0007 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + default: + break; + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_015.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_015.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_015.c (revision 0) @@ -0,0 +1,112 @@ +/*===================================================================*/ +/* */ +/* Mapper 15 (100-in-1) */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 15 */ +/*-------------------------------------------------------------------*/ +void Map15_Init() +{ + /* Initialize Mapper */ + MapperInit = Map15_Init; + + /* Write to Mapper */ + MapperWrite = Map15_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 15 Write Function */ +/*-------------------------------------------------------------------*/ +void Map15_Write( WORD wAddr, BYTE byData ) +{ + BYTE byBank; + + switch ( wAddr ) + { + case 0x8000: + /* Name Table Mirroring */ + InfoNES_Mirroring( byData & 0x20 ? 0 : 1); + + /* Set ROM Banks */ + byBank = byData & 0x1f; + byBank %= ( NesHeader.byRomSize << 1 ); + byBank <<= 1; + + ROMBANK0 = ROMPAGE( byBank ); + ROMBANK1 = ROMPAGE( byBank + 1 ); + ROMBANK2 = ROMPAGE( byBank + 2 ); + ROMBANK3 = ROMPAGE( byBank + 3 ); + break; + + case 0x8001: + /* Set ROM Banks */ + byData &= 0x3f; + byData %= ( NesHeader.byRomSize << 1 ); + byData <<= 1; + + ROMBANK2 = ROMPAGE( byData ); + ROMBANK3 = ROMPAGE( byData + 1 ); + break; + + case 0x8002: + /* Set ROM Banks */ + byBank = byData & 0x3f; + byBank %= ( NesHeader.byRomSize << 1 ); + byBank <<= 1; + byBank += ( byData & 0x80 ? 1 : 0 ); + + ROMBANK0 = ROMPAGE( byBank ); + ROMBANK1 = ROMPAGE( byBank ); + ROMBANK2 = ROMPAGE( byBank ); + ROMBANK3 = ROMPAGE( byBank ); + break; + + case 0x8003: + /* Name Table Mirroring */ + InfoNES_Mirroring( byData & 0x20 ? 0 : 1); + + /* Set ROM Banks */ + byData &= 0x1f; + byData %= ( NesHeader.byRomSize << 1 ); + byData <<= 1; + + ROMBANK2 = ROMPAGE( byData ); + ROMBANK3 = ROMPAGE( byData + 1 ); + break; + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_070.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_070.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_070.c (revision 0) @@ -0,0 +1,88 @@ +/*===================================================================*/ +/* */ +/* Mapper 70 (74161/32 Bandai) */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 70 */ +/*-------------------------------------------------------------------*/ +void Map70_Init() +{ + /* Initialize Mapper */ + MapperInit = Map70_Init; + + /* Write to Mapper */ + MapperWrite = Map70_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 70 Write Function */ +/*-------------------------------------------------------------------*/ +void Map70_Write( WORD wAddr, BYTE byData ) +{ + BYTE byChrBank = byData & 0x0f; + BYTE byPrgBank = ( byData & 0x70 ) >> 4; + + /* Set ROM Banks */ + byPrgBank <<= 1; + byPrgBank %= ( NesHeader.byRomSize << 1 ); + + ROMBANK0 = ROMPAGE( byPrgBank ); + ROMBANK1 = ROMPAGE( byPrgBank + 1 ); + + /* Set PPU Banks */ + byChrBank <<= 3; + byChrBank %= ( NesHeader.byVRomSize << 3 ); + + PPUBANK[ 0 ] = VROMPAGE( byChrBank + 0 ); + PPUBANK[ 1 ] = VROMPAGE( byChrBank + 1 ); + PPUBANK[ 2 ] = VROMPAGE( byChrBank + 2 ); + PPUBANK[ 3 ] = VROMPAGE( byChrBank + 3 ); + PPUBANK[ 4 ] = VROMPAGE( byChrBank + 4 ); + PPUBANK[ 5 ] = VROMPAGE( byChrBank + 5 ); + PPUBANK[ 6 ] = VROMPAGE( byChrBank + 6 ); + PPUBANK[ 7 ] = VROMPAGE( byChrBank + 7 ); + InfoNES_SetupChr(); + + /* Name Table Mirroring */ + if ( byData & 0x80 ) + { + InfoNES_Mirroring( 2 ); + } else { + InfoNES_Mirroring( 3 ); + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_232.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_232.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_232.c (revision 0) @@ -0,0 +1,73 @@ +/*===================================================================*/ +/* */ +/* Mapper 232 : Quattro Games */ +/* */ +/*===================================================================*/ + +BYTE Map232_Regs[2]; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 232 */ +/*-------------------------------------------------------------------*/ +void Map232_Init() +{ + /* Initialize Mapper */ + MapperInit = Map232_Init; + + /* Write to Mapper */ + MapperWrite = Map232_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Initialize Registers */ + Map232_Regs[0] = 0x0C; + Map232_Regs[1] = 0x00; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 232 Write Function */ +/*-------------------------------------------------------------------*/ +void Map232_Write( WORD wAddr, BYTE byData ) +{ + if ( wAddr == 0x9000 ) { + Map232_Regs[0] = (byData & 0x18)>>1; + } else if ( 0xA000 <= wAddr /* && wAddr <= 0xFFFF */ ) { + Map232_Regs[1] = byData & 0x03; + } + + ROMBANK0= ROMPAGE((((Map232_Regs[0]|Map232_Regs[1])<<1)+0) % (NesHeader.byRomSize<<1)); + ROMBANK1= ROMPAGE((((Map232_Regs[0]|Map232_Regs[1])<<1)+1) % (NesHeader.byRomSize<<1)); + ROMBANK2= ROMPAGE((((Map232_Regs[0]|0x03)<<1)+0) % (NesHeader.byRomSize<<1)); + ROMBANK3= ROMPAGE((((Map232_Regs[0]|0x03)<<1)+1) % (NesHeader.byRomSize<<1)); +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_151.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_151.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_151.c (revision 0) @@ -0,0 +1,96 @@ +/*===================================================================*/ +/* */ +/* Mapper 151 (VSUnisystem) */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 151 */ +/*-------------------------------------------------------------------*/ +void Map151_Init() +{ + /* Initialize Mapper */ + MapperInit = Map151_Init; + + /* Write to Mapper */ + MapperWrite = Map151_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 151 Write Function */ +/*-------------------------------------------------------------------*/ +void Map151_Write( WORD wAddr, BYTE byData ) +{ + /* Set ROM Banks */ + switch( wAddr & 0xF000 ) + { + case 0x8000: + ROMBANK0 = ROMPAGE( byData % ( NesHeader.byRomSize << 1 ) ); + break; + + case 0xA000: + ROMBANK1 = ROMPAGE( byData % ( NesHeader.byRomSize << 1 ) ); + break; + + case 0xC000: + ROMBANK2 = ROMPAGE( byData % ( NesHeader.byRomSize << 1 ) ); + break; + + case 0xE000: + PPUBANK[ 0 ] = VROMPAGE( ( byData*4+0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( ( byData*4+1 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( ( byData*4+2 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( ( byData*4+3 ) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xF000: + PPUBANK[ 4 ] = VROMPAGE( ( byData*4+0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( ( byData*4+1 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE( ( byData*4+2 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( ( byData*4+3 ) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_134.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_134.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_134.c (revision 0) @@ -0,0 +1,113 @@ +/*===================================================================*/ +/* */ +/* Mapper 134 */ +/* */ +/*===================================================================*/ + +BYTE Map134_Cmd, Map134_Prg, Map134_Chr; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 134 */ +/*-------------------------------------------------------------------*/ +void Map134_Init() +{ + /* Initialize Mapper */ + MapperInit = Map134_Init; + + /* Write to Mapper */ + MapperWrite = Map0_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map134_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 134 Write to APU Function */ +/*-------------------------------------------------------------------*/ +void Map134_Apu( WORD wAddr, BYTE byData ) +{ + switch( wAddr & 0x4101 ) { + case 0x4100: + Map134_Cmd = byData & 0x07; + break; + case 0x4101: + switch( Map134_Cmd ) { + case 0: + Map134_Prg = 0; + Map134_Chr = 3; + break; + case 4: + Map134_Chr &= 0x3; + Map134_Chr |= (byData & 0x07) << 2; + break; + case 5: + Map134_Prg = byData & 0x07; + break; + case 6: + Map134_Chr &= 0x1C; + Map134_Chr |= byData & 0x3; + break; + case 7: + if( byData & 0x01 ) InfoNES_Mirroring( 0 ); + else InfoNES_Mirroring( 1 ); + break; + } + break; + } + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( ((Map134_Prg<<2) + 0 ) % (NesHeader.byRomSize << 1) ); + ROMBANK1 = ROMPAGE( ((Map134_Prg<<2) + 1 ) % (NesHeader.byRomSize << 1) ); + ROMBANK2 = ROMPAGE( ((Map134_Prg<<2) + 2 ) % (NesHeader.byRomSize << 1) ); + ROMBANK3 = ROMPAGE( ((Map134_Prg<<2) + 3 ) % (NesHeader.byRomSize << 1) ); + + /* Set PPU Banks */ + PPUBANK[ 0 ] = VROMPAGE( ((Map134_Chr<<3) + 0) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 1 ] = VROMPAGE( ((Map134_Chr<<3) + 1) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 2 ] = VROMPAGE( ((Map134_Chr<<3) + 2) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 3 ] = VROMPAGE( ((Map134_Chr<<3) + 3) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 4 ] = VROMPAGE( ((Map134_Chr<<3) + 4) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 5 ] = VROMPAGE( ((Map134_Chr<<3) + 5) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 6 ] = VROMPAGE( ((Map134_Chr<<3) + 6) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 7 ] = VROMPAGE( ((Map134_Chr<<3) + 7) % (NesHeader.byVRomSize << 3) ); + InfoNES_SetupChr(); + + //Map134_Wram[ wAddr & 0x1fff ] = byData; +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_117.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_117.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_117.c (revision 0) @@ -0,0 +1,167 @@ +/*===================================================================*/ +/* */ +/* Mapper 117 (PC-Future) */ +/* */ +/*===================================================================*/ + +BYTE Map117_IRQ_Line; +BYTE Map117_IRQ_Enable1; +BYTE Map117_IRQ_Enable2; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 117 */ +/*-------------------------------------------------------------------*/ +void Map117_Init() +{ + /* Initialize Mapper */ + MapperInit = Map117_Init; + + /* Write to Mapper */ + MapperWrite = Map117_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map117_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Initialize IRQ Registers */ + Map117_IRQ_Line = 0; + Map117_IRQ_Enable1 = 0; + Map117_IRQ_Enable2 = 1; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 117 Write Function */ +/*-------------------------------------------------------------------*/ +void Map117_Write( WORD wAddr, BYTE byData ) +{ + switch ( wAddr ) + { + + /* Set ROM Banks */ + case 0x8000: + byData %= ( NesHeader.byRomSize << 1 ); + ROMBANK0 = ROMPAGE( byData ); + break; + + case 0x8001: + byData %= ( NesHeader.byRomSize << 1 ); + ROMBANK1 = ROMPAGE( byData ); + break; + + case 0x8002: + byData %= ( NesHeader.byRomSize << 1 ); + ROMBANK2 = ROMPAGE( byData ); + break; + + /* Set PPU Banks */ + case 0xA000: + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 0 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0xA001: + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 1 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0xA002: + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 2 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0xA003: + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 3 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0xA004: + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 4 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0xA005: + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 5 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0xA006: + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 6 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0xA007: + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 7 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0xc001: + case 0xc002: + case 0xc003: + Map117_IRQ_Enable1 = Map117_IRQ_Line = byData; + break; + + case 0xe000: + Map117_IRQ_Enable2 = byData & 0x01; + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 117 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map117_HSync() +{ + if ( Map117_IRQ_Enable1 && Map117_IRQ_Enable2 ) + { + if ( Map117_IRQ_Line == PPU_Scanline ) + { + Map117_IRQ_Enable1 = 0x00; + IRQ_REQ; + } + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_019.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_019.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_019.c (revision 0) @@ -0,0 +1,315 @@ +/*===================================================================*/ +/* */ +/* Mapper 19 (Namcot 106) */ +/* */ +/*===================================================================*/ + +BYTE Map19_Chr_Ram[ 0x2000 ]; +BYTE Map19_Regs[ 2 ]; + +BYTE Map19_IRQ_Enable; +DWORD Map19_IRQ_Cnt; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 19 */ +/*-------------------------------------------------------------------*/ +void Map19_Init() +{ + /* Initialize Mapper */ + MapperInit = Map19_Init; + + /* Write to Mapper */ + MapperWrite = Map19_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map19_Apu; + + /* Read from APU */ + MapperReadApu = Map19_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map19_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + DWORD dwLastPage = (DWORD)NesHeader.byVRomSize << 3; + PPUBANK[ 0 ] = VROMPAGE( dwLastPage - 8 ); + PPUBANK[ 1 ] = VROMPAGE( dwLastPage - 7 ); + PPUBANK[ 2 ] = VROMPAGE( dwLastPage - 6 ); + PPUBANK[ 3 ] = VROMPAGE( dwLastPage - 5 ); + PPUBANK[ 4 ] = VROMPAGE( dwLastPage - 4 ); + PPUBANK[ 5 ] = VROMPAGE( dwLastPage - 3 ); + PPUBANK[ 6 ] = VROMPAGE( dwLastPage - 2 ); + PPUBANK[ 7 ] = VROMPAGE( dwLastPage - 1 ); + InfoNES_SetupChr(); + } + + /* Initialize State Register */ + Map19_Regs[ 0 ] = 0x00; + Map19_Regs[ 1 ] = 0x00; + Map19_Regs[ 2 ] = 0x00; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 19 Write Function */ +/*-------------------------------------------------------------------*/ +void Map19_Write( WORD wAddr, BYTE byData ) +{ + /* Set PPU Banks */ + switch ( wAddr & 0xf800 ) + { + case 0x8000: /* $8000-87ff */ + if ( byData < 0xe0 || Map19_Regs[ 0 ] == 1 ) + { + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 0 ] = VROMPAGE( byData ); + } else { + PPUBANK[ 0 ] = Map19_VROMPAGE( 0 ); + } + InfoNES_SetupChr(); + break; + + case 0x8800: /* $8800-8fff */ + if ( byData < 0xe0 || Map19_Regs[ 0 ] == 1 ) + { + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 1 ] = VROMPAGE( byData ); + } else { + PPUBANK[ 1 ] = Map19_VROMPAGE( 1 ); + } + InfoNES_SetupChr(); + break; + + case 0x9000: /* $9000-97ff */ + if ( byData < 0xe0 || Map19_Regs[ 0 ] == 1 ) + { + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 2 ] = VROMPAGE( byData ); + } else { + PPUBANK[ 2 ] = Map19_VROMPAGE( 2 ); + } + InfoNES_SetupChr(); + break; + + case 0x9800: /* $9800-9fff */ + if ( byData < 0xe0 || Map19_Regs[ 0 ] == 1 ) + { + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 3 ] = VROMPAGE( byData ); + } else { + PPUBANK[ 3 ] = Map19_VROMPAGE( 3 ); + } + InfoNES_SetupChr(); + break; + + case 0xa000: /* $a000-a7ff */ + if ( byData < 0xe0 || Map19_Regs[ 0 ] == 1 ) + { + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 4 ] = VROMPAGE( byData ); + } else { + PPUBANK[ 4 ] = Map19_VROMPAGE( 4 ); + } + InfoNES_SetupChr(); + break; + + case 0xa800: /* $a800-afff */ + if ( byData < 0xe0 || Map19_Regs[ 0 ] == 1 ) + { + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 5 ] = VROMPAGE( byData ); + } else { + PPUBANK[ 5 ] = Map19_VROMPAGE( 5 ); + } + InfoNES_SetupChr(); + break; + + case 0xb000: /* $b000-b7ff */ + if ( byData < 0xe0 || Map19_Regs[ 0 ] == 1 ) + { + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 6 ] = VROMPAGE( byData ); + } else { + PPUBANK[ 6 ] = Map19_VROMPAGE( 6 ); + } + InfoNES_SetupChr(); + break; + + case 0xb800: /* $b800-bfff */ + if ( byData < 0xe0 || Map19_Regs[ 0 ] == 1 ) + { + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 7 ] = VROMPAGE( byData ); + } else { + PPUBANK[ 7 ] = Map19_VROMPAGE( 7 ); + } + InfoNES_SetupChr(); + break; + + case 0xc000: /* $c000-c7ff */ + if ( byData < 0xe0 || Map19_Regs[ 0 ] == 1 ) + { + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ NAME_TABLE0 ] = VROMPAGE( byData ); + } else { + PPUBANK[ NAME_TABLE0 ] = VRAMPAGE( byData & 0x01 ); + } + break; + + case 0xc800: /* $c800-cfff */ + if ( byData < 0xe0 || Map19_Regs[ 0 ] == 1 ) + { + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ NAME_TABLE1 ] = VROMPAGE( byData ); + } else { + PPUBANK[ NAME_TABLE1 ] = VRAMPAGE( byData & 0x01 ); + } + break; + + case 0xd000: /* $d000-d7ff */ + if ( byData < 0xe0 || Map19_Regs[ 0 ] == 1 ) + { + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ NAME_TABLE2 ] = VROMPAGE( byData ); + } else { + PPUBANK[ NAME_TABLE2 ] = VRAMPAGE( byData & 0x01 ); + } + break; + + case 0xd800: /* $d800-dfff */ + if ( byData < 0xe0 || Map19_Regs[ 0 ] == 1 ) + { + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ NAME_TABLE3 ] = VROMPAGE( byData ); + } else { + PPUBANK[ NAME_TABLE3 ] = VRAMPAGE( byData & 0x01 ); + } + break; + + case 0xe000: /* $e000-e7ff */ + byData &= 0x3f; + byData %= ( NesHeader.byRomSize << 1 ); + ROMBANK0 = ROMPAGE( byData ); + break; + + case 0xe800: /* $e800-efff */ + Map19_Regs[ 0 ] = ( byData & 0x40 ) >> 6; + Map19_Regs[ 1 ] = ( byData & 0x80 ) >> 7; + + byData &= 0x3f; + byData %= ( NesHeader.byRomSize << 1 ); + ROMBANK1 = ROMPAGE( byData ); + break; + + case 0xf000: /* $f000-f7ff */ + byData &= 0x3f; + byData %= ( NesHeader.byRomSize << 1 ); + ROMBANK2 = ROMPAGE( byData ); + break; + + case 0xf800: /* $e800-efff */ + if ( wAddr == 0xf800 ) + { + // Extra Sound + } + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 19 Write to APU Function */ +/*-------------------------------------------------------------------*/ +void Map19_Apu( WORD wAddr, BYTE byData ) +{ + switch ( wAddr & 0xf800 ) + { + case 0x4800: + if ( wAddr == 0x4800 ) + { + // Extra Sound + } + break; + + case 0x5000: /* $5000-57ff */ + Map19_IRQ_Cnt = ( Map19_IRQ_Cnt & 0xff00 ) | byData; + break; + + case 0x5800: /* $5800-5fff */ + Map19_IRQ_Cnt = ( Map19_IRQ_Cnt & 0x00ff ) | ( (DWORD)( byData & 0x7f ) << 8 ); + Map19_IRQ_Enable = ( byData & 0x80 ) >> 7; + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 19 Read from APU Function */ +/*-------------------------------------------------------------------*/ +BYTE Map19_ReadApu( WORD wAddr ) +{ + switch ( wAddr & 0xf800 ) + { + case 0x4800: + if ( wAddr == 0x4800 ) + { + // Extra Sound + } + return (BYTE)( wAddr >> 8 ); + + case 0x5000: /* $5000-57ff */ + return (BYTE)(Map19_IRQ_Cnt & 0x00ff ); + + case 0x5800: /* $5800-5fff */ + return (BYTE)( (Map19_IRQ_Cnt & 0x7f00) >> 8 ); + + default: + return (BYTE)( wAddr >> 8 ); + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 19 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map19_HSync() +{ +/* + * Callback at HSync + * + */ + BYTE Map19_IRQ_Timing = 113; + + if ( Map19_IRQ_Enable ) + { + if ( Map19_IRQ_Cnt >= (DWORD)(0x7fff - Map19_IRQ_Timing) ) + { + Map19_IRQ_Cnt = 0x7fff; + IRQ_REQ; + } else { + Map19_IRQ_Cnt += Map19_IRQ_Timing; + } + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_091.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_091.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_091.c (revision 0) @@ -0,0 +1,104 @@ +/*===================================================================*/ +/* */ +/* Mapper 91 (Pirates) */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 91 */ +/*-------------------------------------------------------------------*/ +void Map91_Init() +{ + /* Initialize Mapper */ + MapperInit = Map91_Init; + + /* Write to Mapper */ + MapperWrite = Map0_Write; + + /* Write to SRAM */ + MapperSram = Map91_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMLASTPAGE( 1 ); + ROMBANK1 = ROMLASTPAGE( 0 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set Name Table Mirroring */ + InfoNES_Mirroring( 1 ); + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 91 Write to Sram Function */ +/*-------------------------------------------------------------------*/ +void Map91_Sram( WORD wAddr, BYTE byData ) +{ + switch( wAddr & 0xF00F) + { + /* Set PPU Banks */ + case 0x6000: + PPUBANK[ 0 ] = VROMPAGE( (byData*2+0) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( (byData*2+1) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0x6001: + PPUBANK[ 2 ] = VROMPAGE( (byData*2+0) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( (byData*2+1) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0x6002: + PPUBANK[ 4 ] = VROMPAGE( (byData*2+0) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( (byData*2+1) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0x6003: + PPUBANK[ 6 ] = VROMPAGE( (byData*2+0) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( (byData*2+1) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + /* Set CPU Banks */ + case 0x7000: + ROMBANK0 = ROMPAGE( byData % ( NesHeader.byRomSize << 1 ) ); + break; + + case 0x7001: + ROMBANK1 = ROMPAGE( byData % ( NesHeader.byRomSize << 1 ) ); + break; + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_074.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_074.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_074.c (revision 0) @@ -0,0 +1,344 @@ +/*===================================================================*/ +/* */ +/* Mapper 74 : Metal Max (Zhong Zhuang Ji Bing */ +/* */ +/*===================================================================*/ + +BYTE Map74_Regs[ 8 ]; +DWORD Map74_Rom_Bank; +DWORD Map74_Prg0, Map74_Prg1; +DWORD Map74_Chr01, Map74_Chr23; +DWORD Map74_Chr4, Map74_Chr5, Map74_Chr6, Map74_Chr7; + +#define Map74_Chr_Swap() ( Map74_Regs[ 0 ] & 0x80 ) +#define Map74_Prg_Swap() ( Map74_Regs[ 0 ] & 0x40 ) + +BYTE Map74_IRQ_Enable; +BYTE Map74_IRQ_Cnt; +BYTE Map74_IRQ_Latch; +BYTE Map74_IRQ_Request; +BYTE Map74_IRQ_Present; +BYTE Map74_IRQ_Present_Vbl; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 74 */ +/*-------------------------------------------------------------------*/ +void Map74_Init() +{ + /* Initialize Mapper */ + MapperInit = Map74_Init; + + /* Write to Mapper */ + MapperWrite = Map74_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map74_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Initialize State Registers */ + for ( int nPage = 0; nPage < 8; nPage++ ) + { + Map74_Regs[ nPage ] = 0x00; + } + + /* Set ROM Banks */ + Map74_Prg0 = 0; + Map74_Prg1 = 1; + Map74_Set_CPU_Banks(); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + Map74_Chr01 = 0; + Map74_Chr23 = 2; + Map74_Chr4 = 4; + Map74_Chr5 = 5; + Map74_Chr6 = 6; + Map74_Chr7 = 7; + Map74_Set_PPU_Banks(); + } else { + Map74_Chr01 = Map74_Chr23 = 0; + Map74_Chr4 = Map74_Chr5 = Map74_Chr6 = Map74_Chr7 = 0; + } + + /* Initialize IRQ Registers */ + Map74_IRQ_Enable = 0; + Map74_IRQ_Cnt = 0; + Map74_IRQ_Latch = 0; + Map74_IRQ_Request = 0; + Map74_IRQ_Present = 0; + Map74_IRQ_Present_Vbl = 0; + + /* VRAM Write Enabled */ + byVramWriteEnable = 1; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 74 Write Function */ +/*-------------------------------------------------------------------*/ +void Map74_Write( WORD wAddr, BYTE byData ) +{ + DWORD dwBankNum; + + switch ( wAddr & 0xe001 ) + { + case 0x8000: + Map74_Regs[ 0 ] = byData; + Map74_Set_PPU_Banks(); + Map74_Set_CPU_Banks(); + break; + + case 0x8001: + Map74_Regs[ 1 ] = byData; + dwBankNum = Map74_Regs[ 1 ]; + + switch ( Map74_Regs[ 0 ] & 0x07 ) + { + /* Set PPU Banks */ + case 0x00: + if ( NesHeader.byVRomSize > 0 ) + { + dwBankNum &= 0xfe; + Map74_Chr01 = dwBankNum; + Map74_Set_PPU_Banks(); + } + break; + + case 0x01: + if ( NesHeader.byVRomSize > 0 ) + { + dwBankNum &= 0xfe; + Map74_Chr23 = dwBankNum; + Map74_Set_PPU_Banks(); + } + break; + + case 0x02: + if ( NesHeader.byVRomSize > 0 ) + { + Map74_Chr4 = dwBankNum; + Map74_Set_PPU_Banks(); + } + break; + + case 0x03: + if ( NesHeader.byVRomSize > 0 ) + { + Map74_Chr5 = dwBankNum; + Map74_Set_PPU_Banks(); + } + break; + + case 0x04: + if ( NesHeader.byVRomSize > 0 ) + { + Map74_Chr6 = dwBankNum; + Map74_Set_PPU_Banks(); + } + break; + + case 0x05: + if ( NesHeader.byVRomSize > 0 ) + { + Map74_Chr7 = dwBankNum; + Map74_Set_PPU_Banks(); + } + break; + + /* Set ROM Banks */ + case 0x06: + Map74_Prg0 = dwBankNum; + Map74_Set_CPU_Banks(); + break; + + case 0x07: + Map74_Prg1 = dwBankNum; + Map74_Set_CPU_Banks(); + break; + } + break; + + case 0xa000: + Map74_Regs[ 2 ] = byData; + + if ( !ROM_FourScr ) + { + if ( byData & 0x01 ) + { + InfoNES_Mirroring( 0 ); + } else { + InfoNES_Mirroring( 1 ); + } + } + break; + + case 0xa001: + Map74_Regs[ 3 ] = byData; + break; + + case 0xc000: + Map74_Regs[ 4 ] = byData; + Map74_IRQ_Latch = byData; + break; + + case 0xc001: + Map74_Regs[ 5 ] = byData; + if ( PPU_Scanline < 240 ) + { + Map74_IRQ_Cnt |= 0x80; + Map74_IRQ_Present = 0xff; + } else { + Map74_IRQ_Cnt |= 0x80; + Map74_IRQ_Present_Vbl = 0xff; + Map74_IRQ_Present = 0; + } + break; + + case 0xe000: + Map74_Regs[ 6 ] = byData; + Map74_IRQ_Enable = 0; + Map74_IRQ_Request = 0; + break; + + case 0xe001: + Map74_Regs[ 7 ] = byData; + Map74_IRQ_Enable = 1; + Map74_IRQ_Request = 0; + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 74 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map74_HSync() +{ +/* + * Callback at HSync + * + */ + if ( ( /* 0 <= PPU_Scanline && */ PPU_Scanline <= 239 ) && + ( PPU_R1 & R1_SHOW_SCR || PPU_R1 & R1_SHOW_SP ) ) + { + if( Map74_IRQ_Present_Vbl ) { + Map74_IRQ_Cnt = Map74_IRQ_Latch; + Map74_IRQ_Present_Vbl = 0; + } + if( Map74_IRQ_Present ) { + Map74_IRQ_Cnt = Map74_IRQ_Latch; + Map74_IRQ_Present = 0; + } else if( Map74_IRQ_Cnt > 0 ) { + Map74_IRQ_Cnt--; + } + + if( Map74_IRQ_Cnt == 0 ) { + if( Map74_IRQ_Enable ) { + Map74_IRQ_Request = 0xFF; + } + Map74_IRQ_Present = 0xFF; + } + } + if( Map74_IRQ_Request ) { + IRQ_REQ; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 74 Set CPU Banks Function */ +/*-------------------------------------------------------------------*/ +void Map74_Set_CPU_Banks() +{ + if ( Map74_Prg_Swap() ) + { + ROMBANK0 = ROMLASTPAGE( 1 ); + ROMBANK1 = ROMPAGE( Map74_Prg1 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMPAGE( Map74_Prg0 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK3 = ROMLASTPAGE( 0 ); + } else { + ROMBANK0 = ROMPAGE( Map74_Prg0 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE( Map74_Prg1 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 74 Set PPU Banks Function */ +/*-------------------------------------------------------------------*/ +void Map74_Set_PPU_Banks() +{ + if ( NesHeader.byVRomSize > 0 ) + { + if ( Map74_Chr_Swap() ) + { + PPUBANK[ 0 ] = VROMPAGE( Map74_Chr4 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( Map74_Chr5 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( Map74_Chr6 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( Map74_Chr7 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 4 ] = VROMPAGE( ( Map74_Chr01 + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( ( Map74_Chr01 + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE( ( Map74_Chr23 + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( ( Map74_Chr23 + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + } else { + PPUBANK[ 0 ] = VROMPAGE( ( Map74_Chr01 + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( ( Map74_Chr01 + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( ( Map74_Chr23 + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( ( Map74_Chr23 + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 4 ] = VROMPAGE( Map74_Chr4 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( Map74_Chr5 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE( Map74_Chr6 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( Map74_Chr7 % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + } + } + else + { + if ( Map74_Chr_Swap() ) + { + PPUBANK[ 0 ] = CRAMPAGE( 0 ); + PPUBANK[ 1 ] = CRAMPAGE( 1 ); + PPUBANK[ 2 ] = CRAMPAGE( 2 ); + PPUBANK[ 3 ] = CRAMPAGE( 3 ); + PPUBANK[ 4 ] = CRAMPAGE( 4 ); + PPUBANK[ 5 ] = CRAMPAGE( 5 ); + PPUBANK[ 6 ] = CRAMPAGE( 6 ); + PPUBANK[ 7 ] = CRAMPAGE( 7 ); + InfoNES_SetupChr(); + } else { + PPUBANK[ 0 ] = CRAMPAGE( 0 ); + PPUBANK[ 1 ] = CRAMPAGE( 1 ); + PPUBANK[ 2 ] = CRAMPAGE( 2 ); + PPUBANK[ 3 ] = CRAMPAGE( 3 ); + PPUBANK[ 4 ] = CRAMPAGE( 4 ); + PPUBANK[ 5 ] = CRAMPAGE( 5 ); + PPUBANK[ 6 ] = CRAMPAGE( 6 ); + PPUBANK[ 7 ] = CRAMPAGE( 7 ); + InfoNES_SetupChr(); + } + } +} + Index: apps/plugins/infones/mapper/InfoNES_Mapper_236.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_236.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_236.c (revision 0) @@ -0,0 +1,105 @@ +/*===================================================================*/ +/* */ +/* Mapper 236 : 800-in-1 */ +/* */ +/*===================================================================*/ + +BYTE Map236_Bank, Map236_Mode; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 236 */ +/*-------------------------------------------------------------------*/ +void Map236_Init() +{ + /* Initialize Mapper */ + MapperInit = Map236_Init; + + /* Write to Mapper */ + MapperWrite = Map236_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set Registers */ + Map236_Bank = Map236_Mode = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 236 Write Function */ +/*-------------------------------------------------------------------*/ +void Map236_Write( WORD wAddr, BYTE byData ) +{ + if( wAddr >= 0x8000 && wAddr <= 0xBFFF ) { + Map236_Bank = ((wAddr&0x03)<<4)|(Map236_Bank&0x07); + } else { + Map236_Bank = (wAddr&0x07)|(Map236_Bank&0x30); + Map236_Mode = wAddr&0x30; + } + + if( wAddr & 0x20 ) { + InfoNES_Mirroring( 0 ); + } else { + InfoNES_Mirroring( 1 ); + } + + switch( Map236_Mode ) { + case 0x00: + Map236_Bank |= 0x08; + ROMBANK0 = ROMPAGE(((Map236_Bank<<1)+0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE(((Map236_Bank<<1)+1) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE((((Map236_Bank|0x07)<<1)+0) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE((((Map236_Bank|0x07)<<1)+1) % (NesHeader.byRomSize<<1)); + break; + case 0x10: + Map236_Bank |= 0x37; + ROMBANK0 = ROMPAGE(((Map236_Bank<<1)+0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE(((Map236_Bank<<1)+1) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE((((Map236_Bank|0x07)<<1)+0) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE((((Map236_Bank|0x07)<<1)+1) % (NesHeader.byRomSize<<1)); + break; + case 0x20: + Map236_Bank |= 0x08; + ROMBANK0 = ROMPAGE((((Map236_Bank&0xFE)<<1)+0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE((((Map236_Bank&0xFE)<<1)+1) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE((((Map236_Bank&0xFE)<<1)+2) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE((((Map236_Bank&0xFE)<<1)+3) % (NesHeader.byRomSize<<1)); + break; + case 0x30: + Map236_Bank |= 0x08; + ROMBANK0 = ROMPAGE(((Map236_Bank<<1)+0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE(((Map236_Bank<<1)+1) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE(((Map236_Bank<<1)+0) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE(((Map236_Bank<<1)+1) % (NesHeader.byRomSize<<1)); + break; + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_057.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_057.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_057.c (revision 0) @@ -0,0 +1,123 @@ +/*===================================================================*/ +/* */ +/* Mapper 57 */ +/* */ +/*===================================================================*/ + +BYTE Map57_Reg; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 57 */ +/*-------------------------------------------------------------------*/ +void Map57_Init() +{ + /* Initialize Mapper */ + MapperInit = Map57_Init; + + /* Write to Mapper */ + MapperWrite = Map57_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 0 ); + ROMBANK3 = ROMPAGE( 1 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set Registers */ + Map57_Reg = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 57 Write Function */ +/*-------------------------------------------------------------------*/ +void Map57_Write( WORD wAddr, BYTE byData ) +{ + BYTE byChr; + + switch( wAddr ) { + case 0x8000: + case 0x8001: + case 0x8002: + case 0x8003: + if( byData & 0x40 ) { + byChr = (byData&0x03)+((Map57_Reg&0x10)>>1)+(Map57_Reg&0x07); + + PPUBANK[ 0 ] = VROMPAGE(((byChr<<3)+0) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 1 ] = VROMPAGE(((byChr<<3)+1) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 2 ] = VROMPAGE(((byChr<<3)+2) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 3 ] = VROMPAGE(((byChr<<3)+3) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 4 ] = VROMPAGE(((byChr<<3)+4) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 5 ] = VROMPAGE(((byChr<<3)+5) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 6 ] = VROMPAGE(((byChr<<3)+6) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 7 ] = VROMPAGE(((byChr<<3)+7) % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + } + break; + case 0x8800: + Map57_Reg = byData; + + if( byData & 0x80 ) { + ROMBANK0 = ROMPAGE((((byData & 0x40)>>6)*4+8+0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE((((byData & 0x40)>>6)*4+8+1) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE((((byData & 0x40)>>6)*4+8+2) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE((((byData & 0x40)>>6)*4+8+3) % (NesHeader.byRomSize<<1)); + } else { + ROMBANK0 = ROMPAGE((((byData & 0x60)>>5)*2+0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE((((byData & 0x60)>>5)*2+1) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE((((byData & 0x60)>>5)*2+0) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE((((byData & 0x60)>>5)*2+1) % (NesHeader.byRomSize<<1)); + } + + byChr = (byData&0x07)+((byData&0x10)>>1); + + PPUBANK[ 0 ] = VROMPAGE(((byChr<<3)+0) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 1 ] = VROMPAGE(((byChr<<3)+1) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 2 ] = VROMPAGE(((byChr<<3)+2) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 3 ] = VROMPAGE(((byChr<<3)+3) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 4 ] = VROMPAGE(((byChr<<3)+4) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 5 ] = VROMPAGE(((byChr<<3)+5) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 6 ] = VROMPAGE(((byChr<<3)+6) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 7 ] = VROMPAGE(((byChr<<3)+7) % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + + if( byData & 0x08 ) InfoNES_Mirroring( 0 ); + else InfoNES_Mirroring( 1 ); + + break; + } +} + Index: apps/plugins/infones/mapper/InfoNES_Mapper_193.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_193.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_193.c (revision 0) @@ -0,0 +1,89 @@ +/*===================================================================*/ +/* */ +/* Mapper 193 : MEGA SOFT (NTDEC) : Fighting Hero */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 193 */ +/*-------------------------------------------------------------------*/ +void Map193_Init() +{ + /* Initialize Mapper */ + MapperInit = Map193_Init; + + /* Write to Mapper */ + MapperWrite = Map0_Write; + + /* Write to SRAM */ + MapperSram = Map193_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( (NesHeader.byRomSize<<1) - 4 ); + ROMBANK1 = ROMPAGE( (NesHeader.byRomSize<<1) - 3 ); + ROMBANK2 = ROMPAGE( (NesHeader.byRomSize<<1) - 2 ); + ROMBANK3 = ROMPAGE( (NesHeader.byRomSize<<1) - 1 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 193 Write to SRAM Function */ +/*-------------------------------------------------------------------*/ +void Map193_Sram( WORD wAddr, BYTE byData ) +{ + switch( wAddr ) { + case 0x6000: + PPUBANK[ 0 ] = VROMPAGE( ((byData&0xfc) + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( ((byData&0xfc) + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( ((byData&0xfc) + 2 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( ((byData&0xfc) + 3 ) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + case 0x6001: + PPUBANK[ 4 ] = VROMPAGE( ( byData + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( ( byData + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + case 0x6002: + PPUBANK[ 6 ] = VROMPAGE( ( byData + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( ( byData + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + case 0x6003: + ROMBANK0 = ROMPAGE( ((byData<<2) + 0 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE( ((byData<<2) + 1 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMPAGE( ((byData<<2) + 2 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK3 = ROMPAGE( ((byData<<2) + 3 ) % ( NesHeader.byRomSize << 1 ) ); + break; + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_095.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_095.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_095.c (revision 0) @@ -0,0 +1,223 @@ +/*===================================================================*/ +/* */ +/* Mapper 95 (Namco 1??) */ +/* */ +/*===================================================================*/ + +BYTE Map95_Regs[ 1 ]; +DWORD Map95_Prg0, Map95_Prg1; +DWORD Map95_Chr01, Map95_Chr23; +DWORD Map95_Chr4, Map95_Chr5, Map95_Chr6, Map95_Chr7; + +#define Map95_Chr_Swap() ( Map95_Regs[ 0 ] & 0x80 ) +#define Map95_Prg_Swap() ( Map95_Regs[ 0 ] & 0x40 ) + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 95 */ +/*-------------------------------------------------------------------*/ +void Map95_Init() +{ + /* Initialize Mapper */ + MapperInit = Map95_Init; + + /* Write to Mapper */ + MapperWrite = Map95_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Initialize State Registers */ + Map95_Regs[ 0 ] = 0; + + /* Set ROM Banks */ + Map95_Prg0 = 0; + Map95_Prg1 = 1; + Map95_Set_CPU_Banks(); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + Map95_Chr01 = 0; + Map95_Chr23 = 2; + Map95_Chr4 = 4; + Map95_Chr5 = 5; + Map95_Chr6 = 6; + Map95_Chr7 = 7; + Map95_Set_PPU_Banks(); + } else { + Map95_Chr01 = Map95_Chr23 = 0; + Map95_Chr4 = Map95_Chr5 = Map95_Chr6 = Map95_Chr7 = 0; + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 95 Write Function */ +/*-------------------------------------------------------------------*/ +void Map95_Write( WORD wAddr, BYTE byData ) +{ + DWORD dwBankNum; + + switch ( wAddr & 0xe001 ) + { + case 0x8000: + Map95_Regs[ 0 ] = byData; + Map95_Set_PPU_Banks(); + Map95_Set_CPU_Banks(); + break; + + case 0x8001: + if ( Map95_Regs[ 0 ] <= 0x05 ) + { + if ( byData & 0x20 ) + { + InfoNES_Mirroring( 2 ); + } else { + InfoNES_Mirroring( 3 ); + } + byData &= 0x1f; + } + + dwBankNum = byData; + + switch ( Map95_Regs[ 0 ] & 0x07 ) + { + /* Set PPU Banks */ + case 0x00: + if ( NesHeader.byVRomSize > 0 ) + { + dwBankNum &= 0xfe; + Map95_Chr01 = dwBankNum; + Map95_Set_PPU_Banks(); + } + break; + + case 0x01: + if ( NesHeader.byVRomSize > 0 ) + { + dwBankNum &= 0xfe; + Map95_Chr23 = dwBankNum; + Map95_Set_PPU_Banks(); + } + break; + + case 0x02: + if ( NesHeader.byVRomSize > 0 ) + { + Map95_Chr4 = dwBankNum; + Map95_Set_PPU_Banks(); + } + break; + + case 0x03: + if ( NesHeader.byVRomSize > 0 ) + { + Map95_Chr5 = dwBankNum; + Map95_Set_PPU_Banks(); + } + break; + + case 0x04: + if ( NesHeader.byVRomSize > 0 ) + { + Map95_Chr6 = dwBankNum; + Map95_Set_PPU_Banks(); + } + break; + + case 0x05: + if ( NesHeader.byVRomSize > 0 ) + { + Map95_Chr7 = dwBankNum; + Map95_Set_PPU_Banks(); + } + break; + + /* Set ROM Banks */ + case 0x06: + Map95_Prg0 = dwBankNum; + Map95_Set_CPU_Banks(); + break; + + case 0x07: + Map95_Prg1 = dwBankNum; + Map95_Set_CPU_Banks(); + break; + } + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 95 Set CPU Banks Function */ +/*-------------------------------------------------------------------*/ +void Map95_Set_CPU_Banks() +{ + if ( Map95_Prg_Swap() ) + { + ROMBANK0 = ROMLASTPAGE( 1 ); + ROMBANK1 = ROMPAGE( Map95_Prg1 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMPAGE( Map95_Prg0 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK3 = ROMLASTPAGE( 0 ); + } else { + ROMBANK0 = ROMPAGE( Map95_Prg0 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE( Map95_Prg1 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 95 Set PPU Banks Function */ +/*-------------------------------------------------------------------*/ +void Map95_Set_PPU_Banks() +{ + if ( NesHeader.byVRomSize > 0 ) + { + if ( Map95_Chr_Swap() ) + { + PPUBANK[ 0 ] = VROMPAGE( Map95_Chr4 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( Map95_Chr5 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( Map95_Chr6 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( Map95_Chr7 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 4 ] = VROMPAGE( ( Map95_Chr01 + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( ( Map95_Chr01 + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE( ( Map95_Chr23 + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( ( Map95_Chr23 + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + } else { + PPUBANK[ 0 ] = VROMPAGE( ( Map95_Chr01 + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( ( Map95_Chr01 + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( ( Map95_Chr23 + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( ( Map95_Chr23 + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 4 ] = VROMPAGE( Map95_Chr4 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( Map95_Chr5 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE( Map95_Chr6 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( Map95_Chr7 % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + } + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_078.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_078.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_078.c (revision 0) @@ -0,0 +1,97 @@ +/*===================================================================*/ +/* */ +/* Mapper 78 (74161/32 Irem) */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 78 */ +/*-------------------------------------------------------------------*/ +void Map78_Init() +{ + /* Initialize Mapper */ + MapperInit = Map78_Init; + + /* Write to Mapper */ + MapperWrite = Map78_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 78 Write Function */ +/*-------------------------------------------------------------------*/ +void Map78_Write( WORD wAddr, BYTE byData ) +{ + BYTE byPrgBank = byData & 0x0f; + BYTE byChrBank = ( byData & 0xf0 ) >> 4; + + /* Set ROM Banks */ + byPrgBank <<= 1; + byPrgBank %= ( NesHeader.byRomSize << 1 ); + ROMBANK0 = ROMPAGE( byPrgBank ); + ROMBANK1 = ROMPAGE( byPrgBank + 1); + + /* Set PPU Banks */ + byChrBank <<= 3; + byChrBank %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 0 ] = VROMPAGE( byChrBank ); + PPUBANK[ 1 ] = VROMPAGE( byChrBank + 1 ); + PPUBANK[ 2 ] = VROMPAGE( byChrBank + 2 ); + PPUBANK[ 3 ] = VROMPAGE( byChrBank + 3 ); + PPUBANK[ 4 ] = VROMPAGE( byChrBank + 4 ); + PPUBANK[ 5 ] = VROMPAGE( byChrBank + 5 ); + PPUBANK[ 6 ] = VROMPAGE( byChrBank + 6 ); + PPUBANK[ 7 ] = VROMPAGE( byChrBank + 7 ); + InfoNES_SetupChr(); + + /* Set Name Table Mirroring */ + if ( ( wAddr & 0xfe00 ) != 0xfe00 ) + { + if ( byData & 0x08 ) + { + InfoNES_Mirroring( 2 ); + } else { + InfoNES_Mirroring( 3 ); + } + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_099.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_099.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_099.c (revision 0) @@ -0,0 +1,122 @@ +/*===================================================================*/ +/* */ +/* Mapper 099 VS-Unisystem */ +/* */ +/*===================================================================*/ + +BYTE Map99_Coin; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 099 */ +/*-------------------------------------------------------------------*/ +void Map99_Init() +{ + /* Initialize Mapper */ + MapperInit = Map99_Init; + + /* Write to Mapper */ + MapperWrite = Map0_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map99_Apu; + + /* Read from APU */ + MapperReadApu = Map99_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + if ( NesHeader.byRomSize > 1 ) + { + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + } + else if ( NesHeader.byRomSize > 0 ) + { + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 0 ); + ROMBANK3 = ROMPAGE( 1 ); + } else { + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 0 ); + ROMBANK2 = ROMPAGE( 0 ); + ROMBANK3 = ROMPAGE( 0 ); + } + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + Map99_Coin = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 99 Write to APU Function */ +/*-------------------------------------------------------------------*/ +void Map99_Apu( WORD wAddr, BYTE byData ) +{ + if( wAddr == 0x4016 ) { + if( byData & 0x04 ) { + PPUBANK[ 0 ] = VROMPAGE( 8 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( 9 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( 10 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( 11 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 4 ] = VROMPAGE( 12 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( 13 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE( 14 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( 15 % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + } else { + PPUBANK[ 0 ] = VROMPAGE( 0 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( 1 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( 2 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( 3 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 4 ] = VROMPAGE( 4 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( 5 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE( 6 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( 7 % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + } + } + + if( wAddr == 0x4020 ) { + Map99_Coin = byData; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 99 Read from APU Function */ +/*-------------------------------------------------------------------*/ +BYTE Map99_ReadApu( WORD wAddr ) +{ + if( wAddr == 0x4020 ) { + return Map99_Coin; + } + return ( wAddr >> 8 ); +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_101.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_101.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_101.c (revision 0) @@ -0,0 +1,79 @@ +/*===================================================================*/ +/* */ +/* Mapper 101 () */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 101 */ +/*-------------------------------------------------------------------*/ +void Map101_Init() +{ + /* Initialize Mapper */ + MapperInit = Map101_Init; + + /* Write to Mapper */ + MapperWrite = Map101_Write; + + /* Write to SRAM */ + MapperSram = Map101_Write; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 101 Write & Write to SRAM Function */ +/*-------------------------------------------------------------------*/ +void Map101_Write( WORD wAddr, BYTE byData ) +{ + byData &= 0x03; + byData <<= 3; + byData %= ( NesHeader.byVRomSize << 3 ); + + /* Set PPU Banks */ + PPUBANK[ 0 ] = VROMPAGE( byData ); + PPUBANK[ 1 ] = VROMPAGE( byData + 1 ); + PPUBANK[ 2 ] = VROMPAGE( byData + 2 ); + PPUBANK[ 3 ] = VROMPAGE( byData + 3 ); + PPUBANK[ 4 ] = VROMPAGE( byData + 4 ); + PPUBANK[ 5 ] = VROMPAGE( byData + 5 ); + PPUBANK[ 6 ] = VROMPAGE( byData + 6 ); + PPUBANK[ 7 ] = VROMPAGE( byData + 7 ); + InfoNES_SetupChr(); +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_003.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_003.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_003.c (revision 0) @@ -0,0 +1,94 @@ +/*===================================================================*/ +/* */ +/* Mapper 3 (VROM Switch) */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 3 */ +/*-------------------------------------------------------------------*/ +void Map3_Init() +{ + int nPage; + + /* Initialize Mapper */ + MapperInit = Map3_Init; + + /* Write to Mapper */ + MapperWrite = Map3_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + if ( ( NesHeader.byRomSize << 1 ) > 2 ) + { + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + } else { + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 0 ); + ROMBANK3 = ROMPAGE( 1 ); + } + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( nPage = 0; nPage < 8; ++nPage ) + { + PPUBANK[ nPage ] = VROMPAGE( nPage ); + } + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + /* "DragonQuest" doesn't run if IRQ isn't made to occur in CLI */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 3 Write Function */ +/*-------------------------------------------------------------------*/ +void Map3_Write( WORD wAddr, BYTE byData ) +{ + DWORD dwBase; + + /* Set PPU Banks */ + byData %= NesHeader.byVRomSize; + dwBase = ( (DWORD)byData ) << 3; + + PPUBANK[ 0 ] = VROMPAGE( dwBase + 0 ); + PPUBANK[ 1 ] = VROMPAGE( dwBase + 1 ); + PPUBANK[ 2 ] = VROMPAGE( dwBase + 2 ); + PPUBANK[ 3 ] = VROMPAGE( dwBase + 3 ); + PPUBANK[ 4 ] = VROMPAGE( dwBase + 4 ); + PPUBANK[ 5 ] = VROMPAGE( dwBase + 5 ); + PPUBANK[ 6 ] = VROMPAGE( dwBase + 6 ); + PPUBANK[ 7 ] = VROMPAGE( dwBase + 7 ); + + InfoNES_SetupChr(); +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_041.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_041.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_041.c (revision 0) @@ -0,0 +1,120 @@ +/*===================================================================*/ +/* */ +/* Mapper 41 () */ +/* */ +/*===================================================================*/ + +BYTE Map41_Regs[ 2 ]; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 41 */ +/*-------------------------------------------------------------------*/ +void Map41_Init() +{ + /* Initialize Mapper */ + MapperInit = Map41_Init; + + /* Write to Mapper */ + MapperWrite = Map41_Write; + + /* Write to SRAM */ + MapperSram = Map41_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 41 Write Function */ +/*-------------------------------------------------------------------*/ +void Map41_Write( WORD wAddr, BYTE byData ) +{ + /* Set PPU Banks */ + if ( Map41_Regs[ 0 ] ) + { + BYTE byChrBank; + + byChrBank = Map41_Regs[ 1 ] | ( byData & 0x0003 ); + byChrBank <<= 3; + byChrBank %= ( NesHeader.byVRomSize << 3 ); + + PPUBANK[ 0 ] = VROMPAGE( byChrBank ); + PPUBANK[ 1 ] = VROMPAGE( byChrBank + 1 ); + PPUBANK[ 2 ] = VROMPAGE( byChrBank + 2 ); + PPUBANK[ 3 ] = VROMPAGE( byChrBank + 3 ); + PPUBANK[ 4 ] = VROMPAGE( byChrBank + 4 ); + PPUBANK[ 5 ] = VROMPAGE( byChrBank + 5 ); + PPUBANK[ 6 ] = VROMPAGE( byChrBank + 6 ); + PPUBANK[ 7 ] = VROMPAGE( byChrBank + 7 ); + + InfoNES_SetupChr(); + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 41 Write to SRAM Function */ +/*-------------------------------------------------------------------*/ +void Map41_Sram( WORD wAddr, BYTE byData ) +{ + BYTE byBank; + + if ( wAddr < 0x6800 ) + { + byData = ( BYTE )( wAddr & 0xff ); + + /* Set CPU Banks */ + byBank = ( byData & 0x07 ) << 2; + byBank %= ( NesHeader.byRomSize << 1 ); + + ROMBANK0 = ROMPAGE( byBank ); + ROMBANK1 = ROMPAGE( byBank + 1 ); + ROMBANK2 = ROMPAGE( byBank + 2 ); + ROMBANK3 = ROMPAGE( byBank + 3 ); + + Map41_Regs[ 0 ] = ( byData & 0x04 ); + Map41_Regs[ 1 ] = ( byData & 0x18 ) >> 1; + + /* Name Table Mirroring */ + if ( byData & 0x20 ) + { + InfoNES_Mirroring( 0 ); /* Horizontal */ + } else { + InfoNES_Mirroring( 1 ); /* Vertical */ + } + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_122.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_122.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_122.c (revision 0) @@ -0,0 +1,75 @@ +/*===================================================================*/ +/* */ +/* Mapper 122 (Sunsoft) */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 122 */ +/*-------------------------------------------------------------------*/ +void Map122_Init() +{ + /* Initialize Mapper */ + MapperInit = Map122_Init; + + /* Write to Mapper */ + MapperWrite = Map0_Write; + + /* Write to SRAM */ + MapperSram = Map122_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 122 Write to Sram Function */ +/*-------------------------------------------------------------------*/ +void Map122_Sram( WORD wAddr, BYTE byData ) +{ + if ( wAddr == 0x6000 ) + { + BYTE byChrBank0 = byData & 0x07; + BYTE byChrBank1 = ( byData & 0x70 ) >> 4; + + byChrBank0 = ( byChrBank0 << 2 ) % ( NesHeader.byVRomSize << 3 ); + byChrBank1 = ( byChrBank1 << 2 ) % ( NesHeader.byVRomSize << 3 ); + + PPUBANK[ 0 ] = VROMPAGE( byChrBank0 + 0 ); + PPUBANK[ 1 ] = VROMPAGE( byChrBank0 + 1 ); + PPUBANK[ 2 ] = VROMPAGE( byChrBank0 + 2 ); + PPUBANK[ 3 ] = VROMPAGE( byChrBank0 + 3 ); + PPUBANK[ 4 ] = VROMPAGE( byChrBank1 + 0 ); + PPUBANK[ 5 ] = VROMPAGE( byChrBank1 + 1 ); + PPUBANK[ 6 ] = VROMPAGE( byChrBank1 + 2 ); + PPUBANK[ 7 ] = VROMPAGE( byChrBank1 + 3 ); + InfoNES_SetupChr(); + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_024.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_024.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_024.c (revision 0) @@ -0,0 +1,178 @@ +/*===================================================================*/ +/* */ +/* Mapper 24 (Konami VRC6) */ +/* */ +/*===================================================================*/ + +BYTE Map24_IRQ_Count; +BYTE Map24_IRQ_State; +BYTE Map24_IRQ_Latch; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 24 */ +/*-------------------------------------------------------------------*/ +void Map24_Init() +{ + /* Initialize Mapper */ + MapperInit = Map24_Init; + + /* Write to Mapper */ + MapperWrite = Map24_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map24_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 24 Write Function */ +/*-------------------------------------------------------------------*/ +void Map24_Write( WORD wAddr, BYTE byData ) +{ + switch ( wAddr ) + { + case 0x8000: + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( ( byData + 0 ) % ( NesHeader.byRomSize << 1) ); + ROMBANK1 = ROMPAGE( ( byData + 1 ) % ( NesHeader.byRomSize << 1) ); + break; + + case 0xb003: + /* Name Table Mirroring */ + switch ( byData & 0x0c ) + { + case 0x00: + InfoNES_Mirroring( 1 ); /* Vertical */ + break; + case 0x04: + InfoNES_Mirroring( 0 ); /* Horizontal */ + break; + case 0x08: + InfoNES_Mirroring( 3 ); /* One Screen 0x2000 */ + break; + case 0x0c: + InfoNES_Mirroring( 2 ); /* One Screen 0x2400 */ + break; + } + break; + + case 0xC000: + ROMBANK2 = ROMPAGE( byData % ( NesHeader.byRomSize << 1) ); + break; + + case 0xD000: + PPUBANK[ 0 ] = VROMPAGE( byData % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xD001: + PPUBANK[ 1 ] = VROMPAGE( byData % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xD002: + PPUBANK[ 2 ] = VROMPAGE( byData % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xD003: + PPUBANK[ 3 ] = VROMPAGE( byData % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xE000: + PPUBANK[ 4 ] = VROMPAGE( byData % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xE001: + PPUBANK[ 5 ] = VROMPAGE( byData % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xE002: + PPUBANK[ 6 ] = VROMPAGE( byData % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xE003: + PPUBANK[ 7 ] = VROMPAGE( byData % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xF000: + Map24_IRQ_Latch = byData; + break; + + case 0xF001: + Map24_IRQ_State = byData & 0x03; + if(Map24_IRQ_State & 0x02) + { + Map24_IRQ_Count = Map24_IRQ_Latch; + } + break; + + case 0xF002: + if(Map24_IRQ_State & 0x01) + { + Map24_IRQ_State |= 0x02; + } + else + { + Map24_IRQ_State &= 0x01; + } + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 24 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map24_HSync() +{ +/* + * Callback at HSync + * + */ + if(Map24_IRQ_State & 0x02) + { + if(Map24_IRQ_Count == 0xFF) + { + IRQ_REQ; + Map24_IRQ_Count = Map24_IRQ_Latch; + } + else + { + Map24_IRQ_Count++; + } + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_105.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_105.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_105.c (revision 0) @@ -0,0 +1,167 @@ +/*===================================================================*/ +/* */ +/* Mapper 105 : Nintendo World Championship */ +/* */ +/*===================================================================*/ + +BYTE Map105_Init_State; +BYTE Map105_Write_Count; +BYTE Map105_Bits; +BYTE Map105_Reg[4]; + +BYTE Map105_IRQ_Enable; +int Map105_IRQ_Counter; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 105 */ +/*-------------------------------------------------------------------*/ +void Map105_Init() +{ + /* Initialize Mapper */ + MapperInit = Map105_Init; + + /* Write to Mapper */ + MapperWrite = Map105_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map105_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + + /* Set PPU Banks */ + Map105_Reg[0] = 0x0C; + Map105_Reg[1] = 0x00; + Map105_Reg[2] = 0x00; + Map105_Reg[3] = 0x10; + + Map105_Bits = 0; + Map105_Write_Count = 0; + + Map105_IRQ_Counter = 0; + Map105_IRQ_Enable = 0; + Map105_Init_State = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 105 Write Function */ +/*-------------------------------------------------------------------*/ +void Map105_Write( WORD wAddr, BYTE byData ) +{ + WORD reg_num = (wAddr & 0x7FFF) >> 13; + + if( byData & 0x80 ) { + Map105_Bits = Map105_Write_Count = 0; + if( reg_num == 0 ) { + Map105_Reg[reg_num] |= 0x0C; + } + } else { + Map105_Bits |= (byData & 1) << Map105_Write_Count++; + if( Map105_Write_Count == 5) { + Map105_Reg[reg_num] = Map105_Bits & 0x1F; + Map105_Bits = Map105_Write_Count = 0; + } + } + + if( Map105_Reg[0] & 0x02 ) { + if( Map105_Reg[0] & 0x01 ) { + InfoNES_Mirroring( 0 ); + } else { + InfoNES_Mirroring( 1 ); + } + } else { + if( Map105_Reg[0] & 0x01 ) { + InfoNES_Mirroring( 3 ); + } else { + InfoNES_Mirroring( 2 ); + } + } + + switch( Map105_Init_State ) { + case 0: + case 1: + Map105_Init_State++; + break; + + case 2: + if(Map105_Reg[1] & 0x08) { + if (Map105_Reg[0] & 0x08) { + if (Map105_Reg[0] & 0x04) { + ROMBANK0 = ROMPAGE( ((Map105_Reg[3] & 0x07) * 2 + 16) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE( ((Map105_Reg[3] & 0x07) * 2 + 17) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMPAGE( 30 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK3 = ROMPAGE( 31 % ( NesHeader.byRomSize << 1 ) ); + } else { + ROMBANK0 = ROMPAGE( 16 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE( 17 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMPAGE( ((Map105_Reg[3] & 0x07) * 2 + 16) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK3 = ROMPAGE( ((Map105_Reg[3] & 0x07) * 2 + 17) % ( NesHeader.byRomSize << 1 ) ); + } + } else { + ROMBANK0 = ROMPAGE( ((Map105_Reg[3] & 0x06) * 2 + 16) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE( ((Map105_Reg[3] & 0x06) * 2 + 17) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMPAGE( ((Map105_Reg[3] & 0x06) * 2 + 18) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK3 = ROMPAGE( ((Map105_Reg[3] & 0x06) * 2 + 19) % ( NesHeader.byRomSize << 1 ) ); + } + } else { + ROMBANK0 = ROMPAGE( ((Map105_Reg[1] & 0x06) * 2 + 0) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE( ((Map105_Reg[1] & 0x06) * 2 + 1) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMPAGE( ((Map105_Reg[1] & 0x06) * 2 + 2) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK3 = ROMPAGE( ((Map105_Reg[1] & 0x06) * 2 + 3) % ( NesHeader.byRomSize << 1 ) ); + } + + if( Map105_Reg[1] & 0x10 ) { + Map105_IRQ_Counter = 0; + Map105_IRQ_Enable = 0; + } else { + Map105_IRQ_Enable = 1; + } + break; + + default: + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 105 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map105_HSync() +{ + if( !PPU_Scanline ) { + if( Map105_IRQ_Enable ) { + Map105_IRQ_Counter += 29781; + } + if( ((Map105_IRQ_Counter | 0x21FFFFFF) & 0x3E000000) == 0x3E000000 ) { + IRQ_REQ; + } + } +} + Index: apps/plugins/infones/mapper/InfoNES_Mapper_241.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_241.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_241.c (revision 0) @@ -0,0 +1,71 @@ +/*===================================================================*/ +/* */ +/* Mapper 241 : Fon Serm Bon */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 241 */ +/*-------------------------------------------------------------------*/ +void Map241_Init() +{ + /* Initialize Mapper */ + MapperInit = Map241_Init; + + /* Write to Mapper */ + MapperWrite = Map241_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 241 Write Function */ +/*-------------------------------------------------------------------*/ +void Map241_Write( WORD wAddr, BYTE byData ) +{ + if( wAddr == 0x8000 ) { + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE(((byData<<2)+0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE(((byData<<2)+1) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE(((byData<<2)+2) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE(((byData<<2)+3) % (NesHeader.byRomSize<<1)); + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_007.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_007.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_007.c (revision 0) @@ -0,0 +1,70 @@ +/*===================================================================*/ +/* */ +/* Mapper 7 (AOROM) */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 7 */ +/*-------------------------------------------------------------------*/ +void Map7_Init() +{ + /* Initialize Mapper */ + MapperInit = Map7_Init; + + /* Write to Mapper */ + MapperWrite = Map7_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 7 Write Function */ +/*-------------------------------------------------------------------*/ +void Map7_Write( WORD wAddr, BYTE byData ) +{ + BYTE byBank; + + /* Set ROM Banks */ + byBank = ( byData & 0x07 ) << 2; + byBank %= ( NesHeader.byRomSize << 1 ); + + ROMBANK0 = ROMPAGE( byBank ); + ROMBANK1 = ROMPAGE( byBank + 1 ); + ROMBANK2 = ROMPAGE( byBank + 2 ); + ROMBANK3 = ROMPAGE( byBank + 3 ); + + /* Name Table Mirroring */ + InfoNES_Mirroring( byData & 0x10 ? 2 : 3 ); +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_160.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_160.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_160.c (revision 0) @@ -0,0 +1,311 @@ +/*===================================================================*/ +/* */ +/* Mapper 160 (Pirates) */ +/* */ +/*===================================================================*/ + +BYTE Map160_IRQ_Enable; +BYTE Map160_IRQ_Cnt; +BYTE Map160_IRQ_Latch; +BYTE Map160_Refresh_Type; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 160 */ +/*-------------------------------------------------------------------*/ +void Map160_Init() +{ + /* Initialize Mapper */ + MapperInit = Map160_Init; + + /* Write to Mapper */ + MapperWrite = Map160_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map160_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Initialize IRQ Registers */ + Map160_IRQ_Enable = 0; + Map160_IRQ_Cnt = 0; + Map160_IRQ_Latch = 0; + Map160_Refresh_Type = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 160 Write Function */ +/*-------------------------------------------------------------------*/ +void Map160_Write( WORD wAddr, BYTE byData ) +{ + switch ( wAddr ) + { + /* Set ROM Banks */ + case 0x8000: + ROMBANK0 = ROMPAGE( byData % ( NesHeader.byRomSize << 1 ) ); + break; + + case 0x8001: + ROMBANK1 = ROMPAGE( byData % ( NesHeader.byRomSize << 1 ) ); + break; + + case 0x8002: + ROMBANK2 = ROMPAGE( byData % ( NesHeader.byRomSize << 1 ) ); + break; + + case 0x9000: + if ( byData == 0x2b ) + { + Map160_Refresh_Type = 1; /* Title */ + } + else if ( byData == 0xa8 ) + { + Map160_Refresh_Type = 2; /* Passwd */ + } + else if ( byData == 0x1f ) + { + Map160_Refresh_Type = 3; /* Game Over */ + } + else if ( byData == 0x7c ) + { + Map160_Refresh_Type = 4; /* Continue */ + } + else if ( byData == 0x18 ) + { + Map160_Refresh_Type = 5; /* Roulette */ + } + else if ( byData == 0x60 ) + { + Map160_Refresh_Type = 6; /* Congratulation */ + } + else + { + Map160_Refresh_Type = 0; + } + + PPUBANK[ 0 ] = VROMPAGE( byData % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0x9001: + PPUBANK[ 1 ] = VROMPAGE( byData % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0x9002: + if ( Map160_Refresh_Type == 2 && byData != 0xe8 ) + { + Map160_Refresh_Type = 0; /* Not Passwd */ + } + PPUBANK[ 2 ] = VROMPAGE( byData % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0x9003: + PPUBANK[ 3 ] = VROMPAGE( byData % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0x9004: + PPUBANK[ 4 ] = VROMPAGE( byData % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0x9005: + PPUBANK[ 5 ] = VROMPAGE( byData % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0x9006: + PPUBANK[ 6 ] = VROMPAGE( byData % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0x9007: + PPUBANK[ 7 ] = VROMPAGE( byData % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xc000: + Map160_IRQ_Cnt = Map160_IRQ_Latch; + Map160_IRQ_Enable = Map160_IRQ_Latch; + break; + + case 0xc001: + Map160_IRQ_Latch = byData; + break; + + case 0xc002: + Map160_IRQ_Enable = 0; + break; + + case 0xc003: + Map160_IRQ_Cnt = byData; + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 160 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map160_HSync() +{ +/* + * Callback at HSync + * + */ + if ( PPU_Scanline == 0 || PPU_Scanline == 239 ) + { + if ( Map160_Refresh_Type == 1 ) + { + PPUBANK[ 0 ] = VROMPAGE( 0x58 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( 0x59 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( 0x5a % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( 0x5b % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 4 ] = VROMPAGE( 0x58 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( 0x59 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE( 0x5a % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( 0x5b % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + } + else if ( Map160_Refresh_Type == 2 ) + { + PPUBANK[ 0 ] = VROMPAGE( 0x78 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( 0x79 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( 0x7a % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( 0x7b % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 4 ] = VROMPAGE( 0x78 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( 0x79 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE( 0x7a % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( 0x7b % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + } + else if ( Map160_Refresh_Type == 3 ) + { + PPUBANK[ 0 ] = VROMPAGE( 0x7c % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( 0x7d % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( 0x7e % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( 0x7f % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 4 ] = VROMPAGE( 0x7c % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( 0x7d % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE( 0x7e % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( 0x7f % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + } + else if ( Map160_Refresh_Type == 5 ) + { + PPUBANK[ 0 ] = VROMPAGE( 0x70 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( 0x71 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( 0x72 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( 0x73 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 4 ] = VROMPAGE( 0x74 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( 0x75 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE( 0x76 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( 0x77 % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + } + else if ( Map160_Refresh_Type == 6 ) + { + PPUBANK[ 0 ] = VROMPAGE( 0x5c % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( 0x5d % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( 0x5e % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( 0x5f % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 4 ] = VROMPAGE( 0x7c % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( 0x7d % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE( 0x7e % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( 0x7f % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + } + } + + if ( PPU_Scanline == 64 ) + { + if ( Map160_Refresh_Type == 4 ) + { + PPUBANK[ 0 ] = VROMPAGE( 0x6c % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( 0x6d % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( 0x6e % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( 0x6f % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + } + } + + if ( PPU_Scanline == 128 ) + { + if ( Map160_Refresh_Type == 4 ) + { + PPUBANK[ 0 ] = VROMPAGE( 0x68 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( 0x69 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( 0x6a % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( 0x6b % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + } + else if ( Map160_Refresh_Type == 5 ) + { + PPUBANK[ 0 ] = VROMPAGE( 0x74 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( 0x75 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( 0x76 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( 0x77 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 4 ] = VROMPAGE( 0x74 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( 0x75 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE( 0x76 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( 0x77 % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + } + } + + if ( PPU_Scanline == 160 ) + { + if ( Map160_Refresh_Type == 6 ) + { + PPUBANK[ 0 ] = VROMPAGE( 0x60 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( 0x61 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( 0x5e % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( 0x5f % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 4 ] = VROMPAGE( 0x7c % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( 0x7d % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE( 0x7e % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( 0x7f % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + } + } + + if ( Map160_IRQ_Enable ) + { + if ( Map160_IRQ_Cnt == 0xff ) + { + IRQ_REQ; + Map160_IRQ_Cnt = 0; + Map160_IRQ_Enable = 0; + } else { + Map160_IRQ_Cnt++; + } + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_062.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_062.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_062.c (revision 0) @@ -0,0 +1,88 @@ +/*===================================================================*/ +/* */ +/* Mapper 62 */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 62 */ +/*-------------------------------------------------------------------*/ +void Map62_Init() +{ + /* Initialize Mapper */ + MapperInit = Map62_Init; + + /* Write to Mapper */ + MapperWrite = Map62_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 62 Write Function */ +/*-------------------------------------------------------------------*/ +void Map62_Write( WORD wAddr, BYTE byData ) +{ + switch( wAddr & 0xFF00 ) { + case 0x8100: + ROMBANK0 = ROMPAGE((byData+0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE((byData+1) % (NesHeader.byRomSize<<1)); + break; + case 0x8500: + ROMBANK0 = ROMPAGE(byData % (NesHeader.byRomSize<<1)); + break; + case 0x8700: + ROMBANK1 = ROMPAGE(byData % (NesHeader.byRomSize<<1)); + break; + + default: + PPUBANK[ 0 ] = VROMPAGE((byData+0) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 1 ] = VROMPAGE((byData+1) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 2 ] = VROMPAGE((byData+2) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 3 ] = VROMPAGE((byData+3) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 4 ] = VROMPAGE((byData+4) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 5 ] = VROMPAGE((byData+5) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 6 ] = VROMPAGE((byData+6) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 7 ] = VROMPAGE((byData+7) % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + break; + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_045.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_045.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_045.c (revision 0) @@ -0,0 +1,347 @@ +/*===================================================================*/ +/* */ +/* Mapper 45 (Pirates) */ +/* */ +/*===================================================================*/ + +BYTE Map45_Regs[7]; +DWORD Map45_P[4],Map45_Prg0,Map45_Prg1,Map45_Prg2,Map45_Prg3; +DWORD Map45_C[4],Map45_Chr0, Map45_Chr1,Map45_Chr2, Map45_Chr3; +DWORD Map45_Chr4, Map45_Chr5, Map45_Chr6, Map45_Chr7; + +BYTE Map45_IRQ_Enable; +BYTE Map45_IRQ_Cnt; +BYTE Map45_IRQ_Latch; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 45 */ +/*-------------------------------------------------------------------*/ +void Map45_Init() +{ + /* Initialize Mapper */ + MapperInit = Map45_Init; + + /* Write to Mapper */ + MapperWrite = Map45_Write; + + /* Write to SRAM */ + MapperSram = Map45_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map45_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + Map45_Prg0 = 0; + Map45_Prg1 = 1; + Map45_Prg2 = NesHeader.byRomSize * 2 - 2; + Map45_Prg3 = NesHeader.byRomSize * 2 - 1; + + ROMBANK0 = ROMPAGE( Map45_Prg0 ); Map45_P[0] = Map45_Prg0; + ROMBANK1 = ROMPAGE( Map45_Prg1 ); Map45_P[1] = Map45_Prg1; + ROMBANK2 = ROMPAGE( Map45_Prg2 ); Map45_P[2] = Map45_Prg2; + ROMBANK3 = ROMPAGE( Map45_Prg3 ); Map45_P[3] = Map45_Prg3; + + /* Set PPU Banks */ + Map45_Chr0 = 0; Map45_C[0] = Map45_Chr0; + Map45_Chr1 = 1; Map45_C[1] = Map45_Chr1; + Map45_Chr2 = 2; Map45_C[2] = Map45_Chr2; + Map45_Chr3 = 3; Map45_C[3] = Map45_Chr3; + Map45_Chr4 = 4; Map45_C[4] = Map45_Chr4; + Map45_Chr5 = 5; Map45_C[5] = Map45_Chr5; + Map45_Chr6 = 6; Map45_C[6] = Map45_Chr6; + Map45_Chr7 = 7; Map45_C[7] = Map45_Chr7; + + for ( int nPage = 0; nPage < 8; ++nPage ) { + PPUBANK[ nPage ] = VROMPAGE( nPage ); + } + InfoNES_SetupChr(); + + /* Initialize IRQ Registers */ + Map45_IRQ_Enable = 0; + Map45_IRQ_Cnt = 0; + Map45_IRQ_Latch = 0; + + Map45_Regs[0] = Map45_Regs[1] = Map45_Regs[2] = Map45_Regs[3] = 0; + Map45_Regs[4] = Map45_Regs[5] = Map45_Regs[6] = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 45 Write to Sram Function */ +/*-------------------------------------------------------------------*/ +void Map45_Sram( WORD wAddr, BYTE byData ) +{ + if(wAddr == 0x6000) + { + Map45_Regs[Map45_Regs[5]] = byData; + Map45_Regs[5]= (Map45_Regs[5]+1) & 0x03; + Map45_Set_CPU_Bank4((BYTE)Map45_Prg0); + Map45_Set_CPU_Bank5((BYTE)Map45_Prg1); + Map45_Set_CPU_Bank6((BYTE)Map45_Prg2); + Map45_Set_CPU_Bank7((BYTE)Map45_Prg3); + Map45_Set_PPU_Banks(); + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 45 Write Function */ +/*-------------------------------------------------------------------*/ +void Map45_Write( WORD wAddr, BYTE byData ) +{ + DWORD swap; + + switch(wAddr & 0xE001) + { + case 0x8000: + if((byData & 0x40) != (Map45_Regs[6] & 0x40)) + { + swap = Map45_Prg0; Map45_Prg0 = Map45_Prg2; Map45_Prg2 = swap; + swap = Map45_P[0]; Map45_P[0] = Map45_P[2]; Map45_P[2] = swap; + ROMBANK0 = ROMPAGE( Map45_P[0] % ( NesHeader.byRomSize << 1) ); + ROMBANK2 = ROMPAGE( Map45_P[2] % ( NesHeader.byRomSize << 1) ); + } + if (NesHeader.byRomSize > 0) + { + if((byData & 0x80) != (Map45_Regs[6] & 0x80)) + { + swap = Map45_Chr4; Map45_Chr4 = Map45_Chr0; Map45_Chr0 = swap; + swap = Map45_Chr5; Map45_Chr5 = Map45_Chr1; Map45_Chr1 = swap; + swap = Map45_Chr6; Map45_Chr6 = Map45_Chr2; Map45_Chr2 = swap; + swap = Map45_Chr7; Map45_Chr7 = Map45_Chr3; Map45_Chr3 = swap; + swap = Map45_C[4]; Map45_C[4] = Map45_C[0]; Map45_C[0] = swap; + swap = Map45_C[5]; Map45_C[5] = Map45_C[1]; Map45_C[1] = swap; + swap = Map45_C[6]; Map45_C[6] = Map45_C[2]; Map45_C[2] = swap; + swap = Map45_C[7]; Map45_C[7] = Map45_C[3]; Map45_C[3] = swap; + + PPUBANK[ 0 ] = VROMPAGE( Map45_C[0] % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( Map45_C[1] % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( Map45_C[2] % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( Map45_C[3] % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 4 ] = VROMPAGE( Map45_C[4] % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( Map45_C[5] % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE( Map45_C[6] % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( Map45_C[7] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + } + } + Map45_Regs[6] = byData; + break; + + case 0x8001: + switch(Map45_Regs[6] & 0x07) + { + case 0x00: + Map45_Chr0 = (byData & 0xFE)+0; + Map45_Chr1 = (byData & 0xFE)+1; + Map45_Set_PPU_Banks(); + break; + + case 0x01: + Map45_Chr2 = (byData & 0xFE)+0; + Map45_Chr3 = (byData & 0xFE)+1; + Map45_Set_PPU_Banks(); + break; + + case 0x02: + Map45_Chr4 = byData; + Map45_Set_PPU_Banks(); + break; + + case 0x03: + Map45_Chr5 = byData; + Map45_Set_PPU_Banks(); + break; + + case 0x04: + Map45_Chr6 = byData; + Map45_Set_PPU_Banks(); + break; + + case 0x05: + Map45_Chr7 = byData; + Map45_Set_PPU_Banks(); + break; + + case 0x06: + if(Map45_Regs[6] & 0x40) + { + Map45_Prg2 = byData & 0x3F; + Map45_Set_CPU_Bank6(byData); + } + else + { + Map45_Prg0 = byData & 0x3F; + Map45_Set_CPU_Bank4(byData); + } + break; + + case 0x07: + Map45_Prg1 = byData & 0x3F; + Map45_Set_CPU_Bank5(byData); + break; + } + break; + + case 0xA000: + if ( byData & 0x01 ) + { + InfoNES_Mirroring( 0 ); + } else { + InfoNES_Mirroring( 1 ); + } + break; + + case 0xC000: + Map45_IRQ_Cnt = byData; + break; + + case 0xC001: + Map45_IRQ_Latch = byData; + break; + + case 0xE000: + Map45_IRQ_Enable = 0; + break; + + case 0xE001: + Map45_IRQ_Enable = 1; + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 45 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map45_HSync() +{ +/* + * Callback at HSync + * + */ + if(Map45_IRQ_Enable) + { + if ( /* 0 <= PPU_Scanline && */ PPU_Scanline <= 239 ) + { + if ( PPU_R1 & R1_SHOW_SCR || PPU_R1 & R1_SHOW_SP ) + { + if(!(Map45_IRQ_Cnt--)) + { + Map45_IRQ_Cnt = Map45_IRQ_Latch; + IRQ_REQ; + } + } + } + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 45 Set CPU Banks Function */ +/*-------------------------------------------------------------------*/ + +void Map45_Set_CPU_Bank4(BYTE byData) +{ + byData &= (Map45_Regs[3] & 0x3F) ^ 0xFF; + byData &= 0x3F; + byData |= Map45_Regs[1]; + ROMBANK0 = ROMPAGE( byData % ( NesHeader.byRomSize << 1) ); + Map45_P[0] = byData; +} + +void Map45_Set_CPU_Bank5(BYTE byData) +{ + byData &= (Map45_Regs[3] & 0x3F) ^ 0xFF; + byData &= 0x3F; + byData |= Map45_Regs[1]; + ROMBANK1 = ROMPAGE( byData % ( NesHeader.byRomSize << 1) ); + Map45_P[1] = byData; +} + +void Map45_Set_CPU_Bank6(BYTE byData) +{ + byData &= (Map45_Regs[3] & 0x3F) ^ 0xFF; + byData &= 0x3F; + byData |= Map45_Regs[1]; + ROMBANK2 = ROMPAGE( byData % ( NesHeader.byRomSize << 1) ); + Map45_P[2] = byData; +} + +void Map45_Set_CPU_Bank7(BYTE byData) +{ + byData &= (Map45_Regs[3] & 0x3F) ^ 0xFF; + byData &= 0x3F; + byData |= Map45_Regs[1]; + ROMBANK3 = ROMPAGE( byData % ( NesHeader.byRomSize << 1) ); + Map45_P[3] = byData; +} + +/*-------------------------------------------------------------------*/ +/* Mapper 45 Set PPU Banks Function */ +/*-------------------------------------------------------------------*/ +void Map45_Set_PPU_Banks() +{ + BYTE table[16] = + { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF + }; + Map45_C[0] = Map45_Chr0; + Map45_C[1] = Map45_Chr1; + Map45_C[2] = Map45_Chr2; + Map45_C[3] = Map45_Chr3; + Map45_C[4] = Map45_Chr4; + Map45_C[5] = Map45_Chr5; + Map45_C[6] = Map45_Chr6; + Map45_C[7] = Map45_Chr7; + for(BYTE i = 0; i < 8; i++) + { + Map45_C[i] &= table[Map45_Regs[2] & 0x0F]; + Map45_C[i] |= Map45_Regs[0] & 0xff; + Map45_C[i] += (BYTE)(Map45_Regs[2] & 0x10) << 4; + } + if(Map45_Regs[6] & 0x80) + { + PPUBANK[ 0 ] = VROMPAGE( Map45_C[4] % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( Map45_C[5] % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( Map45_C[6] % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( Map45_C[7] % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 4 ] = VROMPAGE( Map45_C[0] % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( Map45_C[1] % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE( Map45_C[2] % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( Map45_C[3] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + } + else + { + PPUBANK[ 0 ] = VROMPAGE( Map45_C[0] % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( Map45_C[1] % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( Map45_C[2] % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( Map45_C[3] % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 4 ] = VROMPAGE( Map45_C[4] % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( Map45_C[5] % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE( Map45_C[6] % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( Map45_C[7] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + } +} + + Index: apps/plugins/infones/mapper/InfoNES_Mapper_109.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_109.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_109.c (revision 0) @@ -0,0 +1,134 @@ +/*===================================================================*/ +/* */ +/* Mapper 109 : SACHEN The Great Wall SA-019 */ +/* */ +/*===================================================================*/ + +BYTE Map109_Reg; +BYTE Map109_Chr0, Map109_Chr1, Map109_Chr2, Map109_Chr3; +BYTE Map109_Chrmode0, Map109_Chrmode1; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 109 */ +/*-------------------------------------------------------------------*/ +void Map109_Init() +{ + /* Initialize Mapper */ + MapperInit = Map109_Init; + + /* Write to Mapper */ + MapperWrite = Map0_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map109_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + + /* Initialize Registers */ + Map109_Reg = 0; + Map109_Chr0 = 0; + Map109_Chr1 = 0; + Map109_Chr2 = 0; + Map109_Chr3 = 0; + Map109_Chrmode0 = 0; + Map109_Chrmode1 = 0; + + /* Set PPU Banks */ + Map109_Set_PPU_Banks(); + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 109 Write to APU Function */ +/*-------------------------------------------------------------------*/ +void Map109_Apu( WORD wAddr, BYTE byData ) +{ + switch( wAddr ) { + case 0x4100: + Map109_Reg = byData; + break; + case 0x4101: + switch( Map109_Reg ) { + case 0: + Map109_Chr0 = byData; + Map109_Set_PPU_Banks(); + break; + case 1: + Map109_Chr1 = byData; + Map109_Set_PPU_Banks(); + break; + case 2: + Map109_Chr2 = byData; + Map109_Set_PPU_Banks(); + break; + case 3: + Map109_Chr3 = byData; + Map109_Set_PPU_Banks(); + break; + case 4: + Map109_Chrmode0 = byData & 0x01; + Map109_Set_PPU_Banks(); + break; + case 5: + ROMBANK0 = ROMPAGE( ( ( byData & 0x07 ) + 0 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE( ( ( byData & 0x07 ) + 1 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMPAGE( ( ( byData & 0x07 ) + 2 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK3 = ROMPAGE( ( ( byData & 0x07 ) + 3 ) % ( NesHeader.byRomSize << 1 ) ); + break; + case 6: + Map109_Chrmode1 = byData & 0x07; + Map109_Set_PPU_Banks(); + break; + case 7: + if( byData & 0x01 ) InfoNES_Mirroring( 0 ); + else InfoNES_Mirroring( 1 ); + break; + } + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 109 Set Bank PPU Function */ +/*-------------------------------------------------------------------*/ +void Map109_Set_PPU_Banks() +{ + if ( NesHeader.byVRomSize > 0 ) { + PPUBANK[ 0 ] = VROMPAGE((Map109_Chr0) % (NesHeader.byVRomSize<<3) ); + PPUBANK[ 1 ] = VROMPAGE((Map109_Chr1|((Map109_Chrmode1<<3)&0x8)) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 2 ] = VROMPAGE((Map109_Chr2|((Map109_Chrmode1<<2)&0x8)) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 3 ] = VROMPAGE((Map109_Chr3|((Map109_Chrmode1<<1)&0x8)|(Map109_Chrmode0*0x10)) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 4 ] = VROMPAGE((NesHeader.byVRomSize<<3)-4); + PPUBANK[ 5 ] = VROMPAGE((NesHeader.byVRomSize<<3)-3); + PPUBANK[ 6 ] = VROMPAGE((NesHeader.byVRomSize<<3)-2); + PPUBANK[ 7 ] = VROMPAGE((NesHeader.byVRomSize<<3)-1); + InfoNES_SetupChr(); + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_181.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_181.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_181.c (revision 0) @@ -0,0 +1,82 @@ +/*===================================================================*/ +/* */ +/* Mapper 181 : Hacker International Type2 */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 181 */ +/*-------------------------------------------------------------------*/ +void Map181_Init() +{ + /* Initialize Mapper */ + MapperInit = Map181_Init; + + /* Write to Mapper */ + MapperWrite = Map0_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map181_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 181 Write to APU Function */ +/*-------------------------------------------------------------------*/ +void Map181_Apu( WORD wAddr, BYTE byData ) +{ + if( wAddr == 0x4120 ) { + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( (((byData&0x08)>>1) + 0 ) % (NesHeader.byRomSize << 1) ); + ROMBANK1 = ROMPAGE( (((byData&0x08)>>1) + 1 ) % (NesHeader.byRomSize << 1) ); + ROMBANK2 = ROMPAGE( (((byData&0x08)>>1) + 2 ) % (NesHeader.byRomSize << 1) ); + ROMBANK3 = ROMPAGE( (((byData&0x08)>>1) + 3 ) % (NesHeader.byRomSize << 1) ); + + /* Set PPU Banks */ + PPUBANK[ 0 ] = VROMPAGE( (((byData&0x07)<<3) + 0) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 1 ] = VROMPAGE( (((byData&0x07)<<3) + 1) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 2 ] = VROMPAGE( (((byData&0x07)<<3) + 2) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 3 ] = VROMPAGE( (((byData&0x07)<<3) + 3) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 4 ] = VROMPAGE( (((byData&0x07)<<3) + 4) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 5 ] = VROMPAGE( (((byData&0x07)<<3) + 5) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 6 ] = VROMPAGE( (((byData&0x07)<<3) + 6) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 7 ] = VROMPAGE( (((byData&0x07)<<3) + 7) % (NesHeader.byVRomSize << 3) ); + InfoNES_SetupChr(); + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_245.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_245.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_245.c (revision 0) @@ -0,0 +1,231 @@ +/*===================================================================*/ +/* */ +/* Mapper 245 : Yong Zhe Dou E Long */ +/* */ +/*===================================================================*/ + +BYTE Map245_Reg[8]; +BYTE Map245_Prg0, Map245_Prg1; +BYTE Map245_Chr01, Map245_Chr23, Map245_Chr4, Map245_Chr5, Map245_Chr6, Map245_Chr7; +BYTE Map245_WeSram; + +BYTE Map245_IRQ_Enable; +BYTE Map245_IRQ_Counter; +BYTE Map245_IRQ_Latch; +BYTE Map245_IRQ_Request; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 245 */ +/*-------------------------------------------------------------------*/ +void Map245_Init() +{ + /* Initialize Mapper */ + MapperInit = Map245_Init; + + /* Write to Mapper */ + MapperWrite = Map245_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map245_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set Registers */ + for( int i = 0; i < 8; i++ ) { + Map245_Reg[i] = 0x00; + } + + Map245_Prg0 = 0; + Map245_Prg1 = 1; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + Map245_WeSram = 0; // Disable + Map245_IRQ_Enable = 0; // Disable + Map245_IRQ_Counter = 0; + Map245_IRQ_Latch = 0; + Map245_IRQ_Request = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 245 Write Function */ +/*-------------------------------------------------------------------*/ +void Map245_Write( WORD wAddr, BYTE byData ) +{ + switch( wAddr&0xF7FF ) { + case 0x8000: + Map245_Reg[0] = byData; + break; + case 0x8001: + Map245_Reg[1] = byData; + switch( Map245_Reg[0] ) { + case 0x00: + Map245_Reg[3]=(byData & 2 )<<5; + ROMBANK2 = ROMPAGE((0x3E|Map245_Reg[3]) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE((0x3F|Map245_Reg[3]) % (NesHeader.byRomSize<<1)); + break; + case 0x06: + Map245_Prg0=byData; + break; + case 0x07: + Map245_Prg1=byData; + break; + } + ROMBANK0 = ROMPAGE((Map245_Prg0|Map245_Reg[3]) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE((Map245_Prg1|Map245_Reg[3]) % (NesHeader.byRomSize<<1)); + break; + case 0xA000: + Map245_Reg[2] = byData; + if( !ROM_FourScr ) { + if( byData & 0x01 ) InfoNES_Mirroring( 0 ); + else InfoNES_Mirroring( 1 ); + } + break; + case 0xA001: + + break; + case 0xC000: + Map245_Reg[4] = byData; + Map245_IRQ_Counter = byData; + Map245_IRQ_Request = 0; + break; + case 0xC001: + Map245_Reg[5] = byData; + Map245_IRQ_Latch = byData; + Map245_IRQ_Request = 0; + break; + case 0xE000: + Map245_Reg[6] = byData; + Map245_IRQ_Enable = 0; + Map245_IRQ_Request = 0; + break; + case 0xE001: + Map245_Reg[7] = byData; + Map245_IRQ_Enable = 1; + Map245_IRQ_Request = 0; + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 245 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map245_HSync() +{ + if( ( /* PPU_Scanline >= 0 && */ PPU_Scanline <= 239) ) { + if( PPU_R1 & R1_SHOW_SCR || PPU_R1 & R1_SHOW_SP ) { + if( Map245_IRQ_Enable && !Map245_IRQ_Request ) { + if( PPU_Scanline == 0 ) { + if( Map245_IRQ_Counter ) { + Map245_IRQ_Counter--; + } + } + if( !(Map245_IRQ_Counter--) ) { + Map245_IRQ_Request = 0xFF; + Map245_IRQ_Counter = Map245_IRQ_Latch; + } + } + } + } + if( Map245_IRQ_Request ) { + IRQ_REQ; + } +} + +#if 0 +/*-------------------------------------------------------------------*/ +/* Mapper 245 Set CPU Banks Function */ +/*-------------------------------------------------------------------*/ +void SetBank_CPU() +{ + ROMBANK0 = ROMPAGE( Map245_Prg0 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE( Map245_Prg1 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 245 Set PPU Banks Function */ +/*-------------------------------------------------------------------*/ +void SetBank_PPU() +{ + if( NesHeader.byVRomSize > 0 ) { + if( Map245_Reg[0] & 0x80 ) { + PPUBANK[ 0 ] = VROMPAGE( Map245_Chr4 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( Map245_Chr5 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( Map245_Chr6 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( Map245_Chr7 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 4 ] = VROMPAGE( ( Map245_Chr01 + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( ( Map245_Chr01 + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE( ( Map245_Chr23 + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( ( Map245_Chr23 + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + } else { + PPUBANK[ 0 ] = VROMPAGE( ( Map245_Chr01 + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( ( Map245_Chr01 + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( ( Map245_Chr23 + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( ( Map245_Chr23 + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 4 ] = VROMPAGE( Map245_Chr4 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( Map245_Chr5 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE( Map245_Chr6 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( Map245_Chr7 % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + } + } else { + if( Map245_Reg[0] & 0x80 ) { + PPUBANK[ 4 ] = CRAMPAGE( (Map245_Chr01+0)&0x07 ); + PPUBANK[ 5 ] = CRAMPAGE( (Map245_Chr01+1)&0x07 ); + PPUBANK[ 6 ] = CRAMPAGE( (Map245_Chr23+0)&0x07 ); + PPUBANK[ 7 ] = CRAMPAGE( (Map245_Chr23+1)&0x07 ); + PPUBANK[ 0 ] = CRAMPAGE( Map245_Chr4&0x07 ); + PPUBANK[ 1 ] = CRAMPAGE( Map245_Chr5&0x07 ); + PPUBANK[ 2 ] = CRAMPAGE( Map245_Chr6&0x07 ); + PPUBANK[ 3 ] = CRAMPAGE( Map245_Chr7&0x07 ); + InfoNES_SetupChr(); + } else { + PPUBANK[ 0 ] = CRAMPAGE( (Map245_Chr01+0)&0x07 ); + PPUBANK[ 1 ] = CRAMPAGE( (Map245_Chr01+1)&0x07 ); + PPUBANK[ 2 ] = CRAMPAGE( (Map245_Chr23+0)&0x07 ); + PPUBANK[ 3 ] = CRAMPAGE( (Map245_Chr23+1)&0x07 ); + PPUBANK[ 4 ] = CRAMPAGE( Map245_Chr4&0x07 ); + PPUBANK[ 5 ] = CRAMPAGE( Map245_Chr5&0x07 ); + PPUBANK[ 6 ] = CRAMPAGE( Map245_Chr6&0x07 ); + PPUBANK[ 7 ] = CRAMPAGE( Map245_Chr7&0x07 ); + InfoNES_SetupChr(); + } + } +} +#endif Index: apps/plugins/infones/mapper/InfoNES_Mapper_083.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_083.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_083.c (revision 0) @@ -0,0 +1,315 @@ +/*===================================================================*/ +/* */ +/* Mapper 83 (Pirates) */ +/* */ +/*===================================================================*/ + +BYTE Map83_Regs[3]; +DWORD Map83_Chr_Bank; +DWORD Map83_IRQ_Cnt; +BYTE Map83_IRQ_Enabled; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 83 */ +/*-------------------------------------------------------------------*/ +void Map83_Init() +{ + /* Initialize Mapper */ + MapperInit = Map83_Init; + + /* Write to Mapper */ + MapperWrite = Map83_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map83_Apu; + + /* Read from APU */ + MapperReadApu = Map83_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map83_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Initialize Registers */ + Map83_Regs[0] = Map83_Regs[1] = Map83_Regs[2] = 0; + + /* Set ROM Banks */ + if ( ( NesHeader.byRomSize << 1 ) >= 32 ) + { + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 30 ); + ROMBANK3 = ROMPAGE( 31 ); + Map83_Regs[ 1 ] = 0x30; + } + else + { + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + } + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Initialize IRQ Registers */ + Map83_IRQ_Enabled = 0; + Map83_IRQ_Cnt = 0; + Map83_Chr_Bank = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 83 Read from APU Function */ +/*-------------------------------------------------------------------*/ +BYTE Map83_ReadApu( WORD wAddr ) +{ + if ( ( wAddr & 0x5100 ) == 0x5100 ) + { + return Map83_Regs[2]; + } + else + { + return wAddr >> 8; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 83 Write to APU Function */ +/*-------------------------------------------------------------------*/ +void Map83_Apu( WORD wAddr, BYTE byData ) +{ + switch(wAddr) + { + case 0x5101: + case 0x5102: + case 0x5103: + Map83_Regs[2] = byData; + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 83 Write Function */ +/*-------------------------------------------------------------------*/ +void Map83_Write( WORD wAddr, BYTE byData ) +{ + /* Set ROM Banks */ + switch( wAddr ) + { + case 0x8000: + case 0xB000: + case 0xB0FF: + case 0xB1FF: + Map83_Regs[0] = byData; + Map83_Chr_Bank = (byData & 0x30) << 4; + + ROMBANK0 = ROMPAGE( (byData*2+0) % (NesHeader.byRomSize << 1) ); + ROMBANK1 = ROMPAGE( (byData*2+1) % (NesHeader.byRomSize << 1) ); + ROMBANK2 = ROMPAGE( (((byData&0x30)|0x0F)*2+0) % (NesHeader.byRomSize << 1) ); + ROMBANK3 = ROMPAGE( (((byData&0x30)|0x0F)*2+1) % (NesHeader.byRomSize << 1) ); + break; + + case 0x8100: + if ( NesHeader.byVRomSize <= 32 ) + { + Map83_Regs[1] = byData; + } + if ((byData & 0x03) == 0x00) + { + InfoNES_Mirroring( 1 ); + } + else if((byData & 0x03) == 0x01) + { + InfoNES_Mirroring( 0 ); + } + else if((byData & 0x03) == 0x02) + { + InfoNES_Mirroring( 3 ); + } + else + { + InfoNES_Mirroring( 2 ); + } + break; + + case 0x8200: + Map83_IRQ_Cnt = ( Map83_IRQ_Cnt & 0xFF00 ) | (DWORD)byData; + break; + + case 0x8201: + Map83_IRQ_Cnt = ( Map83_IRQ_Cnt & 0x00FF ) | ((DWORD)byData << 8); + Map83_IRQ_Enabled = byData; + break; + + case 0x8300: + ROMBANK0 = ROMPAGE( byData % (NesHeader.byRomSize << 1) ); + break; + + case 0x8301: + ROMBANK1 = ROMPAGE( byData % (NesHeader.byRomSize << 1) ); + break; + + case 0x8302: + ROMBANK2 = ROMPAGE( byData % (NesHeader.byRomSize << 1) ); + break; + + case 0x8310: + if ((Map83_Regs[1] & 0x30) == 0x30) + { + PPUBANK[ 0 ] = VROMPAGE( (Map83_Chr_Bank^byData) % (NesHeader.byVRomSize << 3) ); + InfoNES_SetupChr(); + } + else if((Map83_Regs[1] & 0x30) == 0x10 || (Map83_Regs[1] & 0x30) == 0x20) + { + PPUBANK[ 0 ] = VROMPAGE( (((Map83_Chr_Bank^byData)*2)+0) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 1 ] = VROMPAGE( (((Map83_Chr_Bank^byData)*2)+1) % (NesHeader.byVRomSize << 3) ); + InfoNES_SetupChr(); + } + break; + + case 0x8311: + if ((Map83_Regs[1] & 0x30) == 0x30) + { + PPUBANK[ 1 ] = VROMPAGE( (Map83_Chr_Bank^byData) % (NesHeader.byVRomSize << 3) ); + InfoNES_SetupChr(); + } + else if((Map83_Regs[1] & 0x30) == 0x10 || (Map83_Regs[1] & 0x30) == 0x20) + { + PPUBANK[ 2 ] = VROMPAGE( (((Map83_Chr_Bank^byData)*2)+0) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 3 ] = VROMPAGE( (((Map83_Chr_Bank^byData)*2)+1) % (NesHeader.byVRomSize << 3) ); + InfoNES_SetupChr(); + } + break; + + case 0x8312: + if ((Map83_Regs[1] & 0x30) == 0x30) + { + PPUBANK[ 2 ] = VROMPAGE( (Map83_Chr_Bank^byData) % (NesHeader.byVRomSize << 3) ); + InfoNES_SetupChr(); + } + else if((Map83_Regs[1] & 0x30) == 0x10 || (Map83_Regs[1] & 0x30) == 0x20) + { + PPUBANK[ 4 ] = VROMPAGE( (((Map83_Chr_Bank^byData)*2)+0) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 5 ] = VROMPAGE( (((Map83_Chr_Bank^byData)*2)+1) % (NesHeader.byVRomSize << 3) ); + InfoNES_SetupChr(); + } + break; + + case 0x8313: + if ((Map83_Regs[1] & 0x30) == 0x30) + { + PPUBANK[ 3 ] = VROMPAGE( (Map83_Chr_Bank^byData) % (NesHeader.byVRomSize << 3) ); + InfoNES_SetupChr(); + } + else if((Map83_Regs[1] & 0x30) == 0x10 || (Map83_Regs[1] & 0x30) == 0x20) + { + PPUBANK[ 6 ] = VROMPAGE( (((Map83_Chr_Bank^byData)*2)+0) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 7 ] = VROMPAGE( (((Map83_Chr_Bank^byData)*2)+1) % (NesHeader.byVRomSize << 3) ); + InfoNES_SetupChr(); + } + break; + + case 0x8314: + if ((Map83_Regs[1] & 0x30) == 0x30) + { + PPUBANK[ 4 ] = VROMPAGE( (Map83_Chr_Bank^byData) % (NesHeader.byVRomSize << 3) ); + InfoNES_SetupChr(); + } + else if((Map83_Regs[1] & 0x30) == 0x10 || (Map83_Regs[1] & 0x30) == 0x20) + { + PPUBANK[ 4 ] = VROMPAGE( (((Map83_Chr_Bank^byData)*2)+0) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 5 ] = VROMPAGE( (((Map83_Chr_Bank^byData)*2)+1) % (NesHeader.byVRomSize << 3) ); + InfoNES_SetupChr(); + } + break; + + case 0x8315: + if ((Map83_Regs[1] & 0x30) == 0x30) + { + PPUBANK[ 5 ] = VROMPAGE( (Map83_Chr_Bank^byData) % (NesHeader.byVRomSize << 3) ); + InfoNES_SetupChr(); + } + else if ((Map83_Regs[1] & 0x30) == 0x10 || (Map83_Regs[1] & 0x30) == 0x20) + { + PPUBANK[ 6 ] = VROMPAGE( (((Map83_Chr_Bank^byData)*2)+0) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 7 ] = VROMPAGE( (((Map83_Chr_Bank^byData)*2)+1) % (NesHeader.byVRomSize << 3) ); + InfoNES_SetupChr(); + } + break; + + case 0x8316: + if ((Map83_Regs[1] & 0x30) == 0x30) + { + PPUBANK[ 6 ] = VROMPAGE( (Map83_Chr_Bank^byData) % (NesHeader.byVRomSize << 3) ); + InfoNES_SetupChr(); + } + else if ((Map83_Regs[1] & 0x30) == 0x10 || (Map83_Regs[1] & 0x30) == 0x20) + { + PPUBANK[ 4 ] = VROMPAGE( (((Map83_Chr_Bank^byData)*2)+0) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 5 ] = VROMPAGE( (((Map83_Chr_Bank^byData)*2)+1) % (NesHeader.byVRomSize << 3) ); + InfoNES_SetupChr(); + } + break; + + case 0x8317: + if ((Map83_Regs[1] & 0x30) == 0x30) + { + PPUBANK[ 7 ] = VROMPAGE( (Map83_Chr_Bank^byData) % (NesHeader.byVRomSize << 3) ); + InfoNES_SetupChr(); + } + else if ( (Map83_Regs[1] & 0x30) == 0x10 || (Map83_Regs[1] & 0x30) == 0x20) + { + PPUBANK[ 6 ] = VROMPAGE( (((Map83_Chr_Bank^byData)*2)+0) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 7 ] = VROMPAGE( (((Map83_Chr_Bank^byData)*2)+1) % (NesHeader.byVRomSize << 3) ); + InfoNES_SetupChr(); + } + break; + + case 0x8318: + ROMBANK0 = ROMPAGE( (((Map83_Regs[0]&0x30)|byData)*2+0) % (NesHeader.byRomSize << 1) ); + ROMBANK1 = ROMPAGE( (((Map83_Regs[0]&0x30)|byData)*2+1) % (NesHeader.byRomSize << 1) ); + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 83 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map83_HSync() +{ + if (Map83_IRQ_Enabled) + { + if (Map83_IRQ_Cnt <= 114) + { + IRQ_REQ; + Map83_IRQ_Enabled = 0; + } + else + { + Map83_IRQ_Cnt -= 114; + } + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_066.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_066.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_066.c (revision 0) @@ -0,0 +1,96 @@ +/*===================================================================*/ +/* */ +/* Mapper 66 (GNROM) */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 66 */ +/*-------------------------------------------------------------------*/ +void Map66_Init() +{ + int nPage; + + /* Initialize Mapper */ + MapperInit = Map66_Init; + + /* Write to Mapper */ + MapperWrite = Map66_Write; + + /* Write to SRAM */ + MapperSram = Map66_Write; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 0 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 66 Write Function */ +/*-------------------------------------------------------------------*/ +void Map66_Write( WORD wAddr, BYTE byData ) +{ + BYTE byRom; + BYTE byVRom; + + byRom = ( byData >> 4 ) & 0x0F; + byVRom = byData & 0x0F; + + /* Set ROM Banks */ + byRom <<= 1; + byRom %= NesHeader.byRomSize; + byRom <<= 1; + + ROMBANK0 = ROMPAGE( byRom ); + ROMBANK1 = ROMPAGE( byRom + 1 ); + ROMBANK2 = ROMPAGE( byRom + 2 ); + ROMBANK3 = ROMPAGE( byRom + 3 ); + + /* Set PPU Banks */ + byVRom <<= 3; + byVRom %= ( NesHeader.byVRomSize << 3 ); + + PPUBANK[ 0 ] = VROMPAGE( byVRom ); + PPUBANK[ 1 ] = VROMPAGE( byVRom + 1 ); + PPUBANK[ 2 ] = VROMPAGE( byVRom + 2 ); + PPUBANK[ 3 ] = VROMPAGE( byVRom + 3 ); + PPUBANK[ 4 ] = VROMPAGE( byVRom + 4 ); + PPUBANK[ 5 ] = VROMPAGE( byVRom + 5 ); + PPUBANK[ 6 ] = VROMPAGE( byVRom + 6 ); + PPUBANK[ 7 ] = VROMPAGE( byVRom + 7 ); + InfoNES_SetupChr(); +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_228.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_228.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_228.c (revision 0) @@ -0,0 +1,108 @@ +/*===================================================================*/ +/* */ +/* Mapper 228 : Action 52 */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 228 */ +/*-------------------------------------------------------------------*/ +void Map228_Init() +{ + /* Initialize Mapper */ + MapperInit = Map228_Init; + + /* Write to Mapper */ + MapperWrite = Map228_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 228 Write Function */ +/*-------------------------------------------------------------------*/ +void Map228_Write( WORD wAddr, BYTE byData ) +{ + BYTE byPrg = (wAddr&0x0780)>>7; + + switch( (wAddr&0x1800)>>11 ) { + case 1: + byPrg |= 0x10; + break; + case 3: + byPrg |= 0x20; + break; + } + + if( wAddr & 0x0020 ) { + byPrg <<= 1; + if( wAddr & 0x0040 ) { + byPrg++; + } + ROMBANK0 = ROMPAGE(((byPrg<<2)+0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE(((byPrg<<2)+1) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE(((byPrg<<2)+0) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE(((byPrg<<2)+1) % (NesHeader.byRomSize<<1)); + } else { + ROMBANK0 = ROMPAGE(((byPrg<<2)+0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE(((byPrg<<2)+1) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE(((byPrg<<2)+2) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE(((byPrg<<2)+3) % (NesHeader.byRomSize<<1)); + } + + BYTE byChr = ((wAddr&0x000F)<<2)|(byData&0x03); + + PPUBANK[ 0 ] = VROMPAGE(((byChr<<3)+0) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 1 ] = VROMPAGE(((byChr<<3)+1) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 2 ] = VROMPAGE(((byChr<<3)+2) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 3 ] = VROMPAGE(((byChr<<3)+3) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 4 ] = VROMPAGE(((byChr<<3)+4) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 5 ] = VROMPAGE(((byChr<<3)+5) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 6 ] = VROMPAGE(((byChr<<3)+6) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 7 ] = VROMPAGE(((byChr<<3)+7) % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + + if( wAddr & 0x2000 ) { + InfoNES_Mirroring( 0 ); + } else { + InfoNES_Mirroring( 1 ); + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_049.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_049.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_049.c (revision 0) @@ -0,0 +1,292 @@ +/*===================================================================*/ +/* */ +/* Mapper 49 (Nin1) */ +/* */ +/*===================================================================*/ + +BYTE Map49_Regs[ 3 ]; +DWORD Map49_Prg0, Map49_Prg1; +DWORD Map49_Chr01, Map49_Chr23; +DWORD Map49_Chr4, Map49_Chr5, Map49_Chr6, Map49_Chr7; + +BYTE Map49_IRQ_Enable; +BYTE Map49_IRQ_Cnt; +BYTE Map49_IRQ_Latch; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 49 */ +/*-------------------------------------------------------------------*/ +void Map49_Init() +{ + /* Initialize Mapper */ + MapperInit = Map49_Init; + + /* Write to Mapper */ + MapperWrite = Map49_Write; + + /* Write to SRAM */ + MapperSram = Map49_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map49_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + Map49_Prg0 = 0; + Map49_Prg1 = 1; + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + + /* Set PPU Banks */ + Map49_Chr01 = 0; + Map49_Chr23 = 2; + Map49_Chr4 = 4; + Map49_Chr5 = 5; + Map49_Chr6 = 6; + Map49_Chr7 = 7; + + for ( int nPage = 0; nPage < 8; ++nPage ) + { + PPUBANK[ nPage ] = VROMPAGE( nPage ); + } + InfoNES_SetupChr(); + + /* Initialize IRQ Registers */ + Map49_Regs[ 0 ] = Map49_Regs[ 1 ] = Map49_Regs[ 2 ] = 0; + Map49_IRQ_Enable = 0; + Map49_IRQ_Cnt = 0; + Map49_IRQ_Latch = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 49 Write to Sram Function */ +/*-------------------------------------------------------------------*/ +void Map49_Sram( WORD wAddr, BYTE byData ) +{ + if ( Map49_Regs[ 2 ] & 0x80 ) + { + Map49_Regs[ 1 ] = byData; + Map49_Set_CPU_Banks(); + Map49_Set_PPU_Banks(); + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 49 Write Function */ +/*-------------------------------------------------------------------*/ +void Map49_Write( WORD wAddr, BYTE byData ) +{ + switch ( wAddr & 0xe001 ) + { + case 0x8000: + if ( ( byData & 0x40 ) != ( Map49_Regs[ 0 ] & 0x40 ) ) + { + Map49_Set_CPU_Banks(); + } + if ( ( byData & 0x80 ) != ( Map49_Regs[ 0 ] & 0x80 ) ) + { + Map49_Regs[ 0 ] = byData; + Map49_Set_PPU_Banks(); + } + Map49_Regs[ 0 ] = byData; + break; + + case 0x8001: + switch ( Map49_Regs[ 0 ] & 0x07 ) + { + /* Set PPU Banks */ + case 0x00: + Map49_Chr01 = byData & 0xfe; + Map49_Set_PPU_Banks(); + break; + + case 0x01: + Map49_Chr23 = byData & 0xfe; + Map49_Set_PPU_Banks(); + break; + + case 0x02: + Map49_Chr4 = byData; + Map49_Set_PPU_Banks(); + break; + + case 0x03: + Map49_Chr5 = byData; + Map49_Set_PPU_Banks(); + break; + + case 0x04: + Map49_Chr6 = byData; + Map49_Set_PPU_Banks(); + break; + + case 0x05: + Map49_Chr7 = byData; + Map49_Set_PPU_Banks(); + break; + + /* Set ROM Banks */ + case 0x06: + Map49_Prg0 = byData; + Map49_Set_CPU_Banks(); + break; + + case 0x07: + Map49_Prg1 = byData; + Map49_Set_CPU_Banks(); + break; + } + break; + + case 0xa000: + if ( !ROM_FourScr ) + { + if ( byData & 0x01 ) + { + InfoNES_Mirroring( 0 ); + } else { + InfoNES_Mirroring( 1 ); + } + } + break; + + case 0xa001: + Map49_Regs[ 2 ] = byData; + break; + + case 0xc000: + Map49_IRQ_Cnt = byData; + break; + + case 0xc001: + Map49_IRQ_Latch = byData; + break; + + case 0xe000: + Map49_IRQ_Enable = 0; + break; + + case 0xe001: + Map49_IRQ_Enable = 1; + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 49 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map49_HSync() +{ +/* + * Callback at HSync + * + */ + if ( Map49_IRQ_Enable ) + { + if ( /* 0 <= PPU_Scanline && */ PPU_Scanline <= 239 ) + { + if ( PPU_R1 & R1_SHOW_SCR || PPU_R1 & R1_SHOW_SP ) + { + if ( !( Map49_IRQ_Cnt-- ) ) + { + Map49_IRQ_Cnt = Map49_IRQ_Latch; + IRQ_REQ; + } + } + } + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 49 Set CPU Banks Function */ +/*-------------------------------------------------------------------*/ +void Map49_Set_CPU_Banks() +{ + DWORD dwBank0, dwBank1, dwBank2, dwBank3; + + if ( Map49_Regs[ 1 ] & 0x01 ) + { + if ( Map49_Regs[ 0 ] & 0x40 ) + { + dwBank0 = ( ( ( NesHeader.byRomSize << 1 ) - 1 ) & 0x0e ) | ( ( Map49_Regs[ 1 ] & 0xc0 ) >> 2 ); + dwBank1 = ( Map49_Prg1 & 0x0f ) | ( ( Map49_Regs[ 1 ] & 0xc0 ) >> 2 ); + dwBank2 = ( Map49_Prg0 & 0x0f ) | ( ( Map49_Regs[ 1 ] & 0xc0 ) >> 2 ); + dwBank3 = ( ( ( NesHeader.byRomSize << 1 ) - 1 ) & 0x0f ) | ( ( Map49_Regs[ 1 ] & 0xc0 ) >> 2 ); + } else { + dwBank0 = ( Map49_Prg0 & 0x0f ) | ( ( Map49_Regs[ 1 ] & 0xc0 ) >> 2 ); + dwBank1 = ( Map49_Prg1 & 0x0f ) | ( ( Map49_Regs[ 1 ] & 0xc0 ) >> 2 ); + dwBank2 = ( ( ( NesHeader.byRomSize << 1 ) - 1 ) & 0x0e ) | ( ( Map49_Regs[ 1 ] & 0xc0 ) >> 2 ); + dwBank3 = ( ( ( NesHeader.byRomSize << 1 ) - 1 ) & 0x0f ) | ( ( Map49_Regs[ 1 ] & 0xc0 ) >> 2 ); + } + } else { + dwBank0 = ( ( Map49_Regs[ 1 ] & 0x70 ) >> 2 ) | 0; + dwBank1 = ( ( Map49_Regs[ 1 ] & 0x70 ) >> 2 ) | 1; + dwBank2 = ( ( Map49_Regs[ 1 ] & 0x70 ) >> 2 ) | 2; + dwBank3 = ( ( Map49_Regs[ 1 ] & 0x70 ) >> 2 ) | 3; + } + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( dwBank0 % ( NesHeader.byRomSize << 1) ); + ROMBANK1 = ROMPAGE( dwBank1 % ( NesHeader.byRomSize << 1) ); + ROMBANK2 = ROMPAGE( dwBank2 % ( NesHeader.byRomSize << 1) ); + ROMBANK3 = ROMPAGE( dwBank3 % ( NesHeader.byRomSize << 1) ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 49 Set PPU Banks Function */ +/*-------------------------------------------------------------------*/ +void Map49_Set_PPU_Banks() +{ + Map49_Chr01 = ( Map49_Chr01 & 0x7f ) | ( ( Map49_Regs[ 1 ] & 0xc0 ) << 1 ); + Map49_Chr23 = ( Map49_Chr23 & 0x7f ) | ( ( Map49_Regs[ 1 ] & 0xc0 ) << 1 ); + Map49_Chr4 = ( Map49_Chr4 & 0x7f ) | ( ( Map49_Regs[ 1 ] & 0xc0 ) << 1 ); + Map49_Chr5 = ( Map49_Chr5 & 0x7f ) | ( ( Map49_Regs[ 1 ] & 0xc0 ) << 1 ); + Map49_Chr6 = ( Map49_Chr6 & 0x7f ) | ( ( Map49_Regs[ 1 ] & 0xc0 ) << 1 ); + Map49_Chr7 = ( Map49_Chr7 & 0x7f ) | ( ( Map49_Regs[ 1 ] & 0xc0 ) << 1 ); + + /* Set PPU Banks */ + if ( Map49_Regs[ 0 ] & 0x80 ) + { + PPUBANK[ 0 ] = VROMPAGE( Map49_Chr4 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( Map49_Chr5 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( Map49_Chr6 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( Map49_Chr7 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 4 ] = VROMPAGE( ( Map49_Chr01 + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( ( Map49_Chr01 + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE( ( Map49_Chr23 + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( ( Map49_Chr23 + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + } else { + PPUBANK[ 0 ] = VROMPAGE( ( Map49_Chr01 + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( ( Map49_Chr01 + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( ( Map49_Chr23 + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( ( Map49_Chr23 + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 4 ] = VROMPAGE( Map49_Chr4 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( Map49_Chr5 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE( Map49_Chr6 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( Map49_Chr7 % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_185.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_185.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_185.c (revision 0) @@ -0,0 +1,88 @@ +/*===================================================================*/ +/* */ +/* Mapper 185 (Tecmo) */ +/* */ +/*===================================================================*/ + +BYTE Map185_Dummy_Chr_Rom[ 0x400 ]; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 185 */ +/*-------------------------------------------------------------------*/ +void Map185_Init() +{ + /* Initialize Mapper */ + MapperInit = Map185_Init; + + /* Write to Mapper */ + MapperWrite = Map185_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + + /* Initialize Dummy VROM */ + for ( int nPage = 0; nPage < 0x400; nPage++ ) + { + Map185_Dummy_Chr_Rom[ nPage ] = 0xff; + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 185 Write Function */ +/*-------------------------------------------------------------------*/ +void Map185_Write( WORD wAddr, BYTE byData ) +{ + /* Set PPU Banks */ + if ( byData & 0x03 ) + { + PPUBANK[ 0 ] = VROMPAGE( 0 ); + PPUBANK[ 1 ] = VROMPAGE( 1 ); + PPUBANK[ 2 ] = VROMPAGE( 2 ); + PPUBANK[ 3 ] = VROMPAGE( 3 ); + PPUBANK[ 4 ] = VROMPAGE( 4 ); + PPUBANK[ 5 ] = VROMPAGE( 5 ); + PPUBANK[ 6 ] = VROMPAGE( 6 ); + PPUBANK[ 7 ] = VROMPAGE( 7 ); + InfoNES_SetupChr(); + } else { + PPUBANK[ 0 ] = Map185_Dummy_Chr_Rom; + PPUBANK[ 1 ] = Map185_Dummy_Chr_Rom; + PPUBANK[ 2 ] = Map185_Dummy_Chr_Rom; + PPUBANK[ 3 ] = Map185_Dummy_Chr_Rom; + PPUBANK[ 4 ] = Map185_Dummy_Chr_Rom; + PPUBANK[ 5 ] = Map185_Dummy_Chr_Rom; + PPUBANK[ 6 ] = Map185_Dummy_Chr_Rom; + PPUBANK[ 7 ] = Map185_Dummy_Chr_Rom; + InfoNES_SetupChr(); + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_249.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_249.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_249.c (revision 0) @@ -0,0 +1,325 @@ +/*===================================================================*/ +/* */ +/* Mapper 249 : MMC3 */ +/* */ +/*===================================================================*/ + +BYTE Map249_Spdata; +BYTE Map249_Reg[8]; + +BYTE Map249_IRQ_Enable; +BYTE Map249_IRQ_Counter; +BYTE Map249_IRQ_Latch; +BYTE Map249_IRQ_Request; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 249 */ +/*-------------------------------------------------------------------*/ +void Map249_Init() +{ + /* Initialize Mapper */ + MapperInit = Map249_Init; + + /* Write to Mapper */ + MapperWrite = Map249_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map249_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map249_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set Registers */ + for( int i = 0; i < 8; i++ ) { + Map249_Reg[i] = 0x00; + } + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set Registers */ + Map249_IRQ_Enable = 0; // Disable + Map249_IRQ_Counter = 0; + Map249_IRQ_Latch = 0; + Map249_IRQ_Request = 0; + + Map249_Spdata = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 249 Write Function */ +/*-------------------------------------------------------------------*/ +void Map249_Write( WORD wAddr, BYTE byData ) +{ + BYTE byM0,byM1,byM2,byM3,byM4,byM5,byM6,byM7; + + switch( wAddr&0xFF01 ) { + case 0x8000: + case 0x8800: + Map249_Reg[0] = byData; + break; + case 0x8001: + case 0x8801: + switch( Map249_Reg[0] & 0x07 ) { + case 0x00: + if( Map249_Spdata == 1 ) { + byM0=byData&0x1; + byM1=(byData&0x02)>>1; + byM2=(byData&0x04)>>2; + byM3=(byData&0x08)>>3; + byM4=(byData&0x10)>>4; + byM5=(byData&0x20)>>5; + byM6=(byData&0x40)>>6; + byM7=(byData&0x80)>>7; + byData=(byM5<<7)|(byM4<<6)|(byM2<<5)|(byM6<<4)|(byM7<<3)|(byM3<<2)|(byM1<<1)|byM0; + } + PPUBANK[ 0 ] = VROMPAGE((byData&0xFE) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 1 ] = VROMPAGE((byData|0x01) % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + break; + case 0x01: + if( Map249_Spdata == 1 ) { + byM0=byData&0x1; + byM1=(byData&0x02)>>1; + byM2=(byData&0x04)>>2; + byM3=(byData&0x08)>>3; + byM4=(byData&0x10)>>4; + byM5=(byData&0x20)>>5; + byM6=(byData&0x40)>>6; + byM7=(byData&0x80)>>7; + byData=(byM5<<7)|(byM4<<6)|(byM2<<5)|(byM6<<4)|(byM7<<3)|(byM3<<2)|(byM1<<1)|byM0; + } + PPUBANK[ 2 ] = VROMPAGE((byData&0xFE) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 3 ] = VROMPAGE((byData|0x01) % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + break; + case 0x02: + if( Map249_Spdata == 1 ) { + byM0=byData&0x1; + byM1=(byData&0x02)>>1; + byM2=(byData&0x04)>>2; + byM3=(byData&0x08)>>3; + byM4=(byData&0x10)>>4; + byM5=(byData&0x20)>>5; + byM6=(byData&0x40)>>6; + byM7=(byData&0x80)>>7; + byData=(byM5<<7)|(byM4<<6)|(byM2<<5)|(byM6<<4)|(byM7<<3)|(byM3<<2)|(byM1<<1)|byM0; + } + PPUBANK[ 4 ] = VROMPAGE(byData % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + break; + case 0x03: + if( Map249_Spdata == 1 ) { + byM0=byData&0x1; + byM1=(byData&0x02)>>1; + byM2=(byData&0x04)>>2; + byM3=(byData&0x08)>>3; + byM4=(byData&0x10)>>4; + byM5=(byData&0x20)>>5; + byM6=(byData&0x40)>>6; + byM7=(byData&0x80)>>7; + byData=(byM5<<7)|(byM4<<6)|(byM2<<5)|(byM6<<4)|(byM7<<3)|(byM3<<2)|(byM1<<1)|byM0; + } + PPUBANK[ 5 ] = VROMPAGE(byData % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + break; + case 0x04: + if( Map249_Spdata == 1 ) { + byM0=byData&0x1; + byM1=(byData&0x02)>>1; + byM2=(byData&0x04)>>2; + byM3=(byData&0x08)>>3; + byM4=(byData&0x10)>>4; + byM5=(byData&0x20)>>5; + byM6=(byData&0x40)>>6; + byM7=(byData&0x80)>>7; + byData=(byM5<<7)|(byM4<<6)|(byM2<<5)|(byM6<<4)|(byM7<<3)|(byM3<<2)|(byM1<<1)|byM0; + } + PPUBANK[ 6 ] = VROMPAGE(byData % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + break; + case 0x05: + if( Map249_Spdata == 1 ) { + byM0=byData&0x1; + byM1=(byData&0x02)>>1; + byM2=(byData&0x04)>>2; + byM3=(byData&0x08)>>3; + byM4=(byData&0x10)>>4; + byM5=(byData&0x20)>>5; + byM6=(byData&0x40)>>6; + byM7=(byData&0x80)>>7; + byData=(byM5<<7)|(byM4<<6)|(byM2<<5)|(byM6<<4)|(byM7<<3)|(byM3<<2)|(byM1<<1)|byM0; + } + PPUBANK[ 7 ] = VROMPAGE(byData % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + break; + case 0x06: + if( Map249_Spdata == 1 ) { + if( byData < 0x20 ) { + byM0=byData&0x1; + byM1=(byData&0x02)>>1; + byM2=(byData&0x04)>>2; + byM3=(byData&0x08)>>3; + byM4=(byData&0x10)>>4; + byM5=0; + byM6=0; + byM7=0; + byData=(byM7<<7)|(byM6<<6)|(byM5<<5)|(byM2<<4)|(byM1<<3)|(byM3<<2)|(byM4<<1)|byM0; + } else { + byData=byData-0x20; + byM0=byData&0x1; + byM1=(byData&0x02)>>1; + byM2=(byData&0x04)>>2; + byM3=(byData&0x08)>>3; + byM4=(byData&0x10)>>4; + byM5=(byData&0x20)>>5; + byM6=(byData&0x40)>>6; + byM7=(byData&0x80)>>7; + byData=(byM5<<7)|(byM4<<6)|(byM2<<5)|(byM6<<4)|(byM7<<3)|(byM3<<2)|(byM1<<1)|byM0; + } + } + ROMBANK0 = ROMPAGE(byData % (NesHeader.byRomSize<<1)); + break; + case 0x07: + if( Map249_Spdata == 1 ) { + if( byData < 0x20 ) { + byM0=byData&0x1; + byM1=(byData&0x02)>>1; + byM2=(byData&0x04)>>2; + byM3=(byData&0x08)>>3; + byM4=(byData&0x10)>>4; + byM5=0; + byM6=0; + byM7=0; + byData=(byM7<<7)|(byM6<<6)|(byM5<<5)|(byM2<<4)|(byM1<<3)|(byM3<<2)|(byM4<<1)|byM0; + } else { + byData=byData-0x20; + byM0=byData&0x1; + byM1=(byData&0x02)>>1; + byM2=(byData&0x04)>>2; + byM3=(byData&0x08)>>3; + byM4=(byData&0x10)>>4; + byM5=(byData&0x20)>>5; + byM6=(byData&0x40)>>6; + byM7=(byData&0x80)>>7; + byData=(byM5<<7)|(byM4<<6)|(byM2<<5)|(byM6<<4)|(byM7<<3)|(byM3<<2)|(byM1<<1)|byM0; + } + } + ROMBANK1 = ROMPAGE(byData % (NesHeader.byRomSize<<1)); + break; + } + break; + case 0xA000: + case 0xA800: + Map249_Reg[2] = byData; + if( !ROM_FourScr ) { + if( byData & 0x01 ) InfoNES_Mirroring( 0 ); + else InfoNES_Mirroring( 1 ); + } + break; + case 0xA001: + case 0xA801: + Map249_Reg[3] = byData; + break; + case 0xC000: + case 0xC800: + Map249_Reg[4] = byData; + Map249_IRQ_Counter = byData; + Map249_IRQ_Request = 0; + break; + case 0xC001: + case 0xC801: + Map249_Reg[5] = byData; + Map249_IRQ_Latch = byData; + Map249_IRQ_Request = 0; + break; + case 0xE000: + case 0xE800: + Map249_Reg[6] = byData; + Map249_IRQ_Enable = 0; + Map249_IRQ_Request = 0; + break; + case 0xE001: + case 0xE801: + Map249_Reg[7] = byData; + Map249_IRQ_Enable = 1; + Map249_IRQ_Request = 0; + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 249 Write to APU Function */ +/*-------------------------------------------------------------------*/ +void Map249_Apu( WORD wAddr, BYTE byData ) +{ + if( wAddr == 0x5000 ) { + switch( byData ) { + case 0x00: + Map249_Spdata = 0; + break; + case 0x02: + Map249_Spdata = 1; + break; + } + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 249 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map249_HSync() +{ + if( ( /* PPU_Scanline >= 0 && */ PPU_Scanline <= 239) ) { + if( PPU_R1 & R1_SHOW_SCR || PPU_R1 & R1_SHOW_SP ) { + if( Map249_IRQ_Enable && !Map249_IRQ_Request ) { + if( PPU_Scanline == 0 ) { + if( Map249_IRQ_Counter ) { + Map249_IRQ_Counter--; + } + } + if( !(Map249_IRQ_Counter--) ) { + Map249_IRQ_Request = 0xFF; + Map249_IRQ_Counter = Map249_IRQ_Latch; + } + } + } + } + if( Map249_IRQ_Request ) { + IRQ_REQ; + } +} + Index: apps/plugins/infones/mapper/InfoNES_Mapper_087.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_087.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_087.c (revision 0) @@ -0,0 +1,85 @@ +/*===================================================================*/ +/* */ +/* Mapper 87 (74161/32) */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 87 */ +/*-------------------------------------------------------------------*/ +void Map87_Init() +{ + /* Initialize Mapper */ + MapperInit = Map87_Init; + + /* Write to Mapper */ + MapperWrite = Map0_Write; + + /* Write to SRAM */ + MapperSram = Map87_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 87 Write to SRAM Function */ +/*-------------------------------------------------------------------*/ +void Map87_Sram( WORD wAddr, BYTE byData ) +{ + BYTE byChrBank; + + switch ( wAddr ) + { + case 0x6000: + byChrBank = ( byData & 0x02 ) >> 1; + byChrBank <<= 3; + byChrBank %= ( NesHeader.byVRomSize << 3 ); + + PPUBANK[ 0 ] = VROMPAGE( byChrBank + 0 ); + PPUBANK[ 1 ] = VROMPAGE( byChrBank + 1 ); + PPUBANK[ 2 ] = VROMPAGE( byChrBank + 2 ); + PPUBANK[ 3 ] = VROMPAGE( byChrBank + 3 ); + PPUBANK[ 4 ] = VROMPAGE( byChrBank + 4 ); + PPUBANK[ 5 ] = VROMPAGE( byChrBank + 5 ); + PPUBANK[ 6 ] = VROMPAGE( byChrBank + 6 ); + PPUBANK[ 7 ] = VROMPAGE( byChrBank + 7 ); + InfoNES_SetupChr(); + break; + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_189.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_189.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_189.c (revision 0) @@ -0,0 +1,185 @@ +/*===================================================================*/ +/* */ +/* Mapper 189 (Pirates) */ +/* */ +/*===================================================================*/ + +BYTE Map189_Regs[ 1 ]; +BYTE Map189_IRQ_Cnt; +BYTE Map189_IRQ_Latch; +BYTE Map189_IRQ_Enable; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 189 */ +/*-------------------------------------------------------------------*/ +void Map189_Init() +{ + /* Initialize Mapper */ + MapperInit = Map189_Init; + + /* Write to Mapper */ + MapperWrite = Map189_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map189_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map189_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( int nPage = 0; nPage < 8; ++nPage ) + { + PPUBANK[ nPage ] = VROMPAGE( nPage ); + } + InfoNES_SetupChr(); + } + + /* Initialize IRQ registers */ + Map189_IRQ_Cnt = 0; + Map189_IRQ_Latch = 0; + Map189_IRQ_Enable = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 189 Write to Apu Function */ +/*-------------------------------------------------------------------*/ +void Map189_Apu( WORD wAddr, BYTE byData ) +{ + if ( wAddr >= 0x4100 && wAddr <= 0x41FF ) + { + byData = ( byData & 0x30 ) >> 4; + ROMBANK0 = ROMPAGE( ( byData * 4 + 0 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE( ( byData * 4 + 1 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMPAGE( ( byData * 4 + 2 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK3 = ROMPAGE( ( byData * 4 + 3 ) % ( NesHeader.byRomSize << 1 ) ); + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 189 Write Function */ +/*-------------------------------------------------------------------*/ +void Map189_Write( WORD wAddr, BYTE byData ) +{ + /* Set ROM Banks */ + switch( wAddr ) + { + case 0x8000: + Map189_Regs[0] = byData; + break; + + case 0x8001: + switch( Map189_Regs[0] ) + { + case 0x40: + PPUBANK[ 0 ] = VROMPAGE( ( byData + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( ( byData + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0x41: + PPUBANK[ 2 ] = VROMPAGE( ( byData + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( ( byData + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0x42: + PPUBANK[ 4 ] = VROMPAGE( byData % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0x43: + PPUBANK[ 5 ] = VROMPAGE( byData % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0x44: + PPUBANK[ 6 ] = VROMPAGE( byData % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0x45: + PPUBANK[ 7 ] = VROMPAGE( byData % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0x46: + ROMBANK2 = ROMPAGE( byData % ( NesHeader.byRomSize << 1 ) ); + break; + + case 0x47: + ROMBANK1 = ROMPAGE( byData % ( NesHeader.byRomSize << 1 ) ); + break; + } + break; + + case 0xC000: + Map189_IRQ_Cnt = byData; + break; + + case 0xC001: + Map189_IRQ_Latch = byData; + break; + + case 0xE000: + Map189_IRQ_Enable = 0; + break; + + case 0xE001: + Map189_IRQ_Enable = 1; + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 189 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map189_HSync() +{ +/* + * Callback at HSync + * + */ + if ( Map189_IRQ_Enable ) + { + if ( /* 0 <= PPU_Scanline && */ PPU_Scanline <= 239 ) + { + if ( PPU_R1 & R1_SHOW_SCR || PPU_R1 & R1_SHOW_SP ) + { + if ( !( --Map189_IRQ_Cnt ) ) + { + Map189_IRQ_Cnt = Map189_IRQ_Latch; + IRQ_REQ; + } + } + } + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_110.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_110.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_110.c (revision 0) @@ -0,0 +1,142 @@ +/*===================================================================*/ +/* */ +/* Mapper 110 */ +/* */ +/*===================================================================*/ + +BYTE Map110_Reg0, Map110_Reg1; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 110 */ +/*-------------------------------------------------------------------*/ +void Map110_Init() +{ + /* Initialize Mapper */ + MapperInit = Map110_Init; + + /* Write to Mapper */ + MapperWrite = Map0_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map110_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Initialize Registers */ + Map110_Reg0 = 0; + Map110_Reg1 = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 110 Write to APU Function */ +/*-------------------------------------------------------------------*/ +void Map110_Apu( WORD wAddr, BYTE byData ) +{ + switch( wAddr ) { + case 0x4100: + Map110_Reg1 = byData & 0x07; + break; + case 0x4101: + switch( Map110_Reg1 ) { + case 5: + ROMBANK0 = ROMPAGE( ((byData << 2) + 0) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE( ((byData << 2) + 1) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMPAGE( ((byData << 2) + 2) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK3 = ROMPAGE( ((byData << 2) + 3) % ( NesHeader.byRomSize << 1 ) ); + break; + + case 0: + Map110_Reg0 = byData & 0x01; + PPUBANK[ 0 ] = VROMPAGE(((Map110_Reg0 << 3) + 0) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 1 ] = VROMPAGE(((Map110_Reg0 << 3) + 1) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 2 ] = VROMPAGE(((Map110_Reg0 << 3) + 2) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 3 ] = VROMPAGE(((Map110_Reg0 << 3) + 3) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 4 ] = VROMPAGE(((Map110_Reg0 << 3) + 4) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 5 ] = VROMPAGE(((Map110_Reg0 << 3) + 5) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 6 ] = VROMPAGE(((Map110_Reg0 << 3) + 6) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 7 ] = VROMPAGE(((Map110_Reg0 << 3) + 7) % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + break; + + case 2: + Map110_Reg0 = byData; + PPUBANK[ 0 ] = VROMPAGE(((Map110_Reg0 << 3) + 0) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 1 ] = VROMPAGE(((Map110_Reg0 << 3) + 1) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 2 ] = VROMPAGE(((Map110_Reg0 << 3) + 2) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 3 ] = VROMPAGE(((Map110_Reg0 << 3) + 3) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 4 ] = VROMPAGE(((Map110_Reg0 << 3) + 4) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 5 ] = VROMPAGE(((Map110_Reg0 << 3) + 5) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 6 ] = VROMPAGE(((Map110_Reg0 << 3) + 6) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 7 ] = VROMPAGE(((Map110_Reg0 << 3) + 7) % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + break; + + case 4: + Map110_Reg0 = Map110_Reg0 | (byData<<1); + PPUBANK[ 0 ] = VROMPAGE(((Map110_Reg0 << 3) + 0) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 1 ] = VROMPAGE(((Map110_Reg0 << 3) + 1) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 2 ] = VROMPAGE(((Map110_Reg0 << 3) + 2) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 3 ] = VROMPAGE(((Map110_Reg0 << 3) + 3) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 4 ] = VROMPAGE(((Map110_Reg0 << 3) + 4) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 5 ] = VROMPAGE(((Map110_Reg0 << 3) + 5) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 6 ] = VROMPAGE(((Map110_Reg0 << 3) + 6) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 7 ] = VROMPAGE(((Map110_Reg0 << 3) + 7) % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + break; + + case 6: + Map110_Reg0 = Map110_Reg0 | (byData<<2); + PPUBANK[ 0 ] = VROMPAGE(((Map110_Reg0 << 3) + 0) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 1 ] = VROMPAGE(((Map110_Reg0 << 3) + 1) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 2 ] = VROMPAGE(((Map110_Reg0 << 3) + 2) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 3 ] = VROMPAGE(((Map110_Reg0 << 3) + 3) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 4 ] = VROMPAGE(((Map110_Reg0 << 3) + 4) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 5 ] = VROMPAGE(((Map110_Reg0 << 3) + 5) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 6 ] = VROMPAGE(((Map110_Reg0 << 3) + 6) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 7 ] = VROMPAGE(((Map110_Reg0 << 3) + 7) % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + break; + + default: + break; + } + break; + default: + break; + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_050.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_050.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_050.c (revision 0) @@ -0,0 +1,104 @@ +/*===================================================================*/ +/* */ +/* Mapper 50 (Pirates) */ +/* */ +/*===================================================================*/ + +BYTE Map50_IRQ_Enable; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 50 */ +/*-------------------------------------------------------------------*/ +void Map50_Init() +{ + /* Initialize Mapper */ + MapperInit = Map50_Init; + + /* Write to Mapper */ + MapperWrite = Map0_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map50_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map50_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = ROMPAGE( 15 % ( NesHeader.byRomSize << 1 ) ); + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 8 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE( 9 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMPAGE( 0 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK3 = ROMPAGE( 11 % ( NesHeader.byRomSize << 1 ) ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( int nPage = 0; nPage < 8; ++nPage ) + { + PPUBANK[ nPage ] = VROMPAGE( nPage ); + } + InfoNES_SetupChr(); + } + + /* Initialize IRQ Registers */ + Map50_IRQ_Enable = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 50 Write to Apu Function */ +/*-------------------------------------------------------------------*/ +void Map50_Apu( WORD wAddr, BYTE byData ) +{ + if ( ( wAddr & 0xE060 ) == 0x4020 ) + { + if( wAddr & 0x0100 ) + { + Map50_IRQ_Enable = byData & 0x01; + } + else + { + BYTE byDummy; + + byDummy = ( byData & 0x08 ) | ( ( byData & 0x01 ) << 2 ) | ( ( byData & 0x06 ) >> 1 ); + ROMBANK2 = ROMPAGE( byDummy % ( NesHeader.byRomSize << 1 ) ); + } + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 50 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map50_HSync() +{ +/* + * Callback at HSync + * + */ + if ( Map50_IRQ_Enable ) + { + if ( PPU_Scanline == 21 ) + { + IRQ_REQ; + } + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_033.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_033.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_033.c (revision 0) @@ -0,0 +1,199 @@ +/*===================================================================*/ +/* */ +/* Mapper 33 (Taito TC0190/TC0350) */ +/* */ +/*===================================================================*/ + +BYTE Map33_Regs[ 8 ]; +BYTE Map33_Switch; + +BYTE Map33_IRQ_Enable; +BYTE Map33_IRQ_Cnt; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 33 */ +/*-------------------------------------------------------------------*/ +void Map33_Init() +{ + int nPage; + /* Initialize Mapper */ + MapperInit = Map33_Init; + + /* Write to Mapper */ + MapperWrite = Map33_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( nPage = 0; nPage < 8; ++nPage ) + { + PPUBANK[ nPage ] = VROMPAGE( nPage ); + Map33_Regs[ nPage ] = nPage; + } + InfoNES_SetupChr(); + } + else + { + for ( nPage = 0; nPage < 8; ++nPage ) + { + Map33_Regs[ nPage ] = 0; + } + } + + /* Initialize State Registers */ + Map33_Switch = 0; + Map33_IRQ_Enable = 0; + Map33_IRQ_Cnt = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 33 Write Function */ +/*-------------------------------------------------------------------*/ +void Map33_Write( WORD wAddr, BYTE byData ) +{ + /* Set ROM Banks */ + switch ( wAddr ) + { + case 0x8000: + byData %= ( NesHeader.byRomSize << 1 ); + ROMBANK0 = ROMPAGE( byData ); + break; + + case 0x8001: + byData %= ( NesHeader.byRomSize << 1 ); + ROMBANK1 = ROMPAGE( byData ); + break; + + case 0x8002: + Map33_Regs[ 0 ] = byData * 2; + Map33_Regs[ 1 ] = byData * 2 + 1; + + PPUBANK[ 0 ] = VROMPAGE( Map33_Regs[ 0 ] % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( Map33_Regs[ 1 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0x8003: + Map33_Regs[ 2 ] = byData * 2; + Map33_Regs[ 3 ] = byData * 2 + 1; + + PPUBANK[ 2 ] = VROMPAGE( Map33_Regs[ 2 ] % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( Map33_Regs[ 3 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xa000: + Map33_Regs[ 4 ] = byData; + PPUBANK[ 4 ] = VROMPAGE( Map33_Regs[ 4 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xa001: + Map33_Regs[ 5 ] = byData; + PPUBANK[ 5 ] = VROMPAGE( Map33_Regs[ 5 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xa002: + Map33_Regs[ 6 ] = byData; + PPUBANK[ 6 ] = VROMPAGE( Map33_Regs[ 6 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xa003: + Map33_Regs[ 7 ] = byData; + PPUBANK[ 7 ] = VROMPAGE( Map33_Regs[ 7 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xc000: + Map33_IRQ_Cnt = byData; + break; + + case 0xc001: + case 0xc002: + case 0xe001: + case 0xe002: + if ( Map33_IRQ_Cnt == byData ) + { + Map33_IRQ_Enable = 0xff; + } else { + Map33_IRQ_Enable = byData; + } + break; + + case 0xe000: + if ( byData & 0x40 ) + { + InfoNES_Mirroring( 0 ); + } else { + InfoNES_Mirroring( 1 ); + } + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 33 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map33_HSync() +{ +/* + * Callback at HSync + * + */ + if ( Map33_IRQ_Enable ) + { + if ( Map33_IRQ_Enable == 0xff ) + { + if ( PPU_Scanline == (WORD)( 0xff - Map33_IRQ_Cnt ) ) + { + IRQ_REQ; + Map33_IRQ_Cnt = 0; + Map33_IRQ_Enable = 0; + } + } else { + if ( Map33_IRQ_Cnt == 0xff ) + { + IRQ_REQ; + Map33_IRQ_Cnt = 0; + Map33_IRQ_Enable = 0; + } else { + Map33_IRQ_Cnt++; + } + } + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_114.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_114.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_114.c (revision 0) @@ -0,0 +1,335 @@ +/*===================================================================*/ +/* */ +/* Mapper 114 (PC-SuperGames) */ +/* */ +/*===================================================================*/ + +BYTE Map114_Regs[ 8 ]; +DWORD Map114_Prg0, Map114_Prg1; +DWORD Map114_Chr01, Map114_Chr23; +DWORD Map114_Chr4, Map114_Chr5, Map114_Chr6, Map114_Chr7; + +BYTE Map114_IRQ_Enable; +BYTE Map114_IRQ_Cnt; +BYTE Map114_IRQ_Latch; + +#define Map114_Chr_Swap() ( Map114_Regs[ 0 ] & 0x80 ) +#define Map114_Prg_Swap() ( Map114_Regs[ 0 ] & 0x40 ) + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 114 */ +/*-------------------------------------------------------------------*/ +void Map114_Init() +{ + /* Initialize Mapper */ + MapperInit = Map114_Init; + + /* Write to Mapper */ + MapperWrite = Map114_Write; + + /* Write to SRAM */ + MapperSram = Map114_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map114_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Initialize State Registers */ + for ( int nPage = 0; nPage < 8; nPage++) + { + Map114_Regs[ nPage ] = 0x00; + } + + /* Set ROM Banks */ + Map114_Prg0 = 0; + Map114_Prg1 = 1; + Map114_Set_CPU_Banks(); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + Map114_Chr01 = 0; + Map114_Chr23 = 2; + Map114_Chr4 = 4; + Map114_Chr5 = 5; + Map114_Chr6 = 6; + Map114_Chr7 = 7; + Map114_Set_PPU_Banks(); + } else { + Map114_Chr01 = Map114_Chr23 = 0; + Map114_Chr4 = Map114_Chr5 = Map114_Chr6 = Map114_Chr7 = 0; + } + + /* Initialize IRQ Registers */ + Map114_IRQ_Enable = 0; + Map114_IRQ_Cnt = 0; + Map114_IRQ_Latch = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 114 Write to Sram Function */ +/*-------------------------------------------------------------------*/ +void Map114_Sram( WORD wAddr, BYTE byData ) +{ + if ( ( wAddr == 0x6000 ) && ( byData == 0x00 ) ) + { + /* Initialize State Registers */ + for ( int nPage = 0; nPage < 8; nPage++) + { + Map114_Regs[ nPage ] = 0x00; + } + + /* Set ROM Banks */ + Map114_Prg0 = 0; + Map114_Prg1 = 1; + Map114_Set_CPU_Banks(); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + Map114_Chr01 = 0; + Map114_Chr23 = 2; + Map114_Chr4 = 4; + Map114_Chr5 = 5; + Map114_Chr6 = 6; + Map114_Chr7 = 7; + Map114_Set_PPU_Banks(); + } else { + Map114_Chr01 = Map114_Chr23 = 0; + Map114_Chr4 = Map114_Chr5 = Map114_Chr6 = Map114_Chr7 = 0; + } + + /* Initialize IRQ Registers */ + Map114_IRQ_Enable = 0; + Map114_IRQ_Cnt = 0; + Map114_IRQ_Latch = 0; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 114 Write Function */ +/*-------------------------------------------------------------------*/ +void Map114_Write( WORD wAddr, BYTE byData ) +{ + DWORD dwBankNum; + + switch ( wAddr & 0xe001 ) + { + case 0x8000: + Map114_Regs[ 0 ] = byData; + Map114_Set_PPU_Banks(); + Map114_Set_CPU_Banks(); + break; + + case 0x8001: + Map114_Regs[ 1 ] = byData; + dwBankNum = Map114_Regs[ 1 ]; + + switch ( Map114_Regs[ 0 ] & 0x07 ) + { + /* Set PPU Banks */ + case 0x00: + if ( NesHeader.byVRomSize > 0 ) + { + dwBankNum &= 0xfe; + Map114_Chr01 = dwBankNum; + Map114_Set_PPU_Banks(); + } + break; + + case 0x01: + if ( NesHeader.byVRomSize > 0 ) + { + dwBankNum &= 0xfe; + Map114_Chr23 = dwBankNum; + Map114_Set_PPU_Banks(); + } + break; + + case 0x02: + if ( NesHeader.byVRomSize > 0 ) + { + Map114_Chr4 = dwBankNum; + Map114_Set_PPU_Banks(); + } + break; + + case 0x03: + if ( NesHeader.byVRomSize > 0 ) + { + Map114_Chr5 = dwBankNum; + Map114_Set_PPU_Banks(); + } + break; + + case 0x04: + if ( NesHeader.byVRomSize > 0 ) + { + Map114_Chr6 = dwBankNum; + Map114_Set_PPU_Banks(); + } + break; + + case 0x05: + if ( NesHeader.byVRomSize > 0 ) + { + Map114_Chr7 = dwBankNum; + Map114_Set_PPU_Banks(); + } + break; + + /* Set ROM Banks */ + case 0x06: + Map114_Prg0 = dwBankNum; + Map114_Set_CPU_Banks(); + break; + + case 0x07: + Map114_Prg1 = dwBankNum; + Map114_Set_CPU_Banks(); + break; + } + break; + + case 0xa000: + Map114_Regs[ 2 ] = byData; + + if ( !ROM_FourScr ) + { + if ( byData & 0x01 ) + { + InfoNES_Mirroring( 0 ); + } else { + InfoNES_Mirroring( 1 ); + } + } + break; + + case 0xa001: + Map114_Regs[ 3 ] = byData; + + if ( byData & 0x80 ) + { + /* Enable Save RAM $6000-$7fff */ + } else { + /* Disable Save RAM $6000-$7fff */ + } + break; + + case 0xc000: + Map114_Regs[ 4 ] = byData; + Map114_IRQ_Cnt = Map114_Regs[ 4 ]; + break; + + case 0xc001: + Map114_Regs[ 5 ] = byData; + Map114_IRQ_Latch = Map114_Regs[ 5 ]; + break; + + case 0xe000: + Map114_Regs[ 6 ] = byData; + Map114_IRQ_Enable = 0; + break; + + case 0xe001: + Map114_Regs[ 7 ] = byData; + Map114_IRQ_Enable = 1; + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 114 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map114_HSync() +{ +/* + * Callback at HSync + * + */ + if ( Map114_IRQ_Enable ) + { + if ( /* 0 <= PPU_Scanline && */ PPU_Scanline <= 239 ) + { + if ( PPU_R1 & R1_SHOW_SCR || PPU_R1 & R1_SHOW_SP ) + { + if ( !( Map114_IRQ_Cnt-- ) ) + { + Map114_IRQ_Cnt = Map114_IRQ_Latch; + IRQ_REQ; + } + } + } + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 114 Set CPU Banks Function */ +/*-------------------------------------------------------------------*/ +void Map114_Set_CPU_Banks() +{ + if ( Map114_Prg_Swap() ) + { + ROMBANK0 = ROMLASTPAGE( 1 ); + ROMBANK1 = ROMPAGE( Map114_Prg1 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMPAGE( Map114_Prg0 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK3 = ROMLASTPAGE( 0 ); + } else { + ROMBANK0 = ROMPAGE( Map114_Prg0 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE( Map114_Prg1 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 114 Set PPU Banks Function */ +/*-------------------------------------------------------------------*/ +void Map114_Set_PPU_Banks() +{ + if ( NesHeader.byVRomSize > 0 ) + { + if ( Map114_Chr_Swap() ) + { + PPUBANK[ 0 ] = VROMPAGE( Map114_Chr4 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( Map114_Chr5 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( Map114_Chr6 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( Map114_Chr7 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 4 ] = VROMPAGE( ( Map114_Chr01 + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( ( Map114_Chr01 + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE( ( Map114_Chr23 + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( ( Map114_Chr23 + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + } else { + PPUBANK[ 0 ] = VROMPAGE( ( Map114_Chr01 + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( ( Map114_Chr01 + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( ( Map114_Chr23 + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( ( Map114_Chr23 + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 4 ] = VROMPAGE( Map114_Chr4 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( Map114_Chr5 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE( Map114_Chr6 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( Map114_Chr7 % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + } + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_016.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_016.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_016.c (revision 0) @@ -0,0 +1,186 @@ +/*===================================================================*/ +/* */ +/* Mapper 16 (Bandai Mapper) */ +/* */ +/*===================================================================*/ + +BYTE Map16_Regs[3]; + +BYTE Map16_IRQ_Enable; +DWORD Map16_IRQ_Cnt; +DWORD Map16_IRQ_Latch; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 16 */ +/*-------------------------------------------------------------------*/ +void Map16_Init() +{ + /* Initialize Mapper */ + MapperInit = Map16_Init; + + /* Write to Mapper */ + MapperWrite = Map16_Write; + + /* Write to SRAM */ + MapperSram = Map16_Write; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map16_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Initialize State Flag */ + Map16_Regs[ 0 ] = 0; + Map16_Regs[ 1 ] = 0; + Map16_Regs[ 2 ] = 0; + + Map16_IRQ_Enable = 0; + Map16_IRQ_Cnt = 0; + Map16_IRQ_Latch = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 16 Write Function */ +/*-------------------------------------------------------------------*/ +void Map16_Write( WORD wAddr, BYTE byData ) +{ + switch ( wAddr & 0x000f ) + { + case 0x0000: + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 0 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0x0001: + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 1 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0x0002: + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 2 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0x0003: + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 3 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0x0004: + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 4 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0x0005: + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 5 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0x0006: + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 6 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0x0007: + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 7 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0x0008: + byData <<= 1; + byData %= ( NesHeader.byRomSize << 1 ); + ROMBANK0 = ROMPAGE( byData ); + ROMBANK1 = ROMPAGE( byData + 1 ); + break; + + case 0x0009: + switch ( byData & 0x03 ) + { + case 0x00: + InfoNES_Mirroring( 1 ); + break; + + case 0x01: + InfoNES_Mirroring( 0 ); + break; + + case 0x02: + InfoNES_Mirroring( 3 ); + break; + + case 0x03: + InfoNES_Mirroring( 2 ); + break; + } + break; + + case 0x000a: + Map16_IRQ_Enable = byData & 0x01; + Map16_IRQ_Cnt = Map16_IRQ_Latch; + break; + + case 0x000b: + Map16_IRQ_Latch = ( Map16_IRQ_Latch & 0xff00 ) | byData; + break; + + case 0x000c: + Map16_IRQ_Latch = ( (DWORD)byData << 8 ) | ( Map16_IRQ_Latch & 0x00ff ); + break; + + case 0x000d: + /* Write Protect */ + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 16 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map16_HSync() +{ + if ( Map16_IRQ_Enable ) + { + /* Normal IRQ */ + if ( Map16_IRQ_Cnt <= 114 ) + { + IRQ_REQ; + Map16_IRQ_Cnt = 0; + Map16_IRQ_Enable = 0; + } else { + Map16_IRQ_Cnt -= 114; + } + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_071.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_071.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_071.c (revision 0) @@ -0,0 +1,77 @@ +/*===================================================================*/ +/* */ +/* Mapper 71 (Camerica Custom Mapper) */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 71 */ +/*-------------------------------------------------------------------*/ +void Map71_Init() +{ + /* Initialize Mapper */ + MapperInit = Map71_Init; + + /* Write to Mapper */ + MapperWrite = Map71_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 71 Write Function */ +/*-------------------------------------------------------------------*/ +void Map71_Write( WORD wAddr, BYTE byData ) +{ + switch ( wAddr & 0xf000 ) + { + case 0x9000: + if ( byData & 0x10 ) + { + InfoNES_Mirroring( 2 ); + } else { + InfoNES_Mirroring( 3 ); + } + break; + + /* Set ROM Banks */ + case 0xc000: + case 0xd000: + case 0xe000: + case 0xf000: + ROMBANK0 = ROMPAGE( ( ( byData << 1 ) + 0 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE( ( ( byData << 1 ) + 1 ) % ( NesHeader.byRomSize << 1 ) ); + break; + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_233.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_233.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_233.c (revision 0) @@ -0,0 +1,78 @@ +/*===================================================================*/ +/* */ +/* Mapper 233 : 42-in-1 */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 233 */ +/*-------------------------------------------------------------------*/ +void Map233_Init() +{ + /* Initialize Mapper */ + MapperInit = Map233_Init; + + /* Write to Mapper */ + MapperWrite = Map233_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 233 Write Function */ +/*-------------------------------------------------------------------*/ +void Map233_Write( WORD wAddr, BYTE byData ) +{ + if( byData & 0x20 ) { + ROMBANK0 = ROMPAGE((((byData&0x1F)<<1)+0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE((((byData&0x1F)<<1)+1) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE((((byData&0x1F)<<1)+0) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE((((byData&0x1F)<<1)+1) % (NesHeader.byRomSize<<1)); + } else { + ROMBANK0 = ROMPAGE((((byData&0x1E)<<1)+0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE((((byData&0x1E)<<1)+1) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE((((byData&0x1E)<<1)+2) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE((((byData&0x1E)<<1)+3) % (NesHeader.byRomSize<<1)); + } + + if( (byData&0xC0) == 0x00 ) { + InfoNES_Mirroring( 5 ); + } else if( (byData&0xC0) == 0x40 ) { + InfoNES_Mirroring( 1 ); + } else if( (byData&0xC0) == 0x80 ) { + InfoNES_Mirroring( 0 ); + } else { + InfoNES_Mirroring( 2 ); + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_135.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_135.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_135.c (revision 0) @@ -0,0 +1,131 @@ +/*===================================================================*/ +/* */ +/* Mapper 135 : SACHEN CHEN */ +/* */ +/*===================================================================*/ + +BYTE Map135_Cmd; +BYTE Map135_Chr0l, Map135_Chr1l, Map135_Chr0h, Map135_Chr1h, Map135_Chrch; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 135 */ +/*-------------------------------------------------------------------*/ +void Map135_Init() +{ + /* Initialize Mapper */ + MapperInit = Map135_Init; + + /* Write to Mapper */ + MapperWrite = Map0_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map135_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Initialize Registers */ + Map135_Cmd = 0; + Map135_Chr0l = Map135_Chr1l = Map135_Chr0h = Map135_Chr1h = Map135_Chrch = 0; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + + /* Set PPU Banks */ + Map135_Set_PPU_Banks(); + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 135 Write to APU Function */ +/*-------------------------------------------------------------------*/ +void Map135_Apu( WORD wAddr, BYTE byData ) +{ + switch( wAddr & 0x4101 ) { + case 0x4100: + Map135_Cmd = byData & 0x07; + break; + case 0x4101: + switch( Map135_Cmd ) { + case 0: + Map135_Chr0l = byData & 0x07; + Map135_Set_PPU_Banks(); + break; + case 1: + Map135_Chr0h = byData & 0x07; + Map135_Set_PPU_Banks(); + break; + case 2: + Map135_Chr1l = byData & 0x07; + Map135_Set_PPU_Banks(); + break; + case 3: + Map135_Chr1h = byData & 0x07; + Map135_Set_PPU_Banks(); + break; + case 4: + Map135_Chrch = byData & 0x07; + Map135_Set_PPU_Banks(); + break; + case 5: + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( (((byData%0x07)<<2) + 0 ) % (NesHeader.byRomSize << 1) ); + ROMBANK1 = ROMPAGE( (((byData%0x07)<<2) + 1 ) % (NesHeader.byRomSize << 1) ); + ROMBANK2 = ROMPAGE( (((byData%0x07)<<2) + 2 ) % (NesHeader.byRomSize << 1) ); + ROMBANK3 = ROMPAGE( (((byData%0x07)<<2) + 3 ) % (NesHeader.byRomSize << 1) ); + break; + case 6: + break; + case 7: + switch( (byData>>1)&0x03 ) { + case 0: InfoNES_Mirroring( 2 ); break; + case 1: InfoNES_Mirroring( 0 ); break; + case 2: InfoNES_Mirroring( 1 ); break; + case 3: InfoNES_Mirroring( 2 ); break; + } + break; + } + break; + } + //Map135_Wram[ wAddr & 0x1fff ] = byData; +} + +/*-------------------------------------------------------------------*/ +/* Mapper 135 Set PPU Banks Function */ +/*-------------------------------------------------------------------*/ +void Map135_Set_PPU_Banks() +{ + /* Set PPU Banks */ + PPUBANK[ 0 ] = VROMPAGE( (((0|(Map135_Chr0l<<1)|(Map135_Chrch<<4))<<1) + 0) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 1 ] = VROMPAGE( (((0|(Map135_Chr0l<<1)|(Map135_Chrch<<4))<<1) + 1) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 2 ] = VROMPAGE( (((1|(Map135_Chr0h<<1)|(Map135_Chrch<<4))<<1) + 0) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 3 ] = VROMPAGE( (((1|(Map135_Chr0h<<1)|(Map135_Chrch<<4))<<1) + 1) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 4 ] = VROMPAGE( (((0|(Map135_Chr1l<<1)|(Map135_Chrch<<4))<<1) + 0) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 5 ] = VROMPAGE( (((0|(Map135_Chr1l<<1)|(Map135_Chrch<<4))<<1) + 1) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 6 ] = VROMPAGE( (((1|(Map135_Chr1h<<1)|(Map135_Chrch<<4))<<1) + 0) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 7 ] = VROMPAGE( (((1|(Map135_Chr1h<<1)|(Map135_Chrch<<4))<<1) + 1) % (NesHeader.byVRomSize << 3) ); + InfoNES_SetupChr(); +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_118.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_118.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_118.c (revision 0) @@ -0,0 +1,285 @@ +/*===================================================================*/ +/* */ +/* Mapper 118 (Others) */ +/* */ +/*===================================================================*/ + +BYTE Map118_Regs[ 8 ]; +DWORD Map118_Prg0, Map118_Prg1; +DWORD Map118_Chr0, Map118_Chr1, Map118_Chr2, Map118_Chr3; +DWORD Map118_Chr4, Map118_Chr5, Map118_Chr6, Map118_Chr7; + +BYTE Map118_IRQ_Enable; +BYTE Map118_IRQ_Cnt; +BYTE Map118_IRQ_Latch; + +#define Map118_Chr_Swap() ( Map118_Regs[ 0 ] & 0x80 ) +#define Map118_Prg_Swap() ( Map118_Regs[ 0 ] & 0x40 ) + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 118 */ +/*-------------------------------------------------------------------*/ +void Map118_Init() +{ + /* Initialize Mapper */ + MapperInit = Map118_Init; + + /* Write to Mapper */ + MapperWrite = Map118_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map118_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Initialize State Registers */ + for ( int nPage = 0; nPage < 8; nPage++) + { + Map118_Regs[ nPage ] = 0x00; + } + + /* Set ROM Banks */ + Map118_Prg0 = 0; + Map118_Prg1 = 1; + Map118_Set_CPU_Banks(); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + Map118_Chr0 = 0; + Map118_Chr1 = 1; + Map118_Chr2 = 2; + Map118_Chr3 = 3; + Map118_Chr4 = 4; + Map118_Chr5 = 5; + Map118_Chr6 = 6; + Map118_Chr7 = 7; + Map118_Set_PPU_Banks(); + } else { + Map118_Chr0 = Map118_Chr1 = Map118_Chr2 = Map118_Chr3 = 0; + Map118_Chr4 = Map118_Chr5 = Map118_Chr6 = Map118_Chr7 = 0; + } + + /* Initialize IRQ Registers */ + Map118_IRQ_Enable = 0; + Map118_IRQ_Cnt = 0; + Map118_IRQ_Latch = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 118 Write Function */ +/*-------------------------------------------------------------------*/ +void Map118_Write( WORD wAddr, BYTE byData ) +{ + DWORD dwBankNum; + + switch ( wAddr & 0xe001 ) + { + case 0x8000: + Map118_Regs[ 0 ] = byData; + Map118_Set_PPU_Banks(); + Map118_Set_CPU_Banks(); + break; + + case 0x8001: + Map118_Regs[ 1 ] = byData; + dwBankNum = Map118_Regs[ 1 ]; + + /* Name Table Mirroring */ + if ( ( Map118_Regs[ 0 ] & 0x07 ) < 6 ) + { + if ( byData & 0x80 ) + { + InfoNES_Mirroring( 3 ); + } else { + InfoNES_Mirroring( 2 ); + } + } + + switch ( Map118_Regs[ 0 ] & 0x07 ) + { + /* Set PPU Banks */ + case 0x00: + if ( NesHeader.byVRomSize > 0 ) + { + dwBankNum &= 0xfe; + Map118_Chr0 = dwBankNum; + Map118_Chr1 = dwBankNum + 1; + Map118_Set_PPU_Banks(); + } + break; + + case 0x01: + if ( NesHeader.byVRomSize > 0 ) + { + dwBankNum &= 0xfe; + Map118_Chr2 = dwBankNum; + Map118_Chr3 = dwBankNum + 1; + Map118_Set_PPU_Banks(); + } + break; + + case 0x02: + if ( NesHeader.byVRomSize > 0 ) + { + Map118_Chr4 = dwBankNum; + Map118_Set_PPU_Banks(); + } + break; + + case 0x03: + if ( NesHeader.byVRomSize > 0 ) + { + Map118_Chr5 = dwBankNum; + Map118_Set_PPU_Banks(); + } + break; + + case 0x04: + if ( NesHeader.byVRomSize > 0 ) + { + Map118_Chr6 = dwBankNum; + Map118_Set_PPU_Banks(); + } + break; + + case 0x05: + if ( NesHeader.byVRomSize > 0 ) + { + Map118_Chr7 = dwBankNum; + Map118_Set_PPU_Banks(); + } + break; + + /* Set ROM Banks */ + case 0x06: + Map118_Prg0 = dwBankNum; + Map118_Set_CPU_Banks(); + break; + + case 0x07: + Map118_Prg1 = dwBankNum; + Map118_Set_CPU_Banks(); + break; + } + break; + + case 0xc000: + Map118_Regs[ 4 ] = byData; + Map118_IRQ_Cnt = Map118_Regs[ 4 ]; + break; + + case 0xc001: + Map118_Regs[ 5 ] = byData; + Map118_IRQ_Latch = Map118_Regs[ 5 ]; + break; + + case 0xe000: + Map118_Regs[ 6 ] = byData; + Map118_IRQ_Enable = 0; + break; + + case 0xe001: + Map118_Regs[ 7 ] = byData; + Map118_IRQ_Enable = 1; + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 118 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map118_HSync() +{ +/* + * Callback at HSync + * + */ + if ( Map118_IRQ_Enable ) + { + if ( /* 0 <= PPU_Scanline && */ PPU_Scanline <= 239 ) + { + if ( PPU_R1 & R1_SHOW_SCR || PPU_R1 & R1_SHOW_SP ) + { + if ( !( Map118_IRQ_Cnt-- ) ) + { + Map118_IRQ_Cnt = Map118_IRQ_Latch; + IRQ_REQ; + } + } + } + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 118 Set CPU Banks Function */ +/*-------------------------------------------------------------------*/ +void Map118_Set_CPU_Banks() +{ + if ( Map118_Prg_Swap() ) + { + ROMBANK0 = ROMLASTPAGE( 1 ); + ROMBANK1 = ROMPAGE( Map118_Prg1 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMPAGE( Map118_Prg0 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK3 = ROMLASTPAGE( 0 ); + } else { + ROMBANK0 = ROMPAGE( Map118_Prg0 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE( Map118_Prg1 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 118 Set PPU Banks Function */ +/*-------------------------------------------------------------------*/ +void Map118_Set_PPU_Banks() +{ + if ( NesHeader.byVRomSize > 0 ) + { + if ( Map118_Chr_Swap() ) + { + PPUBANK[ 0 ] = VROMPAGE( Map118_Chr4 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( Map118_Chr5 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( Map118_Chr6 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( Map118_Chr7 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 4 ] = VROMPAGE( Map118_Chr0 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( Map118_Chr1 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE( Map118_Chr2 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( Map118_Chr3 % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + } else { + PPUBANK[ 0 ] = VROMPAGE( Map118_Chr0 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( Map118_Chr1 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( Map118_Chr2 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( Map118_Chr3 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 4 ] = VROMPAGE( Map118_Chr4 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( Map118_Chr5 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE( Map118_Chr6 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( Map118_Chr7 % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + } + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_092.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_092.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_092.c (revision 0) @@ -0,0 +1,124 @@ +/*===================================================================*/ +/* */ +/* Mapper 92 (Jaleco Early Mapper #1) */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 92 */ +/*-------------------------------------------------------------------*/ +void Map92_Init() +{ + /* Initialize Mapper */ + MapperInit = Map92_Init; + + /* Write to Mapper */ + MapperWrite = Map92_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 92 Write Function */ +/*-------------------------------------------------------------------*/ +void Map92_Write( WORD wAddr, BYTE byData ) +{ + BYTE byRomBank; + BYTE byChrBank; + + byData = (BYTE)wAddr & 0xff; + byRomBank = ( byData & 0x0f ) << 1; + byChrBank = byData & 0x0f; + + if ( wAddr >= 0x9000 ) + { + switch ( byData & 0xf0 ) + { + /* Set ROM Banks */ + case 0xd0: + byRomBank %= ( NesHeader.byRomSize << 1 ); + ROMBANK2 = ROMPAGE( byRomBank ); + ROMBANK3 = ROMPAGE( byRomBank + 1 ); + break; + + /* Set PPU Banks */ + case 0xe0: + byChrBank <<= 3; + byChrBank %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 0 ] = VROMPAGE( byChrBank ); + PPUBANK[ 1 ] = VROMPAGE( byChrBank + 1 ); + PPUBANK[ 2 ] = VROMPAGE( byChrBank + 2 ); + PPUBANK[ 3 ] = VROMPAGE( byChrBank + 3 ); + PPUBANK[ 4 ] = VROMPAGE( byChrBank + 4 ); + PPUBANK[ 5 ] = VROMPAGE( byChrBank + 5 ); + PPUBANK[ 6 ] = VROMPAGE( byChrBank + 6 ); + PPUBANK[ 7 ] = VROMPAGE( byChrBank + 7 ); + InfoNES_SetupChr(); + break; + } + } else { + switch ( byData & 0xf0 ) + { + /* Set ROM Banks */ + case 0xb0: + byRomBank %= ( NesHeader.byRomSize << 1 ); + ROMBANK2 = ROMPAGE( byRomBank ); + ROMBANK3 = ROMPAGE( byRomBank + 1 ); + break; + + /* Set PPU Banks */ + case 0x70: + byChrBank <<= 3; + byChrBank %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 0 ] = VROMPAGE( byChrBank ); + PPUBANK[ 1 ] = VROMPAGE( byChrBank + 1 ); + PPUBANK[ 2 ] = VROMPAGE( byChrBank + 2 ); + PPUBANK[ 3 ] = VROMPAGE( byChrBank + 3 ); + PPUBANK[ 4 ] = VROMPAGE( byChrBank + 4 ); + PPUBANK[ 5 ] = VROMPAGE( byChrBank + 5 ); + PPUBANK[ 6 ] = VROMPAGE( byChrBank + 6 ); + PPUBANK[ 7 ] = VROMPAGE( byChrBank + 7 ); + InfoNES_SetupChr(); + break; + } + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_075.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_075.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_075.c (revision 0) @@ -0,0 +1,135 @@ +/*===================================================================*/ +/* */ +/* Mapper 75 (Konami VRC 1 and Jaleco SS8805) */ +/* */ +/*===================================================================*/ + +BYTE Map75_Regs[ 2 ]; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 75 */ +/*-------------------------------------------------------------------*/ +void Map75_Init() +{ + /* Initialize Mapper */ + MapperInit = Map75_Init; + + /* Write to Mapper */ + MapperWrite = Map75_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Initialize State Flag */ + Map75_Regs[ 0 ] = 0; + Map75_Regs[ 1 ] = 1; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 75 Write Function */ +/*-------------------------------------------------------------------*/ +void Map75_Write( WORD wAddr, BYTE byData ) +{ + switch ( wAddr & 0xf000 ) + { + /* Set ROM Banks */ + case 0x8000: + byData %= ( NesHeader.byRomSize << 1 ); + ROMBANK0 = ROMPAGE( byData ); + break; + + case 0x9000: + /* Set Mirroring */ + if ( byData & 0x01 ) + { + InfoNES_Mirroring( 0 ); + } else { + InfoNES_Mirroring( 1 ); + } + + /* Set PPU Banks */ + Map75_Regs[ 0 ] = ( Map75_Regs[ 0 ] & 0x0f ) | ( ( byData & 0x02 ) << 3 ); + PPUBANK[ 0 ] = VROMPAGE( ( Map75_Regs[ 0 ] << 2 ) + 0 ); + PPUBANK[ 1 ] = VROMPAGE( ( Map75_Regs[ 0 ] << 2 ) + 1 ); + PPUBANK[ 2 ] = VROMPAGE( ( Map75_Regs[ 0 ] << 2 ) + 2 ); + PPUBANK[ 3 ] = VROMPAGE( ( Map75_Regs[ 0 ] << 2 ) + 3 ); + + Map75_Regs[ 1 ] = ( Map75_Regs[ 1 ] & 0x0f ) | ( ( byData & 0x04 ) << 2 ); + PPUBANK[ 4 ] = VROMPAGE( ( Map75_Regs[ 1 ] << 2 ) + 0 ); + PPUBANK[ 5 ] = VROMPAGE( ( Map75_Regs[ 1 ] << 2 ) + 1 ); + PPUBANK[ 6 ] = VROMPAGE( ( Map75_Regs[ 1 ] << 2 ) + 2 ); + PPUBANK[ 7 ] = VROMPAGE( ( Map75_Regs[ 1 ] << 2 ) + 3 ); + InfoNES_SetupChr(); + break; + + /* Set ROM Banks */ + case 0xA000: + byData %= ( NesHeader.byRomSize << 1 ); + ROMBANK1 = ROMPAGE( byData ); + break; + + /* Set ROM Banks */ + case 0xC000: + byData %= ( NesHeader.byRomSize << 1 ); + ROMBANK2 = ROMPAGE( byData ); + break; + + case 0xE000: + /* Set PPU Banks */ + Map75_Regs[ 0 ] = ( Map75_Regs[ 0 ] & 0x10 ) | ( byData & 0x0f ); + PPUBANK[ 0 ] = VROMPAGE( ( Map75_Regs[ 0 ] << 2 ) + 0 ); + PPUBANK[ 1 ] = VROMPAGE( ( Map75_Regs[ 0 ] << 2 ) + 1 ); + PPUBANK[ 2 ] = VROMPAGE( ( Map75_Regs[ 0 ] << 2 ) + 2 ); + PPUBANK[ 3 ] = VROMPAGE( ( Map75_Regs[ 0 ] << 2 ) + 3 ); + InfoNES_SetupChr(); + break; + + case 0xF000: + /* Set PPU Banks */ + Map75_Regs[ 1 ] = ( Map75_Regs[ 1 ] & 0x10 ) | ( byData & 0x0f ); + PPUBANK[ 4 ] = VROMPAGE( ( Map75_Regs[ 1 ] << 2 ) + 0 ); + PPUBANK[ 5 ] = VROMPAGE( ( Map75_Regs[ 1 ] << 2 ) + 1 ); + PPUBANK[ 6 ] = VROMPAGE( ( Map75_Regs[ 1 ] << 2 ) + 2 ); + PPUBANK[ 7 ] = VROMPAGE( ( Map75_Regs[ 1 ] << 2 ) + 3 ); + InfoNES_SetupChr(); + break; + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_058.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_058.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_058.c (revision 0) @@ -0,0 +1,90 @@ +/*===================================================================*/ +/* */ +/* Mapper 58 */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 58 */ +/*-------------------------------------------------------------------*/ +void Map58_Init() +{ + /* Initialize Mapper */ + MapperInit = Map58_Init; + + /* Write to Mapper */ + MapperWrite = Map58_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 0 ); + ROMBANK3 = ROMPAGE( 1 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 58 Write Function */ +/*-------------------------------------------------------------------*/ +void Map58_Write( WORD wAddr, BYTE byData ) +{ + if( wAddr & 0x40 ) { + ROMBANK0 = ROMPAGE((((wAddr&0x07)<<1)+0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE((((wAddr&0x07)<<1)+1) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE((((wAddr&0x07)<<1)+0) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE((((wAddr&0x07)<<1)+1) % (NesHeader.byRomSize<<1)); + } else { + ROMBANK0 = ROMPAGE((((wAddr&0x06)<<1)+0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE((((wAddr&0x06)<<1)+1) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE((((wAddr&0x06)<<1)+2) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE((((wAddr&0x06)<<1)+3) % (NesHeader.byRomSize<<1)); + } + + if ( NesHeader.byVRomSize > 0 ) { + PPUBANK[ 0 ] = VROMPAGE(((wAddr&0x38)+0) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 1 ] = VROMPAGE(((wAddr&0x38)+1) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 2 ] = VROMPAGE(((wAddr&0x38)+2) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 3 ] = VROMPAGE(((wAddr&0x38)+3) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 4 ] = VROMPAGE(((wAddr&0x38)+4) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 5 ] = VROMPAGE(((wAddr&0x38)+5) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 6 ] = VROMPAGE(((wAddr&0x38)+6) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 7 ] = VROMPAGE(((wAddr&0x38)+7) % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + } + + if( byData & 0x02 ) InfoNES_Mirroring( 1 ); + else InfoNES_Mirroring( 0 ); +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_194.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_194.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_194.c (revision 0) @@ -0,0 +1,58 @@ +/*===================================================================*/ +/* */ +/* Mapper 194 : Meikyuu Jiin Dababa */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 194 */ +/*-------------------------------------------------------------------*/ +void Map194_Init() +{ + /* Initialize Mapper */ + MapperInit = Map194_Init; + + /* Write to Mapper */ + MapperWrite = Map194_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( (NesHeader.byRomSize<<1) - 4 ); + ROMBANK1 = ROMPAGE( (NesHeader.byRomSize<<1) - 3 ); + ROMBANK2 = ROMPAGE( (NesHeader.byRomSize<<1) - 2 ); + ROMBANK3 = ROMPAGE( (NesHeader.byRomSize<<1) - 1 ); + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 194 Write Function */ +/*-------------------------------------------------------------------*/ +void Map194_Write( WORD wAddr, BYTE byData ) +{ + SRAMBANK = ROMPAGE( byData % ( NesHeader.byRomSize << 1 ) ); +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_096.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_096.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_096.c (revision 0) @@ -0,0 +1,101 @@ +/*===================================================================*/ +/* */ +/* Mapper 96 : Bandai 74161 */ +/* */ +/*===================================================================*/ + +BYTE Map96_Reg[2]; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 96 */ +/*-------------------------------------------------------------------*/ +void Map96_Init() +{ + /* Initialize Mapper */ + MapperInit = Map96_Init; + + /* Write to Mapper */ + MapperWrite = Map96_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map96_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set Registers */ + Map96_Reg[0] = Map96_Reg[1] = 0; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + + /* Set PPU Banks */ + Map96_Set_Banks(); + InfoNES_Mirroring( 3 ); + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 96 Write Function */ +/*-------------------------------------------------------------------*/ +void Map96_Write( WORD wAddr, BYTE byData ) +{ + ROMBANK0 = ROMPAGE((((byData & 0x03)<<2)+0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE((((byData & 0x03)<<2)+1) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE((((byData & 0x03)<<2)+2) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE((((byData & 0x03)<<2)+3) % (NesHeader.byRomSize<<1)); + + Map96_Reg[0] = (byData & 0x04) >> 2; + Map96_Set_Banks(); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 96 PPU Function */ +/*-------------------------------------------------------------------*/ +void Map96_PPU( WORD wAddr ) +{ + if( (wAddr & 0xF000) == 0x2000 ) { + Map96_Reg[1] = (wAddr>>8)&0x03; + Map96_Set_Banks(); + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 96 Set Banks Function */ +/*-------------------------------------------------------------------*/ +void Map96_Set_Banks() +{ + PPUBANK[ 0 ] = CRAMPAGE(((Map96_Reg[0]*4+Map96_Reg[1])<<2)+0); + PPUBANK[ 1 ] = CRAMPAGE(((Map96_Reg[0]*4+Map96_Reg[1])<<2)+1); + PPUBANK[ 2 ] = CRAMPAGE(((Map96_Reg[0]*4+Map96_Reg[1])<<2)+2); + PPUBANK[ 3 ] = CRAMPAGE(((Map96_Reg[0]*4+Map96_Reg[1])<<2)+3); + PPUBANK[ 4 ] = CRAMPAGE(((Map96_Reg[0]*4+0x03)<<2)+0); + PPUBANK[ 5 ] = CRAMPAGE(((Map96_Reg[0]*4+0x03)<<2)+1); + PPUBANK[ 6 ] = CRAMPAGE(((Map96_Reg[0]*4+0x03)<<2)+2); + PPUBANK[ 7 ] = CRAMPAGE(((Map96_Reg[0]*4+0x03)<<2)+3); + InfoNES_SetupChr(); +} + Index: apps/plugins/infones/mapper/InfoNES_Mapper_079.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_079.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_079.c (revision 0) @@ -0,0 +1,90 @@ +/*===================================================================*/ +/* */ +/* Mapper 79 (American Video Entertainment/Sachen Custom Mapper) */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 79 */ +/*-------------------------------------------------------------------*/ +void Map79_Init() +{ + /* Initialize Mapper */ + MapperInit = Map79_Init; + + /* Write to Mapper */ + MapperWrite = Map0_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map79_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 79 Write to Apu Function */ +/*-------------------------------------------------------------------*/ +void Map79_Apu( WORD wAddr, BYTE byData ) +{ + BYTE byPrgBank = ( byData & 0x08 ) >> 3; + BYTE byChrBank = byData & 0x07; + + /* Set ROM Banks */ + byPrgBank <<= 2; + byPrgBank %= ( NesHeader.byRomSize << 1 ); + + ROMBANK0 = ROMPAGE( byPrgBank + 0 ); + ROMBANK1 = ROMPAGE( byPrgBank + 1 ); + ROMBANK2 = ROMPAGE( byPrgBank + 2 ); + ROMBANK3 = ROMPAGE( byPrgBank + 3 ); + + /* Set PPU Banks */ + byChrBank <<= 3; + byChrBank %= ( NesHeader.byVRomSize << 3 ); + + PPUBANK[ 0 ] = VROMPAGE( byChrBank + 0 ); + PPUBANK[ 1 ] = VROMPAGE( byChrBank + 1 ); + PPUBANK[ 2 ] = VROMPAGE( byChrBank + 2 ); + PPUBANK[ 3 ] = VROMPAGE( byChrBank + 3 ); + PPUBANK[ 4 ] = VROMPAGE( byChrBank + 4 ); + PPUBANK[ 5 ] = VROMPAGE( byChrBank + 5 ); + PPUBANK[ 6 ] = VROMPAGE( byChrBank + 6 ); + PPUBANK[ 7 ] = VROMPAGE( byChrBank + 7 ); + InfoNES_SetupChr(); +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_000.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_000.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_000.c (revision 0) @@ -0,0 +1,173 @@ +/*===================================================================*/ +/* */ +/* Mapper 0 */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 0 */ +/*-------------------------------------------------------------------*/ +void Map0_Init() +{ + int nPage; + /* Initialize Mapper */ + MapperInit = Map0_Init; + + /* Write to Mapper */ + MapperWrite = Map0_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + if ( NesHeader.byRomSize > 1 ) + { + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + } + else if ( NesHeader.byRomSize > 0 ) + { + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 0 ); + ROMBANK3 = ROMPAGE( 1 ); + } else { + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 0 ); + ROMBANK2 = ROMPAGE( 0 ); + ROMBANK3 = ROMPAGE( 0 ); + } + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 0 Write Function */ +/*-------------------------------------------------------------------*/ +void Map0_Write( WORD wAddr, BYTE byData ) +{ +/* + * Dummy Write to Mapper + * + */ +} + +/*-------------------------------------------------------------------*/ +/* Mapper 0 Write to SRAM Function */ +/*-------------------------------------------------------------------*/ +void Map0_Sram( WORD wAddr, BYTE byData ) +{ +/* + * Dummy Write to Sram + * + */ +} + +/*-------------------------------------------------------------------*/ +/* Mapper 0 Write to APU Function */ +/*-------------------------------------------------------------------*/ +void Map0_Apu( WORD wAddr, BYTE byData ) +{ +/* + * Dummy Write to Apu + * + */ +} + +/*-------------------------------------------------------------------*/ +/* Mapper 0 Read from APU Function */ +/*-------------------------------------------------------------------*/ +BYTE Map0_ReadApu( WORD wAddr ) +{ +/* + * Dummy Read from Apu + * + */ + return ( wAddr >> 8 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 0 V-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map0_VSync() +{ +/* + * Dummy Callback at VSync + * + */ +} + +/*-------------------------------------------------------------------*/ +/* Mapper 0 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map0_HSync() +{ +/* + * Dummy Callback at HSync + * + */ +#if 0 + // Frame IRQ + FrameStep += STEP_PER_SCANLINE; + if ( FrameStep > STEP_PER_FRAME && FrameIRQ_Enable ) + { + FrameStep %= STEP_PER_FRAME; + IRQ_REQ; + APU_Reg[ 0x4015 ] |= 0x40; + } +#endif +} + +/*-------------------------------------------------------------------*/ +/* Mapper 0 PPU Function */ +/*-------------------------------------------------------------------*/ +void Map0_PPU( WORD wAddr ) +{ +/* + * Dummy Callback at PPU + * + */ +} + +/*-------------------------------------------------------------------*/ +/* Mapper 0 Rendering Screen Function */ +/*-------------------------------------------------------------------*/ +void Map0_RenderScreen( BYTE byMode ) +{ +/* + * Dummy Callback at Rendering Screen + * + */ +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_200.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_200.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_200.c (revision 0) @@ -0,0 +1,86 @@ +/*===================================================================*/ +/* */ +/* Mapper 200 (1200-in-1) */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 200 */ +/*-------------------------------------------------------------------*/ +void Map200_Init() +{ + /* Initialize Mapper */ + MapperInit = Map200_Init; + + /* Write to Mapper */ + MapperWrite = Map200_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 0 ); + ROMBANK3 = ROMPAGE( 1 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 200 Write Function */ +/*-------------------------------------------------------------------*/ +void Map200_Write( WORD wAddr, BYTE byData ) +{ + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE((((wAddr&0x07)<<1)+0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE((((wAddr&0x07)<<1)+1) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE((((wAddr&0x07)<<1)+0) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE((((wAddr&0x07)<<1)+1) % (NesHeader.byRomSize<<1)); + + /* Set PPU Banks */ + PPUBANK[0] = VROMPAGE((((wAddr&0x07)<<3)+0) % (NesHeader.byVRomSize<<3)); + PPUBANK[1] = VROMPAGE((((wAddr&0x07)<<3)+1) % (NesHeader.byVRomSize<<3)); + PPUBANK[2] = VROMPAGE((((wAddr&0x07)<<3)+2) % (NesHeader.byVRomSize<<3)); + PPUBANK[3] = VROMPAGE((((wAddr&0x07)<<3)+3) % (NesHeader.byVRomSize<<3)); + PPUBANK[4] = VROMPAGE((((wAddr&0x07)<<3)+4) % (NesHeader.byVRomSize<<3)); + PPUBANK[5] = VROMPAGE((((wAddr&0x07)<<3)+5) % (NesHeader.byVRomSize<<3)); + PPUBANK[6] = VROMPAGE((((wAddr&0x07)<<3)+6) % (NesHeader.byVRomSize<<3)); + PPUBANK[7] = VROMPAGE((((wAddr&0x07)<<3)+7) % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + + if ( wAddr & 0x01 ) { + InfoNES_Mirroring( 1 ); + } else { + InfoNES_Mirroring( 0 ); + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_021.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_021.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_021.c (revision 0) @@ -0,0 +1,276 @@ +/*===================================================================*/ +/* */ +/* Mapper 21 (Konami VRC4 2A) */ +/* */ +/*===================================================================*/ + +BYTE Map21_Regs[ 10 ]; +BYTE Map21_IRQ_Enable; +BYTE Map21_IRQ_Cnt; +BYTE Map21_IRQ_Latch; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 21 */ +/*-------------------------------------------------------------------*/ +void Map21_Init() +{ + int nPage; + /* Initialize Mapper */ + MapperInit = Map21_Init; + + /* Write to Mapper */ + MapperWrite = Map21_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map21_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Initialize State Registers */ + for ( nPage = 0; nPage < 8; nPage++ ) + { + Map21_Regs[ nPage ] = nPage; + } + Map21_Regs[ 8 ] = 0; + + Map21_IRQ_Enable = 0; + Map21_IRQ_Cnt = 0; + Map21_IRQ_Latch = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 21 Write Function */ +/*-------------------------------------------------------------------*/ +void Map21_Write( WORD wAddr, BYTE byData ) +{ + switch ( wAddr & 0xf00f ) + { + /* Set ROM Banks */ + case 0x8000: + if ( Map21_Regs[ 8 ] & 0x02 ) + { + byData %= ( NesHeader.byRomSize << 1 ); + ROMBANK2 = ROMPAGE( byData ); + } else { + byData %= ( NesHeader.byRomSize << 1 ); + ROMBANK0 = ROMPAGE( byData ); + } + break; + + case 0xa000: + byData %= ( NesHeader.byRomSize << 1 ); + ROMBANK1 = ROMPAGE( byData ); + break; + + /* Name Table Mirroring */ + case 0x9000: + switch ( byData & 0x03 ) + { + case 0: + InfoNES_Mirroring( 1 ); + break; + + case 1: + InfoNES_Mirroring( 0 ); + break; + + case 2: + InfoNES_Mirroring( 3 ); + break; + + case 3: + InfoNES_Mirroring( 2 ); + break; + } + break; + + case 0x9002: + Map21_Regs[ 8 ] = byData; + break; + + case 0xb000: + Map21_Regs[ 0 ] = ( Map21_Regs[ 0 ] & 0xf0 ) | ( byData & 0x0f ); + PPUBANK[ 0 ] = VROMPAGE( Map21_Regs[ 0 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xb002: + Map21_Regs[ 0 ] = ( Map21_Regs[ 0 ] & 0x0f ) | ( ( byData & 0x0f ) << 4 ); + PPUBANK[ 0 ] = VROMPAGE( Map21_Regs[ 0 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xb001: + case 0xb004: + Map21_Regs[ 1 ] = ( Map21_Regs[ 1 ] & 0xf0 ) | ( byData & 0x0f ); + PPUBANK[ 1 ] = VROMPAGE( Map21_Regs[ 1 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xb003: + case 0xb006: + Map21_Regs[ 1 ] = ( Map21_Regs[ 1 ] & 0x0f ) | ( ( byData & 0x0f ) << 4 ); + PPUBANK[ 1 ] = VROMPAGE( Map21_Regs[ 1 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xc000: + Map21_Regs[ 2 ] = ( Map21_Regs[ 2 ] & 0xf0 ) | ( byData & 0x0f ); + PPUBANK[ 2 ] = VROMPAGE( Map21_Regs[ 2 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xc002: + Map21_Regs[ 2 ] = ( Map21_Regs[ 2 ] & 0x0f ) | ( ( byData & 0x0f ) << 4 ); + PPUBANK[ 2 ] = VROMPAGE( Map21_Regs[ 2 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xc001: + case 0xc004: + Map21_Regs[ 3 ] = ( Map21_Regs[ 3 ] & 0xf0 ) | ( byData & 0x0f ); + PPUBANK[ 3 ] = VROMPAGE( Map21_Regs[ 3 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xc003: + case 0xc006: + Map21_Regs[ 3 ] = ( Map21_Regs[ 3 ] & 0x0f ) | ( ( byData & 0x0f ) << 4 ); + PPUBANK[ 3 ] = VROMPAGE( Map21_Regs[ 3 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xd000: + Map21_Regs[ 4 ] = ( Map21_Regs[ 4 ] & 0xf0 ) | ( byData & 0x0f ); + PPUBANK[ 4 ] = VROMPAGE( Map21_Regs[ 4 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xd002: + Map21_Regs[ 4 ] = ( Map21_Regs[ 4 ] & 0x0f ) | ( ( byData & 0x0f ) << 4 ); + PPUBANK[ 4 ] = VROMPAGE( Map21_Regs[ 4 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xd001: + case 0xd004: + Map21_Regs[ 5 ] = ( Map21_Regs[ 5 ] & 0xf0 ) | ( byData & 0x0f ); + PPUBANK[ 5 ] = VROMPAGE( Map21_Regs[ 5 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xd003: + case 0xd006: + Map21_Regs[ 5 ] = ( Map21_Regs[ 5 ] & 0x0f ) | ( ( byData & 0x0f ) << 4 ); + PPUBANK[ 5 ] = VROMPAGE( Map21_Regs[ 5 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xe000: + Map21_Regs[ 6 ] = ( Map21_Regs[ 6 ] & 0xf0 ) | ( byData & 0x0f ); + PPUBANK[ 6 ] = VROMPAGE( Map21_Regs[ 6 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xe002: + Map21_Regs[ 6 ] = ( Map21_Regs[ 6 ] & 0x0f ) | ( ( byData & 0x0f ) << 4 ); + PPUBANK[ 6 ] = VROMPAGE( Map21_Regs[ 6 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xe001: + case 0xe004: + Map21_Regs[ 7 ] = ( Map21_Regs[ 7 ] & 0xf0 ) | ( byData & 0x0f ); + PPUBANK[ 7 ] = VROMPAGE( Map21_Regs[ 7 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xe003: + case 0xe006: + Map21_Regs[ 7 ] = ( Map21_Regs[ 7 ] & 0x0f ) | ( ( byData & 0x0f ) << 4 ); + PPUBANK[ 7 ] = VROMPAGE( Map21_Regs[ 7 ] % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0xf000: + Map21_IRQ_Latch = ( Map21_IRQ_Latch & 0xf0 ) | ( byData & 0x0f ); + break; + + case 0xf002: + Map21_IRQ_Latch = ( Map21_IRQ_Latch & 0x0f ) | ( ( byData & 0x0f ) << 4 ); + break; + + case 0xf003: + if ( Map21_IRQ_Enable & 0x01 ) + { + Map21_IRQ_Enable |= 0x02; + } else { + Map21_IRQ_Enable &= 0x01; + } + break; + + case 0xf004: + Map21_IRQ_Enable = byData & 0x03; + if ( Map21_IRQ_Enable & 0x02 ) + { + Map21_IRQ_Cnt = Map21_IRQ_Latch; + } + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 21 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map21_HSync() +{ +/* + * Callback at HSync + * + */ + if ( Map21_IRQ_Enable & 0x02 ) + { + if ( Map21_IRQ_Cnt == 0xff ) + { + Map21_IRQ_Cnt = Map21_IRQ_Latch; + + if ( Map21_IRQ_Enable & 0x01 ) + { + Map21_IRQ_Enable |= 0x02; + } else { + Map21_IRQ_Enable &= 0x01; + } + IRQ_REQ; + } else { + Map21_IRQ_Cnt++; + } + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_004.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_004.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_004.c (revision 0) @@ -0,0 +1,363 @@ +/*===================================================================*/ +/* */ +/* Mapper 4 (MMC3) */ +/* */ +/*===================================================================*/ + +BYTE Map4_Regs[ 8 ]; +DWORD Map4_Rom_Bank; +DWORD Map4_Prg0, Map4_Prg1; +DWORD Map4_Chr01, Map4_Chr23; +DWORD Map4_Chr4, Map4_Chr5, Map4_Chr6, Map4_Chr7; + +#define Map4_Chr_Swap() ( Map4_Regs[ 0 ] & 0x80 ) +#define Map4_Prg_Swap() ( Map4_Regs[ 0 ] & 0x40 ) + +BYTE Map4_IRQ_Enable; +BYTE Map4_IRQ_Cnt; +BYTE Map4_IRQ_Latch; +BYTE Map4_IRQ_Request; +BYTE Map4_IRQ_Present; +BYTE Map4_IRQ_Present_Vbl; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 4 */ +/*-------------------------------------------------------------------*/ +void Map4_Init() +{ + int nPage; + /* Initialize Mapper */ + MapperInit = Map4_Init; + + /* Write to Mapper */ + MapperWrite = Map4_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map4_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Initialize State Registers */ + for ( nPage = 0; nPage < 8; nPage++ ) + { + Map4_Regs[ nPage ] = 0x00; + } + + /* Set ROM Banks */ + Map4_Prg0 = 0; + Map4_Prg1 = 1; + Map4_Set_CPU_Banks(); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + Map4_Chr01 = 0; + Map4_Chr23 = 2; + Map4_Chr4 = 4; + Map4_Chr5 = 5; + Map4_Chr6 = 6; + Map4_Chr7 = 7; + Map4_Set_PPU_Banks(); + } else { + Map4_Chr01 = Map4_Chr23 = 0; + Map4_Chr4 = Map4_Chr5 = Map4_Chr6 = Map4_Chr7 = 0; + } + + /* Initialize IRQ Registers */ + Map4_IRQ_Enable = 0; + Map4_IRQ_Cnt = 0; + Map4_IRQ_Latch = 0; + Map4_IRQ_Request = 0; + Map4_IRQ_Present = 0; + Map4_IRQ_Present_Vbl = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 4 Write Function */ +/*-------------------------------------------------------------------*/ +void Map4_Write( WORD wAddr, BYTE byData ) +{ + DWORD dwBankNum; + + switch ( wAddr & 0xe001 ) + { + case 0x8000: + Map4_Regs[ 0 ] = byData; + Map4_Set_PPU_Banks(); + Map4_Set_CPU_Banks(); + break; + + case 0x8001: + Map4_Regs[ 1 ] = byData; + dwBankNum = Map4_Regs[ 1 ]; + + switch ( Map4_Regs[ 0 ] & 0x07 ) + { + /* Set PPU Banks */ + case 0x00: + if ( NesHeader.byVRomSize > 0 ) + { + dwBankNum &= 0xfe; + Map4_Chr01 = dwBankNum; + Map4_Set_PPU_Banks(); + } + break; + + case 0x01: + if ( NesHeader.byVRomSize > 0 ) + { + dwBankNum &= 0xfe; + Map4_Chr23 = dwBankNum; + Map4_Set_PPU_Banks(); + } + break; + + case 0x02: + if ( NesHeader.byVRomSize > 0 ) + { + Map4_Chr4 = dwBankNum; + Map4_Set_PPU_Banks(); + } + break; + + case 0x03: + if ( NesHeader.byVRomSize > 0 ) + { + Map4_Chr5 = dwBankNum; + Map4_Set_PPU_Banks(); + } + break; + + case 0x04: + if ( NesHeader.byVRomSize > 0 ) + { + Map4_Chr6 = dwBankNum; + Map4_Set_PPU_Banks(); + } + break; + + case 0x05: + if ( NesHeader.byVRomSize > 0 ) + { + Map4_Chr7 = dwBankNum; + Map4_Set_PPU_Banks(); + } + break; + + /* Set ROM Banks */ + case 0x06: + Map4_Prg0 = dwBankNum; + Map4_Set_CPU_Banks(); + break; + + case 0x07: + Map4_Prg1 = dwBankNum; + Map4_Set_CPU_Banks(); + break; + } + break; + + case 0xa000: + Map4_Regs[ 2 ] = byData; + + if ( !ROM_FourScr ) + { + if ( byData & 0x01 ) + { + InfoNES_Mirroring( 0 ); + } else { + InfoNES_Mirroring( 1 ); + } + } + break; + + case 0xa001: + Map4_Regs[ 3 ] = byData; + break; + + case 0xc000: + Map4_Regs[ 4 ] = byData; + Map4_IRQ_Latch = byData; + break; + + case 0xc001: + Map4_Regs[ 5 ] = byData; + if ( PPU_Scanline < 240 ) + { + Map4_IRQ_Cnt |= 0x80; + Map4_IRQ_Present = 0xff; + } else { + Map4_IRQ_Cnt |= 0x80; + Map4_IRQ_Present_Vbl = 0xff; + Map4_IRQ_Present = 0; + } + break; + + case 0xe000: + Map4_Regs[ 6 ] = byData; + Map4_IRQ_Enable = 0; + Map4_IRQ_Request = 0; + break; + + case 0xe001: + Map4_Regs[ 7 ] = byData; + Map4_IRQ_Enable = 1; + Map4_IRQ_Request = 0; + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 4 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map4_HSync() +{ +/* + * Callback at HSync + * + */ + if ( ( /* 0 <= PPU_Scanline && */ PPU_Scanline <= 239 ) && + ( PPU_R1 & R1_SHOW_SCR || PPU_R1 & R1_SHOW_SP ) ) + { + if( Map4_IRQ_Present_Vbl ) { + Map4_IRQ_Cnt = Map4_IRQ_Latch; + Map4_IRQ_Present_Vbl = 0; + } + if( Map4_IRQ_Present ) { + Map4_IRQ_Cnt = Map4_IRQ_Latch; + Map4_IRQ_Present = 0; + } else if( Map4_IRQ_Cnt > 0 ) { + Map4_IRQ_Cnt--; + } + + if( Map4_IRQ_Cnt == 0 ) { + if( Map4_IRQ_Enable ) { + Map4_IRQ_Request = 0xFF; + } + Map4_IRQ_Present = 0xFF; + } + } + if( Map4_IRQ_Request ) { + IRQ_REQ; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 4 Set CPU Banks Function */ +/*-------------------------------------------------------------------*/ +void Map4_Set_CPU_Banks() +{ + if ( Map4_Prg_Swap() ) + { + ROMBANK0 = ROMLASTPAGE( 1 ); + ROMBANK1 = ROMPAGE( Map4_Prg1 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMPAGE( Map4_Prg0 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK3 = ROMLASTPAGE( 0 ); + } else { + ROMBANK0 = ROMPAGE( Map4_Prg0 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE( Map4_Prg1 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 4 Set PPU Banks Function */ +/*-------------------------------------------------------------------*/ +void Map4_Set_PPU_Banks() +{ + if ( NesHeader.byVRomSize > 0 ) + { + if ( Map4_Chr_Swap() ) + { + PPUBANK[ 0 ] = VROMPAGE( Map4_Chr4 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( Map4_Chr5 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( Map4_Chr6 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( Map4_Chr7 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 4 ] = VROMPAGE( ( Map4_Chr01 + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( ( Map4_Chr01 + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE( ( Map4_Chr23 + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( ( Map4_Chr23 + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + } else { + PPUBANK[ 0 ] = VROMPAGE( ( Map4_Chr01 + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( ( Map4_Chr01 + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( ( Map4_Chr23 + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( ( Map4_Chr23 + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 4 ] = VROMPAGE( Map4_Chr4 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( Map4_Chr5 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE( Map4_Chr6 % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( Map4_Chr7 % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + } + } + else + { + if ( Map4_Chr_Swap() ) + { +#if 0 + PPUBANK[ 0 ] = VRAMPAGE0( 0 ); + PPUBANK[ 1 ] = VRAMPAGE0( 1 ); + PPUBANK[ 2 ] = VRAMPAGE0( 2 ); + PPUBANK[ 3 ] = VRAMPAGE0( 3 ); + PPUBANK[ 4 ] = VRAMPAGE1( 0 ); + PPUBANK[ 5 ] = VRAMPAGE1( 1 ); + PPUBANK[ 6 ] = VRAMPAGE1( 2 ); + PPUBANK[ 7 ] = VRAMPAGE1( 3 ); +#else + PPUBANK[ 0 ] = CRAMPAGE( 0 ); + PPUBANK[ 1 ] = CRAMPAGE( 1 ); + PPUBANK[ 2 ] = CRAMPAGE( 2 ); + PPUBANK[ 3 ] = CRAMPAGE( 3 ); + PPUBANK[ 4 ] = CRAMPAGE( 4 ); + PPUBANK[ 5 ] = CRAMPAGE( 5 ); + PPUBANK[ 6 ] = CRAMPAGE( 6 ); + PPUBANK[ 7 ] = CRAMPAGE( 7 ); +#endif + InfoNES_SetupChr(); + } else { +#if 0 + PPUBANK[ 0 ] = VRAMPAGE1( 0 ); + PPUBANK[ 1 ] = VRAMPAGE1( 1 ); + PPUBANK[ 2 ] = VRAMPAGE1( 2 ); + PPUBANK[ 3 ] = VRAMPAGE1( 3 ); + PPUBANK[ 4 ] = VRAMPAGE0( 0 ); + PPUBANK[ 5 ] = VRAMPAGE0( 1 ); + PPUBANK[ 6 ] = VRAMPAGE0( 2 ); + PPUBANK[ 7 ] = VRAMPAGE0( 3 ); +#else + PPUBANK[ 0 ] = CRAMPAGE( 0 ); + PPUBANK[ 1 ] = CRAMPAGE( 1 ); + PPUBANK[ 2 ] = CRAMPAGE( 2 ); + PPUBANK[ 3 ] = CRAMPAGE( 3 ); + PPUBANK[ 4 ] = CRAMPAGE( 4 ); + PPUBANK[ 5 ] = CRAMPAGE( 5 ); + PPUBANK[ 6 ] = CRAMPAGE( 6 ); + PPUBANK[ 7 ] = CRAMPAGE( 7 ); +#endif + InfoNES_SetupChr(); + } + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_140.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_140.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_140.c (revision 0) @@ -0,0 +1,88 @@ +/*===================================================================*/ +/* */ +/* Mapper 140 */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 140 */ +/*-------------------------------------------------------------------*/ +void Map140_Init() +{ + /* Initialize Mapper */ + MapperInit = Map0_Init; + + /* Write to Mapper */ + MapperWrite = Map0_Write; + + /* Write to SRAM */ + MapperSram = Map140_Sram; + + /* Write to APU */ + MapperApu = Map140_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 140 Write to SRAM Function */ +/*-------------------------------------------------------------------*/ +void Map140_Sram( WORD wAddr, BYTE byData ) +{ + Map140_Apu( wAddr, byData ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 140 Write to APU Function */ +/*-------------------------------------------------------------------*/ +void Map140_Apu( WORD wAddr, BYTE byData ) +{ + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( (((byData&0xF0)>>2) + 0 ) % (NesHeader.byRomSize << 1) ); + ROMBANK1 = ROMPAGE( (((byData%0xF0)>>2) + 1 ) % (NesHeader.byRomSize << 1) ); + ROMBANK2 = ROMPAGE( (((byData%0xF0)>>2) + 2 ) % (NesHeader.byRomSize << 1) ); + ROMBANK3 = ROMPAGE( (((byData%0xF0)>>2) + 3 ) % (NesHeader.byRomSize << 1) ); + + /* Set PPU Banks */ + PPUBANK[ 0 ] = VROMPAGE( (((byData&0x0F)<<3) + 0) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 1 ] = VROMPAGE( (((byData&0x0F)<<3) + 1) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 2 ] = VROMPAGE( (((byData&0x0F)<<3) + 2) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 3 ] = VROMPAGE( (((byData&0x0F)<<3) + 3) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 4 ] = VROMPAGE( (((byData&0x0F)<<3) + 4) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 5 ] = VROMPAGE( (((byData&0x0F)<<3) + 5) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 6 ] = VROMPAGE( (((byData&0x0F)<<3) + 6) % (NesHeader.byVRomSize << 3) ); + PPUBANK[ 7 ] = VROMPAGE( (((byData&0x0F)<<3) + 7) % (NesHeader.byVRomSize << 3) ); + InfoNES_SetupChr(); +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_042.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_042.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_042.c (revision 0) @@ -0,0 +1,117 @@ +/*===================================================================*/ +/* */ +/* Mapper 42 (Pirates) */ +/* */ +/*===================================================================*/ + +BYTE Map42_IRQ_Cnt; +BYTE Map42_IRQ_Enable; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 42 */ +/*-------------------------------------------------------------------*/ +void Map42_Init() +{ + /* Initialize Mapper */ + MapperInit = Map42_Init; + + /* Write to Mapper */ + MapperWrite = Map42_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map42_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = ROMPAGE( 0 ); + + /* Set ROM Banks */ + ROMBANK0 = ROMLASTPAGE( 3 ); + ROMBANK1 = ROMLASTPAGE( 2 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 42 Write Function */ +/*-------------------------------------------------------------------*/ +void Map42_Write( WORD wAddr, BYTE byData ) +{ + switch ( wAddr & 0xe003 ) + { + /* Set ROM Banks */ + case 0xe000: + SRAMBANK = ROMPAGE( ( byData & 0x0f ) % ( NesHeader.byRomSize << 1 ) ); + break; + + case 0xe001: + if ( byData & 0x08 ) + { + InfoNES_Mirroring( 0 ); + } else { + InfoNES_Mirroring( 1 ); + } + break; + + case 0xe002: + if ( byData & 0x02 ) + { + Map42_IRQ_Enable = 1; + } else { + Map42_IRQ_Enable = 0; + Map42_IRQ_Cnt = 0; + } + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 42 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map42_HSync() +{ +/* + * Callback at HSync + * + */ + if ( Map42_IRQ_Enable ) + { + if ( Map42_IRQ_Cnt < 215 ) + { + Map42_IRQ_Cnt++; + } + if ( Map42_IRQ_Cnt == 215 ) + { + IRQ_REQ; + Map42_IRQ_Enable = 0; + } + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_025.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_025.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_025.c (revision 0) @@ -0,0 +1,194 @@ +/*===================================================================*/ +/* */ +/* Mapper 25 (Konami VRC4 type B) */ +/* */ +/*===================================================================*/ + +BYTE Map25_Bank_Selector; +BYTE Map25_VBank[16]; + +BYTE Map25_IRQ_Count; +BYTE Map25_IRQ_State; +BYTE Map25_IRQ_Latch; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 25 */ +/*-------------------------------------------------------------------*/ +void Map25_Init() +{ + int nPage; + + /* Initialize Mapper */ + MapperInit = Map25_Init; + + /* Write to Mapper */ + MapperWrite = Map25_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map25_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Reset VBank Registers */ + for (nPage = 0; nPage < 16; nPage++) + Map25_VBank[ nPage ] = 0x00; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 25 Write Function */ +/*-------------------------------------------------------------------*/ +void Map25_Write( WORD wAddr, BYTE byData ) +{ + int nBank; + + switch ( wAddr ) + { + case 0x8000: + /* Set ROM Banks */ + byData %= ( NesHeader.byRomSize << 1 ); + if ( Map25_Bank_Selector ) + { + ROMBANK2 = ROMPAGE( byData ); + } else { + ROMBANK0 = ROMPAGE( byData ); + } + break; + + case 0x9000: + /* Name Table Mirroring */ + switch (byData & 0x03) + { + case 0: + InfoNES_Mirroring( 1 ); /* Vertical */ + break; + case 1: + InfoNES_Mirroring( 0 ); /* Horizontal */ + break; + case 2: + InfoNES_Mirroring( 2 ); /* One Screen 0x2000 */ + break; + case 3: + InfoNES_Mirroring( 3 ); /* One Screen 0x2400 */ + break; + } + break; + + case 0x9002: + /* TODO: SaveRAM Toggle */ + /* $8000 Switching Mode */ + Map25_Bank_Selector = byData & 0x02; + break; + + case 0xa000: + /* Set ROM Banks */ + byData %= ( NesHeader.byRomSize << 1 ); + ROMBANK1 = ROMPAGE( byData ); + break; + + default: + /* Set PPU Banks */ + switch ( wAddr & 0xfffc) + { + case 0xb000: + Map25_VBank[ 0 + ( wAddr & 0x0003 ) ] = byData & 0x0f; + nBank = 0 + ( wAddr & 0x0001 ); + Map25_Sync_Vrom( nBank ); + break; + + case 0xc000: + Map25_VBank[ 4 + ( wAddr & 0x0003 ) ] = byData & 0x0f; + nBank = 2 + ( wAddr & 0x0001 ); + Map25_Sync_Vrom( nBank ); + break; + + case 0xd000: + Map25_VBank[ 8 + ( wAddr & 0x0003 ) ] = byData & 0x0f; + nBank = 4 + ( wAddr & 0x0001 ); + Map25_Sync_Vrom( nBank ); + break; + + case 0xe000: + Map25_VBank[ 12 + ( wAddr & 0x0003 ) ] = byData & 0x0f; + nBank = 6 + ( wAddr & 0x0001 ); + Map25_Sync_Vrom( nBank ); + break; + + case 0xf000: + switch ( wAddr & 0x0003 ) + { + case 0: + case 1: + Map25_IRQ_Latch = byData; + break; + case 2: + Map25_IRQ_State = ( byData & 0x01 ) ? Map25_IRQ_State : 0x00; + Map25_IRQ_State = ( byData & 0x02 ) ? 0x01 : Map25_IRQ_State; + Map25_IRQ_Count = Map25_IRQ_Latch; + break; + case 3: + Map25_IRQ_State = ( Map25_IRQ_State << 1 ) | ( Map25_IRQ_State & 1 ); + break; + } + break; + } + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 25 Sync VROM Function */ +/*-------------------------------------------------------------------*/ +void Map25_Sync_Vrom( int nBank ) +{ + BYTE byValue; + + byValue = Map25_VBank[ ( nBank << 1 ) - ( nBank & 0x01 ) ]; + byValue |= Map25_VBank[ ( nBank << 1 ) - ( nBank & 0x01 ) + 2] << 4; + byValue %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ nBank ] = VROMPAGE( byValue ); + InfoNES_SetupChr(); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 25 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map25_HSync() +{ +/* + * Callback at HSync + * + */ + if ( ( Map25_IRQ_State & 0x02 ) && ( ++Map25_IRQ_Count == 0 ) ) + { + IRQ_REQ; + Map25_IRQ_Count = Map25_IRQ_Latch; + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_242.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_242.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_242.c (revision 0) @@ -0,0 +1,64 @@ +/*===================================================================*/ +/* */ +/* Mapper 242 : Wai Xing Zhan Shi */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 242 */ +/*-------------------------------------------------------------------*/ +void Map242_Init() +{ + /* Initialize Mapper */ + MapperInit = Map242_Init; + + /* Write to Mapper */ + MapperWrite = Map242_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 242 Write Function */ +/*-------------------------------------------------------------------*/ +void Map242_Write( WORD wAddr, BYTE byData ) +{ + if( wAddr & 0x01 ) { + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE((((wAddr&0xF8)>>1)+0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE((((wAddr&0xF8)>>1)+1) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE((((wAddr&0xF8)>>1)+2) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE((((wAddr&0xF8)>>1)+3) % (NesHeader.byRomSize<<1)); + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_080.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_080.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_080.c (revision 0) @@ -0,0 +1,138 @@ +/*===================================================================*/ +/* */ +/* Mapper 80 (X1-005) */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 80 */ +/*-------------------------------------------------------------------*/ +void Map80_Init() +{ + /* Initialize Mapper */ + MapperInit = Map80_Init; + + /* Write to Mapper */ + MapperWrite = Map0_Write; + + /* Write to SRAM */ + MapperSram = Map80_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 80 Write to SRAM Function */ +/*-------------------------------------------------------------------*/ +void Map80_Sram( WORD wAddr, BYTE byData ) +{ + switch ( wAddr ) + { + /* Set PPU Banks */ + case 0x7ef0: + byData &= 0x7f; + byData %= ( NesHeader.byVRomSize << 3 ); + + PPUBANK[ 0 ] = VROMPAGE( byData ); + PPUBANK[ 1 ] = VROMPAGE( byData + 1 ); + InfoNES_SetupChr(); + break; + + case 0x7ef1: + byData &= 0x7f; + byData %= ( NesHeader.byVRomSize << 3 ); + + PPUBANK[ 2 ] = VROMPAGE( byData ); + PPUBANK[ 3 ] = VROMPAGE( byData + 1 ); + InfoNES_SetupChr(); + break; + + case 0x7ef2: + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 4 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0x7ef3: + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 5 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0x7ef4: + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 6 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0x7ef5: + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 7 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + /* Name Table Mirroring */ + case 0x7ef6: + if ( byData & 0x01 ) + { + InfoNES_Mirroring( 1 ); + } else { + InfoNES_Mirroring( 0 ); + } + + /* Set ROM Banks */ + case 0x7efa: + case 0x7efb: + byData %= ( NesHeader.byRomSize << 1 ); + ROMBANK0 = ROMPAGE( byData ); + break; + + case 0x7efc: + case 0x7efd: + byData %= ( NesHeader.byRomSize << 1 ); + ROMBANK1 = ROMPAGE( byData ); + break; + + case 0x7efe: + case 0x7eff: + byData %= ( NesHeader.byRomSize << 1 ); + ROMBANK2 = ROMPAGE( byData ); + break; + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_008.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_008.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_008.c (revision 0) @@ -0,0 +1,90 @@ +/*===================================================================*/ +/* */ +/* Mapper 8 (FFE F3xxx) */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 8 */ +/*-------------------------------------------------------------------*/ +void Map8_Init() +{ + int nPage; + + /* Initialize Mapper */ + MapperInit = Map8_Init; + + /* Write to Mapper */ + MapperWrite = Map8_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 8 Write Function */ +/*-------------------------------------------------------------------*/ +void Map8_Write( WORD wAddr, BYTE byData ) +{ + BYTE byPrgBank = ( byData & 0xf8 ) >> 3; + BYTE byChrBank = byData & 0x07; + + /* Set ROM Banks */ + byPrgBank <<= 1; + byPrgBank %= ( NesHeader.byRomSize << 1 ); + + ROMBANK0 = ROMPAGE( byPrgBank + 0 ); + ROMBANK1 = ROMPAGE( byPrgBank + 1 ); + + /* Set PPU Banks */ + byChrBank <<= 3; + byChrBank %= ( NesHeader.byVRomSize << 3 ); + + PPUBANK[ 0 ] = VROMPAGE( byChrBank + 0 ); + PPUBANK[ 1 ] = VROMPAGE( byChrBank + 1 ); + PPUBANK[ 2 ] = VROMPAGE( byChrBank + 2 ); + PPUBANK[ 3 ] = VROMPAGE( byChrBank + 3 ); + PPUBANK[ 4 ] = VROMPAGE( byChrBank + 4 ); + PPUBANK[ 5 ] = VROMPAGE( byChrBank + 5 ); + PPUBANK[ 6 ] = VROMPAGE( byChrBank + 6 ); + PPUBANK[ 7 ] = VROMPAGE( byChrBank + 7 ); + InfoNES_SetupChr(); +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_225.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_225.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_225.c (revision 0) @@ -0,0 +1,102 @@ +/*===================================================================*/ +/* */ +/* Mapper 225 : 72-in-1 */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 225 */ +/*-------------------------------------------------------------------*/ +void Map225_Init() +{ + /* Initialize Mapper */ + MapperInit = Map225_Init; + + /* Write to Mapper */ + MapperWrite = Map225_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 225 Write Function */ +/*-------------------------------------------------------------------*/ +void Map225_Write( WORD wAddr, BYTE byData ) +{ + BYTE byPrgBank = (wAddr & 0x0F80) >> 7; + BYTE byChrBank = wAddr & 0x003F; + + PPUBANK[ 0 ] = VROMPAGE(((byChrBank<<3)+0) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE(((byChrBank<<3)+1) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE(((byChrBank<<3)+2) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE(((byChrBank<<3)+3) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 4 ] = VROMPAGE(((byChrBank<<3)+4) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE(((byChrBank<<3)+5) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE(((byChrBank<<3)+6) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE(((byChrBank<<3)+7) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + + if( wAddr & 0x2000 ) { + InfoNES_Mirroring( 0 ); + } else { + InfoNES_Mirroring( 1 ); + } + + if( wAddr & 0x1000 ) { + // 16KBbank + if( wAddr & 0x0040 ) { + ROMBANK0 = ROMPAGE(((byPrgBank<<2)+2) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE(((byPrgBank<<2)+3) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMPAGE(((byPrgBank<<2)+2) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK3 = ROMPAGE(((byPrgBank<<2)+3) % ( NesHeader.byRomSize << 1 ) ); + } else { + ROMBANK0 = ROMPAGE(((byPrgBank<<2)+0) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE(((byPrgBank<<2)+1) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMPAGE(((byPrgBank<<2)+0) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK3 = ROMPAGE(((byPrgBank<<2)+1) % ( NesHeader.byRomSize << 1 ) ); + } + } else { + ROMBANK0 = ROMPAGE(((byPrgBank<<2)+0) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE(((byPrgBank<<2)+1) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMPAGE(((byPrgBank<<2)+2) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK3 = ROMPAGE(((byPrgBank<<2)+3) % ( NesHeader.byRomSize << 1 ) ); + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_046.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_046.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_046.c (revision 0) @@ -0,0 +1,98 @@ +/*===================================================================*/ +/* */ +/* Mapper 46 (Color Dreams) */ +/* */ +/*===================================================================*/ + +BYTE Map46_Regs[ 4 ]; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 46 */ +/*-------------------------------------------------------------------*/ +void Map46_Init() +{ + /* Initialize Mapper */ + MapperInit = Map46_Init; + + /* Write to Mapper */ + MapperWrite = Map46_Write; + + /* Write to SRAM */ + MapperSram = Map46_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + Map46_Regs[ 0 ] = Map46_Regs[ 1 ] = Map46_Regs[ 2 ] = Map46_Regs[ 3 ] = 0; + Map46_Set_ROM_Banks(); + + /* Name Table Mirroring */ + InfoNES_Mirroring( 1 ); + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 46 Write to SRAM Function */ +/*-------------------------------------------------------------------*/ +void Map46_Sram( WORD wAddr, BYTE byData ) +{ + /* Set ROM Banks */ + Map46_Regs[ 0 ] = byData & 0x0f; + Map46_Regs[ 1 ] = ( byData & 0xf0 ) >> 4; + Map46_Set_ROM_Banks(); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 46 Write Function */ +/*-------------------------------------------------------------------*/ +void Map46_Write( WORD wAddr, BYTE byData ) +{ + /* Set ROM Banks */ + Map46_Regs[ 2 ] = byData & 0x01; + Map46_Regs[ 3 ] = ( byData & 0x70 ) >> 4; + Map46_Set_ROM_Banks(); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 46 Setup ROM Banks Function */ +/*-------------------------------------------------------------------*/ +void Map46_Set_ROM_Banks() +{ + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( ( ( Map46_Regs[ 0 ] << 3 ) + ( Map46_Regs[ 2 ] << 2 ) + 0 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE( ( ( Map46_Regs[ 0 ] << 3 ) + ( Map46_Regs[ 2 ] << 2 ) + 1 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMPAGE( ( ( Map46_Regs[ 0 ] << 3 ) + ( Map46_Regs[ 2 ] << 2 ) + 2 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK3 = ROMPAGE( ( ( Map46_Regs[ 0 ] << 3 ) + ( Map46_Regs[ 2 ] << 2 ) + 3 ) % ( NesHeader.byRomSize << 1 ) ); + + /* Set PPU Banks */ + PPUBANK[ 0 ] = VROMPAGE( ( ( Map46_Regs[ 1 ] << 6 ) + ( Map46_Regs[ 3 ] << 3 ) + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( ( ( Map46_Regs[ 1 ] << 6 ) + ( Map46_Regs[ 3 ] << 3 ) + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 2 ] = VROMPAGE( ( ( Map46_Regs[ 1 ] << 6 ) + ( Map46_Regs[ 3 ] << 3 ) + 2 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( ( ( Map46_Regs[ 1 ] << 6 ) + ( Map46_Regs[ 3 ] << 3 ) + 3 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 4 ] = VROMPAGE( ( ( Map46_Regs[ 1 ] << 6 ) + ( Map46_Regs[ 3 ] << 3 ) + 4 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 5 ] = VROMPAGE( ( ( Map46_Regs[ 1 ] << 6 ) + ( Map46_Regs[ 3 ] << 3 ) + 5 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 6 ] = VROMPAGE( ( ( Map46_Regs[ 1 ] << 6 ) + ( Map46_Regs[ 3 ] << 3 ) + 6 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 7 ] = VROMPAGE( ( ( Map46_Regs[ 1 ] << 6 ) + ( Map46_Regs[ 3 ] << 3 ) + 7 ) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_182.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_182.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_182.c (revision 0) @@ -0,0 +1,173 @@ +/*===================================================================*/ +/* */ +/* Mapper 182 (Pirates) */ +/* */ +/*===================================================================*/ + +BYTE Map182_Regs[1]; +BYTE Map182_IRQ_Enable; +BYTE Map182_IRQ_Cnt; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 182 */ +/*-------------------------------------------------------------------*/ +void Map182_Init() +{ + /* Initialize Mapper */ + MapperInit = Map182_Init; + + /* Write to Mapper */ + MapperWrite = Map182_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map182_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( int nPage = 0; nPage < 8; ++nPage ) + { + PPUBANK[ nPage ] = VROMPAGE( nPage ); + } + InfoNES_SetupChr(); + } + + /* Initialize IRQ registers */ + Map182_Regs[0] = 0; + Map182_IRQ_Enable = 0; + Map182_IRQ_Cnt = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 182 Write Function */ +/*-------------------------------------------------------------------*/ +void Map182_Write( WORD wAddr, BYTE byData ) +{ + switch( wAddr & 0xF003 ) + { + /* Name Table Mirroring */ + case 0x8001: + if ( byData & 0x01 ) + { + InfoNES_Mirroring( 0 ); /* Horizontal */ + } + else + { + InfoNES_Mirroring( 1 ); /* Vertical */ + } + break; + + case 0xA000: + Map182_Regs[0] = byData & 0x07; + break; + + case 0xC000: + switch( Map182_Regs[0] ) + { + /* Set PPU Banks */ + case 0x00: + PPUBANK[ 0 ] = VROMPAGE( ( ( byData & 0xFE ) + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( ( ( byData & 0xFE ) + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0x01: + PPUBANK[ 5 ] = VROMPAGE( byData % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0x02: + PPUBANK[ 2 ] = VROMPAGE( ( ( byData & 0xFE ) + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( ( ( byData & 0xFE ) + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0x03: + PPUBANK[ 7 ] = VROMPAGE( byData % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + /* Set ROM Banks */ + case 0x04: + ROMBANK0 = ROMPAGE( byData % ( NesHeader.byRomSize << 1 ) ); + break; + + case 0x05: + ROMBANK1 = ROMPAGE( byData % ( NesHeader.byRomSize << 1 ) ); + break; + + /* Set PPU Banks */ + case 0x06: + PPUBANK[ 4 ] = VROMPAGE( byData % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0x07: + PPUBANK[ 6 ] = VROMPAGE( byData % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + } + break; + + case 0xE003: + Map182_IRQ_Cnt = byData; + Map182_IRQ_Enable = byData; + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 182 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map182_HSync() +{ +/* + * Callback at HSync + * + */ + if ( Map182_IRQ_Enable ) + { + if ( /* 0 <= PPU_Scanline && */ PPU_Scanline <= 240 ) + { + if ( PPU_R1 & R1_SHOW_SCR || PPU_R1 & R1_SHOW_SP ) + { + if ( !( --Map182_IRQ_Cnt ) ) + { + Map182_IRQ_Cnt = 0; + Map182_IRQ_Enable = 0; + IRQ_REQ; + } + } + } + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_246.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_246.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_246.c (revision 0) @@ -0,0 +1,96 @@ +/*===================================================================*/ +/* */ +/* Mapper 246 : Phone Serm Berm */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 246 */ +/*-------------------------------------------------------------------*/ +void Map246_Init() +{ + /* Initialize Mapper */ + MapperInit = Map246_Init; + + /* Write to Mapper */ + MapperWrite = Map0_Write; + + /* Write to SRAM */ + MapperSram = Map246_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 246 Write to SRAM Function */ +/*-------------------------------------------------------------------*/ +void Map246_Sram( WORD wAddr, BYTE byData ) +{ + if( wAddr>=0x6000 && wAddr<0x8000 ) { + switch( wAddr ) { + case 0x6000: + ROMBANK0 = ROMPAGE(((byData<<2)+0) % (NesHeader.byRomSize<<1)); + break; + case 0x6001: + ROMBANK1 = ROMPAGE(((byData<<2)+1) % (NesHeader.byRomSize<<1)); + break; + case 0x6002: + ROMBANK2 = ROMPAGE(((byData<<2)+2) % (NesHeader.byRomSize<<1)); + break; + case 0x6003: + ROMBANK3 = ROMPAGE(((byData<<2)+3) % (NesHeader.byRomSize<<1)); + break; + case 0x6004: + PPUBANK[ 0 ] = VROMPAGE(((byData<<1)+0) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 1 ] = VROMPAGE(((byData<<1)+1) % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + break; + case 0x6005: + PPUBANK[ 2 ] = VROMPAGE(((byData<<1)+0) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 3 ] = VROMPAGE(((byData<<1)+1) % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + break; + case 0x6006: + PPUBANK[ 4 ] = VROMPAGE(((byData<<1)+0) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 5 ] = VROMPAGE(((byData<<1)+1) % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + break; + case 0x6007: + PPUBANK[ 6 ] = VROMPAGE(((byData<<1)+0) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 7 ] = VROMPAGE(((byData<<1)+1) % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + break; + default: + SRAMBANK[wAddr&0x1FFF] = byData; + break; + } + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_229.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_229.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_229.c (revision 0) @@ -0,0 +1,105 @@ +/*===================================================================*/ +/* */ +/* Mapper 229 : 31-in-1 */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 229 */ +/*-------------------------------------------------------------------*/ +void Map229_Init() +{ + /* Initialize Mapper */ + MapperInit = Map229_Init; + + /* Write to Mapper */ + MapperWrite = Map229_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 229 Write Function */ +/*-------------------------------------------------------------------*/ +void Map229_Write( WORD wAddr, BYTE byData ) +{ + if( wAddr & 0x001E ) { + BYTE byPrg = wAddr&0x001F; + + ROMBANK0 = ROMPAGE(((byPrg<<1)+0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE(((byPrg<<1)+1) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE(((byPrg<<1)+0) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE(((byPrg<<1)+1) % (NesHeader.byRomSize<<1)); + + BYTE byChr = wAddr & 0x0FFF; + + PPUBANK[ 0 ] = VROMPAGE(((byChr<<3) + 0) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 1 ] = VROMPAGE(((byChr<<3) + 1) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 2 ] = VROMPAGE(((byChr<<3) + 2) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 3 ] = VROMPAGE(((byChr<<3) + 3) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 4 ] = VROMPAGE(((byChr<<3) + 4) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 5 ] = VROMPAGE(((byChr<<3) + 5) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 6 ] = VROMPAGE(((byChr<<3) + 6) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 7 ] = VROMPAGE(((byChr<<3) + 7) % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + } else { + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + + PPUBANK[ 0 ] = VROMPAGE( 0 ); + PPUBANK[ 1 ] = VROMPAGE( 1 ); + PPUBANK[ 2 ] = VROMPAGE( 2 ); + PPUBANK[ 3 ] = VROMPAGE( 3 ); + PPUBANK[ 4 ] = VROMPAGE( 4 ); + PPUBANK[ 5 ] = VROMPAGE( 5 ); + PPUBANK[ 6 ] = VROMPAGE( 6 ); + PPUBANK[ 7 ] = VROMPAGE( 7 ); + InfoNES_SetupChr(); + } + + if( wAddr & 0x0020 ) { + InfoNES_Mirroring( 0 ); + } else { + InfoNES_Mirroring( 1 ); + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_067.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_067.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_067.c (revision 0) @@ -0,0 +1,177 @@ +/*===================================================================*/ +/* */ +/* Mapper 67 (Sunsoft Mapper #3) */ +/* */ +/*===================================================================*/ + +BYTE Map67_IRQ_Enable; +BYTE Map67_IRQ_Cnt; +BYTE Map67_IRQ_Latch; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 67 */ +/*-------------------------------------------------------------------*/ +void Map67_Init() +{ + /* Initialize Mapper */ + MapperInit = Map67_Init; + + /* Write to Mapper */ + MapperWrite = Map67_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map67_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set PPU Banks */ + PPUBANK[ 0 ] = VROMPAGE( 0 ); + PPUBANK[ 1 ] = VROMPAGE( 1 ); + PPUBANK[ 2 ] = VROMPAGE( 2 ); + PPUBANK[ 3 ] = VROMPAGE( 3 ); + PPUBANK[ 4 ] = VROMPAGE( ( NesHeader.byVRomSize << 3 ) - 4 ); + PPUBANK[ 5 ] = VROMPAGE( ( NesHeader.byVRomSize << 3 ) - 3 ); + PPUBANK[ 6 ] = VROMPAGE( ( NesHeader.byVRomSize << 3 ) - 2 ); + PPUBANK[ 7 ] = VROMPAGE( ( NesHeader.byVRomSize << 3 ) - 1 ); + InfoNES_SetupChr(); + + /* Initialize IRQ Registers */ + Map67_IRQ_Enable = 0; + Map67_IRQ_Cnt = 0; + Map67_IRQ_Latch = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 67 Write Function */ +/*-------------------------------------------------------------------*/ +void Map67_Write( WORD wAddr, BYTE byData ) +{ + switch ( wAddr & 0xf800 ) + { + /* Set PPU Banks */ + case 0x8800: + byData <<= 1; + byData %= ( NesHeader.byVRomSize << 3 ); + + PPUBANK[ 0 ] = VROMPAGE( byData + 0 ); + PPUBANK[ 1 ] = VROMPAGE( byData + 1 ); + InfoNES_SetupChr(); + break; + + case 0x9800: + byData <<= 1; + byData %= ( NesHeader.byVRomSize << 3 ); + + PPUBANK[ 2 ] = VROMPAGE( byData + 0 ); + PPUBANK[ 3 ] = VROMPAGE( byData + 1 ); + InfoNES_SetupChr(); + break; + + case 0xa800: + byData <<= 1; + byData %= ( NesHeader.byVRomSize << 3 ); + + PPUBANK[ 4 ] = VROMPAGE( byData + 0 ); + PPUBANK[ 5 ] = VROMPAGE( byData + 1 ); + InfoNES_SetupChr(); + break; + + case 0xb800: + byData <<= 1; + byData %= ( NesHeader.byVRomSize << 3 ); + + PPUBANK[ 6 ] = VROMPAGE( byData + 0 ); + PPUBANK[ 7 ] = VROMPAGE( byData + 1 ); + InfoNES_SetupChr(); + break; + + case 0xc800: + Map67_IRQ_Cnt = Map67_IRQ_Latch; + Map67_IRQ_Latch = byData; + break; + + case 0xd800: + Map67_IRQ_Enable = byData & 0x10; + break; + + case 0xe800: + switch ( byData & 0x03 ) + { + case 0: + InfoNES_Mirroring( 1 ); + break; + case 1: + InfoNES_Mirroring( 0 ); + break; + case 2: + InfoNES_Mirroring( 3 ); + break; + case 3: + InfoNES_Mirroring( 2 ); + break; + } + break; + + /* Set ROM Banks */ + case 0xf800: + byData <<= 1; + byData %= ( NesHeader.byRomSize << 1 ); + + ROMBANK0 = ROMPAGE( byData + 0 ); + ROMBANK1 = ROMPAGE( byData + 1 ); + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 67 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map67_HSync() +{ +/* + * Callback at HSync + * + */ + if ( Map67_IRQ_Enable ) + { + if ( /* 0 <= PPU_Scanline && */ PPU_Scanline <= 239 ) + { + if ( PPU_R1 & R1_SHOW_SCR || PPU_R1 & R1_SHOW_SP ) + { + if ( --Map67_IRQ_Cnt == 0xf6 ) + { + Map67_IRQ_Cnt = Map67_IRQ_Latch; + IRQ_REQ; + } + } + } + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_088.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_088.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_088.c (revision 0) @@ -0,0 +1,127 @@ +/*===================================================================*/ +/* */ +/* Mapper 88 (Namco 118) */ +/* */ +/*===================================================================*/ + +BYTE Map88_Regs[ 1 ]; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 88 */ +/*-------------------------------------------------------------------*/ +void Map88_Init() +{ + /* Initialize Mapper */ + MapperInit = Map88_Init; + + /* Write to Mapper */ + MapperWrite = Map88_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 88 Write Function */ +/*-------------------------------------------------------------------*/ +void Map88_Write( WORD wAddr, BYTE byData ) +{ + switch ( wAddr ) + { + case 0x8000: + Map88_Regs[ 0 ] = byData; + break; + + case 0x8001: + switch ( Map88_Regs[ 0 ] & 0x07 ) + { + case 0x00: + PPUBANK[ 0 ] = VROMPAGE( ( ( byData & 0xfe ) + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 1 ] = VROMPAGE( ( ( byData & 0xfe ) + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0x01: + PPUBANK[ 2 ] = VROMPAGE( ( ( byData & 0xfe ) + 0 ) % ( NesHeader.byVRomSize << 3 ) ); + PPUBANK[ 3 ] = VROMPAGE( ( ( byData & 0xfe ) + 1 ) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0x02: + PPUBANK[ 4 ] = VROMPAGE( ( byData + 0x40 ) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0x03: + PPUBANK[ 5 ] = VROMPAGE( ( byData + 0x40 ) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0x04: + PPUBANK[ 6 ] = VROMPAGE( ( byData + 0x40 ) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0x05: + PPUBANK[ 7 ] = VROMPAGE( ( byData + 0x40 ) % ( NesHeader.byVRomSize << 3 ) ); + InfoNES_SetupChr(); + break; + + case 0x06: + ROMBANK0 = ROMPAGE( byData % ( NesHeader.byRomSize << 1 ) ); + break; + + case 0x07: + ROMBANK1 = ROMPAGE( byData % ( NesHeader.byRomSize << 1 ) ); + break; + } + break; + + case 0xc000: + if ( byData ) + { + InfoNES_Mirroring( 2 ); + } else { + InfoNES_Mirroring( 3 ); + } + break; + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_013.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_013.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_013.c (revision 0) @@ -0,0 +1,80 @@ +/*===================================================================*/ +/* */ +/* Mapper 13 : CPROM */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 13 */ +/*-------------------------------------------------------------------*/ +void Map13_Init() +{ + /* Initialize Mapper */ + MapperInit = Map13_Init; + + /* Write to Mapper */ + MapperWrite = Map13_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + + /* Set PPU Banks */ + PPUBANK[ 0 ] = CRAMPAGE( 0 ); + PPUBANK[ 1 ] = CRAMPAGE( 1 ); + PPUBANK[ 2 ] = CRAMPAGE( 2 ); + PPUBANK[ 3 ] = CRAMPAGE( 3 ); + PPUBANK[ 4 ] = CRAMPAGE( 0 ); + PPUBANK[ 5 ] = CRAMPAGE( 1 ); + PPUBANK[ 6 ] = CRAMPAGE( 2 ); + PPUBANK[ 7 ] = CRAMPAGE( 3 ); + InfoNES_SetupChr(); + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 13 Write Function */ +/*-------------------------------------------------------------------*/ +void Map13_Write( WORD wAddr, BYTE byData ) +{ + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE((((byData&0x30)>>2)+0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE((((byData&0x30)>>2)+1) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE((((byData&0x30)>>2)+2) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE((((byData&0x30)>>2)+3) % (NesHeader.byRomSize<<1)); + + /* Set PPU Banks */ + PPUBANK[ 4 ] = CRAMPAGE(((byData&0x03)<<2)+0); + PPUBANK[ 5 ] = CRAMPAGE(((byData&0x03)<<2)+1); + PPUBANK[ 6 ] = CRAMPAGE(((byData&0x03)<<2)+2); + PPUBANK[ 7 ] = CRAMPAGE(((byData&0x03)<<2)+3); + InfoNES_SetupChr(); +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_230.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_230.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_230.c (revision 0) @@ -0,0 +1,94 @@ +/*===================================================================*/ +/* */ +/* Mapper 230 : 22-in-1 */ +/* */ +/*===================================================================*/ + +BYTE Map230_RomSw; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 230 */ +/*-------------------------------------------------------------------*/ +void Map230_Init() +{ + /* Initialize Mapper */ + MapperInit = Map230_Init; + + /* Write to Mapper */ + MapperWrite = Map230_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Initialize Registers */ + if( Map230_RomSw ) { + Map230_RomSw = 0; + } else { + Map230_RomSw = 1; + } + + /* Set ROM Banks */ + if( Map230_RomSw ) { + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 14 ); + ROMBANK3 = ROMPAGE( 15 ); + } else { + ROMBANK0 = ROMPAGE( 16 ); + ROMBANK1 = ROMPAGE( 17 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 230 Write Function */ +/*-------------------------------------------------------------------*/ +void Map230_Write( WORD wAddr, BYTE byData ) +{ + if( Map230_RomSw ) { + ROMBANK0 = ROMPAGE((((byData&0x07)<<1)+0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE((((byData&0x07)<<1)+1) % (NesHeader.byRomSize<<1)); + } else { + if( byData & 0x20 ) { + ROMBANK0 = ROMPAGE((((byData&0x1F)<<1)+16) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE((((byData&0x1F)<<1)+17) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE((((byData&0x1F)<<1)+16) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE((((byData&0x1F)<<1)+17) % (NesHeader.byRomSize<<1)); + } else { + ROMBANK0 = ROMPAGE((((byData&0x1E)<<1)+16) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE((((byData&0x1E)<<1)+17) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE((((byData&0x1E)<<1)+18) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE((((byData&0x1E)<<1)+19) % (NesHeader.byRomSize<<1)); + } + if( byData & 0x40 ) { + InfoNES_Mirroring( 1 ); + } else { + InfoNES_Mirroring( 0 ); + } + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_051.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_051.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_051.c (revision 0) @@ -0,0 +1,123 @@ +/*===================================================================*/ +/* */ +/* Mapper 51 : 11-in-1 */ +/* */ +/*===================================================================*/ + +int Map51_Mode, Map51_Bank; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 51 */ +/*-------------------------------------------------------------------*/ +void Map51_Init() +{ + /* Initialize Mapper */ + MapperInit = Map51_Init; + + /* Write to Mapper */ + MapperWrite = Map51_Write; + + /* Write to SRAM */ + MapperSram = Map51_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set Registers */ + Map51_Bank = 0; + Map51_Mode = 1; + + /* Set ROM Banks */ + Map51_Set_CPU_Banks(); + + /* Set PPU Banks */ + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = CRAMPAGE( nPage ); + InfoNES_SetupChr(); + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 51 Write Function */ +/*-------------------------------------------------------------------*/ +void Map51_Write( WORD wAddr, BYTE byData ) +{ + Map51_Bank = (byData & 0x0f) << 2; + if( 0xC000 <= wAddr && wAddr <= 0xDFFF ) { + Map51_Mode = (Map51_Mode & 0x01) | ((byData & 0x10) >> 3); + } + Map51_Set_CPU_Banks(); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 51 Write to SRAM Function */ +/*-------------------------------------------------------------------*/ +void Map51_Sram( WORD wAddr, BYTE byData ) +{ + if( wAddr>=0x6000 ) { + Map51_Mode = ((byData & 0x10) >> 3) | ((byData & 0x02) >> 1); + Map51_Set_CPU_Banks(); + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 51 Set CPU Banks Function */ +/*-------------------------------------------------------------------*/ +void Map51_Set_CPU_Banks() +{ + switch(Map51_Mode) { + case 0: + InfoNES_Mirroring( 1 ); + SRAMBANK = ROMPAGE((Map51_Bank|0x2c|3) % (NesHeader.byRomSize<<1)); + ROMBANK0 = ROMPAGE((Map51_Bank|0x00|0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE((Map51_Bank|0x00|1) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE((Map51_Bank|0x0c|2) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE((Map51_Bank|0x0c|3) % (NesHeader.byRomSize<<1)); + break; + case 1: + InfoNES_Mirroring( 1 ); + SRAMBANK = ROMPAGE((Map51_Bank|0x20|3) % (NesHeader.byRomSize<<1)); + ROMBANK0 = ROMPAGE((Map51_Bank|0x00|0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE((Map51_Bank|0x00|1) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE((Map51_Bank|0x00|2) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE((Map51_Bank|0x00|3) % (NesHeader.byRomSize<<1)); + break; + case 2: + InfoNES_Mirroring( 1 ); + SRAMBANK = ROMPAGE((Map51_Bank|0x2e|3) % (NesHeader.byRomSize<<1)); + ROMBANK0 = ROMPAGE((Map51_Bank|0x02|0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE((Map51_Bank|0x02|1) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE((Map51_Bank|0x0e|2) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE((Map51_Bank|0x0e|3) % (NesHeader.byRomSize<<1)); + break; + case 3: + InfoNES_Mirroring( 0 ); + SRAMBANK = ROMPAGE((Map51_Bank|0x20|3) % (NesHeader.byRomSize<<1)); + ROMBANK0 = ROMPAGE((Map51_Bank|0x00|0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE((Map51_Bank|0x00|1) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE((Map51_Bank|0x00|2) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE((Map51_Bank|0x00|3) % (NesHeader.byRomSize<<1)); + break; + } +} + Index: apps/plugins/infones/mapper/InfoNES_Mapper_115.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_115.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_115.c (revision 0) @@ -0,0 +1,268 @@ +/*===================================================================*/ +/* */ +/* Mapper 115 : CartSaint : Yuu Yuu Hakusho Final JusticePao(?) */ +/* */ +/*===================================================================*/ + +BYTE Map115_Reg[8]; +BYTE Map115_Prg0, Map115_Prg1, Map115_Prg2, Map115_Prg3; +BYTE Map115_Prg0L, Map115_Prg1L; +BYTE Map115_Chr0, Map115_Chr1, Map115_Chr2, Map115_Chr3; +BYTE Map115_Chr4, Map115_Chr5, Map115_Chr6, Map115_Chr7; + +BYTE Map115_IRQ_Enable; +BYTE Map115_IRQ_Counter; +BYTE Map115_IRQ_Latch; + +BYTE Map115_ExPrgSwitch; +BYTE Map115_ExChrSwitch; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 115 */ +/*-------------------------------------------------------------------*/ +void Map115_Init() +{ + /* Initialize Mapper */ + MapperInit = Map115_Init; + + /* Write to Mapper */ + MapperWrite = Map115_Write; + + /* Write to SRAM */ + MapperSram = Map115_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map115_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Initialize Registers */ + for( int i = 0; i < 8; i++ ) { + Map115_Reg[i] = 0x00; + } + + Map115_Prg0 = Map115_Prg0L = 0; + Map115_Prg1 = Map115_Prg1L = 1; + Map115_Prg2 = ( NesHeader.byRomSize << 1 ) - 2; + Map115_Prg3 = ( NesHeader.byRomSize << 1 ) - 1; + + Map115_ExPrgSwitch = 0; + Map115_ExChrSwitch = 0; + + /* Set ROM Banks */ + Map115_Set_CPU_Banks(); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) { + Map115_Chr0 = 0; + Map115_Chr1 = 1; + Map115_Chr2 = 2; + Map115_Chr3 = 3; + Map115_Chr4 = 4; + Map115_Chr5 = 5; + Map115_Chr6 = 6; + Map115_Chr7 = 7; + Map115_Set_PPU_Banks(); + } else { + Map115_Chr0 = Map115_Chr2 = Map115_Chr4 = Map115_Chr5 = Map115_Chr6 = Map115_Chr7 = 0; + Map115_Chr1 = Map115_Chr3 = 1; + } + + Map115_IRQ_Enable = 0; /* Disable */ + Map115_IRQ_Counter = 0; + Map115_IRQ_Latch = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 115 Write Function */ +/*-------------------------------------------------------------------*/ +void Map115_Write( WORD wAddr, BYTE byData ) +{ + switch( wAddr & 0xE001 ) { + case 0x8000: + Map115_Reg[0] = byData; + Map115_Set_CPU_Banks(); + Map115_Set_PPU_Banks(); + break; + case 0x8001: + Map115_Reg[1] = byData; + switch( Map115_Reg[0] & 0x07 ) { + case 0x00: + Map115_Chr0 = byData & 0xFE; + Map115_Chr1 = Map115_Chr0+1; + Map115_Set_PPU_Banks(); + break; + case 0x01: + Map115_Chr2 = byData & 0xFE; + Map115_Chr3 = Map115_Chr2+1; + Map115_Set_PPU_Banks(); + break; + case 0x02: + Map115_Chr4 = byData; + Map115_Set_PPU_Banks(); + break; + case 0x03: + Map115_Chr5 = byData; + Map115_Set_PPU_Banks(); + break; + case 0x04: + Map115_Chr6 = byData; + Map115_Set_PPU_Banks(); + break; + case 0x05: + Map115_Chr7 = byData; + Map115_Set_PPU_Banks(); + break; + case 0x06: + Map115_Prg0 = Map115_Prg0L = byData; + Map115_Set_CPU_Banks(); + break; + case 0x07: + Map115_Prg1 = Map115_Prg1L = byData; + Map115_Set_CPU_Banks(); + break; + } + break; + case 0xA000: + Map115_Reg[2] = byData; + if ( !ROM_FourScr ) { + if( byData & 0x01 ) InfoNES_Mirroring( 0 ); + else InfoNES_Mirroring( 1 ); + } + break; + case 0xA001: + Map115_Reg[3] = byData; + break; + case 0xC000: + Map115_Reg[4] = byData; + Map115_IRQ_Counter = byData; + Map115_IRQ_Enable = 0xFF; + break; + case 0xC001: + Map115_Reg[5] = byData; + Map115_IRQ_Latch = byData; + break; + case 0xE000: + Map115_Reg[6] = byData; + Map115_IRQ_Enable = 0; + break; + case 0xE001: + Map115_Reg[7] = byData; + Map115_IRQ_Enable = 0xFF; + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 115 Write to SRAM Function */ +/*-------------------------------------------------------------------*/ +void Map115_Sram( WORD wAddr, BYTE byData ) +{ + switch ( wAddr ) { + case 0x6000: + Map115_ExPrgSwitch = byData; + Map115_Set_CPU_Banks(); + break; + case 0x6001: + Map115_ExChrSwitch = byData&0x1; + Map115_Set_PPU_Banks(); + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 115 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map115_HSync() +{ + if( ( /* PPU_Scanline >= 0 && */ PPU_Scanline <= 239) ) { + if( PPU_R1 & R1_SHOW_SCR || PPU_R1 & R1_SHOW_SP ) { + if( Map115_IRQ_Enable ) { + if( !(Map115_IRQ_Counter--) ) { + Map115_IRQ_Counter = Map115_IRQ_Latch; + IRQ_REQ; + } + } + } + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 115 Set CPU Banks Function */ +/*-------------------------------------------------------------------*/ +void Map115_Set_CPU_Banks() +{ + if( Map115_ExPrgSwitch & 0x80 ) { + Map115_Prg0 = ((Map115_ExPrgSwitch<<1)&0x1e); + Map115_Prg1 = Map115_Prg0+1; + + ROMBANK0 = ROMPAGE( Map115_Prg0 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE( Map115_Prg1 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMPAGE( ( Map115_Prg0+2 ) % ( NesHeader.byRomSize << 1 ) ); + ROMBANK3 = ROMPAGE( ( Map115_Prg1+2 ) % ( NesHeader.byRomSize << 1 ) ); + } else { + Map115_Prg0 = Map115_Prg0L; + Map115_Prg1 = Map115_Prg1L; + if( Map115_Reg[0] & 0x40 ) { + ROMBANK0 = ROMPAGE( ( NesHeader.byRomSize << 1 ) - 2 ); + ROMBANK1 = ROMPAGE( Map115_Prg1 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMPAGE( Map115_Prg0 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK3 = ROMPAGE( ( NesHeader.byRomSize << 1 ) - 1 ); + } else { + ROMBANK0 = ROMPAGE( Map115_Prg0 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK1 = ROMPAGE( Map115_Prg1 % ( NesHeader.byRomSize << 1 ) ); + ROMBANK2 = ROMPAGE( ( NesHeader.byRomSize << 1 ) - 2 ); + ROMBANK3 = ROMPAGE( ( NesHeader.byRomSize << 1 ) - 1 ); + } + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 115 Set PPU Banks Function */ +/*-------------------------------------------------------------------*/ +void Map115_Set_PPU_Banks() +{ + if ( NesHeader.byVRomSize > 0 ) { + if( Map115_Reg[0] & 0x80 ) { + PPUBANK[ 0 ] = VROMPAGE( ((Map115_ExChrSwitch<<8)+Map115_Chr4) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 1 ] = VROMPAGE( ((Map115_ExChrSwitch<<8)+Map115_Chr5) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 2 ] = VROMPAGE( ((Map115_ExChrSwitch<<8)+Map115_Chr6) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 3 ] = VROMPAGE( ((Map115_ExChrSwitch<<8)+Map115_Chr7) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 4 ] = VROMPAGE( ((Map115_ExChrSwitch<<8)+Map115_Chr0) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 5 ] = VROMPAGE( ((Map115_ExChrSwitch<<8)+Map115_Chr1) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 6 ] = VROMPAGE( ((Map115_ExChrSwitch<<8)+Map115_Chr2) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 7 ] = VROMPAGE( ((Map115_ExChrSwitch<<8)+Map115_Chr3) % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + } else { + PPUBANK[ 0 ] = VROMPAGE( ((Map115_ExChrSwitch<<8)+Map115_Chr0) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 1 ] = VROMPAGE( ((Map115_ExChrSwitch<<8)+Map115_Chr1) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 2 ] = VROMPAGE( ((Map115_ExChrSwitch<<8)+Map115_Chr2) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 3 ] = VROMPAGE( ((Map115_ExChrSwitch<<8)+Map115_Chr3) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 4 ] = VROMPAGE( ((Map115_ExChrSwitch<<8)+Map115_Chr4) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 5 ] = VROMPAGE( ((Map115_ExChrSwitch<<8)+Map115_Chr5) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 6 ] = VROMPAGE( ((Map115_ExChrSwitch<<8)+Map115_Chr6) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 7 ] = VROMPAGE( ((Map115_ExChrSwitch<<8)+Map115_Chr7) % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + } + } +} + Index: apps/plugins/infones/mapper/InfoNES_Mapper_034.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_034.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_034.c (revision 0) @@ -0,0 +1,118 @@ +/*===================================================================*/ +/* */ +/* Mapper 34 (Nina-1) */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 34 */ +/*-------------------------------------------------------------------*/ +void Map34_Init() +{ + int nPage; + /* Initialize Mapper */ + MapperInit = Map34_Init; + + /* Write to Mapper */ + MapperWrite = Map34_Write; + + /* Write to SRAM */ + MapperSram = Map34_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 34 Write Function */ +/*-------------------------------------------------------------------*/ +void Map34_Write( WORD wAddr, BYTE byData ) +{ + /* Set ROM Banks */ + byData <<= 2; + byData %= ( NesHeader.byRomSize << 1); + + ROMBANK0 = ROMPAGE( byData ); + ROMBANK1 = ROMPAGE( byData + 1 ); + ROMBANK2 = ROMPAGE( byData + 2 ); + ROMBANK3 = ROMPAGE( byData + 3 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 34 Write to SRAM Function */ +/*-------------------------------------------------------------------*/ +void Map34_Sram( WORD wAddr, BYTE byData ) +{ + switch(wAddr) + { + /* Set ROM Banks */ + case 0x7ffd: + byData <<= 2; + byData %= ( NesHeader.byRomSize << 1 ); + + ROMBANK0 = ROMPAGE( byData ); + ROMBANK1 = ROMPAGE( byData + 1 ); + ROMBANK2 = ROMPAGE( byData + 2 ); + ROMBANK3 = ROMPAGE( byData + 3 ); + break; + + /* Set PPU Banks */ + case 0x7ffe: + byData <<= 2; + byData %= ( NesHeader.byVRomSize << 3 ); + + PPUBANK[ 0 ] = VROMPAGE( byData ); + PPUBANK[ 1 ] = VROMPAGE( byData + 1 ); + PPUBANK[ 2 ] = VROMPAGE( byData + 2 ); + PPUBANK[ 3 ] = VROMPAGE( byData + 3 ); + InfoNES_SetupChr(); + break; + + /* Set PPU Banks */ + case 0x7fff: + byData <<= 2; + byData %= ( NesHeader.byVRomSize << 3 ); + + PPUBANK[ 4 ] = VROMPAGE( byData ); + PPUBANK[ 5 ] = VROMPAGE( byData + 1 ); + PPUBANK[ 6 ] = VROMPAGE( byData + 2 ); + PPUBANK[ 7 ] = VROMPAGE( byData + 3 ); + InfoNES_SetupChr(); + break; + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_017.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_017.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_017.c (revision 0) @@ -0,0 +1,195 @@ +/*===================================================================*/ +/* */ +/* Mapper 17 (FFE F8 Series) */ +/* */ +/*===================================================================*/ + +BYTE Map17_IRQ_Enable; +DWORD Map17_IRQ_Cnt; +DWORD Map17_IRQ_Latch; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 17 */ +/*-------------------------------------------------------------------*/ +void Map17_Init() +{ + int nPage; + /* Initialize Mapper */ + MapperInit = Map17_Init; + + /* Write to Mapper */ + MapperWrite = Map0_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map17_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map17_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Initialize State Registers */ + Map17_IRQ_Enable = 0; + Map17_IRQ_Cnt = 0; + Map17_IRQ_Latch = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 17 Write to APU Function */ +/*-------------------------------------------------------------------*/ +void Map17_Apu( WORD wAddr, BYTE byData ) +{ + switch ( wAddr ) + { + case 0x42fe: + if ( ( byData & 0x10 ) == 0 ) + { + InfoNES_Mirroring( 3 ); + } else { + InfoNES_Mirroring( 2 ); + } + break; + + case 0x42ff: + if ( ( byData & 0x10 ) == 0 ) + { + InfoNES_Mirroring( 1 ); + } else { + InfoNES_Mirroring( 0 ); + } + break; + + case 0x4501: + Map17_IRQ_Enable = 0; + break; + + case 0x4502: + Map17_IRQ_Latch = ( Map17_IRQ_Latch & 0xff00 ) | byData; + break; + + case 0x4503: + Map17_IRQ_Latch = ( Map17_IRQ_Latch & 0x00ff ) | ( (DWORD)byData << 8 ); + Map17_IRQ_Cnt = Map17_IRQ_Latch; + Map17_IRQ_Enable = 1; + break; + + case 0x4504: + byData %= ( NesHeader.byRomSize << 1 ); + ROMBANK0 = ROMPAGE( byData ); + break; + + case 0x4505: + byData %= ( NesHeader.byRomSize << 1 ); + ROMBANK1 = ROMPAGE( byData ); + break; + + case 0x4506: + byData %= ( NesHeader.byRomSize << 1 ); + ROMBANK2 = ROMPAGE( byData ); + break; + + case 0x4507: + byData %= ( NesHeader.byRomSize << 1 ); + ROMBANK3 = ROMPAGE( byData ); + break; + + case 0x4510: + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 0 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0x4511: + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 1 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0x4512: + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 2 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0x4513: + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 3 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0x4514: + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 4 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0x4515: + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 5 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0x4516: + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 6 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + + case 0x4517: + byData %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 7 ] = VROMPAGE( byData ); + InfoNES_SetupChr(); + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 17 H-Sync Function */ +/*-------------------------------------------------------------------*/ +void Map17_HSync() +{ + if ( Map17_IRQ_Enable ) + { + if ( Map17_IRQ_Cnt >= 0xffff - 113 ) + { + IRQ_REQ; + Map17_IRQ_Cnt = 0; + Map17_IRQ_Enable = 0; + } else { + Map17_IRQ_Cnt += 113; + } + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_251.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_251.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_251.c (revision 0) @@ -0,0 +1,155 @@ +/*===================================================================*/ +/* */ +/* Mapper 251 */ +/* */ +/*===================================================================*/ + +BYTE Map251_Reg[11]; +BYTE Map251_Breg[4]; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 251 */ +/*-------------------------------------------------------------------*/ +void Map251_Init() +{ + /* Initialize Mapper */ + MapperInit = Map251_Init; + + /* Write to Mapper */ + MapperWrite = Map251_Write; + + /* Write to SRAM */ + MapperSram = Map251_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set Registers */ + InfoNES_Mirroring( 1 ); + + int i; + for( i = 0; i < 11; i++ ) + Map251_Reg[i] = 0; + for( i = 0; i < 4; i++ ) + Map251_Breg[i] = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 251 Write Function */ +/*-------------------------------------------------------------------*/ +void Map251_Write( WORD wAddr, BYTE byData ) +{ + switch( wAddr & 0xE001 ) { + case 0x8000: + Map251_Reg[8] = byData; + Map251_Set_Banks(); + break; + case 0x8001: + Map251_Reg[Map251_Reg[8]&0x07] = byData; + Map251_Set_Banks(); + break; + case 0xA001: + if( byData & 0x80 ) { + Map251_Reg[ 9] = 1; + Map251_Reg[10] = 0; + } else { + Map251_Reg[ 9] = 0; + } + break; + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 251 Write to SRAM Function */ +/*-------------------------------------------------------------------*/ +void Map251_Sram( WORD wAddr, BYTE byData ) +{ + if( (wAddr & 0xE001) == 0x6000 ) { + if( Map251_Reg[9] ) { + Map251_Breg[Map251_Reg[10]++] = byData; + if( Map251_Reg[10] == 4 ) { + Map251_Reg[10] = 0; + Map251_Set_Banks(); + } + } + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 251 Set Banks Function */ +/*-------------------------------------------------------------------*/ +void Map251_Set_Banks() +{ + int nChr[6]; + int nPrg[4]; + + for( int i = 0; i < 6; i++ ) { + nChr[i] = (Map251_Reg[i]|(Map251_Breg[1]<<4)) & ((Map251_Breg[2]<<4)|0x0F); + } + + if( Map251_Reg[8] & 0x80 ) { + PPUBANK[ 0 ] = VROMPAGE(nChr[2] % (NesHeader.byVRomSize<<3)); + PPUBANK[ 1 ] = VROMPAGE(nChr[3] % (NesHeader.byVRomSize<<3)); + PPUBANK[ 2 ] = VROMPAGE(nChr[4] % (NesHeader.byVRomSize<<3)); + PPUBANK[ 3 ] = VROMPAGE(nChr[5] % (NesHeader.byVRomSize<<3)); + PPUBANK[ 4 ] = VROMPAGE(nChr[0] % (NesHeader.byVRomSize<<3)); + PPUBANK[ 5 ] = VROMPAGE((nChr[0]+1) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 6 ] = VROMPAGE(nChr[1] % (NesHeader.byVRomSize<<3)); + PPUBANK[ 7 ] = VROMPAGE((nChr[1]+1) % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + } else { + PPUBANK[ 0 ] = VROMPAGE(nChr[0] % (NesHeader.byVRomSize<<3)); + PPUBANK[ 1 ] = VROMPAGE((nChr[0]+1) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 2 ] = VROMPAGE(nChr[1] % (NesHeader.byVRomSize<<3)); + PPUBANK[ 3 ] = VROMPAGE((nChr[1]+1) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 4 ] = VROMPAGE(nChr[2] % (NesHeader.byVRomSize<<3)); + PPUBANK[ 5 ] = VROMPAGE(nChr[3] % (NesHeader.byVRomSize<<3)); + PPUBANK[ 6 ] = VROMPAGE(nChr[4] % (NesHeader.byVRomSize<<3)); + PPUBANK[ 7 ] = VROMPAGE(nChr[5] % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); + } + + nPrg[0] = (Map251_Reg[6]&((Map251_Breg[3]&0x3F)^0x3F))|(Map251_Breg[1]); + nPrg[1] = (Map251_Reg[7]&((Map251_Breg[3]&0x3F)^0x3F))|(Map251_Breg[1]); + nPrg[2] = nPrg[3] =((Map251_Breg[3]&0x3F)^0x3F)|(Map251_Breg[1]); + nPrg[2] &= (NesHeader.byRomSize<<1)-1; + + if( Map251_Reg[8] & 0x40 ) { + ROMBANK0 = ROMPAGE(nPrg[2] % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE(nPrg[1] % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE(nPrg[0] % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE(nPrg[3] % (NesHeader.byRomSize<<1)); + } else { + ROMBANK0 = ROMPAGE(nPrg[0] % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE(nPrg[1] % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE(nPrg[2] % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE(nPrg[3] % (NesHeader.byRomSize<<1)); + } +} Index: apps/plugins/infones/mapper/InfoNES_Mapper_234.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_234.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_234.c (revision 0) @@ -0,0 +1,114 @@ +/*===================================================================*/ +/* */ +/* Mapper 234 : Maxi-15 */ +/* */ +/*===================================================================*/ + +BYTE Map234_Reg[2]; + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 234 */ +/*-------------------------------------------------------------------*/ +void Map234_Init() +{ + /* Initialize Mapper */ + MapperInit = Map234_Init; + + /* Write to Mapper */ + MapperWrite = Map234_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMPAGE( 2 ); + ROMBANK3 = ROMPAGE( 3 ); + + /* Set Registers */ + Map234_Reg[0] = 0; + Map234_Reg[1] = 0; + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 234 Write Function */ +/*-------------------------------------------------------------------*/ +void Map234_Write( WORD wAddr, BYTE byData ) +{ + if( wAddr >= 0xFF80 && wAddr <= 0xFF9F ) { + if( !Map234_Reg[0] ) { + Map234_Reg[0] = byData; + Map234_Set_Banks(); + } + } + + if( wAddr >= 0xFFE8 && wAddr <= 0xFFF7 ) { + Map234_Reg[1] = byData; + Map234_Set_Banks(); + } +} + +/*-------------------------------------------------------------------*/ +/* Mapper 234 Set Banks Function */ +/*-------------------------------------------------------------------*/ +void Map234_Set_Banks() +{ + BYTE byPrg, byChr; + + if( Map234_Reg[0] & 0x80 ) { + InfoNES_Mirroring( 0 ); + } else { + InfoNES_Mirroring( 1 ); + } + if( Map234_Reg[0] & 0x40 ) { + byPrg = (Map234_Reg[0]&0x0E)|(Map234_Reg[1]&0x01); + byChr = ((Map234_Reg[0]&0x0E)<<2)|((Map234_Reg[1]>>4)&0x07); + } else { + byPrg = Map234_Reg[0]&0x0F; + byChr = ((Map234_Reg[0]&0x0F)<<2)|((Map234_Reg[1]>>4)&0x03); + } + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE(((byPrg<<2)+0) % (NesHeader.byRomSize<<1)); + ROMBANK1 = ROMPAGE(((byPrg<<2)+1) % (NesHeader.byRomSize<<1)); + ROMBANK2 = ROMPAGE(((byPrg<<2)+2) % (NesHeader.byRomSize<<1)); + ROMBANK3 = ROMPAGE(((byPrg<<2)+3) % (NesHeader.byRomSize<<1)); + + /* Set PPU Banks */ + PPUBANK[ 0 ] = VROMPAGE(((byChr<<3)+0) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 1 ] = VROMPAGE(((byChr<<3)+1) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 2 ] = VROMPAGE(((byChr<<3)+2) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 3 ] = VROMPAGE(((byChr<<3)+3) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 4 ] = VROMPAGE(((byChr<<3)+4) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 5 ] = VROMPAGE(((byChr<<3)+5) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 6 ] = VROMPAGE(((byChr<<3)+6) % (NesHeader.byVRomSize<<3)); + PPUBANK[ 7 ] = VROMPAGE(((byChr<<3)+7) % (NesHeader.byVRomSize<<3)); + InfoNES_SetupChr(); +} + + Index: apps/plugins/infones/mapper/InfoNES_Mapper_072.c =================================================================== --- apps/plugins/infones/mapper/InfoNES_Mapper_072.c (revision 0) +++ apps/plugins/infones/mapper/InfoNES_Mapper_072.c (revision 0) @@ -0,0 +1,90 @@ +/*===================================================================*/ +/* */ +/* Mapper 72 (Jaleco Early Mapper #0) */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Initialize Mapper 72 */ +/*-------------------------------------------------------------------*/ +void Map72_Init() +{ + /* Initialize Mapper */ + MapperInit = Map72_Init; + + /* Write to Mapper */ + MapperWrite = Map72_Write; + + /* Write to SRAM */ + MapperSram = Map0_Sram; + + /* Write to APU */ + MapperApu = Map0_Apu; + + /* Read from APU */ + MapperReadApu = Map0_ReadApu; + + /* Callback at VSync */ + MapperVSync = Map0_VSync; + + /* Callback at HSync */ + MapperHSync = Map0_HSync; + + /* Callback at PPU */ + MapperPPU = Map0_PPU; + + /* Callback at Rendering Screen ( 1:BG, 0:Sprite ) */ + MapperRenderScreen = Map0_RenderScreen; + + /* Set SRAM Banks */ + SRAMBANK = SRAM; + + /* Set ROM Banks */ + ROMBANK0 = ROMPAGE( 0 ); + ROMBANK1 = ROMPAGE( 1 ); + ROMBANK2 = ROMLASTPAGE( 1 ); + ROMBANK3 = ROMLASTPAGE( 0 ); + + /* Set PPU Banks */ + if ( NesHeader.byVRomSize > 0 ) + { + for ( int nPage = 0; nPage < 8; ++nPage ) + PPUBANK[ nPage ] = VROMPAGE( nPage ); + InfoNES_SetupChr(); + } + + /* Set up wiring of the interrupt pin */ + K6502_Set_Int_Wiring( 1, 1 ); +} + +/*-------------------------------------------------------------------*/ +/* Mapper 72 Write Function */ +/*-------------------------------------------------------------------*/ +void Map72_Write( WORD wAddr, BYTE byData ) +{ + BYTE byBank = byData & 0x0f; + + if ( byData & 0x80 ) + { + /* Set ROM Banks */ + byBank <<= 1; + byBank %= ( NesHeader.byRomSize << 1 ); + ROMBANK0 = ROMPAGE( byBank ); + ROMBANK1 = ROMPAGE( byBank + 1 ); + } else + if ( byData & 0x40 ) + { + /* Set PPU Banks */ + byBank <<= 3; + byBank %= ( NesHeader.byVRomSize << 3 ); + PPUBANK[ 0 ] = VROMPAGE( byBank ); + PPUBANK[ 1 ] = VROMPAGE( byBank + 1 ); + PPUBANK[ 2 ] = VROMPAGE( byBank + 2 ); + PPUBANK[ 3 ] = VROMPAGE( byBank + 3 ); + PPUBANK[ 4 ] = VROMPAGE( byBank + 4 ); + PPUBANK[ 5 ] = VROMPAGE( byBank + 5 ); + PPUBANK[ 6 ] = VROMPAGE( byBank + 6 ); + PPUBANK[ 7 ] = VROMPAGE( byBank + 7 ); + InfoNES_SetupChr(); + } +} Index: apps/plugins/infones/InfoNES_Mapper.c =================================================================== --- apps/plugins/infones/InfoNES_Mapper.c (revision 0) +++ apps/plugins/infones/InfoNES_Mapper.c (revision 0) @@ -0,0 +1,316 @@ +/*===================================================================*/ +/* */ +/* InfoNES_Mapper.cpp : InfoNES Mapper Function */ +/* */ +/* 2000/05/16 InfoNES Project ( based on NesterJ and pNesX ) */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Include files */ +/*-------------------------------------------------------------------*/ + +#include "InfoNES.h" +#include "InfoNES_System.h" +#include "InfoNES_Mapper.h" +#include "K6502.h" + +/*-------------------------------------------------------------------*/ +/* Mapper resources */ +/*-------------------------------------------------------------------*/ + +/* Disk System RAM */ +BYTE DRAM[ DRAM_SIZE ]; + +/*-------------------------------------------------------------------*/ +/* Table of Mapper initialize function */ +/*-------------------------------------------------------------------*/ + +struct MapperTable_tag MapperTable[] = +{ + { 0, Map0_Init }, + { 1, Map1_Init }, + { 2, Map2_Init }, + { 3, Map3_Init }, + { 4, Map4_Init }, + { 5, Map5_Init }, + { 6, Map6_Init }, + { 7, Map7_Init }, + { 8, Map8_Init }, + { 9, Map9_Init }, + { 10, Map10_Init }, + { 11, Map11_Init }, + { 13, Map13_Init }, + { 15, Map15_Init }, + { 16, Map16_Init }, + { 17, Map17_Init }, + { 18, Map18_Init }, + { 19, Map19_Init }, + { 21, Map21_Init },/* + { 22, Map22_Init }, + { 23, Map23_Init }, + { 24, Map24_Init }, + { 25, Map25_Init }, + { 26, Map26_Init }, + { 32, Map32_Init }, + { 33, Map33_Init }, + { 34, Map34_Init }, + { 40, Map40_Init }, + { 41, Map41_Init }, + { 42, Map42_Init }, + { 43, Map43_Init }, + { 44, Map44_Init }, + { 45, Map45_Init }, + { 46, Map46_Init }, + { 47, Map47_Init }, + { 48, Map48_Init }, + { 49, Map49_Init }, + { 50, Map50_Init }, + { 51, Map51_Init }, + { 57, Map57_Init }, + { 58, Map58_Init }, + { 60, Map60_Init }, + { 61, Map61_Init }, + { 62, Map62_Init }, + { 64, Map64_Init }, + { 65, Map65_Init }, + { 66, Map66_Init }, + { 67, Map67_Init }, + { 68, Map68_Init }, + { 69, Map69_Init }, + { 70, Map70_Init }, + { 71, Map71_Init }, + { 72, Map72_Init }, + { 73, Map73_Init }, + { 74, Map74_Init }, + { 75, Map75_Init }, + { 76, Map76_Init }, + { 77, Map77_Init }, + { 78, Map78_Init }, + { 79, Map79_Init }, + { 80, Map80_Init }, + { 82, Map82_Init }, + { 83, Map83_Init }, + { 85, Map85_Init }, + { 86, Map86_Init }, + { 87, Map87_Init }, + { 88, Map88_Init }, + { 89, Map89_Init }, + { 90, Map90_Init }, + { 91, Map91_Init }, + { 92, Map92_Init }, + { 93, Map93_Init }, + { 94, Map94_Init }, + { 95, Map95_Init }, + { 96, Map96_Init }, + { 97, Map97_Init }, + { 99, Map99_Init }, + { 100, Map100_Init }, + { 101, Map101_Init }, + { 105, Map105_Init }, + { 107, Map107_Init }, + { 108, Map108_Init }, + { 109, Map109_Init }, + { 110, Map110_Init }, + { 112, Map112_Init }, + { 113, Map113_Init }, + { 114, Map114_Init }, + { 115, Map115_Init }, + { 116, Map116_Init }, + { 117, Map117_Init }, + { 118, Map118_Init }, + { 119, Map119_Init }, + { 122, Map122_Init }, + { 133, Map133_Init }, + { 134, Map134_Init }, + { 135, Map135_Init }, + { 140, Map140_Init }, + { 151, Map151_Init }, + { 160, Map160_Init }, + { 180, Map180_Init }, + { 181, Map181_Init }, + { 182, Map182_Init }, + { 183, Map183_Init }, + { 185, Map185_Init }, + { 187, Map187_Init }, + { 188, Map188_Init }, + { 189, Map189_Init }, + { 191, Map191_Init }, + { 193, Map193_Init }, + { 194, Map194_Init }, + { 200, Map200_Init }, + { 201, Map201_Init }, + { 202, Map202_Init }, + { 222, Map222_Init }, + { 225, Map225_Init }, + { 226, Map226_Init }, + { 227, Map227_Init }, + { 228, Map228_Init }, + { 229, Map229_Init }, + { 230, Map230_Init }, + { 231, Map231_Init }, + { 232, Map232_Init }, + { 233, Map233_Init }, + { 234, Map234_Init }, + { 235, Map235_Init }, + { 236, Map236_Init }, + { 240, Map240_Init }, + { 241, Map241_Init }, + { 242, Map242_Init }, + { 243, Map243_Init }, + { 244, Map244_Init }, + { 245, Map245_Init }, + { 246, Map246_Init }, + { 248, Map248_Init }, + { 249, Map249_Init }, + { 251, Map251_Init }, + { 252, Map252_Init }, + { 255, Map255_Init },*/ + { -1, NULL } +}; + +/*-------------------------------------------------------------------*/ +/* body of Mapper functions */ +/*-------------------------------------------------------------------*/ + +#include "mapper/InfoNES_Mapper_000.c" +#include "mapper/InfoNES_Mapper_001.c" +#include "mapper/InfoNES_Mapper_002.c" +#include "mapper/InfoNES_Mapper_003.c" +#include "mapper/InfoNES_Mapper_004.c" +#include "mapper/InfoNES_Mapper_005.c" +#include "mapper/InfoNES_Mapper_006.c" +#include "mapper/InfoNES_Mapper_007.c" +#include "mapper/InfoNES_Mapper_008.c" +#include "mapper/InfoNES_Mapper_009.c" +#include "mapper/InfoNES_Mapper_010.c" +#include "mapper/InfoNES_Mapper_011.c" +#include "mapper/InfoNES_Mapper_013.c" +#include "mapper/InfoNES_Mapper_015.c" +#include "mapper/InfoNES_Mapper_016.c" +#include "mapper/InfoNES_Mapper_017.c" +#include "mapper/InfoNES_Mapper_018.c" +#include "mapper/InfoNES_Mapper_019.c" +#include "mapper/InfoNES_Mapper_021.c" +#include "mapper/InfoNES_Mapper_022.c" +#include "mapper/InfoNES_Mapper_023.c" +#include "mapper/InfoNES_Mapper_024.c" +#include "mapper/InfoNES_Mapper_025.c" +#include "mapper/InfoNES_Mapper_026.c" +#include "mapper/InfoNES_Mapper_032.c" +#include "mapper/InfoNES_Mapper_033.c" +#include "mapper/InfoNES_Mapper_034.c" +#include "mapper/InfoNES_Mapper_040.c" +/* +#include "mapper/InfoNES_Mapper_041.c" +#include "mapper/InfoNES_Mapper_042.c" +#include "mapper/InfoNES_Mapper_043.c" +#include "mapper/InfoNES_Mapper_044.c" +#include "mapper/InfoNES_Mapper_045.c" +#include "mapper/InfoNES_Mapper_046.c" +#include "mapper/InfoNES_Mapper_047.c" +#include "mapper/InfoNES_Mapper_048.c" +#include "mapper/InfoNES_Mapper_049.c" +#include "mapper/InfoNES_Mapper_050.c" +#include "mapper/InfoNES_Mapper_051.c" +#include "mapper/InfoNES_Mapper_057.c" +#include "mapper/InfoNES_Mapper_058.c" +#include "mapper/InfoNES_Mapper_060.c" +#include "mapper/InfoNES_Mapper_061.c" +#include "mapper/InfoNES_Mapper_062.c" +#include "mapper/InfoNES_Mapper_064.c" +#include "mapper/InfoNES_Mapper_065.c" +#include "mapper/InfoNES_Mapper_066.c" +#include "mapper/InfoNES_Mapper_067.c" +#include "mapper/InfoNES_Mapper_068.c" +#include "mapper/InfoNES_Mapper_069.c" +#include "mapper/InfoNES_Mapper_070.c" +#include "mapper/InfoNES_Mapper_071.c" +#include "mapper/InfoNES_Mapper_072.c" +#include "mapper/InfoNES_Mapper_073.c" +#include "mapper/InfoNES_Mapper_074.c" +#include "mapper/InfoNES_Mapper_075.c" +#include "mapper/InfoNES_Mapper_076.c" +#include "mapper/InfoNES_Mapper_077.c" +#include "mapper/InfoNES_Mapper_078.c" +#include "mapper/InfoNES_Mapper_079.c" +#include "mapper/InfoNES_Mapper_080.c" +#include "mapper/InfoNES_Mapper_082.c" +#include "mapper/InfoNES_Mapper_083.c" +#include "mapper/InfoNES_Mapper_085.c" +#include "mapper/InfoNES_Mapper_086.c" +#include "mapper/InfoNES_Mapper_087.c" +#include "mapper/InfoNES_Mapper_088.c" +#include "mapper/InfoNES_Mapper_089.c" +#include "mapper/InfoNES_Mapper_090.c" +#include "mapper/InfoNES_Mapper_091.c" +#include "mapper/InfoNES_Mapper_092.c" +#include "mapper/InfoNES_Mapper_093.c" +#include "mapper/InfoNES_Mapper_094.c" +#include "mapper/InfoNES_Mapper_095.c" +#include "mapper/InfoNES_Mapper_096.c" +#include "mapper/InfoNES_Mapper_097.c" +#include "mapper/InfoNES_Mapper_099.c" +#include "mapper/InfoNES_Mapper_100.c" +#include "mapper/InfoNES_Mapper_101.c" +#include "mapper/InfoNES_Mapper_105.c" +#include "mapper/InfoNES_Mapper_107.c" +#include "mapper/InfoNES_Mapper_108.c" +#include "mapper/InfoNES_Mapper_109.c" +#include "mapper/InfoNES_Mapper_110.c" +#include "mapper/InfoNES_Mapper_112.c" +#include "mapper/InfoNES_Mapper_113.c" +#include "mapper/InfoNES_Mapper_114.c" +#include "mapper/InfoNES_Mapper_115.c" +#include "mapper/InfoNES_Mapper_116.c" +#include "mapper/InfoNES_Mapper_117.c" +#include "mapper/InfoNES_Mapper_118.c" +#include "mapper/InfoNES_Mapper_119.c" +#include "mapper/InfoNES_Mapper_122.c" +#include "mapper/InfoNES_Mapper_133.c" +#include "mapper/InfoNES_Mapper_134.c" +#include "mapper/InfoNES_Mapper_135.c" +#include "mapper/InfoNES_Mapper_140.c" +#include "mapper/InfoNES_Mapper_151.c" +#include "mapper/InfoNES_Mapper_160.c" +#include "mapper/InfoNES_Mapper_180.c" +#include "mapper/InfoNES_Mapper_181.c" +#include "mapper/InfoNES_Mapper_182.c" +#include "mapper/InfoNES_Mapper_183.c" +#include "mapper/InfoNES_Mapper_185.c" +#include "mapper/InfoNES_Mapper_187.c" +#include "mapper/InfoNES_Mapper_188.c" +#include "mapper/InfoNES_Mapper_189.c" +#include "mapper/InfoNES_Mapper_191.c" +#include "mapper/InfoNES_Mapper_193.c" +#include "mapper/InfoNES_Mapper_194.c" +#include "mapper/InfoNES_Mapper_200.c" +#include "mapper/InfoNES_Mapper_201.c" +#include "mapper/InfoNES_Mapper_202.c" +#include "mapper/InfoNES_Mapper_222.c" +#include "mapper/InfoNES_Mapper_225.c" +#include "mapper/InfoNES_Mapper_226.c" +#include "mapper/InfoNES_Mapper_227.c" +#include "mapper/InfoNES_Mapper_228.c" +#include "mapper/InfoNES_Mapper_229.c" +#include "mapper/InfoNES_Mapper_230.c" +#include "mapper/InfoNES_Mapper_231.c" +#include "mapper/InfoNES_Mapper_232.c" +#include "mapper/InfoNES_Mapper_233.c" +#include "mapper/InfoNES_Mapper_234.c" +#include "mapper/InfoNES_Mapper_235.c" +#include "mapper/InfoNES_Mapper_236.c" +#include "mapper/InfoNES_Mapper_240.c" +#include "mapper/InfoNES_Mapper_241.c" +#include "mapper/InfoNES_Mapper_242.c" +#include "mapper/InfoNES_Mapper_243.c" +#include "mapper/InfoNES_Mapper_244.c" +#include "mapper/InfoNES_Mapper_245.c" +#include "mapper/InfoNES_Mapper_246.c" +#include "mapper/InfoNES_Mapper_248.c" +#include "mapper/InfoNES_Mapper_249.c" +#include "mapper/InfoNES_Mapper_251.c" +#include "mapper/InfoNES_Mapper_252.c" +#include "mapper/InfoNES_Mapper_255.c" +*/ +/* End of InfoNES_Mapper.cpp */ Index: apps/plugins/infones/InfoNES.h =================================================================== --- apps/plugins/infones/InfoNES.h (revision 0) +++ apps/plugins/infones/InfoNES.h (revision 0) @@ -0,0 +1,323 @@ +/*===================================================================*/ +/* */ +/* InfoNES.h : NES Emulator for Win32, Linux(x86), Linux(PS2) */ +/* */ +/* 2000/05/14 InfoNES Project ( based on pNesX ) */ +/* */ +/*===================================================================*/ + +#ifndef InfoNES_H_INCLUDED +#define InfoNES_H_INCLUDED + +/*-------------------------------------------------------------------*/ +/* Include files */ +/*-------------------------------------------------------------------*/ + +#include "InfoNES_Types.h" + +/*-------------------------------------------------------------------*/ +/* NES resources */ +/*-------------------------------------------------------------------*/ + +#define RAM_SIZE 0x2000 +#define SRAM_SIZE 0x2000 +#define PPURAM_SIZE 0x4000 +#define SPRRAM_SIZE 256 + +/* RAM */ +extern BYTE RAM[ RAM_SIZE ]; + +/* SRAM */ +extern BYTE SRAM[]; + +/* ROM */ +//extern BYTE ROM[0xffff]; +extern BYTE *ROM; +//extern int *ROM; + +/* SRAM BANK ( 8Kb ) */ +extern BYTE *SRAMBANK; + +/* 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[0x8000]; +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_Temp; +extern WORD PPU_Increment; + +extern BYTE PPU_Latch_Flag; +extern BYTE PPU_UpDown_Clip; + +#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 0 +#define SCAN_ON_SCREEN 1 +#define SCAN_BOTTOM_OFF_SCREEN 2 +#define SCAN_UNKNOWN 3 +#define SCAN_VBLANK 4 + +#define SCAN_TOP_OFF_SCREEN_START 0 +#define SCAN_ON_SCREEN_START 8 +#define SCAN_BOTTOM_OFF_SCREEN_START 232 +#define SCAN_UNKNOWN_START 240 +#define SCAN_VBLANK_START 243 +#define SCAN_VBLANK_END 262 + +#define STEP_PER_SCANLINE 113 +#define STEP_PER_FRAME 29828 + +/* Develop Scroll Registers */ +#define InfoNES_SetupScr() \ +{ \ + /* V-Scroll Register */ \ + /* PPU_Scr_V_Byte_Next = ( BYTE )( ( PPU_Addr & 0x03e0 ) >> 5 ); */ \ + /* PPU_Scr_V_Bit_Next = ( BYTE )( ( PPU_Addr & 0x7000 ) >> 12 ); */ \ + /* H-Scroll Register */ \ + /* PPU_Scr_H_Byte_Next = ( BYTE )( PPU_Addr & 0x001f ); */ \ + /* NameTableBank */ \ + PPU_NameTableBank = NAME_TABLE0 + ( ( PPU_Addr & 0x0C00 ) >> 10 ); \ +} + +/* 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 240 + +/* VRAM Write Enable ( 0: Disable, 1: Enable ) */ +extern BYTE byVramWriteEnable; + +/* Frame IRQ ( 0: Disabled, 1: Enabled )*/ +extern BYTE FrameIRQ_Enable; +extern WORD FrameStep; + +/*-------------------------------------------------------------------*/ +/* Display and Others resouces */ +/*-------------------------------------------------------------------*/ + +/* Frame Skip */ +extern WORD FrameSkip; +extern WORD FrameCnt; +extern WORD FrameWait; + +#if 0 +extern WORD DoubleFrame[ 2 ][ NES_DISP_WIDTH * NES_DISP_HEIGHT ]; +extern WORD *WorkFrame; +extern WORD WorkFrameIdx; +#else +extern WORD WorkFrame[ NES_DISP_WIDTH * NES_DISP_HEIGHT ]; +#endif + +extern BYTE ChrBuf[]; + +extern BYTE ChrBufUpdate; + +extern WORD PalTable[]; + +/*-------------------------------------------------------------------*/ +/* APU and Pad resources */ +/*-------------------------------------------------------------------*/ + +extern BYTE APU_Reg[]; +extern int APU_Mute; + +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 ); +/* Write to SRAM */ +extern void (*MapperSram)( WORD wAddr, BYTE byData ); +/* Write to APU */ +extern void (*MapperApu)( WORD wAddr, BYTE byData ); +/* Read from Apu */ +extern BYTE (*MapperReadApu)( WORD wAddr ); +/* Callback at VSync */ +extern void (*MapperVSync)(); +/* Callback at HSync */ +extern void (*MapperHSync)(); +/* Callback at PPU read/write */ +extern void (*MapperPPU)( WORD wAddr ); +/* Callback at Rendering Screen 1:BG, 0:Sprite */ +extern void (*MapperRenderScreen)( BYTE byMode ); + +/*-------------------------------------------------------------------*/ +/* 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 InfoNES */ +void InfoNES_Init(); + +/* Completion treatment */ +void InfoNES_Fin(); + +/* Load a cassette */ +int InfoNES_Load( const char *pszFileName ); + +/* Reset InfoNES */ +int InfoNES_Reset(); + +/* Initialize PPU */ +void InfoNES_SetupPPU(); + +/* Set up a Mirroring of Name Table */ +void InfoNES_Mirroring( int nType ); + +/* The main loop of InfoNES */ +void InfoNES_Main(); + +/* The loop of emulation */ +void InfoNES_Cycle(); + +/* A function in H-Sync */ +int InfoNES_HSync(); + +/* Render a scanline */ +void InfoNES_DrawLine(); + +/* Get a position of scanline hits sprite #0 */ +void InfoNES_GetSprHitY(); + +/* Develop character data */ +void InfoNES_SetupChr(); + +#endif /* !InfoNES_H_INCLUDED */ Index: apps/plugins/infones/K6502.c =================================================================== --- apps/plugins/infones/K6502.c (revision 0) +++ apps/plugins/infones/K6502.c (revision 0) @@ -0,0 +1,1111 @@ +/*===================================================================*/ +/* */ +/* K6502.cpp : 6502 Emulator */ +/* */ +/* 2000/5/10 InfoNES Project ( based on pNesX ) */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Include files */ +/*-------------------------------------------------------------------*/ + +#include "K6502.h" +#include "InfoNES_System.h" + +/*-------------------------------------------------------------------*/ +/* Operation Macros */ +/*-------------------------------------------------------------------*/ + +// Clock Op. +#define CLK(a) g_wPassedClocks += (a); + +// Addressing Op. +// Address +// (Indirect,X) +#define AA_IX K6502_ReadZpW( K6502_Read( PC++ ) + X ) +// (Indirect),Y +#define AA_IY K6502_ReadZpW( K6502_Read( PC++ ) ) + Y +// Zero Page +#define AA_ZP K6502_Read( PC++ ) +// Zero Page,X +#define AA_ZPX (BYTE)( K6502_Read( PC++ ) + X ) +// Zero Page,Y +#define AA_ZPY (BYTE)( K6502_Read( PC++ ) + Y ) +// Absolute +#define AA_ABS ( K6502_Read( PC++ ) | (WORD)K6502_Read( PC++ ) << 8 ) +// Absolute2 ( PC-- ) +#define AA_ABS2 ( K6502_Read( PC++ ) | (WORD)K6502_Read( PC ) << 8 ) +// Absolute,X +#define AA_ABSX AA_ABS + X +// Absolute,Y +#define AA_ABSY AA_ABS + Y + +// Data +// (Indirect,X) +#define A_IX K6502_Read( AA_IX ) +// (Indirect),Y +#define A_IY K6502_ReadIY() +// Zero Page +#define A_ZP K6502_ReadZp( AA_ZP ) +// Zero Page,X +#define A_ZPX K6502_ReadZp( AA_ZPX ) +// Zero Page,Y +#define A_ZPY K6502_ReadZp( AA_ZPY ) +// Absolute +#define A_ABS K6502_Read( AA_ABS ) +// Absolute,X +#define A_ABSX K6502_ReadAbsX() +// Absolute,Y +#define A_ABSY K6502_ReadAbsY() +// Immediate +#define A_IMM K6502_Read( PC++ ) + +// Flag Op. +#define SETF(a) F |= (a) +#define RSTF(a) F &= ~(a) +#define TEST(a) RSTF( FLAG_N | FLAG_Z ); SETF( g_byTestTable[ a ] ) + +// Load & Store Op. +#define STA(a) K6502_Write( (a), A ); +#define STX(a) K6502_Write( (a), X ); +#define STY(a) K6502_Write( (a), Y ); +#define LDA(a) A = (a); TEST( A ); +#define LDX(a) X = (a); TEST( X ); +#define LDY(a) Y = (a); TEST( Y ); + +// Stack Op. +#define PUSH(a) K6502_Write( BASE_STACK + SP--, (a) ) +#define PUSHW(a) PUSH( (a) >> 8 ); PUSH( (a) & 0xff ) +#define POP(a) a = K6502_Read( BASE_STACK + ++SP ) +#define POPW(a) POP(a); a |= ( K6502_Read( BASE_STACK + ++SP ) << 8 ) + +// Logical Op. +#define ORA(a) A |= (a); TEST( A ) +#define AND(a) A &= (a); TEST( A ) +#define EOR(a) A ^= (a); TEST( A ) +#define BIT(a) byD0 = (a); RSTF( FLAG_N | FLAG_V | FLAG_Z ); SETF( ( byD0 & ( FLAG_N | FLAG_V ) ) | ( ( byD0 & A ) ? 0 : FLAG_Z ) ); +#define CMP(a) wD0 = (WORD)A - (a); RSTF( FLAG_N | FLAG_Z | FLAG_C ); SETF( g_byTestTable[ wD0 & 0xff ] | ( wD0 < 0x100 ? FLAG_C : 0 ) ); +#define CPX(a) wD0 = (WORD)X - (a); RSTF( FLAG_N | FLAG_Z | FLAG_C ); SETF( g_byTestTable[ wD0 & 0xff ] | ( wD0 < 0x100 ? FLAG_C : 0 ) ); +#define CPY(a) wD0 = (WORD)Y - (a); RSTF( FLAG_N | FLAG_Z | FLAG_C ); SETF( g_byTestTable[ wD0 & 0xff ] | ( wD0 < 0x100 ? FLAG_C : 0 ) ); + +// Math Op. (A D flag isn't being supported.) +#define ADC(a) byD0 = (a); \ + wD0 = A + byD0 + ( F & FLAG_C ); \ + byD1 = (BYTE)wD0; \ + RSTF( FLAG_N | FLAG_V | FLAG_Z | FLAG_C ); \ + SETF( g_byTestTable[ byD1 ] | ( ( ~( A ^ byD0 ) & ( A ^ byD1 ) & 0x80 ) ? FLAG_V : 0 ) | ( wD0 > 0xff ) ); \ + A = byD1; + +#define SBC(a) byD0 = (a); \ + wD0 = A - byD0 - ( ~F & FLAG_C ); \ + byD1 = (BYTE)wD0; \ + RSTF( FLAG_N | FLAG_V | FLAG_Z | FLAG_C ); \ + SETF( g_byTestTable[ byD1 ] | ( ( ( A ^ byD0 ) & ( A ^ byD1 ) & 0x80 ) ? FLAG_V : 0 ) | ( wD0 < 0x100 ) ); \ + A = byD1; + +#define DEC(a) wA0 = a; byD0 = K6502_Read( wA0 ); --byD0; K6502_Write( wA0, byD0 ); TEST( byD0 ) +#define INC(a) wA0 = a; byD0 = K6502_Read( wA0 ); ++byD0; K6502_Write( wA0, byD0 ); TEST( byD0 ) + +// Shift Op. +#define ASLA RSTF( FLAG_N | FLAG_Z | FLAG_C ); SETF( g_ASLTable[ A ].byFlag ); A = g_ASLTable[ A ].byValue +#define ASL(a) RSTF( FLAG_N | FLAG_Z | FLAG_C ); wA0 = a; byD0 = K6502_Read( wA0 ); SETF( g_ASLTable[ byD0 ].byFlag ); K6502_Write( wA0, g_ASLTable[ byD0 ].byValue ) +#define LSRA RSTF( FLAG_N | FLAG_Z | FLAG_C ); SETF( g_LSRTable[ A ].byFlag ); A = g_LSRTable[ A ].byValue +#define LSR(a) RSTF( FLAG_N | FLAG_Z | FLAG_C ); wA0 = a; byD0 = K6502_Read( wA0 ); SETF( g_LSRTable[ byD0 ].byFlag ); K6502_Write( wA0, g_LSRTable[ byD0 ].byValue ) +#define ROLA byD0 = F & FLAG_C; RSTF( FLAG_N | FLAG_Z | FLAG_C ); SETF( g_ROLTable[ byD0 ][ A ].byFlag ); A = g_ROLTable[ byD0 ][ A ].byValue +#define ROL(a) byD1 = F & FLAG_C; RSTF( FLAG_N | FLAG_Z | FLAG_C ); wA0 = a; byD0 = K6502_Read( wA0 ); SETF( g_ROLTable[ byD1 ][ byD0 ].byFlag ); K6502_Write( wA0, g_ROLTable[ byD1 ][ byD0 ].byValue ) +#define RORA byD0 = F & FLAG_C; RSTF( FLAG_N | FLAG_Z | FLAG_C ); SETF( g_RORTable[ byD0 ][ A ].byFlag ); A = g_RORTable[ byD0 ][ A ].byValue +#define ROR(a) byD1 = F & FLAG_C; RSTF( FLAG_N | FLAG_Z | FLAG_C ); wA0 = a; byD0 = K6502_Read( wA0 ); SETF( g_RORTable[ byD1 ][ byD0 ].byFlag ); K6502_Write( wA0, g_RORTable[ byD1 ][ byD0 ].byValue ) + +// Jump Op. +#define JSR wA0 = AA_ABS2; PUSHW( PC ); PC = wA0; +#if 0 +#define BRA(a) if ( a ) { wA0 = PC; PC += (char)K6502_Read( PC ); CLK( 3 + ( ( wA0 & 0x0100 ) != ( PC & 0x0100 ) ) ); ++PC; } else { ++PC; CLK( 2 ); } +#else +#define BRA(a) { \ + if ( a ) \ + { \ + wA0 = PC; \ + byD0 = K6502_Read( PC ); \ + PC += ( ( byD0 & 0x80 ) ? ( 0xFF00 | (WORD)byD0 ) : (WORD)byD0 ); \ + CLK( 3 + ( ( wA0 & 0x0100 ) != ( PC & 0x0100 ) ) ); \ + ++PC; \ + } else { \ + ++PC; \ + CLK( 2 ); \ + } \ +} +#endif +#define JMP(a) PC = a; + +/*-------------------------------------------------------------------*/ +/* Global valiables */ +/*-------------------------------------------------------------------*/ + +// 6502 Register +WORD PC; +BYTE SP; +BYTE F; +BYTE A; +BYTE X; +BYTE Y; + +// The state of the IRQ pin +BYTE IRQ_State; + +// Wiring of the IRQ pin +BYTE IRQ_Wiring; + +// The state of the NMI pin +BYTE NMI_State; + +// Wiring of the NMI pin +BYTE NMI_Wiring; + +// The number of the clocks that it passed +WORD g_wPassedClocks; + +// A table for the test +BYTE g_byTestTable[ 256 ]; + +// Value and Flag Data +struct value_table_tag +{ + BYTE byValue; + BYTE byFlag; +}; + +// A table for ASL +struct value_table_tag g_ASLTable[ 256 ]; + +// A table for LSR +struct value_table_tag g_LSRTable[ 256 ]; + +// A table for ROL +struct value_table_tag g_ROLTable[ 2 ][ 256 ]; + +// A table for ROR +struct value_table_tag g_RORTable[ 2 ][ 256 ]; + +/*===================================================================*/ +/* */ +/* K6502_Init() : Initialize K6502 */ +/* */ +/*===================================================================*/ +void K6502_Init() +{ +/* + * Initialize K6502 + * + * You must call this function only once at first. + */ + + BYTE idx; + BYTE idx2; + + // The establishment of the IRQ pin + NMI_Wiring = NMI_State = 1; + IRQ_Wiring = IRQ_State = 1; + + // Make a table for the test + idx = 0; + do + { + if ( idx == 0 ) + g_byTestTable[ 0 ] = FLAG_Z; + else + if ( idx > 127 ) + g_byTestTable[ idx ] = FLAG_N; + else + g_byTestTable[ idx ] = 0; + + ++idx; + } while ( idx != 0 ); + + // Make a table ASL + idx = 0; + do + { + g_ASLTable[ idx ].byValue = idx << 1; + g_ASLTable[ idx ].byFlag = 0; + + if ( idx > 127 ) + g_ASLTable[ idx ].byFlag = FLAG_C; + + if ( g_ASLTable[ idx ].byValue == 0 ) + g_ASLTable[ idx ].byFlag |= FLAG_Z; + else + if ( g_ASLTable[ idx ].byValue & 0x80 ) + g_ASLTable[ idx ].byFlag |= FLAG_N; + + ++idx; + } while ( idx != 0 ); + + // Make a table LSR + idx = 0; + do + { + g_LSRTable[ idx ].byValue = idx >> 1; + g_LSRTable[ idx ].byFlag = 0; + + if ( idx & 1 ) + g_LSRTable[ idx ].byFlag = FLAG_C; + + if ( g_LSRTable[ idx ].byValue == 0 ) + g_LSRTable[ idx ].byFlag |= FLAG_Z; + + ++idx; + } while ( idx != 0 ); + + // Make a table ROL + for ( idx2 = 0; idx2 < 2; ++idx2 ) + { + idx = 0; + do + { + g_ROLTable[ idx2 ][ idx ].byValue = ( idx << 1 ) | idx2; + g_ROLTable[ idx2 ][ idx ].byFlag = 0; + + if ( idx > 127 ) + g_ROLTable[ idx2 ][ idx ].byFlag = FLAG_C; + + if ( g_ROLTable[ idx2 ][ idx ].byValue == 0 ) + g_ROLTable[ idx2 ][ idx ].byFlag |= FLAG_Z; + else + if ( g_ROLTable[ idx2 ][ idx ].byValue & 0x80 ) + g_ROLTable[ idx2 ][ idx ].byFlag |= FLAG_N; + + ++idx; + } while ( idx != 0 ); + } + + // Make a table ROR + for ( idx2 = 0; idx2 < 2; ++idx2 ) + { + idx = 0; + do + { + g_RORTable[ idx2 ][ idx ].byValue = ( idx >> 1 ) | ( idx2 << 7 ); + g_RORTable[ idx2 ][ idx ].byFlag = 0; + + if ( idx & 1 ) + g_RORTable[ idx2 ][ idx ].byFlag = FLAG_C; + + if ( g_RORTable[ idx2 ][ idx ].byValue == 0 ) + g_RORTable[ idx2 ][ idx ].byFlag |= FLAG_Z; + else + if ( g_RORTable[ idx2 ][ idx ].byValue & 0x80 ) + g_RORTable[ idx2 ][ idx ].byFlag |= FLAG_N; + + ++idx; + } while ( idx != 0 ); + } +} + +/*===================================================================*/ +/* */ +/* K6502_Reset() : Reset a CPU */ +/* */ +/*===================================================================*/ +void K6502_Reset() +{ +/* + * Reset a CPU + * + */ + + // Reset Registers + PC = K6502_ReadW( VECTOR_RESET ); + SP = 0xFF; + A = X = Y = 0; + F = FLAG_Z | FLAG_R | FLAG_I; + + // Set up the state of the Interrupt pin. + NMI_State = NMI_Wiring; + IRQ_State = IRQ_Wiring; + + // Reset Passed Clocks + g_wPassedClocks = 0; +} + +/*===================================================================*/ +/* */ +/* K6502_Set_Int_Wiring() : Set up wiring of the interrupt pin */ +/* */ +/*===================================================================*/ +void K6502_Set_Int_Wiring( BYTE byNMI_Wiring, BYTE byIRQ_Wiring ) +{ +/* + * Set up wiring of the interrupt pin + * + */ + + NMI_Wiring = byNMI_Wiring; + IRQ_Wiring = byIRQ_Wiring; +} + +/*===================================================================*/ +/* */ +/* K6502_Step() : */ +/* Only the specified number of the clocks execute Op. */ +/* */ +/*===================================================================*/ +void K6502_Step( WORD wClocks ) +{ +/* + * Only the specified number of the clocks execute Op. + * + * Parameters + * WORD wClocks (Read) + * The number of the clocks + */ + + BYTE byCode; + + WORD wA0; + BYTE byD0; + BYTE byD1; + WORD wD0; + + // Dispose of it if there is an interrupt requirement + if ( NMI_State != NMI_Wiring ) + { + // NMI Interrupt + NMI_State = NMI_Wiring; + CLK( 7 ); + + PUSHW( PC ); + PUSH( F & ~FLAG_B ); + + RSTF( FLAG_D ); + SETF( FLAG_I ); + + PC = K6502_ReadW( VECTOR_NMI ); + } + else + if ( IRQ_State != IRQ_Wiring ) + { + // IRQ Interrupt + // Execute IRQ if an I flag isn't being set + if ( !( F & FLAG_I ) ) + { + IRQ_State = IRQ_Wiring; + CLK( 7 ); + + PUSHW( PC ); + PUSH( F & ~FLAG_B ); + + RSTF( FLAG_D ); + SETF( FLAG_I ); + + PC = K6502_ReadW( VECTOR_IRQ ); + } + } + + // It has a loop until a constant clock passes + while ( g_wPassedClocks < wClocks ) + { + // Read an instruction + byCode = K6502_Read( PC++ ); + + // Execute an instruction. + switch ( byCode ) + { + case 0x00: // BRK + ++PC; PUSHW( PC ); SETF( FLAG_B ); PUSH( F ); SETF( FLAG_I ); RSTF( FLAG_D ); PC = K6502_ReadW( VECTOR_IRQ ); CLK( 7 ); + break; + + case 0x01: // ORA (Zpg,X) + ORA( A_IX ); CLK( 6 ); + break; + + case 0x05: // ORA Zpg + ORA( A_ZP ); CLK( 3 ); + break; + + case 0x06: // ASL Zpg + ASL( AA_ZP ); CLK( 5 ); + break; + + case 0x08: // PHP + SETF( FLAG_B ); PUSH( F ); CLK( 3 ); + break; + + case 0x09: // ORA #Oper + ORA( A_IMM ); CLK( 2 ); + break; + + case 0x0A: // ASL A + ASLA; CLK( 2 ); + break; + + case 0x0D: // ORA Abs + ORA( A_ABS ); CLK( 4 ); + break; + + case 0x0e: // ASL Abs + ASL( AA_ABS ); CLK( 6 ); + break; + + case 0x10: // BPL Oper + BRA( !( F & FLAG_N ) ); + break; + + case 0x11: // ORA (Zpg),Y + ORA( A_IY ); CLK( 5 ); + break; + + case 0x15: // ORA Zpg,X + ORA( A_ZPX ); CLK( 4 ); + break; + + case 0x16: // ASL Zpg,X + ASL( AA_ZPX ); CLK( 6 ); + break; + + case 0x18: // CLC + RSTF( FLAG_C ); CLK( 2 ); + break; + + case 0x19: // ORA Abs,Y + ORA( A_ABSY ); CLK( 4 ); + break; + + case 0x1D: // ORA Abs,X + ORA( A_ABSX ); CLK( 4 ); + break; + + case 0x1E: // ASL Abs,X + ASL( AA_ABSX ); CLK( 7 ); + break; + + case 0x20: // JSR Abs + JSR; CLK( 6 ); + break; + + case 0x21: // AND (Zpg,X) + AND( A_IX ); CLK( 6 ); + break; + + case 0x24: // BIT Zpg + BIT( A_ZP ); CLK( 3 ); + break; + + case 0x25: // AND Zpg + AND( A_ZP ); CLK( 3 ); + break; + + case 0x26: // ROL Zpg + ROL( AA_ZP ); CLK( 5 ); + break; + + case 0x28: // PLP + POP( F ); SETF( FLAG_R ); CLK( 4 ); + break; + + case 0x29: // AND #Oper + AND( A_IMM ); CLK( 2 ); + break; + + case 0x2A: // ROL A + ROLA; CLK( 2 ); + break; + + case 0x2C: // BIT Abs + BIT( A_ABS ); CLK( 4 ); + break; + + case 0x2D: // AND Abs + AND( A_ABS ); CLK( 4 ); + break; + + case 0x2E: // ROL Abs + ROL( AA_ABS ); CLK( 6 ); + break; + + case 0x30: // BMI Oper + BRA( F & FLAG_N ); + break; + + case 0x31: // AND (Zpg),Y + AND( A_IY ); CLK( 5 ); + break; + + case 0x35: // AND Zpg,X + AND( A_ZPX ); CLK( 4 ); + break; + + case 0x36: // ROL Zpg,X + ROL( AA_ZPX ); CLK( 6 ); + break; + + case 0x38: // SEC + SETF( FLAG_C ); CLK( 2 ); + break; + + case 0x39: // AND Abs,Y + AND( A_ABSY ); CLK( 4 ); + break; + + case 0x3D: // AND Abs,X + AND( A_ABSX ); CLK( 4 ); + break; + + case 0x3E: // ROL Abs,X + ROL( AA_ABSX ); CLK( 7 ); + break; + + case 0x40: // RTI + POP( F ); SETF( FLAG_R ); POPW( PC ); CLK( 6 ); + break; + + case 0x41: // EOR (Zpg,X) + EOR( A_IX ); CLK( 6 ); + break; + + case 0x45: // EOR Zpg + EOR( A_ZP ); CLK( 3 ); + break; + + case 0x46: // LSR Zpg + LSR( AA_ZP ); CLK( 5 ); + break; + + case 0x48: // PHA + PUSH( A ); CLK( 3 ); + break; + + case 0x49: // EOR #Oper + EOR( A_IMM ); CLK( 2 ); + break; + + case 0x4A: // LSR A + LSRA; CLK( 2 ); + break; + + case 0x4C: // JMP Abs + JMP( AA_ABS ); CLK( 3 ); + break; + + case 0x4D: // EOR Abs + EOR( A_ABS ); CLK( 4 ); + break; + + case 0x4E: // LSR Abs + LSR( AA_ABS ); CLK( 6 ); + break; + + case 0x50: // BVC + BRA( !( F & FLAG_V ) ); + break; + + case 0x51: // EOR (Zpg),Y + EOR( A_IY ); CLK( 5 ); + break; + + case 0x55: // EOR Zpg,X + EOR( A_ZPX ); CLK( 4 ); + break; + + case 0x56: // LSR Zpg,X + LSR( AA_ZPX ); CLK( 6 ); + break; + + case 0x58: // CLI + byD0 = F; + RSTF( FLAG_I ); CLK( 2 ); + if ( ( byD0 & FLAG_I ) && IRQ_State != IRQ_Wiring ) + { + IRQ_State = IRQ_Wiring; + CLK( 7 ); + + PUSHW( PC ); + PUSH( F & ~FLAG_B ); + + RSTF( FLAG_D ); + SETF( FLAG_I ); + + PC = K6502_ReadW( VECTOR_IRQ ); + } + break; + + case 0x59: // EOR Abs,Y + EOR( A_ABSY ); CLK( 4 ); + break; + + case 0x5D: // EOR Abs,X + EOR( A_ABSX ); CLK( 4 ); + break; + + case 0x5E: // LSR Abs,X + LSR( AA_ABSX ); CLK( 7 ); + break; + + case 0x60: // RTS + POPW( PC ); ++PC; CLK( 6 ); + break; + + case 0x61: // ADC (Zpg,X) + ADC( A_IX ); CLK( 6 ); + break; + + case 0x65: // ADC Zpg + ADC( A_ZP ); CLK( 3 ); + break; + + case 0x66: // ROR Zpg + ROR( AA_ZP ); CLK( 5 ); + break; + + case 0x68: // PLA + POP( A ); TEST( A ); CLK( 4 ); + break; + + case 0x69: // ADC #Oper + ADC( A_IMM ); CLK( 2 ); + break; + + case 0x6A: // ROR A + RORA; CLK( 2 ); + break; + + case 0x6C: // JMP (Abs) + JMP( K6502_ReadW2( AA_ABS ) ); CLK( 5 ); + break; + + case 0x6D: // ADC Abs + ADC( A_ABS ); CLK( 4 ); + break; + + case 0x6E: // ROR Abs + ROR( AA_ABS ); CLK( 6 ); + break; + + case 0x70: // BVS + BRA( F & FLAG_V ); + break; + + case 0x71: // ADC (Zpg),Y + ADC( A_IY ); CLK( 5 ); + break; + + case 0x75: // ADC Zpg,X + ADC( A_ZPX ); CLK( 4 ); + break; + + case 0x76: // ROR Zpg,X + ROR( AA_ZPX ); CLK( 6 ); + break; + + case 0x78: // SEI + SETF( FLAG_I ); CLK( 2 ); + break; + + case 0x79: // ADC Abs,Y + ADC( A_ABSY ); CLK( 4 ); + break; + + case 0x7D: // ADC Abs,X + ADC( A_ABSX ); CLK( 4 ); + break; + + case 0x7E: // ROR Abs,X + ROR( AA_ABSX ); CLK( 7 ); + break; + + case 0x81: // STA (Zpg,X) + STA( AA_IX ); CLK( 6 ); + break; + + case 0x84: // STY Zpg + STY( AA_ZP ); CLK( 3 ); + break; + + case 0x85: // STA Zpg + STA( AA_ZP ); CLK( 3 ); + break; + + case 0x86: // STX Zpg + STX( AA_ZP ); CLK( 3 ); + break; + + case 0x88: // DEY + --Y; TEST( Y ); CLK( 2 ); + break; + + case 0x8A: // TXA + A = X; TEST( A ); CLK( 2 ); + break; + + case 0x8C: // STY Abs + STY( AA_ABS ); CLK( 4 ); + break; + + case 0x8D: // STA Abs + STA( AA_ABS ); CLK( 4 ); + break; + + case 0x8E: // STX Abs + STX( AA_ABS ); CLK( 4 ); + break; + + case 0x90: // BCC + BRA( !( F & FLAG_C ) ); + break; + + case 0x91: // STA (Zpg),Y + STA( AA_IY ); CLK( 6 ); + break; + + case 0x94: // STY Zpg,X + STY( AA_ZPX ); CLK( 4 ); + break; + + case 0x95: // STA Zpg,X + STA( AA_ZPX ); CLK( 4 ); + break; + + case 0x96: // STX Zpg,Y + STX( AA_ZPY ); CLK( 4 ); + break; + + case 0x98: // TYA + A = Y; TEST( A ); CLK( 2 ); + break; + + case 0x99: // STA Abs,Y + STA( AA_ABSY ); CLK( 5 ); + break; + + case 0x9A: // TXS + SP = X; CLK( 2 ); + break; + + case 0x9D: // STA Abs,X + STA( AA_ABSX ); CLK( 5 ); + break; + + case 0xA0: // LDY #Oper + LDY( A_IMM ); CLK( 2 ); + break; + + case 0xA1: // LDA (Zpg,X) + LDA( A_IX ); CLK( 6 ); + break; + + case 0xA2: // LDX #Oper + LDX( A_IMM ); CLK( 2 ); + break; + + case 0xA4: // LDY Zpg + LDY( A_ZP ); CLK( 3 ); + break; + + case 0xA5: // LDA Zpg + LDA( A_ZP ); CLK( 3 ); + break; + + case 0xA6: // LDX Zpg + LDX( A_ZP ); CLK( 3 ); + break; + + case 0xA8: // TAY + Y = A; TEST( A ); CLK( 2 ); + break; + + case 0xA9: // LDA #Oper + LDA( A_IMM ); CLK( 2 ); + break; + + case 0xAA: // TAX + X = A; TEST( A ); CLK( 2 ); + break; + + case 0xAC: // LDY Abs + LDY( A_ABS ); CLK( 4 ); + break; + + case 0xAD: // LDA Abs + LDA( A_ABS ); CLK( 4 ); + break; + + case 0xAE: // LDX Abs + LDX( A_ABS ); CLK( 4 ); + break; + + case 0xB0: // BCS + BRA( F & FLAG_C ); + break; + + case 0xB1: // LDA (Zpg),Y + LDA( A_IY ); CLK( 5 ); + break; + + case 0xB4: // LDY Zpg,X + LDY( A_ZPX ); CLK( 4 ); + break; + + case 0xB5: // LDA Zpg,X + LDA( A_ZPX ); CLK( 4 ); + break; + + case 0xB6: // LDX Zpg,Y + LDX( A_ZPY ); CLK( 4 ); + break; + + case 0xB8: // CLV + RSTF( FLAG_V ); CLK( 2 ); + break; + + case 0xB9: // LDA Abs,Y + LDA( A_ABSY ); CLK( 4 ); + break; + + case 0xBA: // TSX + X = SP; TEST( X ); CLK( 2 ); + break; + + case 0xBC: // LDY Abs,X + LDY( A_ABSX ); CLK( 4 ); + break; + + case 0xBD: // LDA Abs,X + LDA( A_ABSX ); CLK( 4 ); + break; + + case 0xBE: // LDX Abs,Y + LDX( A_ABSY ); CLK( 4 ); + break; + + case 0xC0: // CPY #Oper + CPY( A_IMM ); CLK( 2 ); + break; + + case 0xC1: // CMP (Zpg,X) + CMP( A_IX ); CLK( 6 ); + break; + + case 0xC4: // CPY Zpg + CPY( A_ZP ); CLK( 3 ); + break; + + case 0xC5: // CMP Zpg + CMP( A_ZP ); CLK( 3 ); + break; + + case 0xC6: // DEC Zpg + DEC( AA_ZP ); CLK( 5 ); + break; + + case 0xC8: // INY + ++Y; TEST( Y ); CLK( 2 ); + break; + + case 0xC9: // CMP #Oper + CMP( A_IMM ); CLK( 2 ); + break; + + case 0xCA: // DEX + --X; TEST( X ); CLK( 2 ); + break; + + case 0xCC: // CPY Abs + CPY( A_ABS ); CLK( 4 ); + break; + + case 0xCD: // CMP Abs + CMP( A_ABS ); CLK( 4 ); + break; + + case 0xCE: // DEC Abs + DEC( AA_ABS ); CLK( 6 ); + break; + + case 0xD0: // BNE + BRA( !( F & FLAG_Z ) ); + break; + + case 0xD1: // CMP (Zpg),Y + CMP( A_IY ); CLK( 5 ); + break; + + case 0xD5: // CMP Zpg,X + CMP( A_ZPX ); CLK( 4 ); + break; + + case 0xD6: // DEC Zpg,X + DEC( AA_ZPX ); CLK( 6 ); + break; + + case 0xD8: // CLD + RSTF( FLAG_D ); CLK( 2 ); + break; + + case 0xD9: // CMP Abs,Y + CMP( A_ABSY ); CLK( 4 ); + break; + + case 0xDD: // CMP Abs,X + CMP( A_ABSX ); CLK( 4 ); + break; + + case 0xDE: // DEC Abs,X + DEC( AA_ABSX ); CLK( 7 ); + break; + + case 0xE0: // CPX #Oper + CPX( A_IMM ); CLK( 2 ); + break; + + case 0xE1: // SBC (Zpg,X) + SBC( A_IX ); CLK( 6 ); + break; + + case 0xE4: // CPX Zpg + CPX( A_ZP ); CLK( 3 ); + break; + + case 0xE5: // SBC Zpg + SBC( A_ZP ); CLK( 3 ); + break; + + case 0xE6: // INC Zpg + INC( AA_ZP ); CLK( 5 ); + break; + + case 0xE8: // INX + ++X; TEST( X ); CLK( 2 ); + break; + + case 0xE9: // SBC #Oper + SBC( A_IMM ); CLK( 2 ); + break; + + case 0xEA: // NOP + CLK( 2 ); + break; + + case 0xEC: // CPX Abs + CPX( A_ABS ); CLK( 4 ); + break; + + case 0xED: // SBC Abs + SBC( A_ABS ); CLK( 4 ); + break; + + case 0xEE: // INC Abs + INC( AA_ABS ); CLK( 6 ); + break; + + case 0xF0: // BEQ + BRA( F & FLAG_Z ); + break; + + case 0xF1: // SBC (Zpg),Y + SBC( A_IY ); CLK( 5 ); + break; + + case 0xF5: // SBC Zpg,X + SBC( A_ZPX ); CLK( 4 ); + break; + + case 0xF6: // INC Zpg,X + INC( AA_ZPX ); CLK( 6 ); + break; + + case 0xF8: // SED + SETF( FLAG_D ); CLK( 2 ); + break; + + case 0xF9: // SBC Abs,Y + SBC( A_ABSY ); CLK( 4 ); + break; + + case 0xFD: // SBC Abs,X + SBC( A_ABSX ); CLK( 4 ); + break; + + case 0xFE: // INC Abs,X + INC( AA_ABSX ); CLK( 7 ); + break; + + /*-----------------------------------------------------------*/ + /* Unlisted Instructions ( thanks to virtualnes ) */ + /*-----------------------------------------------------------*/ + + case 0x1A: // NOP (Unofficial) + case 0x3A: // NOP (Unofficial) + case 0x5A: // NOP (Unofficial) + case 0x7A: // NOP (Unofficial) + case 0xDA: // NOP (Unofficial) + case 0xFA: // NOP (Unofficial) + CLK( 2 ); + break; + + case 0x80: // DOP (CYCLES 2) + case 0x82: // DOP (CYCLES 2) + case 0x89: // DOP (CYCLES 2) + case 0xC2: // DOP (CYCLES 2) + case 0xE2: // DOP (CYCLES 2) + PC++; + CLK( 2 ); + break; + + case 0x04: // DOP (CYCLES 3) + case 0x44: // DOP (CYCLES 3) + case 0x64: // DOP (CYCLES 3) + PC++; + CLK( 3 ); + break; + + case 0x14: // DOP (CYCLES 4) + case 0x34: // DOP (CYCLES 4) + case 0x54: // DOP (CYCLES 4) + case 0x74: // DOP (CYCLES 4) + case 0xD4: // DOP (CYCLES 4) + case 0xF4: // DOP (CYCLES 4) + PC++; + CLK( 4 ); + break; + + case 0x0C: // TOP + case 0x1C: // TOP + case 0x3C: // TOP + case 0x5C: // TOP + case 0x7C: // TOP + case 0xDC: // TOP + case 0xFC: // TOP + PC+=2; + CLK( 4 ); + break; + + default: // Unknown Instruction + CLK( 2 ); +#if 0 + InfoNES_MessageBox( "0x%02x is unknown instruction.\n", byCode ) ; +#endif + break; + + } /* end of switch ( byCode ) */ + + } /* end of while ... */ + + // Correct the number of the clocks + g_wPassedClocks -= wClocks; +} + +// Addressing Op. +// Data +// Absolute,X +static inline BYTE K6502_ReadAbsX(){ WORD wA0, wA1; wA0 = AA_ABS; wA1 = wA0 + X; CLK( ( wA0 & 0x0100 ) != ( wA1 & 0x0100 ) ); return K6502_Read( wA1 ); }; +// Absolute,Y +static inline BYTE K6502_ReadAbsY(){ WORD wA0, wA1; wA0 = AA_ABS; wA1 = wA0 + Y; CLK( ( wA0 & 0x0100 ) != ( wA1 & 0x0100 ) ); return K6502_Read( wA1 ); }; +// (Indirect),Y +static inline BYTE K6502_ReadIY(){ WORD wA0, wA1; wA0 = K6502_ReadZpW( K6502_Read( PC++ ) ); wA1 = wA0 + Y; CLK( ( wA0 & 0x0100 ) != ( wA1 & 0x0100 ) ); return K6502_Read( wA1 ); }; + +/*===================================================================*/ +/* */ +/* 6502 Reading/Writing Operation */ +/* */ +/*===================================================================*/ +#include "K6502_rw.h" Index: apps/plugins/infones/InfoNES_System.h =================================================================== --- apps/plugins/infones/InfoNES_System.h (revision 0) +++ apps/plugins/infones/InfoNES_System.h (revision 0) @@ -0,0 +1,69 @@ +/*===================================================================*/ +/* */ +/* InfoNES_System.h : The function which depends on a system */ +/* */ +/* 2000/05/29 InfoNES Project ( based on pNesX ) */ +/* */ +/*===================================================================*/ + +#ifndef InfoNES_SYSTEM_H_INCLUDED +#define InfoNES_SYSTEM_H_INCLUDED + +/*-------------------------------------------------------------------*/ +/* Include files */ +/*-------------------------------------------------------------------*/ + +#include "InfoNES_Types.h" + +/*-------------------------------------------------------------------*/ +/* Palette data */ +/*-------------------------------------------------------------------*/ +extern WORD NesPalette[]; + +/*-------------------------------------------------------------------*/ +/* Function prototypes */ +/*-------------------------------------------------------------------*/ + +/* Menu screen */ +int InfoNES_Menu(); + +/* Read ROM image file */ +int InfoNES_ReadRom( const char *pszFileName ); + +/* Release a memory for ROM */ +void InfoNES_ReleaseRom(); + +/* Transfer the contents of work frame on the screen */ +void InfoNES_LoadFrame(); + +/* Get a joypad state */ +void InfoNES_PadState( DWORD *pdwPad1, DWORD *pdwPad2, DWORD *pdwSystem ); + +/* memcpy */ +void *InfoNES_MemoryCopy( void *dest, const void *src, int count ); + +/* memset */ +void *InfoNES_MemorySet( void *dest, int c, int count ); + +/* Print debug message */ +void InfoNES_DebugPrint( char *pszMsg ); + +/* Wait */ +void InfoNES_Wait(); + +/* Sound Initialize */ +void InfoNES_SoundInit( void ); + +/* Sound Open */ +int InfoNES_SoundOpen( int samples_per_sync, int sample_rate ); + +/* Sound Close */ +void InfoNES_SoundClose( void ); + +/* Sound Output 5 Waves - 2 Pulse, 1 Triangle, 1 Noise, 1 DPCM */ +void InfoNES_SoundOutput(int samples, BYTE *wave1, BYTE *wave2, BYTE *wave3, BYTE *wave4, BYTE *wave5); + +/* Print system message */ +void InfoNES_MessageBox( char *pszMsg, ... ); + +#endif /* !InfoNES_SYSTEM_H_INCLUDED */ Index: apps/plugins/infones/InfoNES_Mapper.h =================================================================== --- apps/plugins/infones/InfoNES_Mapper.h (revision 0) +++ apps/plugins/infones/InfoNES_Mapper.h (revision 0) @@ -0,0 +1,639 @@ +/*===================================================================*/ +/* */ +/* InfoNES_Mapper.h : InfoNES Mapper Function */ +/* */ +/* 2000/05/16 InfoNES Project ( based on NesterJ and pNesX ) */ +/* */ +/*===================================================================*/ + +#ifndef InfoNES_MAPPER_H_INCLUDED +#define InfoNES_MAPPER_H_INCLUDED + +/*-------------------------------------------------------------------*/ +/* Include files */ +/*-------------------------------------------------------------------*/ + +#include "InfoNES_Types.h" + +/*-------------------------------------------------------------------*/ +/* Constants */ +/*-------------------------------------------------------------------*/ + +#define DRAM_SIZE 0xA000 + +/*-------------------------------------------------------------------*/ +/* Mapper resources */ +/*-------------------------------------------------------------------*/ + +/* Disk System RAM */ +extern BYTE DRAM[]; + +/*-------------------------------------------------------------------*/ +/* Macros */ +/*-------------------------------------------------------------------*/ + +/* The address of 8Kbytes unit of the ROM */ +#define ROMPAGE(a) &ROM[ (a) * 0x2000 ] +/* From behind the ROM, the address of 8kbytes unit */ +#define ROMLASTPAGE(a) &ROM[ NesHeader.byRomSize * 0x4000 - ( (a) + 1 ) * 0x2000 ] +/* The address of 1Kbytes unit of the VROM */ +#define VROMPAGE(a) &VROM[ (a) * 0x400 ] +/* The address of 1Kbytes unit of the CRAM */ +#define CRAMPAGE(a) &PPURAM[ 0x0000 + ((a)&0x1F) * 0x400 ] +/* The address of 1Kbytes unit of the VRAM */ +#define VRAMPAGE(a) &PPURAM[ 0x2000 + (a) * 0x400 ] +/* Translate the pointer to ChrBuf into the address of Pattern Table */ +#define PATTBL(a) ( ( (a) - ChrBuf ) >> 2 ) + +/*-------------------------------------------------------------------*/ +/* Macros ( Mapper specific ) */ +/*-------------------------------------------------------------------*/ + +/* The address of 8Kbytes unit of the Map5 ROM */ +#define Map5_ROMPAGE(a) &Map5_Wram[ ( (a) & 0x07 ) * 0x2000 ] +/* The address of 1Kbytes unit of the Map6 Chr RAM */ +#define Map6_VROMPAGE(a) &Map6_Chr_Ram[ (a) * 0x400 ] +/* The address of 1Kbytes unit of the Map19 Chr RAM */ +#define Map19_VROMPAGE(a) &Map19_Chr_Ram[ (a) * 0x400 ] +/* The address of 1Kbytes unit of the Map85 Chr RAM */ +#define Map85_VROMPAGE(a) &Map85_Chr_Ram[ (a) * 0x400 ] + +/*-------------------------------------------------------------------*/ +/* Table of Mapper initialize function */ +/*-------------------------------------------------------------------*/ + +struct MapperTable_tag +{ + int nMapperNo; + void (*pMapperInit)(); +}; + +extern struct MapperTable_tag MapperTable[]; + +/*-------------------------------------------------------------------*/ +/* Function prototypes */ +/*-------------------------------------------------------------------*/ + +void Map0_Init(); +void Map0_Write( WORD wAddr, BYTE byData ); +void Map0_Sram( WORD wAddr, BYTE byData ); +void Map0_Apu( WORD wAddr, BYTE byData ); +BYTE Map0_ReadApu( WORD wAddr ); +void Map0_VSync(); +void Map0_HSync(); +void Map0_PPU( WORD wAddr ); +void Map0_RenderScreen( BYTE byMode ); + +void Map1_Init(); +void Map1_Write( WORD wAddr, BYTE byData ); +void Map1_set_ROM_banks(); + +void Map2_Init(); +void Map2_Write( WORD wAddr, BYTE byData ); + +void Map3_Init(); +void Map3_Write( WORD wAddr, BYTE byData ); + +void Map4_Init(); +void Map4_Write( WORD wAddr, BYTE byData ); +void Map4_HSync(); +void Map4_Set_CPU_Banks(); +void Map4_Set_PPU_Banks(); + +void Map5_Init(); +void Map5_Write( WORD wAddr, BYTE byData ); +void Map5_Apu( WORD wAddr, BYTE byData ); +BYTE Map5_ReadApu( WORD wAddr ); +void Map5_HSync(); +void Map5_RenderScreen( BYTE byMode ); +void Map5_Sync_Prg_Banks( void ); + +void Map6_Init(); +void Map6_Write( WORD wAddr, BYTE byData ); +void Map6_Apu( WORD wAddr, BYTE byData ); +void Map6_HSync(); + +void Map7_Init(); +void Map7_Write( WORD wAddr, BYTE byData ); + +void Map8_Init(); +void Map8_Write( WORD wAddr, BYTE byData ); + +void Map9_Init(); +void Map9_Write( WORD wAddr, BYTE byData ); +void Map9_PPU( WORD wAddr ); + +void Map10_Init(); +void Map10_Write( WORD wAddr, BYTE byData ); +void Map10_PPU( WORD wAddr ); + +void Map11_Init(); +void Map11_Write( WORD wAddr, BYTE byData ); + +void Map13_Init(); +void Map13_Write( WORD wAddr, BYTE byData ); + +void Map15_Init(); +void Map15_Write( WORD wAddr, BYTE byData ); + +void Map16_Init(); +void Map16_Write( WORD wAddr, BYTE byData ); +void Map16_HSync(); + +void Map17_Init(); +void Map17_Apu( WORD wAddr, BYTE byData ); +void Map17_HSync(); + +void Map18_Init(); +void Map18_Write( WORD wAddr, BYTE byData ); +void Map18_HSync(); + +void Map19_Init(); +void Map19_Write( WORD wAddr, BYTE byData ); +void Map19_Apu( WORD wAddr, BYTE byData ); +BYTE Map19_ReadApu( WORD wAddr ); +void Map19_HSync(); + +void Map21_Init(); +void Map21_Write( WORD wAddr, BYTE byData ); +void Map21_HSync(); + +void Map22_Init(); +void Map22_Write( WORD wAddr, BYTE byData ); + +void Map23_Init(); +void Map23_Write( WORD wAddr, BYTE byData ); +void Map23_HSync(); + +void Map24_Init(); +void Map24_Write( WORD wAddr, BYTE byData ); +void Map24_HSync(); + +void Map25_Init(); +void Map25_Write( WORD wAddr, BYTE byData ); +void Map25_Sync_Vrom( int nBank ); +void Map25_HSync(); + +void Map26_Init(); +void Map26_Write( WORD wAddr, BYTE byData ); +void Map26_HSync(); + +void Map32_Init(); +void Map32_Write( WORD wAddr, BYTE byData ); + +void Map33_Init(); +void Map33_Write( WORD wAddr, BYTE byData ); +void Map33_HSync(); + +void Map34_Init(); +void Map34_Write( WORD wAddr, BYTE byData ); +void Map34_Sram( WORD wAddr, BYTE byData ); + +void Map40_Init(); +void Map40_Write( WORD wAddr, BYTE byData ); +void Map40_HSync(); + +void Map41_Init(); +void Map41_Write( WORD wAddr, BYTE byData ); +void Map41_Sram( WORD wAddr, BYTE byData ); + +void Map42_Init(); +void Map42_Write( WORD wAddr, BYTE byData ); +void Map42_HSync(); + +void Map43_Init(); +void Map43_Write( WORD wAddr, BYTE byData ); +void Map43_Apu( WORD wAddr, BYTE byData ); +BYTE Map43_ReadApu( WORD wAddr ); +void Map43_HSync(); + +void Map44_Init(); +void Map44_Write( WORD wAddr, BYTE byData ); +void Map44_HSync(); +void Map44_Set_CPU_Banks(); +void Map44_Set_PPU_Banks(); + +void Map45_Init(); +void Map45_Sram( WORD wAddr, BYTE byData ); +void Map45_Write( WORD wAddr, BYTE byData ); +void Map45_HSync(); +void Map45_Set_CPU_Bank4( BYTE byData ); +void Map45_Set_CPU_Bank5( BYTE byData ); +void Map45_Set_CPU_Bank6( BYTE byData ); +void Map45_Set_CPU_Bank7( BYTE byData ); +void Map45_Set_PPU_Banks(); + +void Map46_Init(); +void Map46_Sram( WORD wAddr, BYTE byData ); +void Map46_Write( WORD wAddr, BYTE byData ); +void Map46_Set_ROM_Banks(); + +void Map47_Init(); +void Map47_Sram( WORD wAddr, BYTE byData ); +void Map47_Write( WORD wAddr, BYTE byData ); +void Map47_HSync(); +void Map47_Set_CPU_Banks(); +void Map47_Set_PPU_Banks(); + +void Map48_Init(); +void Map48_Write( WORD wAddr, BYTE byData ); +void Map48_HSync(); + +void Map49_Init(); +void Map49_Sram( WORD wAddr, BYTE byData ); +void Map49_Write( WORD wAddr, BYTE byData ); +void Map49_HSync(); +void Map49_Set_CPU_Banks(); +void Map49_Set_PPU_Banks(); + +void Map50_Init(); +void Map50_Apu( WORD wAddr, BYTE byData ); +void Map50_HSync(); + +void Map51_Init(); +void Map51_Sram( WORD wAddr, BYTE byData ); +void Map51_Write( WORD wAddr, BYTE byData ); +void Map51_Set_CPU_Banks(); + +void Map57_Init(); +void Map57_Write( WORD wAddr, BYTE byData ); + +void Map58_Init(); +void Map58_Write( WORD wAddr, BYTE byData ); + +void Map60_Init(); +void Map60_Write( WORD wAddr, BYTE byData ); + +void Map61_Init(); +void Map61_Write( WORD wAddr, BYTE byData ); + +void Map62_Init(); +void Map62_Write( WORD wAddr, BYTE byData ); + +void Map64_Init(); +void Map64_Write( WORD wAddr, BYTE byData ); + +void Map65_Init(); +void Map65_Write( WORD wAddr, BYTE byData ); +void Map65_HSync(); + +void Map66_Init(); +void Map66_Write( WORD wAddr, BYTE byData ); + +void Map67_Init(); +void Map67_Write( WORD wAddr, BYTE byData ); +void Map67_HSync(); + +void Map68_Init(); +void Map68_Write( WORD wAddr, BYTE byData ); +void Map68_SyncMirror(); + +void Map69_Init(); +void Map69_Write( WORD wAddr, BYTE byData ); +void Map69_HSync(); + +void Map70_Init(); +void Map70_Write( WORD wAddr, BYTE byData ); + +void Map71_Init(); +void Map71_Write( WORD wAddr, BYTE byData ); + +void Map72_Init(); +void Map72_Write( WORD wAddr, BYTE byData ); + +void Map73_Init(); +void Map73_Write( WORD wAddr, BYTE byData ); +void Map73_HSync(); + +void Map74_Init(); +void Map74_Write( WORD wAddr, BYTE byData ); +void Map74_HSync(); +void Map74_Set_CPU_Banks(); +void Map74_Set_PPU_Banks(); + +void Map75_Init(); +void Map75_Write( WORD wAddr, BYTE byData ); + +void Map76_Init(); +void Map76_Write( WORD wAddr, BYTE byData ); + +void Map77_Init(); +void Map77_Write( WORD wAddr, BYTE byData ); + +void Map78_Init(); +void Map78_Write( WORD wAddr, BYTE byData ); + +void Map79_Init(); +void Map79_Apu( WORD wAddr, BYTE byData ); + +void Map80_Init(); +void Map80_Sram( WORD wAddr, BYTE byData ); + +void Map82_Init(); +void Map82_Sram( WORD wAddr, BYTE byData ); + +void Map83_Init(); +void Map83_Write( WORD wAddr, BYTE byData ); +void Map83_Apu( WORD wAddr, BYTE byData ); +BYTE Map83_ReadApu( WORD wAddr ); +void Map83_HSync(); + +void Map85_Init(); +void Map85_Write( WORD wAddr, BYTE byData ); +void Map85_HSync(); + +void Map86_Init(); +void Map86_Sram( WORD wAddr, BYTE byData ); + +void Map87_Init(); +void Map87_Sram( WORD wAddr, BYTE byData ); + +void Map88_Init(); +void Map88_Write( WORD wAddr, BYTE byData ); + +void Map89_Init(); +void Map89_Write( WORD wAddr, BYTE byData ); + +void Map90_Init(); +void Map90_Write( WORD wAddr, BYTE byData ); +void Map90_Apu( WORD wAddr, BYTE byData ); +BYTE Map90_ReadApu( WORD wAddr ); +void Map90_HSync(); +void Map90_Sync_Mirror( void ); +void Map90_Sync_Prg_Banks( void ); +void Map90_Sync_Chr_Banks( void ); + +void Map91_Init(); +void Map91_Sram( WORD wAddr, BYTE byData ); + +void Map92_Init(); +void Map92_Write( WORD wAddr, BYTE byData ); + +void Map93_Init(); +void Map93_Sram( WORD wAddr, BYTE byData ); + +void Map94_Init(); +void Map94_Write( WORD wAddr, BYTE byData ); + +void Map95_Init(); +void Map95_Write( WORD wAddr, BYTE byData ); +void Map95_Set_CPU_Banks(); +void Map95_Set_PPU_Banks(); + +void Map96_Init(); +void Map96_Write( WORD wAddr, BYTE byData ); +void Map96_PPU( WORD wAddr ); +void Map96_Set_Banks(); + +void Map97_Init(); +void Map97_Write( WORD wAddr, BYTE byData ); + +void Map99_Init(); +void Map99_Apu( WORD wAddr, BYTE byData ); +BYTE Map99_ReadApu( WORD wAddr ); + +void Map100_Init(); +void Map100_Write( WORD wAddr, BYTE byData ); +void Map100_HSync(); +void Map100_Set_CPU_Banks(); +void Map100_Set_PPU_Banks(); + +void Map101_Init(); +void Map101_Write( WORD wAddr, BYTE byData ); + +void Map105_Init(); +void Map105_Write( WORD wAddr, BYTE byData ); +void Map105_HSync(); + +void Map107_Init(); +void Map107_Write( WORD wAddr, BYTE byData ); + +void Map108_Init(); +void Map108_Write( WORD wAddr, BYTE byData ); + +void Map109_Init(); +void Map109_Apu( WORD wAddr, BYTE byData ); +void Map109_Set_PPU_Banks(); + +void Map110_Init(); +void Map110_Apu( WORD wAddr, BYTE byData ); + +void Map112_Init(); +void Map112_Write( WORD wAddr, BYTE byData ); +void Map112_HSync(); +void Map112_Set_CPU_Banks(); +void Map112_Set_PPU_Banks(); + +void Map113_Init(); +void Map113_Apu( WORD wAddr, BYTE byData ); +void Map113_Write( WORD wAddr, BYTE byData ); + +void Map114_Init(); +void Map114_Sram( WORD wAddr, BYTE byData ); +void Map114_Write( WORD wAddr, BYTE byData ); +void Map114_HSync(); +void Map114_Set_CPU_Banks(); +void Map114_Set_PPU_Banks(); + +void Map115_Init(); +void Map115_Sram( WORD wAddr, BYTE byData ); +void Map115_Write( WORD wAddr, BYTE byData ); +void Map115_HSync(); +void Map115_Set_CPU_Banks(); +void Map115_Set_PPU_Banks(); + +void Map116_Init(); +void Map116_Write( WORD wAddr, BYTE byData ); +void Map116_HSync(); +void Map116_Set_CPU_Banks(); +void Map116_Set_PPU_Banks(); + +void Map117_Init(); +void Map117_Write( WORD wAddr, BYTE byData ); +void Map117_HSync(); + +void Map118_Init(); +void Map118_Write( WORD wAddr, BYTE byData ); +void Map118_HSync(); +void Map118_Set_CPU_Banks(); +void Map118_Set_PPU_Banks(); + +void Map119_Init(); +void Map119_Write( WORD wAddr, BYTE byData ); +void Map119_HSync(); +void Map119_Set_CPU_Banks(); +void Map119_Set_PPU_Banks(); + +void Map122_Init(); +void Map122_Sram( WORD wAddr, BYTE byData ); + +void Map133_Init(); +void Map133_Apu( WORD wAddr, BYTE byData ); + +void Map134_Init(); +void Map134_Apu( WORD wAddr, BYTE byData ); + +void Map135_Init(); +void Map135_Apu( WORD wAddr, BYTE byData ); +void Map135_Set_PPU_Banks(); + +void Map140_Init(); +void Map140_Sram( WORD wAddr, BYTE byData ); +void Map140_Apu( WORD wAddr, BYTE byData ); + +void Map151_Init(); +void Map151_Write( WORD wAddr, BYTE byData ); + +void Map160_Init(); +void Map160_Write( WORD wAddr, BYTE byData ); +void Map160_HSync(); + +void Map180_Init(); +void Map180_Write( WORD wAddr, BYTE byData ); + +void Map181_Init(); +void Map181_Apu( WORD wAddr, BYTE byData ); + +void Map182_Init(); +void Map182_Write( WORD wAddr, BYTE byData ); +void Map182_HSync(); + +void Map183_Init(); +void Map183_Write( WORD wAddr, BYTE byData ); +void Map183_HSync(); + +void Map185_Init(); +void Map185_Write( WORD wAddr, BYTE byData ); + +void Map187_Init(); +void Map187_Write( WORD wAddr, BYTE byData ); +void Map187_Apu( WORD wAddr, BYTE byData ); +BYTE Map187_ReadApu( WORD wAddr ); +void Map187_HSync(); +void Map187_Set_CPU_Banks(); +void Map187_Set_PPU_Banks(); + +void Map188_Init(); +void Map188_Write( WORD wAddr, BYTE byData ); + +void Map189_Init(); +void Map189_Apu( WORD wAddr, BYTE byData ); +void Map189_Write( WORD wAddr, BYTE byData ); +void Map189_HSync(); + +void Map191_Init(); +void Map191_Apu( WORD wAddr, BYTE byData ); +void Map191_Set_CPU_Banks(); +void Map191_Set_PPU_Banks(); + +void Map193_Init(); +void Map193_Sram( WORD wAddr, BYTE byData ); + +void Map194_Init(); +void Map194_Write( WORD wAddr, BYTE byData ); + +void Map200_Init(); +void Map200_Write( WORD wAddr, BYTE byData ); + +void Map201_Init(); +void Map201_Write( WORD wAddr, BYTE byData ); + +void Map202_Init(); +void Map202_Apu( WORD wAddr, BYTE byData ); +void Map202_Write( WORD wAddr, BYTE byData ); +void Map202_WriteSub( WORD wAddr, BYTE byData ); + +void Map222_Init(); +void Map222_Write( WORD wAddr, BYTE byData ); + +void Map225_Init(); +void Map225_Write( WORD wAddr, BYTE byData ); + +void Map226_Init(); +void Map226_Write( WORD wAddr, BYTE byData ); + +void Map227_Init(); +void Map227_Write( WORD wAddr, BYTE byData ); + +void Map228_Init(); +void Map228_Write( WORD wAddr, BYTE byData ); + +void Map229_Init(); +void Map229_Write( WORD wAddr, BYTE byData ); + +void Map230_Init(); +void Map230_Write( WORD wAddr, BYTE byData ); + +void Map231_Init(); +void Map231_Write( WORD wAddr, BYTE byData ); + +void Map232_Init(); +void Map232_Write( WORD wAddr, BYTE byData ); + +void Map233_Init(); +void Map233_Write( WORD wAddr, BYTE byData ); + +void Map234_Init(); +void Map234_Write( WORD wAddr, BYTE byData ); +void Map234_Set_Banks(); + +void Map235_Init(); +void Map235_Write( WORD wAddr, BYTE byData ); + +void Map236_Init(); +void Map236_Write( WORD wAddr, BYTE byData ); + +void Map240_Init(); +void Map240_Apu( WORD wAddr, BYTE byData ); + +void Map241_Init(); +void Map241_Write( WORD wAddr, BYTE byData ); + +void Map242_Init(); +void Map242_Write( WORD wAddr, BYTE byData ); + +void Map243_Init(); +void Map243_Apu( WORD wAddr, BYTE byData ); + +void Map244_Init(); +void Map244_Write( WORD wAddr, BYTE byData ); + +void Map245_Init(); +void Map245_Write( WORD wAddr, BYTE byData ); +void Map245_HSync(); +#if 0 +void Map245_Set_CPU_Banks(); +void Map245_Set_PPU_Banks(); +#endif + +void Map246_Init(); +void Map246_Sram( WORD wAddr, BYTE byData ); + +void Map248_Init(); +void Map248_Write( WORD wAddr, BYTE byData ); +void Map248_Apu( WORD wAddr, BYTE byData ); +void Map248_Sram( WORD wAddr, BYTE byData ); +void Map248_HSync(); +void Map248_Set_CPU_Banks(); +void Map248_Set_PPU_Banks(); + +void Map249_Init(); +void Map249_Write( WORD wAddr, BYTE byData ); +void Map249_Apu( WORD wAddr, BYTE byData ); +void Map249_HSync(); + +void Map251_Init(); +void Map251_Write( WORD wAddr, BYTE byData ); +void Map251_Sram( WORD wAddr, BYTE byData ); +void Map251_Set_Banks(); + +void Map252_Init(); +void Map252_Write( WORD wAddr, BYTE byData ); +void Map252_HSync(); + +void Map255_Init(); +void Map255_Write( WORD wAddr, BYTE byData ); +void Map255_Apu( WORD wAddr, BYTE byData ); +BYTE Map255_ReadApu( WORD wAddr ); + +#endif /* !InfoNES_MAPPER_H_INCLUDED */ Index: apps/plugins/infones/K6502.h =================================================================== --- apps/plugins/infones/K6502.h (revision 0) +++ apps/plugins/infones/K6502.h (revision 0) @@ -0,0 +1,83 @@ +/*===================================================================*/ +/* */ +/* K6502.h : Header file for K6502 */ +/* */ +/* 2000/05/29 InfoNES Project ( based on pNesX ) */ +/* */ +/*===================================================================*/ + +#ifndef K6502_H_INCLUDED +#define K6502_H_INCLUDED + +// Type definition +#ifndef InfoNES_TYPES_H_INCLUDED +#ifndef DWORD +typedef unsigned long DWORD; +#endif + +#ifndef WORD +typedef unsigned short WORD; +#endif + +#ifndef BYTE +typedef unsigned char BYTE; +#endif + +#ifndef NULL +#define NULL 0 +#endif +#endif + +/* 6502 Flags */ +#define FLAG_C 0x01 +#define FLAG_Z 0x02 +#define FLAG_I 0x04 +#define FLAG_D 0x08 +#define FLAG_B 0x10 +#define FLAG_R 0x20 +#define FLAG_V 0x40 +#define FLAG_N 0x80 + +/* Stack Address */ +#define BASE_STACK 0x100 + +/* Interrupt Vectors */ +#define VECTOR_NMI 0xfffa +#define VECTOR_RESET 0xfffc +#define VECTOR_IRQ 0xfffe + +// NMI Request +#define NMI_REQ NMI_State = 0; + +// IRQ Request +#define IRQ_REQ IRQ_State = 0; + +// Emulator Operation +void K6502_Init(); +void K6502_Reset(); +void K6502_Set_Int_Wiring( BYTE byNMI_Wiring, BYTE byIRQ_Wiring ); +void K6502_Step( register WORD wClocks ); + +// I/O Operation (User definition) +static inline BYTE K6502_Read( WORD wAddr); +static inline WORD K6502_ReadW( WORD wAddr ); +static inline WORD K6502_ReadW2( WORD wAddr ); +static inline BYTE K6502_ReadZp( BYTE byAddr ); +static inline WORD K6502_ReadZpW( BYTE byAddr ); +static inline BYTE K6502_ReadAbsX(); +static inline BYTE K6502_ReadAbsY(); +static inline BYTE K6502_ReadIY(); + +static inline void K6502_Write( WORD wAddr, BYTE byData ); +static inline void K6502_WriteW( WORD wAddr, WORD wData ); + +// The state of the IRQ pin +extern BYTE IRQ_State; + +// The state of the NMI pin +extern BYTE NMI_State; + +// The number of the clocks that it passed +extern WORD g_wPassedClocks; + +#endif /* !K6502_H_INCLUDED */ Index: apps/plugins/infones/nes_rockbox.h =================================================================== --- apps/plugins/infones/nes_rockbox.h (revision 0) +++ apps/plugins/infones/nes_rockbox.h (revision 0) @@ -0,0 +1,33 @@ +#ifndef _NES_ROCKBOX_H +#define _NES_ROCKBOX_H + +#include + + +#if CONFIG_KEYPAD == IRIVER_H10_PAD + +#define NES_BUTTON_UP BUTTON_SCROLL_UP +#define NES_BUTTON_DOWN BUTTON_SCROLL_DOWN +#define NES_BUTTON_LEFT BUTTON_LEFT +#define NES_BUTTON_RIGHT BUTTON_RIGHT +#define NES_BUTTON_A BUTTON_REW +#define NES_BUTTON_B BUTTON_PLAY +#define NES_BUTTON_SELECT BUTTON_FF +#define NES_BUTTON_START BUTTON_POWER + +#elif CONFIG_KEYPAD == GIGABEAT_PAD + +#define NES_BUTTON_UP BUTTON_UP +#define NES_BUTTON_DOWN BUTTON_DOWN +#define NES_BUTTON_LEFT BUTTON_LEFT +#define NES_BUTTON_RIGHT BUTTON_RIGHT +#define NES_BUTTON_A BUTTON_A +#define NES_BUTTON_B BUTTON_MENU +#define NES_BUTTON_SELECT BUTTON_SELECT +#define NES_BUTTON_START BUTTON_POWER + +#else +#error UNKNOWN KEYPAD +#endif + +#endif Index: apps/plugins/infones/readme.ROCKBOX =================================================================== --- apps/plugins/infones/readme.ROCKBOX (revision 0) +++ apps/plugins/infones/readme.ROCKBOX (revision 0) @@ -0,0 +1 @@ +This is a port of InfoNES to rockbox to play NES games. It is licensed under GPL2. The original can be found at "http://www.geocities.co.jp/SiliconValley/5604/infones/". \ No newline at end of file Index: apps/plugins/infones/doc/readme.html =================================================================== --- apps/plugins/infones/doc/readme.html (revision 0) +++ apps/plugins/infones/doc/readme.html (revision 0) @@ -0,0 +1,56 @@ + + + +InfoNES v0.97J RC1 ƒ\[ƒXƒR[ƒh + + + + +

+InfoNES v0.97J RC1 ƒ\[ƒXƒR[ƒh +

+ +

‚Í‚¶‚ß‚É

+ +@InfoNES v0.97J RC1‚ÍAWindowsALinuxAPocketPC 2002APocketPC2003ALinux ZaurusASDL‚Å“®ì‚·‚éƒtƒ@ƒ~ƒŠ[ƒRƒ“ƒsƒ…[ƒ^(TM)‚̃Gƒ~ƒ…ƒŒ[ƒ^‚Å‚·B + +

”z•zðŒ

+ +@–{ƒvƒƒWƒFƒNƒg‚ÍAƒI[ƒvƒ“ƒ\[ƒXEƒvƒƒWƒFƒNƒg‚Å‚·BGPL2( Gnu Public License version2 )‚ÌŒ³‚ÅAƒ\[ƒXƒR[ƒh‚ÌÄ—˜—p‚â•ÏX‚âAÄ”z•z‚ðs‚È‚¤‚±‚Æ‚ª‰Â”\‚Å‚·BGPL2‚ÉŠÖ‚·‚éÚׂÈî•ñ‚ÍA“¯«‚µ‚½ƒtƒ@ƒCƒ‹‚ðŽQÆ‚­‚¾‚³‚¢B
+ + + +

+–ÆÓ +

+ +@InfoNES‚ÍAƒtƒŠ[ƒEƒFƒA‚Å‚·B‚Ü‚½A‚¢‚©‚È‚é•ÛØ‚à‚ ‚è‚Ü‚¹‚ñB +–{ƒ\ƒtƒgƒEƒFƒA‚É‚æ‚Á‚Ķ‚¶‚½‘¹ŠQ“™‚ÉŠÖ‚µ‚ÄAìŽÒ‚͈êØÓ”C‚𕉂¢‚Ü‚¹‚ñB +InfoNES‚ÉŠÖ‚·‚éî•ñ‚âƒAƒbƒvƒf[ƒg‚ɂ‚¢‚Ä‚ÍA +ŒöŽ®ƒy[ƒW +‚ðŽQÆ‚­‚¾‚³‚¢B +
+@‚æ‚è‚æ‚¢ƒ\ƒtƒgƒEƒFƒA‚ð–ÚŽw‚·‚½‚ß‚ÉAŒä—˜—p‚¢‚½‚¾‚¢‚½ŠF—l‚©‚ç‚Ì +ŒäˆÓŒ©AŒä—v–]AƒoƒO•ñ“™‚ðA‰º‹L‚̘A—æ‚ÅŒä‘Ò‚¿‚µ‚Ä‚¢‚Ü‚·B +
+@‚È‚¨Aƒtƒ@ƒ~ƒŠ[ƒRƒ“ƒsƒ…[ƒ^[(TM)‚ÍA”C“V“°‚Ì“o˜^¤•W‚Å‚·B + +

+˜A—æ +

+ + + +
+ +Copyright (c) 1999-2006 Jay's Factory, All rights reserved.
+ + + Index: apps/plugins/infones/doc/GPL2 =================================================================== --- apps/plugins/infones/doc/GPL2 (revision 0) +++ apps/plugins/infones/doc/GPL2 (revision 0) @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. Index: apps/plugins/infones/doc/GPL2J =================================================================== --- apps/plugins/infones/doc/GPL2J (revision 0) +++ apps/plugins/infones/doc/GPL2J (revision 0) @@ -0,0 +1,424 @@ +@@@@@@@@@@@@@@‚f‚m‚tˆê”ÊŒö—LŽg—p‹–‘ø‘ +@@@@@@@@@@@@@@ + +@@@@@@@@@@@@@@1991 ”N6 ŒŽCƒo[ƒWƒ‡ƒ“2 + +@@@@@@@@Copyright (C) 1989,1991 Free Software Foundation, Inc. +@@@@@@@@@@@675 Mass Ave, Cambridge, MA 02139, USA * + + ---------------------------------------------------------------------- + * y’ˆÓz Œ»ÝA‚±‚̃o[ƒWƒ‡ƒ“2‚Ì”­sŽÒ(FSF)ZŠ‚ÍA³Ž®‚ÉV + ‚µ‚¢ZŠ‚Ì 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA ‚ɕςí‚Á‚Ä‚¢‚éB + ---------------------------------------------------------------------- + +‰½l‚àAˆÈ‰º‚Ì“à—e‚ð•ÏX‚µ‚È‚¢‚Å‚»‚̂܂ܕ¡ŽÊ‚·‚éꇂɌÀ‚èA–{Žg—p‹–‘ø +‘‚ð•¡»‚µ‚½‚è”Еz‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B + +‚Í‚¶‚ß‚É +-------- + +@‚Ù‚Æ‚ñ‚ǂ̃\ƒtƒgƒEƒFƒA‚ÌŽg—p‹–‘ø‚ÍAƒ\ƒtƒgƒEƒFƒA‚ð‹¤—L‚µA•ÏX‚·‚郆[ +ƒU‚ÌŽ©—R‚ð’D‚¤‚±‚Æ‚ðˆÓ}‚µ‚Ä‚¢‚Ü‚·B‚»‚ê‚ɑ΂µ‚ÄA‰äX‚ÌGNUˆê”ÊŒö—LŽg +—p‹–‘ø‚ÍAƒtƒŠ[Eƒ\ƒtƒgƒEƒFƒA‚ð‹¤—L‚µ‚½‚è•ÏX‚·‚鎩—R‚ðƒ†[ƒU‚É•ÛØ‚· +‚邽‚߂̂à‚ÌA‘¦‚¿ƒtƒŠ[Eƒ\ƒtƒgƒEƒFƒA‚ª‚»‚̃†[ƒU‘S‚ĂɂƂÁ‚ătƒŠ[‚Å +‚ ‚邱‚Æ‚ð•ÛØ‚·‚邽‚߂̂à‚̂ł·B–{Žg—p‹–‘ø‚ÍAFree Software +Foundation ‚̂قƂñ‚Ç‘S‚Ẵ\ƒtƒgƒEƒFƒA‚É“K—p‚³‚ê‚邾‚¯‚łȂ­AƒvƒƒO +ƒ‰ƒ€‚Ì쬎҂ª–{Žg—p‹–‘ø‚ÉˆË‚é‚Æ‚µ‚½ê‡‚Ì‚»‚̃vƒƒOƒ‰ƒ€‚É‚à“K—p‚·‚邱 +‚Æ‚ª‚Å‚«‚Ü‚·Bi‚»‚Ì‘¼‚Ì Free Software Foundation ‚̃\ƒtƒgƒEƒFƒA‚Ì‚¢‚­ +‚‚©‚ÍA–{‹–‘ø‘‚ł͂Ȃ­AGNUƒ‰ƒCƒuƒ‰ƒŠˆê”ÊŒö—LŽg—p‹–‘ø‚ŕی삳‚ê‚Ü‚·Bj +‚ ‚È‚½‚ÍŽ©•ª‚̃vƒƒOƒ‰ƒ€‚É‚à‚±‚ê‚ð“K—p‚Å‚«‚Ü‚·B‰äX‚ªƒtƒŠ[Eƒ\ƒtƒgƒEƒF +ƒA‚ɂ‚¢‚ÄŒ¾‚¤ê‡‚ÍŽ©—R‚Ì‚±‚ƂɌ¾‹y‚µ‚Ä‚¢‚é‚̂ł ‚Á‚ÄA‰¿Ši‚Ì‚±‚Æ‚Å‚Í +‚ ‚è‚Ü‚¹‚ñB‰äX‚̈ê”ÊŒö—LŽg—p‹–‘ø‚ÌŠeð€‚ÍAŽŸ‚ÌŽ–•¿‚ðŠmŽÀ‚ÉŽÀŒ»‚·‚é +‚±‚Æ‚ð–Ú“I‚Æ‚µ‚Ä—§ˆÄ‚³‚ê‚Ä‚¢‚Ü‚·B + +@@@E@ƒtƒŠ[Eƒ\ƒtƒgƒEƒFƒA‚Ì•¡»•¨‚ðŽ©—R‚ɔЕz‚Å‚«‚邱‚Æi‚»‚µ‚ÄA +@@@@@–]‚ނȂ炠‚È‚½‚Ì‚±‚̃T[ƒrƒX‚ɑ΂µ‚đΉ¿‚ð¿‹‚Å‚«‚邱‚ÆjB + +@@@E@ƒ\[ƒXEƒR[ƒh‚ðŽÀۂɎ󂯎æ‚é‚©A‚ ‚é‚¢‚ÍAŠó–]‚µ‚³‚¦‚·‚ê‚Î +@@@@@‚»‚ê‚ð“üŽè‚·‚邱‚Æ‚ª‰Â”\‚Å‚ ‚邱‚ÆB + +@@@E@“üŽè‚µ‚½ƒ\ƒtƒgƒEƒFƒA‚ð•ÏX‚µ‚½‚èAV‚µ‚¢ƒtƒŠ[EƒvƒƒOƒ‰ƒ€‚Ì +@@@@@ˆê•”‚Æ‚µ‚ÄŽg—p‚Å‚«‚邱‚ÆB + +@@@E@ˆÈã‚ÌŠe“à—e‚ðs‚È‚¤‚±‚Æ‚ª‚Å‚«‚邯‚¢‚¤‚±‚Æ‚ðƒ†[ƒUŽ©g‚ª’m‚Á +@@@@@‚Ä‚¢‚邱‚ÆB + +@‚±‚̂悤‚ȃ†[ƒU‚ÌŒ —˜‚ðŽç‚邽‚ß‚ÉA‰äX‚ÍA‰½l‚à‚±‚ê‚ç‚ÌŒ —˜‚ð”Û’è +‚µ‚½‚èA‚ ‚é‚¢‚Í•úŠü‚·‚邿‚¤‚Ƀ†[ƒU‚É‹‚߂邱‚Ƃ͂ł«‚È‚¢‚Æ‚¢‚¤§ŒÀð +€‚ðÝ‚¯‚é•K—v‚ª‚ ‚è‚Ü‚·B‚±‚ê‚ç‚̧ŒÀð€‚ÍAƒ†[ƒU‚ªAƒtƒŠ[Eƒ\ƒtƒg +ƒEƒFƒA‚Ì•¡»•¨‚ð”Еz‚µ‚½‚è•ÏX‚µ‚悤‚Æ‚·‚éꇂɂÍA‚»‚̃†[ƒUŽ©g‚ªŽç +‚é‚ׂ«‹`–±‚Æ‚à‚È‚è‚Ü‚·B—Ⴆ‚ÎA‚ ‚È‚½‚ªƒtƒŠ[Eƒ\ƒtƒgƒEƒFƒA‚Ì•¡»•¨‚ð +”Еz‚·‚éê‡A—Lž‚©–³ž‚©‚É‚©‚©‚í‚炸A‚ ‚È‚½‚ÍŽ©•ª‚ÌŽ‚Á‚Ä‚¢‚錠—˜‚ð +‘S‚Ä‘ŠŽè‚É—^‚¦‚È‚¯‚ê‚΂Ȃè‚Ü‚¹‚ñB‚ ‚È‚½‚ÍA‘ŠŽè‚à‚Ü‚½ƒ\[ƒXEƒR[ƒh‚ð +Žó‚¯Žæ‚Á‚½‚è“üŽè‚Å‚«‚邯‚¢‚¤‚±‚Æ‚ð”F‚߂Ȃ¯‚ê‚΂Ȃè‚Ü‚¹‚ñB‚³‚ç‚É‚ ‚È‚½ +‚ÍA”Þ‚ç‚ªŽ©•ª‚½‚¿‚ÌŒ —˜‚ð’m‚邿‚¤‚ÉA‚±‚ê‚ç‚Ìð€‚ð’m‚炵‚߂Ȃ¯‚ê‚Î‚È +‚è‚Ü‚¹‚ñB + +@‰äX‚ÍŽŸ‚Ì‚Q‚‚̕û–@‚ц[ƒU‚ÌŒ —˜‚ðŽç‚è‚Ü‚·Bi‚Pjƒ\ƒtƒgƒEƒFƒA‚É’˜ +쌠‚ðŽå’£‚µAi‚Qj–{Žg—p‹–‘ø‚Ìð€‚̉º‚Ń\ƒtƒgƒEƒFƒA‚ð•¡»E”ЕzE•Ï +X‚·‚錠—˜‚ðƒ†[ƒU‚É—^‚¦‚Ü‚·B + +@‚Ü‚½AŠe쬎҂â‰äXŽ©g‚ðŽç‚邽‚ß‚ÉA–{ƒtƒŠ[Eƒ\ƒtƒgƒEƒFƒA‚ª–³•ÛØ +‚Å‚ ‚邱‚Æ‚ð‘S‚Ä‚ÌlX‚ª—¹‰ð‚µ‚Ä‚¢‚é•K—v‚ª‚ ‚è‚Ü‚·B‚³‚ç‚ÉA‘¼‚Ì’N‚©‚É +‚æ‚Á‚Ä•ÏX‚³‚ꂽƒ\ƒtƒgƒEƒFƒA‚ª”Еz‚³‚ꂽê‡AŽó—ÌŽÒ‚Í‚»‚̃\ƒtƒgƒEƒFƒA +‚ªƒIƒŠƒWƒiƒ‹Eƒo[ƒWƒ‡ƒ“‚ł͂Ȃ¢‚Æ‚¢‚¤‚±‚Æ‚ð’m‚炳‚ê‚é•K—v‚ª‚ ‚è‚Ü‚·B +‚»‚ê‚ÍA‘¼l‚ÌŠÖ—^‚É‚æ‚Á‚ÄŒ´ŠJ”­ŽÒ‚ɑ΂·‚é•]‰¿‚ª‰e‹¿‚³‚ê‚È‚¢‚悤‚É‚·‚é +‚½‚߂ł·B + +@ÅŒã‚ÉA‚ǂ̃tƒŠ[EƒvƒƒOƒ‰ƒ€‚àƒ\ƒtƒgƒEƒFƒA“Á‹–‚É₦‚¸‹º‚©‚³‚ê‚Ä‚¢ +‚Ü‚·B‰äX‚ÍAƒtƒŠ[EƒvƒƒOƒ‰ƒ€‚ÌĔЕzŽÒ‚ªŒÂl“I‚É“Á‹–Œ ‚ðŽæ“¾‚µAŽ– +ŽÀã‚»‚̃vƒƒOƒ‰ƒ€‚ðŽ©•ª‚ÌàŽY‚É‚µ‚Ä‚µ‚Ü‚¤‚Æ‚¢‚¤ŠëŒ¯‚ð”ð‚¯‚½‚¢‚ÆŠè‚Á‚Ä +‚¢‚Ü‚·B‚±‚ê‚ð–h‚®‚½‚߂ɉäX‚ÍA‚¢‚¸‚ê‚Ì“Á‹–‚àA’N‚Å‚àŽ©—R‚ÉŽg—p‚Å‚«‚é +‚悤‚ÉŽg—p‹–‘ø‚³‚ê‚é‚ׂ«‚©A‚ ‚é‚¢‚͉½l‚ɑ΂µ‚Ä‚à‘S‚­Žg—p‚³‚¹‚È‚¢‚©‚ÌA +‚¢‚¸‚ê‚©‚É‚·‚ׂ«‚Å‚ ‚邱‚Ƃ𖾂炩‚É‚µ‚Ä‚«‚Ü‚µ‚½B + +@•¡ŽÊE”ЕzE•ÏX‚ɑ΂·‚鳊m‚Èð€‚ÆðŒ‚ðŽŸ‚ÉŽ¦‚µ‚Ü‚·B + + + +‚f‚m‚tˆê”ÊŒö—LŽg—p‹–‘ø‚̉º‚ł̕¡»A”ЕzA•ÏX‚ÉŠÖ‚·‚éð€‚ÆðŒ + + +@‚PD@–{Žg—p‹–‘ø‚ÍA–{ˆê”ÊŒö—LŽg—p‹–‘ø‚ÌŠeð€‚É]‚Á‚ĔЕz‚³‚ê‚邯‚¢ +@@@@‚¤’˜ìŒ ŽÒ‚©‚ç‚Ì’m•¶‚ª•\ަ‚³‚ê‚Ä‚¢‚éƒvƒƒOƒ‰ƒ€‚â‚»‚Ì‘¼‚Ìì¬ +@@@@•¨‚É“K—p‚³‚ê‚Ü‚·BˆÈ‰º‚É‚¨‚¢‚ÄuƒvƒƒOƒ‰ƒ€v‚Æ‚ÍA‚»‚̂悤‚ȃv +@@@@ƒƒOƒ‰ƒ€‚â쬕¨‚ðŽw‚·‚à‚̂ƂµA‚Ü‚½AuƒvƒƒOƒ‰ƒ€¶¬•¨v‚Æ‚ÍA +@@@@ãq‚µ‚½uƒvƒƒOƒ‰ƒ€vŽ©gA‚Ü‚½‚ÍA’˜ìŒ –@‰º‚É‚¨‚¯‚é‘S‚Ă̔h +@@@@¶•¨G‚·‚Ȃ킿A‚»‚ÌuƒvƒƒOƒ‰ƒ€v‚Ì‘S•”–”‚͈ꕔ‚ðA‚»‚̂܂ܖ” +@@@@‚Í•ÏX‚µ‚ÄAŠŽ‚Â^–”‚Í‘¼‚ÌŒ¾Œê‚ɕϊ·‚µ‚ÄA“à•”‚É‘g‚Ýž‚ñ‚¾ì¬ +@@@@•¨‚ðˆÓ–¡‚µ‚Ü‚·BiˆÈ‰ºAŒ¾Œê•ÏŠ·‚Íu•ÏXv‚Æ‚¢‚¤—pŒê‚Ì’†‚É–³ð +@@@@Œ‚Ɋ܂܂ê‚é‚à‚̂Ƃµ‚Ü‚·Bj–{Žg—p‹–‘ø‚É‚æ‚Á‚Ä‹–‘ø‚ðŽó‚¯‚éŽÒ‚ð +@@@@u‚ ‚È‚½v‚ƌĂт܂·B@ + +@@@@•¡»A”ЕzA•ÏXˆÈŠO‚Ìsˆ×‚Í–{Žg—p‹–‘ø‚Ì‘ÎÛ‚Æ‚µ‚Ü‚¹‚ñB‚»‚ê‚ç +@@@@‚Í–{Žg—p‹–‘ø‚͈̔͊O‚Å‚·BuƒvƒƒOƒ‰ƒ€v‚ðŽÀs‚³‚¹‚ésˆ×‚ÉŠÖ‚µ +@@@@‚ħ–ñ‚Í‚ ‚è‚Ü‚¹‚ñBuƒvƒƒOƒ‰ƒ€v‚Ìo—Í‚ÍAi@uƒvƒƒOƒ‰ƒ€v +@@@@‚ðŽÀs‚³‚¹‚Ä쬂³‚¹‚½‚©‚Ç‚¤‚©‚Ƃ͖³ŠÖŒW‚Éj@‚»‚Ì“à—e‚ªuƒvƒ +@@@@ƒOƒ‰ƒ€¶¬•¨v‚Å‚ ‚éꇂɌÀ‚è–{Žg—p‹–‘ø‚Ì‘ÎۂƂȂè‚Ü‚·B‚±‚ê +@@@@‚ª“–‚Ă͂܂邩‚Ç‚¤‚©‚ÍAuƒvƒƒOƒ‰ƒ€v‚ª‰½‚ð‚·‚é‚à‚Ì‚©‚Ɉ˂è‚Ü +@@@@‚·B + +@‚QD@‚ ‚È‚½‚ÍA‚ǂ̂悤‚È”}‘Ìã‚Ö•¡»‚µ‚悤‚Æ‚·‚éꇂł ‚Á‚Ä‚àA“ü +@@@@Žè‚µ‚½uƒvƒƒOƒ‰ƒ€v‚̃\[ƒXEƒR[ƒh‚ð‚»‚Ì‚Ü‚Ü‚Ì“à—e‚Å•¡ŽÊ‚µ‚½ +@@@@ã‚Å“K³‚È’˜ìŒ •\ަ‚Æ•ÛØ‚Ì•úŠü‚𖾊mAŠŽ‚“K³‚É•t‹L‚·‚éê‡ +@@@@‚ÉŒÀ‚èA•¡»–”‚͔Еz‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B‚»‚Ìê‡A–{Žg—p‹–‘ø‹y +@@@@‚Ñ–³•ÛØ‚ÉŠÖ‚·‚é‹LÚ•”•ª‚ÍA‘S‚ÄŒ³‚̂܂܂̌`‚Å•\ަ‚µ‚Ä‚­‚¾‚³‚¢B +@@@@‚Ü‚½AuƒvƒƒOƒ‰ƒ€v‚̔Еzæ‚ɑ΂µ‚Ä‚ÍAuƒvƒƒOƒ‰ƒ€v‚Æ‹¤‚É–{ +@@@@Žg—p‹–‘ø‘‚ÌŽÊ‚µ‚ð“n‚µ‚Ä‚­‚¾‚³‚¢B•¡»•¨‚̈ø‚«“n‚µ‚É—v‚·‚éŽÀ”ï +@@@@‚Í¿‹‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B‚Ü‚½A‚ ‚È‚½“ÆŽ©‚Ì•ÛØ‚ðs‚È‚¤ê‡‚Í +@@@@‚»‚ê‚ð—Lž‚Æ‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B + +@‚RD@ŽŸ‚ÌŠeðŒ‚ð‘S‚Ä–ž‚½‚µ‚Ä‚¢‚éŒÀ‚èA‚ ‚È‚½‚ÍAuƒvƒƒOƒ‰ƒ€v–”‚Í +@@@@‚»‚̈ꕔ•ª‚ð•ÏX‚µ‚ÄuƒvƒƒOƒ‰ƒ€¶¬•¨v‚Æ‚·‚邱‚Æ‚ª‚Å‚«A‚³‚ç +@@@@‚ÉA•ÏX”Å‚â‰E쬕¨‚ðã‹L‘æ‚Q€‚É]‚Á‚Ä•¡»–”‚͔Еz‚·‚邱‚Æ‚à +@@@@‚Å‚«‚Ü‚·B + +@@@@i‚jƒtƒ@ƒCƒ‹‚ð•ÏX‚µ‚½Ž|‚Æ‚»‚Ì•ÏX“ú‚Æ‚ðA•ÏX‚µ‚½ƒtƒ@ƒCƒ‹ã +@@@@@@@‚É–¾Šm‚É•\ަ‚·‚邱‚ÆB + +@@@@i‚‚j•ÏX‚µ‚½‚©”Û‚©‚ð–â‚킸A–}‚»uƒvƒƒOƒ‰ƒ€v–”‚Í‚»‚̈ꕔ•ª +@@@@@@@‚ð“à•”‚É‘g‚Ýž‚ñ‚Å‚¢‚é‚©–”‚Í‚»‚ê‚©‚ç”h¶‚µ‚½¶¬•¨‚ð”Еz +@@@@@@@‚·‚éꇂɂÍA‚»‚Ì‘S‘Ì‚ð–{Žg—p‹–‘ø‚Ìð€‚É]‚Á‚Ä‘æŽOŽÒ‚Ö +@@@@@@@–³ž‚ÅŽg—p‹–‘ø‚·‚邱‚ÆB + +@@@@i‚ƒj•ÏX‚µ‚½ƒvƒƒOƒ‰ƒ€‚ªŽÀsŽž‚É’Êí‚̑Θb“I‚È•û–@‚ŃRƒ}ƒ“ƒh +@@@@@@@‚ð“ǂނ悤‚ɂȂÁ‚Ä‚¢‚邯‚·‚ê‚ÎAÅ‚à•’Ê‚Ì•û–@‚őΘb“I‚É +@@@@@@@‚»‚̃vƒƒOƒ‰ƒ€‚ðŽÀs‚·‚鎞‚ÉAŽŸ‚Ì“à—e‚ðŽ¦‚·•¶Œ¾‚ªƒvƒŠƒ“ +@@@@@@@ƒ^‚ÖˆóŽš‚³‚ê‚é‚©Aˆ½‚¢‚͉æ–ʂɕ\ަ‚³‚ê‚邱‚ÆB + +@@@@@@@E“K؂Ȓ˜ìŒ •\ަB +@@@@@@@E–³•ÛØ‚Å‚ ‚邱‚Æi‚ ‚È‚½‚ª“ÆŽ©‚É•ÛØ‚·‚éꇂÍA‚»‚ÌŽ|jB +@@@@@@@E”Еz‚ðŽó‚¯‚éŽÒ‚àA–{Žg—p‹–‘ø‚Æ“¯ˆê‚Ìð€‚É]‚Á‚Äuƒvƒ +@@@@@@@@ƒOƒ‰ƒ€v‚ðĔЕz‚Å‚«‚邱‚ÆB +@@@@@@@E”Еz‚ðŽó‚¯‚éŽÒ‚ª–{Žg—p‹–‘ø‘‚ÌŽÊ‚µ‚ðŽQÆ‚·‚é•û–@B + +@@@@@@@i—áŠO‚Æ‚µ‚ÄAuƒvƒƒOƒ‰ƒ€vŽ©‘̂͑Θb“I‚Å‚ ‚Á‚Ä‚à‹N“®Žž +@@@@@@@‚Ì•¶Œ¾‚ð’Êí‚͈󎚂µ‚È‚¢‚̂Ȃç‚ÎA‚ ‚È‚½‚ÌuƒvƒƒOƒ‰ƒ€¶ +@@@@@@@¬•¨v‚Í‚±‚̂悤‚È•¶Œ¾‚ðˆóŽš‚·‚é•K—v‚Í‚ ‚è‚Ü‚¹‚ñBj + +@@@@‚±‚ê‚ç‚Ì—vŒ‚Í•ÏX‚³‚ꂽ쬕¨‚É‚à‘S‚Ä“K—p‚³‚ê‚Ü‚·B‚»‚Ì•ÏX”Å +@@@@‚̈½‚é•”•ª‚ªuƒvƒƒOƒ‰ƒ€v‚Ì”h¶•¨‚ł͂Ȃ­A‚µ‚©‚à‚»‚ꎩ‘̓Ɨ§ +@@@@‚ňقȂé쬕¨‚¾‚Ƈ—“I‚Él‚¦‚ç‚ê‚éê‡A‚ ‚È‚½‚ª‚»‚ê‚ç‚ð•Ê‚Ì +@@@@쬕¨‚Æ‚µ‚ĔЕz‚µ‚½Žž‚ÍA–{Žg—p‹–‘ø‚Æ‚»‚Ìð€‚Í‚»‚ê‚ç‚Ì•”•ª‚É +@@@@‚Í“K—p‚³‚ê‚Ü‚¹‚ñB‚µ‚©‚µA‚»‚ê‚ç‚ðuƒvƒƒOƒ‰ƒ€¶¬•¨v‚̈ꕔ‚Æ +@@@@‚µ‚ĔЕz‚·‚éꇂÍA‘S‘Ì‚ª–{Žg—p‹–‘ø‚Ìð€‚É]‚Á‚ĔЕz‚³‚ê‚È‚¯ +@@@@‚ê‚΂Ȃ炸AŽg—p‹–‘ø‚ðŽó‚¯‚鑼‚Ì‘S‚Ă̎҂ɑ΂·‚é‹–‘ø‚àƒvƒƒOƒ‰ +@@@@ƒ€‘S‘̂ɂ킽‚Á‚Ä—^‚¦‚ç‚ê‚È‚¯‚ê‚΂Ȃ炸AŒ‹‰Ê‚Æ‚µ‚ÄA’N‚ª‘‚¢‚½ +@@@@‚©‚É‚©‚©‚í‚炸A‘S‚Ă̕”•ª‚É–{Žg—p‹–‘ø‚ª“K—p‚³‚ê‚È‚¯‚ê‚΂Ȃè‚Ü +@@@@‚¹‚ñB + +@@@@‚±‚̂悤‚ÉA–{ð€‚̈Ó}‚·‚邯‚±‚ë‚ÍAŠ®‘S‚É‚ ‚È‚½‚É‚æ‚Á‚Ä‘‚© +@@@@‚ꂽ쬕¨‚ɂ‚¢‚ÄAŒ —˜‚ð—v‹‚µ‚½‚èA‚ ‚È‚½‚ÆŒ —˜ŠÖŒW‚𑈂¤‚± +@@@@‚Ƃł͂ ‚è‚Ü‚¹‚ñB‚Þ‚µ‚ë‚»‚Ì–Ú“I‚ÍA쬕¨‚ªuƒvƒƒOƒ‰ƒ€¶¬•¨v +@@@@‚Å‚ ‚éꇂɂ»‚Ì”h¶•¨‚âW‡•¨‚̔Еz‚ð‹K§‚·‚邱‚Ƃɂ ‚è‚Ü‚·B + +@@@@‚³‚ç‚ÉAuƒvƒƒOƒ‰ƒ€vi–”‚ÍuƒvƒƒOƒ‰ƒ€¶¬•¨vj@‚ÆuƒvƒƒO +@@@@ƒ‰ƒ€¶¬•¨v‚Ƃ͂Ȃç‚È‚¢‘¼‚̃vƒƒOƒ‰ƒ€‚Æ‚ðA’P‚ɕۊǂâ”Еz‚Ì‚½ +@@@@‚߂ɓ¯ˆê‚Ì”}‘Ìã‚ɂ܂Ƃ߂ċL˜^‚µ‚½‚Æ‚µ‚Ä‚àA–{Žg—p‹–‘ø‚Í‘¼‚̃v +@@@@ƒƒOƒ‰ƒ€‚ɂ͓K—p‚³‚ê‚Ü‚¹‚ñB + +@‚SD@‚ ‚È‚½‚ÍAˆÈ‰º‚Ì‚¤‚¿‚¢‚¸‚ê‚©‚P‚‚𖞂½‚·ŒÀ‚èAã‹L‘æ‚Q€‹y‚Ñ‘æ +@@@@‚R€‚É]‚Á‚ÄuƒvƒƒOƒ‰ƒ€vi–”‚ÍAã‹L‘æ‚R€‚ÅŒ¾‹y‚µ‚Ä‚¢‚éuƒv +@@@@ƒƒOƒ‰ƒ€¶¬•¨vj‚ðƒIƒuƒWƒFƒNƒgEƒR[ƒh–”‚ÍŽÀs‰Â”\‚ÈŒ`Ž®‚Å•¡ +@@@@»‹y‚єЕz‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B + +@@@@i‚j‘Ήž‚·‚é‹@ŠB“ǂݎæ‚è‰Â”\‚ȃ\[ƒXEƒR[ƒhˆêŽ®‚ðˆê‚Ɉø‚« +@@@@@@@“n‚·‚±‚ÆB‚»‚Ìê‡A‚»‚̃\[ƒXEƒR[ƒh‚̈ø‚«“n‚µ‚Íã‹L‘æ +@@@@@@@‚Q€‹y‚Ñ‘æ‚R€‚É]‚Á‚ÄA’Êíƒ\ƒtƒgƒEƒFƒA‚ÌŒðŠ·‚É—p‚¢‚ç‚ê +@@@@@@@‚é”}‘Ì‚Ås‚È‚í‚ê‚邱‚ÆB + +@@@@i‚‚j­‚È‚­‚Æ‚à‚R”NŠÔ‚Ì—LŒøŠúŠÔ‚ð’è‚ßAŠŽ‚‚»‚ÌŠúŠÔ“à‚Å‚ ‚ê‚Î +@@@@@@@‘Ήž‚·‚é‹@ŠB“ǂݎæ‚è‰Â”\‚ȃ\[ƒXEƒR[ƒhˆêŽ®‚Ì•¡»‚ðAƒ\[ +@@@@@@@ƒX”Еz‚ÉŠÖ‚í‚éŽÀ”ïˆÈã‚̑Ή¿‚ð—v‹‚¹‚¸‚É’ñ‹Ÿ‚·‚éŽ|A‹y‚Ñ +@@@@@@@‚»‚ÌꇂɂÍã‹L‘æ‚Q€‹y‚Ñ‘æ‚R€‚É]‚Á‚ÄA’Êíƒ\ƒtƒgƒEƒF +@@@@@@@ƒA‚ÌŒðŠ·‚É—p‚¢‚ç‚ê‚é”}‘̂Œñ‹Ÿ‚³‚ê‚éŽ|‚ð‹LÚ‚µ‚½‘–Ê‚ðA +@@@@@@@‘æŽOŽÒ‚Ɉê‚Ɉø‚«“n‚·‚±‚ÆB + +@@@@i‚ƒj‘Ήž‚·‚éƒ\[ƒXEƒR[ƒh”Еz‚Ì\‚µo‚ÉÛ‚µ‚ÄA‚ ‚È‚½‚ª“¾‚½ +@@@@@@@î•ñ‚ðˆê‚Ɉø‚«“n‚·‚±‚ÆBi‚±‚Ì‘I‘ðŽˆ‚ÍA‰c—˜‚ð–Ú“I‚Æ‚µ +@@@@@@@‚È‚¢”Еz‚Å‚ ‚Á‚ÄAŠŽ‚‚ ‚È‚½‚ªã‹L‚Ìi‚‚j€‚ÉŠî‚¢‚ÄA +@@@@@@@ƒIƒuƒWƒFƒNƒgEƒR[ƒhˆ½‚¢‚ÍŽÀs‰Â”\Œ`Ž®‚̃vƒƒOƒ‰ƒ€‚µ‚©“ü +@@@@@@@Žè‚µ‚Ä‚¢‚È‚¢ê‡‚ÉŒÀ‚è“K—p‚³‚ê‚é‘I‘ð€–Ú‚Å‚·Bj + +@@@@‚È‚¨Aƒ\[ƒXEƒR[ƒh‚Æ‚ÍA•ÏXì‹Æ‚É“K‚µ‚½‹LqŒ`Ž®‚ðŽw‚µ‚Ü‚·B +@@@@‚Ü‚½AŽÀs‰Â”\Œ`Ž®‚̃tƒ@ƒCƒ‹‚ɑΉž‚·‚éƒ\[ƒXEƒR[ƒhˆêŽ®‚Æ‚ÍA +@@@@‚»‚ê‚Ɋ܂܂ê‚é‘Sƒ‚ƒWƒ…[ƒ‹‚ɑΉž‚·‚é‘S‚Ẵ\[ƒXEƒR[ƒhA‹y‚Ñ +@@@@‚ ‚ç‚ä‚éŠÖ˜A‚̃Cƒ“ƒ^ƒtƒF[ƒX’è‹`ƒtƒ@ƒCƒ‹A‹y‚ÑŽÀs‚ð‰Â”\‚É‚·‚é +@@@@ƒRƒ“ƒpƒCƒ‹‚ƃCƒ“ƒXƒg[ƒ‹‚̧Œä‚ÉŠÖ‚·‚é‹Lq‚ðŽw‚µ‚Ü‚·B“Á•ʂȗá +@@@@ŠO‚Æ‚µ‚ÄAŽÀs‰Â”\‚ȃtƒ@ƒCƒ‹‚ª“®ì‚·‚éƒIƒyƒŒ[ƒeƒBƒ“ƒOEƒVƒXƒe +@@@@ƒ€‚ÌŽå—v‚È\¬—v‘fiƒRƒ“ƒpƒCƒ‰AƒJ[ƒlƒ‹‚È‚Çj@‚Æ‹¤‚Éiƒ\[ƒXE +@@@@ƒR[ƒh–”‚̓oƒCƒiƒŠ‚̂ǂ¿‚ç‚©‚Åj@”Еz‚³‚ê‚Ä‚¢‚é‚à‚̂ɂ‚¢‚Ä‚ÍA +@@@@‚»‚Ì\¬—v‘fŽ©‘Ì‚ªŽÀsŒ`Ž®‚É•t‚µ‚Ä‚¢‚È‚¢ê‡‚ÉŒÀ‚èA”Еz‚³‚ê +@@@@‚éƒ\[ƒXEƒR[ƒh‚Ɋ܂߂é•K—v‚Í‚ ‚è‚Ü‚¹‚ñB + +@@@@ŽÀs‰Â”\Œ`Ž®‚Ü‚½‚̓IƒuƒWƒFƒNƒgEƒR[ƒh‚̔Еz‚ªAŽwަ‚³‚ê‚½êŠ +@@@@‚©‚ç‚Ì•¡»‚Ì‚½‚߂̃AƒNƒZƒXŒ ‚Ì•Š—^‚Å‚ ‚éê‡A“¯‚¶êŠ‚©‚ç‚̃\[ +@@@@ƒXEƒR[ƒh‚Ì•¡»‚Ì‚½‚߂̓¯“™‚ȃAƒNƒZƒXŒ ‚𕊗^‚·‚ê‚ÎA‚½‚Æ‚¦‘æ +@@@@ŽOŽÒ‚ɃIƒuƒWƒFƒNƒgEƒR[ƒh‚Æ‹¤‚Ƀ\[ƒX‚Ì•¡»‚ð‹­‚¢‚È‚­‚Æ‚àAƒ\[ +@@@@ƒXEƒR[ƒh‚ð”Еz‚µ‚½‚à‚̂Ƃ݂Ȃµ‚Ü‚·B + +@‚TD@–{Žg—p‹–‘ø‚ª–¾Ž¦“I‚É‹–‘ø‚µ‚Ä‚¢‚éꇂ𜂫A‚ ‚È‚½‚ÍAuƒvƒƒO +@@@@ƒ‰ƒ€v‚ð•¡»A•ÏXAƒTƒuƒ‰ƒCƒZƒ“ƒXA”Еz‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚¹‚ñB +@@@@–{Žg—p‹–‘ø‚É]‚킸‚ÉuƒvƒƒOƒ‰ƒ€v‚ð•¡»A•ÏXAƒTƒuƒ‰ƒCƒZƒ“ƒXA +@@@@”Еz‚µ‚悤‚Æ‚·‚ésˆ×‚ÍA‚»‚ꎩ‘Ì‚ª–³Œø‚Å‚ ‚èAŠŽ‚ÂA–{Žg—p‹–‘ø +@@@@‚ª‚ ‚È‚½‚É‹–‘ø‚µ‚Ä‚¢‚éuƒvƒƒOƒ‰ƒ€v‚ÌŒ —˜‚ðŽ©“®“I‚ÉÁ–Å‚³‚¹‚Ü +@@@@‚·B‚»‚Ìê‡A–{Žg—p‹–‘ø‚É]‚Á‚Ä‚ ‚È‚½‚©‚ç•¡»•¨‚â‚»‚ÌŒ —˜‚𓾠+@@@@‚Ä‚¢‚鑿ŽOŽÒ‚ÍA–{Žg—p‹–‘ø‚ÉŠ®‘S‚É]‚Á‚Ä‚¢‚éꇂɌÀ‚èAˆø‘±‚« +@@@@—LŒø‚ÈŽg—pŒ ŒÀ‚ðŽ‚Â‚à‚̂Ƃµ‚Ü‚·B + +@‚UD@‚ ‚È‚½‚͂܂¾“¯ˆÓ‚Ìˆó‚Æ‚µ‚Ä–¼‚µ‚Ä‚¢‚È‚¢‚Ì‚ÅA–{Žg—p‹–‘ø‚ðŽó‚¯ +@@@@“ü‚ê‚é•K—v‚Í‚ ‚è‚Ü‚¹‚ñB‚µ‚©‚µA‚ ‚È‚½‚ÉuƒvƒƒOƒ‰ƒ€v–”‚Í‚»‚Ì +@@@@”h¶•¨‚ð•ÏX–”‚ÍĔЕz‚·‚é‹–‰Â‚ð—^‚¦‚é‚à‚͖̂{Žg—p‹–‘øˆÈŠO‚É‚Í +@@@@‚ ‚è‚Ü‚¹‚ñB‚±‚ê‚ç‚Ìsˆ×‚ÍA‚ ‚È‚½‚ª‚à‚µ–{Žg—p‹–‘ø‚ðŽó‚¯“ü‚ê‚È +@@@@‚¢‚̂ł ‚ê‚ÎA–@—¥‚É‚æ‚Á‚ċւ¶‚ç‚ê‚Ü‚·B]‚Á‚ÄA‚ ‚È‚½‚ªuƒvƒ +@@@@ƒOƒ‰ƒ€vi–”‚ÍuƒvƒƒOƒ‰ƒ€¶¬•¨vj‚Ì•ÏX–”‚͔Еz‚ðs‚¦‚ÎA‚» +@@@@‚ꎩ‘̂ł ‚È‚½‚Í–{Žg—p‹–‘ø‚ðŽó‚¯“ü‚êAŠŽ‚ÂAuƒvƒƒOƒ‰ƒ€v–”‚Í +@@@@‚»‚ÌuƒvƒƒOƒ‰ƒ€¶¬•¨v‚Ì•¡»A”ЕzA•ÏX‚ÉŠÖ‚·‚邱‚ê‚ç‚Ìð€ +@@@@‚ÆðŒ‚Ì‘S‚Ä‚ðŽó‚¯“ü‚ꂽ‚±‚Æ‚ðŽ¦‚µ‚Ü‚·B + +@‚VD@‚ ‚È‚½‚ªuƒvƒƒOƒ‰ƒ€vi–”‚Í‚»‚ÌuƒvƒƒOƒ‰ƒ€¶¬•¨vj‚ðĔЕz +@@@@‚·‚邯ީ“®“I‚ÉA‚»‚ÌŽó—ÌŽÒ‚ÍAŒ³‚ÌŽg—p‹–‘øŽÒ‚©‚çA–{Žg—p‹–‘ø‚Ì +@@@@ð€‚É]‚Á‚ÄuƒvƒƒOƒ‰ƒ€v‚ð•¡»A”ЕzA•ÏX‚·‚邱‚Æ‚ð“à—e‚Æ‚· +@@@@‚éŽg—p‹–‘ø‚ðŽó‚¯‚½‚à‚̂Ƃµ‚Ü‚·B‚ ‚È‚½‚ÍAŽó—ÌŽÒ‚É‹–‘ø‚³‚ꂽŒ  +@@@@—˜‚ÌsŽg‚ɂ‚¢‚ÄA‚³‚ç‚ɧ–ñ‚ð‰Á‚¦‚邱‚Ƃ͂ł«‚Ü‚¹‚ñB‚ ‚È‚½‚É +@@@@‚ÍA‘æŽOŽÒ‚É–{Žg—p‹–‘ø‚̎󂯓ü‚ê‚ð‹­‚¢‚éÓ”C‚Í‚ ‚è‚Ü‚¹‚ñB + +@‚WD@Ù”»Š‚Ì”»ŒˆA–”‚Í“Á‹–NŠQ‚Ì\‚µ—§‚ÄA–”‚Íi“Á‹––â‘è‚ÉŒÀ‚ç‚È‚¢j +@@@@‰½‚ç‚©‚Ì——R‚ÌŒ‹‰Ê‚Æ‚µ‚ÄA‚ ‚È‚½‚ɉۂ¹‚ç‚ê‚½ðŒ‚ª–{Žg—p‹–‘ø‚Æ +@@@@‘Š“ü‚ê‚È‚¢‚à‚̂ł ‚Á‚½‚Æ‚µ‚Ä‚àiÙ”»Š‚Ì–½—ßAŒ_–ñA‚»‚Ì‘¼‚É‚æ +@@@@‚é‚à‚̂ł ‚êjA–{Žg—p‹–‘ø‚ÌðŒ‚ª–Æœ‚³‚ê‚é‚à‚̂ł͂ ‚è‚Ü‚¹‚ñB +@@@@–{Žg—p‹–‘ø‚É‚æ‚éÓ–±‚ÆA‚»‚Ì‘¼‚̉½‚ç‚©‚ÌŠÖ˜AÓ–±‚𓯎ž‚É–ž‚½‚· +@@@@‘Ô—l‚ŔЕz‚·‚邱‚Æ‚ª‚Å‚«‚È‚¢‚È‚ç‚ÎA‚ ‚È‚½‚ÍuƒvƒƒOƒ‰ƒ€v‚ð‘S +@@@@‚­”Еz‚µ‚Ă͂¢‚¯‚Ü‚¹‚ñB—Ⴆ‚ÎA“Á‹–Œ ‚Ì“à—e‚ªA‚ ‚È‚½‚©‚ç’¼Ú +@@@@–”‚ÍŠÔÚ‚É•¡»‚ðŽó‚¯Žæ‚Á‚½‘S‚Ä‚Ìl‚ÉŽg—p—¿‚̂Ȃ¢ƒvƒƒOƒ‰ƒ€‚ÌÄ +@@@@”Еz‚ð‹–‚³‚È‚¢‚à‚̂ł ‚ê‚ÎA‚ ‚È‚½‚ª‚©‚©‚é“Á‹–ã‚Ì—v¿‚Æ–{Žg—p +@@@@‹–‘ø‚Ì—¼•û‚ð–ž‘«‚³‚¹‚é•û–@‚ÍAuƒvƒƒOƒ‰ƒ€v‚̔Еz‚ðŠ®‘S‚É’f”O +@@@@‚·‚邱‚Æ‚¾‚¯‚Å‚·B + +@@@@–{ð€‚̈½‚é•”•ª‚ª‰½‚ç‚©‚Ì“Á•Ê‚È󋵉º‚Å–³Œø‚Ü‚½‚Í“K—p•s‰Â”\‚É +@@@@‚È‚Á‚½ê‡A–{ð€‚Ì‚»‚Ì‘¼‚ÌŽc‚è‚Ì•”•ª‚ª“K—p‚³‚ê‚邿‚¤‚ɈÓ}‚³ +@@@@‚ê‚Ä‚¨‚èA‚Ü‚½A–{ð€‚Í‘S‘̂Ƃµ‚Ä‚»‚Ì‘¼‚Ì󋵂ɓ–‚Ä‚Í‚Ü‚é‚æ‚¤ +@@@@‚ɈÓ}‚³‚ê‚Ä‚¢‚Ü‚·B + +@@@@–{ð€‚Ì–Ú“I‚ÍA“Á‹–‚â‚»‚Ì‘¼‚ÌàŽYŒ ‚ðNŠQ‚µ‚½‚èA‚»‚̂悤‚ÈŒ  +@@@@—˜‚ÉŠî‚­Žå’£‚̑Ó–«‚𑈂¤‚悤‚É‚ ‚È‚½‚ÉŠ©‚߂邱‚Ƃł͂ ‚è‚Ü +@@@@‚¹‚ñB–{ð€‚Ì—Bˆê‚Ì–Ú“I‚ÍAƒtƒŠ[Eƒ\ƒtƒgƒEƒFƒA‚̔ЕzƒVƒXƒeƒ€ +@@@@‚ÌŠ®‘S«‚ðŽç‚邱‚Æ‚ÅA‚»‚ê‚ÍŒö—LŽg—p‹–‘ø‚ÌŽÀ‘H‚É‚æ‚Á‚Ä—šs‚³‚ê +@@@@‚Ü‚·B‘½‚­‚ÌlX‚ªA‚±‚̃VƒXƒeƒ€‚̈êŠÑ‚µ‚½“K—p‚ðM—Š‚µ‚ÄA‚±‚Ì +@@@@ƒVƒXƒeƒ€‚ð’Ê‚¶‚ĔЕz‚³‚ê‚Ä‚¢‚é•L‚¢”͈͂̃\ƒtƒgƒEƒFƒA‚ÉÉ‚µ‚Ý +@@@@‚È‚¢vŒ£‚ð‚µ‚Ä‚­‚ê‚Ü‚µ‚½B쬎҂âŠñ‘¡ŽÒ‚ª‘¼‚̉½‚ç‚©‚̃VƒXƒeƒ€ +@@@@‚ð’Ê‚¶‚ă\ƒtƒgƒEƒFƒA‚ð”Еz‚µ‚½‚¢‚ÆŒˆ‚߂邱‚Ƃ͔ނç‚ÌŽ©—RˆÓŽu‚Å +@@@@‚ ‚èAŽg—p‹–‘ø‚ðŽó‚¯‚éŽÒ‚Í‚»‚Ì‘I‘ð‚ð‹­‚¢‚邱‚Ƃ͂ł«‚Ü‚¹‚ñB + +@@@@–{ð€‚ÍA–{Žg—p‹–‘ø‚Ì‘¼‚Ìð€‚̈Ӗ¡“à—e‚ª‰½‚Å‚ ‚é‚©‚ðŠ®‘S‚É–¾ +@@@@‚ç‚©‚É‚·‚邱‚Æ‚ðˆÓ}‚µ‚Ä‚¢‚Ü‚·B + +@‚XD@uƒvƒƒOƒ‰ƒ€v‚̔ЕzEŽg—p‚ªA‚ ‚é‘‚É‚¨‚¢‚Ä“Á‹––”‚Í’˜ìŒ ‚Å•Û +@@@@Œì‚³‚ꂽƒCƒ“ƒ^ƒtƒF[ƒX‚̂ǂ¿‚ç‚©‚ŧŒÀ‚³‚ê‚éê‡AuƒvƒƒOƒ‰ƒ€v +@@@@‚ð–{Žg—p‹–‘ø‰º‚É‚¨‚¢‚½Œ´’˜ìŒ •ÛŽŽÒ‚ÍA‚»‚Ì‘‚ðœŠO‚·‚éŽ|‚Ì–¾ +@@@@ަ“I‚ȔЕz’nˆæ§ŒÀ‚ð‰Á‚¦A‚»‚êˆÈŠO‚ÌiœŠO‚³‚ê‚È‚¢j@‘‚ÉŒÀ’è +@@@@‚µ‚ĔЕz‚ª‹–‚³‚ê‚邿‚¤‚É‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B‚»‚̂悤‚Èê‡A‚» +@@@@‚̧ŒÀ‚ð–{Žg—p‹–‘ø‚Ì–{•¶‚É‚ ‚½‚©‚à‘‚©‚ê‚Ä‚¢‚é‚©‚̂悤‚É–{Žg—p +@@@@‹–‘ø‚Ì’†‚É‘g‚Ý“ü‚ê‚ç‚ê‚é‚à‚̂Ƃµ‚Ü‚·B + +‚P‚OD@Free Software Foundation ‚ÍŽžA–{ˆê”ÊŒö—LŽg—p‹–‘ø‚̉ü’ù”ÅA +@@@@–”‚ÍV”Å‚ðŒö•\‚·‚邱‚Æ‚ª‚ ‚è‚Ü‚·B‚»‚̂悤‚ÈV‚µ‚¢ƒo[ƒWƒ‡ƒ“‚ÍA +@@@@Œ»s‚̃o[ƒWƒ‡ƒ“‚ÆŠî–{“I‚ɕςí‚邯‚±‚ë‚Í‚ ‚è‚Ü‚¹‚ñ‚ªAV‚µ‚¢–â +@@@@‘è‚⌜ˆÄŽ–€‚ɑΉž‚·‚邽‚ß‚Éו”‚ł͈قȂ邩‚à‚µ‚ê‚Ü‚¹‚ñB + +@@@@Šeƒo[ƒWƒ‡ƒ“‚ÍAƒo[ƒWƒ‡ƒ“”Ô†‚É‚æ‚Á‚Ä‹æ•Ê‚µ‚Ü‚·BuƒvƒƒOƒ‰ƒ€v +@@@@’†‚É–{Žg—p‹–‘ø‚̃o[ƒWƒ‡ƒ“”Ô†‚ÌŽw’肪‚ ‚éꇂÍA‚»‚ÌŽw’肳‚ê +@@@@‚½ƒo[ƒWƒ‡ƒ“‚©A–”‚Í‚»‚ÌŒã‚É Free Software Foundation ‚©‚çŒö•\ +@@@@‚³‚ê‚Ä‚¢‚é‚¢‚¸‚ê‚©‚̃o[ƒWƒ‡ƒ“‚©‚ç‚P‚‚ð‘I‘ð‚µ‚ÄA‚»‚Ìð€‚Æð +@@@@Œ‚É]‚Á‚Ä‚­‚¾‚³‚¢BuƒvƒƒOƒ‰ƒ€v’†‚É–{Žg—p‹–‘ø‚̃o[ƒWƒ‡ƒ“”Ô +@@@@†‚ÌŽw’肪‚È‚¢ê‡‚ÍAFree Software Foundation ‚ªŒö•\‚µ‚½‚Ç‚Ì +@@@@ƒo[ƒWƒ‡ƒ“‚Å‚à‘I‘ð‚·‚é‚±‚Æ‚ª‚Å‚«‚Ü‚·B + +‚P‚PD@uƒvƒƒOƒ‰ƒ€v‚̈ꕔ‚ð”ЕzðŒ‚̈قȂ鑼‚̃tƒŠ[EƒvƒƒOƒ‰ƒ€‚É +@@@@‘g‚Ýž‚Ý‚½‚¢ê‡‚ÍA‚»‚ÌŠJ”­ŽÒ‚É‘–ʂŋ–‰Â‚ð‹‚߂Ă­‚¾‚³‚¢B +@@@@Free Software Foundation ‚ª’˜ìŒ ‚ðŽ‚Á‚Ä‚¢‚éƒ\ƒtƒgƒEƒFƒA‚ɂ +@@@@‚¢‚Ä‚ÍA Free Software Foundation ‚Ö‘–Ê‚ð’ño‚µ‚Ä‚­‚¾‚³‚¢B‚± +@@@@‚̂悤‚ÈꇂɑΉž‚·‚邽‚߂ɉäX‚Í—áŠO“Iˆ—‚ð‚·‚é‚±‚Æ‚à‚ ‚è‚Ü +@@@@‚·‚ªA‚»‚Ì”»’fŠî€‚ƂȂé‚Ì‚ÍAŽŸ‚Ì‚Q‚‚̖ڕW‚ÌŽÀŒ»‚ɇ’v‚·‚é‚© +@@@@”Û‚©‚Æ‚¢‚¤“_‚Å‚·B‘¦‚¿A‚P‚‚͉äX‚̃tƒŠ[Eƒ\ƒtƒgƒEƒFƒA‚Ì‘S‚Ä +@@@@‚Ì”h¶•¨‚ðƒtƒŠ[‚Èó‘Ԃɕۂ‚±‚Ƃł ‚èA‚à‚¤‚P‚‚̓\ƒtƒgƒEƒFƒA +@@@@‚Ì‹¤—L‚ÆÄ—˜—p‚Æ‚ðL‚­‘£i‚³‚¹‚邱‚Ƃł·B + + +–³•ÛØ +------ + +‚P‚QD@uƒvƒƒOƒ‰ƒ€v‚Í–³ž‚ÅŽg—p‹–‘ø‚³‚ê‚Ü‚·‚Ì‚ÅA“K—p–@—߂͈͓̔à‚ÅA +@@@@uƒvƒƒOƒ‰ƒ€v‚Ì•ÛØ‚ÍˆêØ‚ ‚è‚Ü‚¹‚ñB’˜ìŒ ŽÒ‚â‚»‚Ì‘¼‚Ì‘æŽOŽÒ +@@@@‚Í‘S‚­–³•ÛØ‚Åu‚»‚̂܂Üv‚Ìó‘Ô‚ÅAŠŽ‚ÂA–¾Ž¦‚©ˆÃ–Ù‚Å‚ ‚é‚©‚ð +@@@@–â‚킸ˆêØ‚Ì•ÛØ‚ð‚‚¯‚È‚¢‚Å’ñ‹Ÿ‚·‚é‚à‚̂Ƃµ‚Ü‚·B‚±‚±‚Å‚¢‚¤•Û +@@@@؂ƂÍAŽsê«‚â“Á’è–Ú“I“K‡«‚ɂ‚¢‚Ä‚ÌˆÃ–Ù‚Ì•ÛØ‚àŠÜ‚Ü‚ê‚Ü‚· +@@@@‚ªA‚»‚ê‚ÉŒÀ’肳‚ê‚é‚à‚̂ł͂ ‚è‚Ü‚¹‚ñBuƒvƒƒOƒ‰ƒ€v‚Ì•iŽ¿‚â +@@@@«”\‚ÉŠÖ‚·‚é‘S‚Ä‚ÌƒŠƒXƒN‚Í‚ ‚È‚½‚ª•‰‚¤‚à‚̂Ƃµ‚Ü‚·BuƒvƒƒOƒ‰ +@@@@ƒ€v‚ÉŒ‡Š×‚ª‚ ‚邯‚í‚©‚Á‚½ê‡A‚»‚ê‚É”º‚¤ˆê؂̔h¶”ï—p‚âC—E +@@@@’ù³‚É—v‚·‚é”ï—p‚Í‘S‚Ä‚ ‚È‚½‚Ì•‰’S‚Æ‚µ‚Ü‚·B + +‚P‚RD@“K—p–@—߂̒è‚ßA–”‚Í‘–ʂɂæ‚釈ӂª‚ ‚éꇂ𜂫A’˜ìŒ ŽÒ‚â +@@@@ã‹L‹–‘ø‚ðŽó‚¯‚ÄuƒvƒƒOƒ‰ƒ€v‚Ì•ÏXEĔЕz‚ðˆ×‚µ“¾‚鑿ŽOŽÒ‚ÍA +@@@@uƒvƒƒOƒ‰ƒ€v‚ðŽg—p‚µ‚½‚±‚ÆA‚Ü‚½‚ÍŽg—p‚Å‚«‚È‚¢‚±‚ƂɋNˆö‚·‚é +@@@@ˆê؂̑¹ŠQ‚ɂ‚¢‚ĉ½‚ç‚ÌÓ”C‚à•‰‚¢‚Ü‚¹‚ñB’˜ìŒ ŽÒ‚â‘O‹L‚Ì‘æŽO +@@@@ŽÒ‚ªA‚»‚̂悤‚È‘¹ŠQ‚Ì”­¶‚·‚é‰Â”\«‚ɂ‚¢‚Ä’m‚炳‚ê‚Ä‚¢‚½ê‡ +@@@@‚Å‚à“¯—l‚Å‚·B‚È‚¨A‚±‚±‚Å‚¢‚¤‘¹ŠQ‚ɂ͒Ê푹ŠQA“Á•Ê‘¹ŠQA‹ô”­ +@@@@‘¹ŠQAŠÔÚ‘¹ŠQ‚ªŠÜ‚Ü‚ê‚Ü‚·iƒf[ƒ^‚ÌÁޏA–”‚Í‚»‚̳Šm‚³‚Ì‘rޏA +@@@@‚ ‚È‚½‚â‘æŽOŽÒ‚ª”í‚Á‚½‘¹Ž¸A‘¼‚̃vƒƒOƒ‰ƒ€‚Ƃ̃Cƒ“ƒ^ƒtƒF[ƒX‚Ì +@@@@•s“K‡‰»A“™‚àŠÜ‚Ü‚ê‚Ü‚·‚ªA‚±‚ê‚ÉŒÀ’肳‚ê‚é‚à‚̂ł͂ ‚è‚Ü‚¹‚ñjB + + +@@@@ˆÈã + + +’ˆÓ +–– + +@‰p•¶•¶‘ (GNU General Public License) ‚𳎮•¶‘‚Æ‚·‚éB‚±‚̘a•¶•¶‘ +‚ٌ͕ìŽm‚̈ӌ©‚ðÌ‚è“ü‚ê‚ÄA‚Å‚«‚邾‚¯³Šm‚ɉp•¶•¶‘‚ð–|–󂵂½‚à‚̂ł  +‚邪A–@—¥“I‚É—LŒø‚ÈŒ_–ñ‘‚ł͂Ȃ¢B + +˜a•¶•¶‘Ž©‘Ì‚ÌÄ”z•z‚ÉŠÖ‚µ‚Ä +–––––––––––––– + +@‚¢‚©‚È‚é”}‘Ì‚Å‚àŽŸ‚ÌðŒ‚ª‚·‚ׂĖž‚½‚³‚ê‚Ä‚¢‚éꇂɌÀ‚èA–{˜a•¶•¶‘ +‚ð‚»‚Ì‚Ü‚Ü•¡ŽÊ‚µ”z•z‚·‚邱‚Æ‚ð‹–‰Â‚·‚éB‚Ü‚½A‚ ‚È‚½‚Í‘æŽOŽÒ‚ɑ΂µ‚Ä–{ +‹–‰Â’m‚Æ“¯ˆê‚Ì‹–‰Â‚ð—^‚¦‚éꇂɌÀ‚èAÄ”z•z‚·‚邱‚Æ‚ª‹–‰Â‚³‚ê‚Ä‚¢‚Ü +‚·B + +@@@EŽó—ÌA”z•z‚³‚ꂽƒRƒs[‚É’˜ìŒ •\ަ‚¨‚æ‚Ñ–{‹–‘ø’m‚ª‘O‚à‚Á‚ÄÚ +@@@@‚¹‚ç‚ê‚Ä‚¢‚邱‚ÆB@ + +@@@EƒRƒs[‚ÌŽó—ÌŽÒ‚ª‚³‚ç‚ÉÄ”z•z‚·‚éê‡A‚»‚Ì”z•zŽÒ‚ª–{’m‚Æ“¯‚¶ +@@@@‹–‰Â‚ð—^‚¦‚Ä‚¢‚邱‚ÆB + +@@@E˜a•¶•¶‘‚Ì–{•¶‚ð‰ü•Ï‚µ‚È‚¢‚±‚ÆB + + +------------------------------------------------------------------------------ + +‚ ‚È‚½‚ÌV‚µ‚¢ƒvƒƒOƒ‰ƒ€‚É‚±‚ê‚ç‚Ìð€‚ð“K—p‚·‚é•û–@ + + +@‚ ‚È‚½‚ªV‚µ‚­ƒvƒƒOƒ‰ƒ€‚ð쬂µA‚»‚ê‚ðŒö—p‚É‹Ÿ‚µ‚½‚¢ê‡‚ÍAƒvƒƒO +ƒ‰ƒ€‚ðƒtƒŠ[Eƒ\ƒtƒgƒEƒFƒA‚É‚µ‚ÄA‘S‚Ä‚ÌlX‚ªˆÈã‚ÌŠeð€‚É]‚Á‚Ä‚±‚ê +‚ðĔЕz‚â•ÏX‚ð‚·‚é‚±‚Æ‚ª‚Å‚«‚邿‚¤‚É‚·‚é‚Ì‚ªÅ—ǂ̕û–@‚Å‚·B + +@‚»‚¤‚·‚邽‚߂ɂÍAƒvƒƒOƒ‰ƒ€‚Ɉȉº‚Ì•\ަ‚ð‚µ‚Ä‚­‚¾‚³‚¢B‚»‚Ìê‡A–³ +•ÛØ‚Å‚ ‚邯‚¢‚¤‚±‚Æ‚ðÅ‚àŒø‰Ê“I‚É“`‚¦‚邽‚ß‚ÉAƒ\[ƒXEƒtƒ@ƒCƒ‹‚Ì–`“ª +‚É‚»‚Ì‘S•¶‚ð•\ަ‚·‚ê‚ÎÅ‚àˆÀ‘S‚Å‚·‚ªA‚»‚Ì‘¼‚Ì•û–@‚Å•\ަ‚·‚éꇂłàA +u’˜ìŒ •\ަv‚Æ‘S•¶‚ð“Ç‚Ýo‚·ˆ×‚̃AƒhƒŒƒX‚ւ̃|ƒCƒ“ƒ^‚¾‚¯‚̓tƒ@ƒCƒ‹ã +‚É•\ަ‚µ‚Ä‚¨‚¢‚Ä‚­‚¾‚³‚¢B + +@@ƒƒvƒƒOƒ‰ƒ€–¼‚Ƃǂñ‚È“®ì‚ð‚·‚é‚à‚Ì‚©‚ɂ‚¢‚Ă̊ȒP‚Èà–¾‚Ìs„ +@@@‚b‚‚‚™‚’‚‰‚‡‚ˆ‚”i‚bj@‚P‚X››”NAƒ’˜ìŒ ŽÒ–¼„ + +@@@–{ƒvƒƒOƒ‰ƒ€‚̓tƒŠ[Eƒ\ƒtƒgƒEƒFƒA‚Å‚·B‚ ‚È‚½‚ÍAFree Software +@@@Foundation ‚ªŒö•\‚µ‚½GNU ˆê”ÊŒö—LŽg—p‹–‘ø‚Ìuƒo[ƒWƒ‡ƒ“‚Qvˆ½‚¢ +@@@‚Í‚»‚êˆÈ~‚ÌŠeƒo[ƒWƒ‡ƒ“‚Ì’†‚©‚ç‚¢‚¸‚ê‚©‚ð‘I‘ð‚µA‚»‚̃o[ƒWƒ‡ƒ“ +@@@‚ª’è‚ß‚éð€‚É]‚Á‚Ä–{ƒvƒƒOƒ‰ƒ€‚ðĔЕz‚Ü‚½‚Í•ÏX‚·‚邱‚Æ‚ª‚Å‚« +@@@‚Ü‚·B + +@@@–{ƒvƒƒOƒ‰ƒ€‚Í—L—p‚Ƃ͎v‚¢‚Ü‚·‚ªA”Еz‚É‚ ‚½‚Á‚Ä‚ÍAŽsê«‹y‚Ñ“Á +@@@’è–Ú“I“K‡«‚ɂ‚¢‚Ä‚ÌˆÃ–Ù‚Ì•ÛØ‚ðŠÜ‚ß‚ÄA‚¢‚©‚È‚é•ÛØ‚às‚È‚¢‚Ü +@@@‚¹‚ñBÚׂɂ‚¢‚Ä‚ÍGNU ˆê”ÊŒö—LŽg—p‹–‘ø‘‚ð‚¨“Ç‚Ý‚­‚¾‚³‚¢B + +@@@‚ ‚È‚½‚ÍA–{ƒvƒƒOƒ‰ƒ€‚ƈê‚ÉGNU ˆê”ÊŒö—LŽg—p‹–‘ø‚ÌŽÊ‚µ‚ðŽó‚¯Žæ‚Á +@@@‚Ä‚¢‚é‚Í‚¸‚Å‚·B‚»‚¤‚łȂ¢ê‡‚ÍAFree Software Foundation, Inc., +@@@675 Mass Ave, Cambridge, MA 02139, USA * ‚֎莆‚ð‘‚¢‚Ä‚­‚¾‚³‚¢B + + ---------------------------------------------------------------------- + * y’ˆÓz Œ»ÝA‚±‚̃o[ƒWƒ‡ƒ“2‚Ì”­sŽÒ(FSF)ZŠ‚ÍA³Ž®‚ÉV + ‚µ‚¢ZŠ‚Ì 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA ‚ɕςí‚Á‚Ä‚¢‚éB + ---------------------------------------------------------------------- + +@@@ + + +@‚Ü‚½Aƒ†[ƒU‚ª“dŽqƒƒCƒ‹‚â‘M‚Å‚ ‚È‚½‚ƘA—‚ð‚Æ‚é•û–@‚ɂ‚¢‚Ä‚Ìî•ñ +‚à‘‚«“Y‚¦‚Ä‚­‚¾‚³‚¢B + +@ƒvƒƒOƒ‰ƒ€‚ª‘Θb“I‚É“®ì‚·‚éꇂÍA‘Θbƒ‚[ƒh‚Å‹N“®‚µ‚½Žž‚ÉŽŸ‚̂悤 +‚È’Z‚¢’m•¶‚ª•\ަ‚³‚ê‚邿‚¤‚É‚µ‚Ä‚­‚¾‚³‚¢B + +@@@‚f‚Ž‚‚‚‚–‚‰‚“‚‰‚‚Ž@ƒo[ƒWƒ‡ƒ“‚U‚XA‚b‚‚‚™‚’‚‰‚‡‚ˆ‚”i‚bj‚P‚X››”N ƒ’˜ìŒ ŽÒ–¼„ + +@@@Gnomovision ‚ÍŠ®‘S‚É–³•ÛØ‚Å‚·BÚ×‚Í show w ‚ƃ^ƒCƒv‚µ‚Ä‚­‚¾‚³ +@@@‚¢B‚±‚ê‚̓tƒŠ[Eƒ\ƒtƒgƒEƒFƒA‚Ȃ̂ÅA“Á’è‚ÌðŒ‚̉º‚Å‚±‚ê‚ðĔР+@@@•z‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·BÚ×‚Í show c ‚ƃ^ƒCƒv‚µ‚Ä‚­‚¾‚³‚¢B + + +@ã‹L‚Ìshow w ‚âshow c ‚ÍŠeXA–{ˆê”ÊŒö—LŽg—p‹–‘ø‚ÌŠÖ˜A‚·‚é•”•ª‚ð•\ަ +‚·‚éƒRƒ}ƒ“ƒh‚ðŽw‚µ‚Ü‚·B‚à‚¿‚ë‚ñA‚ ‚È‚½‚ªŽg‚¤‚±‚ê‚ç‚̃Rƒ}ƒ“ƒh‚Íshow w +‚âshow c ‚Æ‚¢‚Á‚½ŒÄ‚Ñ–¼‚łȂ­‚Ä‚à\‚¢‚Ü‚¹‚ñB‚³‚ç‚ÉA‚»‚ê‚ç‚̃Rƒ}ƒ“ƒh +‚Í‚ ‚È‚½‚̃vƒƒOƒ‰ƒ€‚ɇ‚킹‚éˆ×‚ÉAƒ}ƒEƒX‚ŃNƒŠƒbƒN‚µ‚½‚胃jƒ…[Œ`Ž® +‚É‚·‚邱‚Æ‚à‚Å‚«‚Ü‚·B + +@‚Ü‚½A•K—v‚Æ”F‚ß‚½ê‡‚É‚ÍA‚ ‚È‚½‚̌ق¢Žå(‚ ‚È‚½‚ªƒvƒƒOƒ‰ƒ}‚Æ‚µ‚Ä +“­‚¢‚Ä‚¢‚éê‡) ‚âÝЂ·‚éŠwZ‚©‚çA‚»‚̃vƒƒOƒ‰ƒ€‚ɑ΂·‚éu’˜ìŒ •úŠüv +‚ð”F‚ß‚½–¼“ü‚è‚Ì‘–Ê‚ð“üŽè‚µ‚Ä‚­‚¾‚³‚¢B‚±‚±‚É‚»‚Ì•¶—á‚ðÚ‚¹‚Ü‚·B–¼ +‘O‚͕ς¦‚Ä‚­‚¾‚³‚¢B + + +@@@Yoyodyne, Inc. ‚ÍAJames Hacker ‚ªŠJ”­‚µ‚½ƒvƒƒOƒ‰ƒ€ +@@@`Gnomovision' (ƒRƒ“ƒpƒCƒ‰‚ɂ‚Ȃ°‚éƒvƒƒOƒ‰ƒ€) ‚ɂ‚¢‚Ă̒˜ìŒ  +@@@–@ã‚Ì‘S‚Ă̌ —˜‚ð•úŠü‚·‚éB + +@@@ƒ‚s‚™@‚b‚‚‚Ž@‚Ì–¼„C@‚P@‚`‚‚’‚‰‚Œ@‚P‚X‚W‚X +@@@‚s‚™@‚b‚‚‚ŽC@•›ŽÐ’· + + +@–{ˆê”ÊŒö—LŽg—p‹–‘ø‚ÍA‚ ‚È‚½‚̃vƒƒOƒ‰ƒ€‚ðàŽYŒ ‚Ì‘ÎۂƂȂÁ‚Ä‚¢‚鑼 +‚̃vƒƒOƒ‰ƒ€‚É‘g‚Ýž‚Þ‚±‚Ƃ͔F‚߂Ă¢‚Ü‚¹‚ñB‚ ‚È‚½‚̃vƒƒOƒ‰ƒ€‚ªƒTƒuƒ‹[ +ƒ`ƒ“Eƒ‰ƒCƒuƒ‰ƒŠ‚Å‚ ‚Á‚ÄA‚ ‚È‚½‚ª‚»‚̃‰ƒCƒuƒ‰ƒŠ‚ðàŽYŒ ‚Ì‘ÎۂƂȂÁ‚Ä +‚¢‚鑼‚̃AƒvƒŠƒP[ƒVƒ‡ƒ“‚ÆƒŠƒ“ƒN‚³‚¹‚邱‚Ƃɂæ‚Á‚ÄA‚³‚ç‚É—L—p‚È‚à‚Ì‚É +‚µ‚悤‚Æ‚·‚éꇂɂÍA–{Žg—p‹–‘ø‘‚Ì‘ã‚í‚è‚ÉAGNU ƒ‰ƒCƒuƒ‰ƒŠˆê”ÊŒö—LŽg +—p‹–‘ø‘‚É]‚Á‚Ä‚­‚¾‚³‚¢B + +------------------------------------------------------------------------------ + + + Index: apps/plugins/infones/K6502_rw.h =================================================================== --- apps/plugins/infones/K6502_rw.h (revision 0) +++ apps/plugins/infones/K6502_rw.h (revision 0) @@ -0,0 +1,501 @@ +/*===================================================================*/ +/* */ +/* K6502_RW.h : 6502 Reading/Writing Operation for NES */ +/* This file is included in K6502.cpp */ +/* */ +/* 2000/5/23 InfoNES Project ( based on pNesX ) */ +/* */ +/*===================================================================*/ + +#ifndef K6502_RW_H_INCLUDED +#define K6502_RW_H_INCLUDED + +/*-------------------------------------------------------------------*/ +/* Include files */ +/*-------------------------------------------------------------------*/ + +#include "InfoNES.h" +#include "InfoNES_System.h" +#include "InfoNES_pAPU.h" + +/*===================================================================*/ +/* */ +/* K6502_ReadZp() : Reading from the zero page */ +/* */ +/*===================================================================*/ +static inline BYTE K6502_ReadZp( BYTE byAddr ) +{ +/* + * Reading from the zero page + * + * Parameters + * BYTE byAddr (Read) + * An address inside the zero page + * + * Return values + * Read Data + */ + + return RAM[ byAddr ]; +} + +/*===================================================================*/ +/* */ +/* K6502_Read() : Reading operation */ +/* */ +/*===================================================================*/ +static inline BYTE K6502_Read( WORD wAddr ) +{ +/* + * Reading operation + * + * Parameters + * WORD wAddr (Read) + * Address to read + * + * Return values + * Read data + * + * Remarks + * 0x0000 - 0x1fff RAM ( 0x800 - 0x1fff is mirror of 0x0 - 0x7ff ) + * 0x2000 - 0x3fff PPU + * 0x4000 - 0x5fff Sound + * 0x6000 - 0x7fff SRAM ( Battery Backed ) + * 0x8000 - 0xffff ROM + * + */ + BYTE byRet; + + switch ( wAddr & 0xe000 ) + { + case 0x0000: /* RAM */ + return RAM[ wAddr & 0x7ff ]; + + case 0x2000: /* PPU */ + if ( ( wAddr & 0x7 ) == 0x7 ) /* PPU Memory */ + { + WORD addr = PPU_Addr & 0x3fff; + + // Set return value; + byRet = PPU_R7; + + // Increment PPU Address + PPU_Addr += PPU_Increment; + + // Read PPU Memory + PPU_R7 = PPUBANK[ addr >> 10 ][ addr & 0x3ff ]; + + return byRet; + } + else + if ( ( wAddr & 0x7 ) == 0x4 ) /* SPR_RAM I/O Register */ + { + return SPRRAM[ PPU_R3++ ]; + } + else + if ( ( wAddr & 0x7 ) == 0x2 ) /* PPU Status */ + { + // Set return value + byRet = PPU_R2; + +#if 0 + // Reset a V-Blank flag + PPU_R2 &= ~R2_IN_VBLANK; +#endif + + // Reset address latch + PPU_Latch_Flag = 0; + + // Make a Nametable 0 in V-Blank + if ( PPU_Scanline >= SCAN_VBLANK_START && !( PPU_R0 & R0_NMI_VB ) ) + { + PPU_R0 &= ~R0_NAME_ADDR; + PPU_NameTableBank = NAME_TABLE0; + } + return byRet; + } + else /* $2000, $2001, $2003, $2005, $2006 */ + { + return PPU_R7; + } + break; + + case 0x4000: /* Sound */ + if ( wAddr == 0x4014 ) + { + return wAddr & 0xff; + } + else + if ( wAddr == 0x4015 ) + { + // APU control + byRet = APU_Reg[ 0x4015 ]; + if ( ApuC1Atl > 0 ) byRet |= (1<<0); + if ( ApuC2Atl > 0 ) byRet |= (1<<1); + if ( !ApuC3Holdnote ) { + if ( ApuC3Atl > 0 ) byRet |= (1<<2); + } else { + if ( ApuC3Llc > 0 ) byRet |= (1<<2); + } + if ( ApuC4Atl > 0 ) byRet |= (1<<3); + + // FrameIRQ + APU_Reg[ 0x4015 ] &= ~0x40; + return byRet; + } + else + if ( wAddr == 0x4016 ) + { + // Set Joypad1 data + byRet = (BYTE)( ( PAD1_Latch >> PAD1_Bit ) & 1 ) | 0x40; + PAD1_Bit = ( PAD1_Bit == 23 ) ? 0 : ( PAD1_Bit + 1 ); + return byRet; + } + else + if ( wAddr == 0x4017 ) + { + // Set Joypad2 data + byRet = (BYTE)( ( PAD2_Latch >> PAD2_Bit ) & 1 ) | 0x40; + PAD2_Bit = ( PAD2_Bit == 23 ) ? 0 : ( PAD2_Bit + 1 ); + return byRet; + } + else + { + /* Return Mapper Register*/ + return MapperReadApu( wAddr ); + } + break; + // The other sound registers are not readable. + + case 0x6000: /* SRAM */ + if ( ROM_SRAM ) + { + return SRAM[ wAddr & 0x1fff ]; + } else { /* SRAM BANK */ + return SRAMBANK[ wAddr & 0x1fff ]; + } + + case 0x8000: /* ROM BANK 0 */ + return ROMBANK0[ wAddr & 0x1fff ]; + + case 0xa000: /* ROM BANK 1 */ + return ROMBANK1[ wAddr & 0x1fff ]; + + case 0xc000: /* ROM BANK 2 */ + return ROMBANK2[ wAddr & 0x1fff ]; + + case 0xe000: /* ROM BANK 3 */ + return ROMBANK3[ wAddr & 0x1fff ]; + } + + return ( wAddr >> 8 ); /* when a register is not readable the upper half + address is returned. */ +} + +/*===================================================================*/ +/* */ +/* K6502_Write() : Writing operation */ +/* */ +/*===================================================================*/ +static inline void K6502_Write( WORD wAddr, BYTE byData ) +{ +/* + * Writing operation + * + * Parameters + * WORD wAddr (Read) + * Address to write + * + * BYTE byData (Read) + * Data to write + * + * Remarks + * 0x0000 - 0x1fff RAM ( 0x800 - 0x1fff is mirror of 0x0 - 0x7ff ) + * 0x2000 - 0x3fff PPU + * 0x4000 - 0x5fff Sound + * 0x6000 - 0x7fff SRAM ( Battery Backed ) + * 0x8000 - 0xffff ROM + * + */ + + switch ( wAddr & 0xe000 ) + { + case 0x0000: /* RAM */ + RAM[ wAddr & 0x7ff ] = byData; + break; + + case 0x2000: /* PPU */ + switch ( wAddr & 0x7 ) + { + case 0: /* 0x2000 */ + PPU_R0 = byData; + PPU_Increment = ( PPU_R0 & R0_INC_ADDR ) ? 32 : 1; + PPU_NameTableBank = NAME_TABLE0 + ( PPU_R0 & R0_NAME_ADDR ); + PPU_BG_Base = ( PPU_R0 & R0_BG_ADDR ) ? ChrBuf + 256 * 64 : ChrBuf; + PPU_SP_Base = ( PPU_R0 & R0_SP_ADDR ) ? ChrBuf + 256 * 64 : ChrBuf; + PPU_SP_Height = ( PPU_R0 & R0_SP_SIZE ) ? 16 : 8; + + // Account for Loopy's scrolling discoveries + PPU_Temp = ( PPU_Temp & 0xF3FF ) | ( ( ( (WORD)byData ) & 0x0003 ) << 10 ); + break; + + case 1: /* 0x2001 */ + PPU_R1 = byData; + break; + + case 2: /* 0x2002 */ +#if 0 + PPU_R2 = byData; // 0x2002 is not writable +#endif + break; + + case 3: /* 0x2003 */ + // Sprite RAM Address + PPU_R3 = byData; + break; + + case 4: /* 0x2004 */ + // Write data to Sprite RAM + SPRRAM[ PPU_R3++ ] = byData; + break; + + case 5: /* 0x2005 */ + // Set Scroll Register + if ( PPU_Latch_Flag ) + { + // V-Scroll Register + PPU_Scr_V_Next = ( byData > 239 ) ? byData - 240 : byData; + if ( byData > 239 ) PPU_NameTableBank ^= NAME_TABLE_V_MASK; + PPU_Scr_V_Byte_Next = PPU_Scr_V_Next >> 3; + PPU_Scr_V_Bit_Next = PPU_Scr_V_Next & 7; + + // Added : more Loopy Stuff + PPU_Temp = ( PPU_Temp & 0xFC1F ) | ( ( ( (WORD)byData ) & 0xF8 ) << 2); + PPU_Temp = ( PPU_Temp & 0x8FFF ) | ( ( ( (WORD)byData ) & 0x07 ) << 12); + } + else + { + // H-Scroll Register + PPU_Scr_H_Next = byData; + PPU_Scr_H_Byte_Next = PPU_Scr_H_Next >> 3; + PPU_Scr_H_Bit_Next = PPU_Scr_H_Next & 7; + + // Added : more Loopy Stuff + PPU_Temp = ( PPU_Temp & 0xFFE0 ) | ( ( ( (WORD)byData ) & 0xF8 ) >> 3 ); + } + PPU_Latch_Flag ^= 1; + break; + + case 6: /* 0x2006 */ + // Set PPU Address + if ( PPU_Latch_Flag ) + { + /* Low */ +#if 0 + PPU_Addr = ( PPU_Addr & 0xff00 ) | ( (WORD)byData ); +#else + PPU_Temp = ( PPU_Temp & 0xFF00 ) | ( ( (WORD)byData ) & 0x00FF); + PPU_Addr = PPU_Temp; +#endif + if ( !( PPU_R2 & R2_IN_VBLANK ) ) { + InfoNES_SetupScr(); + } + } + else + { + /* High */ +#if 0 + PPU_Addr = ( PPU_Addr & 0x00ff ) | ( (WORD)( byData & 0x3f ) << 8 ); + InfoNES_SetupScr(); +#else + PPU_Temp = ( PPU_Temp & 0x00FF ) | ( ( ((WORD)byData) & 0x003F ) << 8 ); +#endif + } + PPU_Latch_Flag ^= 1; + break; + + case 7: /* 0x2007 */ + { + WORD addr = PPU_Addr; + + // Increment PPU Address + PPU_Addr += PPU_Increment; + addr &= 0x3fff; + + // Write to PPU Memory + if ( addr < 0x2000 && byVramWriteEnable ) + { + // Pattern Data + ChrBufUpdate |= ( 1 << ( addr >> 10 ) ); + PPUBANK[ addr >> 10 ][ addr & 0x3ff ] = byData; + } + else + if ( addr < 0x3f00 ) /* 0x2000 - 0x3eff */ + { + // Name Table and mirror + PPUBANK[ addr >> 10 ][ addr & 0x3ff ] = byData; + PPUBANK[ ( addr ^ 0x1000 ) >> 10 ][ addr & 0x3ff ] = byData; + } + else + if ( !( addr & 0xf ) ) /* 0x3f00 or 0x3f10 */ + { + // Palette mirror + PPURAM[ 0x3f10 ] = PPURAM[ 0x3f14 ] = PPURAM[ 0x3f18 ] = PPURAM[ 0x3f1c ] = + PPURAM[ 0x3f00 ] = PPURAM[ 0x3f04 ] = PPURAM[ 0x3f08 ] = PPURAM[ 0x3f0c ] = byData; + PalTable[ 0x00 ] = PalTable[ 0x04 ] = PalTable[ 0x08 ] = PalTable[ 0x0c ] = + PalTable[ 0x10 ] = PalTable[ 0x14 ] = PalTable[ 0x18 ] = PalTable[ 0x1c ] = NesPalette[ byData ]; + //PalTable[ 0x10 ] = PalTable[ 0x14 ] = PalTable[ 0x18 ] = PalTable[ 0x1c ] = NesPalette[ byData ] | 0x8000; + } + else + if ( addr & 3 ) + { + // Palette + PPURAM[ addr ] = byData; + PalTable[ addr & 0x1f ] = NesPalette[ byData ]; + } + } + break; + } + break; + + case 0x4000: /* Sound */ + switch ( wAddr & 0x1f ) + { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x0e: + case 0x0f: + case 0x10: + case 0x11: + case 0x12: + case 0x13: + // Call Function corresponding to Sound Registers + if ( !APU_Mute ) + pAPUSoundRegs[ wAddr & 0x1f ]( wAddr, byData ); + break; + + case 0x14: /* 0x4014 */ + // Sprite DMA + switch ( byData >> 5 ) + { + case 0x0: /* RAM */ + InfoNES_MemoryCopy( SPRRAM, &RAM[ ( (WORD)byData << 8 ) & 0x7ff ], SPRRAM_SIZE ); + break; + + case 0x3: /* SRAM */ + InfoNES_MemoryCopy( SPRRAM, &SRAM[ ( (WORD)byData << 8 ) & 0x1fff ], SPRRAM_SIZE ); + break; + + case 0x4: /* ROM BANK 0 */ + InfoNES_MemoryCopy( SPRRAM, &ROMBANK0[ ( (WORD)byData << 8 ) & 0x1fff ], SPRRAM_SIZE ); + break; + + case 0x5: /* ROM BANK 1 */ + InfoNES_MemoryCopy( SPRRAM, &ROMBANK1[ ( (WORD)byData << 8 ) & 0x1fff ], SPRRAM_SIZE ); + break; + + case 0x6: /* ROM BANK 2 */ + InfoNES_MemoryCopy( SPRRAM, &ROMBANK2[ ( (WORD)byData << 8 ) & 0x1fff ], SPRRAM_SIZE ); + break; + + case 0x7: /* ROM BANK 3 */ + InfoNES_MemoryCopy( SPRRAM, &ROMBANK3[ ( (WORD)byData << 8 ) & 0x1fff ], SPRRAM_SIZE ); + break; + } + break; + + case 0x15: /* 0x4015 */ + InfoNES_pAPUWriteControl( wAddr, byData ); +#if 0 + /* Unknown */ + if ( byData & 0x10 ) + { + byData &= ~0x80; + } +#endif + break; + + case 0x16: /* 0x4016 */ + // For VS-Unisystem + MapperApu( wAddr, byData ); + // Reset joypad + if ( !( APU_Reg[ 0x16 ] & 1 ) && ( byData & 1 ) ) + { + PAD1_Bit = 0; + PAD2_Bit = 0; + } + break; + + case 0x17: /* 0x4017 */ + // Frame IRQ + FrameStep = 0; + if ( !( byData & 0xc0 ) ) + { + FrameIRQ_Enable = 1; + } else { + FrameIRQ_Enable = 0; + } + break; + } + + if ( wAddr <= 0x4017 ) + { + /* Write to APU Register */ + APU_Reg[ wAddr & 0x1f ] = byData; + } + else + { + /* Write to APU */ + MapperApu( wAddr, byData ); + } + break; + + case 0x6000: /* SRAM */ + SRAM[ wAddr & 0x1fff ] = byData; + + /* Write to SRAM, when no SRAM */ + if ( !ROM_SRAM ) + { + MapperSram( wAddr, byData ); + } + break; + + case 0x8000: /* ROM BANK 0 */ + case 0xa000: /* ROM BANK 1 */ + case 0xc000: /* ROM BANK 2 */ + case 0xe000: /* ROM BANK 3 */ + // Write to Mapper + MapperWrite( wAddr, byData ); + break; + } +} + +// Reading/Writing operation (WORD version) +static inline WORD K6502_ReadW( WORD wAddr ){ return K6502_Read( wAddr ) | (WORD)K6502_Read( wAddr + 1 ) << 8; }; +static inline void K6502_WriteW( WORD wAddr, WORD wData ){ K6502_Write( wAddr, wData & 0xff ); K6502_Write( wAddr + 1, wData >> 8 ); }; +static inline WORD K6502_ReadZpW( BYTE byAddr ){ return K6502_ReadZp( byAddr ) | ( K6502_ReadZp( byAddr + 1 ) << 8 ); }; + +// 6502's indirect absolute jmp(opcode: 6C) has a bug (added at 01/08/15 ) +static inline WORD K6502_ReadW2( WORD wAddr ) +{ + if ( 0x00ff == ( wAddr & 0x00ff ) ) + { + return K6502_Read( wAddr ) | (WORD)K6502_Read( wAddr - 0x00ff ) << 8; + } else { + return K6502_Read( wAddr ) | (WORD)K6502_Read( wAddr + 1 ) << 8; + } +} + +#endif /* !K6502_RW_H_INCLUDED */ Index: apps/plugins/infones/InfoNES_pAPU.c =================================================================== --- apps/plugins/infones/InfoNES_pAPU.c (revision 0) +++ apps/plugins/infones/InfoNES_pAPU.c (revision 0) @@ -0,0 +1,1078 @@ +/*===================================================================*/ +/* */ +/* InfoNES_pAPU.cpp : InfoNES Sound Emulation Function */ +/* */ +/* 2000/05/29 InfoNES Project ( based on DarcNES and NesterJ ) */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Include files */ +/*-------------------------------------------------------------------*/ +#include "K6502.h" +#include "K6502_rw.h" +#include "InfoNES_System.h" +#include "InfoNES_pAPU.h" + +/*-------------------------------------------------------------------*/ +/* APU Event resources */ +/*-------------------------------------------------------------------*/ + +struct ApuEvent_t *ApuEventQueue; +int cur_event; +WORD entertime; + +/*-------------------------------------------------------------------*/ +/* APU Register Write Functions */ +/*-------------------------------------------------------------------*/ + +#define APU_WRITEFUNC(name, evtype) \ +void ApuWrite##name(WORD addr, BYTE value) \ +{ \ + ApuEventQueue[cur_event].time = entertime - g_wPassedClocks; \ + ApuEventQueue[cur_event].type = APUET_W_##evtype; \ + ApuEventQueue[cur_event].data = value; \ + cur_event++; \ +} + +APU_WRITEFUNC(C1a, C1A); +APU_WRITEFUNC(C1b, C1B); +APU_WRITEFUNC(C1c, C1C); +APU_WRITEFUNC(C1d, C1D); + +APU_WRITEFUNC(C2a, C2A); +APU_WRITEFUNC(C2b, C2B); +APU_WRITEFUNC(C2c, C2C); +APU_WRITEFUNC(C2d, C2D); + +APU_WRITEFUNC(C3a, C3A); +APU_WRITEFUNC(C3b, C3B); +APU_WRITEFUNC(C3c, C3C); +APU_WRITEFUNC(C3d, C3D); + +APU_WRITEFUNC(C4a, C4A); +APU_WRITEFUNC(C4b, C4B); +APU_WRITEFUNC(C4c, C4C); +APU_WRITEFUNC(C4d, C4D); + +APU_WRITEFUNC(C5a, C5A); +APU_WRITEFUNC(C5b, C5B); +APU_WRITEFUNC(C5c, C5C); +APU_WRITEFUNC(C5d, C5D); + +APU_WRITEFUNC(Control, CTRL); + +ApuWritefunc pAPUSoundRegs[20] = +{ + ApuWriteC1a, + ApuWriteC1b, + ApuWriteC1c, + ApuWriteC1d, + ApuWriteC2a, + ApuWriteC2b, + ApuWriteC2c, + ApuWriteC2d, + ApuWriteC3a, + ApuWriteC3b, + ApuWriteC3c, + ApuWriteC3d, + ApuWriteC4a, + ApuWriteC4b, + ApuWriteC4c, + ApuWriteC4d, + ApuWriteC5a, + ApuWriteC5b, + ApuWriteC5c, + ApuWriteC5d, +}; + +/*-------------------------------------------------------------------*/ +/* APU resources */ +/*-------------------------------------------------------------------*/ + +BYTE wave_buffers[5][735]; /* 44100 / 60 = 735 samples per sync */ + +BYTE ApuCtrl; +BYTE ApuCtrlNew; + +/*-------------------------------------------------------------------*/ +/* APU Quality resources */ +/*-------------------------------------------------------------------*/ + +int ApuQuality; + +DWORD ApuPulseMagic; +DWORD ApuTriangleMagic; +DWORD ApuNoiseMagic; +unsigned int ApuSamplesPerSync; +unsigned int ApuCyclesPerSample; +unsigned int ApuSampleRate; +DWORD ApuCycleRate; + +struct ApuQualityData_t +{ + DWORD pulse_magic; + DWORD triangle_magic; + DWORD noise_magic; + unsigned int samples_per_sync; + unsigned int cycles_per_sample; + unsigned int sample_rate; + DWORD cycle_rate; +} ApuQual[] = { + { 0xa2567000, 0xa2567000, 0xa2567000, 183, 164, 11025, 1062658 }, + { 0x512b3800, 0x512b3800, 0x512b3800, 367, 82, 22050, 531329 }, + { 0x289d9c00, 0x289d9c00, 0x289d9c00, 735, 41, 44100, 265664 }, +}; + +/*-------------------------------------------------------------------*/ +/* Rectangle Wave #1 resources */ +/*-------------------------------------------------------------------*/ +BYTE ApuC1a, ApuC1b, ApuC1c, ApuC1d; + +BYTE* ApuC1Wave; +DWORD ApuC1Skip; +DWORD ApuC1Index; +DWORD ApuC1EnvPhase; +BYTE ApuC1EnvVol; +BYTE ApuC1Atl; +DWORD ApuC1SweepPhase; +DWORD ApuC1Freq; + +/*-------------------------------------------------------------------*/ +/* Rectangle Wave #2 resources */ +/*-------------------------------------------------------------------*/ +BYTE ApuC2a, ApuC2b, ApuC2c, ApuC2d; + +BYTE* ApuC2Wave; +DWORD ApuC2Skip; +DWORD ApuC2Index; +DWORD ApuC2EnvPhase; +BYTE ApuC2EnvVol; +BYTE ApuC2Atl; +DWORD ApuC2SweepPhase; +DWORD ApuC2Freq; + +/*-------------------------------------------------------------------*/ +/* Triangle Wave resources */ +/*-------------------------------------------------------------------*/ +BYTE ApuC3a, ApuC3b, ApuC3c, ApuC3d; + +DWORD ApuC3Skip; +DWORD ApuC3Index; +BYTE ApuC3Atl; +DWORD ApuC3Llc; /* Linear Length Counter */ +BYTE ApuC3WriteLatency; +BYTE ApuC3CounterStarted; + +/*-------------------------------------------------------------------*/ +/* Noise resources */ +/*-------------------------------------------------------------------*/ +BYTE ApuC4a, ApuC4b, ApuC4c, ApuC4d; + +DWORD ApuC4Sr; /* Shift register */ +DWORD ApuC4Fdc; /* Frequency divide counter */ +DWORD ApuC4Skip; +DWORD ApuC4Index; +BYTE ApuC4Atl; +BYTE ApuC4EnvVol; +DWORD ApuC4EnvPhase; + +/*-------------------------------------------------------------------*/ +/* DPCM resources */ +/*-------------------------------------------------------------------*/ +BYTE ApuC5Reg[4]; +BYTE ApuC5Enable; +BYTE ApuC5Looping; +BYTE ApuC5CurByte; +BYTE ApuC5DpcmValue; + +int ApuC5Freq; +int ApuC5Phaseacc; + +WORD ApuC5Address, ApuC5CacheAddr; +int ApuC5DmaLength, ApuC5CacheDmaLength; + +/*-------------------------------------------------------------------*/ +/* Wave Data */ +/*-------------------------------------------------------------------*/ +BYTE pulse_25[0x20] = { + 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, +}; + +BYTE pulse_50[0x20] = { + 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, +}; + +BYTE pulse_75[0x20] = { + 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, +}; + +BYTE pulse_87[0x20] = { + 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, + 0x00, 0x00, 0x00, 0x00, +}; + +BYTE triangle_50[0x20] = { + 0x00, 0x10, 0x20, 0x30, + 0x40, 0x50, 0x60, 0x70, + 0x80, 0x90, 0xa0, 0xb0, + 0xc0, 0xd0, 0xe0, 0xf0, + 0xff, 0xef, 0xdf, 0xcf, + 0xbf, 0xaf, 0x9f, 0x8f, + 0x7f, 0x6f, 0x5f, 0x4f, + 0x3f, 0x2f, 0x1f, 0x0f, +}; + +BYTE *pulse_waves[4] = { + pulse_87, pulse_75, pulse_50, pulse_25, +}; + +/*-------------------------------------------------------------------*/ +/* Active Time Left Data */ +/*-------------------------------------------------------------------*/ +BYTE ApuAtl[0x20] = +{ + 5, 127, 10, 1, 19, 2, 40, 3, 80, 4, 30, 5, 7, 6, 13, 7, + 6, 8, 12, 9, 24, 10, 48, 11, 96, 12, 36, 13, 8, 14, 16, 15, +}; + +/*-------------------------------------------------------------------*/ +/* Frequency Limit of Rectangle Channels */ +/*-------------------------------------------------------------------*/ +WORD ApuFreqLimit[8] = +{ + 0x3FF, 0x555, 0x666, 0x71C, 0x787, 0x7C1, 0x7E0, 0x7F0 +}; + +/*-------------------------------------------------------------------*/ +/* Noise Frequency Lookup Table */ +/*-------------------------------------------------------------------*/ +DWORD ApuNoiseFreq[ 16 ] = +{ + 4, 8, 16, 32, 64, 96, 128, 160, + 202, 254, 380, 508, 762, 1016, 2034, 4068 +}; + +/*-------------------------------------------------------------------*/ +/* DMC Transfer Clocks Table */ +/*-------------------------------------------------------------------*/ +DWORD ApuDpcmCycles[ 16 ] = +{ + 428, 380, 340, 320, 286, 254, 226, 214, + 190, 160, 142, 128, 106, 85, 72, 54 +}; + +/*===================================================================*/ +/* */ +/* ApuRenderingWave1() : Rendering Rectangular Wave #1 */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Write registers of rectangular wave #1 */ +/*-------------------------------------------------------------------*/ + +int ApuWriteWave1( int cycles, int event ) +{ + /* APU Reg Write Event */ + while ( ( event < cur_event ) && ( ApuEventQueue[event].time < cycles ) ) + { + if ( ( ApuEventQueue[event].type & APUET_MASK ) == APUET_C1 ) + { + switch ( ApuEventQueue[event].type & 0x03 ) + { + case 0: + ApuC1a = ApuEventQueue[event].data; + ApuC1Wave = pulse_waves[ ApuC1DutyCycle >> 6 ]; + break; + + case 1: + ApuC1b = ApuEventQueue[event].data; + break; + + case 2: + ApuC1c = ApuEventQueue[event].data; + ApuC1Freq = ( ( ( (WORD)ApuC1d & 0x07 ) << 8 ) + ApuC1c ); + ApuC1Atl = ApuAtl[ ( ApuC1d & 0xf8 ) >> 3 ]; + + if ( ApuC1Freq ) + { + ApuC1Skip = ( ApuPulseMagic << 1 ) / ApuC1Freq; + } else { + ApuC1Skip = 0; + } + break; + + case 3: + ApuC1d = ApuEventQueue[event].data; + ApuC1Freq = ( ( ( (WORD)ApuC1d & 0x07 ) << 8 ) + ApuC1c ); + ApuC1Atl = ApuAtl[ ( ApuC1d & 0xf8 ) >> 3 ]; + + if ( ApuC1Freq ) + { + ApuC1Skip = ( ApuPulseMagic << 1 ) / ApuC1Freq; + } else { + ApuC1Skip = 0; + } + break; + } + } + else if ( ApuEventQueue[event].type == APUET_W_CTRL ) + { + ApuCtrlNew = ApuEventQueue[event].data; + + if( !(ApuEventQueue[event].data&(1<<0)) ) { + ApuC1Atl = 0; + } + } + event++; + } + return event; +} + +/*-------------------------------------------------------------------*/ +/* Rendering rectangular wave #1 */ +/*-------------------------------------------------------------------*/ + +void ApuRenderingWave1( void ) +{ + int cycles = 0; + int event = 0; + + unsigned int i; + + /* note: 41 CPU cycles occur between increments of i */ + ApuCtrlNew = ApuCtrl; + for ( i = 0; i < ApuSamplesPerSync; i++ ) + { + /* Write registers */ + cycles += ApuCyclesPerSample; + event = ApuWriteWave1( cycles, event ); + + /* Envelope decay at a rate of ( Envelope Delay + 1 ) / 240 secs */ + ApuC1EnvPhase -= 4; + while ( ApuC1EnvPhase < 0 ) + { + ApuC1EnvPhase += ApuC1EnvDelay; + + if ( ApuC1Hold ) + { + ApuC1EnvVol = ( ApuC1EnvVol + 1 ) & 0x0f; + } + else if ( ApuC1EnvVol < 0x0f ) + { + ApuC1EnvVol++; + } + } + + /* + * TODO: using a table of max frequencies is not technically + * clean, but it is fast and (or should be) accurate + */ + if ( ApuC1Freq < 8 || ( !ApuC1SweepIncDec && ApuC1Freq > ApuC1FreqLimit ) ) + { + wave_buffers[0][i] = 0; + break; + } + + /* Frequency sweeping at a rate of ( Sweep Delay + 1) / 120 secs */ + if ( ApuC1SweepOn && ApuC1SweepShifts ) + { + ApuC1SweepPhase -= 2; /* 120/60 */ + while ( ApuC1SweepPhase < 0 ) + { + ApuC1SweepPhase += ApuC1SweepDelay; + + if ( ApuC1SweepIncDec ) /* ramp up */ + { + /* Rectangular #1 */ + ApuC1Freq += ~( ApuC1Freq >> ApuC1SweepShifts ); + } else { + /* ramp down */ + ApuC1Freq += ( ApuC1Freq >> ApuC1SweepShifts ); + } + } + if ( ApuC1Freq ) { + ApuC1Skip = ( ApuPulseMagic << 1 ) / ApuC1Freq; + } + } + + /* Wave Rendering */ + if ( ( ApuCtrlNew & 0x01 ) && ( ApuC1Atl || ApuC1Hold ) ) + { + ApuC1Index += ApuC1Skip; + ApuC1Index &= 0x1fffffff; + + if ( ApuC1Env ) + { + wave_buffers[0][i] = ApuC1Wave[ApuC1Index >> 24] * ( ApuC1Vol + ApuC1EnvVol ); + } else { + wave_buffers[0][i] = ApuC1Wave[ApuC1Index >> 24] * ApuC1Vol; + } + } else { + wave_buffers[0][i] = 0; + } + } + if ( ApuC1Atl ) { ApuC1Atl--; } +} + +/*===================================================================*/ +/* */ +/* ApuRenderingWave2() : Rendering Rectangular Wave #2 */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Write registers of rectangular wave #2 */ +/*-------------------------------------------------------------------*/ + +int ApuWriteWave2( int cycles, int event ) +{ + /* APU Reg Write Event */ + while ( ( event < cur_event ) && ( ApuEventQueue[event].time < cycles ) ) + { + if ( ( ApuEventQueue[event].type & APUET_MASK ) == APUET_C2 ) + { + switch ( ApuEventQueue[event].type & 0x03 ) + { + case 0: + ApuC2a = ApuEventQueue[event].data; + ApuC2Wave = pulse_waves[ ApuC2DutyCycle >> 6 ]; + break; + + case 1: + ApuC2b = ApuEventQueue[event].data; + break; + + case 2: + ApuC2c = ApuEventQueue[event].data; + ApuC2Freq = ( ( ( (WORD)ApuC2d & 0x07 ) << 8 ) + ApuC2c ); + ApuC2Atl = ApuAtl[ ( ApuC2d & 0xf8 ) >> 3 ]; + + if ( ApuC2Freq ) + { + ApuC2Skip = ( ApuPulseMagic << 1 ) / ApuC2Freq; + } else { + ApuC2Skip = 0; + } + break; + + case 3: + ApuC2d = ApuEventQueue[event].data; + ApuC2Freq = ( ( ( (WORD)ApuC2d & 0x07 ) << 8 ) + ApuC2c ); + ApuC2Atl = ApuAtl[ ( ApuC2d & 0xf8 ) >> 3 ]; + + if ( ApuC2Freq ) + { + ApuC2Skip = ( ApuPulseMagic << 1 ) / ApuC2Freq; + } else { + ApuC2Skip = 0; + } + break; + } + } + else if ( ApuEventQueue[event].type == APUET_W_CTRL ) + { + ApuCtrlNew = ApuEventQueue[event].data; + + if( !(ApuEventQueue[event].data&(1<<1)) ) { + ApuC2Atl = 0; + } + } + event++; + } + return event; +} + +/*-------------------------------------------------------------------*/ +/* Rendering rectangular wave #2 */ +/*-------------------------------------------------------------------*/ + +void ApuRenderingWave2( void ) +{ + int cycles = 0; + int event = 0; + + unsigned int i; + + /* note: 41 CPU cycles occur between increments of i */ + ApuCtrlNew = ApuCtrl; + for ( i = 0; i < ApuSamplesPerSync; i++ ) + { + /* Write registers */ + cycles += ApuCyclesPerSample; + event = ApuWriteWave2( cycles, event ); + + /* Envelope decay at a rate of ( Envelope Delay + 1 ) / 240 secs */ + ApuC2EnvPhase -= 4; + while ( ApuC2EnvPhase < 0 ) + { + ApuC2EnvPhase += ApuC2EnvDelay; + + if ( ApuC2Hold ) + { + ApuC2EnvVol = ( ApuC2EnvVol + 1 ) & 0x0f; + } + else if ( ApuC2EnvVol < 0x0f ) + { + ApuC2EnvVol++; + } + } + + /* + * TODO: using a table of max frequencies is not technically + * clean, but it is fast and (or should be) accurate + */ + if ( ApuC2Freq < 8 || ( !ApuC2SweepIncDec && ApuC2Freq > ApuC2FreqLimit ) ) + { + wave_buffers[1][i] = 0; + break; + } + + /* Frequency sweeping at a rate of ( Sweep Delay + 1) / 120 secs */ + if ( ApuC2SweepOn && ApuC2SweepShifts ) + { + ApuC2SweepPhase -= 2; /* 120/60 */ + while ( ApuC2SweepPhase < 0) + { + ApuC2SweepPhase += ApuC2SweepDelay; + + if ( ApuC2SweepIncDec ) /* ramp up */ + { + /* Rectangular #2 */ + ApuC2Freq -= ~( ApuC2Freq >> ApuC2SweepShifts ); + } else { + /* ramp down */ + ApuC2Freq += ( ApuC2Freq >> ApuC2SweepShifts ); + } + } + if ( ApuC2Freq ) { + ApuC2Skip = ( ApuPulseMagic << 1 ) / ApuC2Freq; + } + } + + /* Wave Rendering */ + if ( ( ApuCtrlNew & 0x02 ) && ( ApuC2Atl || ApuC2Hold ) ) + { + ApuC2Index += ApuC2Skip; + ApuC2Index &= 0x1fffffff; + + if ( ApuC2Env ) + { + wave_buffers[1][i] = ApuC2Wave[ApuC2Index >> 24] * ( ApuC2Vol + ApuC2EnvVol ); + } else { + wave_buffers[1][i] = ApuC2Wave[ApuC2Index >> 24] * ApuC2Vol; + } + } else { + wave_buffers[1][i] = 0; + } + } + if ( ApuC2Atl ) { ApuC2Atl--; } +} + +/*===================================================================*/ +/* */ +/* ApuRenderingWave3() : Rendering Triangle Wave */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Write registers of triangle wave #3 */ +/*-------------------------------------------------------------------*/ + +int ApuWriteWave3( int cycles, int event ) +{ + /* APU Reg Write Event */ + while (( event < cur_event ) && ( ApuEventQueue[event].time < cycles ) ) + { + if ( ( ApuEventQueue[event].type & APUET_MASK ) == APUET_C3 ) + { + switch ( ApuEventQueue[event].type & 3 ) + { + case 0: + ApuC3a = ApuEventQueue[event].data; + ApuC3Llc = ApuC3LinearLength; + break; + + case 1: + ApuC3b = ApuEventQueue[event].data; + break; + + case 2: + ApuC3c = ApuEventQueue[event].data; + if ( ApuC3Freq ) + { + ApuC3Skip = ApuTriangleMagic / ApuC3Freq; + } else { + ApuC3Skip = 0; + } + break; + + case 3: + ApuC3d = ApuEventQueue[event].data; + ApuC3Atl = ApuC3LengthCounter; + if ( ApuC3Freq ) + { + ApuC3Skip = ApuTriangleMagic / ApuC3Freq; + } else { + ApuC3Skip = 0; + } + } + } else if ( ApuEventQueue[event].type == APUET_W_CTRL ) { + ApuCtrlNew = ApuEventQueue[event].data; + + if( !(ApuEventQueue[event].data&(1<<2)) ) { + ApuC3Atl = 0; + ApuC3Llc = 0; + } + } + event++; + } + return event; +} + +/*-------------------------------------------------------------------*/ +/* Rendering triangle wave #3 */ +/*-------------------------------------------------------------------*/ + +void ApuRenderingWave3( void ) +{ + int cycles = 0; + int event = 0; + + unsigned int i; + + /* note: 41 CPU cycles occur between increments of i */ + ApuCtrlNew = ApuCtrl; + for ( i = 0; i < ApuSamplesPerSync; i++) + { + /* Write registers */ + cycles += ApuCyclesPerSample; + event = ApuWriteWave3( cycles, event ); + + /* Cutting Min Frequency */ + if ( ApuC3Freq < 8 ) + { + wave_buffers[2][i] = 0; + break; + } + + /* Counter Control */ + if ( ApuC3CounterStarted ) + { + if ( ApuC3Atl > 0 && !ApuC3Holdnote ) + { + ApuC3Atl--; + } + if ( ApuC3Llc > 0 ) + { + ApuC3Llc--; + } + } else if ( !ApuC3Holdnote && ApuC3WriteLatency > 0 ) { + if ( --ApuC3WriteLatency == 0 ) + { + ApuC3CounterStarted = 0x01; + } + } + + /* Wave Rendering */ + if ( ( ApuCtrlNew & 0x04 ) && ( ( ApuC3Atl > 0 || ApuC3Holdnote ) && ApuC3Llc > 0 ) ) + { + ApuC3Index += ApuC3Skip; + ApuC3Index &= 0x1fffffff; + wave_buffers[2][i] = triangle_50[ ApuC3Index >> 24 ]; + } else { + wave_buffers[2][i] = 0; + } + } +} + +/*===================================================================*/ +/* */ +/* ApuRenderingWave4() : Rendering Noise */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Write registers of noise channel #4 */ +/*-------------------------------------------------------------------*/ + +int ApuWriteWave4( int cycles, int event ) +{ + /* APU Reg Write Event */ + while ( (event < cur_event) && (ApuEventQueue[event].time < cycles) ) + { + if ( ( ApuEventQueue[event].type & APUET_MASK ) == APUET_C4 ) + { + switch (ApuEventQueue[event].type & 3) { + case 0: + ApuC4a = ApuEventQueue[event].data; + break; + + case 1: + ApuC4b = ApuEventQueue[event].data; + break; + + case 2: + ApuC4c = ApuEventQueue[event].data; + + if ( ApuC4Small ) { + ApuC4Sr = 0x001f; + } else { + ApuC4Sr = 0x01ff; + } + + /* Frequency */ + if ( ApuC4Freq ) { + ApuC4Skip = ApuNoiseMagic / ApuC4Freq; + } else { + ApuC4Skip = 0; + } + ApuC4Atl = ApuC4LengthCounter; + break; + + case 3: + ApuC4d = ApuEventQueue[event].data; + + /* Frequency */ + if ( ApuC4Freq ) { + ApuC4Skip = ApuNoiseMagic / ApuC4Freq; + } else { + ApuC4Skip = 0; + } + ApuC4Atl = ApuC4LengthCounter; + } + } else if (ApuEventQueue[event].type == APUET_W_CTRL) { + ApuCtrlNew = ApuEventQueue[event].data; + + if( !(ApuEventQueue[event].data&(1<<3)) ) { + ApuC4Atl = 0; + } + } + event++; + } + return event; +} + +/*-------------------------------------------------------------------*/ +/* Rendering noise channel #4 */ +/*-------------------------------------------------------------------*/ + +void ApuRenderingWave4(void) +{ + int cycles = 0; + int event = 0; + + unsigned int i; + + ApuCtrlNew = ApuCtrl; + for ( i = 0; i < ApuSamplesPerSync; i++ ) + { + /* Write registers */ + cycles += ApuCyclesPerSample; + event = ApuWriteWave4( cycles, event ); + + /* Envelope decay at a rate of ( Envelope Delay + 1 ) / 240 secs */ + ApuC4EnvPhase -= 4; + while ( ApuC4EnvPhase < 0 ) + { + ApuC4EnvPhase += ApuC4EnvDelay; + + if ( ApuC4Hold ) + { + ApuC4EnvVol = ( ApuC4EnvVol + 1 ) & 0x0f; + } + else if ( ApuC4EnvVol < 0x0f ) + { + ApuC4EnvVol++; + } + } + + /* Wave Rendering */ + if ( ApuCtrlNew & 0x08 ) + { + ApuC4Index += ApuC4Skip; + if ( ApuC4Index > 0x1fffffff ) + { + if ( ApuC4Small ) /* FIXME: may be wrong */ + { + ApuC4Sr |= ((!(ApuC4Sr & 1)) ^ (!(ApuC4Sr & 4))) << 5; + } else { + ApuC4Sr |= ((!(ApuC4Sr & 1)) ^ (!(ApuC4Sr & 16))) << 9; + } + ApuC4Sr >>= 1; + } + ApuC4Index &= 0x1fffffff; + + if ( ApuC4Atl && ( ApuC4Sr & 1 ) ) + { + if ( !ApuC4Env ) + { + wave_buffers[3][i] = ApuC4Vol; + } else { + wave_buffers[3][i] = ApuC4EnvVol ^ 0x0f; + } + } else { + wave_buffers[3][i] = 0; + } + } else { + wave_buffers[3][i] = 0; + } + } + if ( ApuC4Atl && !ApuC4Hold ) + { + ApuC4Atl--; + } +} + +/*===================================================================*/ +/* */ +/* ApuRenderingWave5() : Rendering DPCM channel #5 */ +/* */ +/*===================================================================*/ + +/*-------------------------------------------------------------------*/ +/* Write registers of DPCM channel #5 */ +/*-------------------------------------------------------------------*/ + +int ApuWriteWave5( int cycles, int event ) +{ + /* APU Reg Write Event */ + while ( (event < cur_event) && (ApuEventQueue[event].time < cycles) ) + { + if ( ( ApuEventQueue[event].type & APUET_MASK ) == APUET_C5 ) + { + ApuC5Reg[ ApuEventQueue[event].type & 3 ] = ApuEventQueue[event].data; + + switch (ApuEventQueue[event].type & 3) { + case 0: + ApuC5Freq = ApuDpcmCycles[ ( ApuEventQueue[event].data & 0x0F ) ] << 16; + ApuC5Looping = ApuEventQueue[event].data & 0x40; + break; + case 1: + ApuC5DpcmValue = ( ApuEventQueue[event].data & 0x7F ) >> 1; + break; + case 2: + ApuC5CacheAddr = 0xC000 + (WORD)( ApuEventQueue[event].data << 6 ); + break; + case 3: + ApuC5CacheDmaLength = ( ( ApuEventQueue[event].data << 4 ) + 1 ) << 3; + break; + } + } else if (ApuEventQueue[event].type == APUET_W_CTRL) { + ApuCtrlNew = ApuEventQueue[event].data; + + if( !(ApuEventQueue[event].data&(1<<4)) ) { + ApuC5Enable = 0; + ApuC5DmaLength = 0; + } else { + ApuC5Enable = 0xFF; + if( !ApuC5DmaLength ) { + ApuC5Address = ApuC5CacheAddr; + ApuC5DmaLength = ApuC5CacheDmaLength; + } + } + } + event++; + } + return event; +} + +/*-------------------------------------------------------------------*/ +/* Rendering DPCM channel #5 */ +/*-------------------------------------------------------------------*/ + +void ApuRenderingWave5(void) +{ + int cycles = 0; + int event = 0; + + unsigned int i; + + ApuCtrlNew = ApuCtrl; + for ( i = 0; i < ApuSamplesPerSync; i++ ) + { + /* Write registers */ + cycles += ApuCyclesPerSample; + event = ApuWriteWave5( cycles, event ); + + if( ApuC5DmaLength ) { + ApuC5Phaseacc -= ApuCycleRate; + + while( ApuC5Phaseacc < 0 ) { + ApuC5Phaseacc += ApuC5Freq; + if( !( ApuC5DmaLength & 7 ) ) { + ApuC5CurByte = K6502_Read( ApuC5Address ); + if( 0xFFFF == ApuC5Address ) + ApuC5Address = 0x8000; + else + ApuC5Address++; + } + if( !(--ApuC5DmaLength) ) { + if( ApuC5Looping ) { + ApuC5Address = ApuC5CacheAddr; + ApuC5DmaLength = ApuC5CacheDmaLength; + } else { + ApuC5Enable = 0; + break; + } + } + + // positive delta + if( ApuC5CurByte & ( 1 << ((ApuC5DmaLength&7)^7)) ) { + if( ApuC5DpcmValue < 0x3F ) + ApuC5DpcmValue += 1; + } else { + // negative delta + if( ApuC5DpcmValue > 1 ) + ApuC5DpcmValue -= 1; + } + } + } + + /* Wave Rendering */ + if ( ApuCtrlNew & 0x10 ) { + wave_buffers[4][i] = ( ApuC5Reg[1]&0x01 ) + ( ApuC5DpcmValue << 1 ); + } + } +} + + +/*===================================================================*/ +/* */ +/* InfoNES_pApuVsync() : Callback Function per Vsync */ +/* */ +/*===================================================================*/ + +void InfoNES_pAPUVsync(void) +{ + ApuRenderingWave1(); + ApuRenderingWave2(); + ApuRenderingWave3(); + ApuRenderingWave4(); + ApuRenderingWave5(); + + ApuCtrl = ApuCtrlNew; + + InfoNES_SoundOutput(ApuSamplesPerSync, + wave_buffers[0], wave_buffers[1], wave_buffers[2], + wave_buffers[3], wave_buffers[4]); + + entertime = g_wPassedClocks; + cur_event = 0; +} + +/*===================================================================*/ +/* */ +/* InfoNES_pApuInit() : Initialize pApu */ +/* */ +/*===================================================================*/ + +void InfoNES_pAPUInit(void) +{ + /* Sound Hardware Init */ + InfoNES_SoundInit(); + + ApuQuality = pAPU_QUALITY - 1; // 1: 22050, 2: 44100 [samples/sec] + + ApuPulseMagic = ApuQual[ ApuQuality ].pulse_magic; + ApuTriangleMagic = ApuQual[ ApuQuality ].triangle_magic; + ApuNoiseMagic = ApuQual[ ApuQuality ].noise_magic; + ApuSamplesPerSync = ApuQual[ ApuQuality ].samples_per_sync; + ApuCyclesPerSample = ApuQual[ ApuQuality ].cycles_per_sample; + ApuSampleRate = ApuQual[ ApuQuality ].sample_rate; + ApuCycleRate = ApuQual[ ApuQuality ].cycle_rate; + + InfoNES_SoundOpen( ApuSamplesPerSync, ApuSampleRate ); + + /*-------------------------------------------------------------------*/ + /* Initialize Rectangular, Noise Wave's Regs */ + /*-------------------------------------------------------------------*/ + ApuCtrl = ApuCtrlNew = 0; + ApuC1Wave = pulse_50; + ApuC2Wave = pulse_50; + + ApuC1a = ApuC1b = ApuC1c = ApuC1d = 0; + ApuC2a = ApuC2b = ApuC2c = ApuC2d = 0; + ApuC4a = ApuC4b = ApuC4c = ApuC4d = 0; + + ApuC1Skip = ApuC2Skip = ApuC4Skip = 0; + ApuC1Index = ApuC2Index = ApuC4Index = 0; + ApuC1EnvPhase = ApuC2EnvPhase = ApuC4EnvPhase = 0; + ApuC1EnvVol = ApuC2EnvVol = ApuC4EnvVol = 0; + ApuC1Atl = ApuC2Atl = ApuC4Atl = 0; + ApuC1SweepPhase = ApuC2SweepPhase = 0; + ApuC1Freq = ApuC2Freq = ApuC4Freq = 0; + ApuC4Sr = ApuC4Fdc = 0; + + /*-------------------------------------------------------------------*/ + /* Initialize Triangle Wave's Regs */ + /*-------------------------------------------------------------------*/ + ApuC3a = ApuC3b = ApuC3c = ApuC3d = 0; + ApuC3Atl = ApuC3Llc = 0; + ApuC3WriteLatency = 3; /* Magic Number */ + ApuC3CounterStarted = 0x00; + + /*-------------------------------------------------------------------*/ + /* Initialize DPCM's Regs */ + /*-------------------------------------------------------------------*/ + ApuC5Reg[0] = ApuC5Reg[1] = ApuC5Reg[2] = ApuC5Reg[3] = 0; + ApuC5Enable = ApuC5Looping = ApuC5CurByte = ApuC5DpcmValue = 0; + ApuC5Freq = ApuC5Phaseacc; + ApuC5Address = ApuC5CacheAddr = 0; + ApuC5DmaLength = ApuC5CacheDmaLength = 0; + + /*-------------------------------------------------------------------*/ + /* Initialize Wave Buffers */ + /*-------------------------------------------------------------------*/ + InfoNES_MemorySet( (void *)wave_buffers[0], 0, 735 ); + InfoNES_MemorySet( (void *)wave_buffers[1], 0, 735 ); + InfoNES_MemorySet( (void *)wave_buffers[2], 0, 735 ); + InfoNES_MemorySet( (void *)wave_buffers[3], 0, 735 ); + InfoNES_MemorySet( (void *)wave_buffers[4], 0, 735 ); + + entertime = g_wPassedClocks; + cur_event = 0; +} + +/*===================================================================*/ +/* */ +/* InfoNES_pApuDone() : Finalize pApu */ +/* */ +/*===================================================================*/ + +void InfoNES_pAPUDone(void) +{ + InfoNES_SoundClose(); +} + +/* + * End of InfoNES_pAPU.cpp + */ Index: apps/plugins/infones/InfoNES_Types.h =================================================================== --- apps/plugins/infones/InfoNES_Types.h (revision 0) +++ apps/plugins/infones/InfoNES_Types.h (revision 0) @@ -0,0 +1,37 @@ +/*===================================================================*/ +/* */ +/* InfoNES_Types.h : Type definitions for InfoNES */ +/* */ +/* 2000/5/4 InfoNES Project ( based on pNesX ) */ +/* */ +/*===================================================================*/ + + +#ifndef InfoNES_TYPES_H_INCLUDED + +#define InfoNES_TYPES_H_INCLUDED + +/*-------------------------------------------------------------------*/ +/* Type definition */ +/*-------------------------------------------------------------------*/ +#ifndef K6502_H_INCLUDED +#ifndef DWORD +typedef unsigned long DWORD; +#endif /* !DWORD */ + +#ifndef WORD +typedef unsigned short WORD; +#endif /* !WORD */ + +#ifndef BYTE +typedef unsigned char BYTE; +#endif /* !BYTE */ +#endif +/*-------------------------------------------------------------------*/ +/* NULL definition */ +/*-------------------------------------------------------------------*/ +#ifndef NULL +#define NULL 0 +#endif /* !NULL */ + +#endif /* !InfoNES_TYPES_H_INCLUDED */ Index: apps/plugins/infones/InfoNES_pAPU.h =================================================================== --- apps/plugins/infones/InfoNES_pAPU.h (revision 0) +++ apps/plugins/infones/InfoNES_pAPU.h (revision 0) @@ -0,0 +1,200 @@ +/*===================================================================*/ +/* */ +/* InfoNES_pAPU.h : InfoNES Sound Emulation Function */ +/* */ +/* 2000/05/29 InfoNES Project ( based on DarcNES and NesterJ ) */ +/* */ +/*===================================================================*/ + +#ifndef InfoNES_PAPU_H_INCLUDED +#define InfoNES_PAPU_H_INCLUDED + +/*-------------------------------------------------------------------*/ +/* Macros */ +/*-------------------------------------------------------------------*/ + +/*-------------------------------------------------------------------*/ +/* Rectangle Wave #0 */ +/* Reg0: 0-3=Volume, 4=Envelope, 5=Hold, 6-7=Duty Cycle */ +/* Reg1: 0-2=sweep shifts, 3=sweep inc, 4-6=sweep length, 7=sweep on */ +/* Reg2: 8 bits of freq */ +/* Reg3: 0-2=high freq, 7-4=vbl length counter */ +/*-------------------------------------------------------------------*/ +#define ApuC1Vol ( ApuC1a & 0x0f ) +#define ApuC1Env ( ApuC1a & 0x10 ) +#define ApuC1Hold ( ApuC1a & 0x20 ) +#define ApuC1DutyCycle ( ApuC1a & 0xc0 ) +//#define ApuC1EnvDelay ( ( WORD )( ApuC1a & 0x0f ) << 8 ) +#define ApuC1EnvDelay ( ( ApuC1a & 0x0f ) + 1 ) +#define ApuC1SweepOn ( ApuC1b & 0x80 ) +#define ApuC1SweepIncDec ( ApuC1b & 0x08 ) +#define ApuC1SweepShifts ( ApuC1b & 0x07 ) +//#define ApuC1SweepDelay ( ( ( ( WORD )ApuC1b & 0x70 ) >> 4 ) << 8 ) +#define ApuC1SweepDelay ( ( ( ApuC1b & 0x70 ) >> 4 ) + 1 ) +#define ApuC1FreqLimit ( ApuFreqLimit[ ( ApuC1b & 0x07 ) ] ) + +/*-------------------------------------------------------------------*/ +/* Rectangle Wave #1 */ +/* Reg0: 0-3=Volume, 4=Envelope, 5=Hold, 6-7=Duty Cycle */ +/* Reg1: 0-2=sweep shifts, 3=sweep inc, 4-6=sweep length, 7=sweep on */ +/* Reg2: 8 bits of freq */ +/* Reg3: 0-2=high freq, 7-4=vbl length counter */ +/*-------------------------------------------------------------------*/ +#define ApuC2Vol ( ApuC2a & 0x0f ) +#define ApuC2Env ( ApuC2a & 0x10 ) +#define ApuC2Hold ( ApuC2a & 0x20 ) +#define ApuC2DutyCycle ( ApuC2a & 0xc0 ) +//#define ApuC2EnvDelay ( ( WORD )( ApuC2a & 0x0f ) << 8 ) +#define ApuC2EnvDelay ( ( ApuC2a & 0x0f ) + 1 ) +#define ApuC2SweepOn ( ApuC2b & 0x80 ) +#define ApuC2SweepIncDec ( ApuC2b & 0x08 ) +#define ApuC2SweepShifts ( ApuC2b & 0x07 ) +//#define ApuC2SweepDelay ( ( ( ( WORD )ApuC2b & 0x70 ) >> 4 ) << 8 ) +#define ApuC2SweepDelay ( ( ( ApuC2b & 0x70 ) >> 4 ) + 1 ) +#define ApuC2FreqLimit ( ApuFreqLimit[ ( ApuC2b & 0x07 ) ] ) + +/*-------------------------------------------------------------------*/ +/* Triangle Wave */ +/* Reg0: 7=Holdnote, 6-0=Linear Length Counter */ +/* Reg2: 8 bits of freq */ +/* Reg3: 0-2=high freq, 7-4=vbl length counter */ +/*-------------------------------------------------------------------*/ +#define ApuC3Holdnote ( ApuC3a & 0x80 ) +#define ApuC3LinearLength ( ( (WORD)ApuC3a & 0x7f ) << 6 ) +#define ApuC3LengthCounter ( ApuAtl[ ( ( ApuC3d & 0xf8) >> 3 ) ] ) +#define ApuC3Freq ( ( ( (WORD)ApuC3d & 0x07) << 8) + ApuC3c ) + +/*-------------------------------------------------------------------*/ +/* White Noise Channel */ +/* Reg0: 0-3=Volume, 4=Envelope, 5=Hold */ +/* Reg2: 7=Small(93byte) sample, 3-0=Freq Lookup */ +/* Reg3: 7-3=vbl length counter */ +/*-------------------------------------------------------------------*/ +//#define ApuC4Vol ( ( ApuC4a & 0x0f ) | ( ( ApuC4a & 0x0f ) << 4 ) ) +#define ApuC4Vol ( ApuC4a & 0x0f ) +//#define ApuC4EnvDelay ( ( WORD )( ApuC4a & 0x0f ) << 8 ) +#define ApuC4EnvDelay ( ( ApuC4a & 0x0f ) + 1 ) +#define ApuC4Env ( ApuC4a & 0x10 ) +#define ApuC4Hold ( ApuC4a & 0x20 ) +#define ApuC4Freq ( ApuNoiseFreq [ ( ApuC4c & 0x0f ) ] ) +#define ApuC4Small ( ApuC4c & 0x80 ) +//#define ApuC4LengthCounter ( ApuAtl[ ( ( ApuC4d & 0xf8 ) >> 3 ) ] ) +#define ApuC4LengthCounter ( ApuAtl[ ( ApuC4d >> 3 ) ] << 1 ) + +/*-------------------------------------------------------------------*/ +/* DPCM Channel */ +/* Reg0: 0-3=Frequency, 6=Looping */ +/* Reg1: 0-6=DPCM Value */ +/* Reg2: 0-7=Cache Addr */ +/* Reg3: 0-7=Cache DMA Length */ +/*-------------------------------------------------------------------*/ +#if 0 +#define ApuC5Freq ( ApuDpcmCycles[ ( ApuC5a & 0x0F ) ] ) +#define ApuC5Looping ( ApuC5a & 0x40 ) +#define ApuC5DpcmValue ( ( ApuC5b & 0x7F ) >> 1 ) +#define ApuC5CacheAddr ( 0xc000 + (WORD)(ApuC5c << 6) ) +#define ApuC5CacheDmaLength ( ( ( ApuC5d << 4 ) + 1 ) << 3 ) +#endif + +/*-------------------------------------------------------------------*/ +/* pAPU Event resources */ +/*-------------------------------------------------------------------*/ + +#define APU_EVENT_MAX 15000 + +struct ApuEvent_t { + long time; + BYTE type; + BYTE data; +}; + +#define APUET_MASK 0xfc +#define APUET_C1 0x00 +#define APUET_W_C1A 0x00 +#define APUET_W_C1B 0x01 +#define APUET_W_C1C 0x02 +#define APUET_W_C1D 0x03 +#define APUET_C2 0x04 +#define APUET_W_C2A 0x04 +#define APUET_W_C2B 0x05 +#define APUET_W_C2C 0x06 +#define APUET_W_C2D 0x07 +#define APUET_C3 0x08 +#define APUET_W_C3A 0x08 +#define APUET_W_C3B 0x09 +#define APUET_W_C3C 0x0a +#define APUET_W_C3D 0x0b +#define APUET_C4 0x0c +#define APUET_W_C4A 0x0c +#define APUET_W_C4B 0x0d +#define APUET_W_C4C 0x0e +#define APUET_W_C4D 0x0f +#define APUET_C5 0x10 +#define APUET_W_C5A 0x10 +#define APUET_W_C5B 0x11 +#define APUET_W_C5C 0x12 +#define APUET_W_C5D 0x13 +#define APUET_W_CTRL 0x20 +#define APUET_SYNC 0x40 + +/*-------------------------------------------------------------------*/ +/* Function prototypes */ +/*-------------------------------------------------------------------*/ +typedef void (*ApuWritefunc)(WORD addr, BYTE value); +extern ApuWritefunc pAPUSoundRegs[20]; +void ApuWriteControl(WORD addr, BYTE value); + +#define InfoNES_pAPUWriteControl(addr,value) \ +{ \ + ApuWriteControl(addr,value); \ +} + +void InfoNES_pAPUInit(void); +void InfoNES_pAPUDone(void); +void InfoNES_pAPUVsync(void); + +/*-------------------------------------------------------------------*/ +/* pAPU Quality resources */ +/*-------------------------------------------------------------------*/ + +/*-------------------------------------------------------------------*/ +/* ApuQuality is used to control the sound playback rate. */ +/* 1 is 11015 Hz. */ +/* 2 is 22050 Hz. */ +/* 3 is 44100 Hz. */ +/* these values subject to change without notice. */ +/*-------------------------------------------------------------------*/ +extern int ApuQuality; +#define pAPU_QUALITY 3 + +/*-------------------------------------------------------------------*/ +/* Rectangle Wave #1 resources */ +/*-------------------------------------------------------------------*/ + +extern BYTE ApuC1Atl; + +/*-------------------------------------------------------------------*/ +/* Rectangle Wave #2 resources */ +/*-------------------------------------------------------------------*/ + +extern BYTE ApuC2Atl; + +/*-------------------------------------------------------------------*/ +/* Triangle Wave resources */ +/*-------------------------------------------------------------------*/ + +extern BYTE ApuC3a; +extern BYTE ApuC3Atl; +extern DWORD ApuC3Llc; /* Linear Length Counter */ + +/*-------------------------------------------------------------------*/ +/* Noise resources */ +/*-------------------------------------------------------------------*/ + +extern BYTE ApuC4Atl; + +#endif /* InfoNES_PAPU_H_INCLUDED */ + +/* + * End of InfoNES_pAPU.h + */ Index: apps/plugins/infones/InfoNES_System_Rockbox.c =================================================================== --- apps/plugins/infones/InfoNES_System_Rockbox.c (revision 0) +++ apps/plugins/infones/InfoNES_System_Rockbox.c (revision 0) @@ -0,0 +1,962 @@ +/* + * InfoNES + * h10 ports by 03/04/19 + * Modified by Jay 06/02/25 + * + * Start Date: 2003.04.19 + */ +#include "plugin.h" + + + +PLUGIN_HEADER + +struct plugin_api *rb; + +#define stime 1500 + +#include "InfoNES.h" +#include "InfoNES_System.h" +#include "InfoNES_pAPU.h" +#include "nes_rockbox.h" + + +/*-------------------------------------------------------------------*/ +/* ROM image file information */ +/*-------------------------------------------------------------------*/ + +char szRomName[ 256 ]; +char szSaveName[ 256 ]; +int nSRAM_SaveFlag; + +/*-------------------------------------------------------------------*/ +/* Constants ( Linux specific ) */ +/*-------------------------------------------------------------------*/ + +#define VBOX_SIZE 7 +//static const char * VERSION = "InfoNES v0.97J RC1"; //why doesnt this line compile? + +/*-------------------------------------------------------------------*/ +/* Global Variables ( SDL specific ) */ +/*-------------------------------------------------------------------*/ +extern struct ApuEvent_t *ApuEventQueue; +bool quit = false; + +/* for video */ +#define SDL_Surface int +SDL_Surface *screen; +WORD *wfx; + +/* For Sound Emulation */ +/* SDL_AudioSpec audio_spec; */ +BYTE final_wave[2048]; +int waveptr; +int wavflag; +int wavdone; + +/* Pad state */ +DWORD dwPad1; +DWORD dwPad2; +DWORD dwSystem; + +int start_menu; + +/*-------------------------------------------------------------------*/ +/* Function prototypes ( SDL specific ) */ +/*-------------------------------------------------------------------*/ + +int start_application(char *filename); +void poll_event(void); +int LoadSRAM(); +int SaveSRAM(); + +void menu(void); + +/* Palette data */ +#if 1 + +unsigned int COLOR_SPACE [] [3] = + {{0x75,0x75,0x75}, {0x27, 0x1b, 0x8f}, {0x00, 0x00, 0xab}, + {0x47, 0x00, 0x9f}, {0x8f, 0x00, 0x77}, {0xab, 0x00, 0x13}, + {0xa7, 0x00, 0x00}, {0x7f, 0x0b, 0x00}, {0x43, 0x2f, 0x00}, + {0x00, 0x47, 0x00}, {0x00, 0x51, 0x00}, {0x00, 0x3f, 0x17}, + {0x1b, 0x3f, 0x5f}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00}, {0xbc, 0xbc, 0xbc}, {0x00, 0x73, 0xef}, + {0x23, 0x3b, 0xef}, {0x83, 0x00, 0xf3}, {0xbf, 0x00, 0xbf}, + {0xe7, 0x00, 0x5b}, {0xdb, 0x2b, 0x00}, {0xcb, 0x4f, 0x0f}, + {0x8b, 0x73, 0x00}, {0x00, 0x97, 0x00}, {0x00, 0xab, 0x00}, + {0x00, 0x93, 0x3b}, {0x00, 0x83, 0x8b}, {0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, + + {0xff, 0xff, 0xff}, {0x3f, 0xbf, 0xff}, {0x5f, 0x97, 0xff}, + {0xa7, 0x8b, 0xfd}, {0xf7, 0x7b, 0xff}, {0xff, 0x77, 0xb7}, + {0xff, 0x77, 0x63}, {0xff, 0x9b, 0x3b}, {0xf3, 0xbf, 0x3f}, + {0x83, 0xd3, 0x13}, {0x4f, 0xdf, 0x4b}, {0x58, 0xf8, 0x98}, + {0x00, 0xeb, 0xdb}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00}, {0xff, 0xff, 0xff}, {0xab, 0xe7, 0xff}, + {0xc7, 0xd7, 0xff}, {0xd7, 0xcb, 0xff}, {0xff, 0xc7, 0xff}, + {0xff, 0xc7, 0xdb}, {0xff, 0xbf, 0xb3}, {0xff, 0xdb, 0xab}, + {0xff, 0xe7, 0xa3}, {0xe3, 0xff, 0xa3}, {0xab, 0xf3, 0xbf}, + {0xb3, 0xff, 0xcf}, {0x9f, 0xff, 0xf3}, {0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}}; +#endif + +#if 1 +WORD NesPalette[ 64 ] = +{ + (0xe << 11) + (0xe << 6) + (0xe << 0) , (0x4 << 11) + (0x3 << 6) + (0x11 << 0) , (0x0 << 11) + (0x0 << 6) + (0x15 << 0) , (0x8 << 11) + (0x0 << 6) + (0x13 << 0) , (0x11 << 11) + (0x0 << 6) + (0xe << 0) , (0x15 << 11) + (0x0 << 6) + (0x2 << 0) , (0x14 << 11) + (0x0 << 6) + (0x0 << 0) , (0xf << 11) + (0x1 << 6) + (0x0 << 0) , (0x8 << 11) + (0x5 << 6) + (0x0 << 0) , (0x0 << 11) + (0x8 << 6) + (0x0 << 0) , (0x0 << 11) + (0xa << 6) + (0x0 << 0) , (0x0 << 11) + (0x7 << 6) + (0x2 << 0) , (0x3 << 11) + (0x7 << 6) + (0xb << 0) , (0x0 << 11) + (0x0 << 6) + (0x0 << 0) , (0x0 << 11) + (0x0 << 6) + (0x0 << 0) , (0x0 << 11) + (0x0 << 6) + (0x0 << 0) , (0x17 << 11) + (0x17 << 6) + (0x17 << 0) , (0x0 << 11) + (0xe << 6) + (0x1d << 0) , (0x4 << 11) + (0x7 << 6) + (0x1d << 0) , (0x10 << 11) + (0x0 << 6) + (0x1e << 0) , (0x17 << 11) + (0x0 << 6) + (0x17 << 0) , (0x1c << 11) + (0x0 << 6) + (0xb << 0) , (0x1b << 11) + (0x5 << 6) + (0x0 << 0) , (0x19 << 11) + (0x9 << 6) + (0x1 << 0) , (0x11 << 11) + (0xe << 6) + (0x0 << 0) , (0x0 << 11) + (0x12 << 6) + (0x0 << 0) , (0x0 << 11) + (0x15 << 6) + (0x0 << 0) , (0x0 << 11) + (0x12 << 6) + (0x7 << 0) , (0x0 << 11) + (0x10 << 6) + (0x11 << 0) , (0x0 << 11) + (0x0 << 6) + (0x0 << 0) , (0x0 << 11) + (0x0 << 6) + (0x0 << 0) , (0x0 << 11) + (0x0 << 6) + (0x0 << 0) , (0x1f << 11) + (0x1f << 6) + (0x1f << 0) , (0x7 << 11) + (0x17 << 6) + (0x1f << 0) , (0xb << 11) + (0x12 << 6) + (0x1f << 0) , (0x14 << 11) + (0x11 << 6) + (0x1f << 0) , (0x1e << 11) + (0xf << 6) + (0x1f << 0) , (0x1f << 11) + (0xe << 6) + (0x16 << 0) , (0x1f << 11) + (0xe << 6) + (0xc << 0) , (0x1f << 11) + (0x13 << 6) + (0x7 << 0) , (0x1e << 11) + (0x17 << 6) + (0x7 << 0) , (0x10 << 11) + (0x1a << 6) + (0x2 << 0) , (0x9 << 11) + (0x1b << 6) + (0x9 << 0) , (0xb << 11) + (0x1f << 6) + (0x13 << 0) , (0x0 << 11) + (0x1d << 6) + (0x1b << 0) , (0x0 << 11) + (0x0 << 6) + (0x0 << 0) , (0x0 << 11) + (0x0 << 6) + (0x0 << 0) , (0x0 << 11) + (0x0 << 6) + (0x0 << 0) , (0x1f << 11) + (0x1f << 6) + (0x1f << 0) , (0x15 << 11) + (0x1c << 6) + (0x1f << 0) , (0x18 << 11) + (0x1a << 6) + (0x1f << 0) , (0x1a << 11) + (0x19 << 6) + (0x1f << 0) , (0x1f << 11) + (0x18 << 6) + (0x1f << 0) , (0x1f << 11) + (0x18 << 6) + (0x1b << 0) , (0x1f << 11) + (0x17 << 6) + (0x16 << 0) , (0x1f << 11) + (0x1b << 6) + (0x15 << 0) , (0x1f << 11) + (0x1c << 6) + (0x14 << 0) , (0x1c << 11) + (0x1f << 6) + (0x14 << 0) , (0x15 << 11) + (0x1e << 6) + (0x17 << 0) , (0x16 << 11) + (0x1f << 6) + (0x19 << 0) , (0x13 << 11) + (0x1f << 6) + (0x1e << 0) , (0x0 << 11) + (0x0 << 6) + (0x0 << 0) , (0x0 << 11) + (0x0 << 6) + (0x0 << 0) , (0x0 << 11) + (0x0 << 6) + (0x0 << 0) +}; + +/*WORD NesPalette[ 64 ] = +{ + 0x39ce, 0x1071, 0x0015, 0x2013, 0x440e, 0x5402, 0x5000, 0x3c20, + 0x20a0, 0x0100, 0x0140, 0x00e2, 0x0ceb, 0x0000, 0x0000, 0x0000, + 0x5ef7, 0x01dd, 0x10fd, 0x401e, 0x5c17, 0x700b, 0x6ca0, 0x6521, + 0x45c0, 0x0240, 0x02a0, 0x0247, 0x0211, 0x0000, 0x0000, 0x0000, + 0x7fff, 0x1eff, 0x2e5f, 0x223f, 0x79ff, 0x7dd6, 0x7dcc, 0x7e67, + 0x7ae7, 0x4342, 0x2769, 0x2ff3, 0x03bb, 0x0000, 0x0000, 0x0000, + 0x7fff, 0x579f, 0x635f, 0x6b3f, 0x7f1f, 0x7f1b, 0x7ef6, 0x7f75, + 0x7f94, 0x73f4, 0x57d7, 0x5bf9, 0x4ffe, 0x0000, 0x0000, 0x0000 +};*/ + +#else +WORD NesPalette[ 64 ]; +#endif + +BYTE NesPaletteRGB[64][3] = { + 112, 112, 112, 32, 24, 136, 0, 0, 168, 64, 0, 152, + 136, 0, 112, 168, 0, 16, 160, 0, 0, 120, 8, 0, + 64, 40, 0, 0, 64, 0, 0, 80, 0, 0, 56, 16, + 24, 56, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 184, 184, 184, 0, 112, 232, 32, 56, 232, 128, 0, 240, + 184, 0, 184, 224, 0, 88, 216, 40, 0, 200, 72, 8, + 136, 112, 0, 0, 144, 0, 0, 168, 0, 0, 144, 56, + 0, 128, 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 248, 248, 248, 56, 184, 248, 88, 144, 248, 64, 136, 248, + 240, 120, 248, 248, 112, 176, 248, 112, 96, 248, 152, 56, + 240, 184, 56, 128, 208, 16, 72, 216, 72, 88, 248, 152, + 0, 232, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 248, 248, 248, 168, 224, 248, 192, 208, 248, 208, 200, 248, + 248, 192, 248, 248, 192, 216, 248, 184, 176, 248, 216, 168, + 248, 224, 160, 224, 248, 160, 168, 240, 184, 176, 248, 200, + 152, 248, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, +}; + +/*===================================================================*/ +/* */ +/* plugin_start() : Application main */ +/* */ +/*===================================================================*/ + +/* Application main */ +enum plugin_status plugin_start(struct plugin_api* api, void* parameter) + { + char *argv[2]; + int argc; + size_t size = 0xffff; + unsigned int i,vmode; + + + + rb = api; + start_menu = 0; + +#ifdef HAVE_ADJUSTABLE_CPU_FREQ + rb->cpu_boost(true); +#endif + //ROM = 0x28000000; + //ApuEventQueue = rb->plugin_get_audio_buffer(&size); + VROM = (BYTE*)rb->plugin_get_audio_buffer(&size); + ROM = (BYTE*) VROM + 0xffff * 8; + wfx = ROM + 0xffff * 16; + ApuEventQueue = wfx + LCD_HEIGHT * NES_DISP_WIDTH; + + //ROM = audiobuf; + //rb->splash(90000000, "size: %x", size); + + argc = 2; + argv[1] = parameter; + //rb->strcpy(temp, "/.rockbox/rocks/test.nes"); + //argv[1] = temp; + + + + + + /* for(i=0; i<64; ++i) + { + NesPalette[i] = SDL_MapRGB(screen->format, + NesPaletteRGB[i][0], + NesPaletteRGB[i][1], + NesPaletteRGB[i][2]); + }*/ + + /* If a rom name specified, start it */ + if (argc>=2) + { + if ( start_application(argv[1]) ) + { + /* MainLoop */ + InfoNES_Main(); + + /* End */ + SaveSRAM(); + } + else + { + /* Not a NES format file */ + rb->splash(1, "%s isn't a NES format file.\n", argv[1] ); + } + } + else + { + /* Help Message */ + rb->splash(stime, "Copyright (C) 1998-2006 Jay's Factory, "); + rb->splash(stime, "SDL Ports by mata.\n"); + rb->splash(stime, "%s. Usage: %s [NES format file]\n", VERSION, argv[0] ); + } + + return 0; +} + +/* Start application */ +int start_application(char *filename) +{ + /* Set a ROM image name */ + rb->strcpy( szRomName, filename ); + + /* Load cassette */ + if(InfoNES_Load(szRomName)==0) { + /* Load SRAM */ + LoadSRAM(); + + /* Success */ + return 1; + } + /* Failure */ + return 0; +} + +/*===================================================================*/ +/* */ +/* LoadSRAM() : Load a SRAM */ +/* */ +/*===================================================================*/ +int LoadSRAM() +{ +/* + * Load a SRAM + * + * Return values + * 0 : Normally + * -1 : SRAM data couldn't be read + */ + + int fp; + unsigned char pSrcBuf[ SRAM_SIZE ]; + unsigned char chData; + unsigned char chTag; + int nRunLen; + int nDecoded; + int nDecLen; + int nIdx; + + // It doesn't need to save it + nSRAM_SaveFlag = 0; + + // It is finished if the ROM doesn't have SRAM + if ( !ROM_SRAM ) + return 0; + + // There is necessity to save it + nSRAM_SaveFlag = 1; + + // The preparation of the SRAM file name + rb->strcpy( szSaveName, szRomName ); + rb->strcpy( rb->strrchr( szSaveName, '.' ) + 1, "srm" ); + + /*-------------------------------------------------------------------*/ + /* Read a SRAM data */ + /*-------------------------------------------------------------------*/ + + // Open SRAM file + fp = rb->open( szSaveName, O_RDWR | O_CREAT ); //are flags correct? + if ( fp == NULL ) + return -1; + + // Read SRAM data + //fread( pSrcBuf, SRAM_SIZE, 1, fp ); + rb->read(fp, pSrcBuf, SRAM_SIZE); + + // Close SRAM file + rb->close( fp ); + + /*-------------------------------------------------------------------*/ + /* Extract a SRAM data */ + /*-------------------------------------------------------------------*/ + + nDecoded = 0; + nDecLen = 0; + + chTag = pSrcBuf[ nDecoded++ ]; + + while ( nDecLen < 8192 ) + { + chData = pSrcBuf[ nDecoded++ ]; + + if ( chData == chTag ) + { + chData = pSrcBuf[ nDecoded++ ]; + nRunLen = pSrcBuf[ nDecoded++ ]; + for ( nIdx = 0; nIdx < nRunLen + 1; ++nIdx ) + { + SRAM[ nDecLen++ ] = chData; + } + } + else + { + SRAM[ nDecLen++ ] = chData; + } + } + + // Successful + return 0; +} + +/*===================================================================*/ +/* */ +/* SaveSRAM() : Save a SRAM */ +/* */ +/*===================================================================*/ +int SaveSRAM() +{ +/* + * Save a SRAM + * + * Return values + * 0 : Normally + * -1 : SRAM data couldn't be written + */ + + int fp; + int nUsedTable[ 256 ]; + unsigned char chData; + unsigned char chPrevData; + unsigned char chTag; + int nIdx; + int nEncoded; + int nEncLen; + int nRunLen; + unsigned char pDstBuf[ SRAM_SIZE ]; + + if ( !nSRAM_SaveFlag ) + return 0; // It doesn't need to save it + + /*-------------------------------------------------------------------*/ + /* Compress a SRAM data */ + /*-------------------------------------------------------------------*/ + + rb->memset( nUsedTable, 0, sizeof nUsedTable ); + + for ( nIdx = 0; nIdx < SRAM_SIZE; ++nIdx ) + { + ++nUsedTable[ SRAM[ nIdx++ ] ]; + } + for ( nIdx = 1, chTag = 0; nIdx < 256; ++nIdx ) + { + if ( nUsedTable[ nIdx ] < nUsedTable[ chTag ] ) + chTag = nIdx; + } + + nEncoded = 0; + nEncLen = 0; + nRunLen = 1; + + pDstBuf[ nEncLen++ ] = chTag; + + chPrevData = SRAM[ nEncoded++ ]; + + while ( nEncoded < SRAM_SIZE && nEncLen < SRAM_SIZE - 133 ) + { + chData = SRAM[ nEncoded++ ]; + + if ( chPrevData == chData && nRunLen < 256 ) + ++nRunLen; + else + { + if ( nRunLen >= 4 || chPrevData == chTag ) + { + pDstBuf[ nEncLen++ ] = chTag; + pDstBuf[ nEncLen++ ] = chPrevData; + pDstBuf[ nEncLen++ ] = nRunLen - 1; + } + else + { + for ( nIdx = 0; nIdx < nRunLen; ++nIdx ) + pDstBuf[ nEncLen++ ] = chPrevData; + } + + chPrevData = chData; + nRunLen = 1; + } + + } + if ( nRunLen >= 4 || chPrevData == chTag ) + { + pDstBuf[ nEncLen++ ] = chTag; + pDstBuf[ nEncLen++ ] = chPrevData; + pDstBuf[ nEncLen++ ] = nRunLen - 1; + } + else + { + for ( nIdx = 0; nIdx < nRunLen; ++nIdx ) + pDstBuf[ nEncLen++ ] = chPrevData; + } + + /*-------------------------------------------------------------------*/ + /* Write a SRAM data */ + /*-------------------------------------------------------------------*/ + + // Open SRAM file + fp = rb->open( szSaveName, O_CREAT | O_TRUNC | O_WRONLY ); + if ( fp == NULL ) + return -1; + + // Write SRAM data + rb->write(fp, pDstBuf, nEncLen); + + // Close SRAM file + rb->close( fp ); + + // Successful + return 0; +} + +/*===================================================================*/ +/* */ +/* InfoNES_Menu() : Menu screen */ +/* */ +/*===================================================================*/ +int InfoNES_Menu(){ + if(quit) return -1; + return 0; +} + +/* Read ROM image file */ +int InfoNES_ReadRom( const char *pszFileName ){ + int fp; + + /* Open ROM file */ + fp=rb->open(pszFileName, O_RDONLY); + if(fp==NULL) return -1; + + /* Read ROM Header */ + rb->read( fp, &NesHeader, sizeof NesHeader); + if( rb->memcmp( NesHeader.byID, "NES\x1a", 4 )!=0){ + /* not .nes file */ + rb->close( fp ); + return -1; + } + + /* Clear SRAM */ + rb->memset( SRAM, 0, SRAM_SIZE ); + + /* If trainer presents Read Triner at 0x7000-0x71ff */ + if(NesHeader.byInfo1 & 4){ + rb->read(fp, &SRAM[ 0x1000 ], 512); + } + + /* Allocate Memory for ROM Image */ + //ROM = (BYTE *)buffer_alloc( NesHeader.byRomSize * 0x4000 ); + + /* Read ROM Image */ + rb->read(fp, ROM, 0x4000 * NesHeader.byRomSize); + + if(NesHeader.byVRomSize>0){ + /* Allocate Memory for VROM Image */ + //VROM = (BYTE *)malloc( NesHeader.byVRomSize * 0x2000 ); + + /* Read VROM Image */ + rb->read(fp, VROM, 0x2000 * NesHeader.byVRomSize); + } + + /* File close */ + rb->close( fp ); + + /* Successful */ + return 0; + +} + +/* Release a memory for ROM */ +void InfoNES_ReleaseRom(){ +/* if(ROM){ + free(ROM); + ROM=NULL; + } + + if(VROM){ + free(VROM); + VROM=NULL; + }*/ + return; +} + +/* Transfer the contents of work frame on the screen */ +void InfoNES_LoadFrame(){ + int x, y, i, j; + BYTE *p,*pl; + WORD *pw; + +#if 0 //actual size of NES screan + for(y = 0; y < NES_DISP_HEIGHT; y++) { + for(x = 0; x < NES_DISP_WIDTH; x++){ + rb->lcd_set_foreground(WorkFrame[x + y * NES_DISP_WIDTH]); + rb->lcd_drawpixel(x, y); + } + } +#endif + +#if 0 //1/2 size of NES screan + for(y = 0; y < NES_DISP_HEIGHT; y += 2) { + for(x = 0; x < NES_DISP_WIDTH; x += 2){ + rb->lcd_set_foreground(WorkFrame[x + y * NES_DISP_WIDTH]); + rb->lcd_drawpixel(x/2, y/2); + } + } +#endif + +#if 1 //scaled to fit screan. no interpolation. +for(y = 0; y < LCD_HEIGHT; y++) + { + for(x = 0; x < LCD_WIDTH; x++) + { + rb->lcd_framebuffer[y * LCD_WIDTH + x] = WorkFrame[x * NES_DISP_WIDTH / LCD_WIDTH + y * NES_DISP_HEIGHT / LCD_HEIGHT * NES_DISP_WIDTH]; + } + } +#endif + +#if 0 //scaled to fit screan with interpolation. should be redone + +//WORD wf[LCD_HEIGHT * LCD_WIDTH]; + +for(y = 0; y < NES_DISP_HEIGHT; y++) + { + for(x = 0; x < LCD_WIDTH; x++) + { + + if(x * NES_DISP_WIDTH % LCD_WIDTH == 0) + wfx[x + y * LCD_WIDTH] = WorkFrame[x * NES_DISP_WIDTH / LCD_WIDTH + y * NES_DISP_WIDTH]; + else + { + wfx[x + y * LCD_WIDTH] = (WorkFrame[x * NES_DISP_WIDTH / LCD_WIDTH + y * NES_DISP_WIDTH] + + WorkFrame[x * NES_DISP_WIDTH / LCD_WIDTH + y * NES_DISP_WIDTH + 1]) /2; + } + } + } + +for(y = 0; y < LCD_HEIGHT; y++) + { + for(x = 0; x < LCD_WIDTH; x++) + { + if(y * NES_DISP_HEIGHT % LCD_HEIGHT == 0) + rb->lcd_set_foreground(wfx[x + y * NES_DISP_HEIGHT / LCD_HEIGHT * LCD_WIDTH]); + else + { + rb->lcd_set_foreground((wfx[x + y * NES_DISP_HEIGHT / LCD_HEIGHT * LCD_WIDTH] + + wfx[x + y * NES_DISP_HEIGHT / LCD_HEIGHT * LCD_WIDTH]) / 2); + } + rb->lcd_drawpixel(x, y); + } + } + + +#endif + + rb->lcd_update(); + //rb->splash(stime, "mapper no: %d", MapperNo); + /* SDL_LockSurface(screen); + pl=(BYTE *)screen->pixels; pw = WorkFrame; + for(y=0; ypitch; pw+=(0x100-NES_DISP_WIDTH); + } + SDL_UnlockSurface(screen); + SDL_Flip(screen); +*/ +} + +/* Get a joypad state */ +void InfoNES_PadState( DWORD *pdwPad1, DWORD *pdwPad2, DWORD *pdwSystem ) +{ + poll_event(); + *pdwPad1 = dwPad1; + *pdwPad2 = dwPad2; + *pdwSystem = dwSystem; +} + +static const int joy_commit_range = 3276; + +void poll_event(void) +{ + int bs; + + bs = rb->button_status(); + + if(bs & NES_BUTTON_UP) //up + dwPad1 |= 1 << 4; + else + dwPad1 &= ~(1 << 4); + if(bs & NES_BUTTON_DOWN) //down + dwPad1 |= 1 << 5; + else + dwPad1 &= ~(1 << 5); + if(bs & NES_BUTTON_LEFT) //left + dwPad1 |= 1 << 6; + else + dwPad1 &= ~(1 << 6); + if(bs & NES_BUTTON_RIGHT) //right + dwPad1 |= 1 << 7; + else + dwPad1 &= ~(1 << 7); + if(bs & NES_BUTTON_A) //a //upper right + dwPad1 |= 1 << 1; + else + dwPad1 &= ~(1 << 1); + if(bs & NES_BUTTON_B) //b //mid right + dwPad1 |= 1 << 0; + else + dwPad1 &= ~(1 << 0); + if(bs & NES_BUTTON_SELECT) //select //low right + dwPad1 |= 1 << 2; + else + dwPad1 &= ~(1 << 2); + if(bs & NES_BUTTON_START) //start //left + dwPad1 |= 1 << 3; + else + dwPad1 &= ~(1 << 3); + + /* + //switch(rb->button_get(0) + switch(rb->button_status()) + { + case 0x40: //up + dwPad1 = 1 << 4; break; + case 0x80: //down + dwPad1 = 1 << 5; break; + case 0x02: //left + dwPad1 = 1 << 6; break; + case 0x04: //right + dwPad1 = 1 << 7; break; + case 0x08: //a //upper right + dwPad1 = 1 << 1; break; + case 0x10: //b //mid right + dwPad1 = 1 << 0; break; + case 0x20: //select //low right + dwPad1 = 1 << 2; break; + case 0x01: //start //left + dwPad1 = 1 << 3; break; + + default: + dwPad1 = 0; + break; + } */ + + if(dwPad1 & (1 << 3)) + ++start_menu; + + if(start_menu == 20) + menu(); + return; +#if 0 + SDL_Event e; + static signed char x_joy=0, y_joy=0; + + while(SDL_PollEvent(&e)) + { + switch(e.type) + { + case SDL_QUIT: + dwSystem|=PAD_SYS_QUIT; + quit=1; + break; + + case SDL_KEYDOWN: + switch(e.key.keysym.sym) + { + + case SDLK_ESCAPE: + dwSystem|=PAD_SYS_QUIT; + quit=1; + break; +/* + case SDLK_RIGHT: dwPad1 |= (1<<7);break; + case SDLK_LEFT: dwPad1 |= (1<<6);break; + case SDLK_DOWN: dwPad1 |= (1<<5);break; + case SDLK_UP: dwPad1 |= (1<<4);break; + case SDLK_s: dwPad1 |= (1<<3);break; Start + case SDLK_a: dwPad1 |= (1<<2);break; Select + case SDLK_z: dwPad1 |= (1<<1);break; 'B' + case SDLK_x: dwPad1 |= (1<<0);break; 'A' +*/ + case SDLK_f: dwPad1 |= (1<<7);break; + case SDLK_w: dwPad1 |= (1<<6);break; + case SDLK_d: dwPad1 |= (1<<5);break; + case SDLK_a: dwPad1 |= (1<<4);break; + case SDLK_m: dwPad1 |= (1<<3);break; + case SDLK_2: dwPad1 |= (1<<2);break; + case SDLK_3: dwPad1 |= (1<<1);break; + case SDLK_RETURN: dwPad1 |= (1<<0);break; + + case SDLK_c: + /* Toggle up and down clipping + PPU_UpDown_Clip = ( PPU_UpDown_Clip ? 0 : 1 ); */ break; + + } /* keydown */ + break; + + case SDL_KEYUP: + switch(e.key.keysym.sym) + { + case SDLK_f: dwPad1 &=~(1<<7);break; + case SDLK_w: dwPad1 &=~(1<<6);break; + case SDLK_d: dwPad1 &=~(1<<5);break; + case SDLK_a: dwPad1 &=~(1<<4);break; + case SDLK_m: dwPad1 &=~(1<<3);break; /* Start */ + case SDLK_2: dwPad1 &=~(1<<2);break; /* Select */ + case SDLK_3: dwPad1 &=~(1<<1);break; /* 'B' */ + case SDLK_RETURN: dwPad1 &=~(1<<0);break; /* 'A' */ + } /* keyup */ + break; + +/* + case SDL_JOYAXISMOTION: + switch(e.jaxis.axis){ + case 0: + if(e.jaxis.value > joy_commit_range){ + if(x_joy > 0) break; + if(x_joy < 0) dwPad1 &=~(1<<6); + dwPad1 |= (1<<7); x_joy=+1; break; } + if(e.jaxis.value < -joy_commit_range){ + if(x_joy < 0) break; + if(x_joy > 0) dwPad1 &=~(1<<7); + dwPad1 |= (1<<6); x_joy=-1; break; } + if (x_joy < 0) dwPad1 &=~(1<<6); + else if(x_joy > 0) dwPad1 &=~(1<<7); + x_joy= 0; break; + case 1: + if(e.jaxis.value > joy_commit_range){ + if(y_joy > 0) break; + if(y_joy < 0) dwPad1 &=~(1<<4); + dwPad1 |= (1<<5); y_joy=+1; break; } + if(e.jaxis.value < -joy_commit_range){ + if(y_joy < 0) break; + if(y_joy > 0) dwPad1 &=~(1<<5); + dwPad1 |= (1<<4); y_joy=-1; break; } + if (y_joy < 0) dwPad1 &=~(1<<4); + else if (y_joy > 0) dwPad1 &=~(1<<5); + y_joy= 0; break; + } + + case SDL_JOYBUTTONUP: + switch(e.jbutton.button){ + case 2: dwPad1 &=~(1<<0);break; + case 1: dwPad1 &=~(1<<1);break; + case 8: dwPad1 &=~(1<<2);break; + case 9: dwPad1 &=~(1<<3);break; + } break; + case SDL_JOYBUTTONDOWN: + switch(e.jbutton.button){ + case 2: dwPad1 |= (1<<0);break; + case 1: dwPad1 |= (1<<1);break; + case 8: dwPad1 |= (1<<2);break; + case 9: dwPad1 |= (1<<3);break; + } break; +*/ + + } + } +#endif + return; +} + +/* memcpy */ +void *InfoNES_MemoryCopy( void *dest, const void *src, int count ){ + rb->memcpy( dest, src, count ); + return dest; +} + +/* memset */ +void *InfoNES_MemorySet( void *dest, int c, int count ){ + rb->memset( dest, c, count); + return dest; +} + +/* Print debug message */ +void InfoNES_DebugPrint( char *pszMsg ) { + rb->splash(stime, "%s\n", pszMsg); +} + +/* Wait */ +void InfoNES_Wait(){} + +/* Sound Initialize */ +void InfoNES_SoundInit( void ){ } + +void waveout(void *udat,BYTE *stream,int len){ + +if(!wavdone) + { + rb->pcm_play_data(NULL, &final_wave[(wavflag -1) << 10], len); + wavflag = 0; wavdone= 1; +} +//rb->pcm_play_data(NULL, stream, len); +/* + if ( !wavdone ) + { + memcpy( stream, &final_wave[(wavflag - 1) << 10], len ); + wavflag = 0; wavdone = 1; + } +*/ +} + +/* Sound Open */ +int InfoNES_SoundOpen( int samples_per_sync, int sample_rate ){ +//rb->pcm_init(); +rb->pcm_set_frequency(44100); +sample_rate=44100; +/* + SDL_AudioSpec asp; + + asp.freq=sample_rate; + asp.format=AUDIO_U8; + asp.channels=1; + asp.samples=1024; + asp.callback=waveout; + + if(SDL_OpenAudio(&asp,&audio_spec)<0){ + fprintf(stderr,"Can't Open SDL Audio\n"); + return -1; + } + waveptr = wavflag = 0; wavdone = 1; + SDL_PauseAudio(0); +*/ + + return 1; +} + +/* Sound Close */ +void InfoNES_SoundClose( void ){ +/* + SDL_CloseAudio(); +*/ +} + +void InfoNES_SoundOutput( int samples, BYTE *wave1, BYTE *wave2, BYTE *wave3, BYTE *wave4, BYTE *wave5 ) +{ + int i; + + // if ( sound_fd ) + { + for (i = 0; i < samples; i++) + { +#if 1 + final_wave[ waveptr ] = + ( wave1[i] + wave2[i] + wave3[i] + wave4[i] + wave5[i] ) / 5; +#else + final_wave[ waveptr ] = wave4[i]; +#endif + + + waveptr++; + if ( waveptr == 2048 ) + { + waveptr = 0; + wavflag = 2; + } + else if ( waveptr == 1024 ) + { + wavflag = 1; + } + } + + if ( wavflag ) + { + /*if ( write( sound_fd, &final_wave[(wavflag - 1) << 10], 1024) < 1024 ) + { + InfoNES_MessageBox( "wrote less than 1024 bytes\n" ); + }*/ + // rb->pcm_play_data(NULL, &final_wave[(wavflag -1) << 10], 1024); + wavflag = 0; + } + } +} + +#if 0 +/* Sound Output 5 Waves - 2 Pulse, 1 Triangle, 1 Noise. 1 DPCM */ +void InfoNES_SoundOutput(int samples, BYTE *wave1, BYTE *wave2, BYTE *wave3, BYTE *wave4, BYTE *wave5){ + + +int i; + for (i = 0; i < samples; i++) + { + final_wave[waveptr] = + ( wave1[i] + wave2[i] + wave3[i] + wave4[i] + wave5[i] ) / 5; + + waveptr++; + + if ( waveptr == 2048) + { + waveptr = 0; + wavflag = 2; wavdone=0; + } + else if ( waveptr == 1024) + { + wavflag = 1; wavdone=0; + } + + //while (!wavdone) SDL_Delay(0); + //rb->pcm_play_data(NULL, &final_wave[(wavflag -1) << 10], 2048); + rb->pcm_play_data(NULL, &final_wave[(wavflag -1) << 10], i); + //rb->pcm_play_data(NULL, final_wave, 1024); + wavflag = 0; wavdone= 1; + } + +//rb->pcm_play_data(NULL, final_wave, samples); +//wavflag = 0; wavdone= 1; +} +#endif + +/* Print system message */ +void InfoNES_MessageBox(char *pszMsg, ...){} + +/* End of InfoNES_System_SDL.cpp */ + +void menu(void) + { + start_menu = 0; + dwPad1 &= ~(1 << 3); + MENUITEM_STRINGLIST(menu, "Menu", NULL, "Load", "Save", "Video", "Sound"); + + switch (rb->do_menu(&menu, NULL)) +{ + case 0: //load + rb->splash(1000, "Load"); + break; + case 1: //Save + rb->splash(1000, "save"); + break; + case 3: //video options + rb->splash(1000, "video"); + break; + case 4: //sound options + rb->splash(1000, "sound"); + default: /* user didnt select either item */ + break; + } + return; +} + Index: apps/plugins/infones/Makefile =================================================================== --- apps/plugins/infones/Makefile (revision 0) +++ apps/plugins/infones/Makefile (revision 0) @@ -0,0 +1,120 @@ +# __________ __ ___. +# Open \______ \ ____ ____ | | _\_ |__ _______ ___ +# Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / +# Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < +# Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ +# \/ \/ \/ \/ \/ +# $Id: Makefile 14071 2007-07-30 05:19:05Z midgey34 $ +# + +INCLUDES = -I$(APPSDIR) -I.. -I. $(TARGET_INC) -I$(FIRMDIR)/include -I$(FIRMDIR)/export \ + -I$(FIRMDIR)/common -I$(FIRMDIR)/drivers -I$(OUTDIR) -I$(BUILDDIR) +#CFLAGS = $(INCLUDES) $(GCCOPTS) -O2 $(TARGET) $(EXTRA_DEFINES) \ +# -DTARGET_ID=$(TARGET_ID) -DMEM=${MEMORYSIZE} -DPLUGIN -finline-functions +CFLAGS = $(INCLUDES) $(GCCOPTS) -O1 $(TARGET) $(EXTRA_DEFINES) \ + -DTARGET_ID=$(TARGET_ID) -DMEM=${MEMORYSIZE} -DPLUGIN -finline-functions + + +ifdef APPEXTRA + INCLUDES += $(patsubst %,-I$(APPSDIR)/%,$(subst :, ,$(APPEXTRA))) +endif + +LINKFILE := $(OBJDIR)/link.lds +DEPFILE = $(OBJDIR)/dep-infones +SRC = InfoNES_System_Rockbox.c InfoNES.c K6502.c InfoNES_Mapper.c InfoNES_pAPU.c + +#CFLAGS += -DDYNAREC +#SRC += dynarec.c + +SOURCES = $(SRC) +OBJS := $(SRC:%.c=$(OBJDIR)/%.o) +DIRS = . + +ifndef SIMVER +ifneq (,$(findstring RECORDER,$(TARGET))) ## Archos recorder targets + LDS := archos.lds + OUTPUT = $(OUTDIR)/infones.rock +else ## iRiver target + LDS := ../plugin.lds + OUTPUT = $(OUTDIR)/infones.rock +endif +else ## simulators + OUTPUT = $(OUTDIR)/infones.rock +endif + +all: $(OUTPUT) + +ifndef SIMVER +$(OBJDIR)/infones.elf: $(OBJS) $(LINKFILE) + $(call PRINTS,LD $(@F))$(CC) $(CFLAGS) -o $@ $(OBJS) -L$(BUILDDIR) -lplugin -fast -lgcc \ + -T$(LINKFILE) -Wl,-Map,$(OBJDIR)/infones.map + +$(OUTPUT): $(OBJDIR)/infones.elf + $(call PRINTS,OBJCOPY $(@F))$(OC) -O binary $< $@ +else + +ifeq ($(SIMVER), x11) +################################################### +# This is the X11 simulator version + +$(OUTPUT): $(OBJS) + $(call PRINTS,LD $(@F))$(CC) $(CFLAGS) $(SHARED_FLAG) $(OBJS) -L$(BUILDDIR) -lplugin -o $@ +ifeq ($(findstring CYGWIN,$(UNAME)),CYGWIN) +# 'x' must be kept or you'll have "Win32 error 5" +# $ fgrep 5 /usr/include/w32api/winerror.h | head -1 +# #define ERROR_ACCESS_DENIED 5L +else + @chmod -x $@ +endif + +else # end of x11-simulator +ifeq ($(SIMVER), sdl) +################################################### +# This is the sdl simulator version + +$(OUTPUT): $(OBJS) + $(call PRINTS,LD $(@F))$(CC) $(CFLAGS) $(SHARED_FLAG) $(OBJS) -L$(BUILDDIR) -lplugin -o $@ +ifeq ($(findstring CYGWIN,$(UNAME)),CYGWIN) +# 'x' must be kept or you'll have "Win32 error 5" +# $ fgrep 5 /usr/include/w32api/winerror.h | head -1 +# #define ERROR_ACCESS_DENIED 5L +else + @chmod -x $@ +endif + +else # end of sdl-simulator +################################################### +# This is the win32 simulator version +DLLTOOLFLAGS = --export-all +DLLWRAPFLAGS = -s --entry _DllMain@12 --target=i386-mingw32 -mno-cygwin + +$(OUTPUT): $(OBJS) + $(call PRINTS,DLL $(@F))$(DLLTOOL) $(DLLTOOLFLAGS) -z $(OBJDIR)/$*.def $(OBJS) + $(SILENT)$(DLLWRAP) $(DLLWRAPFLAGS) --def $(OBJDIR)/$*.def $(OBJS) \ + $(BUILDDIR)/libplugin.a -o $@ +ifeq ($(findstring CYGWIN,$(UNAME)),CYGWIN) +# 'x' must be kept or you'll have "Win32 error 5" +# $ fgrep 5 /usr/include/w32api/winerror.h | head -1 +# #define ERROR_ACCESS_DENIED 5L +else + @chmod -x $@ +endif +endif # end of win32-simulator +endif +endif # end of simulator section + + +include $(TOOLSDIR)/make.inc + +# MEMORYSIZE should be passed on to this makefile with the chosen memory size +# given in number of MB +$(LINKFILE): $(LDS) + $(call PRINTS,build $(@F))cat $< | $(CC) -DMEMORYSIZE=$(MEMORYSIZE) $(INCLUDES) $(TARGET) $(DEFINES) \ + -E -P - >$@ + +clean: + $(call PRINTS,cleaning infones)rm -rf $(OBJDIR)/infones + $(SILENT)rm -f $(OBJDIR)/infones.* $(DEPFILE) + +-include $(DEPFILE) + Index: apps/plugins/SUBDIRS =================================================================== --- apps/plugins/SUBDIRS (revision 14814) +++ apps/plugins/SUBDIRS (working copy) @@ -1,3 +1,4 @@ +infones #ifndef IRIVER_IFP7XX_SERIES /* For all targets */