mirror of
https://github.com/SAT-R/sa2.git
synced 2026-10-28 09:43:38 +00:00
- Update software renderer to the gpsp renderer (fast enough to render on slow hardware) - Convert audio emulation to fixed point (since float is slower on these systems) - Add PSP as a target for SDL - Add PS2 as its own target, though it's still using software rendering Thanks to @kikugrave for adding the initial psp boilerplate and inspiring me to finally finish the ps2 port!
845 lines
37 KiB
C
845 lines
37 KiB
C
#ifndef GUARD_GBA_IO_REG_H
|
|
#define GUARD_GBA_IO_REG_H
|
|
|
|
#ifndef GEN_CTX
|
|
#include <stdint.h>
|
|
#endif
|
|
|
|
// these are not hardware registers on ports
|
|
// so there is no need to make re-read them
|
|
#if PORTABLE
|
|
typedef uint8_t reg_u8;
|
|
typedef uint16_t reg_u16;
|
|
typedef uint32_t reg_u32;
|
|
typedef int16_t reg_s16;
|
|
typedef int32_t reg_s32;
|
|
typedef uint64_t reg_u64;
|
|
typedef winreg_t reg_wint;
|
|
#else
|
|
typedef volatile uint8_t reg_u8;
|
|
typedef volatile uint16_t reg_u16;
|
|
typedef volatile uint32_t reg_u32;
|
|
typedef volatile int16_t reg_s16;
|
|
typedef volatile int32_t reg_s32;
|
|
typedef volatile uint64_t reg_u64;
|
|
typedef volatile winreg_t reg_wint;
|
|
#endif
|
|
|
|
|
|
#define IO_SIZE 0x400
|
|
#if !PORTABLE
|
|
#define REG_BASE 0x4000000 // I/O register base address
|
|
#else
|
|
// TODO: Needs to be u8 because of the address macros
|
|
extern unsigned char REG_BASE[IO_SIZE];
|
|
#endif
|
|
|
|
// I/O register offsets
|
|
|
|
#define REG_OFFSET_DISPCNT 0x0
|
|
#define REG_OFFSET_DISPSTAT 0x4
|
|
#define REG_OFFSET_VCOUNT 0x6
|
|
#define REG_OFFSET_BG0CNT 0x8
|
|
#define REG_OFFSET_BG1CNT 0xa
|
|
#define REG_OFFSET_BG2CNT 0xc
|
|
#define REG_OFFSET_BG3CNT 0xe
|
|
#define REG_OFFSET_BG0HOFS 0x10
|
|
#define REG_OFFSET_BG0VOFS 0x12
|
|
#define REG_OFFSET_BG1HOFS 0x14
|
|
#define REG_OFFSET_BG1VOFS 0x16
|
|
#define REG_OFFSET_BG2HOFS 0x18
|
|
#define REG_OFFSET_BG2VOFS 0x1a
|
|
#define REG_OFFSET_BG3HOFS 0x1c
|
|
#define REG_OFFSET_BG3VOFS 0x1e
|
|
#define REG_OFFSET_BG2PA 0x20
|
|
#define REG_OFFSET_BG2PB 0x22
|
|
#define REG_OFFSET_BG2PC 0x24
|
|
#define REG_OFFSET_BG2PD 0x26
|
|
#define REG_OFFSET_BG2X 0x28
|
|
#define REG_OFFSET_BG2X_L 0x28
|
|
#define REG_OFFSET_BG2X_H 0x2a
|
|
#define REG_OFFSET_BG2Y 0x2c
|
|
#define REG_OFFSET_BG2Y_L 0x2c
|
|
#define REG_OFFSET_BG2Y_H 0x2e
|
|
#define REG_OFFSET_BG3PA 0x30
|
|
#define REG_OFFSET_BG3PB 0x32
|
|
#define REG_OFFSET_BG3PC 0x34
|
|
#define REG_OFFSET_BG3PD 0x36
|
|
#define REG_OFFSET_BG3X 0x38
|
|
#define REG_OFFSET_BG3X_L 0x38
|
|
#define REG_OFFSET_BG3X_H 0x3a
|
|
#define REG_OFFSET_BG3Y 0x3c
|
|
#define REG_OFFSET_BG3Y_L 0x3c
|
|
#define REG_OFFSET_BG3Y_H 0x3e
|
|
|
|
#define REG_OFFSET_WIN 0x40
|
|
|
|
#define REG_OFFSET_WIN0H (REG_OFFSET_WIN + sizeof(winreg_t) * 0)
|
|
#define REG_OFFSET_WIN1H (REG_OFFSET_WIN + sizeof(winreg_t) * 1)
|
|
#define REG_OFFSET_WIN0V (REG_OFFSET_WIN + sizeof(winreg_t) * 2)
|
|
#define REG_OFFSET_WIN1V (REG_OFFSET_WIN + sizeof(winreg_t) * 3)
|
|
#define REG_OFFSET_WININ (REG_OFFSET_WIN + sizeof(winreg_t) * 4)
|
|
#define REG_OFFSET_WINOUT (REG_OFFSET_WIN + sizeof(winreg_t) * 5)
|
|
|
|
#define REG_OFFSET_WIN_END (REG_OFFSET_WIN + sizeof(winreg_t) * 6)
|
|
|
|
#define REG_OFFSET_MOSAIC REG_OFFSET_WIN_END
|
|
#define REG_OFFSET_BLDCNT (REG_OFFSET_MOSAIC + 4)
|
|
#define REG_OFFSET_BLDALPHA (REG_OFFSET_BLDCNT + 2)
|
|
#define REG_OFFSET_BLDY (REG_OFFSET_BLDALPHA + 2)
|
|
|
|
// Starts at 10 after BLDY (0x60 on the GBA)
|
|
#define REG_OFFSET_SOUND REG_OFFSET_BLDY + 2 + 10
|
|
|
|
#define REG_OFFSET_SOUND1CNT_L REG_OFFSET_SOUND + 0x0
|
|
#define REG_OFFSET_NR10 REG_OFFSET_SOUND + 0x0
|
|
#define REG_OFFSET_SOUND1CNT_H REG_OFFSET_SOUND + 0x2
|
|
#define REG_OFFSET_NR11 REG_OFFSET_SOUND + 0x2
|
|
#define REG_OFFSET_NR12 REG_OFFSET_SOUND + 0x3
|
|
#define REG_OFFSET_SOUND1CNT_X REG_OFFSET_SOUND + 0x4
|
|
#define REG_OFFSET_NR13 REG_OFFSET_SOUND + 0x4
|
|
#define REG_OFFSET_NR14 REG_OFFSET_SOUND + 0x5
|
|
#define REG_OFFSET_SOUND2CNT_L REG_OFFSET_SOUND + 0x8
|
|
#define REG_OFFSET_NR21 REG_OFFSET_SOUND + 0x8
|
|
#define REG_OFFSET_NR22 REG_OFFSET_SOUND + 0x9
|
|
#define REG_OFFSET_SOUND2CNT_H REG_OFFSET_SOUND + 0xC
|
|
#define REG_OFFSET_NR23 REG_OFFSET_SOUND + 0xC
|
|
#define REG_OFFSET_NR24 REG_OFFSET_SOUND + 0xD
|
|
#define REG_OFFSET_SOUND3CNT_L REG_OFFSET_SOUND + 0x10
|
|
#define REG_OFFSET_NR30 REG_OFFSET_SOUND + 0x10
|
|
#define REG_OFFSET_SOUND3CNT_H REG_OFFSET_SOUND + 0x12
|
|
#define REG_OFFSET_NR31 REG_OFFSET_SOUND + 0x12
|
|
#define REG_OFFSET_NR32 REG_OFFSET_SOUND + 0x13
|
|
#define REG_OFFSET_SOUND3CNT_X REG_OFFSET_SOUND + 0x14
|
|
#define REG_OFFSET_NR33 REG_OFFSET_SOUND + 0x14
|
|
#define REG_OFFSET_NR34 REG_OFFSET_SOUND + 0x15
|
|
#define REG_OFFSET_SOUND4CNT_L REG_OFFSET_SOUND + 0x18
|
|
#define REG_OFFSET_NR41 REG_OFFSET_SOUND + 0x18
|
|
#define REG_OFFSET_NR42 REG_OFFSET_SOUND + 0x19
|
|
#define REG_OFFSET_SOUND4CNT_H REG_OFFSET_SOUND + 0x1c
|
|
#define REG_OFFSET_NR43 REG_OFFSET_SOUND + 0x1c
|
|
#define REG_OFFSET_NR44 REG_OFFSET_SOUND + 0x1d
|
|
#define REG_OFFSET_SOUNDCNT_L REG_OFFSET_SOUND + 0x20
|
|
#define REG_OFFSET_NR50 REG_OFFSET_SOUND + 0x20
|
|
#define REG_OFFSET_NR51 REG_OFFSET_SOUND + 0x21
|
|
#define REG_OFFSET_SOUNDCNT_H REG_OFFSET_SOUND + 0x22
|
|
#define REG_OFFSET_SOUNDCNT_X REG_OFFSET_SOUND + 0x24
|
|
#define REG_OFFSET_NR52 REG_OFFSET_SOUND + 0x24
|
|
#define REG_OFFSET_SOUNDBIAS REG_OFFSET_SOUND + 0x28
|
|
#define REG_OFFSET_SOUNDBIAS_L REG_OFFSET_SOUND + 0x28
|
|
#define REG_OFFSET_SOUNDBIAS_H REG_OFFSET_SOUND + 0x29
|
|
#define REG_OFFSET_WAVE_RAM0 REG_OFFSET_SOUND + 0x30
|
|
#define REG_OFFSET_WAVE_RAM1 REG_OFFSET_SOUND + 0x34
|
|
#define REG_OFFSET_WAVE_RAM2 REG_OFFSET_SOUND + 0x38
|
|
#define REG_OFFSET_WAVE_RAM3 REG_OFFSET_SOUND + 0x3c
|
|
#define REG_OFFSET_FIFO_A REG_OFFSET_SOUND + 0x40
|
|
#define REG_OFFSET_FIFO_B REG_OFFSET_SOUND + 0x44
|
|
|
|
#define REG_OFFSET_DMA REG_OFFSET_SOUND + 0x50
|
|
#if !USE_NEW_DMA
|
|
#define REG_OFFSET_DMA0SAD REG_OFFSET_DMA
|
|
#define REG_OFFSET_DMA0DAD 0xb4
|
|
#define REG_OFFSET_DMA0CNT 0xb8
|
|
#define REG_OFFSET_DMA0CNT_L 0xb8
|
|
#define REG_OFFSET_DMA0CNT_H 0xba
|
|
#define REG_OFFSET_DMA1SAD 0xbc
|
|
#define REG_OFFSET_DMA1DAD 0xc0
|
|
#define REG_OFFSET_DMA1CNT 0xc4
|
|
#define REG_OFFSET_DMA1CNT_L 0xc4
|
|
#define REG_OFFSET_DMA1CNT_H 0xc6
|
|
#define REG_OFFSET_DMA2SAD 0xc8
|
|
#define REG_OFFSET_DMA2DAD 0xcc
|
|
#define REG_OFFSET_DMA2CNT 0xd0
|
|
#define REG_OFFSET_DMA2CNT_L 0xd0
|
|
#define REG_OFFSET_DMA2CNT_H 0xd2
|
|
#define REG_OFFSET_DMA3SAD 0xd4
|
|
#define REG_OFFSET_DMA3DAD 0xd8
|
|
#define REG_OFFSET_DMA3CNT 0xdc
|
|
#define REG_OFFSET_DMA3CNT_L 0xdc
|
|
#define REG_OFFSET_DMA3CNT_H 0xde
|
|
#else
|
|
// To fit this into the same memory footprint on 64bit,
|
|
// We need to put the control registers behind the pointers to avoid padding.
|
|
#define REG_OFFSET_DMA0SAD REG_OFFSET_DMA
|
|
#define REG_OFFSET_DMA1SAD (REG_OFFSET_DMA0SAD + sizeof(uintptr_t))
|
|
#define REG_OFFSET_DMA2SAD (REG_OFFSET_DMA1SAD + sizeof(uintptr_t))
|
|
#define REG_OFFSET_DMA3SAD (REG_OFFSET_DMA2SAD + sizeof(uintptr_t))
|
|
#define REG_OFFSET_DMA0DAD (REG_OFFSET_DMA3SAD + sizeof(uintptr_t))
|
|
#define REG_OFFSET_DMA1DAD (REG_OFFSET_DMA0DAD + sizeof(uintptr_t))
|
|
#define REG_OFFSET_DMA2DAD (REG_OFFSET_DMA1DAD + sizeof(uintptr_t))
|
|
#define REG_OFFSET_DMA3DAD (REG_OFFSET_DMA2DAD + sizeof(uintptr_t))
|
|
|
|
#define REG_OFFSET_DMA0CNT (REG_OFFSET_DMA3DAD + sizeof(uintptr_t))
|
|
#define REG_OFFSET_DMA0CNT_L (REG_OFFSET_DMA0CNT + 0)
|
|
#define REG_OFFSET_DMA0CNT_H (REG_OFFSET_DMA0CNT_L + sizeof(uint16_t))
|
|
#define REG_OFFSET_DMA1CNT (REG_OFFSET_DMA0CNT_H + sizeof(uint16_t))
|
|
#define REG_OFFSET_DMA1CNT_L (REG_OFFSET_DMA1CNT + 0)
|
|
#define REG_OFFSET_DMA1CNT_H (REG_OFFSET_DMA1CNT_L + sizeof(uint16_t))
|
|
#define REG_OFFSET_DMA2CNT (REG_OFFSET_DMA1CNT_H + sizeof(uint16_t))
|
|
#define REG_OFFSET_DMA2CNT_L (REG_OFFSET_DMA2CNT + 0)
|
|
#define REG_OFFSET_DMA2CNT_H (REG_OFFSET_DMA2CNT_L + sizeof(uint16_t))
|
|
#define REG_OFFSET_DMA3CNT (REG_OFFSET_DMA2CNT_H + sizeof(uint16_t))
|
|
#define REG_OFFSET_DMA3CNT_L (REG_OFFSET_DMA3CNT + 0)
|
|
#define REG_OFFSET_DMA3CNT_H (REG_OFFSET_DMA3CNT_L + sizeof(uint16_t))
|
|
#endif
|
|
|
|
#define REG_OFFSET_TMCNT 0x100
|
|
#define REG_OFFSET_TMCNT_L 0x100
|
|
#define REG_OFFSET_TMCNT_H 0x102
|
|
#define REG_OFFSET_TM0CNT 0x100
|
|
#define REG_OFFSET_TM0CNT_L 0x100
|
|
#define REG_OFFSET_TM0CNT_H 0x102
|
|
#define REG_OFFSET_TM1CNT 0x104
|
|
#define REG_OFFSET_TM1CNT_L 0x104
|
|
#define REG_OFFSET_TM1CNT_H 0x106
|
|
#define REG_OFFSET_TM2CNT 0x108
|
|
#define REG_OFFSET_TM2CNT_L 0x108
|
|
#define REG_OFFSET_TM2CNT_H 0x10a
|
|
#define REG_OFFSET_TM3CNT 0x10c
|
|
#define REG_OFFSET_TM3CNT_L 0x10c
|
|
#define REG_OFFSET_TM3CNT_H 0x10e
|
|
|
|
#define REG_OFFSET_SIOCNT 0x128
|
|
#define REG_OFFSET_SIODATA8 0x12a
|
|
#define REG_OFFSET_SIODATA32 0x120
|
|
#define REG_OFFSET_SIOMLT_SEND 0x12a
|
|
#define REG_OFFSET_SIOMLT_RECV 0x120
|
|
#define REG_OFFSET_SIOMULTI0 0x120
|
|
#define REG_OFFSET_SIOMULTI1 0x122
|
|
#define REG_OFFSET_SIOMULTI2 0x124
|
|
#define REG_OFFSET_SIOMULTI3 0x126
|
|
|
|
#define REG_OFFSET_KEYINPUT 0x130
|
|
#define REG_OFFSET_KEYCNT 0x132
|
|
|
|
#define REG_OFFSET_RCNT 0x134
|
|
|
|
#define REG_OFFSET_JOYCNT 0x140
|
|
#define REG_OFFSET_JOYSTAT 0x158
|
|
#define REG_OFFSET_JOY_RECV 0x150
|
|
#define REG_OFFSET_JOY_RECV_L 0x150
|
|
#define REG_OFFSET_JOY_RECV_H 0x152
|
|
#define REG_OFFSET_JOY_TRANS 0x154
|
|
#define REG_OFFSET_JOY_TRANS_L 0x154
|
|
#define REG_OFFSET_JOY_TRANS_H 0x156
|
|
|
|
#define REG_OFFSET_IME 0x208
|
|
#define REG_OFFSET_IE 0x200
|
|
#define REG_OFFSET_IF 0x202
|
|
|
|
#define REG_OFFSET_WAITCNT 0x204
|
|
|
|
// I/O register addresses
|
|
|
|
#define REG_ADDR_DISPCNT (REG_BASE + REG_OFFSET_DISPCNT)
|
|
#define REG_ADDR_DISPSTAT (REG_BASE + REG_OFFSET_DISPSTAT)
|
|
#define REG_ADDR_VCOUNT (REG_BASE + REG_OFFSET_VCOUNT)
|
|
#define REG_ADDR_BG0CNT (REG_BASE + REG_OFFSET_BG0CNT)
|
|
#define REG_ADDR_BG1CNT (REG_BASE + REG_OFFSET_BG1CNT)
|
|
#define REG_ADDR_BG2CNT (REG_BASE + REG_OFFSET_BG2CNT)
|
|
#define REG_ADDR_BG3CNT (REG_BASE + REG_OFFSET_BG3CNT)
|
|
#define REG_ADDR_BG0HOFS (REG_BASE + REG_OFFSET_BG0HOFS)
|
|
#define REG_ADDR_BG0VOFS (REG_BASE + REG_OFFSET_BG0VOFS)
|
|
#define REG_ADDR_BG1HOFS (REG_BASE + REG_OFFSET_BG1HOFS)
|
|
#define REG_ADDR_BG1VOFS (REG_BASE + REG_OFFSET_BG1VOFS)
|
|
#define REG_ADDR_BG2HOFS (REG_BASE + REG_OFFSET_BG2HOFS)
|
|
#define REG_ADDR_BG2VOFS (REG_BASE + REG_OFFSET_BG2VOFS)
|
|
#define REG_ADDR_BG3HOFS (REG_BASE + REG_OFFSET_BG3HOFS)
|
|
#define REG_ADDR_BG3VOFS (REG_BASE + REG_OFFSET_BG3VOFS)
|
|
#define REG_ADDR_BG2PA (REG_BASE + REG_OFFSET_BG2PA)
|
|
#define REG_ADDR_BG2PB (REG_BASE + REG_OFFSET_BG2PB)
|
|
#define REG_ADDR_BG2PC (REG_BASE + REG_OFFSET_BG2PC)
|
|
#define REG_ADDR_BG2PD (REG_BASE + REG_OFFSET_BG2PD)
|
|
#define REG_ADDR_BG2X (REG_BASE + REG_OFFSET_BG2X)
|
|
#define REG_ADDR_BG2X_L (REG_BASE + REG_OFFSET_BG2X_L)
|
|
#define REG_ADDR_BG2X_H (REG_BASE + REG_OFFSET_BG2X_H)
|
|
#define REG_ADDR_BG2Y (REG_BASE + REG_OFFSET_BG2Y)
|
|
#define REG_ADDR_BG2Y_L (REG_BASE + REG_OFFSET_BG2Y_L)
|
|
#define REG_ADDR_BG2Y_H (REG_BASE + REG_OFFSET_BG2Y_H)
|
|
#define REG_ADDR_BG3PA (REG_BASE + REG_OFFSET_BG3PA)
|
|
#define REG_ADDR_BG3PB (REG_BASE + REG_OFFSET_BG3PB)
|
|
#define REG_ADDR_BG3PC (REG_BASE + REG_OFFSET_BG3PC)
|
|
#define REG_ADDR_BG3PD (REG_BASE + REG_OFFSET_BG3PD)
|
|
#define REG_ADDR_BG3X (REG_BASE + REG_OFFSET_BG3X)
|
|
#define REG_ADDR_BG3X_L (REG_BASE + REG_OFFSET_BG3X_L)
|
|
#define REG_ADDR_BG3X_H (REG_BASE + REG_OFFSET_BG3X_H)
|
|
#define REG_ADDR_BG3Y (REG_BASE + REG_OFFSET_BG3Y)
|
|
#define REG_ADDR_BG3Y_L (REG_BASE + REG_OFFSET_BG3Y_L)
|
|
#define REG_ADDR_BG3Y_H (REG_BASE + REG_OFFSET_BG3Y_H)
|
|
#define REG_ADDR_WIN0H (REG_BASE + REG_OFFSET_WIN0H)
|
|
#define REG_ADDR_WIN1H (REG_BASE + REG_OFFSET_WIN1H)
|
|
#define REG_ADDR_WIN0V (REG_BASE + REG_OFFSET_WIN0V)
|
|
#define REG_ADDR_WIN1V (REG_BASE + REG_OFFSET_WIN1V)
|
|
#define REG_ADDR_WININ (REG_BASE + REG_OFFSET_WININ)
|
|
#define REG_ADDR_WINOUT (REG_BASE + REG_OFFSET_WINOUT)
|
|
#define REG_ADDR_MOSAIC (REG_BASE + REG_OFFSET_MOSAIC)
|
|
#define REG_ADDR_BLDCNT (REG_BASE + REG_OFFSET_BLDCNT)
|
|
#define REG_ADDR_BLDALPHA (REG_BASE + REG_OFFSET_BLDALPHA)
|
|
#define REG_ADDR_BLDY (REG_BASE + REG_OFFSET_BLDY)
|
|
|
|
#define REG_ADDR_SOUND1CNT_L (REG_BASE + REG_OFFSET_SOUND1CNT_L)
|
|
#define REG_ADDR_NR10 (REG_BASE + REG_OFFSET_NR10)
|
|
#define REG_ADDR_SOUND1CNT_H (REG_BASE + REG_OFFSET_SOUND1CNT_H)
|
|
#define REG_ADDR_NR11 (REG_BASE + REG_OFFSET_NR11)
|
|
#define REG_ADDR_NR12 (REG_BASE + REG_OFFSET_NR12)
|
|
#define REG_ADDR_SOUND1CNT_X (REG_BASE + REG_OFFSET_SOUND1CNT_X)
|
|
#define REG_ADDR_NR13 (REG_BASE + REG_OFFSET_NR13)
|
|
#define REG_ADDR_NR14 (REG_BASE + REG_OFFSET_NR14)
|
|
#define REG_ADDR_SOUND2CNT_L (REG_BASE + REG_OFFSET_SOUND2CNT_L)
|
|
#define REG_ADDR_NR21 (REG_BASE + REG_OFFSET_NR21)
|
|
#define REG_ADDR_NR22 (REG_BASE + REG_OFFSET_NR22)
|
|
#define REG_ADDR_SOUND2CNT_H (REG_BASE + REG_OFFSET_SOUND2CNT_H)
|
|
#define REG_ADDR_NR23 (REG_BASE + REG_OFFSET_NR23)
|
|
#define REG_ADDR_NR24 (REG_BASE + REG_OFFSET_NR24)
|
|
#define REG_ADDR_SOUND3CNT_L (REG_BASE + REG_OFFSET_SOUND3CNT_L)
|
|
#define REG_ADDR_NR30 (REG_BASE + REG_OFFSET_NR30)
|
|
#define REG_ADDR_SOUND3CNT_H (REG_BASE + REG_OFFSET_SOUND3CNT_H)
|
|
#define REG_ADDR_NR31 (REG_BASE + REG_OFFSET_NR31)
|
|
#define REG_ADDR_NR32 (REG_BASE + REG_OFFSET_NR32)
|
|
#define REG_ADDR_SOUND3CNT_X (REG_BASE + REG_OFFSET_SOUND3CNT_X)
|
|
#define REG_ADDR_NR33 (REG_BASE + REG_OFFSET_NR33)
|
|
#define REG_ADDR_NR34 (REG_BASE + REG_OFFSET_NR34)
|
|
#define REG_ADDR_SOUND4CNT_L (REG_BASE + REG_OFFSET_SOUND4CNT_L)
|
|
#define REG_ADDR_NR41 (REG_BASE + REG_OFFSET_NR41)
|
|
#define REG_ADDR_NR42 (REG_BASE + REG_OFFSET_NR42)
|
|
#define REG_ADDR_SOUND4CNT_H (REG_BASE + REG_OFFSET_SOUND4CNT_H)
|
|
#define REG_ADDR_NR43 (REG_BASE + REG_OFFSET_NR43)
|
|
#define REG_ADDR_NR44 (REG_BASE + REG_OFFSET_NR44)
|
|
#define REG_ADDR_SOUNDCNT_L (REG_BASE + REG_OFFSET_SOUNDCNT_L)
|
|
#define REG_ADDR_NR50 (REG_BASE + REG_OFFSET_NR50)
|
|
#define REG_ADDR_NR51 (REG_BASE + REG_OFFSET_NR51)
|
|
#define REG_ADDR_SOUNDCNT_H (REG_BASE + REG_OFFSET_SOUNDCNT_H)
|
|
#define REG_ADDR_SOUNDCNT_X (REG_BASE + REG_OFFSET_SOUNDCNT_X)
|
|
#define REG_ADDR_NR52 (REG_BASE + REG_OFFSET_NR52)
|
|
#define REG_ADDR_SOUNDBIAS (REG_BASE + REG_OFFSET_SOUNDBIAS)
|
|
#define REG_ADDR_SOUNDBIAS_L (REG_BASE + REG_OFFSET_SOUNDBIAS_L)
|
|
#define REG_ADDR_SOUNDBIAS_H (REG_BASE + REG_OFFSET_SOUNDBIAS_H)
|
|
#define REG_ADDR_WAVE_RAM0 (REG_BASE + REG_OFFSET_WAVE_RAM0)
|
|
#define REG_ADDR_WAVE_RAM1 (REG_BASE + REG_OFFSET_WAVE_RAM1)
|
|
#define REG_ADDR_WAVE_RAM2 (REG_BASE + REG_OFFSET_WAVE_RAM2)
|
|
#define REG_ADDR_WAVE_RAM3 (REG_BASE + REG_OFFSET_WAVE_RAM3)
|
|
#define REG_ADDR_FIFO_A (REG_BASE + REG_OFFSET_FIFO_A)
|
|
#define REG_ADDR_FIFO_B (REG_BASE + REG_OFFSET_FIFO_B)
|
|
|
|
#define REG_ADDR_DMA0SAD (REG_BASE + REG_OFFSET_DMA0SAD)
|
|
#define REG_ADDR_DMA0DAD (REG_BASE + REG_OFFSET_DMA0DAD)
|
|
#define REG_ADDR_DMA0CNT (REG_BASE + REG_OFFSET_DMA0CNT)
|
|
#define REG_ADDR_DMA0CNT_L (REG_BASE + REG_OFFSET_DMA0CNT_L)
|
|
#define REG_ADDR_DMA0CNT_H (REG_BASE + REG_OFFSET_DMA0CNT_H)
|
|
#define REG_ADDR_DMA1SAD (REG_BASE + REG_OFFSET_DMA1SAD)
|
|
#define REG_ADDR_DMA1DAD (REG_BASE + REG_OFFSET_DMA1DAD)
|
|
#define REG_ADDR_DMA1CNT (REG_BASE + REG_OFFSET_DMA1CNT)
|
|
#define REG_ADDR_DMA1CNT_L (REG_BASE + REG_OFFSET_DMA1CNT_L)
|
|
#define REG_ADDR_DMA1CNT_H (REG_BASE + REG_OFFSET_DMA1CNT_H)
|
|
#define REG_ADDR_DMA2SAD (REG_BASE + REG_OFFSET_DMA2SAD)
|
|
#define REG_ADDR_DMA2DAD (REG_BASE + REG_OFFSET_DMA2DAD)
|
|
#define REG_ADDR_DMA2CNT (REG_BASE + REG_OFFSET_DMA2CNT)
|
|
#define REG_ADDR_DMA2CNT_L (REG_BASE + REG_OFFSET_DMA2CNT_L)
|
|
#define REG_ADDR_DMA2CNT_H (REG_BASE + REG_OFFSET_DMA2CNT_H)
|
|
#define REG_ADDR_DMA3SAD (REG_BASE + REG_OFFSET_DMA3SAD)
|
|
#define REG_ADDR_DMA3DAD (REG_BASE + REG_OFFSET_DMA3DAD)
|
|
#define REG_ADDR_DMA3CNT (REG_BASE + REG_OFFSET_DMA3CNT)
|
|
#define REG_ADDR_DMA3CNT_L (REG_BASE + REG_OFFSET_DMA3CNT_L)
|
|
#define REG_ADDR_DMA3CNT_H (REG_BASE + REG_OFFSET_DMA3CNT_H)
|
|
|
|
#define REG_ADDR_TMCNT (REG_BASE + REG_OFFSET_TMCNT)
|
|
#define REG_ADDR_TMCNT_L (REG_BASE + REG_OFFSET_TMCNT_L)
|
|
#define REG_ADDR_TMCNT_H (REG_BASE + REG_OFFSET_TMCNT_H)
|
|
#define REG_ADDR_TM0CNT (REG_BASE + REG_OFFSET_TM0CNT)
|
|
#define REG_ADDR_TM0CNT_L (REG_BASE + REG_OFFSET_TM0CNT_L)
|
|
#define REG_ADDR_TM0CNT_H (REG_BASE + REG_OFFSET_TM0CNT_H)
|
|
#define REG_ADDR_TM1CNT (REG_BASE + REG_OFFSET_TM1CNT)
|
|
#define REG_ADDR_TM1CNT_L (REG_BASE + REG_OFFSET_TM1CNT_L)
|
|
#define REG_ADDR_TM1CNT_H (REG_BASE + REG_OFFSET_TM1CNT_H)
|
|
#define REG_ADDR_TM2CNT (REG_BASE + REG_OFFSET_TM2CNT)
|
|
#define REG_ADDR_TM2CNT_L (REG_BASE + REG_OFFSET_TM2CNT_L)
|
|
#define REG_ADDR_TM2CNT_H (REG_BASE + REG_OFFSET_TM2CNT_H)
|
|
#define REG_ADDR_TM3CNT (REG_BASE + REG_OFFSET_TM3CNT)
|
|
#define REG_ADDR_TM3CNT_L (REG_BASE + REG_OFFSET_TM3CNT_L)
|
|
#define REG_ADDR_TM3CNT_H (REG_BASE + REG_OFFSET_TM3CNT_H)
|
|
|
|
#define REG_ADDR_SIOCNT (REG_BASE + REG_OFFSET_SIOCNT)
|
|
#define REG_ADDR_SIODATA8 (REG_BASE + REG_OFFSET_SIODATA8)
|
|
#define REG_ADDR_SIODATA32 (REG_BASE + REG_OFFSET_SIODATA32)
|
|
#define REG_ADDR_SIOMLT_SEND (REG_BASE + REG_OFFSET_SIOMLT_SEND)
|
|
#define REG_ADDR_SIOMLT_RECV (REG_BASE + REG_OFFSET_SIOMLT_RECV)
|
|
#define REG_ADDR_SIOMULTI0 (REG_BASE + REG_OFFSET_SIOMULTI0)
|
|
#define REG_ADDR_SIOMULTI1 (REG_BASE + REG_OFFSET_SIOMULTI1)
|
|
#define REG_ADDR_SIOMULTI2 (REG_BASE + REG_OFFSET_SIOMULTI2)
|
|
#define REG_ADDR_SIOMULTI3 (REG_BASE + REG_OFFSET_SIOMULTI3)
|
|
|
|
#define REG_ADDR_KEYINPUT (REG_BASE + REG_OFFSET_KEYINPUT)
|
|
#define REG_ADDR_KEYCNT (REG_BASE + REG_OFFSET_KEYCNT)
|
|
|
|
#define REG_ADDR_RCNT (REG_BASE + REG_OFFSET_RCNT)
|
|
|
|
#define REG_ADDR_JOYCNT (REG_BASE + REG_OFFSET_JOYCNT)
|
|
#define REG_ADDR_JOYSTAT (REG_BASE + REG_OFFSET_JOYSTAT)
|
|
#define REG_ADDR_JOY_RECV (REG_BASE + REG_OFFSET_JOY_RECV)
|
|
#define REG_ADDR_JOY_RECV_L (REG_BASE + REG_OFFSET_JOY_RECV_L)
|
|
#define REG_ADDR_JOY_RECV_H (REG_BASE + REG_OFFSET_JOY_RECV_H)
|
|
#define REG_ADDR_JOY_TRANS (REG_BASE + REG_OFFSET_JOY_TRANS)
|
|
#define REG_ADDR_JOY_TRANS_L (REG_BASE + REG_OFFSET_JOY_TRANS_L)
|
|
#define REG_ADDR_JOY_TRANS_H (REG_BASE + REG_OFFSET_JOY_TRANS_H)
|
|
|
|
#define REG_ADDR_IME (REG_BASE + REG_OFFSET_IME)
|
|
#define REG_ADDR_IE (REG_BASE + REG_OFFSET_IE)
|
|
#define REG_ADDR_IF (REG_BASE + REG_OFFSET_IF)
|
|
|
|
#define REG_ADDR_WAITCNT (REG_BASE + REG_OFFSET_WAITCNT)
|
|
|
|
// I/O registers
|
|
|
|
#define REG_DISPCNT (*(reg_u16 *)REG_ADDR_DISPCNT)
|
|
#define REG_DISPSTAT (*(reg_u16 *)REG_ADDR_DISPSTAT)
|
|
#define REG_VCOUNT (*(reg_u16 *)REG_ADDR_VCOUNT)
|
|
#define REG_BG0CNT (*(reg_u16 *)REG_ADDR_BG0CNT)
|
|
#define REG_BG1CNT (*(reg_u16 *)REG_ADDR_BG1CNT)
|
|
#define REG_BG2CNT (*(reg_u16 *)REG_ADDR_BG2CNT)
|
|
#define REG_BG3CNT (*(reg_u16 *)REG_ADDR_BG3CNT)
|
|
#define REG_BG0HOFS (*(reg_u16 *)REG_ADDR_BG0HOFS)
|
|
#define REG_BG0VOFS (*(reg_u16 *)REG_ADDR_BG0VOFS)
|
|
#define REG_BG1HOFS (*(reg_u16 *)REG_ADDR_BG1HOFS)
|
|
#define REG_BG1VOFS (*(reg_u16 *)REG_ADDR_BG1VOFS)
|
|
#define REG_BG2HOFS (*(reg_u16 *)REG_ADDR_BG2HOFS)
|
|
#define REG_BG2VOFS (*(reg_u16 *)REG_ADDR_BG2VOFS)
|
|
#define REG_BG3HOFS (*(reg_u16 *)REG_ADDR_BG3HOFS)
|
|
#define REG_BG3VOFS (*(reg_u16 *)REG_ADDR_BG3VOFS)
|
|
#define REG_BG2PA (*(reg_u16 *)REG_ADDR_BG2PA)
|
|
#define REG_BG2PB (*(reg_u16 *)REG_ADDR_BG2PB)
|
|
#define REG_BG2PC (*(reg_u16 *)REG_ADDR_BG2PC)
|
|
#define REG_BG2PD (*(reg_u16 *)REG_ADDR_BG2PD)
|
|
#define REG_BG2X (*(reg_u32 *)REG_ADDR_BG2X)
|
|
#define REG_BG2X_L (*(reg_u16 *)REG_ADDR_BG2X_L)
|
|
#define REG_BG2X_H (*(reg_u16 *)REG_ADDR_BG2X_H)
|
|
#define REG_BG2Y (*(reg_u32 *)REG_ADDR_BG2Y)
|
|
#define REG_BG2Y_L (*(reg_u16 *)REG_ADDR_BG2Y_L)
|
|
#define REG_BG2Y_H (*(reg_u16 *)REG_ADDR_BG2Y_H)
|
|
#define REG_BG3PA (*(reg_u16 *)REG_ADDR_BG3PA)
|
|
#define REG_BG3PB (*(reg_u16 *)REG_ADDR_BG3PB)
|
|
#define REG_BG3PC (*(reg_u16 *)REG_ADDR_BG3PC)
|
|
#define REG_BG3PD (*(reg_u16 *)REG_ADDR_BG3PD)
|
|
#define REG_BG3X (*(reg_u32 *)REG_ADDR_BG3X)
|
|
#define REG_BG3X_L (*(reg_u16 *)REG_ADDR_BG3X_L)
|
|
#define REG_BG3X_H (*(reg_u16 *)REG_ADDR_BG3X_H)
|
|
#define REG_BG3Y (*(reg_u32 *)REG_ADDR_BG3Y)
|
|
#define REG_BG3Y_L (*(reg_u16 *)REG_ADDR_BG3Y_L)
|
|
#define REG_BG3Y_H (*(reg_u16 *)REG_ADDR_BG3Y_H)
|
|
#define REG_WIN0H (*(reg_wint *)REG_ADDR_WIN0H)
|
|
#define REG_WIN1H (*(reg_wint *)REG_ADDR_WIN1H)
|
|
#define REG_WIN0V (*(reg_wint *)REG_ADDR_WIN0V)
|
|
#define REG_WIN1V (*(reg_wint *)REG_ADDR_WIN1V)
|
|
#define REG_WININ (*(reg_wint *)REG_ADDR_WININ)
|
|
#define REG_WINOUT (*(reg_wint *)REG_ADDR_WINOUT)
|
|
#define REG_MOSAIC (*(reg_u16 *)REG_ADDR_MOSAIC)
|
|
#define REG_BLDCNT (*(reg_u16 *)REG_ADDR_BLDCNT)
|
|
#define REG_BLDALPHA (*(reg_u16 *)REG_ADDR_BLDALPHA)
|
|
#define REG_BLDY (*(reg_u16 *)REG_ADDR_BLDY)
|
|
|
|
#define REG_SOUND1CNT_L (*(reg_u16 *)REG_ADDR_SOUND1CNT_L)
|
|
#define REG_NR10 (*(reg_u8 *)REG_ADDR_NR10)
|
|
#define REG_SOUND1CNT_H (*(reg_u16 *)REG_ADDR_SOUND1CNT_H)
|
|
#define REG_NR11 (*(reg_u8 *)REG_ADDR_NR11)
|
|
#define REG_NR12 (*(reg_u8 *)REG_ADDR_NR12)
|
|
#define REG_SOUND1CNT_X (*(reg_u16 *)REG_ADDR_SOUND1CNT_X)
|
|
#define REG_NR13 (*(reg_u8 *)REG_ADDR_NR13)
|
|
#define REG_NR14 (*(reg_u8 *)REG_ADDR_NR14)
|
|
#define REG_SOUND2CNT_L (*(reg_u16 *)REG_ADDR_SOUND2CNT_L)
|
|
#define REG_NR21 (*(reg_u8 *)REG_ADDR_NR21)
|
|
#define REG_NR22 (*(reg_u8 *)REG_ADDR_NR22)
|
|
#define REG_SOUND2CNT_H (*(reg_u16 *)REG_ADDR_SOUND2CNT_H)
|
|
#define REG_NR23 (*(reg_u8 *)REG_ADDR_NR23)
|
|
#define REG_NR24 (*(reg_u8 *)REG_ADDR_NR24)
|
|
#define REG_SOUND3CNT_L (*(reg_u16 *)REG_ADDR_SOUND3CNT_L)
|
|
#define REG_NR30 (*(reg_u8 *)REG_ADDR_NR30)
|
|
#define REG_SOUND3CNT_H (*(reg_u16 *)REG_ADDR_SOUND3CNT_H)
|
|
#define REG_NR31 (*(reg_u8 *)REG_ADDR_NR31)
|
|
#define REG_NR32 (*(reg_u8 *)REG_ADDR_NR32)
|
|
#define REG_SOUND3CNT_X (*(reg_u16 *)REG_ADDR_SOUND3CNT_X)
|
|
#define REG_NR33 (*(reg_u8 *)REG_ADDR_NR33)
|
|
#define REG_NR34 (*(reg_u8 *)REG_ADDR_NR34)
|
|
#define REG_SOUND4CNT_L (*(reg_u16 *)REG_ADDR_SOUND4CNT_L)
|
|
#define REG_NR41 (*(reg_u8 *)REG_ADDR_NR41)
|
|
#define REG_NR42 (*(reg_u8 *)REG_ADDR_NR42)
|
|
#define REG_SOUND4CNT_H (*(reg_u16 *)REG_ADDR_SOUND4CNT_H)
|
|
#define REG_NR43 (*(reg_u8 *)REG_ADDR_NR43)
|
|
#define REG_NR44 (*(reg_u8 *)REG_ADDR_NR44)
|
|
#define REG_SOUNDCNT_L (*(reg_u16 *)REG_ADDR_SOUNDCNT_L)
|
|
#define REG_NR50 (*(reg_u8 *)REG_ADDR_NR50)
|
|
#define REG_NR51 (*(reg_u8 *)REG_ADDR_NR51)
|
|
#define REG_SOUNDCNT_H (*(reg_u16 *)REG_ADDR_SOUNDCNT_H)
|
|
#define REG_SOUNDCNT_X (*(reg_u16 *)REG_ADDR_SOUNDCNT_X)
|
|
#define REG_NR52 (*(reg_u8 *)REG_ADDR_NR52)
|
|
#define REG_SOUNDBIAS (*(reg_u16 *)REG_ADDR_SOUNDBIAS)
|
|
#define REG_SOUNDBIAS_L (*(reg_u8 *)REG_ADDR_SOUNDBIAS_L)
|
|
#define REG_SOUNDBIAS_H (*(reg_u8 *)REG_ADDR_SOUNDBIAS_H)
|
|
#define REG_WAVE_RAM0 (*(reg_u32 *)REG_ADDR_WAVE_RAM0)
|
|
#define REG_WAVE_RAM1 (*(reg_u32 *)REG_ADDR_WAVE_RAM1)
|
|
#define REG_WAVE_RAM2 (*(reg_u32 *)REG_ADDR_WAVE_RAM2)
|
|
#define REG_WAVE_RAM3 (*(reg_u32 *)REG_ADDR_WAVE_RAM3)
|
|
#define REG_FIFO_A (*(reg_u32 *)REG_ADDR_FIFO_A)
|
|
#define REG_FIFO_B (*(reg_u32 *)REG_ADDR_FIFO_B)
|
|
|
|
#define REG_DMA0SAD (*(volatile uintptr_t *)REG_ADDR_DMA0SAD)
|
|
#define REG_DMA0DAD (*(volatile uintptr_t *)REG_ADDR_DMA0DAD)
|
|
#define REG_DMA0CNT (*(reg_u32 *)REG_ADDR_DMA0CNT)
|
|
#define REG_DMA0CNT_L (*(reg_u16 *)REG_ADDR_DMA0CNT_L)
|
|
#define REG_DMA0CNT_H (*(reg_u16 *)REG_ADDR_DMA0CNT_H)
|
|
|
|
#define REG_DMA1SAD (*(volatile uintptr_t *)REG_ADDR_DMA1SAD)
|
|
#define REG_DMA1DAD (*(volatile uintptr_t *)REG_ADDR_DMA1DAD)
|
|
#define REG_DMA1CNT (*(reg_u32 *)REG_ADDR_DMA1CNT)
|
|
#define REG_DMA1CNT_L (*(reg_u16 *)REG_ADDR_DMA1CNT_L)
|
|
#define REG_DMA1CNT_H (*(reg_u16 *)REG_ADDR_DMA1CNT_H)
|
|
|
|
#define REG_DMA2SAD (*(volatile uintptr_t *)REG_ADDR_DMA2SAD)
|
|
#define REG_DMA2DAD (*(volatile uintptr_t *)REG_ADDR_DMA2DAD)
|
|
#define REG_DMA2CNT (*(reg_u32 *)REG_ADDR_DMA2CNT)
|
|
#define REG_DMA2CNT_L (*(reg_u16 *)REG_ADDR_DMA2CNT_L)
|
|
#define REG_DMA2CNT_H (*(reg_u16 *)REG_ADDR_DMA2CNT_H)
|
|
|
|
#define REG_DMA3SAD (*(volatile uintptr_t *)REG_ADDR_DMA3SAD)
|
|
#define REG_DMA3DAD (*(volatile uintptr_t *)REG_ADDR_DMA3DAD)
|
|
#define REG_DMA3CNT (*(reg_u32 *)REG_ADDR_DMA3CNT)
|
|
#define REG_DMA3CNT_L (*(reg_u16 *)REG_ADDR_DMA3CNT_L)
|
|
#define REG_DMA3CNT_H (*(reg_u16 *)REG_ADDR_DMA3CNT_H)
|
|
|
|
#define REG_TMCNT(n) (*(reg_u16 *)(REG_ADDR_TMCNT + ((n) * 4)))
|
|
#define REG_TM0CNT (*(reg_u32 *)REG_ADDR_TM0CNT)
|
|
#define REG_TM0CNT_L (*(reg_u16 *)REG_ADDR_TM0CNT_L)
|
|
#define REG_TM0CNT_H (*(reg_u16 *)REG_ADDR_TM0CNT_H)
|
|
#define REG_TM1CNT (*(reg_u32 *)REG_ADDR_TM1CNT)
|
|
#define REG_TM1CNT_L (*(reg_u16 *)REG_ADDR_TM1CNT_L)
|
|
#define REG_TM1CNT_H (*(reg_u16 *)REG_ADDR_TM1CNT_H)
|
|
#define REG_TM2CNT (*(reg_u32 *)REG_ADDR_TM2CNT)
|
|
#define REG_TM2CNT_L (*(reg_u16 *)REG_ADDR_TM2CNT_L)
|
|
#define REG_TM2CNT_H (*(reg_u16 *)REG_ADDR_TM2CNT_H)
|
|
#define REG_TM3CNT (*(reg_u32 *)REG_ADDR_TM3CNT)
|
|
#define REG_TM3CNT_L (*(reg_u16 *)REG_ADDR_TM3CNT_L)
|
|
#define REG_TM3CNT_H (*(reg_u16 *)REG_ADDR_TM3CNT_H)
|
|
|
|
#define REG_SIOCNT (*(reg_u16 *)REG_ADDR_SIOCNT)
|
|
#define REG_SIOCNT_32 (*(reg_u32 *)REG_ADDR_SIOCNT)
|
|
#define REG_SIODATA8 (*(reg_u16 *)REG_ADDR_SIODATA8)
|
|
#define REG_SIODATA32 (*(reg_u32 *)REG_ADDR_SIODATA32)
|
|
#define REG_SIOMLT_SEND (*(reg_u16 *)REG_ADDR_SIOMLT_SEND)
|
|
#define REG_SIOMLT_RECV (*(reg_u64 *)REG_ADDR_SIOMLT_RECV)
|
|
#define REG_SIOMULTI0 (*(reg_u16 *)REG_ADDR_SIOMULTI0)
|
|
#define REG_SIOMULTI1 (*(reg_u16 *)REG_ADDR_SIOMULTI1)
|
|
#define REG_SIOMULTI2 (*(reg_u16 *)REG_ADDR_SIOMULTI2)
|
|
#define REG_SIOMULTI3 (*(reg_u16 *)REG_ADDR_SIOMULTI3)
|
|
|
|
#define REG_KEYINPUT (*(reg_u16 *)REG_ADDR_KEYINPUT)
|
|
#define REG_KEYCNT (*(reg_u16 *)REG_ADDR_KEYCNT)
|
|
|
|
#define REG_RCNT (*(reg_u16 *)REG_ADDR_RCNT)
|
|
|
|
#define REG_IME (*(reg_u16 *)REG_ADDR_IME)
|
|
#define REG_IE (*(reg_u16 *)REG_ADDR_IE)
|
|
#define REG_IF (*(reg_u16 *)REG_ADDR_IF)
|
|
|
|
#define REG_WAITCNT (*(reg_u16 *)REG_ADDR_WAITCNT)
|
|
|
|
// I/O register fields
|
|
|
|
// DISPCNT
|
|
#define DISPCNT_MODE_0 0x0000 // BG0: text, BG1: text, BG2: text, BG3: text
|
|
#define DISPCNT_MODE_1 0x0001 // BG0: text, BG1: text, BG2: affine, BG3: off
|
|
#define DISPCNT_MODE_2 0x0002 // BG0: off, BG1: off, BG2: affine, BG3: affine
|
|
#define DISPCNT_MODE_3 0x0003 // Bitmap mode, 240x160, BGR555 color
|
|
#define DISPCNT_MODE_4 0x0004 // Bitmap mode, 240x160, 256 color palette
|
|
#define DISPCNT_MODE_5 0x0005 // Bitmap mode, 160x128, BGR555 color
|
|
#define DISPCNT_OBJ_1D_MAP 0x0040
|
|
#define DISPCNT_FORCED_BLANK 0x0080
|
|
#define DISPCNT_BG0_ON 0x0100
|
|
#define DISPCNT_BG1_ON 0x0200
|
|
#define DISPCNT_BG2_ON 0x0400
|
|
#define DISPCNT_BG3_ON 0x0800
|
|
#define DISPCNT_BG_ALL_ON 0x0F00
|
|
#define DISPCNT_OBJ_ON 0x1000
|
|
#define DISPCNT_WIN0_ON 0x2000
|
|
#define DISPCNT_WIN1_ON 0x4000
|
|
#define DISPCNT_OBJWIN_ON 0x8000
|
|
|
|
// DISPSTAT
|
|
#define DISPSTAT_VBLANK 0x0001 // in V-Blank
|
|
#define DISPSTAT_HBLANK 0x0002 // in H-Blank
|
|
#define DISPSTAT_VCOUNT 0x0004 // V-Count match
|
|
#define DISPSTAT_VBLANK_INTR 0x0008 // V-Blank interrupt enabled
|
|
#define DISPSTAT_HBLANK_INTR 0x0010 // H-Blank interrupt enabled
|
|
#define DISPSTAT_VCOUNT_INTR 0x0020 // V-Count interrupt enabled
|
|
|
|
// BGCNT
|
|
// Values 0 - 3. Lower priority BGs will be drawn on top of higher priority BGs.
|
|
#define BGCNT_PRIORITY(n) (n)
|
|
// Values 0 - 3. Base block for tile pixel data.
|
|
// Target pointer: BG_CHAR_ADDR(n)
|
|
#define BGCNT_CHARBASE(n) ((n) << 2)
|
|
#define BGCNT_MOSAIC 0x0040
|
|
#define BGCNT_16COLOR 0x0000 // 4 bits per pixel
|
|
#define BGCNT_256COLOR 0x0080 // 8 bits per pixel
|
|
#define BGCNT_SCREENBASE(n) ((n) << 8) // Values 0 - 31. Base block for tile map.
|
|
#if !WIDESCREEN_HACK
|
|
#define BGCNT_SCREENBASE_MASK 0x1F00
|
|
#else
|
|
// Luckily BGCNT_WRAP is not used with text-mode backgrounds, which stage maps are.
|
|
#define BGCNT_SCREENBASE_MASK 0x3F00
|
|
#endif
|
|
#define BGCNT_WRAP 0x2000 // Only affects affine BGs. Text BGs wrap by default.
|
|
#define BGCNT_TXT256x256 0x0000 // Internal screen size size of text mode BG in pixels.
|
|
#define BGCNT_TXT512x256 0x4000
|
|
#define BGCNT_TXT256x512 0x8000
|
|
#define BGCNT_TXT512x512 0xC000
|
|
#define BGCNT_AFF128x128 0x0000 // Internal screen size size of affine mode BG in pixels.
|
|
#define BGCNT_AFF256x256 0x4000
|
|
#define BGCNT_AFF512x512 0x8000
|
|
#define BGCNT_AFF1024x1024 0xC000
|
|
|
|
// WININ/OUT
|
|
#define WININ_WIN0_BG0 (1 << 0)
|
|
#define WININ_WIN0_BG1 (1 << 1)
|
|
#define WININ_WIN0_BG2 (1 << 2)
|
|
#define WININ_WIN0_BG3 (1 << 3)
|
|
#define WININ_WIN0_BG_ALL (WININ_WIN0_BG0 | WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_BG3)
|
|
#define WININ_WIN0_OBJ (1 << 4)
|
|
#define WININ_WIN0_CLR (1 << 5)
|
|
#define WININ_WIN0_ALL (WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR)
|
|
#define WININ_WIN1_BG0 (1 << 8)
|
|
#define WININ_WIN1_BG1 (1 << 9)
|
|
#define WININ_WIN1_BG2 (1 << 10)
|
|
#define WININ_WIN1_BG3 (1 << 11)
|
|
#define WININ_WIN1_BG_ALL (WININ_WIN1_BG0 | WININ_WIN1_BG1 | WININ_WIN1_BG2 | WININ_WIN1_BG3)
|
|
#define WININ_WIN1_OBJ (1 << 12)
|
|
#define WININ_WIN1_CLR (1 << 13)
|
|
#define WININ_WIN1_ALL (WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR)
|
|
|
|
#define WINOUT_WIN01_BG0 (1 << 0)
|
|
#define WINOUT_WIN01_BG1 (1 << 1)
|
|
#define WINOUT_WIN01_BG2 (1 << 2)
|
|
#define WINOUT_WIN01_BG3 (1 << 3)
|
|
#define WINOUT_WIN01_BG_ALL (WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3)
|
|
#define WINOUT_WIN01_OBJ (1 << 4)
|
|
#define WINOUT_WIN01_CLR (1 << 5)
|
|
#define WINOUT_WIN01_ALL (WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR)
|
|
#define WINOUT_WINOBJ_BG0 (1 << 8)
|
|
#define WINOUT_WINOBJ_BG1 (1 << 9)
|
|
#define WINOUT_WINOBJ_BG2 (1 << 10)
|
|
#define WINOUT_WINOBJ_BG3 (1 << 11)
|
|
#define WINOUT_WINOBJ_BG_ALL (WINOUT_WINOBJ_BG0 | WINOUT_WINOBJ_BG1 | WINOUT_WINOBJ_BG2 | WINOUT_WINOBJ_BG3)
|
|
#define WINOUT_WINOBJ_OBJ (1 << 12)
|
|
#define WINOUT_WINOBJ_CLR (1 << 13)
|
|
#define WINOUT_WINOBJ_ALL (WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR)
|
|
|
|
// BLDCNT
|
|
// Bits 0-5 select layers for the 1st target
|
|
#define BLDCNT_TGT1_BG0 (1 << 0)
|
|
#define BLDCNT_TGT1_BG1 (1 << 1)
|
|
#define BLDCNT_TGT1_BG2 (1 << 2)
|
|
#define BLDCNT_TGT1_BG3 (1 << 3)
|
|
#define BLDCNT_TGT1_OBJ (1 << 4)
|
|
#define BLDCNT_TGT1_BD (1 << 5)
|
|
#define BLDCNT_TGT1_ALL (BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD)
|
|
// Bits 6-7 select the special effect
|
|
#define BLDCNT_EFFECT_NONE (0 << 6) // no special effect
|
|
#define BLDCNT_EFFECT_BLEND (1 << 6) // 1st+2nd targets mixed (controlled by BLDALPHA)
|
|
#define BLDCNT_EFFECT_LIGHTEN (2 << 6) // 1st target becomes whiter (controlled by BLDY)
|
|
#define BLDCNT_EFFECT_DARKEN (3 << 6) // 1st target becomes blacker (controlled by BLDY)
|
|
// Bits 8-13 select layers for the 2nd target
|
|
#define BLDCNT_TGT2_BG0 (1 << 8)
|
|
#define BLDCNT_TGT2_BG1 (1 << 9)
|
|
#define BLDCNT_TGT2_BG2 (1 << 10)
|
|
#define BLDCNT_TGT2_BG3 (1 << 11)
|
|
#define BLDCNT_TGT2_OBJ (1 << 12)
|
|
#define BLDCNT_TGT2_BD (1 << 13)
|
|
#define BLDCNT_TGT2_ALL (BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD)
|
|
|
|
// BLDALPHA
|
|
#define BLDALPHA_BLEND(target1, target2) (((target2) << 8) | (target1))
|
|
|
|
// SOUNDCNT_H
|
|
#define SOUND_CGB_MIX_QUARTER 0x0000
|
|
#define SOUND_CGB_MIX_HALF 0x0001
|
|
#define SOUND_CGB_MIX_FULL 0x0002
|
|
#define SOUND_A_MIX_HALF 0x0000
|
|
#define SOUND_A_MIX_FULL 0x0004
|
|
#define SOUND_B_MIX_HALF 0x0000
|
|
#define SOUND_B_MIX_FULL 0x0008
|
|
#define SOUND_ALL_MIX_FULL 0x000E
|
|
#define SOUND_A_RIGHT_OUTPUT 0x0100
|
|
#define SOUND_A_LEFT_OUTPUT 0x0200
|
|
#define SOUND_A_TIMER_0 0x0000
|
|
#define SOUND_A_TIMER_1 0x0400
|
|
#define SOUND_A_FIFO_RESET 0x0800
|
|
#define SOUND_B_RIGHT_OUTPUT 0x1000
|
|
#define SOUND_B_LEFT_OUTPUT 0x2000
|
|
#define SOUND_B_TIMER_0 0x0000
|
|
#define SOUND_B_TIMER_1 0x4000
|
|
#define SOUND_B_FIFO_RESET 0x8000
|
|
|
|
// SOUNDCNT_X
|
|
#define SOUND_1_ON 0x0001
|
|
#define SOUND_2_ON 0x0002
|
|
#define SOUND_3_ON 0x0004
|
|
#define SOUND_4_ON 0x0008
|
|
#define SOUND_MASTER_ENABLE 0x0080
|
|
|
|
// DMA
|
|
#define DMA_DEST_INC 0x0000
|
|
#define DMA_DEST_DEC 0x0020
|
|
#define DMA_DEST_FIXED 0x0040
|
|
#define DMA_DEST_RELOAD 0x0060
|
|
#define DMA_SRC_INC 0x0000
|
|
#define DMA_SRC_DEC 0x0080
|
|
#define DMA_SRC_FIXED 0x0100
|
|
#define DMA_REPEAT 0x0200
|
|
#define DMA_16BIT 0x0000
|
|
#define DMA_32BIT 0x0400
|
|
#define DMA_DREQ_ON 0x0800
|
|
#define DMA_START_NOW 0x0000
|
|
#define DMA_START_VBLANK 0x1000
|
|
#define DMA_START_HBLANK 0x2000
|
|
#define DMA_START_SPECIAL 0x3000
|
|
#define DMA_START_MASK 0x3000
|
|
#define DMA_INTR_ENABLE 0x4000
|
|
#define DMA_ENABLE 0x8000
|
|
|
|
// timer
|
|
#define TIMER_1CLK 0x00
|
|
#define TIMER_64CLK 0x01
|
|
#define TIMER_256CLK 0x02
|
|
#define TIMER_1024CLK 0x03
|
|
#define TIMER_INTR_ENABLE 0x40
|
|
#define TIMER_ENABLE 0x80
|
|
|
|
// serial
|
|
// serial
|
|
#define SIO_ID 0x0030 // Communication ID
|
|
|
|
#define SIO_8BIT_MODE 0x0000 // Normal 8-bit communication mode
|
|
#define SIO_32BIT_MODE 0x1000 // Normal 32-bit communication mode
|
|
#define SIO_MULTI_MODE 0x2000 // Multi-player communication mode
|
|
#define SIO_UART_MODE 0x3000 // UART communication mode
|
|
|
|
#define SIO_SCK_OUT 0x0000 // Select external clock
|
|
#define SIO_SCK_IN 0x0001 // Select internal clock
|
|
#define SIO_IN_SCK_256K 0x0000 // Select internal clock 256KHz
|
|
#define SIO_IN_SCK_2M 0x0002 // Select 2MHz
|
|
#define SIO_ACK_RECV 0x0004 // Request transfer
|
|
#define SIO_ACK_SEND 0x0008 // Enable transfer
|
|
#define SIO_9600_BPS 0x0000 // baud rate 9600 bps
|
|
#define SIO_38400_BPS 0x0001 // 38400 bps
|
|
#define SIO_57600_BPS 0x0002 // 57600 bps
|
|
#define SIO_115200_BPS 0x0003 // 115200 bps
|
|
|
|
#define SIO_MULTI_CONNECT 0x0004 // Connecting multi-play communication
|
|
#define SIO_MULTI_DISCONNECT 0x0000 // Disconnect
|
|
#define SIO_MULTI_PARENT 0x0008 // Multi-play communication Connect master
|
|
#define SIO_MULTI_CHILD 0x0000 // Connect slave
|
|
#define SIO_MULTI_SI 0x0004 // Multi-play communication SI terminal
|
|
#define SIO_MULTI_SD 0x0008 // SD terminal
|
|
#define SIO_MULTI_BUSY 0x0080 // Multi-play communicating
|
|
#define SIO_CTS_ENABLE 0x0004 // Enable UART send enable signal
|
|
#define SIO_UART_7BIT 0x0000 // UART communication data length 7 bit
|
|
#define SIO_UART_8BIT 0x0080 // 8 bit
|
|
|
|
#define SIO_ERROR 0x0040 // Detect error
|
|
#define SIO_START 0x0080 // Start transfer
|
|
#define SIO_ENABLE 0x0080 // Enable SIO
|
|
|
|
#define SIO_PARITY_ENABLE 0x0200 // Enable parity
|
|
#define SIO_PARITY_EVEN 0x0000 // Even parity
|
|
#define SIO_PARITY_ODD 0x0008 // Odd parity
|
|
#define SIO_TRANS_ENABLE 0x0400 // Enable transmitter
|
|
#define SIO_TRANS_DATA_FULL 0x0010 // Transmitted data full
|
|
#define SIO_RECV_ENABLE 0x0800 // Enable receiver
|
|
#define SIO_RECV_DATA_EMPTY 0x0020 // No data received
|
|
#define SIO_INTR_ENABLE 0x4000 // Enable interrupt request
|
|
|
|
#define SIO_MULTI_SI_SHIFT 2
|
|
#define SIO_MULTI_SI_MASK 0x1
|
|
#define SIO_MULTI_DI_SHIFT 3
|
|
#define SIO_MULTI_DI_MASK 0x1
|
|
|
|
// keys
|
|
#define A_BUTTON 0x0001
|
|
#define B_BUTTON 0x0002
|
|
#define SELECT_BUTTON 0x0004
|
|
#define START_BUTTON 0x0008
|
|
#define DPAD_RIGHT 0x0010
|
|
#define DPAD_LEFT 0x0020
|
|
#define DPAD_UP 0x0040
|
|
#define DPAD_DOWN 0x0080
|
|
#define R_BUTTON 0x0100
|
|
#define L_BUTTON 0x0200
|
|
#define KEYS_MASK 0x03FF
|
|
#define KEY_INTR_ENABLE 0x0400
|
|
#define KEY_OR_INTR 0x0000
|
|
#define KEY_AND_INTR 0x8000
|
|
#define DPAD_ANY 0x00F0
|
|
#define DPAD_SIDEWAYS (DPAD_LEFT | DPAD_RIGHT)
|
|
#define DPAD_VERTICAL (DPAD_DOWN | DPAD_UP)
|
|
#define JOY_EXCL_DPAD 0x030F
|
|
|
|
// interrupt flags
|
|
#define INTR_FLAG_VBLANK (1 << 0)
|
|
#define INTR_FLAG_HBLANK (1 << 1)
|
|
#define INTR_FLAG_VCOUNT (1 << 2)
|
|
#define INTR_FLAG_TIMER0 (1 << 3)
|
|
#define INTR_FLAG_TIMER1 (1 << 4)
|
|
#define INTR_FLAG_TIMER2 (1 << 5)
|
|
#define INTR_FLAG_TIMER3 (1 << 6)
|
|
#define INTR_FLAG_SERIAL (1 << 7)
|
|
#define INTR_FLAG_DMA0 (1 << 8)
|
|
#define INTR_FLAG_DMA1 (1 << 9)
|
|
#define INTR_FLAG_DMA2 (1 << 10)
|
|
#define INTR_FLAG_DMA3 (1 << 11)
|
|
#define INTR_FLAG_KEYPAD (1 << 12)
|
|
#define INTR_FLAG_GAMEPAK (1 << 13)
|
|
|
|
// WAITCNT
|
|
#define WAITCNT_SRAM_4 (0 << 0)
|
|
#define WAITCNT_SRAM_3 (1 << 0)
|
|
#define WAITCNT_SRAM_2 (2 << 0)
|
|
#define WAITCNT_SRAM_8 (3 << 0)
|
|
#define WAITCNT_SRAM_MASK (3 << 0)
|
|
|
|
#define WAITCNT_WS0_N_4 (0 << 2)
|
|
#define WAITCNT_WS0_N_3 (1 << 2)
|
|
#define WAITCNT_WS0_N_2 (2 << 2)
|
|
#define WAITCNT_WS0_N_8 (3 << 2)
|
|
#define WAITCNT_WS0_N_MASK (3 << 2)
|
|
|
|
#define WAITCNT_WS0_S_2 (0 << 4)
|
|
#define WAITCNT_WS0_S_1 (1 << 4)
|
|
|
|
#define WAITCNT_WS1_N_4 (0 << 5)
|
|
#define WAITCNT_WS1_N_3 (1 << 5)
|
|
#define WAITCNT_WS1_N_2 (2 << 5)
|
|
#define WAITCNT_WS1_N_8 (3 << 5)
|
|
#define WAITCNT_WS1_N_MASK (3 << 5)
|
|
|
|
#define WAITCNT_WS1_S_4 (0 << 7)
|
|
#define WAITCNT_WS1_S_1 (1 << 7)
|
|
|
|
#define WAITCNT_WS2_N_4 (0 << 8)
|
|
#define WAITCNT_WS2_N_3 (1 << 8)
|
|
#define WAITCNT_WS2_N_2 (2 << 8)
|
|
#define WAITCNT_WS2_N_8 (3 << 8)
|
|
#define WAITCNT_WS2_N_MASK (3 << 8)
|
|
|
|
#define WAITCNT_WS2_S_8 (0 << 10)
|
|
#define WAITCNT_WS2_S_1 (1 << 10)
|
|
|
|
#define WAITCNT_PHI_OUT_NONE (0 << 11)
|
|
#define WAITCNT_PHI_OUT_4MHZ (1 << 11)
|
|
#define WAITCNT_PHI_OUT_8MHZ (2 << 11)
|
|
#define WAITCNT_PHI_OUT_16MHZ (3 << 11)
|
|
#define WAITCNT_PHI_OUT_MASK (3 << 11)
|
|
|
|
#define WAITCNT_PREFETCH_ENABLE (1 << 14)
|
|
|
|
#define WAITCNT_AGB (0 << 15)
|
|
#define WAITCNT_CGB (1 << 15)
|
|
|
|
#endif // GUARD_GBA_IO_REG_H
|