User | Revision | Line number | New 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
|
|