summaryrefslogtreecommitdiff
path: root/src/usf/registers.h
blob: 4c9b1b3e8caccc37d4096b157beda7a34ee1402d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
/*
 * Project 64 - A Nintendo 64 emulator.
 *
 * (c) Copyright 2001 zilmar (zilmar@emulation64.com) and
 * Jabo (jabo@emulation64.com).
 *
 * pj64 homepage: www.pj64.net
 *
 * Permission to use, copy, modify and distribute Project64 in both binary and
 * source form, for non-commercial purposes, is hereby granted without fee,
 * providing that this license information and copyright notice appear with
 * all copies and any derived work.
 *
 * This software is provided 'as-is', without any express or implied
 * warranty. In no event shall the authors be held liable for any damages
 * arising from the use of this software.
 *
 * Project64 is freeware for PERSONAL USE only. Commercial users should
 * seek permission of the copyright holders first. Commercial use includes
 * charging money for Project64 or software derived from Project64.
 *
 * The copyright holders request that bug fixes and improvements to the code
 * should be forwarded to them so if they want them.
 *
 */

#ifndef REGISTERS_H
#define REGISTERS_H

#include "recompiler_cpu.h"
#include "types.h"

#define INDEX_REGISTER			CP0[0]
#define RANDOM_REGISTER			CP0[1]
#define ENTRYLO0_REGISTER		CP0[2]
#define ENTRYLO1_REGISTER		CP0[3]
#define CONTEXT_REGISTER		CP0[4]
#define PAGE_MASK_REGISTER		CP0[5]
#define WIRED_REGISTER			CP0[6]
#define BAD_VADDR_REGISTER		CP0[8]
#define COUNT_REGISTER			CP0[9]
#define ENTRYHI_REGISTER		CP0[10]
#define COMPARE_REGISTER		CP0[11]
#define STATUS_REGISTER			CP0[12]
#define CAUSE_REGISTER			CP0[13]
#define EPC_REGISTER			CP0[14]
#define CONFIG_REGISTER			CP0[16]
#define TAGLO_REGISTER			CP0[28]
#define TAGHI_REGISTER			CP0[29]
#define ERROREPC_REGISTER		CP0[30]
#define FAKE_CAUSE_REGISTER		CP0[32]

#define COMPARE_REGISTER_NO		11
#define STATUS_REGISTER_NO		12
#define CAUSE_REGISTER_NO		13

#define REVISION_REGISTER		FPCR[0]
#define FSTATUS_REGISTER		FPCR[31]

#define GPR_S0					GPR[16]
#define GPR_S1					GPR[17]
#define GPR_S2					GPR[18]
#define GPR_S3					GPR[19]
#define GPR_S4					GPR[20]
#define GPR_S5					GPR[21]
#define GPR_S6					GPR[22]
#define GPR_S7					GPR[23]
#define GPR_SP					GPR[29]
#define GPR_RA					GPR[31]

#define RDRAM_CONFIG_REG		RegRDRAM[0]
#define RDRAM_DEVICE_TYPE_REG	RegRDRAM[0]
#define RDRAM_DEVICE_ID_REG		RegRDRAM[1]
#define RDRAM_DELAY_REG			RegRDRAM[2]
#define RDRAM_MODE_REG			RegRDRAM[3]
#define RDRAM_REF_INTERVAL_REG	RegRDRAM[4]
#define RDRAM_REF_ROW_REG		RegRDRAM[5]
#define RDRAM_RAS_INTERVAL_REG	RegRDRAM[6]
#define RDRAM_MIN_INTERVAL_REG	RegRDRAM[7]
#define RDRAM_ADDR_SELECT_REG	RegRDRAM[8]
#define RDRAM_DEVICE_MANUF_REG	RegRDRAM[9]

#define SP_MEM_ADDR_REG			RegSP[0]
#define SP_DRAM_ADDR_REG		RegSP[1]
#define SP_RD_LEN_REG			RegSP[2]
#define SP_WR_LEN_REG			RegSP[3]
#define SP_STATUS_REG			RegSP[4]
#define SP_DMA_FULL_REG			RegSP[5]
#define SP_DMA_BUSY_REG			RegSP[6]
#define SP_SEMAPHORE_REG		RegSP[7]
#define SP_PC_REG				RegSP[8]
#define SP_IBIST_REG			RegSP[9]

