⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gba.h

📁 ucos 在GAMEBOY上的移植
💻 H
📖 第 1 页 / 共 2 页
字号:
//
// 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 + -