809 lines
22 KiB
C
Executable File
809 lines
22 KiB
C
Executable File
/* Copyright (C) 2006 yopyop
|
|
yopyop156@ifrance.com
|
|
yopyop156.ifrance.com
|
|
|
|
Copyright (C) 2006-2007 Theo Berkau
|
|
Copyright (C) 2007 shash
|
|
|
|
This file is part of DeSmuME
|
|
|
|
DeSmuME is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
DeSmuME 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 General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with DeSmuME; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
#ifndef GPU_H
|
|
#define GPU_H
|
|
|
|
#include "ARM9.h"
|
|
#include <stdio.h>
|
|
#include "mem.h"
|
|
#include "registers.h"
|
|
#include "FIFO.h"
|
|
#include "MMU.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
|
|
/*******************************************************************************
|
|
this structure is for display control,
|
|
it holds flags for general display
|
|
*******************************************************************************/
|
|
|
|
#ifdef WORDS_BIGENDIAN
|
|
struct _DISPCNT
|
|
{
|
|
/* 7*/ u8 ForceBlank:1; // A+B:
|
|
/* 6*/ u8 OBJ_BMP_mapping:1; // A+B: 0=2D (128KB), 1=1D (128..256KB)
|
|
/* 5*/ u8 OBJ_BMP_2D_dim:1; // A+B: 0=128x512, 1=256x256 pixels
|
|
/* 4*/ u8 OBJ_Tile_1D:1; // A+B: 0=2D (32KB), 1=1D (32..256KB)
|
|
/* 3*/ u8 BG0_3D:1; // A : 0=2D, 1=3D
|
|
/* 0*/ u8 BG_Mode:3; // A+B:
|
|
/*15*/ u8 WinOBJ_Enable:1; // A+B: 0=disable, 1=Enable
|
|
/*14*/ u8 Win1_Enable:1; // A+B: 0=disable, 1=Enable
|
|
/*13*/ u8 Win0_Enable:1; // A+B: 0=disable, 1=Enable
|
|
/*12*/ u8 OBJ_Enable:1; // A+B: 0=disable, 1=Enable
|
|
/*11*/ u8 BG3_Enable:1; // A+B: 0=disable, 1=Enable
|
|
/*10*/ u8 BG2_Enable:1; // A+B: 0=disable, 1=Enable
|
|
/* 9*/ u8 BG1_Enable:1; // A+B: 0=disable, 1=Enable
|
|
/* 8*/ u8 BG0_Enable:1; // A+B: 0=disable, 1=Enable
|
|
/*23*/ u8 OBJ_HBlank_process:1; // A+B: OBJ processed during HBlank (GBA bit5)
|
|
/*22*/ u8 OBJ_BMP_1D_Bound:1; // A :
|
|
/*20*/ u8 OBJ_Tile_1D_Bound:2; // A+B:
|
|
/*18*/ u8 VRAM_Block:2; // A : VRAM block (0..3=A..D)
|
|
|
|
/*16*/ u8 DisplayMode:2; // A+B: coreA(0..3) coreB(0..1) GBA(Green Swap)
|
|
// 0=off (white screen)
|
|
// 1=on (normal BG & OBJ layers)
|
|
// 2=VRAM display (coreA only)
|
|
// 3=RAM display (coreA only, DMA transfers)
|
|
|
|
/*31*/ u8 ExOBJPalette_Enable:1; // A+B: 0=disable, 1=Enable OBJ extended Palette
|
|
/*30*/ u8 ExBGxPalette_Enable:1; // A+B: 0=disable, 1=Enable BG extended Palette
|
|
/*27*/ u8 ScreenBase_Block:3; // A : Screen Base (64K step)
|
|
/*24*/ u8 CharacBase_Block:3; // A : Character Base (64K step)
|
|
};
|
|
#else
|
|
struct _DISPCNT
|
|
{
|
|
/* 0*/ u8 BG_Mode:3; // A+B:
|
|
/* 3*/ u8 BG0_3D:1; // A : 0=2D, 1=3D
|
|
/* 4*/ u8 OBJ_Tile_1D:1; // A+B: 0=2D (32KB), 1=1D (32..256KB)
|
|
/* 5*/ u8 OBJ_BMP_2D_dim:1; // A+B: 0=128x512, 1=256x256 pixels
|
|
/* 6*/ u8 OBJ_BMP_mapping:1; // A+B: 0=2D (128KB), 1=1D (128..256KB)
|
|
|
|
// 7-15 same as GBA
|
|
/* 7*/ u8 ForceBlank:1; // A+B:
|
|
/* 8*/ u8 BG0_Enable:1; // A+B: 0=disable, 1=Enable
|
|
/* 9*/ u8 BG1_Enable:1; // A+B: 0=disable, 1=Enable
|
|
/*10*/ u8 BG2_Enable:1; // A+B: 0=disable, 1=Enable
|
|
/*11*/ u8 BG3_Enable:1; // A+B: 0=disable, 1=Enable
|
|
/*12*/ u8 OBJ_Enable:1; // A+B: 0=disable, 1=Enable
|
|
/*13*/ u8 Win0_Enable:1; // A+B: 0=disable, 1=Enable
|
|
/*14*/ u8 Win1_Enable:1; // A+B: 0=disable, 1=Enable
|
|
/*15*/ u8 WinOBJ_Enable:1; // A+B: 0=disable, 1=Enable
|
|
|
|
/*16*/ u8 DisplayMode:2; // A+B: coreA(0..3) coreB(0..1) GBA(Green Swap)
|
|
// 0=off (white screen)
|
|
// 1=on (normal BG & OBJ layers)
|
|
// 2=VRAM display (coreA only)
|
|
// 3=RAM display (coreA only, DMA transfers)
|
|
|
|
/*18*/ u8 VRAM_Block:2; // A : VRAM block (0..3=A..D)
|
|
/*20*/ u8 OBJ_Tile_1D_Bound:2; // A+B:
|
|
/*22*/ u8 OBJ_BMP_1D_Bound:1; // A :
|
|
/*23*/ u8 OBJ_HBlank_process:1; // A+B: OBJ processed during HBlank (GBA bit5)
|
|
/*24*/ u8 CharacBase_Block:3; // A : Character Base (64K step)
|
|
/*27*/ u8 ScreenBase_Block:3; // A : Screen Base (64K step)
|
|
/*30*/ u8 ExBGxPalette_Enable:1; // A+B: 0=disable, 1=Enable BG extended Palette
|
|
/*31*/ u8 ExOBJPalette_Enable:1; // A+B: 0=disable, 1=Enable OBJ extended Palette
|
|
};
|
|
#endif
|
|
|
|
typedef union
|
|
{
|
|
struct _DISPCNT bits;
|
|
u32 val;
|
|
} DISPCNT;
|
|
#define BGxENABLED(cnt,num) ((num<8)? ((cnt.val>>8) & num):0)
|
|
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
this structure is for display control of a specific layer,
|
|
there are 4 background layers
|
|
their priority indicate which one to draw on top of the other
|
|
some flags indicate special drawing mode, size, FX
|
|
*******************************************************************************/
|
|
|
|
#ifdef WORDS_BIGENDIAN
|
|
struct _BGxCNT
|
|
{
|
|
/* 7*/ u8 Palette_256:1; // 0=16x16, 1=1*256 palette
|
|
/* 6*/ u8 Mosaic_Enable:1; // 0=disable, 1=Enable mosaic
|
|
/* 2*/ u8 CharacBase_Block:4; // individual character base offset (n*16KB)
|
|
/* 0*/ u8 Priority:2; // 0..3=high..low
|
|
/*14*/ u8 ScreenSize:2; // text : 256x256 512x256 256x512 512x512
|
|
// x/rot/s : 128x128 256x256 512x512 1024x1024
|
|
// bmp : 128x128 256x256 512x256 512x512
|
|
// large : 512x1024 1024x512 - -
|
|
/*13*/ u8 PaletteSet_Wrap:1; // BG0 extended palette set 0=set0, 1=set2
|
|
// BG1 extended palette set 0=set1, 1=set3
|
|
// BG2 overflow area wraparound 0=off, 1=wrap
|
|
// BG3 overflow area wraparound 0=off, 1=wrap
|
|
/* 8*/ u8 ScreenBase_Block:5; // individual screen base offset (text n*2KB, BMP n*16KB)
|
|
};
|
|
#else
|
|
struct _BGxCNT
|
|
{
|
|
/* 0*/ u8 Priority:2; // 0..3=high..low
|
|
/* 2*/ u8 CharacBase_Block:4; // individual character base offset (n*16KB)
|
|
/* 6*/ u8 Mosaic_Enable:1; // 0=disable, 1=Enable mosaic
|
|
/* 7*/ u8 Palette_256:1; // 0=16x16, 1=1*256 palette
|
|
/* 8*/ u8 ScreenBase_Block:5; // individual screen base offset (text n*2KB, BMP n*16KB)
|
|
/*13*/ u8 PaletteSet_Wrap:1; // BG0 extended palette set 0=set0, 1=set2
|
|
// BG1 extended palette set 0=set1, 1=set3
|
|
// BG2 overflow area wraparound 0=off, 1=wrap
|
|
// BG3 overflow area wraparound 0=off, 1=wrap
|
|
/*14*/ u8 ScreenSize:2; // text : 256x256 512x256 256x512 512x512
|
|
// x/rot/s : 128x128 256x256 512x512 1024x1024
|
|
// bmp : 128x128 256x256 512x256 512x512
|
|
// large : 512x1024 1024x512 - -
|
|
};
|
|
#endif
|
|
|
|
|
|
typedef union
|
|
{
|
|
struct _BGxCNT bits;
|
|
u16 val;
|
|
} BGxCNT;
|
|
|
|
/*******************************************************************************
|
|
this structure is for background offset
|
|
*******************************************************************************/
|
|
|
|
typedef struct {
|
|
u16 BGxHOFS;
|
|
u16 BGxVOFS;
|
|
} BGxOFS;
|
|
|
|
/*******************************************************************************
|
|
this structure is for rotoscale parameters
|
|
*******************************************************************************/
|
|
|
|
typedef struct {
|
|
s16 BGxPA;
|
|
s16 BGxPB;
|
|
s16 BGxPC;
|
|
s16 BGxPD;
|
|
s32 BGxX;
|
|
s32 BGxY;
|
|
} BGxPARMS;
|
|
|
|
|
|
/*******************************************************************************
|
|
these structures are for window description,
|
|
windows are square regions and can "subclass"
|
|
background layers or object layers (i.e window controls the layers)
|
|
|
|
screen
|
|
|
|
|
+-- Window0/Window1/OBJwindow/OutOfWindows
|
|
|
|
|
+-- BG0/BG1/BG2/BG3/OBJ
|
|
*******************************************************************************/
|
|
|
|
typedef union {
|
|
struct {
|
|
u8 end:8;
|
|
u8 start:8;
|
|
} bits ;
|
|
u16 val;
|
|
} WINxDIM;
|
|
|
|
#ifdef WORDS_BIGENDIAN
|
|
typedef struct {
|
|
/* 6*/ u8 :2;
|
|
/* 5*/ u8 WINx_Effect_Enable:1;
|
|
/* 4*/ u8 WINx_OBJ_Enable:1;
|
|
/* 3*/ u8 WINx_BG3_Enable:1;
|
|
/* 2*/ u8 WINx_BG2_Enable:1;
|
|
/* 1*/ u8 WINx_BG1_Enable:1;
|
|
/* 0*/ u8 WINx_BG0_Enable:1;
|
|
} WINxBIT;
|
|
#else
|
|
typedef struct {
|
|
/* 0*/ u8 WINx_BG0_Enable:1;
|
|
/* 1*/ u8 WINx_BG1_Enable:1;
|
|
/* 2*/ u8 WINx_BG2_Enable:1;
|
|
/* 3*/ u8 WINx_BG3_Enable:1;
|
|
/* 4*/ u8 WINx_OBJ_Enable:1;
|
|
/* 5*/ u8 WINx_Effect_Enable:1;
|
|
/* 6*/ u8 :2;
|
|
} WINxBIT;
|
|
#endif
|
|
|
|
#ifdef WORDS_BIGENDIAN
|
|
typedef union {
|
|
struct {
|
|
WINxBIT win0;
|
|
WINxBIT win1;
|
|
} bits;
|
|
struct {
|
|
u8 :3;
|
|
u8 win0_en:5;
|
|
u8 :3;
|
|
u8 win1_en:5;
|
|
} packed_bits;
|
|
struct {
|
|
u8 low;
|
|
u8 high;
|
|
} bytes;
|
|
u16 val ;
|
|
} WINxCNT ;
|
|
#else
|
|
typedef union {
|
|
struct {
|
|
WINxBIT win0;
|
|
WINxBIT win1;
|
|
} bits;
|
|
struct {
|
|
u8 win0_en:5;
|
|
u8 :3;
|
|
u8 win1_en:5;
|
|
u8 :3;
|
|
} packed_bits;
|
|
struct {
|
|
u8 low;
|
|
u8 high;
|
|
} bytes;
|
|
u16 val ;
|
|
} WINxCNT ;
|
|
#endif
|
|
|
|
/*
|
|
typedef struct {
|
|
WINxDIM WIN0H;
|
|
WINxDIM WIN1H;
|
|
WINxDIM WIN0V;
|
|
WINxDIM WIN1V;
|
|
WINxCNT WININ;
|
|
WINxCNT WINOUT;
|
|
} WINCNT;
|
|
*/
|
|
|
|
/*******************************************************************************
|
|
this structure is for miscellanous settings
|
|
//TODO: needs further description
|
|
*******************************************************************************/
|
|
|
|
typedef struct {
|
|
u16 MOSAIC;
|
|
u16 unused1;
|
|
u16 unused2;//BLDCNT;
|
|
u16 unused3;//BLDALPHA;
|
|
u16 unused4;//BLDY;
|
|
u16 unused5;
|
|
/*
|
|
u16 unused6;
|
|
u16 unused7;
|
|
u16 unused8;
|
|
u16 unused9;
|
|
*/
|
|
} MISCCNT;
|
|
|
|
|
|
/*******************************************************************************
|
|
this structure is for 3D settings
|
|
*******************************************************************************/
|
|
|
|
struct _DISP3DCNT
|
|
{
|
|
/* 0*/ u8 EnableTexMapping:1; //
|
|
/* 1*/ u8 PolygonShading:1; // 0=Toon Shading, 1=Highlight Shading
|
|
/* 2*/ u8 EnableAlphaTest:1; // see ALPHA_TEST_REF
|
|
/* 3*/ u8 EnableAlphaBlending:1; // see various Alpha values
|
|
/* 4*/ u8 EnableAntiAliasing:1; //
|
|
/* 5*/ u8 EnableEdgeMarking:1; // see EDGE_COLOR
|
|
/* 6*/ u8 FogOnlyAlpha:1; // 0=Alpha and Color, 1=Only Alpha (see FOG_COLOR)
|
|
/* 7*/ u8 EnableFog:1; // Fog Master Enable
|
|
/* 8*/ u8 FogShiftSHR:4; // 0..10 SHR-Divider (see FOG_OFFSET)
|
|
/*12*/ u8 AckColorBufferUnderflow:1; // Color Buffer RDLINES Underflow (0=None, 1=Underflow/Acknowledge)
|
|
/*13*/ u8 AckVertexRAMOverflow:1; // Polygon/Vertex RAM Overflow (0=None, 1=Overflow/Acknowledge)
|
|
/*14*/ u8 RearPlaneMode:1; // 0=Blank, 1=Bitmap
|
|
/*15*/ u8 :1;
|
|
/*16*/ u16 :16;
|
|
};
|
|
|
|
typedef union
|
|
{
|
|
struct _DISP3DCNT bits;
|
|
u32 val;
|
|
} DISP3DCNT;
|
|
|
|
/*******************************************************************************
|
|
this structure is for capture control (core A only)
|
|
|
|
source:
|
|
http://nocash.emubase.de/gbatek.htm#dsvideocaptureandmainmemorydisplaymode
|
|
*******************************************************************************/
|
|
|
|
struct _DISPCAPCNT
|
|
{
|
|
/* 0*/ u8 BlendFactor_A:5; // 0..16 = Blending Factor for Source A
|
|
/* 5*/ u8 :3; //
|
|
/* 8*/ u8 BlendFactor_B:5; // 0..16 = Blending Factor for Source B
|
|
/*13*/ u8 :3; //
|
|
/*16*/ u8 VRAM_Write_Block:2; // 0..3 = VRAM A..D
|
|
/*18*/ u8 VRAM_Write_Offset:2; // n x 0x08000
|
|
/*20*/ u8 Capture_Size:2; // 0=128x128, 1=256x64, 2=256x128, 3=256x192 dots
|
|
/*22*/ u8 :2; //
|
|
/*24*/ u8 Source_A:1; // 0=Graphics Screen BG+3D+OBJ, 1=3D Screen
|
|
/*25*/ u8 Source_B:1; // 0=VRAM, 1=Main Memory Display FIFO
|
|
/*26*/ u8 VRAM_Read_Offset:2; // n x 0x08000
|
|
/*28*/ u8 :1; //
|
|
/*29*/ u8 Capture_Source:2; // 0=Source A, 1=Source B, 2/3=Sources A+B blended
|
|
/*31*/ u8 Capture_Enable:1; // 0=Disable/Ready, 1=Enable/Busy
|
|
};
|
|
|
|
typedef union
|
|
{
|
|
struct _DISPCAPCNT bits;
|
|
u32 val;
|
|
} DISPCAPCNT;
|
|
|
|
|
|
/*******************************************************************************
|
|
this structure holds everything and should be mapped to
|
|
* core A : 0x04000000
|
|
* core B : 0x04001000
|
|
*******************************************************************************/
|
|
|
|
typedef struct _reg_dispx {
|
|
DISPCNT dispx_DISPCNT; // 0x0400x000
|
|
u16 dispA_DISPSTAT; // 0x04000004
|
|
u16 dispx_VCOUNT; // 0x0400x006
|
|
BGxCNT dispx_BGxCNT[4]; // 0x0400x008
|
|
BGxOFS dispx_BGxOFS[4]; // 0x0400x010
|
|
BGxPARMS dispx_BG2PARMS; // 0x0400x020
|
|
BGxPARMS dispx_BG3PARMS; // 0x0400x030
|
|
u8 filler[12]; // 0x0400x040
|
|
MISCCNT dispx_MISC; // 0x0400x04C
|
|
DISP3DCNT dispA_DISP3DCNT; // 0x04000060
|
|
DISPCAPCNT dispA_DISPCAPCNT; // 0x04000064
|
|
u32 dispA_DISPMMEMFIFO; // 0x04000068
|
|
} REG_DISPx ;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef min
|
|
#define min(a,b) (((a)<(b))?(a):(b))
|
|
#endif
|
|
|
|
#ifndef max
|
|
#define max(a,b) (((a)>(b))?(a):(b))
|
|
#endif
|
|
|
|
typedef BOOL (*fun_gl_Begin) (int screen);
|
|
typedef void (*fun_gl_End) (int screen);
|
|
// the GUI should use this function prior to all gl calls
|
|
// if call to beg succeeds opengl draw
|
|
void register_gl_fun(fun_gl_Begin beg,fun_gl_End end);
|
|
|
|
#define GPU_MAIN 0
|
|
#define GPU_SUB 1
|
|
|
|
/* human readable bitmask names */
|
|
#define ADDRESS_STEP_512B 0x00200
|
|
#define ADDRESS_STEP_1KB 0x00400
|
|
#define ADDRESS_STEP_2KB 0x00800
|
|
#define ADDRESS_STEP_4KB 0x01000
|
|
#define ADDRESS_STEP_8KB 0x02000
|
|
#define ADDRESS_STEP_16KB 0x04000
|
|
#define ADDRESS_STEP_32KB 0x08000
|
|
#define ADDRESS_STEP_64kB 0x10000
|
|
|
|
#ifdef WORDS_BIGENDIAN
|
|
struct _TILEENTRY
|
|
{
|
|
/*14*/ unsigned Palette:4;
|
|
/*13*/ unsigned VFlip:1; // VERTICAL FLIP (top<-->bottom)
|
|
/*12*/ unsigned HFlip:1; // HORIZONTAL FLIP (left<-->right)
|
|
/* 0*/ unsigned TileNum:10;
|
|
};
|
|
#else
|
|
struct _TILEENTRY
|
|
{
|
|
/* 0*/ unsigned TileNum:10;
|
|
/*12*/ unsigned HFlip:1; // HORIZONTAL FLIP (left<-->right)
|
|
/*13*/ unsigned VFlip:1; // VERTICAL FLIP (top<-->bottom)
|
|
/*14*/ unsigned Palette:4;
|
|
};
|
|
#endif
|
|
typedef union
|
|
{
|
|
struct _TILEENTRY bits;
|
|
u16 val;
|
|
} TILEENTRY;
|
|
|
|
struct _ROTOCOORD
|
|
{
|
|
/* 0*/ unsigned Fraction:8;
|
|
/* 8*/ signed Integer:24;
|
|
// /*28*/ unsigned :4;
|
|
};
|
|
typedef union
|
|
{
|
|
struct _ROTOCOORD bits;
|
|
s32 val;
|
|
} ROTOCOORD;
|
|
|
|
|
|
/*
|
|
this structure is for color representation,
|
|
it holds 5 meaningful bits per color channel (red,green,blue)
|
|
and 1 meaningful bit for alpha representation
|
|
this bit can be unused or used for special FX
|
|
*/
|
|
|
|
struct _COLOR { // abgr x555
|
|
#ifdef WORDS_BIGENDIAN
|
|
unsigned alpha:1; // sometimes it is unused (pad)
|
|
unsigned blue:5;
|
|
unsigned green:5;
|
|
unsigned red:5;
|
|
#else
|
|
unsigned red:5;
|
|
unsigned green:5;
|
|
unsigned blue:5;
|
|
unsigned alpha:1; // sometimes it is unused (pad)
|
|
#endif
|
|
};
|
|
struct _COLORx { // abgr x555
|
|
unsigned bgr:15;
|
|
unsigned alpha:1; // sometimes it is unused (pad)
|
|
};
|
|
|
|
typedef union
|
|
{
|
|
struct _COLOR bits;
|
|
struct _COLORx bitx;
|
|
u16 val;
|
|
} COLOR;
|
|
|
|
struct _COLOR32 { // ARGB
|
|
unsigned :3;
|
|
unsigned blue:5;
|
|
unsigned :3;
|
|
unsigned green:5;
|
|
unsigned :3;
|
|
unsigned red:5;
|
|
unsigned :7;
|
|
unsigned alpha:1; // sometimes it is unused (pad)
|
|
};
|
|
|
|
typedef union
|
|
{
|
|
struct _COLOR32 bits;
|
|
u32 val;
|
|
} COLOR32;
|
|
|
|
#define COLOR_16_32(w,i) \
|
|
/* doesnt matter who's 16bit who's 32bit */ \
|
|
i.bits.red = w.bits.red; \
|
|
i.bits.green = w.bits.green; \
|
|
i.bits.blue = w.bits.blue; \
|
|
i.bits.alpha = w.bits.alpha;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
this structure is for Sprite description,
|
|
it holds flags & transformations for 1 sprite
|
|
(max 128 OBJs / screen)
|
|
ref: http://www.bottledlight.com/ds/index.php/Video/Sprites
|
|
*/
|
|
|
|
typedef struct
|
|
{
|
|
#ifdef WORDS_BIGENDIAN
|
|
// attr0
|
|
/* 0*/ unsigned Y:8;
|
|
/*14*/ unsigned Shape:2; // (00: Square, 01: Wide, 10: Tall, 11: Illegal)
|
|
/*13*/ unsigned Depth:1; // (0: 16, 1: 256)
|
|
/*12*/ unsigned Mosaic:1; // (1: Enabled)
|
|
/*10*/ unsigned Mode:2; // (00: Normal, 01: Transparent, 10: Object window, 11: Bitmap)
|
|
/* 8*/ unsigned RotScale:2; // (00: Normal, 01: Rot/scale, 10: Disabled, 11: Double-size rot/scale)
|
|
// attr1
|
|
/* 0*/ signed X:9;
|
|
/*14*/ unsigned Size:2;
|
|
/*13*/ unsigned VFlip:1;
|
|
/*12*/ unsigned HFlip:1;
|
|
/* 9*/ unsigned RotScalIndex:3; // Rot/scale matrix index
|
|
// attr2
|
|
/* 0*/ unsigned TileIndex:10;
|
|
/*12*/ unsigned PaletteIndex:4;
|
|
/*10*/ unsigned Priority:2;
|
|
// attr3
|
|
unsigned attr3:16;
|
|
#else
|
|
// attr0
|
|
/* 0*/ unsigned Y:8;
|
|
/* 8*/ unsigned RotScale:2; // (00: Normal, 01: Rot/scale, 10: Disabled, 11: Double-size rot/scale)
|
|
/*10*/ unsigned Mode:2; // (00: Normal, 01: Transparent, 10: Object window, 11: Bitmap)
|
|
/*12*/ unsigned Mosaic:1; // (1: Enabled)
|
|
/*13*/ unsigned Depth:1; // (0: 16, 1: 256)
|
|
/*14*/ unsigned Shape:2; // (00: Square, 01: Wide, 10: Tall, 11: Illegal)
|
|
// attr1
|
|
/* 0*/ signed X:9;
|
|
/* 9*/ unsigned RotScalIndex:3; // Rot/scale matrix index
|
|
/*12*/ unsigned HFlip:1;
|
|
/*13*/ unsigned VFlip:1;
|
|
/*14*/ unsigned Size:2;
|
|
// attr2
|
|
/* 0*/ unsigned TileIndex:10;
|
|
/*10*/ unsigned Priority:2;
|
|
/*12*/ unsigned PaletteIndex:4;
|
|
// attr3
|
|
unsigned attr3:16;
|
|
#endif
|
|
} _OAM_;
|
|
|
|
typedef struct
|
|
{
|
|
u16 attr0;
|
|
u16 attr1;
|
|
u16 attr2;
|
|
u16 attr3;
|
|
} OAM;
|
|
|
|
|
|
|
|
typedef struct
|
|
{
|
|
s16 x;
|
|
s16 y;
|
|
} size;
|
|
|
|
|
|
|
|
|
|
/*
|
|
this structure holds information
|
|
for rendering.
|
|
*/
|
|
|
|
#define NB_PRIORITIES 4
|
|
#define NB_BG 4
|
|
typedef struct
|
|
{
|
|
u8 BGs[NB_BG], nbBGs;
|
|
u8 PixelsX[256];
|
|
// doh ! yoda says : 256 pixels we can have...
|
|
u16 nbPixelsX;
|
|
} itemsForPriority_t;
|
|
|
|
|
|
typedef struct _GPU GPU;
|
|
|
|
struct _GPU
|
|
{
|
|
// some structs are becoming redundant
|
|
// some functions too (no need to recopy some vars as it is done by MMU)
|
|
REG_DISPx * dispx_st;
|
|
|
|
DISPCAPCNT dispCapCnt;
|
|
BOOL LayersEnable[5];
|
|
itemsForPriority_t itemsForPriority[NB_PRIORITIES];
|
|
u8 sprWin[256][256];
|
|
|
|
#define BGBmpBB BG_bmp_ram
|
|
#define BGChBB BG_tile_ram
|
|
|
|
u8 *(BG_bmp_ram[4]);
|
|
u8 *(BG_tile_ram[4]);
|
|
u8 *(BG_map_ram[4]);
|
|
|
|
u8 BGExtPalSlot[4];
|
|
u32 BGSize[4][2];
|
|
|
|
u8 lcd;
|
|
u8 core;
|
|
|
|
u8 dispMode;
|
|
u8 vramBlock;
|
|
|
|
BOOL dispBG[4];
|
|
BOOL dispOBJ;
|
|
|
|
OAM * oam;
|
|
u8 * sprMem;
|
|
u8 sprBoundary;
|
|
u8 sprBMPBoundary;
|
|
u8 sprBMPMode;
|
|
u32 sprEnable;
|
|
|
|
u8 WIN0H0;
|
|
u8 WIN0H1;
|
|
u8 WIN0V0;
|
|
u8 WIN0V1;
|
|
|
|
u8 WIN1H0;
|
|
u8 WIN1H1;
|
|
u8 WIN1V0;
|
|
u8 WIN1V1;
|
|
|
|
u8 WININ0;
|
|
u8 WININ0_SPECIAL;
|
|
u8 WININ1;
|
|
u8 WININ1_SPECIAL;
|
|
|
|
u8 WINOUT;
|
|
u8 WINOUT_SPECIAL;
|
|
u8 WINOBJ;
|
|
u8 WINOBJ_SPECIAL;
|
|
|
|
u8 WIN0_ENABLED;
|
|
u8 WIN1_ENABLED;
|
|
u8 WINOBJ_ENABLED;
|
|
|
|
u16 BLDCNT;
|
|
u8 BLDALPHA_EVA;
|
|
u8 BLDALPHA_EVB;
|
|
u8 BLDY_EVY;
|
|
|
|
u8 MasterBrightMode;
|
|
u32 MasterBrightFactor;
|
|
|
|
BOOL (*setFinalColorSpr)(const GPU *gpu, u32 passing, u8 bgnum, u8 *dst, u16 color, u16 x, u16 y);
|
|
BOOL (*setFinalColorBck)(const GPU *gpu, u32 passing, u8 bgnum, u8 *dst, u16 color, u16 x, u16 y);
|
|
void (*spriteRender) (GPU * gpu, u16 l, u8 * dst, u8 * prioTab);
|
|
};
|
|
/*
|
|
// normally should have same addresses
|
|
static void REG_DISPx_pack_test(GPU * gpu)
|
|
{
|
|
REG_DISPx * r = gpu->dispx_st;
|
|
printf ("%08x %02x\n", r, (long)(&r->dispx_DISPCNT) - (long)r);
|
|
printf ("\t%02x\n", (long)(&r->dispA_DISPSTAT) - (long)r);
|
|
printf ("\t%02x\n", (long)(&r->dispx_VCOUNT) - (long)r);
|
|
printf ("\t%02x\n", (long)(&r->dispx_BGxCNT[0]) - (long)r);
|
|
printf ("\t%02x\n", (long)(&r->dispx_BGxOFS[0]) - (long)r);
|
|
printf ("\t%02x\n", (long)(&r->dispx_BG2PARMS) - (long)r);
|
|
printf ("\t%02x\n", (long)(&r->dispx_BG3PARMS) - (long)r);
|
|
printf ("\t%02x\n", (long)(&r->dispx_WINCNT) - (long)r);
|
|
printf ("\t%02x\n", (long)(&r->dispx_MISC) - (long)r);
|
|
printf ("\t%02x\n", (long)(&r->dispA_DISP3DCNT) - (long)r);
|
|
printf ("\t%02x\n", (long)(&r->dispA_DISPCAPCNT) - (long)r);
|
|
printf ("\t%02x\n", (long)(&r->dispA_DISPMMEMFIFO) - (long)r);
|
|
}
|
|
*/
|
|
|
|
extern u8 GPU_screen[4*256*192];
|
|
|
|
|
|
GPU * GPU_Init(u8 l);
|
|
void GPU_Reset(GPU *g, u8 l);
|
|
void GPU_DeInit(GPU *);
|
|
|
|
void textBG(const GPU * gpu, u8 num, u8 * DST); //Draw text based background
|
|
void rotBG(GPU * gpu, u8 num, u8 * DST);
|
|
void extRotBG(GPU * gpu, u8 num, u8 * DST);
|
|
void sprite1D(GPU * gpu, u16 l, u8 * dst, u8 * prioTab);
|
|
void sprite2D(GPU * gpu, u16 l, u8 * dst, u8 * prioTab);
|
|
|
|
extern short sizeTab[4][4][2];
|
|
extern size sprSizeTab[4][4];
|
|
extern s8 mode2type[8][4];
|
|
extern void (*modeRender[8][4])(GPU * gpu, u8 num, u16 l, u8 * DST);
|
|
|
|
typedef struct NDS_Screen {
|
|
GPU * gpu;
|
|
u16 offset;
|
|
} NDS_Screen;
|
|
|
|
int Screen_Init(NDS_state *state, int coreid);
|
|
void Screen_Reset(NDS_state *state);
|
|
void Screen_DeInit(NDS_state *state);
|
|
|
|
|
|
|
|
#define GFXCORE_DEFAULT -1
|
|
#define GFXCORE_DUMMY 0
|
|
|
|
#define GFXCORE_FULLSCREEN (1 << 0)
|
|
|
|
typedef struct
|
|
{
|
|
int id; // ID number for core(see above defines)
|
|
const char *Name; // Name of core
|
|
int flags; // What features the core supports(full screen, etc.)
|
|
int (*Init)(void); // Initializes stuff related to core
|
|
void (*DeInit)(void); // Deinitializes stuff related to core
|
|
void (*Resize)(int width, int height, BOOL fullscreen); // Resizes window or fullscreen
|
|
void (*OnScreenText)(char *string, ...); // For handling save state messages, etc.
|
|
} GraphicsInterface_struct;
|
|
|
|
extern GraphicsInterface_struct GFXDummy;
|
|
|
|
void GPU_setVideoProp(GPU *, u32 p);
|
|
void GPU_setBGProp(GPU *, u16 num, u16 p);
|
|
|
|
void GPU_setBLDCNT(GPU *gpu, u16 v) ;
|
|
void GPU_setBLDALPHA(GPU *gpu, u16 v) ;
|
|
void GPU_setBLDY(GPU *gpu, u16 v) ;
|
|
void GPU_setMOSAIC(GPU *gpu, u16 v) ;
|
|
|
|
|
|
void GPU_remove(GPU *, u8 num);
|
|
void GPU_addBack(GPU *, u8 num);
|
|
|
|
int GPU_ChangeGraphicsCore(int coreid);
|
|
|
|
void GPU_set_DISPCAPCNT(GPU * gpu, u32 val) ;
|
|
void GPU_ligne(NDS_Screen * screen, u16 l) ;
|
|
void GPU_setMasterBrightness (GPU *gpu, u16 val);
|
|
|
|
void GPU_setWIN0_H (GPU *gpu, u16 val);
|
|
void GPU_setWIN0_H0 (GPU *gpu, u8 val);
|
|
void GPU_setWIN0_H1 (GPU *gpu, u8 val);
|
|
|
|
void GPU_setWIN0_V (GPU *gpu, u16 val);
|
|
void GPU_setWIN0_V0 (GPU *gpu, u8 val);
|
|
void GPU_setWIN0_V1 (GPU *gpu, u8 val);
|
|
|
|
void GPU_setWIN1_H (GPU *gpu, u16 val);
|
|
void GPU_setWIN1_H0 (GPU *gpu, u8 val);
|
|
void GPU_setWIN1_H1 (GPU *gpu, u8 val);
|
|
|
|
void GPU_setWIN1_V (GPU *gpu, u16 val);
|
|
void GPU_setWIN1_V0 (GPU *gpu, u8 val);
|
|
void GPU_setWIN1_V1 (GPU *gpu, u8 val);
|
|
|
|
void GPU_setWININ (GPU *gpu, u16 val);
|
|
void GPU_setWININ0 (GPU *gpu, u8 val);
|
|
void GPU_setWININ1 (GPU *gpu, u8 val);
|
|
|
|
void GPU_setWINOUT16(GPU *gpu, u16 val);
|
|
void GPU_setWINOUT (GPU *gpu, u8 val);
|
|
void GPU_setWINOBJ (GPU *gpu, u8 val);
|
|
|
|
void GPU_setBLDCNT_LOW (GPU *gpu, u8 val);
|
|
void GPU_setBLDCNT_HIGH (GPU *gpu, u8 val);
|
|
void GPU_setBLDCNT (GPU *gpu, u16 val);
|
|
|
|
void GPU_setBLDALPHA (GPU *gpu, u16 val);
|
|
void GPU_setBLDALPHA_EVA(GPU *gpu, u8 val);
|
|
void GPU_setBLDALPHA_EVB(GPU *gpu, u8 val);
|
|
|
|
void GPU_setBLDY_EVY (GPU *gpu, u8 val);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|
|
|