I have ported my old project “pNesX” game console emulator to the nucleo.

Dependencies:   SDFileSystem mbed

Intro

I have ported my old project “pNesX” to the STM32 Nucleo. The pNesX is a NES emulator for the PlayStation that I have created 16 years ago!

Emulation part was almost without change, the sound part was newly added.

Parts

STM32 Nucleo F446RE
QVGA 2.2 TFT SPI (with the SD card slot)
Audio jack(TS or TRS)
USB Connector
Register 100k, 10k, 4.7k, 100
Capacitor 0.01uF, 2.2uF
Breadboard
Wires
Computer Speakers
USB GamePad

Wiring diagram

/media/uploads/beaglescout007/nucleo_ex06_emu.png

TFT J2Nucleo
VCC3V3
GNDGND
CSPB_5(D4)
ResetPA_10(D2) Pull Up(100k)
D/CPA_8(D7)
MOSIPA_7(D11)
SCKPA_5(D13)
LEDLED-100ohm-3V3
MISOPA_6(D12)
TFT J4Nucleo
SD_CSPA_9
SD_MOSIPB_15
SD_MISOPB_14
SD_SCKPB_13
AudioNucleo
TIPPA_4(A2)
USB con.Nucleo
GNDGND
+PA_12
-PA_11
5V5V

https://youtu.be/jL24IjT6LnI

Limitations

  • Since the rest of the RAM is about 50kbyte, maximum capacity of the game ROM is about 50kbyte.
  • The length of the file name up to 32 characters.
  • The number of files in the folder is up to 100.

Used Library

Committer:
beaglescout007
Date:
Sun Apr 03 07:45:29 2016 +0000
Revision:
0:3dac1f1bc9e0
Release

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