1 #pragma once
2
3 #include "tiles_generic.h"
4 #include "bitswap.h"
5
6 /* Useful definitions */
7 #define SNES_SCR_WIDTH 256 /* 32 characters 8 pixels wide */
8 #define SNES_SCR_HEIGHT_NTSC 224 /* Can be 224 or 240 height */
9 #define SNES_SCR_HEIGHT_PAL 274 /* ??? */
10 #define SNES_VTOTAL_NTSC 262 /* Maximum number of lines for NTSC systems */
11 #define SNES_VTOTAL_PAL 312 /* Maximum number of lines for PAL systems */
12 #define SNES_HTOTAL 341 /* Maximum number pixels per line (incl. hblank) */
13 #define SNES_DMA_BASE 0x4300 /* Base DMA register address */
14 #define SNES_MODE_20 0x1 /* Lo-ROM cart */
15 #define SNES_MODE_21 0x2 /* Hi-ROM cart */
16 #define SNES_MODE_22 0x4 /* Extended Lo-ROM cart - SDD-1 */
17 #define SNES_MODE_25 0x8 /* Extended Hi-ROM cart */
18 #define SNES_NTSC 0x00
19 #define SNES_PAL 0x10
20 #define SNES_VRAM_SIZE 0x20000 /* 128kb of video ram */
21 #define SNES_CGRAM_SIZE 0x202 /* 256 16-bit colours + 1 tacked on 16-bit colour for fixed colour */
22 #define SNES_OAM_SIZE 0x440 /* 1088 bytes of Object Attribute Memory */
23 #define SNES_SPCRAM_SIZE 0x10000 /* 64kb of spc700 ram */
24 #define SNES_EXROM_START 0x1000000
25 #define FIXED_COLOUR 256 /* Position in cgram for fixed colour */
26 /* Definitions for PPU Memory-Mapped registers */
27 #define INIDISP 0x2100
28 #define OBSEL 0x2101
29 #define OAMADDL 0x2102
30 #define OAMADDH 0x2103
31 #define OAMDATA 0x2104
32 #define BGMODE 0x2105 /* abcdefff = abcd: bg4-1 tile size | e: BG3 high priority | f: mode */
33 #define MOSAIC 0x2106 /* xxxxabcd = x: pixel size | abcd: affects bg 1-4 */
34 #define BG1SC 0x2107
35 #define BG2SC 0x2108
36 #define BG3SC 0x2109
37 #define BG4SC 0x210A
38 #define BG12NBA 0x210B
39 #define BG34NBA 0x210C
40 #define BG1HOFS 0x210D
41 #define BG1VOFS 0x210E
42 #define BG2HOFS 0x210F
43 #define BG2VOFS 0x2110
44 #define BG3HOFS 0x2111
45 #define BG3VOFS 0x2112
46 #define BG4HOFS 0x2113
47 #define BG4VOFS 0x2114
48 #define VMAIN 0x2115 /* i---ffrr = i: Increment timing | f: Full graphic | r: increment rate */
49 #define VMADDL 0x2116 /* aaaaaaaa = a: LSB of vram address */
50 #define VMADDH 0x2117 /* aaaaaaaa = a: MSB of vram address */
51 #define VMDATAL 0x2118 /* dddddddd = d: data to be written */
52 #define VMDATAH 0x2119 /* dddddddd = d: data to be written */
53 #define M7SEL 0x211A /* ab----yx = a: screen over | y: vertical flip | x: horizontal flip */
54 #define M7A 0x211B /* aaaaaaaa = a: COSINE rotate angle / X expansion */
55 #define M7B 0x211C /* aaaaaaaa = a: SINE rotate angle / X expansion */
56 #define M7C 0x211D /* aaaaaaaa = a: SINE rotate angle / Y expansion */
57 #define M7D 0x211E /* aaaaaaaa = a: COSINE rotate angle / Y expansion */
58 #define M7X 0x211F
59 #define M7Y 0x2120
60 #define CGADD 0x2121
61 #define CGDATA 0x2122
62 #define W12SEL 0x2123
63 #define W34SEL 0x2124
64 #define WOBJSEL 0x2125
65 #define WH0 0x2126 /* pppppppp = p: Left position of window 1 */
66 #define WH1 0x2127 /* pppppppp = p: Right position of window 1 */
67 #define WH2 0x2128 /* pppppppp = p: Left position of window 2 */
68 #define WH3 0x2129 /* pppppppp = p: Right position of window 2 */
69 #define WBGLOG 0x212A /* aabbccdd = a: BG4 params | b: BG3 params | c: BG2 params | d: BG1 params */
70 #define WOBJLOG 0x212B /* ----ccoo = c: Colour window params | o: Object window params */
71 #define TM 0x212C
72 #define TS 0x212D
73 #define TMW 0x212E
74 #define TSW 0x212F
75 #define CGWSEL 0x2130
76 #define CGADSUB 0x2131
77 #define COLDATA 0x2132
78 #define SETINI 0x2133
79 #define MPYL 0x2134
80 #define MPYM 0x2135
81 #define MPYH 0x2136
82 #define SLHV 0x2137
83 #define ROAMDATA 0x2138
84 #define RVMDATAL 0x2139
85 #define RVMDATAH 0x213A
86 #define RCGDATA 0x213B
87 #define OPHCT 0x213C
88 #define OPVCT 0x213D
89 #define STAT77 0x213E
90 #define STAT78 0x213F
91 #define APU00 0x2140
92 #define APU01 0x2141
93 #define APU02 0x2142
94 #define APU03 0x2143
95 #define WMDATA 0x2180
96 #define WMADDL 0x2181
97 #define WMADDM 0x2182
98 #define WMADDH 0x2183
99 /* Definitions for CPU Memory-Mapped registers */
100
101 extern UINT16 snes_cgram[SNES_CGRAM_SIZE];
102 extern UINT32 snesPal[0x20000];
103 /*SPC700*/
104 extern double spccycles;
105 extern double spctotal2;
106 extern double spctotal3;
107 void execspc();
108
clockspc(int cyc)109 static inline void clockspc(int cyc)
110 {
111 spccycles+=cyc;
112 if (spccycles>0) execspc();
113 }
114
115 /*65816*/
116 /*Registers*/
117 typedef union
118 {
119 UINT16 w;
120 struct
121 {
122 #ifndef BIG_ENDIAN
123 UINT8 l,h;
124 #else
125 UINT8 h,l;
126 #endif
127 } b;
128 } reg;
129
130
131 extern unsigned long pbr,dbr;
132 extern UINT16 pc,dp;
133
134
135
136 extern INT32 ins,output;
137 extern INT32 timetolive;
138 extern INT32 inwai;
139 /*Opcode table*/
140 extern void (*opcodes[256][5])();
141
142 /*CPU modes : 0 = X1M1
143 1 = X1M0
144 2 = X0M1
145 3 = X0M0
146 4 = emulation*/
147 extern INT32 cpumode;
148
149 /*Current opcode*/
150 extern UINT8 global_opcode;
151 /*Global cycles count*/
152 extern INT32 cycles;
153
154 /*Memory*/
155 extern UINT8 *SNES_ram;
156 extern UINT8 *SNES_rom;
157 extern UINT8 *memlookup[2048];
158 extern UINT8 *memread;
159 extern UINT8 *memwrite;
160 extern UINT8 *accessspeed;
161
162 extern INT32 lorom;
163
164
165 unsigned char snes_readmem(unsigned long adress);
166 void snes_writemem(unsigned long ad, unsigned char v);
167
168 #define readmemw(a) (snes_readmem(a))|((snes_readmem((a)+1))<<8)
169 #define writememw(a,v) snes_writemem(a,(v)&0xFF); snes_writemem((a)+1,(v)>>8)
170 #define writememw2(a,v) snes_writemem((a)+1,(v)>>8); snes_writemem(a,(v)&0xFF)
171
172 /*Video*/
173 extern INT32 nmi,vbl,joyscan;
174 extern INT32 nmienable;
175
176 extern INT32 ppumask;
177
178 extern INT32 yirq,xirq,irqenable,irq;
179 extern INT32 lines;
180
181
182
183 extern int global_pal;
184
185 /*DMA registers*/
186 extern unsigned short dmadest[8],dmasrc[8],dmalen[8];
187 extern unsigned long hdmaaddr[8],hdmaaddr2[8];
188 extern unsigned char dmabank[8],dmaibank[8],dmactrl[8],hdmastat[8],hdmadat[8];
189 extern int hdmacount[8];
190 extern unsigned char hdmaena;
191
192 // debugging
193 void snemlog( TCHAR *format, ...);
194
195 // ppu stuff
196 void resetppu();
197 void initppu();
198 void initspc();
199 void exitspc();
200 void makeopcodetable();
201 unsigned char readppu(unsigned short addr);
202 void writeppu(unsigned short addr, unsigned char val);
203 void drawline(int line);
204
205 // io stuff
206 void readjoy();
207 unsigned char readio(unsigned short addr);
208 unsigned char readjoyold(unsigned short addr);
209 void writeio(unsigned short addr, unsigned char val);
210 void writejoyold(unsigned short addr, unsigned char val);
211
212 struct CPU_P
213 {
214 int c,z,i,d,b,v,n,m,x,e;
215 };
216
217 extern CPU_P p;
218
219 // spc stuff
220 unsigned char readfromspc(unsigned short addr);
221 void writetospc(unsigned short addr, unsigned char val);
222 void resetspc();
223
224 extern unsigned char voiceon;
225
226 //snes.cpp stuff
227
228
229
230 // cpu stuff
231 void irq65816();
232 void nmi65816();
233 void reset65816();
234 extern int skipz,setzf;
235 //mem stuff
236
237 void allocmem();
238
239 void initsnem();
240 void resetsnem();
241 void execframe();
242 void loadrom(char *fn);
243
244 void snes_mapmem();
245 void freemem();
246 extern unsigned short srammask;
247 extern unsigned char *SNES_sram;
248 extern INT32 spctotal;
249
250 // snes_main.cpp
251 INT32 SnesInit();
252 INT32 SnesExit();
253 INT32 SnesFrame();
254 INT32 SnesScan(INT32 nAction,INT32 *pnMin);
255 extern unsigned char DoSnesReset;
256
257 extern unsigned char SnesJoy1[12];
258