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
|
//
// Memory map defines. All of them
//
//! \file tonc_memdef.h
//! \author J Vijn
//! \date 20060508 - 20060924
//
// === NOTES ===
// * This is a _small_ set of typedefs, #defines and inlines that can
// be found in tonclib, and might not represent the
// final forms.
// * '0'-defines are prefixed with '_', to indicate their zero-ness
// and presents a safety from things like doing `if(x&0)'
#ifndef __MEMDEF__
#define __MEMDEF__
// --- Prefixes ---
// REG_DISPCNT : DCNT
// REG_DISPSTAT : DSTAT
// OAM attr 0 : OA0
// OAM attr 1 : OA1
// OAM attr 2 : OA2
// --- REG_DISPCNT -----------------------------------------------------
#define DCNT_MODE0 0 //!< Mode 0; bg 0-4: reg
#define DCNT_MODE1 0x0001 //!< Mode 1; bg 0-1: reg; bg 2: affine
#define DCNT_MODE2 0x0002 //!< Mode 2; bg 2-2: affine
#define DCNT_MODE3 0x0003 //!< Mode 3; bg2: 240x160\@16 bitmap
#define DCNT_MODE4 0x0004 //!< Mode 4; bg2: 240x160\@8 bitmap
#define DCNT_MODE5 0x0005 //!< Mode 5; bg2: 160x128\@16 bitmap
#define DCNT_GB 0x0008 //!< (R) GBC indicator
#define DCNT_PAGE 0x0010 //!< Page indicator
#define DCNT_OAM_HBL 0x0020 //!< Allow OAM updates in HBlank
#define DCNT_OBJ_2D 0 //!< OBJ-VRAM as matrix
#define DCNT_OBJ_1D 0x0040 //!< OBJ-VRAM as array
#define DCNT_BLANK 0x0080 //!< Force screen blank
#define DCNT_BG0 0x0100 //!< Enable bg 0
#define DCNT_BG1 0x0200 //!< Enable bg 1
#define DCNT_BG2 0x0400 //!< Enable bg 2
#define DCNT_BG3 0x0800 //!< Enable bg 3
#define DCNT_OBJ 0x1000 //!< Enable objects
#define DCNT_WIN0 0x2000 //!< Enable window 0
#define DCNT_WIN1 0x4000 //!< Enable window 1
#define DCNT_WINOBJ 0x8000 //!< Enable object window
#define DCNT_MODE_MASK 0x0007
#define DCNT_MODE_SHIFT 0
#define DCNT_MODE(n) ((n)<<DCNT_MODE_SHIFT)
#define DCNT_LAYER_MASK 0x1F00
#define DCNT_LAYER_SHIFT 8
#define DCNT_LAYER(n) ((n)<<DCNT_LAYER_SHIFT)
#define DCNT_WIN_MASK 0xE000
#define DCNT_WIN_SHIFT 13
#define DCNT_WIN(n) ((n)<<DCNT_WIN_SHIFT)
#define DCNT_BUILD(mode, layer, win, obj1d, objhbl) \
( \
(((win)&7)<<13) | (((layer)&31)<<8) | (((obj1d)&1)<<6) \
| (((oamhbl)&1)<<5) | ((mode)&7) \
)
// --- REG_DISPSTAT ----------------------------------------------------
#define DSTAT_IN_VBL 0x0001 //!< Now in VBlank
#define DSTAT_IN_HBL 0x0002 //!< Now in HBlank
#define DSTAT_IN_VCT 0x0004 //!< Now in set VCount
#define DSTAT_VBL_IRQ 0x0008 //!< Enable VBlank irq
#define DSTAT_HBL_IRQ 0x0010 //!< Enable HBlank irq
#define DSTAT_VCT_IRQ 0x0020 //!< Enable VCount irq
#define DSTAT_VCT_MASK 0xFF00
#define DSTAT_VCT_SHIFT 8
#define DSTAT_VCT(n) ((n)<<DSTAT_VCT_SHIFT)
// --- REG_KEYINPUT --------------------------------------------------------
#define KEY_A 0x0001 //!< Button A
#define KEY_B 0x0002 //!< Button B
#define KEY_SELECT 0x0004 //!< Select button
#define KEY_START 0x0008 //!< Start button
#define KEY_RIGHT 0x0010 //!< Right D-pad
#define KEY_LEFT 0x0020 //!< Left D-pad
#define KEY_UP 0x0040 //!< Up D-pad
#define KEY_DOWN 0x0080 //!< Down D-pad
#define KEY_R 0x0100 //!< Shoulder R
#define KEY_L 0x0200 //!< Shoulder L
#define KEY_ANY 0x03FF //!< any key
#define KEY_DIR 0x00F0 //!< any-dpad
#define KEY_ACCEPT 0x0009 //!< A or start
#define KEY_CANCEL 0x0002 //!< B (well, it usually is)
#define KEY_SHOULDER 0x0300 //!< L or R
#define KEY_RESET 0x000F //!< St+Se+A+B
#define KEY_MASK 0x03FF
// --- OAM attribute 0 -------------------------------------------------
#define ATTR0_REG 0 //!< Regular object
#define ATTR0_AFF 0x0100 //!< Affine object
#define ATTR0_HIDE 0x0200 //!< Inactive object
#define ATTR0_AFF_DBL 0x0300 //!< Double-size affine object
#define ATTR0_AFF_DBL_BIT 0x0200
#define ATTR0_BLEND 0x0400 //!< Enable blend
#define ATTR0_WINDOW 0x0800 //!< Use for object window
#define ATTR0_MOSAIC 0x1000 //!< Enable mosaic
#define ATTR0_4BPP 0 //!< Use 4bpp (16 color) tiles
#define ATTR0_8BPP 0x2000 //!< Use 8bpp (256 color) tiles
#define ATTR0_SQUARE 0 //!< Square shape
#define ATTR0_WIDE 0x4000 //!< Tall shape (height > width)
#define ATTR0_TALL 0x8000 //!< Wide shape (height < width)
#define ATTR0_Y_MASK 0x00FF
#define ATTR0_Y_SHIFT 0
#define ATTR0_Y(n) ((n)<<ATTR0_Y_SHIFT)
#define ATTR0_MODE_MASK 0x0300
#define ATTR0_MODE_SHIFT 8
#define ATTR0_MODE(n) ((n)<<ATTR0_MODE_SHIFT)
#define ATTR0_SHAPE_MASK 0xC000
#define ATTR0_SHAPE_SHIFT 14
#define ATTR0_SHAPE(n) ((n)<<ATTR0_SHAPE_SHIFT)
#define ATTR0_BUILD(y, shape, bpp, mode, mos, bld, win) \
( \
((y)&255) | (((mode)&3)<<8) | (((bld)&1)<<10) | (((win)&1)<<11) \
| (((mos)&1)<<12) | (((bpp)&8)<<10)| (((shape)&3)<<14) \
)
// --- OAM attribute 1 -------------------------------------------------
#define ATTR1_HFLIP 0x1000 //!< Horizontal flip (reg obj only)
#define ATTR1_VFLIP 0x2000 //!< Vertical flip (reg obj only)
// Base sizes
#define ATTR1_SIZE_8 0
#define ATTR1_SIZE_16 0x4000
#define ATTR1_SIZE_32 0x8000
#define ATTR1_SIZE_64 0xC000
// Square sizes
#define ATTR1_SIZE_8x8 0 //!< Size flag for 8x8 px object
#define ATTR1_SIZE_16x16 0x4000 //!< Size flag for 16x16 px object
#define ATTR1_SIZE_32x32 0x8000 //!< Size flag for 32x32 px object
#define ATTR1_SIZE_64x64 0xC000 //!< Size flag for 64x64 px object
// Tall sizes
#define ATTR1_SIZE_8x16 0 //!< Size flag for 8x16 px object
#define ATTR1_SIZE_8x32 0x4000 //!< Size flag for 8x32 px object
#define ATTR1_SIZE_16x32 0x8000 //!< Size flag for 16x32 px object
#define ATTR1_SIZE_32x64 0xC000 //!< Size flag for 32x64 px object
// Wide sizes
#define ATTR1_SIZE_16x8 0 //!< Size flag for 16x8 px object
#define ATTR1_SIZE_32x8 0x4000 //!< Size flag for 32x8 px object
#define ATTR1_SIZE_32x16 0x8000 //!< Size flag for 32x16 px object
#define ATTR1_SIZE_64x32 0xC000 //!< Size flag for 64x64 px object
#define ATTR1_X_MASK 0x01FF
#define ATTR1_X_SHIFT 0
#define ATTR1_X(n) ((n)<<ATTR1_X_SHIFT)
#define ATTR1_AFF_ID_MASK 0x3E00
#define ATTR1_AFF_ID_SHIFT 9
#define ATTR1_AFF_ID(n) ((n)<<ATTR1_AFF_ID_SHIFT)
#define ATTR1_FLIP_MASK 0x3000
#define ATTR1_FLIP_SHIFT 12
#define ATTR1_FLIP(n) ((n)<<ATTR1_FLIP_SHIFT)
#define ATTR1_SIZE_MASK 0xC000
#define ATTR1_SIZE_SHIFT 14
#define ATTR1_SIZE(n) ((n)<<ATTR1_SIZE_SHIFT)
#define ATTR1_BUILDR(x, size, hflip, vflip) \
( ((x)&511) | (((hflip)&1)<<12) | (((vflip)&1)<<13) | (((size)&3)<<14) )
#define ATTR1_BUILDA(x, size, affid) \
( ((x)&511) | (((affid)&31)<<9) | (((size)&3)<<14) )
// --- OAM attribute 2 -------------------------------------------------
#define ATTR2_ID_MASK 0x03FF
#define ATTR2_ID_SHIFT 0
#define ATTR2_ID(n) ((n)<<ATTR2_ID_SHIFT)
#define ATTR2_PRIO_MASK 0x0C00
#define ATTR2_PRIO_SHIFT 10
#define ATTR2_PRIO(n) ((n)<<ATTR2_PRIO_SHIFT)
#define ATTR2_PALBANK_MASK 0xF000
#define ATTR2_PALBANK_SHIFT 12
#define ATTR2_PALBANK(n) ((n)<<ATTR2_PALBANK_SHIFT)
#define ATTR2_BUILD(id, pbank, prio) \
( ((id)&0x3FF) | (((pbank)&15)<<12) | (((prio)&3)<<10) )
#endif // __MEMDEF__
|