diff options
author | Simponic <loganthebean222@gmail.com> | 2020-08-07 22:40:00 -0600 |
---|---|---|
committer | Simponic <loganthebean222@gmail.com> | 2020-08-07 22:40:00 -0600 |
commit | 6a44a34e0ebb867753df26f1cb0a38f53420a606 (patch) | |
tree | 42eef181966046e4e3108b149738e70479e48c35 /include/memdef.h | |
download | geometry-dash-gba-6a44a34e0ebb867753df26f1cb0a38f53420a606.tar.gz geometry-dash-gba-6a44a34e0ebb867753df26f1cb0a38f53420a606.zip |
Added files
Diffstat (limited to 'include/memdef.h')
-rw-r--r-- | include/memdef.h | 212 |
1 files changed, 212 insertions, 0 deletions
diff --git a/include/memdef.h b/include/memdef.h new file mode 100644 index 0000000..8fe432f --- /dev/null +++ b/include/memdef.h @@ -0,0 +1,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__ |