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