#define DPC_START_REG			RegDPC[0]
#define DPC_END_REG				RegDPC[1]
#define DPC_CURRENT_REG			RegDPC[2]
#define DPC_STATUS_REG			RegDPC[3]
#define DPC_CLOCK_REG			RegDPC[4]
#define DPC_BUFBUSY_REG			RegDPC[5]
#define DPC_PIPEBUSY_REG		RegDPC[6]
#define DPC_TMEM_REG			RegDPC[7]

#define MI_INIT_MODE_REG		RegMI[0]
#define MI_MODE_REG				RegMI[0]
#define MI_VERSION_REG			RegMI[1]
#define MI_NOOP_REG				RegMI[1]
#define MI_INTR_REG				RegMI[2]
#define MI_INTR_MASK_REG		RegMI[3]

#define VI_STATUS_REG			RegVI[0]
#define VI_CONTROL_REG			RegVI[0]
#define VI_ORIGIN_REG 			RegVI[1]
#define VI_DRAM_ADDR_REG		RegVI[1]
#define VI_WIDTH_REG 			RegVI[2]
#define VI_H_WIDTH_REG 			RegVI[2]
#define VI_INTR_REG  			RegVI[3]
#define VI_V_INTR_REG 			RegVI[3]
#define VI_CURRENT_REG 			RegVI[4]
#define VI_V_CURRENT_LINE_REG	RegVI[4]
#define VI_BURST_REG  			RegVI[5]
#define VI_TIMING_REG 			RegVI[5]
#define VI_V_SYNC_REG 			RegVI[6]
#define VI_H_SYNC_REG 			RegVI[7]
#define VI_LEAP_REG  			RegVI[8]
#define VI_H_SYNC_LEAP_REG		RegVI[8]
#define VI_H_START_REG 			RegVI[9]
#define VI_H_VIDEO_REG			RegVI[9]
#define VI_V_START_REG 			RegVI[10]
#define VI_V_VIDEO_REG			RegVI[10]
#define VI_V_BURST_REG			RegVI[11]
#define VI_X_SCALE_REG			RegVI[12]
#define VI_Y_SCALE_REG			RegVI[13]

#define AI_DRAM_ADDR_REG		RegAI[0]
#define AI_LEN_REG				RegAI[1]
#define AI_CONTROL_REG			RegAI[2]
#define AI_STATUS_REG			RegAI[3]
#define AI_DACRATE_REG			RegAI[4]
#define AI_BITRATE_REG			RegAI[5]

#define PI_DRAM_ADDR_REG		RegPI[0]
#define PI_CART_ADDR_REG		RegPI[1]
#define PI_RD_LEN_REG			RegPI[2]
#define PI_WR_LEN_REG			RegPI[3]
#define PI_STATUS_REG			RegPI[4]
#define PI_BSD_DOM1_LAT_REG 	RegPI[5]
#define PI_DOMAIN1_REG		 	RegPI[5]
#define PI_BSD_DOM1_PWD_REG	 	RegPI[6]
#define PI_BSD_DOM1_PGS_REG	 	RegPI[7]
#define PI_BSD_DOM1_RLS_REG	 	RegPI[8]
#define PI_BSD_DOM2_LAT_REG	 	RegPI[9]
#define PI_DOMAIN2_REG		 	RegPI[9]
#define PI_BSD_DOM2_PWD_REG	 	RegPI[10]
#define PI_BSD_DOM2_PGS_REG	 	RegPI[11]
#define PI_BSD_DOM2_RLS_REG	 	RegPI[12]

#define RI_MODE_REG				RegRI[0]
#define RI_CONFIG_REG			RegRI[1]
#define RI_CURRENT_LOAD_REG		RegRI[2]
#define RI_SELECT_REG			RegRI[3]
#define RI_COUNT_REG			RegRI[4]
#define RI_REFRESH_REG			RegRI[4]
#define RI_LATENCY_REG			RegRI[5]
#define RI_RERROR_REG			RegRI[6]
#define RI_WERROR_REG			RegRI[7]

