/*--------------------------------------------------------------------------------- Header file for libgba video definitions Copyright 2003-2006 by Dave Murphy. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. Please report all bugs and problems through the bug tracker at "http://sourceforge.net/tracker/?group_id=114505&atid=668551". ---------------------------------------------------------------------------------*/ /*! \file gba_video.h \brief gba video definitions. */ //--------------------------------------------------------------------------------- #ifndef _gba_video_h_ #define _gba_video_h_ //--------------------------------------------------------------------------------- #include "gba_base.h" /*! \def BG_COLORS */ #define BG_COLORS ((u16 *)0x05000000) // Background color table #define BG_PALETTE ((u16 *)0x05000000) // Background color table /*! \def OBJ_COLORS */ #define OBJ_COLORS ((u16 *)0x05000200) // Sprite color table #define SPRITE_PALETTE ((u16 *)0x05000200) // Sprite color table /*! \def REG_DISPCNT \brief LCD control register This register controls all aspects of the GBA display. */ #define REG_DISPCNT *((vu16 *)(REG_BASE + 0x00)) //! LCDC bits. /*! These bits are used in conjuction with REG_DISPCNT to control the GBA display hardware. */ //--------------------------------------------------------------------------------- typedef enum LCDC_BITS { //--------------------------------------------------------------------------------- MODE_0 = 0, /*!< BG Mode 0 */ MODE_1 = 1, /*!< BG Mode 1 */ MODE_2 = 2, /*!< BG Mode 2 */ MODE_3 = 3, /*!< BG Mode 3 */ MODE_4 = 4, /*!< BG Mode 4 */ MODE_5 = 5, /*!< BG Mode 5 */ BACKBUFFER = BIT(4), /*!< buffer display select */ OBJ_1D_MAP = BIT(6), /*!< sprite 1 dimensional mapping */ LCDC_OFF = BIT(7), /*!< LCDC OFF */ BG0_ON = BIT(8), /*!< enable background 0 */ BG1_ON = BIT(9), /*!< enable background 1 */ BG2_ON = BIT(10), /*!< enable background 2 */ BG3_ON = BIT(11), /*!< enable background 3 */ OBJ_ON = BIT(12), /*!< enable sprites */ WIN0_ON = BIT(13), /*!< enable window 0 */ WIN1_ON = BIT(14), /*!< enable window 1 */ OBJ_WIN_ON = BIT(15), /*!< enable obj window */ BG0_ENABLE = BG0_ON, /*!< enable background 0 */ BG1_ENABLE = BG1_ON, /*!< enable background 1 */ BG2_ENABLE = BG2_ON, /*!< enable background 2 */ BG3_ENABLE = BG3_ON, /*!< enable background 3 */ OBJ_ENABLE = OBJ_ON, /*!< enable sprites */ WIN0_ENABLE = WIN0_ON, /*!< enable window 0 */ WIN1_ENABLE = WIN1_ON, /*!< enable window 1 */ OBJ_WIN_ENABLE = BG0_ON, /*!< enable obj window */ BG_ALL_ON = BG0_ON | BG1_ON | BG2_ON | BG3_ON, /*!< All Backgrounds on. */ BG_ALL_ENABLE = BG0_ON | BG1_ON | BG2_ON | BG3_ON /*!< All Backgrounds enabled. */ } LCDC_BITS; /*! \def REG_DISPSTAT \brief General LCD Status. This register controls the LCD interrupts. */ #define REG_DISPSTAT *((vu16 *)(REG_BASE + 0x04)) //--------------------------------------------------------------------------------- // LCDC Interrupt bits //--------------------------------------------------------------------------------- enum LCDC_IRQ { LCDC_VBL_FLAG = (1<<0), LCDC_HBL_FLAG = (1<<1), LCDC_VCNT_FLAG = (1<<2), LCDC_VBL = (1<<3), LCDC_HBL = (1<<4), LCDC_VCNT = (1<<5) }; static inline u32 VCOUNT( int m) { return m<<8; } /*! \def REG_VCOUNT \brief */ #define REG_VCOUNT *((vu16 *)(REG_BASE + 0x06)) /*! \def BGCTRL \brief Array definition for background control registers. BGCTRL[0] references background 0 control register.
BGCTRL[1] references background 1 control register.
BGCTRL[2] references background 2 control register.
BGCTRL[3] references background 3 control register.
*/ #define BGCTRL ((vu16 *)(REG_BASE + 0x08)) /*! \def REG_BG0CNT \brief Background 0 control register. */ #define REG_BG0CNT *((vu16 *)(REG_BASE + 0x08)) /*! \def REG_BG1CNT \brief Background 1 control register. */ #define REG_BG1CNT *((vu16 *)(REG_BASE + 0x0a)) /*! \def REG_BG2CNT \brief Background 2 control register. */ #define REG_BG2CNT *((vu16 *)(REG_BASE + 0x0c)) /*! \def REG_BG3CNT \brief Background 3 control register. */ #define REG_BG3CNT *((vu16 *)(REG_BASE + 0x0e)) typedef struct { vu16 x; vu16 y; } bg_scroll; #define BG_OFFSET ((bg_scroll *)(REG_BASE + 0x10)) #define REG_BG0HOFS *((u16 *)(REG_BASE + 0x10)) // BG 0 H Offset #define REG_BG0VOFS *((u16 *)(REG_BASE + 0x12)) // BG 0 V Offset #define REG_BG1HOFS *((u16 *)(REG_BASE + 0x14)) // BG 1 H Offset #define REG_BG1VOFS *((u16 *)(REG_BASE + 0x16)) // BG 1 V Offset #define REG_BG2HOFS *((u16 *)(REG_BASE + 0x18)) // BG 2 H Offset #define REG_BG2VOFS *((u16 *)(REG_BASE + 0x1a)) // BG 2 V Offset #define REG_BG3HOFS *((u16 *)(REG_BASE + 0x1c)) // BG 3 H Offset #define REG_BG3VOFS *((u16 *)(REG_BASE + 0x1e)) // BG 3 V Offset #define REG_BG2PA *((s16 *)(REG_BASE + 0x20)) #define REG_BG2PB *((s16 *)(REG_BASE + 0x22)) #define REG_BG2PC *((s16 *)(REG_BASE + 0x24)) #define REG_BG2PD *((s16 *)(REG_BASE + 0x26)) #define REG_BG2X *((s32 *)(REG_BASE + 0x28)) #define REG_BG2Y *((s32 *)(REG_BASE + 0x2c)) #define REG_BG3PA *((s16 *)(REG_BASE + 0x30)) #define REG_BG3PB *((s16 *)(REG_BASE + 0x32)) #define REG_BG3PC *((s16 *)(REG_BASE + 0x34)) #define REG_BG3PD *((s16 *)(REG_BASE + 0x36)) #define REG_BG3X *((s32 *)(REG_BASE + 0x38)) #define REG_BG3Y *((s32 *)(REG_BASE + 0x3c)) #define BG_SIZE(m) ((m<<14)) /*! \enum BG_CTRL_BITS \brief bit values for background control */ enum BG_CTRL_BITS { BG_MOSAIC = BIT(6), /*!< enable background mosaic */ BG_16_COLOR = (0<<7), /*!< background uses 16 color tiles */ BG_256_COLOR = BIT(7), /*!< background uses 256 color tiles */ BG_WRAP = BIT(13), /*!< background wraps when scrolling */ BG_SIZE_0 = BG_SIZE(0), /*!< Map Size 256x256 */ BG_SIZE_1 = BG_SIZE(1), /*!< Map Size 512x256 */ BG_SIZE_2 = BG_SIZE(2), /*!< Map Size 256x512 */ BG_SIZE_3 = BG_SIZE(3), /*!< Map Size 512x512 */ }; #define CHAR_BASE(m) ((m) << 2) #define BG_TILE_BASE(m) ((m) << 2) #define CHAR_BASE_ADR(m) ((void *)(VRAM + ((m) << 14))) #define CHAR_BASE_BLOCK(m) ((void *)(VRAM + ((m) << 14))) #define MAP_BASE_ADR(m) ((void *)(VRAM + ((m) << 11))) #define SCREEN_BASE_BLOCK(m)((void *)(VRAM + ((m) << 11))) #define SCREEN_BASE(m) ((m) << 8) #define BG_MAP_BASE(m) ((m) << 8) //alternate names for char and screen base #define TILE_BASE(m) ((m) << 2) #define TILE_BASE_ADR(m) ((void *)(VRAM + ((m) << 14))) #define MAP_BASE_ADR(m) ((void *)(VRAM + ((m) << 11))) #define MAP_BASE(m) ((m) << 8) #define BG_PRIORITY(m) ((m)) #define CHAR_PALETTE(m) ((m)<<12) /*--------------------------------------------------------------------------------- CHAR_BASE_ADR() is the direct equivalent to old PATRAM(), giving the base address of a chr bank. These macros pinpoint the base address of a single tile. ---------------------------------------------------------------------------------*/ #define PATRAM4(x, tn) ((u32 *)(VRAM | (((x) << 14) + ((tn) << 5)) )) #define PATRAM8(x, tn) ((u32 *)(VRAM | (((x) << 14) + ((tn) << 6)) )) #define SPR_VRAM(tn) ((u32 *)(VRAM | 0x10000 | ((tn) << 5))) /*--------------------------------------------------------------------------------- MAP_BASE_ADR() only gives the beginning of a map. Each cell of a text map can be accessed using 3D array notation: MAP[page][y][x] ---------------------------------------------------------------------------------*/ typedef u16 NAMETABLE[32][32]; #define MAP ((NAMETABLE *)0x06000000) /*--------------------------------------------------------------------------------- width and height of a GBA text map can (and probably should) be controlled separately. ---------------------------------------------------------------------------------*/ #define BG_WID_32 BG_SIZE_0 #define BG_WID_64 BG_SIZE_1 #define BG_HT_32 BG_SIZE_0 #define BG_HT_64 BG_SIZE_2 //--------------------------------------------------------------------------------- // Symbolic names for the rot/scale map sizes //--------------------------------------------------------------------------------- #define ROTBG_SIZE_16 BG_SIZE_0 #define ROTBG_SIZE_32 BG_SIZE_1 #define ROTBG_SIZE_64 BG_SIZE_2 #define ROTBG_SIZE_128 BG_SIZE_3 #define TEXTBG_SIZE_256x256 BG_SIZE_0 #define TEXTBG_SIZE_512x256 BG_SIZE_1 #define TEXTBG_SIZE_256x512 BG_SIZE_2 #define TEXTBG_SIZE_512x512 BG_SIZE_3 #define ROTBG_SIZE_128x128 BG_SIZE_0 #define ROTBG_SIZE_256x256 BG_SIZE_1 #define ROTBG_SIZE_512x512 BG_SIZE_2 #define ROTBG_SIZE_1024x1024 BG_SIZE_3 //--------------------------------------------------------------------------------- // Framebuffers for mode 3 and 5 //--------------------------------------------------------------------------------- typedef u16 MODE3_LINE[240]; typedef u16 MODE5_LINE[160]; #define MODE3_FB ((MODE3_LINE *)0x06000000) #define MODE5_FB ((MODE5_LINE *)0x06000000) #define MODE5_BB ((MODE5_LINE *)0x0600A000) #define REG_WIN0H *((vu16 *)(REG_BASE + 0x40)) #define REG_WIN1H *((vu16 *)(REG_BASE + 0x42)) #define REG_WIN0V *((vu16 *)(REG_BASE + 0x44)) #define REG_WIN1V *((vu16 *)(REG_BASE + 0x46)) #define REG_WININ *((vu16 *)(REG_BASE + 0x48)) #define REG_WINOUT *((vu16 *)(REG_BASE + 0x4A)) #define REG_MOSAIC *(vu16 *)(REG_BASE + 0x4c) #define REG_BLDCNT *((vu16 *)(REG_BASE + 0x50)) #define REG_BLDALPHA *((vu16 *)(REG_BASE + 0x52)) #define REG_BLDY *((vu16 *)(REG_BASE + 0x54)) //--------------------------------------------------------------------------------- // Helper macros //--------------------------------------------------------------------------------- static inline void SetMode(int mode) {REG_DISPCNT = mode;} #define RGB5(r,g,b) ((r)|((g)<<5)|((b)<<10)) #define RGB8(r,g,b) ( (((b)>>3)<<10) | (((g)>>3)<<5) | ((r)>>3) ) #define SCREEN_WIDTH 240 #define SCREEN_HEIGHT 160 //--------------------------------------------------------------------------------- #endif // _gba_video_h_ //---------------------------------------------------------------------------------