test

Dependencies:   SDFileSystem mbed-dev

Fork of Nucleo_Ex06_EMU by woodstock .

Committer:
charliex
Date:
Sat May 27 02:17:37 2017 +0000
Revision:
4:53ef91c87d74
Parent:
0:3dac1f1bc9e0
test

Who changed what in which revision?

UserRevisionLine numberNew contents of line
beaglescout007 0:3dac1f1bc9e0 1 /*===================================================================*/
beaglescout007 0:3dac1f1bc9e0 2 /* */
beaglescout007 0:3dac1f1bc9e0 3 /* pNesX_Mapper.cpp : pNesX Mapper Function */
beaglescout007 0:3dac1f1bc9e0 4 /* */
beaglescout007 0:3dac1f1bc9e0 5 /* 1999/11/03 Racoon New preparation */
beaglescout007 0:3dac1f1bc9e0 6 /* */
beaglescout007 0:3dac1f1bc9e0 7 /*===================================================================*/
beaglescout007 0:3dac1f1bc9e0 8
beaglescout007 0:3dac1f1bc9e0 9 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 10 /* Include files */
beaglescout007 0:3dac1f1bc9e0 11 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 12
beaglescout007 0:3dac1f1bc9e0 13 #include "pNesX.h"
beaglescout007 0:3dac1f1bc9e0 14 #include "pNesX_System.h"
beaglescout007 0:3dac1f1bc9e0 15 #include "pNesX_Mapper.h"
beaglescout007 0:3dac1f1bc9e0 16 #include "K6502.h"
beaglescout007 0:3dac1f1bc9e0 17
beaglescout007 0:3dac1f1bc9e0 18 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 19 /* Table of Mapper initialize function */
beaglescout007 0:3dac1f1bc9e0 20 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 21
beaglescout007 0:3dac1f1bc9e0 22 struct MapperTable_tag MapperTable[] =
beaglescout007 0:3dac1f1bc9e0 23 {
beaglescout007 0:3dac1f1bc9e0 24 { 0, Map0_Init },
beaglescout007 0:3dac1f1bc9e0 25 { 1, Map1_Init },
beaglescout007 0:3dac1f1bc9e0 26 { 2, Map2_Init },
beaglescout007 0:3dac1f1bc9e0 27 { 3, Map3_Init },
beaglescout007 0:3dac1f1bc9e0 28 { 4, Map4_Init },
beaglescout007 0:3dac1f1bc9e0 29 { -1, NULL }
beaglescout007 0:3dac1f1bc9e0 30 };
beaglescout007 0:3dac1f1bc9e0 31
beaglescout007 0:3dac1f1bc9e0 32 /*===================================================================*/
beaglescout007 0:3dac1f1bc9e0 33 /* */
beaglescout007 0:3dac1f1bc9e0 34 /* Mapper 0 */
beaglescout007 0:3dac1f1bc9e0 35 /* */
beaglescout007 0:3dac1f1bc9e0 36 /*===================================================================*/
beaglescout007 0:3dac1f1bc9e0 37
beaglescout007 0:3dac1f1bc9e0 38 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 39 /* Initialize Mapper 0 */
beaglescout007 0:3dac1f1bc9e0 40 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 41 void Map0_Init()
beaglescout007 0:3dac1f1bc9e0 42 {
beaglescout007 0:3dac1f1bc9e0 43 /* Initialize Mapper */
beaglescout007 0:3dac1f1bc9e0 44 MapperInit = Map0_Init;
beaglescout007 0:3dac1f1bc9e0 45
beaglescout007 0:3dac1f1bc9e0 46 /* Write to Mapper */
beaglescout007 0:3dac1f1bc9e0 47 MapperWrite = Map0_Write;
beaglescout007 0:3dac1f1bc9e0 48
beaglescout007 0:3dac1f1bc9e0 49 /* Callback at VSync */
beaglescout007 0:3dac1f1bc9e0 50 MapperVSync = Map0_VSync;
beaglescout007 0:3dac1f1bc9e0 51
beaglescout007 0:3dac1f1bc9e0 52 /* Callback at HSync */
beaglescout007 0:3dac1f1bc9e0 53 MapperHSync = Map0_HSync;
beaglescout007 0:3dac1f1bc9e0 54
beaglescout007 0:3dac1f1bc9e0 55 /* Set ROM Banks */
beaglescout007 0:3dac1f1bc9e0 56 ROMBANK0 = ROMPAGE( 0 );
beaglescout007 0:3dac1f1bc9e0 57 ROMBANK1 = ROMPAGE( 1 );
beaglescout007 0:3dac1f1bc9e0 58 ROMBANK2 = ROMLASTPAGE( 1 );
beaglescout007 0:3dac1f1bc9e0 59 ROMBANK3 = ROMLASTPAGE( 0 );
beaglescout007 0:3dac1f1bc9e0 60
beaglescout007 0:3dac1f1bc9e0 61 /* Set PPU Banks */
beaglescout007 0:3dac1f1bc9e0 62 if ( NesHeader.byVRomSize > 0 )
beaglescout007 0:3dac1f1bc9e0 63 {
beaglescout007 0:3dac1f1bc9e0 64 for ( int nPage = 0; nPage < 8; ++nPage )
beaglescout007 0:3dac1f1bc9e0 65 PPUBANK[ nPage ] = &VROM[ nPage * 0x400 ];
beaglescout007 0:3dac1f1bc9e0 66
beaglescout007 0:3dac1f1bc9e0 67 pNesX_SetupChr();
beaglescout007 0:3dac1f1bc9e0 68 }
beaglescout007 0:3dac1f1bc9e0 69
beaglescout007 0:3dac1f1bc9e0 70 /* Set up wiring of the interrupt pin */
beaglescout007 0:3dac1f1bc9e0 71 K6502_Set_Int_Wiring( 1, 1 );
beaglescout007 0:3dac1f1bc9e0 72 }
beaglescout007 0:3dac1f1bc9e0 73
beaglescout007 0:3dac1f1bc9e0 74 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 75 /* Mapper 0 Write Function */
beaglescout007 0:3dac1f1bc9e0 76 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 77 void Map0_Write( WORD wAddr, BYTE byData )
beaglescout007 0:3dac1f1bc9e0 78 {
beaglescout007 0:3dac1f1bc9e0 79 /*
beaglescout007 0:3dac1f1bc9e0 80 * Dummy Write to Mapper
beaglescout007 0:3dac1f1bc9e0 81 *
beaglescout007 0:3dac1f1bc9e0 82 */
beaglescout007 0:3dac1f1bc9e0 83 }
beaglescout007 0:3dac1f1bc9e0 84
beaglescout007 0:3dac1f1bc9e0 85 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 86 /* Mapper 0 V-Sync Function */
beaglescout007 0:3dac1f1bc9e0 87 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 88 void Map0_VSync()
beaglescout007 0:3dac1f1bc9e0 89 {
beaglescout007 0:3dac1f1bc9e0 90 /*
beaglescout007 0:3dac1f1bc9e0 91 * Dummy Callback at VSync
beaglescout007 0:3dac1f1bc9e0 92 *
beaglescout007 0:3dac1f1bc9e0 93 */
beaglescout007 0:3dac1f1bc9e0 94 }
beaglescout007 0:3dac1f1bc9e0 95
beaglescout007 0:3dac1f1bc9e0 96 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 97 /* Mapper 0 H-Sync Function */
beaglescout007 0:3dac1f1bc9e0 98 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 99 void Map0_HSync()
beaglescout007 0:3dac1f1bc9e0 100 {
beaglescout007 0:3dac1f1bc9e0 101 /*
beaglescout007 0:3dac1f1bc9e0 102 * Dummy Callback at HSync
beaglescout007 0:3dac1f1bc9e0 103 *
beaglescout007 0:3dac1f1bc9e0 104 */
beaglescout007 0:3dac1f1bc9e0 105 }
beaglescout007 0:3dac1f1bc9e0 106
beaglescout007 0:3dac1f1bc9e0 107 /*===================================================================*/
beaglescout007 0:3dac1f1bc9e0 108 /* */
beaglescout007 0:3dac1f1bc9e0 109 /* Mapper 1 */
beaglescout007 0:3dac1f1bc9e0 110 /* */
beaglescout007 0:3dac1f1bc9e0 111 /*===================================================================*/
beaglescout007 0:3dac1f1bc9e0 112
beaglescout007 0:3dac1f1bc9e0 113 BYTE Map1_Reg[ 4 ];
beaglescout007 0:3dac1f1bc9e0 114
beaglescout007 0:3dac1f1bc9e0 115 int Map1_Cnt;
beaglescout007 0:3dac1f1bc9e0 116 BYTE Map1_Latch;
beaglescout007 0:3dac1f1bc9e0 117
beaglescout007 0:3dac1f1bc9e0 118 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 119 /* Initialize Mapper 1 */
beaglescout007 0:3dac1f1bc9e0 120 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 121 void Map1_Init()
beaglescout007 0:3dac1f1bc9e0 122 {
beaglescout007 0:3dac1f1bc9e0 123 int nPage;
beaglescout007 0:3dac1f1bc9e0 124
beaglescout007 0:3dac1f1bc9e0 125 /* Initialize Mapper */
beaglescout007 0:3dac1f1bc9e0 126 MapperInit = Map1_Init;
beaglescout007 0:3dac1f1bc9e0 127
beaglescout007 0:3dac1f1bc9e0 128 /* Write to Mapper */
beaglescout007 0:3dac1f1bc9e0 129 MapperWrite = Map1_Write;
beaglescout007 0:3dac1f1bc9e0 130
beaglescout007 0:3dac1f1bc9e0 131 /* Callback at VSync */
beaglescout007 0:3dac1f1bc9e0 132 MapperVSync = Map0_VSync;
beaglescout007 0:3dac1f1bc9e0 133
beaglescout007 0:3dac1f1bc9e0 134 /* Callback at HSync */
beaglescout007 0:3dac1f1bc9e0 135 MapperHSync = Map0_HSync;
beaglescout007 0:3dac1f1bc9e0 136
beaglescout007 0:3dac1f1bc9e0 137 pNesX_MemorySet( Map1_Reg, 0, sizeof Map1_Reg );
beaglescout007 0:3dac1f1bc9e0 138 Map1_Cnt = Map1_Latch = 0;
beaglescout007 0:3dac1f1bc9e0 139
beaglescout007 0:3dac1f1bc9e0 140 /* Set ROM Banks */
beaglescout007 0:3dac1f1bc9e0 141 ROMBANK0 = ROMPAGE( 0 );
beaglescout007 0:3dac1f1bc9e0 142 ROMBANK1 = ROMPAGE( 1 );
beaglescout007 0:3dac1f1bc9e0 143 ROMBANK2 = ROMLASTPAGE( 1 );
beaglescout007 0:3dac1f1bc9e0 144 ROMBANK3 = ROMLASTPAGE( 0 );
beaglescout007 0:3dac1f1bc9e0 145
beaglescout007 0:3dac1f1bc9e0 146 /* Set PPU VROM Banks */
beaglescout007 0:3dac1f1bc9e0 147 if ( NesHeader.byVRomSize > 0 )
beaglescout007 0:3dac1f1bc9e0 148 {
beaglescout007 0:3dac1f1bc9e0 149 for ( nPage = 0; nPage < 8; ++nPage )
beaglescout007 0:3dac1f1bc9e0 150 PPUBANK[ nPage ] = &VROM[ nPage * 0x400 ];
beaglescout007 0:3dac1f1bc9e0 151
beaglescout007 0:3dac1f1bc9e0 152 pNesX_SetupChr();
beaglescout007 0:3dac1f1bc9e0 153 }
beaglescout007 0:3dac1f1bc9e0 154
beaglescout007 0:3dac1f1bc9e0 155 /* Set up wiring of the interrupt pin */
beaglescout007 0:3dac1f1bc9e0 156 K6502_Set_Int_Wiring( 1, 1 );
beaglescout007 0:3dac1f1bc9e0 157 }
beaglescout007 0:3dac1f1bc9e0 158
beaglescout007 0:3dac1f1bc9e0 159 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 160 /* Mapper 1 Write Function */
beaglescout007 0:3dac1f1bc9e0 161 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 162 void Map1_Write( WORD wAddr, BYTE byData )
beaglescout007 0:3dac1f1bc9e0 163 {
beaglescout007 0:3dac1f1bc9e0 164 /*
beaglescout007 0:3dac1f1bc9e0 165 * MMC1
beaglescout007 0:3dac1f1bc9e0 166 */
beaglescout007 0:3dac1f1bc9e0 167
beaglescout007 0:3dac1f1bc9e0 168 int nReg;
beaglescout007 0:3dac1f1bc9e0 169 int nROMPos;
beaglescout007 0:3dac1f1bc9e0 170 int nBank;
beaglescout007 0:3dac1f1bc9e0 171 int nVBank;
beaglescout007 0:3dac1f1bc9e0 172 int nPage;
beaglescout007 0:3dac1f1bc9e0 173
beaglescout007 0:3dac1f1bc9e0 174 nReg = ( wAddr >> 13 ) - 4;
beaglescout007 0:3dac1f1bc9e0 175
beaglescout007 0:3dac1f1bc9e0 176 if ( byData & 0x80 )
beaglescout007 0:3dac1f1bc9e0 177 {
beaglescout007 0:3dac1f1bc9e0 178 // Reset
beaglescout007 0:3dac1f1bc9e0 179 Map1_Reg[ 0 ] |= 0xc;
beaglescout007 0:3dac1f1bc9e0 180 Map1_Cnt = 0;
beaglescout007 0:3dac1f1bc9e0 181 Map1_Latch = 0;
beaglescout007 0:3dac1f1bc9e0 182 return;
beaglescout007 0:3dac1f1bc9e0 183 }
beaglescout007 0:3dac1f1bc9e0 184 else
beaglescout007 0:3dac1f1bc9e0 185 {
beaglescout007 0:3dac1f1bc9e0 186 // Bit Data Set
beaglescout007 0:3dac1f1bc9e0 187 Map1_Latch |= ( ( byData & 1 ) << Map1_Cnt );
beaglescout007 0:3dac1f1bc9e0 188 ++Map1_Cnt;
beaglescout007 0:3dac1f1bc9e0 189 }
beaglescout007 0:3dac1f1bc9e0 190
beaglescout007 0:3dac1f1bc9e0 191 if ( Map1_Cnt < 5 )
beaglescout007 0:3dac1f1bc9e0 192 return;
beaglescout007 0:3dac1f1bc9e0 193
beaglescout007 0:3dac1f1bc9e0 194 // 5Bits Latched
beaglescout007 0:3dac1f1bc9e0 195 Map1_Reg[ nReg ] = ( nReg == 3 ) ? ( Map1_Latch & 0xf ) : Map1_Latch;
beaglescout007 0:3dac1f1bc9e0 196 Map1_Cnt = 0;
beaglescout007 0:3dac1f1bc9e0 197 Map1_Latch = 0;
beaglescout007 0:3dac1f1bc9e0 198
beaglescout007 0:3dac1f1bc9e0 199 // Name Table Mirroring
beaglescout007 0:3dac1f1bc9e0 200 pNesX_Mirroring( ( Map1_Reg[ 0 ] & 3 ) ^ 3 );
beaglescout007 0:3dac1f1bc9e0 201
beaglescout007 0:3dac1f1bc9e0 202 // Select Program ROM Bank
beaglescout007 0:3dac1f1bc9e0 203
beaglescout007 0:3dac1f1bc9e0 204 // 256K ROM Position Selection
beaglescout007 0:3dac1f1bc9e0 205 nROMPos = 0;
beaglescout007 0:3dac1f1bc9e0 206 if ( NesHeader.byRomSize == 32 )
beaglescout007 0:3dac1f1bc9e0 207 {
beaglescout007 0:3dac1f1bc9e0 208 /* 512K Program ROM */
beaglescout007 0:3dac1f1bc9e0 209 // 0 (First 256K) or 32 (Second 256K)
beaglescout007 0:3dac1f1bc9e0 210 nROMPos = ( Map1_Reg[ 1 ] & 0x10 ) << 1;
beaglescout007 0:3dac1f1bc9e0 211 }
beaglescout007 0:3dac1f1bc9e0 212 else
beaglescout007 0:3dac1f1bc9e0 213 if ( NesHeader.byRomSize == 64 )
beaglescout007 0:3dac1f1bc9e0 214 {
beaglescout007 0:3dac1f1bc9e0 215 /* 1024K Program ROM */
beaglescout007 0:3dac1f1bc9e0 216 if ( Map1_Reg[ 0 ] & 0x10 )
beaglescout007 0:3dac1f1bc9e0 217 {
beaglescout007 0:3dac1f1bc9e0 218 // Acknowledge 256K selection register 1
beaglescout007 0:3dac1f1bc9e0 219 nROMPos = ( ( Map1_Reg[ 1 ] & 0x10 ) << 1 ) |
beaglescout007 0:3dac1f1bc9e0 220 ( ( Map1_Reg[ 2 ] & 0x10 ) << 2 );
beaglescout007 0:3dac1f1bc9e0 221 }
beaglescout007 0:3dac1f1bc9e0 222 else
beaglescout007 0:3dac1f1bc9e0 223 {
beaglescout007 0:3dac1f1bc9e0 224 // Ignore 256K selection register 1
beaglescout007 0:3dac1f1bc9e0 225 // 0 (First 256K) or 64 (Third 256K)
beaglescout007 0:3dac1f1bc9e0 226 nROMPos = ( Map1_Reg[ 1 ] & 0x10 ) << 2;
beaglescout007 0:3dac1f1bc9e0 227 }
beaglescout007 0:3dac1f1bc9e0 228 }
beaglescout007 0:3dac1f1bc9e0 229
beaglescout007 0:3dac1f1bc9e0 230 // Set Program ROM Bank
beaglescout007 0:3dac1f1bc9e0 231 if ( !( Map1_Reg[ 0 ] & 8 ) )
beaglescout007 0:3dac1f1bc9e0 232 {
beaglescout007 0:3dac1f1bc9e0 233 // 32K ROM Bank
beaglescout007 0:3dac1f1bc9e0 234 /* Set ROM Banks */
beaglescout007 0:3dac1f1bc9e0 235 nBank = ( ( Map1_Reg[ 3 ] << 2 ) + nROMPos ) % ( NesHeader.byRomSize << 1 );
beaglescout007 0:3dac1f1bc9e0 236
beaglescout007 0:3dac1f1bc9e0 237 ROMBANK0 = ROMPAGE( nBank );
beaglescout007 0:3dac1f1bc9e0 238 ROMBANK1 = ROMPAGE( nBank + 1 );
beaglescout007 0:3dac1f1bc9e0 239 ROMBANK2 = ROMPAGE( nBank + 2 );
beaglescout007 0:3dac1f1bc9e0 240 ROMBANK3 = ROMPAGE( nBank + 3 );
beaglescout007 0:3dac1f1bc9e0 241 }
beaglescout007 0:3dac1f1bc9e0 242 else
beaglescout007 0:3dac1f1bc9e0 243 if ( Map1_Reg[ 0 ] & 4 )
beaglescout007 0:3dac1f1bc9e0 244 {
beaglescout007 0:3dac1f1bc9e0 245 // 16K ROM Bank at 0x8000
beaglescout007 0:3dac1f1bc9e0 246 nBank = ( ( Map1_Reg[ 3 ] << 1 ) + nROMPos ) % ( NesHeader.byRomSize << 1 );
beaglescout007 0:3dac1f1bc9e0 247 ROMBANK0 = ROMPAGE( nBank );
beaglescout007 0:3dac1f1bc9e0 248 ROMBANK1 = ROMPAGE( nBank + 1 );
beaglescout007 0:3dac1f1bc9e0 249 ROMBANK2 = ROMLASTPAGE( 1 );
beaglescout007 0:3dac1f1bc9e0 250 ROMBANK3 = ROMLASTPAGE( 0 );
beaglescout007 0:3dac1f1bc9e0 251 }
beaglescout007 0:3dac1f1bc9e0 252 else
beaglescout007 0:3dac1f1bc9e0 253 {
beaglescout007 0:3dac1f1bc9e0 254 // 16K ROM Bank at 0xc000
beaglescout007 0:3dac1f1bc9e0 255 nBank = ( ( Map1_Reg[ 3 ] << 1 ) + nROMPos ) % ( NesHeader.byRomSize << 1 );
beaglescout007 0:3dac1f1bc9e0 256 ROMBANK0 = ROMPAGE( 0 );
beaglescout007 0:3dac1f1bc9e0 257 ROMBANK1 = ROMPAGE( 1 );
beaglescout007 0:3dac1f1bc9e0 258 ROMBANK2 = ROMPAGE( nBank );
beaglescout007 0:3dac1f1bc9e0 259 ROMBANK3 = ROMPAGE( nBank + 1 );
beaglescout007 0:3dac1f1bc9e0 260 }
beaglescout007 0:3dac1f1bc9e0 261
beaglescout007 0:3dac1f1bc9e0 262 // Select PPU VROM Bank
beaglescout007 0:3dac1f1bc9e0 263 if ( NesHeader.byVRomSize > 0 )
beaglescout007 0:3dac1f1bc9e0 264 {
beaglescout007 0:3dac1f1bc9e0 265 if ( Map1_Reg[ 0 ] & 0x10 )
beaglescout007 0:3dac1f1bc9e0 266 {
beaglescout007 0:3dac1f1bc9e0 267 // 4K VROM Switching
beaglescout007 0:3dac1f1bc9e0 268 nVBank = Map1_Reg[ 1 ] % ( NesHeader.byVRomSize << 1 );
beaglescout007 0:3dac1f1bc9e0 269 for ( nPage = 0; nPage < 4; ++nPage )
beaglescout007 0:3dac1f1bc9e0 270 PPUBANK[ nPage ] = &VROM[ nVBank * 0x1000 + nPage * 0x400 ];
beaglescout007 0:3dac1f1bc9e0 271
beaglescout007 0:3dac1f1bc9e0 272 nVBank = Map1_Reg[ 2 ] % ( NesHeader.byVRomSize << 1 );
beaglescout007 0:3dac1f1bc9e0 273 for ( nPage = 0; nPage < 4; ++nPage )
beaglescout007 0:3dac1f1bc9e0 274 PPUBANK[ nPage + 4 ] = &VROM[ nVBank * 0x1000 + nPage * 0x400 ];
beaglescout007 0:3dac1f1bc9e0 275 }
beaglescout007 0:3dac1f1bc9e0 276 else
beaglescout007 0:3dac1f1bc9e0 277 {
beaglescout007 0:3dac1f1bc9e0 278 // 8K VROM Switching
beaglescout007 0:3dac1f1bc9e0 279 nVBank = ( Map1_Reg[ 1 ] & 0xe ) % ( NesHeader.byVRomSize << 1 );
beaglescout007 0:3dac1f1bc9e0 280 for ( nPage = 0; nPage < 8; ++nPage )
beaglescout007 0:3dac1f1bc9e0 281 PPUBANK[ nPage ] = &VROM[ nVBank * 0x1000 + nPage * 0x400 ];
beaglescout007 0:3dac1f1bc9e0 282 }
beaglescout007 0:3dac1f1bc9e0 283
beaglescout007 0:3dac1f1bc9e0 284 pNesX_SetupChr();
beaglescout007 0:3dac1f1bc9e0 285 }
beaglescout007 0:3dac1f1bc9e0 286 }
beaglescout007 0:3dac1f1bc9e0 287
beaglescout007 0:3dac1f1bc9e0 288 /*===================================================================*/
beaglescout007 0:3dac1f1bc9e0 289 /* */
beaglescout007 0:3dac1f1bc9e0 290 /* Mapper 2 (UNROM) */
beaglescout007 0:3dac1f1bc9e0 291 /* */
beaglescout007 0:3dac1f1bc9e0 292 /*===================================================================*/
beaglescout007 0:3dac1f1bc9e0 293
beaglescout007 0:3dac1f1bc9e0 294 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 295 /* Initialize Mapper 2 */
beaglescout007 0:3dac1f1bc9e0 296 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 297 void Map2_Init()
beaglescout007 0:3dac1f1bc9e0 298 {
beaglescout007 0:3dac1f1bc9e0 299 /* Initialize Mapper */
beaglescout007 0:3dac1f1bc9e0 300 MapperInit = Map2_Init;
beaglescout007 0:3dac1f1bc9e0 301
beaglescout007 0:3dac1f1bc9e0 302 /* Write to Mapper */
beaglescout007 0:3dac1f1bc9e0 303 MapperWrite = Map2_Write;
beaglescout007 0:3dac1f1bc9e0 304
beaglescout007 0:3dac1f1bc9e0 305 /* Callback at VSync */
beaglescout007 0:3dac1f1bc9e0 306 MapperVSync = Map0_VSync;
beaglescout007 0:3dac1f1bc9e0 307
beaglescout007 0:3dac1f1bc9e0 308 /* Callback at HSync */
beaglescout007 0:3dac1f1bc9e0 309 MapperHSync = Map0_HSync;
beaglescout007 0:3dac1f1bc9e0 310
beaglescout007 0:3dac1f1bc9e0 311 /* Set ROM Banks */
beaglescout007 0:3dac1f1bc9e0 312 ROMBANK0 = ROMPAGE( 0 );
beaglescout007 0:3dac1f1bc9e0 313 ROMBANK1 = ROMPAGE( 1 );
beaglescout007 0:3dac1f1bc9e0 314 ROMBANK2 = ROMLASTPAGE( 1 );
beaglescout007 0:3dac1f1bc9e0 315 ROMBANK3 = ROMLASTPAGE( 0 );
beaglescout007 0:3dac1f1bc9e0 316
beaglescout007 0:3dac1f1bc9e0 317 /* Set up wiring of the interrupt pin */
beaglescout007 0:3dac1f1bc9e0 318 K6502_Set_Int_Wiring( 1, 1 );
beaglescout007 0:3dac1f1bc9e0 319 }
beaglescout007 0:3dac1f1bc9e0 320
beaglescout007 0:3dac1f1bc9e0 321 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 322 /* Mapper 2 Write Function */
beaglescout007 0:3dac1f1bc9e0 323 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 324 void Map2_Write( WORD wAddr, BYTE byData )
beaglescout007 0:3dac1f1bc9e0 325 {
beaglescout007 0:3dac1f1bc9e0 326 /* Set ROM Banks */
beaglescout007 0:3dac1f1bc9e0 327 byData %= NesHeader.byRomSize;
beaglescout007 0:3dac1f1bc9e0 328 byData <<= 1;
beaglescout007 0:3dac1f1bc9e0 329
beaglescout007 0:3dac1f1bc9e0 330 ROMBANK0 = ROMPAGE( byData );
beaglescout007 0:3dac1f1bc9e0 331 ROMBANK1 = ROMPAGE( byData + 1 );
beaglescout007 0:3dac1f1bc9e0 332 }
beaglescout007 0:3dac1f1bc9e0 333
beaglescout007 0:3dac1f1bc9e0 334
beaglescout007 0:3dac1f1bc9e0 335 /*===================================================================*/
beaglescout007 0:3dac1f1bc9e0 336 /* */
beaglescout007 0:3dac1f1bc9e0 337 /* Mapper 3 (VROM Switch) */
beaglescout007 0:3dac1f1bc9e0 338 /* */
beaglescout007 0:3dac1f1bc9e0 339 /*===================================================================*/
beaglescout007 0:3dac1f1bc9e0 340
beaglescout007 0:3dac1f1bc9e0 341 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 342 /* Initialize Mapper 3 */
beaglescout007 0:3dac1f1bc9e0 343 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 344 void Map3_Init()
beaglescout007 0:3dac1f1bc9e0 345 {
beaglescout007 0:3dac1f1bc9e0 346 int nPage;
beaglescout007 0:3dac1f1bc9e0 347
beaglescout007 0:3dac1f1bc9e0 348 /* Initialize Mapper */
beaglescout007 0:3dac1f1bc9e0 349 MapperInit = Map3_Init;
beaglescout007 0:3dac1f1bc9e0 350
beaglescout007 0:3dac1f1bc9e0 351 /* Write to Mapper */
beaglescout007 0:3dac1f1bc9e0 352 MapperWrite = Map3_Write;
beaglescout007 0:3dac1f1bc9e0 353
beaglescout007 0:3dac1f1bc9e0 354 /* Callback at VSync */
beaglescout007 0:3dac1f1bc9e0 355 MapperVSync = Map0_VSync;
beaglescout007 0:3dac1f1bc9e0 356
beaglescout007 0:3dac1f1bc9e0 357 /* Callback at HSync */
beaglescout007 0:3dac1f1bc9e0 358 MapperHSync = Map0_HSync;
beaglescout007 0:3dac1f1bc9e0 359
beaglescout007 0:3dac1f1bc9e0 360 /* Set ROM Banks */
beaglescout007 0:3dac1f1bc9e0 361 ROMBANK0 = ROMPAGE( 0 );
beaglescout007 0:3dac1f1bc9e0 362 ROMBANK1 = ROMPAGE( 1 );
beaglescout007 0:3dac1f1bc9e0 363 ROMBANK2 = ROMLASTPAGE( 1 );
beaglescout007 0:3dac1f1bc9e0 364 ROMBANK3 = ROMLASTPAGE( 0 );
beaglescout007 0:3dac1f1bc9e0 365
beaglescout007 0:3dac1f1bc9e0 366 /* Set PPU Banks */
beaglescout007 0:3dac1f1bc9e0 367 if ( NesHeader.byVRomSize > 0 )
beaglescout007 0:3dac1f1bc9e0 368 {
beaglescout007 0:3dac1f1bc9e0 369 for ( nPage = 0; nPage < 8; ++nPage )
beaglescout007 0:3dac1f1bc9e0 370 PPUBANK[ nPage ] = &VROM[ nPage * 0x400 ];
beaglescout007 0:3dac1f1bc9e0 371 pNesX_SetupChr();
beaglescout007 0:3dac1f1bc9e0 372 }
beaglescout007 0:3dac1f1bc9e0 373
beaglescout007 0:3dac1f1bc9e0 374 /* Set up wiring of the interrupt pin */
beaglescout007 0:3dac1f1bc9e0 375 /* "DragonQuest" doesn't run if IRQ isn't made to occur in CLI */
beaglescout007 0:3dac1f1bc9e0 376 K6502_Set_Int_Wiring( 1, 0 );
beaglescout007 0:3dac1f1bc9e0 377 }
beaglescout007 0:3dac1f1bc9e0 378
beaglescout007 0:3dac1f1bc9e0 379 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 380 /* Mapper 3 Write Function */
beaglescout007 0:3dac1f1bc9e0 381 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 382 void Map3_Write( WORD wAddr, BYTE byData )
beaglescout007 0:3dac1f1bc9e0 383 {
beaglescout007 0:3dac1f1bc9e0 384 int nPage;
beaglescout007 0:3dac1f1bc9e0 385
beaglescout007 0:3dac1f1bc9e0 386 /* Set PPU Banks */
beaglescout007 0:3dac1f1bc9e0 387 byData %= NesHeader.byVRomSize;
beaglescout007 0:3dac1f1bc9e0 388 for ( nPage = 0; nPage < 8; ++nPage )
beaglescout007 0:3dac1f1bc9e0 389 PPUBANK[ nPage ] = &VROM[ byData * 0x2000 + nPage * 0x400 ];
beaglescout007 0:3dac1f1bc9e0 390
beaglescout007 0:3dac1f1bc9e0 391 pNesX_SetupChr();
beaglescout007 0:3dac1f1bc9e0 392 }
beaglescout007 0:3dac1f1bc9e0 393
beaglescout007 0:3dac1f1bc9e0 394 /*===================================================================*/
beaglescout007 0:3dac1f1bc9e0 395 /* */
beaglescout007 0:3dac1f1bc9e0 396 /* Mapper 4 (MMC3) */
beaglescout007 0:3dac1f1bc9e0 397 /* */
beaglescout007 0:3dac1f1bc9e0 398 /*===================================================================*/
beaglescout007 0:3dac1f1bc9e0 399
beaglescout007 0:3dac1f1bc9e0 400 BYTE Map4_VROM_Base;
beaglescout007 0:3dac1f1bc9e0 401 BYTE Map4_ROM_Base;
beaglescout007 0:3dac1f1bc9e0 402 BYTE Map4_Cmd;
beaglescout007 0:3dac1f1bc9e0 403 BYTE Map4_Banks_Reg[ 8 ];
beaglescout007 0:3dac1f1bc9e0 404 BYTE Map4_IRQ_Cnt;
beaglescout007 0:3dac1f1bc9e0 405 BYTE Map4_IRQ_Set;
beaglescout007 0:3dac1f1bc9e0 406 BYTE Map4_IRQ_Enable;
beaglescout007 0:3dac1f1bc9e0 407
beaglescout007 0:3dac1f1bc9e0 408 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 409 /* Initialize Mapper 4 */
beaglescout007 0:3dac1f1bc9e0 410 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 411 void Map4_Init()
beaglescout007 0:3dac1f1bc9e0 412 {
beaglescout007 0:3dac1f1bc9e0 413 /* Initialize Mapper */
beaglescout007 0:3dac1f1bc9e0 414 MapperInit = Map4_Init;
beaglescout007 0:3dac1f1bc9e0 415
beaglescout007 0:3dac1f1bc9e0 416 /* Write to Mapper */
beaglescout007 0:3dac1f1bc9e0 417 MapperWrite = Map4_Write;
beaglescout007 0:3dac1f1bc9e0 418
beaglescout007 0:3dac1f1bc9e0 419 /* Callback at VSync */
beaglescout007 0:3dac1f1bc9e0 420 MapperVSync = Map4_VSync;
beaglescout007 0:3dac1f1bc9e0 421
beaglescout007 0:3dac1f1bc9e0 422 /* Callback at HSync */
beaglescout007 0:3dac1f1bc9e0 423 MapperHSync = Map4_HSync;
beaglescout007 0:3dac1f1bc9e0 424
beaglescout007 0:3dac1f1bc9e0 425 Map4_VROM_Base = Map4_ROM_Base = Map4_Cmd = Map4_IRQ_Cnt = Map4_IRQ_Set = Map4_IRQ_Enable = 0;
beaglescout007 0:3dac1f1bc9e0 426
beaglescout007 0:3dac1f1bc9e0 427 Map4_Banks_Reg[ 0 ] = 0;
beaglescout007 0:3dac1f1bc9e0 428 Map4_Banks_Reg[ 1 ] = 2;
beaglescout007 0:3dac1f1bc9e0 429 Map4_Banks_Reg[ 2 ] = 4;
beaglescout007 0:3dac1f1bc9e0 430 Map4_Banks_Reg[ 3 ] = 5;
beaglescout007 0:3dac1f1bc9e0 431 Map4_Banks_Reg[ 4 ] = 6;
beaglescout007 0:3dac1f1bc9e0 432 Map4_Banks_Reg[ 5 ] = 7;
beaglescout007 0:3dac1f1bc9e0 433 Map4_Banks_Reg[ 6 ] = 0;
beaglescout007 0:3dac1f1bc9e0 434 Map4_Banks_Reg[ 7 ] = 1;
beaglescout007 0:3dac1f1bc9e0 435
beaglescout007 0:3dac1f1bc9e0 436 Map4_Write( 0x8000, 0 );
beaglescout007 0:3dac1f1bc9e0 437 Map4_Write( 0x8001, 0 );
beaglescout007 0:3dac1f1bc9e0 438
beaglescout007 0:3dac1f1bc9e0 439 /* Set up wiring of the interrupt pin */
beaglescout007 0:3dac1f1bc9e0 440 K6502_Set_Int_Wiring( 1, 1 );
beaglescout007 0:3dac1f1bc9e0 441 }
beaglescout007 0:3dac1f1bc9e0 442
beaglescout007 0:3dac1f1bc9e0 443 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 444 /* Mapper 4 Write Function */
beaglescout007 0:3dac1f1bc9e0 445 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 446 void Map4_Write( WORD wAddr, BYTE byData )
beaglescout007 0:3dac1f1bc9e0 447 {
beaglescout007 0:3dac1f1bc9e0 448 WORD wMapAddr;
beaglescout007 0:3dac1f1bc9e0 449
beaglescout007 0:3dac1f1bc9e0 450 wMapAddr = wAddr & 0xe001;
beaglescout007 0:3dac1f1bc9e0 451
beaglescout007 0:3dac1f1bc9e0 452 switch ( wMapAddr )
beaglescout007 0:3dac1f1bc9e0 453 {
beaglescout007 0:3dac1f1bc9e0 454 case 0xa000:
beaglescout007 0:3dac1f1bc9e0 455 // Name Table Mirroring
beaglescout007 0:3dac1f1bc9e0 456 pNesX_Mirroring( ~byData & 1 );
beaglescout007 0:3dac1f1bc9e0 457 break;
beaglescout007 0:3dac1f1bc9e0 458
beaglescout007 0:3dac1f1bc9e0 459 case 0xa001:
beaglescout007 0:3dac1f1bc9e0 460 break;
beaglescout007 0:3dac1f1bc9e0 461
beaglescout007 0:3dac1f1bc9e0 462 case 0xc000:
beaglescout007 0:3dac1f1bc9e0 463 Map4_IRQ_Cnt = byData;
beaglescout007 0:3dac1f1bc9e0 464 break;
beaglescout007 0:3dac1f1bc9e0 465
beaglescout007 0:3dac1f1bc9e0 466 case 0xc001:
beaglescout007 0:3dac1f1bc9e0 467 Map4_IRQ_Set = byData;
beaglescout007 0:3dac1f1bc9e0 468 break;
beaglescout007 0:3dac1f1bc9e0 469
beaglescout007 0:3dac1f1bc9e0 470 case 0xe000:
beaglescout007 0:3dac1f1bc9e0 471 Map4_IRQ_Cnt = Map4_IRQ_Set;
beaglescout007 0:3dac1f1bc9e0 472 Map4_IRQ_Enable = 0;
beaglescout007 0:3dac1f1bc9e0 473 break;
beaglescout007 0:3dac1f1bc9e0 474
beaglescout007 0:3dac1f1bc9e0 475 case 0xe001:
beaglescout007 0:3dac1f1bc9e0 476 if ( Map4_IRQ_Cnt > 0 )
beaglescout007 0:3dac1f1bc9e0 477 Map4_IRQ_Enable = 1;
beaglescout007 0:3dac1f1bc9e0 478 break;
beaglescout007 0:3dac1f1bc9e0 479
beaglescout007 0:3dac1f1bc9e0 480 default:
beaglescout007 0:3dac1f1bc9e0 481 if ( wMapAddr == 0x8000 )
beaglescout007 0:3dac1f1bc9e0 482 {
beaglescout007 0:3dac1f1bc9e0 483 Map4_VROM_Base = byData >> 7;
beaglescout007 0:3dac1f1bc9e0 484 Map4_ROM_Base = ( byData >> 6 ) & 1;
beaglescout007 0:3dac1f1bc9e0 485 Map4_Cmd = byData & 7;
beaglescout007 0:3dac1f1bc9e0 486 return;
beaglescout007 0:3dac1f1bc9e0 487 }
beaglescout007 0:3dac1f1bc9e0 488 else
beaglescout007 0:3dac1f1bc9e0 489 {
beaglescout007 0:3dac1f1bc9e0 490 if ( Map4_Cmd >= 6 )
beaglescout007 0:3dac1f1bc9e0 491 byData %= ( NesHeader.byRomSize << 1 );
beaglescout007 0:3dac1f1bc9e0 492 else
beaglescout007 0:3dac1f1bc9e0 493 if ( NesHeader.byVRomSize > 0 )
beaglescout007 0:3dac1f1bc9e0 494 {
beaglescout007 0:3dac1f1bc9e0 495 if ( Map4_Cmd < 2 )
beaglescout007 0:3dac1f1bc9e0 496 byData = ( byData & 0xfe ) % ( NesHeader.byVRomSize << 3 );
beaglescout007 0:3dac1f1bc9e0 497 else
beaglescout007 0:3dac1f1bc9e0 498 if ( Map4_Cmd < 6 )
beaglescout007 0:3dac1f1bc9e0 499 byData %= ( NesHeader.byVRomSize << 3 );
beaglescout007 0:3dac1f1bc9e0 500 }
beaglescout007 0:3dac1f1bc9e0 501
beaglescout007 0:3dac1f1bc9e0 502 Map4_Banks_Reg[ Map4_Cmd ] = byData;
beaglescout007 0:3dac1f1bc9e0 503 }
beaglescout007 0:3dac1f1bc9e0 504
beaglescout007 0:3dac1f1bc9e0 505 /* Set VROM Banks */
beaglescout007 0:3dac1f1bc9e0 506 if ( NesHeader.byVRomSize > 0 )
beaglescout007 0:3dac1f1bc9e0 507 {
beaglescout007 0:3dac1f1bc9e0 508 if ( Map4_VROM_Base )
beaglescout007 0:3dac1f1bc9e0 509 {
beaglescout007 0:3dac1f1bc9e0 510 PPUBANK[ 0 ] = VROMPAGE( Map4_Banks_Reg[ 2 ] );
beaglescout007 0:3dac1f1bc9e0 511 PPUBANK[ 1 ] = VROMPAGE( Map4_Banks_Reg[ 3 ] );
beaglescout007 0:3dac1f1bc9e0 512 PPUBANK[ 2 ] = VROMPAGE( Map4_Banks_Reg[ 4 ] );
beaglescout007 0:3dac1f1bc9e0 513 PPUBANK[ 3 ] = VROMPAGE( Map4_Banks_Reg[ 5 ] );
beaglescout007 0:3dac1f1bc9e0 514 PPUBANK[ 4 ] = VROMPAGE( Map4_Banks_Reg[ 0 ] );
beaglescout007 0:3dac1f1bc9e0 515 PPUBANK[ 5 ] = VROMPAGE( Map4_Banks_Reg[ 0 ] + 1 );
beaglescout007 0:3dac1f1bc9e0 516 PPUBANK[ 6 ] = VROMPAGE( Map4_Banks_Reg[ 1 ] );
beaglescout007 0:3dac1f1bc9e0 517 PPUBANK[ 7 ] = VROMPAGE( Map4_Banks_Reg[ 1 ] + 1 );
beaglescout007 0:3dac1f1bc9e0 518 }
beaglescout007 0:3dac1f1bc9e0 519 else
beaglescout007 0:3dac1f1bc9e0 520 {
beaglescout007 0:3dac1f1bc9e0 521 PPUBANK[ 0 ] = VROMPAGE( Map4_Banks_Reg[ 0 ] );
beaglescout007 0:3dac1f1bc9e0 522 PPUBANK[ 1 ] = VROMPAGE( Map4_Banks_Reg[ 0 ] + 1 );
beaglescout007 0:3dac1f1bc9e0 523 PPUBANK[ 2 ] = VROMPAGE( Map4_Banks_Reg[ 1 ] );
beaglescout007 0:3dac1f1bc9e0 524 PPUBANK[ 3 ] = VROMPAGE( Map4_Banks_Reg[ 1 ] + 1 );
beaglescout007 0:3dac1f1bc9e0 525 PPUBANK[ 4 ] = VROMPAGE( Map4_Banks_Reg[ 2 ] );
beaglescout007 0:3dac1f1bc9e0 526 PPUBANK[ 5 ] = VROMPAGE( Map4_Banks_Reg[ 3 ] );
beaglescout007 0:3dac1f1bc9e0 527 PPUBANK[ 6 ] = VROMPAGE( Map4_Banks_Reg[ 4 ] );
beaglescout007 0:3dac1f1bc9e0 528 PPUBANK[ 7 ] = VROMPAGE( Map4_Banks_Reg[ 5 ] );
beaglescout007 0:3dac1f1bc9e0 529 }
beaglescout007 0:3dac1f1bc9e0 530
beaglescout007 0:3dac1f1bc9e0 531 pNesX_SetupChr();
beaglescout007 0:3dac1f1bc9e0 532 }
beaglescout007 0:3dac1f1bc9e0 533
beaglescout007 0:3dac1f1bc9e0 534 if ( Map4_ROM_Base )
beaglescout007 0:3dac1f1bc9e0 535 {
beaglescout007 0:3dac1f1bc9e0 536 ROMBANK0 = ROMLASTPAGE( 1 );
beaglescout007 0:3dac1f1bc9e0 537 ROMBANK1 = ROMPAGE( Map4_Banks_Reg[ 7 ] );
beaglescout007 0:3dac1f1bc9e0 538 ROMBANK2 = ROMPAGE( Map4_Banks_Reg[ 6 ] );
beaglescout007 0:3dac1f1bc9e0 539 ROMBANK3 = ROMLASTPAGE( 0 );
beaglescout007 0:3dac1f1bc9e0 540 }
beaglescout007 0:3dac1f1bc9e0 541 else
beaglescout007 0:3dac1f1bc9e0 542 {
beaglescout007 0:3dac1f1bc9e0 543 ROMBANK0 = ROMPAGE( Map4_Banks_Reg[ 6 ] );
beaglescout007 0:3dac1f1bc9e0 544 ROMBANK1 = ROMPAGE( Map4_Banks_Reg[ 7 ] );
beaglescout007 0:3dac1f1bc9e0 545 ROMBANK2 = ROMLASTPAGE( 1 );
beaglescout007 0:3dac1f1bc9e0 546 ROMBANK3 = ROMLASTPAGE( 0 );
beaglescout007 0:3dac1f1bc9e0 547 }
beaglescout007 0:3dac1f1bc9e0 548 }
beaglescout007 0:3dac1f1bc9e0 549 }
beaglescout007 0:3dac1f1bc9e0 550
beaglescout007 0:3dac1f1bc9e0 551 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 552 /* Mapper 4 V-Sync Function */
beaglescout007 0:3dac1f1bc9e0 553 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 554 void Map4_VSync()
beaglescout007 0:3dac1f1bc9e0 555 {
beaglescout007 0:3dac1f1bc9e0 556 /*
beaglescout007 0:3dac1f1bc9e0 557 * Callback at VSync
beaglescout007 0:3dac1f1bc9e0 558 *
beaglescout007 0:3dac1f1bc9e0 559 */
beaglescout007 0:3dac1f1bc9e0 560 Map4_IRQ_Cnt = Map4_IRQ_Set;
beaglescout007 0:3dac1f1bc9e0 561 }
beaglescout007 0:3dac1f1bc9e0 562
beaglescout007 0:3dac1f1bc9e0 563 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 564 /* Mapper 4 H-Sync Function */
beaglescout007 0:3dac1f1bc9e0 565 /*-------------------------------------------------------------------*/
beaglescout007 0:3dac1f1bc9e0 566 void Map4_HSync()
beaglescout007 0:3dac1f1bc9e0 567 {
beaglescout007 0:3dac1f1bc9e0 568 /*
beaglescout007 0:3dac1f1bc9e0 569 * Callback at HSync
beaglescout007 0:3dac1f1bc9e0 570 *
beaglescout007 0:3dac1f1bc9e0 571 */
beaglescout007 0:3dac1f1bc9e0 572
beaglescout007 0:3dac1f1bc9e0 573 if ( Map4_IRQ_Enable &&
beaglescout007 0:3dac1f1bc9e0 574 PPU_Scanline >= SCAN_ON_SCREEN_START && PPU_Scanline < SCAN_BOTTOM_OFF_SCREEN_START &&
beaglescout007 0:3dac1f1bc9e0 575 //PPU_ScanTable[ PPU_Scanline ] == SCAN_ON_SCREEN &&
beaglescout007 0:3dac1f1bc9e0 576 ( PPU_R1 & ( R1_SHOW_SCR | R1_SHOW_SP ) ) == ( R1_SHOW_SCR | R1_SHOW_SP ) &&
beaglescout007 0:3dac1f1bc9e0 577 Map4_IRQ_Cnt > 0 )
beaglescout007 0:3dac1f1bc9e0 578 {
beaglescout007 0:3dac1f1bc9e0 579 --Map4_IRQ_Cnt;
beaglescout007 0:3dac1f1bc9e0 580 if ( Map4_IRQ_Cnt == 0 )
beaglescout007 0:3dac1f1bc9e0 581 {
beaglescout007 0:3dac1f1bc9e0 582 Map4_IRQ_Cnt = Map4_IRQ_Set;
beaglescout007 0:3dac1f1bc9e0 583 IRQ_REQ;
beaglescout007 0:3dac1f1bc9e0 584 }
beaglescout007 0:3dac1f1bc9e0 585 }
beaglescout007 0:3dac1f1bc9e0 586 }
beaglescout007 0:3dac1f1bc9e0 587
beaglescout007 0:3dac1f1bc9e0 588
beaglescout007 0:3dac1f1bc9e0 589