#define SI_DRAM_ADDR_REG		RegSI[0]
#define SI_PIF_ADDR_RD64B_REG	RegSI[1]
#define SI_PIF_ADDR_WR64B_REG	RegSI[2]
#define SI_STATUS_REG			RegSI[3]

#define STATUS_IE				0x00000001
#define STATUS_EXL				0x00000002
#define STATUS_ERL				0x00000004
#define STATUS_IP0				0x00000100
#define STATUS_IP1				0x00000200
#define STATUS_IP2				0x00000400
#define STATUS_IP3				0x00000800
#define STATUS_IP4				0x00001000
#define STATUS_IP5				0x00002000
#define STATUS_IP6				0x00004000
#define STATUS_IP7				0x00008000
#define STATUS_BEV				0x00400000
#define STATUS_FR				0x04000000
#define STATUS_CU0				0x10000000
#define STATUS_CU1				0x20000000

#define CAUSE_EXC_CODE			0xFF
#define CAUSE_IP0				0x100
#define CAUSE_IP1				0x200
#define CAUSE_IP2				0x400
#define CAUSE_IP3				0x800
#define CAUSE_IP4				0x1000
#define CAUSE_IP5				0x2000
#define CAUSE_IP6				0x4000
#define CAUSE_IP7				0x8000
#define CAUSE_BD				0x80000000

#define SP_CLR_HALT				0x00001	    /* Bit  0: clear halt */
#define SP_SET_HALT				0x00002	    /* Bit  1: set halt */
#define SP_CLR_BROKE			0x00004	    /* Bit  2: clear broke */
#define SP_CLR_INTR				0x00008	    /* Bit  3: clear intr */
#define SP_SET_INTR				0x00010	    /* Bit  4: set intr */
#define SP_CLR_SSTEP			0x00020	    /* Bit  5: clear sstep */
#define SP_SET_SSTEP			0x00040	    /* Bit  6: set sstep */
#define SP_CLR_INTR_BREAK		0x00080	    /* Bit  7: clear intr on break */
#define SP_SET_INTR_BREAK		0x00100	    /* Bit  8: set intr on break */
#define SP_CLR_SIG0				0x00200	    /* Bit  9: clear signal 0 */
#define SP_SET_SIG0				0x00400	    /* Bit 10: set signal 0 */
#define SP_CLR_SIG1				0x00800	    /* Bit 11: clear signal 1 */
#define SP_SET_SIG1				0x01000	    /* Bit 12: set signal 1 */
#define SP_CLR_SIG2				0x02000	    /* Bit 13: clear signal 2 */
#define SP_SET_SIG2				0x04000	    /* Bit 14: set signal 2 */
#define SP_CLR_SIG3				0x08000	    /* Bit 15: clear signal 3 */
#define SP_SET_SIG3				0x10000	    /* Bit 16: set signal 3 */
#define SP_CLR_SIG4				0x20000	    /* Bit 17: clear signal 4 */
#define SP_SET_SIG4				0x40000	    /* Bit 18: set signal 4 */
#define SP_CLR_SIG5				0x80000	    /* Bit 19: clear signal 5 */
#define SP_SET_SIG5				0x100000	/* Bit 20: set signal 5 */
#define SP_CLR_SIG6				0x200000	/* Bit 21: clear signal 6 */
#define SP_SET_SIG6				0x400000	/* Bit 22: set signal 6 */
#define SP_CLR_SIG7				0x800000	/* Bit 23: clear signal 7 */
#define SP_SET_SIG7				0x1000000   /* Bit 24: set signal 7 */

