Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
RishiRecon
GitHub Repository: RishiRecon/exploits
Path: blob/main/misc/emulator/xnes/snes9x/getset.h
28515 views
1
/***********************************************************************************
2
Snes9x - Portable Super Nintendo Entertainment System (TM) emulator.
3
4
(c) Copyright 1996 - 2002 Gary Henderson ([email protected]),
5
Jerremy Koot ([email protected])
6
7
(c) Copyright 2002 - 2004 Matthew Kendora
8
9
(c) Copyright 2002 - 2005 Peter Bortas ([email protected])
10
11
(c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/)
12
13
(c) Copyright 2001 - 2006 John Weidman ([email protected])
14
15
(c) Copyright 2002 - 2006 funkyass ([email protected]),
16
Kris Bleakley ([email protected])
17
18
(c) Copyright 2002 - 2010 Brad Jorsch ([email protected]),
19
Nach ([email protected]),
20
21
(c) Copyright 2002 - 2011 zones ([email protected])
22
23
(c) Copyright 2006 - 2007 nitsuja
24
25
(c) Copyright 2009 - 2011 BearOso,
26
OV2
27
28
29
BS-X C emulator code
30
(c) Copyright 2005 - 2006 Dreamer Nom,
31
zones
32
33
C4 x86 assembler and some C emulation code
34
(c) Copyright 2000 - 2003 _Demo_ ([email protected]),
35
Nach,
36
zsKnight ([email protected])
37
38
C4 C++ code
39
(c) Copyright 2003 - 2006 Brad Jorsch,
40
Nach
41
42
DSP-1 emulator code
43
(c) Copyright 1998 - 2006 _Demo_,
44
Andreas Naive ([email protected]),
45
Gary Henderson,
46
Ivar ([email protected]),
47
John Weidman,
48
Kris Bleakley,
49
Matthew Kendora,
50
Nach,
51
neviksti ([email protected])
52
53
DSP-2 emulator code
54
(c) Copyright 2003 John Weidman,
55
Kris Bleakley,
56
Lord Nightmare ([email protected]),
57
Matthew Kendora,
58
neviksti
59
60
DSP-3 emulator code
61
(c) Copyright 2003 - 2006 John Weidman,
62
Kris Bleakley,
63
Lancer,
64
z80 gaiden
65
66
DSP-4 emulator code
67
(c) Copyright 2004 - 2006 Dreamer Nom,
68
John Weidman,
69
Kris Bleakley,
70
Nach,
71
z80 gaiden
72
73
OBC1 emulator code
74
(c) Copyright 2001 - 2004 zsKnight,
75
pagefault ([email protected]),
76
Kris Bleakley
77
Ported from x86 assembler to C by sanmaiwashi
78
79
SPC7110 and RTC C++ emulator code used in 1.39-1.51
80
(c) Copyright 2002 Matthew Kendora with research by
81
zsKnight,
82
John Weidman,
83
Dark Force
84
85
SPC7110 and RTC C++ emulator code used in 1.52+
86
(c) Copyright 2009 byuu,
87
neviksti
88
89
S-DD1 C emulator code
90
(c) Copyright 2003 Brad Jorsch with research by
91
Andreas Naive,
92
John Weidman
93
94
S-RTC C emulator code
95
(c) Copyright 2001 - 2006 byuu,
96
John Weidman
97
98
ST010 C++ emulator code
99
(c) Copyright 2003 Feather,
100
John Weidman,
101
Kris Bleakley,
102
Matthew Kendora
103
104
Super FX x86 assembler emulator code
105
(c) Copyright 1998 - 2003 _Demo_,
106
pagefault,
107
zsKnight
108
109
Super FX C emulator code
110
(c) Copyright 1997 - 1999 Ivar,
111
Gary Henderson,
112
John Weidman
113
114
Sound emulator code used in 1.5-1.51
115
(c) Copyright 1998 - 2003 Brad Martin
116
(c) Copyright 1998 - 2006 Charles Bilyue'
117
118
Sound emulator code used in 1.52+
119
(c) Copyright 2004 - 2007 Shay Green ([email protected])
120
121
SH assembler code partly based on x86 assembler code
122
(c) Copyright 2002 - 2004 Marcus Comstedt ([email protected])
123
124
2xSaI filter
125
(c) Copyright 1999 - 2001 Derek Liauw Kie Fa
126
127
HQ2x, HQ3x, HQ4x filters
128
(c) Copyright 2003 Maxim Stepin ([email protected])
129
130
NTSC filter
131
(c) Copyright 2006 - 2007 Shay Green
132
133
GTK+ GUI code
134
(c) Copyright 2004 - 2011 BearOso
135
136
Win32 GUI code
137
(c) Copyright 2003 - 2006 blip,
138
funkyass,
139
Matthew Kendora,
140
Nach,
141
nitsuja
142
(c) Copyright 2009 - 2011 OV2
143
144
Mac OS GUI code
145
(c) Copyright 1998 - 2001 John Stiles
146
(c) Copyright 2001 - 2011 zones
147
148
149
Specific ports contains the works of other authors. See headers in
150
individual files.
151
152
153
Snes9x homepage: http://www.snes9x.com/
154
155
Permission to use, copy, modify and/or distribute Snes9x in both binary
156
and source form, for non-commercial purposes, is hereby granted without
157
fee, providing that this license information and copyright notice appear
158
with all copies and any derived work.
159
160
This software is provided 'as-is', without any express or implied
161
warranty. In no event shall the authors be held liable for any damages
162
arising from the use of this software or it's derivatives.
163
164
Snes9x is freeware for PERSONAL USE only. Commercial users should
165
seek permission of the copyright holders first. Commercial use includes,
166
but is not limited to, charging money for Snes9x or software derived from
167
Snes9x, including Snes9x or derivatives in commercial game bundles, and/or
168
using Snes9x as a promotion for your commercial product.
169
170
The copyright holders request that bug fixes and improvements to the code
171
should be forwarded to them so everyone can benefit from the modifications
172
in future versions.
173
174
Super NES and Super Nintendo Entertainment System are trademarks of
175
Nintendo Co., Limited and its subsidiary companies.
176
***********************************************************************************/
177
178
179
#ifndef _GETSET_H_
180
#define _GETSET_H_
181
182
#include "cpuexec.h"
183
#include "dsp.h"
184
#include "sa1.h"
185
#include "spc7110.h"
186
#include "c4.h"
187
#include "obc1.h"
188
#include "seta.h"
189
#include "bsx.h"
190
191
#define addCyclesInMemoryAccess \
192
if (!CPU.InDMAorHDMA) \
193
{ \
194
CPU.PrevCycles = CPU.Cycles; \
195
CPU.Cycles += speed; \
196
S9xCheckInterrupts(); \
197
while (CPU.Cycles >= CPU.NextEvent) \
198
S9xDoHEventProcessing(); \
199
}
200
201
#define addCyclesInMemoryAccess_x2 \
202
if (!CPU.InDMAorHDMA) \
203
{ \
204
CPU.PrevCycles = CPU.Cycles; \
205
CPU.Cycles += speed << 1; \
206
S9xCheckInterrupts(); \
207
while (CPU.Cycles >= CPU.NextEvent) \
208
S9xDoHEventProcessing(); \
209
}
210
211
extern uint8 OpenBus;
212
213
static inline int32 memory_speed (uint32 address)
214
{
215
if (address & 0x408000)
216
{
217
if (address & 0x800000)
218
return (CPU.FastROMSpeed);
219
220
return (SLOW_ONE_CYCLE);
221
}
222
223
if ((address + 0x6000) & 0x4000)
224
return (SLOW_ONE_CYCLE);
225
226
if ((address - 0x4000) & 0x7e00)
227
return (ONE_CYCLE);
228
229
return (TWO_CYCLES);
230
}
231
232
inline uint8 S9xGetByte (uint32 Address)
233
{
234
int block = (Address & 0xffffff) >> MEMMAP_SHIFT;
235
uint8 *GetAddress = Memory.Map[block];
236
int32 speed = memory_speed(Address);
237
uint8 byte;
238
239
if (GetAddress >= (uint8 *) CMemory::MAP_LAST)
240
{
241
byte = *(GetAddress + (Address & 0xffff));
242
addCyclesInMemoryAccess;
243
return (byte);
244
}
245
246
switch ((pint) GetAddress)
247
{
248
case CMemory::MAP_CPU:
249
byte = S9xGetCPU(Address & 0xffff);
250
addCyclesInMemoryAccess;
251
return (byte);
252
253
case CMemory::MAP_PPU:
254
if (CPU.InDMAorHDMA && (Address & 0xff00) == 0x2100)
255
return (OpenBus);
256
257
byte = S9xGetPPU(Address & 0xffff);
258
addCyclesInMemoryAccess;
259
return (byte);
260
261
case CMemory::MAP_LOROM_SRAM:
262
case CMemory::MAP_SA1RAM:
263
// Address & 0x7fff : offset into bank
264
// Address & 0xff0000 : bank
265
// bank >> 1 | offset : SRAM address, unbound
266
// unbound & SRAMMask : SRAM offset
267
byte = *(Memory.SRAM + ((((Address & 0xff0000) >> 1) | (Address & 0x7fff)) & Memory.SRAMMask));
268
addCyclesInMemoryAccess;
269
return (byte);
270
271
case CMemory::MAP_LOROM_SRAM_B:
272
byte = *(Multi.sramB + ((((Address & 0xff0000) >> 1) | (Address & 0x7fff)) & Multi.sramMaskB));
273
addCyclesInMemoryAccess;
274
return (byte);
275
276
case CMemory::MAP_HIROM_SRAM:
277
case CMemory::MAP_RONLY_SRAM:
278
byte = *(Memory.SRAM + (((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3)) & Memory.SRAMMask));
279
addCyclesInMemoryAccess;
280
return (byte);
281
282
case CMemory::MAP_BWRAM:
283
byte = *(Memory.BWRAM + ((Address & 0x7fff) - 0x6000));
284
addCyclesInMemoryAccess;
285
return (byte);
286
287
case CMemory::MAP_DSP:
288
byte = S9xGetDSP(Address & 0xffff);
289
addCyclesInMemoryAccess;
290
return (byte);
291
292
case CMemory::MAP_SPC7110_ROM:
293
byte = S9xGetSPC7110Byte(Address);
294
addCyclesInMemoryAccess;
295
return (byte);
296
297
case CMemory::MAP_SPC7110_DRAM:
298
byte = S9xGetSPC7110(0x4800);
299
addCyclesInMemoryAccess;
300
return (byte);
301
302
case CMemory::MAP_C4:
303
byte = S9xGetC4(Address & 0xffff);
304
addCyclesInMemoryAccess;
305
return (byte);
306
307
case CMemory::MAP_OBC_RAM:
308
byte = S9xGetOBC1(Address & 0xffff);
309
addCyclesInMemoryAccess;
310
return (byte);
311
312
case CMemory::MAP_SETA_DSP:
313
byte = S9xGetSetaDSP(Address);
314
addCyclesInMemoryAccess;
315
return (byte);
316
317
case CMemory::MAP_SETA_RISC:
318
byte = S9xGetST018(Address);
319
addCyclesInMemoryAccess;
320
return (byte);
321
322
case CMemory::MAP_BSX:
323
byte = S9xGetBSX(Address);
324
addCyclesInMemoryAccess;
325
return (byte);
326
327
case CMemory::MAP_NONE:
328
default:
329
byte = OpenBus;
330
addCyclesInMemoryAccess;
331
return (byte);
332
}
333
}
334
335
inline uint16 S9xGetWord (uint32 Address, enum s9xwrap_t w = WRAP_NONE)
336
{
337
uint32 mask = MEMMAP_MASK & (w == WRAP_PAGE ? 0xff : (w == WRAP_BANK ? 0xffff : 0xffffff));
338
if ((Address & mask) == mask)
339
{
340
PC_t a;
341
342
OpenBus = S9xGetByte(Address);
343
344
switch (w)
345
{
346
case WRAP_PAGE:
347
a.xPBPC = Address;
348
a.B.xPCl++;
349
return (OpenBus | (S9xGetByte(a.xPBPC) << 8));
350
351
case WRAP_BANK:
352
a.xPBPC = Address;
353
a.W.xPC++;
354
return (OpenBus | (S9xGetByte(a.xPBPC) << 8));
355
356
case WRAP_NONE:
357
default:
358
return (OpenBus | (S9xGetByte(Address + 1) << 8));
359
}
360
}
361
362
int block = (Address & 0xffffff) >> MEMMAP_SHIFT;
363
uint8 *GetAddress = Memory.Map[block];
364
int32 speed = memory_speed(Address);
365
uint16 word;
366
367
if (GetAddress >= (uint8 *) CMemory::MAP_LAST)
368
{
369
word = READ_WORD(GetAddress + (Address & 0xffff));
370
addCyclesInMemoryAccess_x2;
371
return (word);
372
}
373
374
switch ((pint) GetAddress)
375
{
376
case CMemory::MAP_CPU:
377
word = S9xGetCPU(Address & 0xffff);
378
addCyclesInMemoryAccess;
379
word |= S9xGetCPU((Address + 1) & 0xffff) << 8;
380
addCyclesInMemoryAccess;
381
return (word);
382
383
case CMemory::MAP_PPU:
384
if (CPU.InDMAorHDMA)
385
{
386
OpenBus = S9xGetByte(Address);
387
return (OpenBus | (S9xGetByte(Address + 1) << 8));
388
}
389
390
word = S9xGetPPU(Address & 0xffff);
391
addCyclesInMemoryAccess;
392
word |= S9xGetPPU((Address + 1) & 0xffff) << 8;
393
addCyclesInMemoryAccess;
394
return (word);
395
396
case CMemory::MAP_LOROM_SRAM:
397
case CMemory::MAP_SA1RAM:
398
if (Memory.SRAMMask >= MEMMAP_MASK)
399
word = READ_WORD(Memory.SRAM + ((((Address & 0xff0000) >> 1) | (Address & 0x7fff)) & Memory.SRAMMask));
400
else
401
word = (*(Memory.SRAM + ((((Address & 0xff0000) >> 1) | (Address & 0x7fff)) & Memory.SRAMMask))) |
402
((*(Memory.SRAM + (((((Address + 1) & 0xff0000) >> 1) | ((Address + 1) & 0x7fff)) & Memory.SRAMMask))) << 8);
403
addCyclesInMemoryAccess_x2;
404
return (word);
405
406
case CMemory::MAP_LOROM_SRAM_B:
407
if (Multi.sramMaskB >= MEMMAP_MASK)
408
word = READ_WORD(Multi.sramB + ((((Address & 0xff0000) >> 1) | (Address & 0x7fff)) & Multi.sramMaskB));
409
else
410
word = (*(Multi.sramB + ((((Address & 0xff0000) >> 1) | (Address & 0x7fff)) & Multi.sramMaskB))) |
411
((*(Multi.sramB + (((((Address + 1) & 0xff0000) >> 1) | ((Address + 1) & 0x7fff)) & Multi.sramMaskB))) << 8);
412
addCyclesInMemoryAccess_x2;
413
return (word);
414
415
case CMemory::MAP_HIROM_SRAM:
416
case CMemory::MAP_RONLY_SRAM:
417
if (Memory.SRAMMask >= MEMMAP_MASK)
418
word = READ_WORD(Memory.SRAM + (((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3)) & Memory.SRAMMask));
419
else
420
word = (*(Memory.SRAM + (((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3)) & Memory.SRAMMask)) |
421
(*(Memory.SRAM + ((((Address + 1) & 0x7fff) - 0x6000 + (((Address + 1) & 0xf0000) >> 3)) & Memory.SRAMMask)) << 8));
422
addCyclesInMemoryAccess_x2;
423
return (word);
424
425
case CMemory::MAP_BWRAM:
426
word = READ_WORD(Memory.BWRAM + ((Address & 0x7fff) - 0x6000));
427
addCyclesInMemoryAccess_x2;
428
return (word);
429
430
case CMemory::MAP_DSP:
431
word = S9xGetDSP(Address & 0xffff);
432
addCyclesInMemoryAccess;
433
word |= S9xGetDSP((Address + 1) & 0xffff) << 8;
434
addCyclesInMemoryAccess;
435
return (word);
436
437
case CMemory::MAP_SPC7110_ROM:
438
word = S9xGetSPC7110Byte(Address);
439
addCyclesInMemoryAccess;
440
word |= S9xGetSPC7110Byte(Address + 1) << 8;
441
addCyclesInMemoryAccess;
442
return (word);
443
444
case CMemory::MAP_SPC7110_DRAM:
445
word = S9xGetSPC7110(0x4800);
446
addCyclesInMemoryAccess;
447
word |= S9xGetSPC7110(0x4800) << 8;
448
addCyclesInMemoryAccess;
449
return (word);
450
451
case CMemory::MAP_C4:
452
word = S9xGetC4(Address & 0xffff);
453
addCyclesInMemoryAccess;
454
word |= S9xGetC4((Address + 1) & 0xffff) << 8;
455
addCyclesInMemoryAccess;
456
return (word);
457
458
case CMemory::MAP_OBC_RAM:
459
word = S9xGetOBC1(Address & 0xffff);
460
addCyclesInMemoryAccess;
461
word |= S9xGetOBC1((Address + 1) & 0xffff) << 8;
462
addCyclesInMemoryAccess;
463
return (word);
464
465
case CMemory::MAP_SETA_DSP:
466
word = S9xGetSetaDSP(Address);
467
addCyclesInMemoryAccess;
468
word |= S9xGetSetaDSP(Address + 1) << 8;
469
addCyclesInMemoryAccess;
470
return (word);
471
472
case CMemory::MAP_SETA_RISC:
473
word = S9xGetST018(Address);
474
addCyclesInMemoryAccess;
475
word |= S9xGetST018(Address + 1) << 8;
476
addCyclesInMemoryAccess;
477
return (word);
478
479
case CMemory::MAP_BSX:
480
word = S9xGetBSX(Address);
481
addCyclesInMemoryAccess;
482
word |= S9xGetBSX(Address + 1) << 8;
483
addCyclesInMemoryAccess;
484
return (word);
485
486
case CMemory::MAP_NONE:
487
default:
488
word = OpenBus | (OpenBus << 8);
489
addCyclesInMemoryAccess_x2;
490
return (word);
491
}
492
}
493
494
inline void S9xSetByte (uint8 Byte, uint32 Address)
495
{
496
int block = (Address & 0xffffff) >> MEMMAP_SHIFT;
497
uint8 *SetAddress = Memory.WriteMap[block];
498
int32 speed = memory_speed(Address);
499
500
if (SetAddress >= (uint8 *) CMemory::MAP_LAST)
501
{
502
*(SetAddress + (Address & 0xffff)) = Byte;
503
addCyclesInMemoryAccess;
504
return;
505
}
506
507
switch ((pint) SetAddress)
508
{
509
case CMemory::MAP_CPU:
510
S9xSetCPU(Byte, Address & 0xffff);
511
addCyclesInMemoryAccess;
512
return;
513
514
case CMemory::MAP_PPU:
515
if (CPU.InDMAorHDMA && (Address & 0xff00) == 0x2100)
516
return;
517
518
S9xSetPPU(Byte, Address & 0xffff);
519
addCyclesInMemoryAccess;
520
return;
521
522
case CMemory::MAP_LOROM_SRAM:
523
if (Memory.SRAMMask)
524
{
525
*(Memory.SRAM + ((((Address & 0xff0000) >> 1) | (Address & 0x7fff)) & Memory.SRAMMask)) = Byte;
526
CPU.SRAMModified = TRUE;
527
}
528
529
addCyclesInMemoryAccess;
530
return;
531
532
case CMemory::MAP_LOROM_SRAM_B:
533
if (Multi.sramMaskB)
534
{
535
*(Multi.sramB + ((((Address & 0xff0000) >> 1) | (Address & 0x7fff)) & Multi.sramMaskB)) = Byte;
536
CPU.SRAMModified = TRUE;
537
}
538
539
addCyclesInMemoryAccess;
540
return;
541
542
case CMemory::MAP_HIROM_SRAM:
543
if (Memory.SRAMMask)
544
{
545
*(Memory.SRAM + (((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3)) & Memory.SRAMMask)) = Byte;
546
CPU.SRAMModified = TRUE;
547
}
548
549
addCyclesInMemoryAccess;
550
return;
551
552
case CMemory::MAP_BWRAM:
553
*(Memory.BWRAM + ((Address & 0x7fff) - 0x6000)) = Byte;
554
CPU.SRAMModified = TRUE;
555
addCyclesInMemoryAccess;
556
return;
557
558
case CMemory::MAP_SA1RAM:
559
*(Memory.SRAM + (Address & 0xffff)) = Byte;
560
addCyclesInMemoryAccess;
561
return;
562
563
case CMemory::MAP_DSP:
564
S9xSetDSP(Byte, Address & 0xffff);
565
addCyclesInMemoryAccess;
566
return;
567
568
case CMemory::MAP_C4:
569
S9xSetC4(Byte, Address & 0xffff);
570
addCyclesInMemoryAccess;
571
return;
572
573
case CMemory::MAP_OBC_RAM:
574
S9xSetOBC1(Byte, Address & 0xffff);
575
addCyclesInMemoryAccess;
576
return;
577
578
case CMemory::MAP_SETA_DSP:
579
S9xSetSetaDSP(Byte, Address);
580
addCyclesInMemoryAccess;
581
return;
582
583
case CMemory::MAP_SETA_RISC:
584
S9xSetST018(Byte, Address);
585
addCyclesInMemoryAccess;
586
return;
587
588
case CMemory::MAP_BSX:
589
S9xSetBSX(Byte, Address);
590
addCyclesInMemoryAccess;
591
return;
592
593
case CMemory::MAP_NONE:
594
default:
595
addCyclesInMemoryAccess;
596
return;
597
}
598
}
599
600
inline void S9xSetWord (uint16 Word, uint32 Address, enum s9xwrap_t w = WRAP_NONE, enum s9xwriteorder_t o = WRITE_01)
601
{
602
uint32 mask = MEMMAP_MASK & (w == WRAP_PAGE ? 0xff : (w == WRAP_BANK ? 0xffff : 0xffffff));
603
if ((Address & mask) == mask)
604
{
605
PC_t a;
606
607
if (!o)
608
S9xSetByte((uint8) Word, Address);
609
610
switch (w)
611
{
612
case WRAP_PAGE:
613
a.xPBPC = Address;
614
a.B.xPCl++;
615
S9xSetByte(Word >> 8, a.xPBPC);
616
break;
617
618
case WRAP_BANK:
619
a.xPBPC = Address;
620
a.W.xPC++;
621
S9xSetByte(Word >> 8, a.xPBPC);
622
break;
623
624
case WRAP_NONE:
625
default:
626
S9xSetByte(Word >> 8, Address + 1);
627
break;
628
}
629
630
if (o)
631
S9xSetByte((uint8) Word, Address);
632
633
return;
634
}
635
636
int block = (Address & 0xffffff) >> MEMMAP_SHIFT;
637
uint8 *SetAddress = Memory.WriteMap[block];
638
int32 speed = memory_speed(Address);
639
640
if (SetAddress >= (uint8 *) CMemory::MAP_LAST)
641
{
642
WRITE_WORD(SetAddress + (Address & 0xffff), Word);
643
addCyclesInMemoryAccess_x2;
644
return;
645
}
646
647
switch ((pint) SetAddress)
648
{
649
case CMemory::MAP_CPU:
650
if (o)
651
{
652
S9xSetCPU(Word >> 8, (Address + 1) & 0xffff);
653
addCyclesInMemoryAccess;
654
S9xSetCPU((uint8) Word, Address & 0xffff);
655
addCyclesInMemoryAccess;
656
return;
657
}
658
else
659
{
660
S9xSetCPU((uint8) Word, Address & 0xffff);
661
addCyclesInMemoryAccess;
662
S9xSetCPU(Word >> 8, (Address + 1) & 0xffff);
663
addCyclesInMemoryAccess;
664
return;
665
}
666
667
case CMemory::MAP_PPU:
668
if (CPU.InDMAorHDMA)
669
{
670
if ((Address & 0xff00) != 0x2100)
671
S9xSetPPU((uint8) Word, Address & 0xffff);
672
if (((Address + 1) & 0xff00) != 0x2100)
673
S9xSetPPU(Word >> 8, (Address + 1) & 0xffff);
674
return;
675
}
676
677
if (o)
678
{
679
S9xSetPPU(Word >> 8, (Address + 1) & 0xffff);
680
addCyclesInMemoryAccess;
681
S9xSetPPU((uint8) Word, Address & 0xffff);
682
addCyclesInMemoryAccess;
683
return;
684
}
685
else
686
{
687
S9xSetPPU((uint8) Word, Address & 0xffff);
688
addCyclesInMemoryAccess;
689
S9xSetPPU(Word >> 8, (Address + 1) & 0xffff);
690
addCyclesInMemoryAccess;
691
return;
692
}
693
694
case CMemory::MAP_LOROM_SRAM:
695
if (Memory.SRAMMask)
696
{
697
if (Memory.SRAMMask >= MEMMAP_MASK)
698
WRITE_WORD(Memory.SRAM + ((((Address & 0xff0000) >> 1) | (Address & 0x7fff)) & Memory.SRAMMask), Word);
699
else
700
{
701
*(Memory.SRAM + ((((Address & 0xff0000) >> 1) | (Address & 0x7fff)) & Memory.SRAMMask)) = (uint8) Word;
702
*(Memory.SRAM + (((((Address + 1) & 0xff0000) >> 1) | ((Address + 1) & 0x7fff)) & Memory.SRAMMask)) = Word >> 8;
703
}
704
705
CPU.SRAMModified = TRUE;
706
}
707
708
addCyclesInMemoryAccess_x2;
709
return;
710
711
case CMemory::MAP_LOROM_SRAM_B:
712
if (Multi.sramMaskB)
713
{
714
if (Multi.sramMaskB >= MEMMAP_MASK)
715
WRITE_WORD(Multi.sramB + ((((Address & 0xff0000) >> 1) | (Address & 0x7fff)) & Multi.sramMaskB), Word);
716
else
717
{
718
*(Multi.sramB + ((((Address & 0xff0000) >> 1) | (Address & 0x7fff)) & Multi.sramMaskB)) = (uint8) Word;
719
*(Multi.sramB + (((((Address + 1) & 0xff0000) >> 1) | ((Address + 1) & 0x7fff)) & Multi.sramMaskB)) = Word >> 8;
720
}
721
722
CPU.SRAMModified = TRUE;
723
}
724
725
addCyclesInMemoryAccess_x2;
726
return;
727
728
case CMemory::MAP_HIROM_SRAM:
729
if (Memory.SRAMMask)
730
{
731
if (Memory.SRAMMask >= MEMMAP_MASK)
732
WRITE_WORD(Memory.SRAM + (((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3)) & Memory.SRAMMask), Word);
733
else
734
{
735
*(Memory.SRAM + (((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3)) & Memory.SRAMMask)) = (uint8) Word;
736
*(Memory.SRAM + ((((Address + 1) & 0x7fff) - 0x6000 + (((Address + 1) & 0xf0000) >> 3)) & Memory.SRAMMask)) = Word >> 8;
737
}
738
739
CPU.SRAMModified = TRUE;
740
}
741
742
addCyclesInMemoryAccess_x2;
743
return;
744
745
case CMemory::MAP_BWRAM:
746
WRITE_WORD(Memory.BWRAM + ((Address & 0x7fff) - 0x6000), Word);
747
CPU.SRAMModified = TRUE;
748
addCyclesInMemoryAccess_x2;
749
return;
750
751
case CMemory::MAP_SA1RAM:
752
WRITE_WORD(Memory.SRAM + (Address & 0xffff), Word);
753
addCyclesInMemoryAccess_x2;
754
return;
755
756
case CMemory::MAP_DSP:
757
if (o)
758
{
759
S9xSetDSP(Word >> 8, (Address + 1) & 0xffff);
760
addCyclesInMemoryAccess;
761
S9xSetDSP((uint8) Word, Address & 0xffff);
762
addCyclesInMemoryAccess;
763
return;
764
}
765
else
766
{
767
S9xSetDSP((uint8) Word, Address & 0xffff);
768
addCyclesInMemoryAccess;
769
S9xSetDSP(Word >> 8, (Address + 1) & 0xffff);
770
addCyclesInMemoryAccess;
771
return;
772
}
773
774
case CMemory::MAP_C4:
775
if (o)
776
{
777
S9xSetC4(Word >> 8, (Address + 1) & 0xffff);
778
addCyclesInMemoryAccess;
779
S9xSetC4((uint8) Word, Address & 0xffff);
780
addCyclesInMemoryAccess;
781
return;
782
}
783
else
784
{
785
S9xSetC4((uint8) Word, Address & 0xffff);
786
addCyclesInMemoryAccess;
787
S9xSetC4(Word >> 8, (Address + 1) & 0xffff);
788
addCyclesInMemoryAccess;
789
return;
790
}
791
792
case CMemory::MAP_OBC_RAM:
793
if (o)
794
{
795
S9xSetOBC1(Word >> 8, (Address + 1) & 0xffff);
796
addCyclesInMemoryAccess;
797
S9xSetOBC1((uint8) Word, Address & 0xffff);
798
addCyclesInMemoryAccess;
799
return;
800
}
801
else
802
{
803
S9xSetOBC1((uint8) Word, Address & 0xffff);
804
addCyclesInMemoryAccess;
805
S9xSetOBC1(Word >> 8, (Address + 1) & 0xffff);
806
addCyclesInMemoryAccess;
807
return;
808
}
809
810
case CMemory::MAP_SETA_DSP:
811
if (o)
812
{
813
S9xSetSetaDSP(Word >> 8, Address + 1);
814
addCyclesInMemoryAccess;
815
S9xSetSetaDSP((uint8) Word, Address);
816
addCyclesInMemoryAccess;
817
return;
818
}
819
else
820
{
821
S9xSetSetaDSP((uint8) Word, Address);
822
addCyclesInMemoryAccess;
823
S9xSetSetaDSP(Word >> 8, Address + 1);
824
addCyclesInMemoryAccess;
825
return;
826
}
827
828
case CMemory::MAP_SETA_RISC:
829
if (o)
830
{
831
S9xSetST018(Word >> 8, Address + 1);
832
addCyclesInMemoryAccess;
833
S9xSetST018((uint8) Word, Address);
834
addCyclesInMemoryAccess;
835
return;
836
}
837
else
838
{
839
S9xSetST018((uint8) Word, Address);
840
addCyclesInMemoryAccess;
841
S9xSetST018(Word >> 8, Address + 1);
842
addCyclesInMemoryAccess;
843
return;
844
}
845
846
case CMemory::MAP_BSX:
847
if (o)
848
{
849
S9xSetBSX(Word >> 8, Address + 1);
850
addCyclesInMemoryAccess;
851
S9xSetBSX((uint8) Word, Address);
852
addCyclesInMemoryAccess;
853
return;
854
}
855
else
856
{
857
S9xSetBSX((uint8) Word, Address);
858
addCyclesInMemoryAccess;
859
S9xSetBSX(Word >> 8, Address + 1);
860
addCyclesInMemoryAccess;
861
return;
862
}
863
864
case CMemory::MAP_NONE:
865
default:
866
addCyclesInMemoryAccess_x2;
867
return;
868
}
869
}
870
871
inline void S9xSetPCBase (uint32 Address)
872
{
873
Registers.PBPC = Address & 0xffffff;
874
ICPU.ShiftedPB = Address & 0xff0000;
875
int block;
876
uint8 *GetAddress = Memory.Map[block = ((Address & 0xffffff) >> MEMMAP_SHIFT)];
877
CPU.MemSpeed = memory_speed(Address);
878
CPU.MemSpeedx2 = CPU.MemSpeed << 1;
879
if (GetAddress >= (uint8 *) CMemory::MAP_LAST)
880
{
881
CPU.PCBase = GetAddress;
882
return;
883
}
884
switch ((pint) GetAddress)
885
{
886
case CMemory::MAP_LOROM_SRAM:
887
if ((Memory.SRAMMask & MEMMAP_MASK) != MEMMAP_MASK)
888
CPU.PCBase = NULL;
889
else
890
CPU.PCBase = Memory.SRAM + ((((Address & 0xff0000) >> 1) | (Address & 0x7fff)) & Memory.SRAMMask) - (Address & 0xffff);
891
return;
892
893
case CMemory::MAP_LOROM_SRAM_B:
894
if ((Multi.sramMaskB & MEMMAP_MASK) != MEMMAP_MASK)
895
CPU.PCBase = NULL;
896
else
897
CPU.PCBase = Multi.sramB + ((((Address & 0xff0000) >> 1) | (Address & 0x7fff)) & Multi.sramMaskB) - (Address & 0xffff);
898
return;
899
900
case CMemory::MAP_HIROM_SRAM:
901
if ((Memory.SRAMMask & MEMMAP_MASK) != MEMMAP_MASK)
902
CPU.PCBase = NULL;
903
else
904
CPU.PCBase = Memory.SRAM + (((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3)) & Memory.SRAMMask) - (Address & 0xffff);
905
return;
906
907
case CMemory::MAP_BWRAM:
908
CPU.PCBase = Memory.BWRAM - 0x6000 - (Address & 0x8000);
909
return;
910
911
case CMemory::MAP_SA1RAM:
912
CPU.PCBase = Memory.SRAM;
913
return;
914
915
case CMemory::MAP_SPC7110_ROM:
916
CPU.PCBase = S9xGetBasePointerSPC7110(Address);
917
return;
918
919
case CMemory::MAP_C4:
920
CPU.PCBase = S9xGetBasePointerC4(Address & 0xffff);
921
return;
922
923
case CMemory::MAP_OBC_RAM:
924
CPU.PCBase = S9xGetBasePointerOBC1(Address & 0xffff);
925
return;
926
927
case CMemory::MAP_BSX:
928
CPU.PCBase = S9xGetBasePointerBSX(Address);
929
return;
930
931
case CMemory::MAP_NONE:
932
default:
933
CPU.PCBase = NULL;
934
return;
935
}
936
}
937
938
inline uint8 * S9xGetBasePointer (uint32 Address)
939
{
940
uint8 *GetAddress = Memory.Map[(Address & 0xffffff) >> MEMMAP_SHIFT];
941
942
if (GetAddress >= (uint8 *) CMemory::MAP_LAST)
943
return (GetAddress);
944
945
switch ((pint) GetAddress)
946
{
947
case CMemory::MAP_LOROM_SRAM:
948
if ((Memory.SRAMMask & MEMMAP_MASK) != MEMMAP_MASK)
949
return (NULL);
950
return (Memory.SRAM + ((((Address & 0xff0000) >> 1) | (Address & 0x7fff)) & Memory.SRAMMask) - (Address & 0xffff));
951
952
case CMemory::MAP_LOROM_SRAM_B:
953
if ((Multi.sramMaskB & MEMMAP_MASK) != MEMMAP_MASK)
954
return (NULL);
955
return (Multi.sramB + ((((Address & 0xff0000) >> 1) | (Address & 0x7fff)) & Multi.sramMaskB) - (Address & 0xffff));
956
957
case CMemory::MAP_HIROM_SRAM:
958
if ((Memory.SRAMMask & MEMMAP_MASK) != MEMMAP_MASK)
959
return (NULL);
960
return (Memory.SRAM + (((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3)) & Memory.SRAMMask) - (Address & 0xffff));
961
962
case CMemory::MAP_BWRAM:
963
return (Memory.BWRAM - 0x6000 - (Address & 0x8000));
964
965
case CMemory::MAP_SA1RAM:
966
return (Memory.SRAM);
967
968
case CMemory::MAP_SPC7110_ROM:
969
return (S9xGetBasePointerSPC7110(Address));
970
971
case CMemory::MAP_C4:
972
return (S9xGetBasePointerC4(Address & 0xffff));
973
974
case CMemory::MAP_OBC_RAM:
975
return (S9xGetBasePointerOBC1(Address & 0xffff));
976
977
case CMemory::MAP_NONE:
978
default:
979
return (NULL);
980
}
981
}
982
983
inline uint8 * S9xGetMemPointer (uint32 Address)
984
{
985
uint8 *GetAddress = Memory.Map[(Address & 0xffffff) >> MEMMAP_SHIFT];
986
987
if (GetAddress >= (uint8 *) CMemory::MAP_LAST)
988
return (GetAddress + (Address & 0xffff));
989
990
switch ((pint) GetAddress)
991
{
992
case CMemory::MAP_LOROM_SRAM:
993
if ((Memory.SRAMMask & MEMMAP_MASK) != MEMMAP_MASK)
994
return (NULL);
995
return (Memory.SRAM + ((((Address & 0xff0000) >> 1) | (Address & 0x7fff)) & Memory.SRAMMask));
996
997
case CMemory::MAP_LOROM_SRAM_B:
998
if ((Multi.sramMaskB & MEMMAP_MASK) != MEMMAP_MASK)
999
return (NULL);
1000
return (Multi.sramB + ((((Address & 0xff0000) >> 1) | (Address & 0x7fff)) & Multi.sramMaskB));
1001
1002
case CMemory::MAP_HIROM_SRAM:
1003
if ((Memory.SRAMMask & MEMMAP_MASK) != MEMMAP_MASK)
1004
return (NULL);
1005
return (Memory.SRAM + (((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3)) & Memory.SRAMMask));
1006
1007
case CMemory::MAP_BWRAM:
1008
return (Memory.BWRAM - 0x6000 + (Address & 0x7fff));
1009
1010
case CMemory::MAP_SA1RAM:
1011
return (Memory.SRAM + (Address & 0xffff));
1012
1013
case CMemory::MAP_SPC7110_ROM:
1014
return (S9xGetBasePointerSPC7110(Address) + (Address & 0xffff));
1015
1016
case CMemory::MAP_C4:
1017
return (S9xGetMemPointerC4(Address & 0xffff));
1018
1019
case CMemory::MAP_OBC_RAM:
1020
return (S9xGetMemPointerOBC1(Address & 0xffff));
1021
1022
case CMemory::MAP_NONE:
1023
default:
1024
return (NULL);
1025
}
1026
}
1027
1028
#endif
1029
1030