@@@@@@@@@ CONTENTS @@@@@@@@@ @ 1. Key pad defines @ 2. Display @ 3. Sprites @ 4. Background @ 5. Sound @ 6. DMA @@@@@@@@@ 1. KEY PAD DEFINES @@@@@@@@@ KEY_A = 1 KEY_B = 2 KEY_SELECT = 4 KEY_START = 8 KEY_RIGHT = 16 KEY_LEFT = 32 KEY_UP = 64 KEY_DOWN = 128 KEY_R = 256 KEY_L = 512 KEYS = 0x04000130 KEYS_HIGH = 0x04000000 KEYS_LOW = 0x00000130 @@@@@@@@@ 2. Display @@@@@@@@@ @ Tile modes MODE_0 = 0x00 @ All 4 BG layers available, but no rotation/scaling MODE_1 = 0x01 @ 3 BG layers (0-2), BG2 can rotate/scale MODE_2 = 0x02 @ 2 BG layers (2-3), both can scale/rotate @ Bitmap modes : BG2 only MODE_3 = 0x03 @ 16 bit color bitmap, cuts into available sprite data area MODE_4 = 0x04 @ Like Mode 3, but with 8-bit references (and palette) MODE_5 = 0x05 @ 16 bit color bitmap, with backbuffer. Screen limited to 160x128 BACKBUFFER = 0x010 H_BLANK_OAM = 0x020 OBJ_MAP_2D = 0x000 OBJ_MAP_1D = 0x040 FORCE_BLANK = 0x080 BG0_ENABLE = 0x0100 BG1_ENABLE = 0x0200 BG2_ENABLE = 0x0400 BG3_ENABLE = 0x0800 OBJ_ENABLE = 0x01000 @ = SPRITES_ENABLE: enable sprites WIN1_ENABLE = 0x02000 WIN2_ENABLE = 0x04000 WINOBJ_ENABLE = 0x08000 VRAM = 0x06000000 VPAL = 0x05000000 REG_DISPCNT = 0x04000000 @ @@@@@@@@@ 3. SPRITES @@@@@@@@@ @*** Attribute 0 *** @ F E D C B A 9 8 7 6 5 4 3 2 1 0 @ S S A M T T D R J J J J J J J J @ 0-7 (J) = Y coordinate of the sprite (pixels) @ 8 (R) = Rotation/Scaling on/off @ 9 (D) = 0 - sprite is single sized; @ 1 - sprite is virtually double sized @ A-B (T) = 00 - normal @ 01 - semi-transparent @ 10 - obj window @ C (M) = enables mosaic for this sprite. @ D (A) = 256 color if on, 16 color if off @ E-F (S) = Size, MSB in attribute 0, LSB in attribute 1 @ Byte 1 = Y coordinate of the sprite, in pixels @ Byte 2 ROTATION_FLAG = 0x100 SIZE_DOUBLE = 0x200 MODE_NORMAL = 0x000 MODE_TRANSPERANT= 0x400 MODE_WINDOWED = 0x800 MOSAIC = 0x1000 COLOR_16 = 0x0000 COLOR_256 = 0x2000 SIZE_8 = 0x0000 @ Only valid for SQUARE SIZE_16 = 0x4000 SIZE_32 = 0x8000 SIZE_64 = 0xC000 @*** Atribute 1 *** @ FEDC BA98 7654 3210 @ SSVH XXXI IIII IIII (standard sprites) @ SSFF FFFI IIII IIII (rotation/scaling on) @ 0-8 (I) = X coordinate of the sprite (pixels) @ C (H) = flip horizinal bit @ D (V) = flip vertical bit @ 9-D (F) = rotation index (0-31). rotation/scaling data in OAM attribute 3 @ E-F (S) = Size of the sprite (LSB) @ 4-bit value which sets the size of the sprite in the following way: @ 00 00: 8 x 8 10 00: 8 x 16 @ 00 01: 16 x 16 10 01: 8 x 32 @ 00 10: 32 x 32 10 10: 16 x 32 @ 00 11: 64 x 64 10 11: 32 x 64 @ 01 00: 16 x 8 11 00: Not used @ 01 01: 32 x 8 11 01: Not used @ 01 10: 32 x 16 11 10: Not used @ 01 11: 64 x 32 11 11: Not used @ Byte 3+1 bit = X coordinate of the sprite, in pixels (9-bit value) @ Byte 4 SQUARE = 0x0000 WIDE = 0x4000 TALL = 0x8000 HORIZONTAL_FLIP = 0x1000 VERTICAL_FLIP = 0x2000 OAM = 0x07000000 OBJPAL = 0x5000200 CHARMEM = 0x6010000 CHARMEM_MODE3 = 0x6012BFD @@@@@@@@@ 4. Background @@@@@@@@@ REG_BG0CNT = 0x4000008 REG_BG1CNT = 0x400000A REG_BG2CNT = 0x400000C REG_BG3CNT = 0x400000E REG_BG0HOFS = 0x4000010 REG_BG0VOFS = 0x4000012 REG_BG1HOFS = 0x4000014 REG_BG1VOFS = 0x4000016 REG_BG2HOFS = 0x4000018 REG_BG2VOFS = 0x400001A REG_BG3HOFS = 0x400001C REG_BG3VOFS = 0x400001E REG_BG2PA = 0x4000020 REG_BG2PB = 0x4000022 REG_BG2PC = 0x4000024 REG_BG2PD = 0x4000026 REG_BG2X = 0x4000028 REG_BG2X_L = 0x4000028 REG_BG2X_H = 0x400002A REG_BG2Y = 0x400002C REG_BG2Y_L = 0x400002C REG_BG2Y_H = 0x400002E REG_BG3PA = 0x4000030 REG_BG3PB = 0x4000032 REG_BG3PC = 0x4000034 REG_BG3PD = 0x4000036 REG_BG3X = 0x4000038 REG_BG3X_L = 0x4000038 REG_BG3X_H = 0x400003A REG_BG3Y = 0x400003C REG_BG3Y_L = 0x400003C REG_BG3Y_H = 0x400003E BG_MOSAIC_ENABLE = 0x40 BG_COLOR_256 = 0x80 BG_COLOR_16 = 0x0 TEXTBG_SIZE_256x256 = 0x0 TEXTBG_SIZE_256x512 = 0x8000 TEXTBG_SIZE_512x256 = 0x4000 TEXTBG_SIZE_512x512 = 0xC000 ROTBG_SIZE_128x128 = 0x0 ROTBG_SIZE_256x256 = 0x4000 ROTBG_SIZE_512x512 = 0x8000 ROTBG_SIZE_1024x1024 = 0xC000 WRAPAROUND = 0x2000 CHAR_SHIFT = 2 @ Used to shift the number over to the right place in REG_BGxCNT SCREEN_SHIFT = 8 @ Defines for all 32 screen (map data) blocks and 4 character (bitmap data) blocks @ Some of this might not be correct CHAR_BLOCK_0 = 0x6000000 CHAR_BLOCK_1 = 0x6004000 CHAR_BLOCK_2 = 0x6008000 CHAR_BLOCK_3 = 0x600C000 SCREEN_BLOCK_0 = 0x6000000 SCREEN_BLOCK_1 = 0x6000800 SCREEN_BLOCK_2 = 0x6001000 SCREEN_BLOCK_3 = 0x6001800 SCREEN_BLOCK_4 = 0x6002000 SCREEN_BLOCK_5 = 0x6002800 SCREEN_BLOCK_6 = 0x6003000 SCREEN_BLOCK_7 = 0x6003800 SCREEN_BLOCK_8 = 0x6004000 SCREEN_BLOCK_9 = 0x6004800 SCREEN_BLOCK_10 = 0x6005000 SCREEN_BLOCK_11 = 0x6005800 SCREEN_BLOCK_12 = 0x6006000 SCREEN_BLOCK_13 = 0x6006800 SCREEN_BLOCK_14 = 0x6007000 SCREEN_BLOCK_15 = 0x6007800 SCREEN_BLOCK_16 = 0x6008000 SCREEN_BLOCK_17 = 0x6008800 SCREEN_BLOCK_18 = 0x6009000 SCREEN_BLOCK_19 = 0x6009800 SCREEN_BLOCK_20 = 0x600A000 SCREEN_BLOCK_21 = 0x600A800 SCREEN_BLOCK_22 = 0x600B000 SCREEN_BLOCK_23 = 0x600B800 SCREEN_BLOCK_24 = 0x600C000 SCREEN_BLOCK_25 = 0x600C800 SCREEN_BLOCK_26 = 0x600D000 SCREEN_BLOCK_27 = 0x600D800 SCREEN_BLOCK_28 = 0x600E000 SCREEN_BLOCK_29 = 0x600E800 SCREEN_BLOCK_30 = 0x600F000 SCREEN_BLOCK_31 = 0x600F800 @@@@@@@@@ 5. Sound @@@@@@@@@ @ To turn sound on: @ ldr r1,=REG_SOUNDCNT_X @ ldr r0,=0x0081 @ str r0,[r1] REG_SOUND1CNT_L = 0x04000060 @ Sound 1 Sweep control REG_SOUND1CNT_H = 0x04000062 @ Sound 1 Length, wave duty and envelope control REG_SOUND1CNT_X = 0x04000064 @ Sound 1 Frequency, reset and loop control REG_SOUND2CNT_L = 0x04000068 @ Sound 2 Length, wave duty and envelope control REG_SOUND2CNT_H = 0x0400006C @ Sound 2 Frequency, reset and loop control REG_SOUND3CNT_L = 0x04000070 @ Sound 3 Enable and wave ram bank control REG_SOUND3CNT_H = 0x04000072 @ Sound 3 Sound Length and output level control REG_SOUND3CNT_X = 0x04000074 @ Sound 3 Frequency, reset and loop control REG_SOUND4CNT_L = 0x04000078 @ Sound 4 Length, output level and envelope control REG_SOUND4CNT_H = 0x0400007C @ Sound 4 Noise parameters, reset and loop control REG_SOUNDCNT_L = 0x04000080 @ Sound 1-4 Output level and Stereo control REG_SOUNDCNT_H = 0x04000082 @ Direct Sound control and Sound 1-4 output ratio REG_SOUNDCNT_X = 0x04000084 @ Master sound enable and Sound 1-4 play status REG_SOUNDBIAS = 0x04000088 @ Sound bias and Amplitude resolution control REG_WAVE_RAM0_L = 0x04000090 @ Sound 3 samples 0-3 REG_WAVE_RAM0_H = 0x04000092 @ Sound 3 samples 4-7 REG_WAVE_RAM1_L = 0x04000094 @ Sound 3 samples 8-11 REG_WAVE_RAM1_H = 0x04000096 @ Sound 3 samples 12-15 REG_WAVE_RAM2_L = 0x04000098 @ Sound 3 samples 16-19 REG_WAVE_RAM2_H = 0x0400009A @ Sound 3 samples 20-23 REG_WAVE_RAM3_L = 0x0400009C @ Sound 3 samples 23-27 REG_WAVE_RAM3_H = 0x0400009E @ Sound 3 samples 28-31 REG_FIFO_A_L = 0x040000A0 @ Direct Sound channel A samples 0-1 REG_FIFO_A_H = 0x040000A2 @ Direct Sound channel A samples 2-3 REG_FIFO_B_L = 0x040000A4 @ Direct Sound channel B samples 0-1 REG_FIFO_B_H = 0x040000A6 @ Direct Sound channel B samples 2-3 @@@@@@@@@ 6. DMA @@@@@@@@@ DMA_ENABLE = 0x80000000 DMA_INTERUPT_ENABLE = 0x40000000 DMA_TIMEING_IMMEDIATE = 0x00000000 DMA_TIMEING_VBLANK = 0x10000000 DMA_TIMEING_HBLANK = 0x20000000 DMA_TIMEING_SYNC_TO_DISPLAY = 0x30000000 DMA_16 = 0x00000000 DMA_32 = 0x04000000 DMA_REPEAT = 0x02000000 DMA_SOURCE_INCREMENT = 0x00000000 DMA_SOURCE_DECREMENT = 0x00800000 DMA_SOURCE_FIXED = 0x01000000 DMA_DEST_INCREMENT = 0x00000000 DMA_DEST_DECREMENT = 0x00200000 DMA_DEST_FIXED = 0x00400000 DMA_DEST_RELOAD = 0x00600000 @ register defines, ripped from GBA.h from DevKitAdvanced REG_DMA0SAD = 0x40000B0 REG_DMA0SAD_L = 0x40000B0 REG_DMA0SAD_H = 0x40000B2 REG_DMA0DAD = 0x40000B4 REG_DMA0DAD_L = 0x40000B4 REG_DMA0DAD_H = 0x40000B6 REG_DMA0CNT = 0x40000B8 REG_DMA0CNT_L = 0x40000B8 REG_DMA0CNT_H = 0x40000BA REG_DMA1SAD = 0x40000BC REG_DMA1SAD_L = 0x40000BC REG_DMA1SAD_H = 0x40000BE REG_DMA1DAD = 0x40000C0 REG_DMA1DAD_L = 0x40000C0 REG_DMA1DAD_H = 0x40000C2 REG_DMA1CNT = 0x40000C4 REG_DMA1CNT_L = 0x40000C4 REG_DMA1CNT_H = 0x40000C6 REG_DMA2SAD = 0x40000C8 REG_DMA2SAD_L = 0x40000C8 REG_DMA2SAD_H = 0x40000CA REG_DMA2DAD = 0x40000CC REG_DMA2DAD_L = 0x40000CC REG_DMA2DAD_H = 0x40000CE REG_DMA2CNT = 0x40000D0 REG_DMA2CNT_L = 0x40000D0 REG_DMA2CNT_H = 0x40000D2 REG_DMA3SAD = 0x40000D4 REG_DMA3SAD_L = 0x40000D4 REG_DMA3SAD_H = 0x40000D6 REG_DMA3DAD = 0x40000D8 REG_DMA3DAD_L = 0x40000D8 REG_DMA3DAD_H = 0x40000DA REG_DMA3CNT = 0x40000DC REG_DMA3CNT_L = 0x40000DC REG_DMA3CNT_H = 0x40000DE @ These defines group common options to save typing @ You may notice that I don't have to include the option to increment the source and address register as that is the default. @ DMA_32NOW DMA_ENABLE|DMA_TIMEING_IMMEDIATE|DMA_32 @ DMA_16NOW DMA_ENABLE|DMA_TIMEING_IMMEDIATE|DMA_16 DMA_32NOW = 0x84000000 DMA_16NOW = 0x80000000