#ifndef REGS_H
#define REGS_H

#define REG_GROUPS 29 // number of REG groups, i.e. REG, SREG, OREG, etc.
#define REG_PAGES 6
#define REG_PER_PAGE 16
#define REG_PER_GROUP REG_PAGES * REG_PER_PAGE

#define BASE_REG(n, r) gGameInfo->data[n * REG_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_FOG_FAR               REG(13)
#define R_ENV_FOG_NEAR              REG(14)
#define R_ENV_TIME_INCREMENT        REG(15)
#define R_RUN_SPEED_LIMIT           REG(45)
#define R_ENABLE_ARENA_DBG          SREG(0)
#define R_UPDATE_RATE               SREG(30)
#define R_ENABLE_AUDIO_DBG          SREG(36)
#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_MENU_MODE           SREG(94)
#define R_CAM_MAX_PHI               OREG(5)
#define R_CAM_DEFA_PHI_UPDRATE      OREG(7)
#define R_DEFA_CAM_ANIM_TIME        OREG(23)
#define R_CAM_MIN_PHI               OREG(34)
#define R_CAM_MIN_PHI2              OREG(35)
#define R_AT_LERP_MIN               OREG(41)
#define R_AT_LERP_SCALE             OREG(42)
#define R_CAM_YOFFSET_NORM          OREG(46)
#define R_CAM_DATA(type)            PREG(type)
#define R_DBG_CAM_UPDATE            PREG(80)
#define R_DBG_REG_UPDATE            PREG(82)
#define R_RELOAD_CAM_PARAMS         QREG(0)
#define R_C_UP_ICON_X               YREG(88)
#define R_C_UP_ICON_Y               YREG(89)
#define R_MAGIC_FILL_COLOR(i)       ZREG(0 + i)
#define R_C_BTN_COLOR(i)            ZREG(39 + i)
#define R_B_BTN_COLOR(i)            ZREG(43 + i)
#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)
#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_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_BAR_SMALL_Y         XREG(48)
#define R_MAGIC_BAR_X               XREG(49)
#define R_MAGIC_BAR_LARGE_Y         XREG(50)
#define R_MAGIC_FILL_X              XREG(51)
#define R_ENV_LIGHT1_DIR(i)         cREG(3 + i)
#define R_ENV_LIGHT2_DIR(i)         cREG(6 + i)
#define R_B_LABEL_DD                WREG(0)
#define R_OW_MINIMAP_X              WREG(29)
#define R_OW_MINIMAP_Y              WREG(30)
#define R_MINIMAP_DISABLED          WREG(31)
#define R_B_LABEL_X(i)              WREG(40 + i)
#define R_B_LABEL_Y(i)              WREG(43 + i)
#define R_DGN_MINIMAP_X             WREG(68)
#define R_DGN_MINIMAP_Y             WREG(69)
#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_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_DISABLE_INPUT_DISPLAY     HREG(47)
#define R_EN_GOROIWA_SPEED          mREG(12)
#define R_NAVI_MSG_REGION_ALPHA     nREG(87)
#define R_TEXT_DROP_SHADOW_OFFSET   XREG(60)
#define R_TEXTBOX_X_TARGET          XREG(72)
#define R_TEXTBOX_Y_TARGET          XREG(73)
#define R_TEXTBOX_TEXWIDTH          YREG(16)
#define R_TEXTBOX_TEXHEIGHT         YREG(17)
#define R_TEXTBOX_WIDTH             YREG(22)
#define R_TEXTBOX_HEIGHT            YREG(23)
#define R_MESSAGE_DEBUGGER_SELECT   YREG(78)
#define R_MESSAGE_DEBUGGER_TEXTID   YREG(79)
#define R_TEXT_LINE_SPACING         XREG(56)
#define R_TEXT_CHAR_SCALE           XREG(57)
#define R_TEXTBOX_ICON_XPOS         YREG(71)
#define R_TEXTBOX_ICON_YPOS         YREG(72)
#define R_TEXTBOX_ICON_SIZE         YREG(75)
#define R_TEXTBOX_X                 VREG(0)
#define R_TEXTBOX_Y                 VREG(1)
#define R_TEXTBOX_END_XPOS          XREG(64)
#define R_TEXTBOX_END_YPOS          XREG(65)
#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_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_TEXT_CHOICE_XPOS          XREG(66)
#define R_TEXT_CHOICE_YPOS(choice)  XREG(67 + (choice))
#define R_TEXT_INIT_XPOS            XREG(54)
#define R_TEXT_INIT_YPOS            XREG(55)
#define R_TEXTBOX_BG_YPOS           XREG(61)
#define R_TEXTBOX_CLEF_XPOS         VREG(7)
#define R_TEXTBOX_CLEF_YPOS         VREG(8)
#define R_OCARINA_NOTES_XPOS        VREG(28)
#define R_OCARINA_NOTES_YPOS(note)  VREG(45 + (note))
#define R_OCARINA_NOTES_XPOS_OFFSET VREG(29)
#define R_OCARINA_NOTES_YPOS_OFFSET VREG(51)

#endif