#define SP_STATUS_HALT			0x001		/* Bit  0: halt */
#define SP_STATUS_BROKE			0x002		/* Bit  1: broke */
#define SP_STATUS_DMA_BUSY		0x004		/* Bit  2: dma busy */
#define SP_STATUS_DMA_FULL		0x008		/* Bit  3: dma full */
#define SP_STATUS_IO_FULL		0x010		/* Bit  4: io full */
#define SP_STATUS_SSTEP			0x020		/* Bit  5: single step */
#define SP_STATUS_INTR_BREAK	0x040		/* Bit  6: interrupt on break */
#define SP_STATUS_SIG0			0x080		/* Bit  7: signal 0 set */
#define SP_STATUS_SIG1			0x100		/* Bit  8: signal 1 set */
#define SP_STATUS_SIG2			0x200		/* Bit  9: signal 2 set */
#define SP_STATUS_SIG3			0x400		/* Bit 10: signal 3 set */
#define SP_STATUS_SIG4			0x800		/* Bit 11: signal 4 set */
#define SP_STATUS_SIG5	       0x1000		/* Bit 12: signal 5 set */
#define SP_STATUS_SIG6	       0x2000		/* Bit 13: signal 6 set */
#define SP_STATUS_SIG7	       0x4000		/* Bit 14: signal 7 set */

#define DPC_CLR_XBUS_DMEM_DMA	0x0001		/* Bit 0: clear xbus_dmem_dma */
#define DPC_SET_XBUS_DMEM_DMA	0x0002		/* Bit 1: set xbus_dmem_dma */
#define DPC_CLR_FREEZE			0x0004		/* Bit 2: clear freeze */
#define DPC_SET_FREEZE			0x0008		/* Bit 3: set freeze */
#define DPC_CLR_FLUSH			0x0010		/* Bit 4: clear flush */
#define DPC_SET_FLUSH			0x0020		/* Bit 5: set flush */
#define DPC_CLR_TMEM_CTR		0x0040		/* Bit 6: clear tmem ctr */
#define DPC_CLR_PIPE_CTR		0x0080		/* Bit 7: clear pipe ctr */
#define DPC_CLR_CMD_CTR			0x0100		/* Bit 8: clear cmd ctr */
#define DPC_CLR_CLOCK_CTR		0x0200		/* Bit 9: clear clock ctr */

#define DPC_STATUS_XBUS_DMEM_DMA	0x001	/* Bit  0: xbus_dmem_dma */
#define DPC_STATUS_FREEZE			0x002	/* Bit  1: freeze */
#define DPC_STATUS_FLUSH			0x004	/* Bit  2: flush */
#define DPC_STATUS_START_GCLK		0x008	/* Bit  3: start gclk */
#define DPC_STATUS_TMEM_BUSY		0x010	/* Bit  4: tmem busy */
#define DPC_STATUS_PIPE_BUSY		0x020	/* Bit  5: pipe busy */
#define DPC_STATUS_CMD_BUSY			0x040	/* Bit  6: cmd busy */
#define DPC_STATUS_CBUF_READY		0x080	/* Bit  7: cbuf ready */
#define DPC_STATUS_DMA_BUSY			0x100	/* Bit  8: dma busy */
#define DPC_STATUS_END_VALID		0x200	/* Bit  9: end valid */
#define DPC_STATUS_START_VALID		0x400	/* Bit 10: start valid */

#define MI_CLR_INIT				0x0080		/* Bit  7: clear init mode */
#define MI_SET_INIT				0x0100		/* Bit  8: set init mode */
#define MI_CLR_EBUS				0x0200		/* Bit  9: clear ebus test */
#define MI_SET_EBUS				0x0400		/* Bit 10: set ebus test mode */
#define MI_CLR_DP_INTR			0x0800		/* Bit 11: clear dp interrupt */
#define MI_CLR_RDRAM			0x1000		/* Bit 12: clear RDRAM reg */
#define MI_SET_RDRAM			0x2000		/* Bit 13: set RDRAM reg mode */

#define MI_MODE_INIT			0x0080		/* Bit  7: init mode */
#define MI_MODE_EBUS			0x0100		/* Bit  8: ebus test mode */
#define MI_MODE_RDRAM			0x0200		/* Bit  9: RDRAM reg mode */

