-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathppu.h
237 lines (187 loc) · 4.26 KB
/
ppu.h
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
#ifndef PPU_H
#define PPU_H
extern void resetppu(void);
extern void StartScreenRefresh (void);
extern void RenderLine (int visibleScanline);
extern void EndScreenRefresh (void);
extern void UpdateScreen(void);
//remenber to call FLUSH_REDRAW() before the change of ppu registers values
#define FLUSH_REDRAW() if (PPU.PreviousLine != PPU.CurrentLine) UpdateScreen ()
struct SOBJ
{
short HPos;
word VPos;
word Name;
boolean VFlip;
boolean HFlip;
byte Priority;
byte Palette;
byte Size;
};
extern struct ppu_settings{
int screen_height;
int screen_width;
boolean ForcedBlanking;
byte Brightness;
/*VRAM stuff*/
byte VRAM[0x10000];//64k video ram
struct {
boolean High;
byte Increment;
word Address;
word Mask1;
word FullGraphicCount;
word Shift;
} VMA;
boolean FirstVRAMRead;
/*IRQ, NMI, pos latch stuff*/
boolean HBeamFlip;
boolean VBeamFlip;
word VBeamPosLatched;
word HBeamPosLatched;
word IRQHBeamPos;
word IRQVBeamPos;
int HTimerPosition;
boolean VTimerEnabled;
boolean HTimerEnabled;
boolean NMIEnable;
/*address to access wram*/
word WRAM;
/*CGRAM stuff*/
word CGDATA [256];//palette data
boolean ColorsChanged;
boolean CGFLIP;
boolean CGFLIPRead;
byte CGADD;
/*OAM stuff*/
byte OAMData [512 + 32];
boolean OBJChanged;
byte OAMPriorityRotation;
word OAMAddr;
word SavedOAMAddr;
word OAMWriteRegister;
byte OAMFlip;
/*OBJECTS stuff*/
struct SOBJ OBJ [128];
byte OBJSizeSelect;
word OBJNameBase;
word OBJNameSelect;
byte FirstSprite;
byte LastSprite;
/*BG stuff*/
byte BGMode;
byte BG3Priority;
struct {
word SCBase;//to obtain the real address you have to shift left this address by 1
word VOffset;
word HOffset;
byte BGSize;
word NameBase;//to obtain the real address you have to shift left this address by 1
word SCSize;
} BG [4];
byte Mosaic;
boolean BGMosaic [4];
/*Mode7 stuff*/
boolean Mode7HFlip;
boolean Mode7VFlip;
byte Mode7Repeat;
short MatrixA;
short MatrixB;
short MatrixC;
short MatrixD;
short CentreX;
short CentreY;
boolean Need16x8Mulitply;
byte Mode7PriorityMask;
byte Mode7Mask;
/*some dummy registers */
byte reg4210;
byte reg2100;
byte reg2101;
byte reg2105;
byte reg2106;
byte reg2107;
byte reg2108;
byte reg2109;
byte reg210A;
byte reg210B;
byte reg210C;
byte reg211A;
byte reg212C;
byte reg2133;
/*some variables needed by rendering engine*/
int PreviousLine;
int CurrentLine;
/*joypad internal variables*/
dword Joypad1state;
byte Joypad1ButtonReadPos;
dword Joypad2state;
byte Joypad2ButtonReadPos;
/*frame skip stuff*/
unsigned int frame_number;
int frame_skip;
} PPU;
#define MAX_5C77_VERSION 0x01
#define MAX_5C78_VERSION 0x03
#define MAX_5A22_VERSION 0x02
extern struct SBG
{
dword TileSize;
dword BitShift;
dword TileShift;
dword TileAddress;
dword NameSelect;
dword SCBase;
dword StartPalette;
dword PaletteShift;
dword PaletteMask;
boolean DirectColourMode;
unsigned int zbuf_depth[4];
unsigned int currentTileDepth;
byte *CacheBuffer;
byte *CacheValidation;
}BG;
struct SLineData {
struct {
word VOffset;
word HOffset;
} BG [4];
};
struct SLineMatrixData
{
short MatrixA;
short MatrixB;
short MatrixC;
short MatrixD;
short CentreX;
short CentreY;
};
struct visibleObj {
int OBJList [129];
dword Sizes [129];
int VPositions [129];
};
#define TILE_2BIT 0
#define TILE_4BIT 1
#define TILE_8BIT 2
extern struct zbuf{
unsigned int depth[SNES_SCREEN_HEIGHT_EXTENDED][SNES_SCREEN_WIDTH];
unsigned int current_base_depth;
} z_buffer;
#define BG2_DEPTH_EXTRA_PRIORITY 14
#define OBJ_DEPTH_PRIORITY3 13
#define BG0_DEPTH_WITH_PRIORITY 12
#define BG1_DEPTH_WITH_PRIORITY 11
#define OBJ_DEPTH_PRIORITY2 10
#define BG1_DEPTH_EXTRA_PRIORITY 9
#define BG0_DEPTH_NO_PRIORITY 8
#define BG1_DEPTH_NO_PRIORITY 7
#define OBJ_DEPTH_PRIORITY1 6
#define BG2_DEPTH_WITH_PRIORITY 5
#define BG3_DEPTH_WITH_PRIORITY 4
#define OBJ_DEPTH_PRIORITY0 3
#define BG2_DEPTH_NO_PRIORITY 2
#define BG3_DEPTH_NO_PRIORITY 1
#define MAX_DEPTH BG2_DEPTH_EXTRA_PRIORITY
#define BASE_DEPTH_RESET 0xFFFFFF
#endif//end of library