diff options
Diffstat (limited to 'include/libnds/nds/arm9/video.h')
-rw-r--r-- | include/libnds/nds/arm9/video.h | 591 |
1 files changed, 591 insertions, 0 deletions
diff --git a/include/libnds/nds/arm9/video.h b/include/libnds/nds/arm9/video.h new file mode 100644 index 0000000000..9e910c621f --- /dev/null +++ b/include/libnds/nds/arm9/video.h @@ -0,0 +1,591 @@ +/*--------------------------------------------------------------------------------- + Video registers and defines + + Copyright (C) 2005 + Michael Noland (joat) + Jason Rogers (dovoto) + Dave Murphy (WinterMute) + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any + damages arising from the use of this software. + + Permission is granted to anyone to use this software for any + purpose, including commercial applications, and to alter it and + redistribute it freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you + must not claim that you wrote the original software. If you use + this software in a product, an acknowledgment in the product + documentation would be appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and + must not be misrepresented as being the original software. + 3. This notice may not be removed or altered from any source + distribution. + +---------------------------------------------------------------------------------*/ + +#ifndef VIDEO_ARM9_INCLUDE +#define VIDEO_ARM9_INCLUDE + + +#ifndef ARM9 +#error Video is only available on the ARM9 +#endif + +#include <nds/jtypes.h> + +#ifdef __cplusplus +extern "C" { +#endif + +// macro creates a 15 bit color from 3x5 bit components +#define RGB15(r,g,b) ((r)|((g)<<5)|((b)<<10)) +#define RGB5(r,g,b) ((r)|((g)<<5)|((b)<<10)) +#define RGB8(r,g,b) (((r)>>3)|(((g)>>3)<<5)|(((b)>>3)<<10)) + + +#define SCREEN_HEIGHT 192 +#define SCREEN_WIDTH 256 +// Vram Control +#define VRAM_CR (*(vuint32*)0x04000240) +#define VRAM_A_CR (*(vuint8*)0x04000240) +#define VRAM_B_CR (*(vuint8*)0x04000241) +#define VRAM_C_CR (*(vuint8*)0x04000242) +#define VRAM_D_CR (*(vuint8*)0x04000243) +#define VRAM_E_CR (*(vuint8*)0x04000244) +#define VRAM_F_CR (*(vuint8*)0x04000245) +#define VRAM_G_CR (*(vuint8*)0x04000246) +#define WRAM_CR (*(vuint8*)0x04000247) +#define VRAM_H_CR (*(vuint8*)0x04000248) +#define VRAM_I_CR (*(vuint8*)0x04000249) + +#define VRAM_ENABLE (1<<7) + +#define VRAM_OFFSET(n) ((n)<<3) + + +typedef enum { + VRAM_A_LCD = 0, + VRAM_A_MAIN_BG = 1, + VRAM_A_MAIN_BG_0x06000000 = 1 | VRAM_OFFSET(0), + VRAM_A_MAIN_BG_0x06020000 = 1 | VRAM_OFFSET(1), + VRAM_A_MAIN_BG_0x06040000 = 1 | VRAM_OFFSET(2), + VRAM_A_MAIN_BG_0x06060000 = 1 | VRAM_OFFSET(3), + VRAM_A_MAIN_SPRITE = 2, + VRAM_A_MAIN_SPRITE_0x06400000 = 2, + VRAM_A_MAIN_SPRITE_0x06420000 = 2 | VRAM_OFFSET(1), + VRAM_A_TEXTURE = 3, + VRAM_A_TEXTURE_SLOT0 = 3 | VRAM_OFFSET(0), + VRAM_A_TEXTURE_SLOT1 = 3 | VRAM_OFFSET(1), + VRAM_A_TEXTURE_SLOT2 = 3 | VRAM_OFFSET(2), + VRAM_A_TEXTURE_SLOT3 = 3 | VRAM_OFFSET(3) +} VRAM_A_TYPE; + +typedef enum { + VRAM_B_LCD = 0, + VRAM_B_MAIN_BG = 1 | VRAM_OFFSET(1), + VRAM_B_MAIN_BG_0x06000000 = 1 | VRAM_OFFSET(0), + VRAM_B_MAIN_BG_0x06020000 = 1 | VRAM_OFFSET(1), + VRAM_B_MAIN_BG_0x06040000 = 1 | VRAM_OFFSET(2), + VRAM_B_MAIN_BG_0x06060000 = 1 | VRAM_OFFSET(3), + VRAM_B_MAIN_SPRITE = 2 | VRAM_OFFSET(1), + VRAM_B_MAIN_SPRITE_0x06400000 = 2, + VRAM_B_MAIN_SPRITE_0x06420000 = 2 | VRAM_OFFSET(1), + VRAM_B_TEXTURE = 3 | VRAM_OFFSET(1), + VRAM_B_TEXTURE_SLOT0 = 3 | VRAM_OFFSET(0), + VRAM_B_TEXTURE_SLOT1 = 3 | VRAM_OFFSET(1), + VRAM_B_TEXTURE_SLOT2 = 3 | VRAM_OFFSET(2), + VRAM_B_TEXTURE_SLOT3 = 3 | VRAM_OFFSET(3) +} VRAM_B_TYPE; + +typedef enum { + VRAM_C_LCD = 0, + VRAM_C_MAIN_BG = 1 | VRAM_OFFSET(2), + VRAM_C_MAIN_BG_0x06000000 = 1 | VRAM_OFFSET(0), + VRAM_C_MAIN_BG_0x06020000 = 1 | VRAM_OFFSET(1), + VRAM_C_MAIN_BG_0x06040000 = 1 | VRAM_OFFSET(2), + VRAM_C_MAIN_BG_0x06060000 = 1 | VRAM_OFFSET(3), + VRAM_C_ARM7 = 2, + VRAM_C_ARM7_0x06000000 = 2, + VRAM_C_ARM7_0x06020000 = 2 | VRAM_OFFSET(1), + VRAM_C_SUB_BG = 4, + VRAM_C_SUB_BG_0x06200000 = 4 | VRAM_OFFSET(0), + VRAM_C_SUB_BG_0x06220000 = 4 | VRAM_OFFSET(1), + VRAM_C_SUB_BG_0x06240000 = 4 | VRAM_OFFSET(2), + VRAM_C_SUB_BG_0x06260000 = 4 | VRAM_OFFSET(3), + VRAM_C_TEXTURE = 3 | VRAM_OFFSET(2), + VRAM_C_TEXTURE_SLOT0 = 3 | VRAM_OFFSET(0), + VRAM_C_TEXTURE_SLOT1 = 3 | VRAM_OFFSET(1), + VRAM_C_TEXTURE_SLOT2 = 3 | VRAM_OFFSET(2), + VRAM_C_TEXTURE_SLOT3 = 3 | VRAM_OFFSET(3) +} VRAM_C_TYPE; + +typedef enum { + VRAM_D_LCD = 0, + VRAM_D_MAIN_BG = 1 | VRAM_OFFSET(3), + VRAM_D_MAIN_BG_0x06000000 = 1 | VRAM_OFFSET(0), + VRAM_D_MAIN_BG_0x06020000 = 1 | VRAM_OFFSET(1), + VRAM_D_MAIN_BG_0x06040000 = 1 | VRAM_OFFSET(2), + VRAM_D_MAIN_BG_0x06060000 = 1 | VRAM_OFFSET(3), + VRAM_D_ARM7 = 2 | VRAM_OFFSET(1), + VRAM_D_ARM7_0x06000000 = 2, + VRAM_D_ARM7_0x06020000 = 2 | VRAM_OFFSET(1), + VRAM_D_SUB_SPRITE = 4, + VRAM_D_TEXTURE = 3 | VRAM_OFFSET(3), + VRAM_D_TEXTURE_SLOT0 = 3 | VRAM_OFFSET(0), + VRAM_D_TEXTURE_SLOT1 = 3 | VRAM_OFFSET(1), + VRAM_D_TEXTURE_SLOT2 = 3 | VRAM_OFFSET(2), + VRAM_D_TEXTURE_SLOT3 = 3 | VRAM_OFFSET(3) +} VRAM_D_TYPE; + +typedef enum { + VRAM_E_LCD = 0, + VRAM_E_MAIN_BG = 1, + VRAM_E_MAIN_SPRITE = 2, + VRAM_E_TEX_PALETTE = 3, + VRAM_E_BG_EXT_PALETTE = 4, + VRAM_E_OBJ_EXT_PALETTE = 5, +} VRAM_E_TYPE; + +typedef enum { + VRAM_F_LCD = 0, + VRAM_F_MAIN_BG = 1, + VRAM_F_MAIN_SPRITE = 2, + VRAM_F_MAIN_SPRITE_0x06000000 = 2, + VRAM_F_MAIN_SPRITE_0x06004000 = 2 | VRAM_OFFSET(1), + VRAM_F_MAIN_SPRITE_0x06010000 = 2 | VRAM_OFFSET(2), + VRAM_F_MAIN_SPRITE_0x06014000 = 2 | VRAM_OFFSET(3), + VRAM_F_TEX_PALETTE = 3, + VRAM_F_BG_EXT_PALETTE = 4, + VRAM_F_OBJ_EXT_PALETTE = 5, +} VRAM_F_TYPE; + +typedef enum { + VRAM_G_LCD = 0, + VRAM_G_MAIN_BG = 1, + VRAM_G_MAIN_SPRITE = 2, + VRAM_G_MAIN_SPRITE_0x06000000 = 2, + VRAM_G_MAIN_SPRITE_0x06004000 = 2 | VRAM_OFFSET(1), + VRAM_G_MAIN_SPRITE_0x06010000 = 2 | VRAM_OFFSET(2), + VRAM_G_MAIN_SPRITE_0x06014000 = 2 | VRAM_OFFSET(3), + VRAM_G_TEX_PALETTE = 3, + VRAM_G_BG_EXT_PALETTE = 4, + VRAM_G_OBJ_EXT_PALETTE = 5, +} VRAM_G_TYPE; + +typedef enum { + VRAM_H_LCD = 0, + VRAM_H_SUB_BG = 1, + VRAM_H_SUB_BG_EXT_PALETTE = 2, +} VRAM_H_TYPE; + +typedef enum { + VRAM_I_LCD = 0, + VRAM_I_SUB_BG = 1, + VRAM_I_SUB_SPRITE = 2, + VRAM_I_SUB_SPRITE_EXT_PALETTE = 3, +}VRAM_I_TYPE; + + +typedef u16 _palette[256]; +typedef _palette _ext_palette[16]; + +#define VRAM_E_EXT_PALETTE ((_ext_palette *)VRAM_E) +#define VRAM_F_EXT_PALETTE ((_ext_palette *)VRAM_F) +#define VRAM_G_EXT_PALETTE ((_ext_palette *)VRAM_G) +#define VRAM_H_EXT_PALETTE ((_ext_palette *)VRAM_H) + + +uint32 vramSetMainBanks(VRAM_A_TYPE a, VRAM_B_TYPE b, VRAM_C_TYPE c, VRAM_D_TYPE d); +void vramRestoreMainBanks(uint32 vramTemp); + +void vramSetBankA(VRAM_A_TYPE a); +void vramSetBankB(VRAM_B_TYPE b); +void vramSetBankC(VRAM_C_TYPE c); +void vramSetBankD(VRAM_D_TYPE d); +void vramSetBankE(VRAM_E_TYPE e); +void vramSetBankF(VRAM_F_TYPE f); +void vramSetBankG(VRAM_G_TYPE g); +void vramSetBankH(VRAM_H_TYPE h); +void vramSetBankI(VRAM_I_TYPE i); + + +// Display control registers +#define DISPLAY_CR (*(vuint32*)0x04000000) +#define SUB_DISPLAY_CR (*(vuint32*)0x04001000) + +#define MODE_0_2D 0x10000 +#define MODE_1_2D 0x10001 +#define MODE_2_2D 0x10002 +#define MODE_3_2D 0x10003 +#define MODE_4_2D 0x10004 +#define MODE_5_2D 0x10005 + +// main display only +#define MODE_6_2D 0x10006 +#define MODE_FIFO (3<<16) + +#define ENABLE_3D (1<<3) + +#define DISPLAY_BG0_ACTIVE (1 << 8) +#define DISPLAY_BG1_ACTIVE (1 << 9) +#define DISPLAY_BG2_ACTIVE (1 << 10) +#define DISPLAY_BG3_ACTIVE (1 << 11) +#define DISPLAY_SPR_ACTIVE (1 << 12) +#define DISPLAY_WIN0_ON (1 << 13) +#define DISPLAY_WIN1_ON (1 << 14) +#define DISPLAY_SPR_WIN_ON (1 << 15) + + +// Main display only +#define MODE_0_3D (MODE_0_2D | DISPLAY_BG0_ACTIVE | ENABLE_3D) +#define MODE_1_3D (MODE_1_2D | DISPLAY_BG0_ACTIVE | ENABLE_3D) +#define MODE_2_3D (MODE_2_2D | DISPLAY_BG0_ACTIVE | ENABLE_3D) +#define MODE_3_3D (MODE_3_2D | DISPLAY_BG0_ACTIVE | ENABLE_3D) +#define MODE_4_3D (MODE_4_2D | DISPLAY_BG0_ACTIVE | ENABLE_3D) +#define MODE_5_3D (MODE_5_2D | DISPLAY_BG0_ACTIVE | ENABLE_3D) +#define MODE_6_3D (MODE_6_2D | DISPLAY_BG0_ACTIVE | ENABLE_3D) + +#define MODE_FB0 (0x00020000) +#define MODE_FB1 (0x00060000) +#define MODE_FB2 (0x000A0000) +#define MODE_FB3 (0x000E0000) + +#define DISPLAY_SPR_HBLANK (1 << 23) + +#define DISPLAY_SPR_1D_LAYOUT (1 << 4) + +#define DISPLAY_SPR_1D (1 << 4) +#define DISPLAY_SPR_2D (0 << 4) +#define DISPLAY_SPR_1D_BMP (4 << 4) +#define DISPLAY_SPR_2D_BMP_128 (0 << 4) +#define DISPLAY_SPR_2D_BMP_256 (2 << 4) + + +#define DISPLAY_SPR_1D_SIZE_32 (0 << 20) +#define DISPLAY_SPR_1D_SIZE_64 (1 << 20) +#define DISPLAY_SPR_1D_SIZE_128 (2 << 20) +#define DISPLAY_SPR_1D_SIZE_256 (3 << 20) +#define DISPLAY_SPR_1D_BMP_SIZE_128 (0 << 22) +#define DISPLAY_SPR_1D_BMP_SIZE_256 (1 << 22) + + +#define DISPLAY_SPR_EXT_PALETTE (1 << 31) +#define DISPLAY_BG_EXT_PALETTE (1 << 30) + +#define DISPLAY_SCREEN_OFF (1 << 7) + +// The next two defines only apply to MAIN 2d engine +// In tile modes, this is multiplied by 64KB and added to BG_TILE_BASE +// In all bitmap modes, it is not used. +#define DISPLAY_CHAR_BASE(n) (((n)&7)<<24) + +// In tile modes, this is multiplied by 64KB and added to BG_MAP_BASE +// In bitmap modes, this is multiplied by 64KB and added to BG_BMP_BASE +// In large bitmap modes, this is not used +#define DISPLAY_SCREEN_BASE(n) (((n)&7)<<27) + +static inline +void videoSetMode( uint32 mode) { DISPLAY_CR = mode; } +static inline +void videoSetModeSub( uint32 mode) { SUB_DISPLAY_CR = mode; } + +#define BRIGHTNESS (*(vuint16*)0x0400006C) +#define SUB_BRIGHTNESS (*(vuint16*)0x0400106C) + +#define BGCTRL ((vuint16*)0x04000008) +#define BG0_CR (*(vuint16*)0x04000008) +#define BG1_CR (*(vuint16*)0x0400000A) +#define BG2_CR (*(vuint16*)0x0400000C) +#define BG3_CR (*(vuint16*)0x0400000E) + +#define BGCTRL_SUB ((vuint16*)0x04001008) +#define SUB_BG0_CR (*(vuint16*)0x04001008) +#define SUB_BG1_CR (*(vuint16*)0x0400100A) +#define SUB_BG2_CR (*(vuint16*)0x0400100C) +#define SUB_BG3_CR (*(vuint16*)0x0400100E) + +#define BG_256_COLOR (BIT(7)) +#define BG_16_COLOR (0) + +#define BG_MOSAIC_ON (BIT(6)) +#define BG_MOSAIC_OFF (0) + +#define BG_PRIORITY(n) (n) +#define BG_PRIORITY_0 (0) +#define BG_PRIORITY_1 (1) +#define BG_PRIORITY_2 (2) +#define BG_PRIORITY_3 (3) + +#define BG_TILE_BASE(base) ((base) << 2) +#define BG_MAP_BASE(base) ((base) << 8) +#define BG_BMP_BASE(base) ((base) << 8) + +#define BG_MAP_RAM(base) (((base)*0x800) + 0x06000000) +#define BG_MAP_RAM_SUB(base) (((base)*0x800) + 0x06200000) + +#define BG_TILE_RAM(base) (((base)*0x4000) + 0x06000000) +#define BG_TILE_RAM_SUB(base) (((base)*0x4000) + 0x06200000) + +#define BG_BMP_RAM(base) (((base)*0x4000) + 0x06000000) +#define BG_BMP_RAM_SUB(base) (((base)*0x4000) + 0x06200000) + +#define BG_WRAP_OFF (0) +#define BG_WRAP_ON (1 << 13) + +#define BG_32x32 (0 << 14) +#define BG_64x32 (1 << 14) +#define BG_32x64 (2 << 14) +#define BG_64x64 (3 << 14) + +#define BG_RS_16x16 (0 << 14) +#define BG_RS_32x32 (1 << 14) +#define BG_RS_64x64 (2 << 14) +#define BG_RS_128x128 (3 << 14) + +#define BG_BMP8_128x128 (BG_RS_16x16 | BG_256_COLOR) +#define BG_BMP8_256x256 (BG_RS_32x32 | BG_256_COLOR) +#define BG_BMP8_512x256 (BG_RS_64x64 | BG_256_COLOR) +#define BG_BMP8_512x512 (BG_RS_128x128 | BG_256_COLOR) +#define BG_BMP8_1024x512 BIT(14) +#define BG_BMP8_512x1024 0 + +#define BG_BMP16_128x128 (BG_RS_16x16 | BG_256_COLOR | BIT(2)) +#define BG_BMP16_256x256 (BG_RS_32x32 | BG_256_COLOR | BIT(2)) +#define BG_BMP16_512x256 (BG_RS_64x64 | BG_256_COLOR | BIT(2)) +#define BG_BMP16_512x512 (BG_RS_128x128 | BG_256_COLOR | BIT(2)) + +#define BG_PALETTE_SLOT0 0 +#define BG_PALETTE_SLOT1 0 +#define BG_PALETTE_SLOT2 BIT(13) +#define BG_PALETTE_SLOT3 BIT(13) + +typedef struct { + u16 x; + u16 y; +} bg_scroll; + +typedef struct { + u16 xdx; + u16 xdy; + u16 ydx; + u16 ydy; + u32 centerX; + u32 centerY; +} bg_rotation; + +typedef struct { + u16 control[4]; + bg_scroll scroll[4]; + bg_rotation bg2_rotation; + bg_rotation bg3_rotation; +} bg_attribute; + +#define BACKGROUND (*((bg_attribute *)0x04000008)) +#define BACKGROUND_SUB (*((bg_attribute *)0x04001008)) + +#define BG_OFFSET ((bg_scroll *)(0x04000010)) + +#define BG0_X0 (*(vuint16*)0x04000010) +#define BG0_Y0 (*(vuint16*)0x04000012) +#define BG1_X0 (*(vuint16*)0x04000014) +#define BG1_Y0 (*(vuint16*)0x04000016) +#define BG2_X0 (*(vuint16*)0x04000018) +#define BG2_Y0 (*(vuint16*)0x0400001A) +#define BG3_X0 (*(vuint16*)0x0400001C) +#define BG3_Y0 (*(vuint16*)0x0400001E) + +#define BG2_XDX (*(vuint16*)0x04000020) +#define BG2_XDY (*(vuint16*)0x04000022) +#define BG2_YDX (*(vuint16*)0x04000024) +#define BG2_YDY (*(vuint16*)0x04000026) +#define BG2_CX (*(vuint32*)0x04000028) +#define BG2_CY (*(vuint32*)0x0400002C) + +#define BG3_XDX (*(vuint16*)0x04000030) +#define BG3_XDY (*(vuint16*)0x04000032) +#define BG3_YDX (*(vuint16*)0x04000034) +#define BG3_YDY (*(vuint16*)0x04000036) +#define BG3_CX (*(vuint32*)0x04000038) +#define BG3_CY (*(vuint32*)0x0400003C) + +#define SUB_BG0_X0 (*(vuint16*)0x04001010) +#define SUB_BG0_Y0 (*(vuint16*)0x04001012) +#define SUB_BG1_X0 (*(vuint16*)0x04001014) +#define SUB_BG1_Y0 (*(vuint16*)0x04001016) +#define SUB_BG2_X0 (*(vuint16*)0x04001018) +#define SUB_BG2_Y0 (*(vuint16*)0x0400101A) +#define SUB_BG3_X0 (*(vuint16*)0x0400101C) +#define SUB_BG3_Y0 (*(vuint16*)0x0400101E) + +#define SUB_BG2_XDX (*(vuint16*)0x04001020) +#define SUB_BG2_XDY (*(vuint16*)0x04001022) +#define SUB_BG2_YDX (*(vuint16*)0x04001024) +#define SUB_BG2_YDY (*(vuint16*)0x04001026) +#define SUB_BG2_CX (*(vuint32*)0x04001028) +#define SUB_BG2_CY (*(vuint32*)0x0400102C) + +#define SUB_BG3_XDX (*(vuint16*)0x04001030) +#define SUB_BG3_XDY (*(vuint16*)0x04001032) +#define SUB_BG3_YDX (*(vuint16*)0x04001034) +#define SUB_BG3_YDY (*(vuint16*)0x04001036) +#define SUB_BG3_CX (*(vuint32*)0x04001038) +#define SUB_BG3_CY (*(vuint32*)0x0400103C) + +// Window 0 +#define WIN0_X0 (*(vuint8*)0x04000041) +#define WIN0_X1 (*(vuint8*)0x04000040) +#define WIN0_Y0 (*(vuint8*)0x04000045) +#define WIN0_Y1 (*(vuint8*)0x04000044) + +// Window 1 +#define WIN1_X0 (*(vuint8*)0x04000042) +#define WIN1_X1 (*(vuint8*)0x04000043) +#define WIN1_Y0 (*(vuint8*)0x04000047) +#define WIN1_Y1 (*(vuint8*)0x04000046) + +#define WIN_IN (*(vuint16*)0x04000048) +#define WIN_OUT (*(vuint16*)0x0400004A) + +// Window 0 +#define SUB_WIN0_X0 (*(vuint8*)0x04001041) +#define SUB_WIN0_X1 (*(vuint8*)0x04001040) +#define SUB_WIN0_Y0 (*(vuint8*)0x04001045) +#define SUB_WIN0_Y1 (*(vuint8*)0x04001044) + +// Window 1 +#define SUB_WIN1_X0 (*(vuint8*)0x04001042) +#define SUB_WIN1_X1 (*(vuint8*)0x04001043) +#define SUB_WIN1_Y0 (*(vuint8*)0x04001047) +#define SUB_WIN1_Y1 (*(vuint8*)0x04001046) + +#define SUB_WIN_IN (*(vuint16*)0x04001048) +#define SUB_WIN_OUT (*(vuint16*)0x0400104A) + +#define MOSAIC_CR (*(vuint16*)0x0400004C) +#define SUB_MOSAIC_CR (*(vuint16*)0x0400104C) + +#define BLEND_CR (*(vuint16*)0x04000050) +#define BLEND_AB (*(vuint16*)0x04000052) +#define BLEND_Y (*(vuint16*)0x04000054) + +#define SUB_BLEND_CR (*(vuint16*)0x04001050) +#define SUB_BLEND_AB (*(vuint16*)0x04001052) +#define SUB_BLEND_Y (*(vuint16*)0x04001054) + +#define BLEND_NONE (0<<6) +#define BLEND_ALPHA (1<<6) +#define BLEND_FADE_WHITE (2<<6) +#define BLEND_FADE_BLACK (3<<6) + +#define BLEND_SRC_BG0 (1<<0) +#define BLEND_SRC_BG1 (1<<1) +#define BLEND_SRC_BG2 (1<<2) +#define BLEND_SRC_BG3 (1<<3) +#define BLEND_SRC_SPRITE (1<<4) +#define BLEND_SRC_BACKDROP (1<<5) + +#define BLEND_DST_BG0 (1<<8) +#define BLEND_DST_BG1 (1<<9) +#define BLEND_DST_BG2 (1<<10) +#define BLEND_DST_BG3 (1<<11) +#define BLEND_DST_SPRITE (1<<12) +#define BLEND_DST_BACKDROP (1<<13) + +// Display capture control + +#define REG_DISPCAPCNT (*(vuint32*)0x04000064) +#define REG_ DISP_MMEM_FIFO (*(vuint32*)0x04000068) + +#define DCAP_ENABLE BIT(31) +#define DCAP_MODE(n) (((n) & 3) << 29) +#define DCAP_DST(n) (((n) & 3) << 26) +#define DCAP_SRC(n) (((n) & 3) << 24) +#define DCAP_SIZE(n) (((n) & 3) << 20) +#define DCAP_OFFSET(n) (((n) & 3) << 18) +#define DCAP_BANK(n) (((n) & 3) << 16) +#define DCAP_B(n) (((n) & 0x1F) << 8) +#define DCAP_A(n) (((n) & 0x1F) << 0) + + +// 3D core control + +#define GFX_CONTROL (*(vuint16*) 0x04000060) + +#define GFX_FIFO (*(vuint32*) 0x04000400) +#define GFX_STATUS (*(vuint32*) 0x04000600) +#define GFX_COLOR (*(vuint32*) 0x04000480) + +#define GFX_VERTEX10 (*(vuint32*) 0x04000490) +#define GFX_VERTEX_XY (*(vuint32*) 0x04000494) +#define GFX_VERTEX_XZ (*(vuint32*) 0x04000498) +#define GFX_VERTEX_YZ (*(vuint32*) 0x0400049C) +#define GFX_VERTEX_DIFF (*(vuint32*) 0x040004A0) + +#define GFX_VERTEX16 (*(vuint32*) 0x0400048C) +#define GFX_TEX_COORD (*(vuint32*) 0x04000488) +#define GFX_TEX_FORMAT (*(vuint32*) 0x040004A8) +#define GFX_PAL_FORMAT (*(vuint32*) 0x040004AC) + +#define GFX_CLEAR_COLOR (*(vuint32*) 0x04000350) +#define GFX_CLEAR_DEPTH (*(vuint16*) 0x04000354) + +#define GFX_LIGHT_VECTOR (*(vuint32*) 0x040004C8) +#define GFX_LIGHT_COLOR (*(vuint32*) 0x040004CC) +#define GFX_NORMAL (*(vuint32*) 0x04000484) + +#define GFX_DIFFUSE_AMBIENT (*(vuint32*) 0x040004C0) +#define GFX_SPECULAR_EMISSION (*(vuint32*) 0x040004C4) +#define GFX_SHININESS (*(vuint32*) 0x040004D0) + +#define GFX_POLY_FORMAT (*(vuint32*) 0x040004A4) +#define GFX_ALPHA_TEST (*(vuint16*) 0x04000340) + +#define GFX_BEGIN (*(vuint32*) 0x04000500) +#define GFX_END (*(vuint32*) 0x04000504) +#define GFX_FLUSH (*(vuint32*) 0x04000540) +#define GFX_VIEWPORT (*(vuint32*) 0x04000580) +#define GFX_TOON_TABLE ((vuint16*) 0x04000380) +#define GFX_EDGE_TABLE ((vuint16*) 0x04000330) +#define GFX_FOG_COLOR (*(vuint32*) 0x04000358) +#define GFX_FOG_OFFSET (*(vuint32*) 0x0400035C) +#define GFX_FOG_TABLE ((vuint8*) 0x04000360) +#define GFX_BOX_TEST (*(vint32*) 0x040005C0) +#define GFX_POS_TEST (*(vuint32*) 0x040005C4) +#define GFX_POS_RESULT ((vint32*) 0x04000620) + +#define GFX_BUSY (GFX_STATUS & BIT(27)) + +#define GFX_VERTEX_RAM_USAGE (*(uint16*) 0x04000606) +#define GFX_POLYGON_RAM_USAGE (*(uint16*) 0x04000604) + +#define GFX_CUTOFF_DEPTH (*(uint16*)0x04000610) + +// Matrix processor control + +#define MATRIX_CONTROL (*(vuint32*)0x04000440) +#define MATRIX_PUSH (*(vuint32*)0x04000444) +#define MATRIX_POP (*(vuint32*)0x04000448) +#define MATRIX_SCALE (*(vint32*) 0x0400046C) +#define MATRIX_TRANSLATE (*(vint32*) 0x04000470) +#define MATRIX_RESTORE (*(vuint32*)0x04000450) +#define MATRIX_STORE (*(vuint32*)0x0400044C) +#define MATRIX_IDENTITY (*(vuint32*)0x04000454) +#define MATRIX_LOAD4x4 (*(vint32*) 0x04000458) +#define MATRIX_LOAD4x3 (*(vint32*) 0x0400045C) +#define MATRIX_MULT4x4 (*(vint32*) 0x04000460) +#define MATRIX_MULT4x3 (*(vint32*) 0x04000464) +#define MATRIX_MULT3x3 (*(vint32*) 0x04000468) + +//matrix operation results +#define MATRIX_READ_CLIP ((vint32*) (0x04000640)) +#define MATRIX_READ_VECTOR ((vint32*) (0x04000680)) +#define POINT_RESULT ((vint32*) (0x04000620)) +#define VECTOR_RESULT ((vuint16*)(0x04000630)) + +#ifdef __cplusplus +} +#endif + +#endif |