#define MI_INTR_MASK_CLR_SP		0x0001		/* Bit  0: clear SP mask */
#define MI_INTR_MASK_SET_SP		0x0002		/* Bit  1: set SP mask */
#define MI_INTR_MASK_CLR_SI		0x0004		/* Bit  2: clear SI mask */
#define MI_INTR_MASK_SET_SI		0x0008		/* Bit  3: set SI mask */
#define MI_INTR_MASK_CLR_AI		0x0010		/* Bit  4: clear AI mask */
#define MI_INTR_MASK_SET_AI		0x0020		/* Bit  5: set AI mask */
#define MI_INTR_MASK_CLR_VI		0x0040		/* Bit  6: clear VI mask */
#define MI_INTR_MASK_SET_VI		0x0080		/* Bit  7: set VI mask */
#define MI_INTR_MASK_CLR_PI		0x0100		/* Bit  8: clear PI mask */
#define MI_INTR_MASK_SET_PI		0x0200		/* Bit  9: set PI mask */
#define MI_INTR_MASK_CLR_DP		0x0400		/* Bit 10: clear DP mask */
#define MI_INTR_MASK_SET_DP		0x0800		/* Bit 11: set DP mask */

#define MI_INTR_MASK_SP			0x01		/* Bit 0: SP intr mask */
#define MI_INTR_MASK_SI			0x02		/* Bit 1: SI intr mask */
#define MI_INTR_MASK_AI			0x04		/* Bit 2: AI intr mask */
#define MI_INTR_MASK_VI			0x08		/* Bit 3: VI intr mask */
#define MI_INTR_MASK_PI			0x10		/* Bit 4: PI intr mask */
#define MI_INTR_MASK_DP			0x20		/* Bit 5: DP intr mask */

#define MI_INTR_SP				0x01		/* Bit 0: SP intr */
#define MI_INTR_SI				0x02		/* Bit 1: SI intr */
#define MI_INTR_AI				0x04		/* Bit 2: AI intr */
#define MI_INTR_VI				0x08		/* Bit 3: VI intr */
#define MI_INTR_PI				0x10		/* Bit 4: PI intr */
#define MI_INTR_DP				0x20		/* Bit 5: DP intr */

#define	PI_STATUS_DMA_BUSY		0x01
#define	PI_STATUS_IO_BUSY		0x02
#define	PI_STATUS_ERROR			0x04

#define	PI_SET_RESET			0x01
#define	PI_CLR_INTR				0x02

#define	SI_STATUS_DMA_BUSY		0x0001
#define	SI_STATUS_RD_BUSY		0x0002
#define	SI_STATUS_DMA_ERROR		0x0008
#define	SI_STATUS_INTERRUPT		0x1000

#define FPCSR_FS				0x01000000	/* flush denorm to zero */
#define	FPCSR_C					0x00800000	/* condition bit */
#define	FPCSR_CE				0x00020000	/* cause: unimplemented operation */
#define	FPCSR_CV				0x00010000	/* cause: invalid operation */
#define	FPCSR_CZ				0x00008000	/* cause: division by zero */
#define	FPCSR_CO				0x00004000	/* cause: overflow */
#define	FPCSR_CU				0x00002000	/* cause: underflow */
#define	FPCSR_CI				0x00001000	/* cause: inexact operation */
#define	FPCSR_EV				0x00000800	/* enable: invalid operation */
#define	FPCSR_EZ				0x00000400	/* enable: division by zero */
#define	FPCSR_EO				0x00000200	/* enable: overflow */
#define	FPCSR_EU				0x00000100	/* enable: underflow */
#define	FPCSR_EI				0x00000080	/* enable: inexact operation */
#define	FPCSR_FV				0x00000040	/* flag: invalid operation */
#define	FPCSR_FZ				0x00000020	/* flag: division by zero */
#define	FPCSR_FO				0x00000010	/* flag: overflow */
#define	FPCSR_FU				0x00000008	/* flag: underflow */
#define	FPCSR_FI				0x00000004	/* flag: inexact operation */
#define	FPCSR_RM_MASK			0x00000003	/* rounding mode mask */
#define	FPCSR_RM_RN				0x00000000	/* round to nearest */
#define	FPCSR_RM_RZ				0x00000001	/* round to zero */
#define	FPCSR_RM_RP				0x00000002	/* round to positive infinity */
#define	FPCSR_RM_RM				0x00000003	/* round to negative infinity */

