summaryrefslogtreecommitdiff
path: root/include/regs.h
blob: 8d67563d29ead51072a474cad7c7e264fca3456c (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
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
#ifndef REGS_H
#define REGS_H

#include "ultra64.h"
#include "versions.h"

struct PlayState;

#define REG_GROUPS 29 // number of REG groups, i.e. REG, SREG, OREG, etc.
#define REG_PAGES 6
#define REGS_PER_PAGE 16
#define REGS_PER_GROUP (REG_PAGES * REGS_PER_PAGE)

#define BASE_REG(n, r) gRegEditor->data[(n) * REGS_PER_GROUP + (r)]

#define  REG(r) BASE_REG(0, (r))
#define SREG(r) BASE_REG(1, (r))
#define OREG(r) BASE_REG(2, (r))
#define PREG(r) BASE_REG(3, (r))
#define QREG(r) BASE_REG(4, (r))
#define MREG(r) BASE_REG(5, (r))
#define YREG(r) BASE_REG(6, (r))
#define DREG(r) BASE_REG(7, (r))
#define UREG(r) BASE_REG(8, (r))
#define IREG(r) BASE_REG(9, (r))
#define ZREG(r) BASE_REG(10, (r))
#define CREG(r) BASE_REG(11, (r))
#define NREG(r) BASE_REG(12, (r))
#define KREG(r) BASE_REG(13, (r))
#define XREG(r) BASE_REG(14, (r))
#define cREG(r) BASE_REG(15, (r))
#define sREG(r) BASE_REG(16, (r))
#define iREG(r) BASE_REG(17, (r))
#define WREG(r) BASE_REG(18, (r))
#define AREG(r) BASE_REG(19, (r))
#define VREG(r) BASE_REG(20, (r))
#define HREG(r) BASE_REG(21, (r))
#define GREG(r) BASE_REG(22, (r))
#define mREG(r) BASE_REG(23, (r))
#define nREG(r) BASE_REG(24, (r))
#define BREG(r) BASE_REG(25, (r))
#define dREG(r) BASE_REG(26, (r))
#define kREG(r) BASE_REG(27, (r))
#define bREG(r) BASE_REG(28, (r))

#define R_ENV_AMBIENT_COLOR(i)                   REG(0 + (i))
#define R_ENV_LIGHT1_COLOR(i)                    REG(3 + (i))
#define R_ENV_LIGHT2_COLOR(i)                    REG(6 + (i))
#define R_ENV_DISABLE_DBG                        REG(9)
#define R_ENV_FOG_COLOR(i)                       REG(10 + (i))
#define R_ENV_Z_FAR                              REG(13)
#define R_ENV_FOG_NEAR                           REG(14)
#define R_ENV_TIME_SPEED_OLD                     REG(15) // Most likely used during development. Unused in the final game.
#define R_DECELERATE_RATE                        REG(43)
#define R_RUN_SPEED_LIMIT                        REG(45)
#define R_ENABLE_ARENA_DBG                       SREG(0)
#define R_AUDIOMGR_ACTIVITY_LEVEL                SREG(20)
#define R_ROOM_IMAGE_NODRAW_FLAGS                SREG(25)
#define R_ROOM_BG2D_FORCE_SCALEBG                SREG(26)
#define R_UPDATE_RATE                            SREG(30)
#define R_GRAPH_TASKSET00_FLAGS                  SREG(33)
#define R_ENABLE_AUDIO_DBG                       SREG(36)
#define R_VI_MODE_EDIT_STATE                     SREG(48)
#define R_VI_MODE_EDIT_WIDTH                     SREG(49)
#define R_VI_MODE_EDIT_HEIGHT                    SREG(50)
#define R_VI_MODE_EDIT_ULY_ADJ                   SREG(51)
#define R_VI_MODE_EDIT_LRY_ADJ                   SREG(52)
#define R_VI_MODE_EDIT_ULX_ADJ                   SREG(53)
#define R_VI_MODE_EDIT_LRX_ADJ                   SREG(54)
#define R_FB_FILTER_TYPE                         SREG(80)
#define R_FB_FILTER_PRIM_COLOR(c)                SREG(81 + (c))
#define R_FB_FILTER_A                            SREG(84)
#define R_FB_FILTER_ENV_COLOR(c)                 SREG(85 + (c))
#define R_ENABLE_FB_FILTER                       SREG(88)
#define R_PAUSE_BG_PRERENDER_STATE               SREG(94) // `PauseBgPreRenderState`
#define R_CAM_XZ_OFFSET_UPDATE_RATE              OREG(2)
#define R_CAM_Y_OFFSET_UPDATE_RATE               OREG(3)
#define R_CAM_FOV_UPDATE_RATE                    OREG(4)
#define R_CAM_MAX_PITCH                          OREG(5)
#define R_CAM_R_UPDATE_RATE_INV                  OREG(6)
#define R_CAM_PITCH_UPDATE_RATE_INV              OREG(7)
#define R_CAM_SLOPE_Y_ADJ_AMOUNT                 OREG(9)
#define R_CAM_PITCH_FLOOR_CHECK_NEAR_DIST_FAC    OREG(17)
#define R_CAM_PITCH_FLOOR_CHECK_FAR_DIST_FAC     OREG(18)
#define R_CAM_PITCH_FLOOR_CHECK_OFFSET_Y_FAC     OREG(19)
#define R_CAM_PITCH_FLOOR_CHECK_NEAR_WEIGHT      OREG(20)
#define R_CAM_DEFAULT_ANIM_TIME                  OREG(23)
#define R_CAM_UPDATE_RATE_STEP_SCALE_XZ          OREG(25) // also used as a step scale for other data
#define R_CAM_UPDATE_RATE_STEP_SCALE_Y           OREG(26) // also used as a step scale for other data
#define R_CAM_JUMP1_EYE_Y_STEP_SCALE             OREG(31)
#define R_CAM_MIN_PITCH_1                        OREG(34)
#define R_CAM_MIN_PITCH_2                        OREG(35)
#define R_CAM_BATTLE1_ROLL_TARGET_BASE           OREG(36)
#define R_CAM_BATTLE1_ROLL_STEP_SCALE            OREG(37)
#define R_CAM_BATTLE1_XYZ_OFFSET_UPDATE_RATE_TARGET OREG(40)
#define R_CAM_AT_LERP_STEP_SCALE_MIN             OREG(41)
#define R_CAM_AT_LERP_STEP_SCALE_FAC             OREG(42)
#define R_CAM_YOFFSET_NORM                       OREG(46)
#define R_CAM_DATA(type)                         PREG(0 + (type))
#define R_CAM_PARALLEL_LOCKON_CALC_SLOPE_Y_ADJ   PREG(76)
#define R_DEBUG_CAM_UPDATE                       PREG(80)
#define R_DBG_REG_UPDATE                         PREG(82)
#define R_RELOAD_CAM_PARAMS                      QREG(0)
#define R_SCENE_CAM_TYPE                         YREG(15)
#define R_TEXTBOX_TEXWIDTH                       YREG(16)
#define R_TEXTBOX_TEXHEIGHT                      YREG(17)
#define R_TEXTBOX_WIDTH                          YREG(22)
#define R_TEXTBOX_HEIGHT                         YREG(23)
#if OOT_NTSC
#define R_PAUSE_INFO_PANEL_ICON_C_ITEM_X(i)      YREG(48 + (i))
#define R_PAUSE_INFO_PANEL_TEXT_X(i)             YREG(50 + (i))
#define R_PAUSE_INFO_PANEL_ICON_PLAY_SONG_X(i)   YREG(52 + (i))
#define R_PAUSE_INFO_PANEL_TEXT_C_ITEM_X(i)      YREG(54 + (i))
#define R_PAUSE_INFO_PANEL_ICON_SAVE_PROMPT_X(i) YREG(56 + (i))
#define R_PAUSE_INFO_PANEL_ICON_EQUIP_X(i)       YREG(58 + (i))
#endif
#define R_TEXTBOX_ICON_XPOS                      YREG(71)
#define R_TEXTBOX_ICON_YPOS                      YREG(72)
#define R_TEXTBOX_ICON_DIMENSION                 YREG(75)
#define R_MESSAGE_DEBUGGER_SELECT                YREG(78)
#define R_MESSAGE_DEBUGGER_TEXTID                YREG(79)
#define R_C_UP_ICON_X                            YREG(88)
#define R_C_UP_ICON_Y                            YREG(89)
#define R_EXITED_SCENE_RIDING_HORSE              AREG(6) // Used to spawn the player on top of Epona in the next scene
#define R_DEBUG_FORCE_EPONA_OBTAINED             DREG(1) // If set, overrides EVENTCHKINF_EPONA_OBTAINED state giving Epona
#define R_EPONAS_SONG_PLAYED                     DREG(53)
#define R_MAGIC_FILL_COLOR(i)                    ZREG(0 + (i))
#define R_PAUSE_PAGE_SWITCH_FRAME_ADVANCE_ON     ZREG(13)
#define R_PAUSE_BUTTON_L_R_SELECTED_PRIM_TIMER   ZREG(28)
#define R_C_BTN_COLOR(i)                         ZREG(39 + (i))
#define R_B_BTN_COLOR(i)                         ZREG(43 + (i))
#if OOT_NTSC
#define R_START_LABEL_SCALE                      ZREG(48)
#define R_START_LABEL_DD(i)                      ZREG(49 + (i))
#define R_START_LABEL_WIDTH                      ZREG(51)
#define R_START_LABEL_HEIGHT                     ZREG(52)
#define R_START_LABEL_Y(i)                       ZREG(53 + (i))
#define R_START_LABEL_X(i)                       ZREG(55 + (i))
#else
#define R_START_LABEL_DD(i)                      ZREG(48 + (i))
#define R_START_LABEL_Y(i)                       ZREG(51 + (i))
#define R_START_LABEL_X(i)                       ZREG(54 + (i))
#endif
#define R_PAUSE_QUEST_MEDALLION_SHINE_TIME(i)    ZREG(61 + (i)) // i = 0..3 (clashes with ZREG(62) and ZREG(63))
#define R_C_UP_BTN_X                             ZREG(62)
#define R_C_UP_BTN_Y                             ZREG(63)
#define R_START_BTN_X                            ZREG(68)
#define R_START_BTN_Y                            ZREG(69)
#define R_ITEM_BTN_X(i)                          ZREG(70 + (i))
#define R_ITEM_BTN_Y(i)                          ZREG(74 + (i))
#define R_ITEM_BTN_DD(i)                         ZREG(78 + (i))
#define R_ITEM_ICON_X(i)                         ZREG(82 + (i))
#define R_ITEM_ICON_Y(i)                         ZREG(86 + (i))
#define R_ITEM_ICON_DD(i)                        ZREG(90 + (i))
#define R_TRANS_DBG_ENABLED                      CREG(11)
#define R_TRANS_DBG_TYPE                         CREG(12)
#define R_ENV_WIND_DIR(i)                        CREG(16 + (i))
#define R_ENV_WIND_SPEED                         CREG(19)
#define R_PAUSE_STICK_REPEAT_DELAY               XREG(6)
#define R_PAUSE_STICK_REPEAT_DELAY_FIRST         XREG(8)
#define R_A_BTN_Y                                XREG(16)
#define R_A_BTN_X                                XREG(17)
#define R_A_ICON_Y                               XREG(19)
#define R_A_ICON_X                               XREG(20)
#define R_A_BTN_COLOR(i)                         XREG(22 + (i))
#define R_MAGIC_METER_Y_HIGHER                   XREG(48)
#define R_MAGIC_METER_X                          XREG(49)
#define R_MAGIC_METER_Y_LOWER                    XREG(50)
#define R_MAGIC_FILL_X                           XREG(51)
#define R_TEXT_INIT_XPOS                         XREG(54)
#define R_TEXT_INIT_YPOS                         XREG(55)
#define R_TEXT_LINE_SPACING                      XREG(56)
#define R_TEXT_CHAR_SCALE                        XREG(57)
#define R_TEXT_DROP_SHADOW_OFFSET                XREG(60)
#define R_TEXTBOX_BG_YPOS                        XREG(61)
#define R_TEXTBOX_END_XPOS                       XREG(64)
#define R_TEXTBOX_END_YPOS                       XREG(65)
#define R_TEXT_CHOICE_XPOS                       XREG(66)
#define R_TEXT_CHOICE_YPOS(choice)               XREG(67 + (choice))
#define R_TEXTBOX_X_TARGET                       XREG(72)
#define R_TEXTBOX_Y_TARGET                       XREG(73)
#define R_TEXTBOX_WIDTH_TARGET                   XREG(74)
#define R_TEXTBOX_HEIGHT_TARGET                  XREG(75)
#define R_TEXTBOX_TEXWIDTH_TARGET                XREG(76)
#define R_TEXTBOX_TEXHEIGHT_TARGET               XREG(77)
#define R_ENV_LIGHT1_DIR(i)                      cREG(3 + (i))
#define R_ENV_LIGHT2_DIR(i)                      cREG(6 + (i))
#define R_TRANS_FADE_FLASH_ALPHA_STEP            iREG(50) // Set to a negative number to start the flash
#define R_ROOM_CULL_DEBUG_MODE                   iREG(86)
#define R_ROOM_CULL_NUM_ENTRIES                  iREG(87)
#define R_ROOM_CULL_USED_ENTRIES                 iREG(88)
#define R_ROOM_CULL_DEBUG_TARGET                 iREG(89)
#define R_B_LABEL_DD                             WREG(0)
#define R_PAUSE_PAGES_Y_ORIGIN_2                 WREG(2) // Complements PauseContext.pagesYOrigin1
#define R_PAUSE_DEPTH_OFFSET                     WREG(3) // Offset position of all pages away from the camera
#define R_PAUSE_UI_ANIMS_DURATION                WREG(6)
#if OOT_NTSC
#define R_B_LABEL_SCALE(i)                       WREG(8 + (i))
#define R_B_LABEL_X(i)                           WREG(10 + (i))
#define R_B_LABEL_Y(i)                           WREG(12 + (i))
#define R_A_LABEL_Z(i)                           WREG(14 + (i))
#endif
#define R_PAUSE_BUTTON_LEFT_X                    WREG(16)
#define R_PAUSE_BUTTON_RIGHT_X                   WREG(17)
#define R_PAUSE_BUTTON_LEFT_RIGHT_Y              WREG(18)
#define R_PAUSE_BUTTON_LEFT_MOVE_OFFSET_X        WREG(25)
#define R_PAUSE_BUTTON_RIGHT_MOVE_OFFSET_X       WREG(26)
#define R_OW_MINIMAP_X                           WREG(29)
#define R_OW_MINIMAP_Y                           WREG(30)
#define R_MINIMAP_DISABLED                       WREG(31)
#if OOT_PAL
#define R_B_LABEL_SCALE(i)                       WREG(37 + (i))
#define R_B_LABEL_X(i)                           WREG(40 + (i))
#define R_B_LABEL_Y(i)                           WREG(43 + (i))
#define R_A_LABEL_Z(i)                           WREG(46 + (i))
#define R_PAUSE_INFO_PANEL_ICON_C_ITEM_X(i)      WREG(49 + (i))
#define R_PAUSE_INFO_PANEL_TEXT_X(i)             WREG(52 + (i))
#define R_PAUSE_INFO_PANEL_ICON_PLAY_SONG_X(i)   WREG(55 + (i))
#define R_PAUSE_INFO_PANEL_TEXT_C_ITEM_X(i)      WREG(58 + (i))
#define R_PAUSE_INFO_PANEL_ICON_SAVE_PROMPT_X(i) WREG(61 + (i))
#define R_PAUSE_INFO_PANEL_ICON_EQUIP_X(i)       WREG(64 + (i))
#endif
#define R_DGN_MINIMAP_X                          WREG(68)
#define R_DGN_MINIMAP_Y                          WREG(69)
#define R_TEXTBOX_X                              VREG(0)
#define R_TEXTBOX_Y                              VREG(1)
#define R_TEXTBOX_CLEF_XPOS                      VREG(7)
#define R_TEXTBOX_CLEF_YPOS                      VREG(8)
#define R_MAP_INDEX                              VREG(11)
#define R_MAP_TEX_INDEX_BASE                     VREG(12)
#define R_MAP_TEX_INDEX                          VREG(13)
#define R_COMPASS_SCALE_X                        VREG(14)
#define R_COMPASS_SCALE_Y                        VREG(15)
#define R_COMPASS_OFFSET_X                       VREG(16)
#define R_COMPASS_OFFSET_Y                       VREG(17)
#define R_MINIMAP_COLOR(i)                       VREG(18 + (i))
#define R_PAUSE_SONG_OCA_BTN_Y(ocarinaBtnIndex)  VREG(21 + (ocarinaBtnIndex)) // VREG(21) to VREG(25)
#define R_OCARINA_BUTTONS_XPOS                   VREG(28)
#define R_OCARINA_BUTTONS_XPOS_OFFSET            VREG(29)
#define R_TEXT_ADJUST_COLOR_1_R                  VREG(33)
#define R_TEXT_ADJUST_COLOR_1_G                  VREG(34)
#define R_TEXT_ADJUST_COLOR_1_B                  VREG(35)
#define R_TEXT_ADJUST_COLOR_2_R                  VREG(36)
#define R_TEXT_ADJUST_COLOR_2_G                  VREG(37)
#define R_TEXT_ADJUST_COLOR_2_B                  VREG(38)
#define R_OCARINA_BUTTONS_YPOS(note)             VREG(45 + (note))
#define R_OCARINA_BUTTONS_APPEAR_ALPHA_STEP      VREG(50)
#define R_OCARINA_BUTTONS_YPOS_OFFSET            VREG(51)
#define R_KALEIDO_PROMPT_CURSOR_ALPHA_TIMER_BASE VREG(60)
#define R_KALEIDO_PROMPT_CURSOR_ALPHA            VREG(61)
#define R_KALEIDO_PROMPT_CURSOR_ALPHA_STATE      VREG(62)
#define R_KALEIDO_PROMPT_CURSOR_ALPHA_TIMER      VREG(63)
#define R_ITEM_AMMO_X(i)                         VREG(64 + (i))
#define R_ITEM_AMMO_Y(i)                         VREG(68 + (i))
#define R_ITEM_ICON_WIDTH(i)                     VREG(76 + (i))
#define R_ITEM_BTN_WIDTH(i)                      VREG(80 + (i))
#define R_GAME_OVER_RUMBLE_STRENGTH              VREG(90)
#define R_GAME_OVER_RUMBLE_DURATION              VREG(91)
#define R_GAME_OVER_RUMBLE_DECREASE_RATE         VREG(92)
#define R_ENABLE_ACTOR_DEBUG_PRINTF              HREG(20)
#define R_DISABLE_INPUT_DISPLAY                  HREG(47)
#define R_ENABLE_PLAY_LOGS                       HREG(63)
#define R_EN_GOROIWA_SPEED                       mREG(12)
#define R_NAVI_MSG_REGION_ALPHA                  nREG(87)
#define R_USE_DEBUG_CUTSCENE                     dREG(95)


#define R_HREG_MODE  HREG(80) // see `HRegMode` for mode options

typedef enum HRegMode {
    /*  6 */ HREG_MODE_PRINT_HILITE_INFO = 6, // print hilite information
    /*  7 */ HREG_MODE_UCODE_DISAS, // various controls for the ucode disas system
    /*  8 */ HREG_MODE_PRINT_MEMORY, // print memory at a specified address
    /*  9 */ HREG_MODE_UNUSED_9,
    /* 10 */ HREG_MODE_PLAY, // various debug controls for the Play state
    /* 11 */ HREG_MODE_PERSPECTIVE, // set various properties of the view perspective
    /* 12 */ HREG_MODE_INPUT_TEST, // displays inputs from the specified controller
    /* 13 */ HREG_MODE_SCHED, // toggle various vi special features
    /* 14 */ HREG_MODE_UNUSED_14,
    /* 15 */ HREG_MODE_PRERENDER,
    /* 16 */ HREG_MODE_SETUP_FRAME, // set the base screen color (and by extension, shrink window color too)
    /* 17 */ HREG_MODE_SCENE_CONFIG, // toggle drawing the scene config
    /* 18 */ HREG_MODE_PRINT_OBJECT_TABLE,
    /* 19 */ HREG_MODE_LETTERBOX, // toggle logging and view values for the letterbox system
    /* 20 */ HREG_MODE_HEAP_FREE_BLOCK_TEST, // enable or disable heap free block test
    /* 21 */ HREG_MODE_VI
} HRegMode;

// HREG_MODE_PRINT_HILITE_INFO
// This mode has no controls with other regs. Simply set HREG mode to `HREG_MODE_PRINT_HILITE_INFO`
// to print out the eye, object, and light direction vectors for hilite on every frame.

// HREG_MODE_UCODE_DISAS
#define R_UCODE_DISAS_TOGGLE      HREG(81) // < 0 enables and prints some hardware reg info for 1 frame, > 0 enables constant disas
#define R_UCODE_DISAS_LOG_MODE    HREG(82) // 1 and 2 print counts, 3 enables fault client, 4 disables open/close disps
#define R_UCODE_DISAS_LOG_LEVEL   HREG(83) // enables various logging within the dissassembler itself
#define R_UCODE_DISAS_TOTAL_COUNT HREG(84) // read-only
#define R_UCODE_DISAS_VTX_COUNT   HREG(85) // read-only
#define R_UCODE_DISAS_SPVTX_COUNT HREG(86) // read-only
#define R_UCODE_DISAS_TRI1_COUNT  HREG(87) // read-only
#define R_UCODE_DISAS_TRI2_COUNT  HREG(88) // read-only
#define R_UCODE_DISAS_QUAD_COUNT  HREG(89) // read-only
#define R_UCODE_DISAS_LINE_COUNT  HREG(90) // read-only
#define R_UCODE_DISAS_SYNC_ERROR_COUNT  HREG(91) // read-only
#define R_UCODE_DISAS_LOAD_COUNT  HREG(92) // read-only
#define R_UCODE_DISAS_DL_COUNT    HREG(93) // read-only

// HREG_MODE_PRINT_MEMORY
#define R_PRINT_MEMORY_INIT     HREG(94) // set to `HREG_MODE_PRINT_MEMORY` when init is complete
#define R_PRINT_MEMORY_TRIGGER  HREG(81) // set to a negative number to print memory
#define R_PRINT_MEMORY_ADDR     HREG(82) // middle 16 bits of the address to print from (80XXXX00)
#define R_PRINT_MEMORY_SIZE     HREG(83) // value * 0x10 = length of the log

// HREG_MODE_PLAY
#define R_PLAY_INIT                   HREG(94) // set to `HREG_MODE_PLAY` when init is complete
#define R_PLAY_RUN_UPDATE             HREG(81)
#define R_PLAY_RUN_DRAW               HREG(82)
#define R_PLAY_DRAW_SKYBOX            HREG(83)
#define R_PLAY_DRAW_ROOM_FLAGS        HREG(84) // also enables drawing the scene config and room bg cover
#define R_PLAY_DRAW_ACTORS            HREG(85)
#define R_PLAY_DRAW_LENS_FLARES       HREG(86)
#define R_PLAY_DRAW_SCREEN_FILLS      HREG(87)
#define R_PLAY_DRAW_SANDSTORM         HREG(88)
#define R_PLAY_DRAW_OVERLAY_ELEMENTS  HREG(89)
#define R_PLAY_DRAW_ENV_FLAGS         HREG(90) // see flags below
#define R_PLAY_DRAW_COVER_ELEMENTS    HREG(92) // draw transition instance and vismono
#define R_PLAY_DRAW_DEBUG_OBJECTS     HREG(93)

#define PLAY_ENV_DRAW_SKYBOX_FILTERS (1 << 0)
#define PLAY_ENV_DRAW_SUN_AND_MOON (1 << 1)
#define PLAY_ENV_DRAW_LIGHTNING (1 << 2)
#define PLAY_ENV_DRAW_LIGHTS (1 << 3)

#define R_PLAY_ENABLE_UCODE_DISAS    HREG(93) // set to 2 to switch to ucode disas mode and trigger it
#define R_PLAY_UCODE_DISAS_LOG_LEVEL HREG(92) // log level to use when switching to ucode disas

// HREG_MODE_PERSPECTIVE
#define R_PERSPECTIVE_INIT    HREG(94) // set to `HREG_MODE_PERSPECTIVE` when init is complete
#define R_PERSPECTIVE_FOVY    HREG(83) // value to use for `fovy`
#define R_PERSPECTIVE_ASPECT  HREG(84) // value to use for `aspect`, divided by 10000
#define R_PERSPECTIVE_NEAR    HREG(85) // value to use for `near`
#define R_PERSPECTIVE_FAR     HREG(86) // value to use for `far`
#define R_PERSPECTIVE_SCALE   HREG(87) // value to use for `scale`, divided by 100

// HREG_MODE_INPUT_TEST
#define R_INPUT_TEST_CONTROLLER_PORT      HREG(81) // controller to copy values from
#define R_INPUT_TEST_COMPARE_VALUE        HREG(82) // input value compared against for various tests
#define R_INPUT_TEST_BUTTON_CUR           HREG(83) // buttons held on the test controller
#define R_INPUT_TEST_BUTTON_PRESS         HREG(84) // buttons pressed on the test controller
#define R_INPUT_TEST_REL_STICK_X          HREG(85) // current stick value on the x axis (ignoring the deadzone)
#define R_INPUT_TEST_REL_STICK_Y          HREG(86) // current stick value on the y axis (ignoring the deadzone)
#define R_INPUT_TEST_REL_STICK_X_2        HREG(87) // same as R_INPUT_TEST_REL_STICK_X
#define R_INPUT_TEST_REL_STICK_Y_2        HREG(88) // same as R_INPUT_TEST_REL_STICK_Y
#define R_INPUT_TEST_CUR_STICK_X          HREG(89) // current stick value on the x axis
#define R_INPUT_TEST_CUR_STICK_Y          HREG(90) // current stick value on the y axis
#define R_INPUT_TEST_COMPARE_BUTTON_CUR   HREG(93) // set to 1 if cur.button exactly matches R_INPUT_TEST_COMPARE_VALUE
#define R_INPUT_TEST_COMPARE_COMBO_CUR    HREG(94) // set to 1 if cur.button contains R_INPUT_TEST_COMPARE_VALUE
#define R_INPUT_TEST_COMPARE_COMBO_PRESS  HREG(95) // set to 1 if press.button contains R_INPUT_TEST_COMPARE_VALUE

// HREG_MODE_SCHED
#define R_SCHED_INIT                     HREG(95) // set to `HREG_MODE_SCHED` when init is complete
#define R_SCHED_TOGGLE_SPECIAL_FEATURES  HREG(81) // set to 2 to allow special features to be applied
#define R_SCHED_GAMMA_ON                 HREG(82) // set OS_VI_GAMMA_ON
#define R_SCHED_DITHER_FILTER_ON         HREG(83) // set OS_VI_DITHER_FILTER_ON
#define R_SCHED_GAMMA_DITHER_ON          HREG(84) // set OS_VI_GAMMA_DITHER_ON
#define R_SCHED_DIVOT_ON                 HREG(85) // set OS_VI_DIVOT_ON

// HREG_MODE_PRERENDER
#define R_PRERENDER_DIVOT_CONTROL HREG(81)

#define PRERENDER_DIVOT_ALTERNATE_COLOR 1
#define PRERENDER_DIVOT_PRINT_COLOR 3
#define PRERENDER_DIVOT_PARTIAL_CVG_RED 5

// HREG_MODE_SETUP_FRAME
#define R_SETUP_FRAME_INIT            HREG(95) // set to `HREG_MODE_SETUP_FRAME` when init is complete
#define R_SETUP_FRAME_GET             HREG(81) // get the current values and store them in appropriate regs
#define R_SETUP_FRAME_SET             HREG(82) // use the value from regs as the current value
#define R_SETUP_FRAME_LETTERBOX_SIZE  HREG(83)
#define R_SETUP_FRAME_BASE_COLOR_R    HREG(84)
#define R_SETUP_FRAME_BASE_COLOR_G    HREG(85)
#define R_SETUP_FRAME_BASE_COLOR_B    HREG(86)

#define SETUP_FRAME_LETTERBOX_SIZE_FLAG (1 << 0) // used with R_SETUP_FRAME_GET and R_SETUP_FRAME_SET
#define SETUP_FRAME_BASE_COLOR_FLAG (1 << 1)     // used with R_SETUP_FRAME_GET and R_SETUP_FRAME_SET

// HREG_MODE_SCENE_CONFIG
#define R_SCENE_CONFIG_INIT                HREG(95) // set to `HREG_MODE_SCENE_CONFIG` when init is complete
#define R_SCENE_CONFIG_DRAW_DEFAULT_DLIST  HREG(81) // set to 1 to draw the default display list
#define R_SCENE_CONFIG_DRAW_SCENE_CONFIG   HREG(82) // set to 1 to draw the scene config

// HREG_MODE_PRINT_OBJECT_TABLE
#define R_PRINT_OBJECT_TABLE_TRIGGER  HREG(81) // set to a negative number to print out the whole object table

// HREG_MODE_LETTERBOX
#define R_LETTERBOX_INIT         HREG(94) // set to `HREG_MODE_LETTERBOX` when init is complete
#define R_LETTERBOX_ENABLE_LOGS  HREG(81) // set to 1 to enable logging
#define R_LETTERBOX_STATE        HREG(83) // read-only
#define R_LETTERBOX_SIZE         HREG(84) // read-only
#define R_LETTERBOX_TARGET_SIZE  HREG(85) // read-only
#define R_LETTERBOX_STEP         HREG(86) // read-only

// HREG_MODE_HEAP_FREE_BLOCK_TEST
#define R_HEAP_FREE_BLOCK_TEST_TOGGLE  HREG(82) // 0 = disabled, 1 = enabled

// HREG_MODE_VI
#define R_VI_INIT                  HREG(95) // set to `HREG_MODE_VI` when init is complete
#define R_VI_NEXT_Y_SCALE_MODE     HREG(81) // set to 0 to scale yScale with additional scan lines, else use 1.0
#define R_VI_NEXT_ADDI_SCAN_LINES  HREG(82)
#define R_VI_CUR_ADDI_SCAN_LINES   HREG(83)
#define R_VI_CUR_Y_SCALE_MODE      HREG(84)

typedef struct RegEditor {
    /* 0x00 */ s32  regPage; // 0: no page selected (reg editor is not active); 1: first page; `REG_PAGES`: last page
    /* 0x04 */ s32  regGroup; // Indexed from 0 to `REG_GROUPS`-1. Each group has its own character to identify it.
    /* 0x08 */ s32  regCur; // Selected reg, indexed from 0 as the page start
    /* 0x0C */ s32  dPadInputPrev;
    /* 0x10 */ s32  inputRepeatTimer;
    /* 0x14 */ s16  data[REG_GROUPS * REGS_PER_GROUP]; // Accessed through *REG macros, see regs.h
} RegEditor; // size = 0x15D4

void Regs_InitData(struct PlayState* play);

extern RegEditor* gRegEditor;

#endif