1 #include "../copyright"
2 
3 #ifndef _memmap_h_
4 #define _memmap_h_
5 
6 #include "snes9x.h"
7 
8 #ifdef FAST_LSB_WORD_ACCESS
9 #define READ_WORD(s)      (*(uint16_t *) (s))
10 #define READ_DWORD(s)     (*(uint32_t *) (s))
11 #define WRITE_WORD(s, d)  (*(uint16_t *) (s)) = (d)
12 #define WRITE_DWORD(s, d) (*(uint32_t *) (s)) = (d)
13 #define READ_3WORD(s)     ((*(uint32_t *) (s)) & 0x00ffffff)
14 #define WRITE_3WORD(s, d) *(uint16_t *) (s) = (uint16_t)(d), *((uint8_t *) (s) + 2) = (uint8_t) ((d) >> 16)
15 #else
16 #define READ_WORD(s)      (*(uint8_t *) (s) | (*((uint8_t *) (s) + 1) << 8))
17 #define READ_DWORD(s)     (*(uint8_t *) (s) | (*((uint8_t *) (s) + 1) << 8) | (*((uint8_t *) (s) + 2) << 16) | (*((uint8_t *) (s) + 3) << 24))
18 #define WRITE_WORD(s, d)   *(uint8_t *) (s) = (d), *((uint8_t *) (s) + 1) = (d) >> 8
19 #define WRITE_DWORD(s, d)  *(uint8_t *) (s) = (uint8_t) (d), *((uint8_t *) (s) + 1) = (uint8_t) ((d) >> 8), *((uint8_t *) (s) + 2) = (uint8_t) ((d) >> 16), *((uint8_t *) (s) + 3) = (uint8_t) ((d) >> 24)
20 #define WRITE_3WORD(s, d)  *(uint8_t *) (s) = (uint8_t) (d), *((uint8_t *) (s) + 1) = (uint8_t) ((d) >> 8), *((uint8_t *) (s) + 2) = (uint8_t) ((d) >> 16)
21 #define READ_3WORD(s)     (*(uint8_t *) (s) | (*((uint8_t *) (s) + 1) << 8) | (*((uint8_t *) (s) + 2) << 16))
22 #endif
23 
24 #define MEMMAP_BLOCK_SIZE (0x1000)
25 #define MEMMAP_NUM_BLOCKS (0x1000000 / MEMMAP_BLOCK_SIZE)
26 #define MEMMAP_BLOCKS_PER_BANK (0x10000 / MEMMAP_BLOCK_SIZE)
27 #define MEMMAP_SHIFT 12
28 #define MEMMAP_MASK (MEMMAP_BLOCK_SIZE - 1)
29 
30 /* Extended ROM Formats */
31 #define NOPE 0
32 #define YEAH 1
33 #define BIGFIRST 2
34 #define SMALLFIRST 3
35 
36 #ifdef LOAD_FROM_MEMORY_TEST
37 bool LoadROM(const struct retro_game_info* game);
38 #else
39 bool LoadROM(const char*);
40 #endif
41 void InitROM(bool);
42 bool S9xInitMemory(void);
43 void S9xDeinitMemory(void);
44 void FreeSDD1Data(void);
45 
46 void WriteProtectROM(void);
47 void FixROMSpeed(void);
48 void MapRAM(void);
49 void MapExtraRAM(void);
50 
51 void BSLoROMMap(void);
52 void JumboLoROMMap(bool);
53 void LoROMMap(void);
54 void LoROM24MBSMap(void);
55 void SRAM512KLoROMMap(void);
56 void SRAM1024KLoROMMap(void);
57 void SufamiTurboLoROMMap(void);
58 void HiROMMap(void);
59 void SuperFXROMMap(void);
60 void TalesROMMap(bool);
61 void AlphaROMMap(void);
62 void SA1ROMMap(void);
63 void BSHiROMMap(void);
64 void SPC7110HiROMMap(void);
65 void SPC7110Sram(uint8_t);
66 void SetaDSPMap(void);
67 void ApplyROMFixes(void);
68 void DSPMap(void);
69 void CapcomProtectLoROMMap(void);
70 
71 const char* TVStandard(void);
72 const char* Speed(void);
73 const char* StaticRAMSize(void);
74 const char* MapType(void);
75 const char* MapMode(void);
76 const char* KartContents(void);
77 const char* Size(void);
78 const char* Headers(void);
79 const char* ROMID(void);
80 const char* CompanyID(void);
81 void ParseSNESHeader(uint8_t*);
82 
83 enum
84 {
85    MAP_PPU, MAP_CPU, MAP_DSP, MAP_LOROM_SRAM, MAP_HIROM_SRAM,
86    MAP_NONE, MAP_DEBUG, MAP_C4, MAP_BWRAM, MAP_BWRAM_BITMAP,
87    MAP_BWRAM_BITMAP2, MAP_SA1RAM, MAP_SPC7110_ROM, MAP_SPC7110_DRAM,
88    MAP_RONLY_SRAM, MAP_OBC_RAM, MAP_SETA_DSP, MAP_SETA_RISC, MAP_LAST
89 };
90 
91 enum
92 {
93    MAX_ROM_SIZE = 0x800000
94 };
95 
96 enum
97 {
98    MAP_TYPE_I_O,
99    MAP_TYPE_ROM,
100    MAP_TYPE_RAM
101 };
102 
103 typedef struct
104 {
105    uint8_t* RAM;
106    uint8_t* ROM;
107    uint8_t* VRAM;
108    uint8_t* SRAM;
109    uint8_t* BWRAM;
110    uint8_t* FillRAM;
111    uint8_t* C4RAM;
112    bool     HiROM;
113    bool     LoROM;
114    uint16_t SRAMMask;
115    uint8_t  SRAMSize;
116    uint8_t* Map         [MEMMAP_NUM_BLOCKS];
117    uint8_t* WriteMap    [MEMMAP_NUM_BLOCKS];
118    uint8_t  MemorySpeed [MEMMAP_NUM_BLOCKS];
119    uint8_t  BlockIsRAM  [MEMMAP_NUM_BLOCKS];
120    uint8_t  BlockIsROM  [MEMMAP_NUM_BLOCKS];
121    char     ROMName     [ROM_NAME_LEN];
122    char     ROMId       [5];
123    char     CompanyId   [3];
124    uint8_t  ROMSpeed;
125    uint8_t  ROMType;
126    uint8_t  ROMSize;
127    int32_t  ROMFramesPerSecond;
128    int32_t  HeaderCount;
129    uint32_t CalculatedSize;
130    uint32_t CalculatedChecksum;
131    uint32_t ROMChecksum;
132    uint32_t ROMComplementChecksum;
133    char     ROMFilename [_MAX_PATH];
134    uint8_t  ROMRegion;
135    uint8_t  ExtendedFormat;
136    uint8_t* BSRAM;
137 } CMemory;
138 
139 void ResetSpeedMap(void);
140 
141 extern CMemory Memory;
142 void S9xDeinterleaveMode2(void);
143 
144 uint8_t S9xGetByte(uint32_t Address);
145 uint16_t S9xGetWord(uint32_t Address);
146 void S9xSetByte(uint8_t Byte, uint32_t Address);
147 void S9xSetWord(uint16_t Byte, uint32_t Address);
148 void S9xSetPCBase(uint32_t Address);
149 uint8_t* S9xGetMemPointer(uint32_t Address);
150 uint8_t* GetBasePointer(uint32_t Address);
151 
152 extern uint8_t OpenBus;
153 #endif /* _memmap_h_ */
154