#define FPR_Type(Reg)	(Reg) == R4300i_COP1_S ? "S" : (Reg) == R4300i_COP1_D ? "D" :\
						(Reg) == R4300i_COP1_W ? "W" : "L"

typedef struct {
	uint32_t      PROGRAM_COUNTER;
    MIPS_DWORD    GPR[32];
	MIPS_DWORD    FPR[32];
	uint32_t      CP0[33];
	uint32_t      FPCR[32];
	MIPS_DWORD	  HI;
	MIPS_DWORD 	  LO;
	uint32_t      RDRAM[10];
	uint32_t      SP[10];
	uint32_t      DPC[10];
	uint32_t      MI[4];
	uint32_t      VI[14];
	uint32_t      AI[6];
	uint32_t      PI[13];
	uint32_t      RI[8];
	uint32_t      SI[4];
	int8_t       PIF_Ram[0x40];
} N64_REGISTERS;


extern uint32_t PROGRAM_COUNTER, * CP0,*FPCR,*RegRDRAM,*RegSP,*RegDPC,*RegMI,*RegVI,*RegAI,*RegPI,
	*RegRI,*RegSI, HalfLine, RegModValue, ViFieldNumber, LLBit, LLAddr;
extern void * FPRDoubleLocation[32], * FPRFloatLocation[32];
extern MIPS_DWORD *GPR, *FPR, HI, LO;
extern N64_REGISTERS * Registers;

enum FPU_Format {
	FPU_Unkown,FPU_Dword, FPU_Qword, FPU_Float, FPU_Double
};

enum FPU_RoundingModel {
	RoundUnknown, RoundDefault, RoundTruncate, RoundNearest, RoundDown, RoundUp
};

void ChangeFPURegFormat       ( BLOCK_SECTION * Section, int32_t Reg, int32_t OldFormat, int32_t NewFormat, int32_t RoundingModel );
void ChangeMiIntrMask         ( void );
void ChangeMiModeReg          ( void );
void ChangeSpStatus           ( void );
void InitalizeR4300iRegisters ( void );
uint32_t Is8BitReg                ( int32_t x86Reg);
void Load_FPR_ToTop           ( BLOCK_SECTION * Section, int32_t Reg, int32_t RegToLoad, int32_t Format);
void Map_GPR_32bit            ( BLOCK_SECTION * Section, int32_t Reg, uint32_t SignValue, int32_t MipsRegToLoad );
void Map_GPR_64bit            ( BLOCK_SECTION * Section, int32_t Reg, int32_t MipsRegToLoad );
int32_t  Map_TempReg              ( BLOCK_SECTION * Section, int32_t x86Reg, int32_t MipsReg, uint32_t LoadHiWord );
uint32_t RegInStack               ( BLOCK_SECTION * Section, int32_t Reg, int32_t Format );
void ProtectGPR               ( BLOCK_SECTION * Section, uint32_t Reg );
void SetFpuLocations          ( void );
int32_t  StackPosition            ( BLOCK_SECTION * Section, int32_t Reg );
int UnMap_8BitTempReg (BLOCK_SECTION * Section);
void UnMap_AllFPRs            ( BLOCK_SECTION * Section );
void UnMap_FPR                ( BLOCK_SECTION * Section, int32_t Reg, int32_t WriteBackValue );
void UnMap_GPR                ( BLOCK_SECTION * Section, uint32_t Reg, int32_t WriteBackValue );
uint32_t UnMap_X86reg             ( BLOCK_SECTION * Section, uint32_t x86Reg );
void UnProtectGPR             ( BLOCK_SECTION * Section, uint32_t Reg );
void UpdateCurrentHalfLine    ( void );
void WriteBackRegisters       ( BLOCK_SECTION * Section );


void SetupRegisters(N64_REGISTERS * n64_Registers);

#endif