213 lines
6.9 KiB
C
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 > 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__
|