📄 gba.h
字号:
//
// HAM (c) Emanuel Schleussinger 2001/2002
// all rights reserved.
//
// Includes Doxygen compatible documentation
// http://www.doxygen.org
//
/*
----------------------------------------------------------
REG_ --> Register location
absolute adress of a register.
includes typecasting for direct c writes.
example: R_DISPCNT = value;
MEN_ --> MEMORY address
V_ --> Value
A register related value used by macros
and functions. Register Masks are also
treated as values, this is currently in-
consistent with C_ (constants), which they
should be really. Anyone want to clean up? :-)
C_ --> Constant
Helpers that will never need change. holds
values for bitfields that are hard to remember
Also note, C_'s might get declared only once
for a set of registers. If so, two rules apply:
- the C_ declaration always is in the first
register of the set.
- the number of the register (example BG0CNT,
BG1CNT) is set to C_BGXCNT.
F_ --> Function
a function returns a value suchas true
M_ --> Macro
A macro does stuff on its own, suchas
switching a display mode or enabling
sprites. This is what you will be using
most of the time. Example:
M_INTMST_ENABLE will enable interrupts
TOOL_ --> Tool function
Usually a collection of macros and/or
functions. Propably not the fastest on
earth, but very convienient. These are
found at the end of the file. For example
TOOL_INIT_ALL(1) sets up the display for
BGMode 1 and inits sound and interrupts.
Notes:
------
Some of the functions/macros are not the fastest on
earth, i know that. Most of them are built for
convienience rather than speed, and will suffice
in the most cases.
Also, please do not mail me about the fact that
using REG= A | B | C | D is faster than what
is being done here. I know that ;-) First of all, that
only applies sometimes (if you need to set whole bitfields),
and second of all, you can still do it on your own using
the R_ defines. I do the same in my code, but it proves
handy to have the base cases covered.
Disclaimer:
-----------
I'd like to be greeted in your demo if you use this
header :)
Be fair.
Also, this source file and any other part of HAM must NOT:
- be changed and redistributed as new versions, I
would like to keep the main distribution point on
my end. Help with any suggestions please, though.
You WILL be mentioned for any help you did on HAM,
and also, you can join in the team.
---------------------------------------------------------
*/
#ifndef _GBA_H_
#define _GBA_H_
// bool is a standard type in cplusplus, but not in c.
#ifndef __cplusplus
typedef unsigned char bool;
#endif
typedef unsigned char u8;
typedef unsigned short int u16;
typedef unsigned int u32;
typedef unsigned long long int u64;
typedef signed char s8;
typedef signed short int s16;
typedef signed int s32;
typedef signed long long int s64;
typedef volatile unsigned char vu8;
typedef volatile unsigned short int vu16;
typedef volatile unsigned int vu32;
typedef volatile unsigned long long int vu64;
typedef volatile signed char vs8;
typedef volatile signed short int vs16;
typedef volatile signed int vs32;
typedef volatile signed long long int vs64;
// boolean defines
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
#ifndef NULL
#define NULL ((void *)0)
#endif
// boolean defines
#ifndef true
#define true 1
#endif
#ifndef false
#define false 0
#endif
#define BIT0 0x0001
#define BIT1 0x0002
#define BIT2 0x0004
#define BIT3 0x0008
#define BIT4 0x0010
#define BIT5 0x0020
#define BIT6 0x0040
#define BIT7 0x0080
#define BIT8 0x0100
#define BIT9 0x0200
#define BIT10 0x0400
#define BIT11 0x0800
#define BIT12 0x1000
#define BIT13 0x2000
#define BIT14 0x4000
#define BIT15 0x8000
// Bit operate macro
#define setb(c,b) c|=(1<<(b)) //set the selected bit in the charecter
#define clrb(c,b) c&=(~(1<<(b))) //clr the selected bit in the charecter
#define testb(c,b) (c&(1<<(b))) //test the selected bit in the charecter is 0 or 1
// max value
#define max(a,b) ((a>b)?a:b)
// min value
#define min(a,b) ((a>b)?b:a)
/*
--------------------------------------------------------
conversion defines
--------------------------------------------------------
*/
#define RGB(r,g,b) ((((b)>>3)<<10)+(((g)>>3)<<5)+((r)>>3))
#define RGB_SET(r,g,b) (((b)<<10)+((g)<<5)+(r));
#define RGB_GET_R_VALUE(rgb) ((rgb & 0x001f) << 3)
#define RGB_GET_G_VALUE(rgb) (((rgb >> 5) & 0x001f) << 3)
#define RGB_GET_B_VALUE(rgb) (((rgb >> 10) & 0x001f) << 3)
#define PI 3.1415926
#define RADIAN(n) (((n)*PI)/180)
/*
------------------------------------------------------
display mem pointer
------------------------------------------------------
*/
#define PaletteMem ((volatile u16 *)0x5000000)
#define BGPaletteMem ((volatile u16 *)0x5000000)
#define BGPaletteMem ((volatile u16 *)0x5000000)
#define OBJPaletteMem ((volatile u16 *)0x5000200)
#define VideoBuffer ((volatile u16 *)0x6000000)
#define BGBuffer ((volatile u16 *)0x6000000)
#define BGBuffer0 ((volatile u16 *)0x6000000)
#define BGBuffer1 ((volatile u16 *)0x600A000)
#define BGMODE0Buffer ((volatile u16 *)0x6000000) // GBA Video RAM
#define BGMODE1Buffer ((volatile u16 *)0x6000000) // GBA Video RAM
#define BGMODE2Buffer ((volatile u16 *)0x6000000) // GBA Video RAM
#define BGMODE3Buffer ((volatile u16 *)0x6000000) // GBA Video RAM
#define BGMODE4Buffer0 ((volatile u16 *)0x6000000) // GBA Video RAM
#define BGMODE4Buffer1 ((volatile u16 *)0x600A000) // GBA Video RAM
#define BGMODE5Buffer0 ((volatile u16 *)0x6000000) // GBA Video RAM
#define BGMODE5Buffer1 ((volatile u16 *)0x600A000) // GBA Video RAM
#define OAMData ((volatile u16 *)0x6010000)
#define OBJData ((volatile u16 *)0x6010000)
#define OAMmem ((volatile u32 *)0x7000000)
/*
------------------------------------------------------
regist of AGB
------------------------------------------------------
*/
#define GBA_FOSC 0x1000000 // GBA main HZ(16,777,216Hz)
#define REG_INTERUPT *(volatile u32*)0x3007FFC // save the irq func pointer
#define REG_DISPCNT *(volatile u16*)0x4000000
#define REG_DISPSTAT *(volatile u16*)0x4000004
#define REG_VCOUNT *(volatile u16*)0x4000006
#define REG_BG0CNT *(volatile u16*)0x4000008
#define REG_BG1CNT *(volatile u16*)0x400000A
#define REG_BG2CNT *(volatile u16*)0x400000C
#define REG_BG3CNT *(volatile u16*)0x400000E
#define REG_BG0HOFS *(volatile u16*)0x4000010
#define REG_BG0VOFS *(volatile u16*)0x4000012
#define REG_BG1HOFS *(volatile u16*)0x4000014
#define REG_BG1VOFS *(volatile u16*)0x4000016
#define REG_BG2HOFS *(volatile u16*)0x4000018
#define REG_BG2VOFS *(volatile u16*)0x400001A
#define REG_BG3HOFS *(volatile u16*)0x400001C
#define REG_BG3VOFS *(volatile u16*)0x400001E
#define REG_BG2PA *(volatile u16*)0x4000020
#define REG_BG2PB *(volatile u16*)0x4000022
#define REG_BG2PC *(volatile u16*)0x4000024
#define REG_BG2PD *(volatile u16*)0x4000026
#define REG_BG2X *(volatile u32*)0x4000028
#define REG_BG2X_L *(volatile u16*)0x4000028
#define REG_BG2X_H *(volatile u16*)0x400002A
#define REG_BG2Y *(volatile u32*)0x400002C
#define REG_BG2Y_L *(volatile u16*)0x400002C
#define REG_BG2Y_H *(volatile u16*)0x400002E
#define REG_BG3PA *(volatile u16*)0x4000030
#define REG_BG3PB *(volatile u16*)0x4000032
#define REG_BG3PC *(volatile u16*)0x4000034
#define REG_BG3PD *(volatile u16*)0x4000036
#define REG_BG3X *(volatile u32*)0x4000038
#define REG_BG3X_L *(volatile u16*)0x4000038
#define REG_BG3X_H *(volatile u16*)0x400003A
#define REG_BG3Y *(volatile u32*)0x400003C
#define REG_BG3Y_L *(volatile u16*)0x400003C
#define REG_BG3Y_H *(volatile u16*)0x400003E
#define REG_WIN0H *(volatile u16*)0x4000040
#define REG_WIN0X *(volatile u16*)0x4000040
#define REG_WIN1H *(volatile u16*)0x4000042
#define REG_WIN1X *(volatile u16*)0x4000042
#define REG_WIN0V *(volatile u16*)0x4000044
#define REG_WIN0Y *(volatile u16*)0x4000044
#define REG_WIN1V *(volatile u16*)0x4000046
#define REG_WIN1Y *(volatile u16*)0x4000046
#define REG_WININ *(volatile u16*)0x4000048
#define REG_WINOUT *(volatile u16*)0x400004A
#define REG_MOSAIC *(volatile u16*)0x400004C
#define REG_BLDCNT *(volatile u16*)0x4000050
#define REG_BLDALPHA *(volatile u16*)0x4000052
#define REG_BLDY *(volatile u16*)0x4000054
#define REG_SOUND1CNT *(volatile u32*)0x4000060
#define REG_SOUND1CNT_L *(volatile u16*)0x4000060
#define REG_SOUND1CNT_H *(volatile u16*)0x4000062
#define REG_SOUND1CNT_X *(volatile u16*)0x4000064
#define REG_SOUND2CNT_L *(volatile u16*)0x4000068
#define REG_SOUND2CNT_H *(volatile u16*)0x400006C
#define REG_SOUND3CNT *(volatile u32*)0x4000070
#define REG_SOUND3CNT_L *(volatile u16*)0x4000070
#define REG_SOUND3CNT_H *(volatile u16*)0x4000072
#define REG_SOUND3CNT_X *(volatile u16*)0x4000074
#define REG_SOUND4CNT_L *(volatile u16*)0x4000078
#define REG_SOUND4CNT_H *(volatile u16*)0x400007C
#define REG_SOUNDCNT *(volatile u32*)0x4000080
#define REG_SOUNDCNT_L *(volatile u16*)0x4000080
#define REG_SOUNDCNT_H *(volatile u16*)0x4000082
#define REG_SOUNDCNT_X *(volatile u16*)0x4000084
#define REG_SOUNDBIAS *(volatile u16*)0x4000088
#define REG_WAVE_RAM0 *(volatile u32*)0x4000090
#define REG_WAVE_RAM0_L *(volatile u16*)0x4000090
#define REG_WAVE_RAM0_H *(volatile u16*)0x4000092
#define REG_WAVE_RAM1 *(volatile u32*)0x4000094
#define REG_WAVE_RAM1_L *(volatile u16*)0x4000094
#define REG_WAVE_RAM1_H *(volatile u16*)0x4000096
#define REG_WAVE_RAM2 *(volatile u32*)0x4000098
#define REG_WAVE_RAM2_L *(volatile u16*)0x4000098
#define REG_WAVE_RAM2_H *(volatile u16*)0x400009A
#define REG_WAVE_RAM3 *(volatile u32*)0x400009C
#define REG_WAVE_RAM3_L *(volatile u16*)0x400009C
#define REG_WAVE_RAM3_H *(volatile u16*)0x400009E
//-------SOUND REG for old name--------------
#define REG_SG10 *(volatile u32*)0x4000060
#define REG_SG10_L *(volatile u16*)0x4000060
#define REG_SG10_H *(volatile u16*)0x4000062
#define REG_SG11 *(volatile u16*)0x4000064
#define REG_SG20 *(volatile u16*)0x4000068
#define REG_SG21 *(volatile u16*)0x400006C
#define REG_SG30 *(volatile u32*)0x4000070
#define REG_SG30_L *(volatile u16*)0x4000070
#define REG_SG30_H *(volatile u16*)0x4000072
#define REG_SG31 *(volatile u16*)0x4000074
#define REG_SG40 *(volatile u16*)0x4000078
#define REG_SG41 *(volatile u16*)0x400007C
#define REG_SGCNT0 *(volatile u32*)0x4000080
#define REG_SGCNT0_L *(volatile u16*)0x4000080
#define REG_SGCNT0_H *(volatile u16*)0x4000082
#define REG_SGCNT1 *(volatile u16*)0x4000084
#define REG_SGBIAS *(volatile u16*)0x4000088
#define REG_SGWR0 *(volatile u32*)0x4000090
#define REG_SGWR0_L *(volatile u16*)0x4000090
#define REG_SGWR0_H *(volatile u16*)0x4000092
#define REG_SGWR1 *(volatile u32*)0x4000094
#define REG_SGWR1_L *(volatile u16*)0x4000094
#define REG_SGWR1_H *(volatile u16*)0x4000096
#define REG_SGWR2 *(volatile u32*)0x4000098
#define REG_SGWR2_L *(volatile u16*)0x4000098
#define REG_SGWR2_H *(volatile u16*)0x400009A
#define REG_SGWR3 *(volatile u32*)0x400009C
#define REG_SGWR3_L *(volatile u16*)0x400009C
#define REG_SGWR3_H *(volatile u16*)0x400009E
//------------------------------------------
#define REG_FIFO_A *(volatile u32*)0x40000A0
#define REG_FIFO_A_L *(volatile u16*)0x40000A0
#define REG_FIFO_A_H *(volatile u16*)0x40000A2
#define REG_FIFO_B *(volatile u32*)0x40000A4
#define REG_FIFO_B_L *(volatile u16*)0x40000A4
#define REG_FIFO_B_H *(volatile u16*)0x40000A6
//---------------old name-------------------
#define REG_SGFIF0A *(volatile u32*)0x40000A0
#define REG_SGFIFOA_L *(volatile u16*)0x40000A0
#define REG_SGFIFOA_H *(volatile u16*)0x40000A2
#define REG_SGFIFOB *(volatile u32*)0x40000A4
#define REG_SGFIFOB_L *(volatile u16*)0x40000A4
#define REG_SGFIFOB_H *(volatile u16*)0x40000A6
#define REG_DMA0SAD *(volatile u32*)0x40000B0
#define REG_DMA0SAD_L *(volatile u16*)0x40000B0
#define REG_DMA0SAD_H *(volatile u16*)0x40000B2
#define REG_DMA0DAD *(volatile u32*)0x40000B4
#define REG_DMA0DAD_L *(volatile u16*)0x40000B4
#define REG_DMA0DAD_H *(volatile u16*)0x40000B6
#define REG_DMA0CNT *(volatile u32*)0x40000B8
#define REG_DMA0CNT_L *(volatile u16*)0x40000B8
#define REG_DMA0CNT_H *(volatile u16*)0x40000BA
#define REG_DMA1SAD *(volatile u32*)0x40000BC
#define REG_DMA1SAD_L *(volatile u16*)0x40000BC
#define REG_DMA1SAD_H *(volatile u16*)0x40000BE
#define REG_DMA1DAD *(volatile u32*)0x40000C0
#define REG_DMA1DAD_L *(volatile u16*)0x40000C0
#define REG_DMA1DAD_H *(volatile u16*)0x40000C2
#define REG_DMA1CNT *(volatile u32*)0x40000C4
#define REG_DMA1CNT_L *(volatile u16*)0x40000C4
#define REG_DMA1CNT_H *(volatile u16*)0x40000C6
#define REG_DMA2SAD *(volatile u32*)0x40000C8
#define REG_DMA2SAD_L *(volatile u16*)0x40000C8
#define REG_DMA2SAD_H *(volatile u16*)0x40000CA
#define REG_DMA2DAD *(volatile u32*)0x40000CC
#define REG_DMA2DAD_L *(volatile u16*)0x40000CC
#define REG_DMA2DAD_H *(volatile u16*)0x40000CE
#define REG_DMA2CNT *(volatile u32*)0x40000D0
#define REG_DMA2CNT_L *(volatile u16*)0x40000D0
#define REG_DMA2CNT_H *(volatile u16*)0x40000D2
#define REG_DMA3SAD *(volatile u32*)0x40000D4
#define REG_DMA3SAD_L *(volatile u16*)0x40000D4
#define REG_DMA3SAD_H *(volatile u16*)0x40000D6
#define REG_DMA3DAD *(volatile u32*)0x40000D8
#define REG_DMA3DAD_L *(volatile u16*)0x40000D8
#define REG_DMA3DAD_H *(volatile u16*)0x40000DA
#define REG_DMA3CNT *(volatile u32*)0x40000DC
#define REG_DMA3CNT_L *(volatile u16*)0x40000DC
#define REG_DMA3CNT_H *(volatile u16*)0x40000DE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -