geometry-dash-gba/include/memdef.h
2020-08-07 22:40:00 -06:00

213 lines
6.9 KiB
C

//
// 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 &gt; width)
#define ATTR0_TALL 0x8000 //!< Wide shape (height &lt; 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__