// Hand written file mostly derived from https://problemkaputt.de/gbatek.htm //go:build gameboyadvance package gba import ( "runtime/volatile" "unsafe" ) // Interrupt numbers. const ( IRQ_VBLANK = 0 IRQ_HBLANK = 1 IRQ_VCOUNT = 2 IRQ_TIMER0 = 3 IRQ_TIMER1 = 4 IRQ_TIMER2 = 5 IRQ_TIMER3 = 6 IRQ_COM = 7 IRQ_DMA0 = 8 IRQ_DMA1 = 9 IRQ_DMA2 = 10 IRQ_DMA3 = 11 IRQ_KEYPAD = 12 IRQ_GAMEPAK = 13 ) // Peripherals var ( // Display registers DISP = (*DISP_Type)(unsafe.Add(unsafe.Pointer(REG_BASE), uintptr(0x0000))) // Background control registers BGCNT0 = (*BGCNT_Type)(unsafe.Add(unsafe.Pointer(REG_BASE), uintptr(0x0008))) BGCNT1 = (*BGCNT_Type)(unsafe.Add(unsafe.Pointer(REG_BASE), uintptr(0x000A))) BGCNT2 = (*BGCNT_Type)(unsafe.Add(unsafe.Pointer(REG_BASE), uintptr(0x000C))) BGCNT3 = (*BGCNT_Type)(unsafe.Add(unsafe.Pointer(REG_BASE), uintptr(0x000E))) BG0 = (*BG_Type)(unsafe.Add(unsafe.Pointer(REG_BASE), uintptr(0x0010))) BG1 = (*BG_Type)(unsafe.Add(unsafe.Pointer(REG_BASE), uintptr(0x0014))) BG2 = (*BG_Type)(unsafe.Add(unsafe.Pointer(REG_BASE), uintptr(0x0018))) BG3 = (*BG_Type)(unsafe.Add(unsafe.Pointer(REG_BASE), uintptr(0x001C))) BGA2 = (*BG_AFFINE_Type)(unsafe.Add(unsafe.Pointer(REG_BASE), uintptr(0x0020))) BGA3 = (*BG_AFFINE_Type)(unsafe.Add(unsafe.Pointer(REG_BASE), uintptr(0x0030))) WIN = (*WIN_Type)(unsafe.Add(unsafe.Pointer(REG_BASE), uintptr(0x0040))) GRAPHICS = (*GRAPHICS_Type)(unsafe.Add(unsafe.Pointer(REG_BASE), uintptr(0x004C))) // GBA Sound Channel 1 - Tone & Sweep SOUND1 = (*SOUND1_Type)(unsafe.Add(unsafe.Pointer(REG_BASE), uintptr(0x0060))) // GBA Sound Channel 2 - Tone SOUND2 = (*SOUND2_Type)(unsafe.Add(unsafe.Pointer(REG_BASE), uintptr(0x0068))) // GBA Sound Channel 3 - Wave Output SOUND3 = (*SOUND3_Type)(unsafe.Add(unsafe.Pointer(REG_BASE), uintptr(0x0070))) // GBA Sound Channel 4 - Noise SOUND4 = (*SOUND4_Type)(unsafe.Add(unsafe.Pointer(REG_BASE), uintptr(0x0078))) // GBA Sound Control SOUND = (*SOUND_Type)(unsafe.Add(unsafe.Pointer(REG_BASE), uintptr(0x0080))) DMA0 = (*DMA_Type)(unsafe.Add(unsafe.Pointer(REG_BASE), uintptr(0x00B0))) DMA1 = (*DMA_Type)(unsafe.Add(unsafe.Pointer(REG_BASE), uintptr(0x00BC))) DMA2 = (*DMA_Type)(unsafe.Add(unsafe.Pointer(REG_BASE), uintptr(0x00C8))) DMA3 = (*DMA_Type)(unsafe.Add(unsafe.Pointer(REG_BASE), uintptr(0x00D4))) TM0 = (*TIMER_Type)(unsafe.Add(unsafe.Pointer(REG_BASE), uintptr(0x0100))) TM1 = (*TIMER_Type)(unsafe.Add(unsafe.Pointer(REG_BASE), uintptr(0x0104))) TM2 = (*TIMER_Type)(unsafe.Add(unsafe.Pointer(REG_BASE), uintptr(0x0108))) TM3 = (*TIMER_Type)(unsafe.Add(unsafe.Pointer(REG_BASE), uintptr(0x010C))) // Communication 1 SIODATA32 = (*SIODATA32_Type)(unsafe.Add(unsafe.Pointer(REG_BASE), uintptr(0x0120))) SIOMULTI = (*SIOMULTI_Type)(unsafe.Add(unsafe.Pointer(REG_BASE), uintptr(0x0120))) KEY = (*KEY_Type)(unsafe.Add(unsafe.Pointer(REG_BASE), uintptr(0x0130))) // Communication 2 SIO = (*SIO_Type)(unsafe.Add(unsafe.Pointer(REG_BASE), uintptr(0x0134))) INTERRUPT = (*INTERRUPT_Type)(unsafe.Add(unsafe.Pointer(REG_BASE), uintptr(0x0200))) ) // Main memory sections const ( // External work RAM MEM_EWRAM uintptr = 0x02000000 // Internal work RAM MEM_IWRAM uintptr = 0x03000000 // I/O registers MEM_IO uintptr = 0x04000000 // Palette. Note: no 8bit write !! MEM_PAL uintptr = 0x05000000 // Video RAM. Note: no 8bit write !! MEM_VRAM uintptr = 0x06000000 // Object Attribute Memory (OAM) Note: no 8bit write !! MEM_OAM uintptr = 0x07000000 // ROM. No write at all (duh) MEM_ROM uintptr = 0x08000000 // Static RAM. 8bit write only MEM_SRAM uintptr = 0x0E000000 ) // Main section sizes const ( EWRAM_SIZE uintptr = 0x40000 IWRAM_SIZE uintptr = 0x08000 PAL_SIZE uintptr = 0x00400 VRAM_SIZE uintptr = 0x18000 OAM_SIZE uintptr = 0x00400 SRAM_SIZE uintptr = 0x10000 ) // Sub section sizes const ( // BG palette size PAL_BG_SIZE = 0x00200 // Object palette size PAL_OBJ_SIZE = 0x00200 // Charblock size CBB_SIZE = 0x04000 // Screenblock size SBB_SIZE = 0x00800 // BG VRAM_MODE_0_2 size VRAM_BG_SIZE_MODE_0_2 = 0x10000 // BG VRAM size VRAM_BG_SIZE_MODE_3_5 = 0x14000 // Object VRAM size VRAM_OBJ_SIZE = 0x08000 // Mode 3 buffer size M3_SIZE = 0x12C00 // Mode 4 buffer size M4_SIZE = 0x09600 // Mode 5 buffer size M5_SIZE = 0x0A000 // Bitmap page size VRAM_PAGE_SIZE = 0x0A000 ) // Sub sections var ( REG_BASE uintptr = MEM_IO // Background palette address MEM_PAL_BG = MEM_PAL // Object palette address MEM_PAL_OBJ = MEM_PAL + PAL_BG_SIZE // Front page address MEM_VRAM_FRONT = MEM_VRAM // Back page address MEM_VRAM_BACK = MEM_VRAM + VRAM_PAGE_SIZE // Object VRAM address - BG Mode 0-2 MEM_VRAM_OBJ_MODE0_2 = MEM_VRAM + VRAM_BG_SIZE_MODE_0_2 // Object VRAM address - BG Mode 3-5 MEM_VRAM_OBJ_MODE_3_5 = MEM_VRAM + VRAM_BG_SIZE_MODE_3_5 ) // Display registers type DISP_Type struct { DISPCNT volatile.Register16 _ [2]byte DISPSTAT volatile.Register16 VCOUNT volatile.Register16 } // Background control registers type BGCNT_Type struct { CNT volatile.Register16 } // Regular background scroll registers. (write only!) type BG_Type struct { HOFS volatile.Register16 VOFS volatile.Register16 } // Affine background parameters. (write only!) type BG_AFFINE_Type struct { PA volatile.Register16 PB volatile.Register16 PC volatile.Register16 PD volatile.Register16 X volatile.Register32 Y volatile.Register32 } type WIN_Type struct { // win0 right, left (0xLLRR) WIN0H volatile.Register16 // win1 right, left (0xLLRR) WIN1H volatile.Register16 // win0 bottom, top (0xTTBB) WIN0V volatile.Register16 // win1 bottom, top (0xTTBB) WIN1V volatile.Register16 // win0, win1 control IN volatile.Register16 // winOut, winObj control OUT volatile.Register16 } type GRAPHICS_Type struct { // Mosaic control MOSAIC volatile.Register32 // Alpha control BLDCNT volatile.Register16 // Fade level BLDALPHA volatile.Register16 // Blend levels BLDY volatile.Register16 } type SOUND1_Type struct { // Sweep register CNT_L volatile.Register16 // Duty/Len/Envelope CNT_H volatile.Register16 // Frequency/Control CNT_X volatile.Register16 } type SOUND2_Type struct { // Duty/Len/Envelope CNT_L volatile.Register16 // not used _ volatile.Register16 // Frequency/Control CNT_H volatile.Register16 } type SOUND3_Type struct { // Stop/Wave RAM select CNT_L volatile.Register16 // Length/Volume CNT_H volatile.Register16 // Frequency/Control CNT_X volatile.Register16 } type SOUND4_Type struct { // Length/Envelope CNT_L volatile.Register16 // not used _ volatile.Register16 // Frequency/Control CNT_H volatile.Register16 } type SOUND_Type struct { // Control Stereo/Volume/Enable CNT_L volatile.Register16 // Control Mixing/DMA Control CNT_H volatile.Register16 // Control Sound on/off CNT_X volatile.Register16 } // DMA type DMA_Type struct { SAD_L volatile.Register16 SAD_H volatile.Register16 DAD_L volatile.Register16 DAD_H volatile.Register16 CNT_L volatile.Register16 CNT_H volatile.Register16 } // TIMER type TIMER_Type struct { DATA volatile.Register16 CNT volatile.Register16 } // serial type SIODATA32_Type struct { DATA32_L volatile.Register16 DATA32_H volatile.Register16 _ volatile.Register16 _ volatile.Register16 CNT volatile.Register16 DATA8 volatile.Register16 } type SIOMULTI_Type struct { MULTI0 volatile.Register16 MULTI1 volatile.Register16 MULTI2 volatile.Register16 MULTI3 volatile.Register16 CNT volatile.Register16 MLT_SEND volatile.Register16 } type SIO_Type struct { RCNT volatile.Register16 } // Keypad registers type KEY_Type struct { INPUT volatile.Register16 CNT volatile.Register16 } // TODO: Joybus communication // Interrupt / System registers type INTERRUPT_Type struct { IE volatile.Register16 IF volatile.Register16 WAITCNT volatile.Register16 IME volatile.Register16 PAUSE volatile.Register16 } // LCD OBJ Attributes type OAMOBJ_Type struct { ATT0 volatile.Register16 ATT1 volatile.Register16 ATT2 volatile.Register16 _ volatile.Register16 } // OAM Rotation/Scaling Parameters type OAMROT_Type struct { _ volatile.Register16 _ volatile.Register16 _ volatile.Register16 PA volatile.Register16 _ volatile.Register16 _ volatile.Register16 _ volatile.Register16 PB volatile.Register16 _ volatile.Register16 _ volatile.Register16 _ volatile.Register16 PC volatile.Register16 _ volatile.Register16 _ volatile.Register16 _ volatile.Register16 PD volatile.Register16 } // Constants for DISP: display const ( // BGMODE: background mode. // Position of BGMODE field. DISPCNT_BGMODE_Pos = 0x0 // Bit mask of BGMODE field. DISPCNT_BGMODE_Msk = 0x4 // BG Mode 0. DISPCNT_BGMODE_0 = 0x0 // BG Mode 1. DISPCNT_BGMODE_1 = 0x1 // BG Mode 2. DISPCNT_BGMODE_2 = 0x2 // BG Mode 3. DISPCNT_BGMODE_3 = 0x3 // BG Mode 4. DISPCNT_BGMODE_4 = 0x4 // FRAMESELECT: frame select (mode 4 and 5 only). DISPCNT_FRAMESELECT_Pos = 0x4 DISPCNT_FRAMESELECT_FRAME0 = 0x0 DISPCNT_FRAMESELECT_FRAME1 = 0x1 // HBLANKINTERVAL: 1=Allow access to OAM during H-Blank DISPCNT_HBLANKINTERVAL_Pos = 0x5 DISPCNT_HBLANKINTERVAL_NOALLOW = 0x0 DISPCNT_HBLANKINTERVAL_ALLOW = 0x1 // OBJCHARVRAM: (0=Two dimensional, 1=One dimensional) DISPCNT_OBJCHARVRAM_Pos = 0x6 DISPCNT_OBJCHARVRAM_2D = 0x0 DISPCNT_OBJCHARVRAM_1D = 0x1 // FORCEDBLANK: (1=Allow FAST access to VRAM,Palette,OAM) DISPCNT_FORCEDBLANK_Pos = 0x7 DISPCNT_FORCEDBLANK_NOALLOW = 0x0 DISPCNT_FORCEDBLANK_ALLOW = 0x1 // Screen Display BG0 DISPCNT_SCREENDISPLAY_BG0_Pos = 0x8 DISPCNT_SCREENDISPLAY_BG0_ENABLE = 0x1 DISPCNT_SCREENDISPLAY_BG0_DISABLE = 0x0 // Screen Display BG1 DISPCNT_SCREENDISPLAY_BG1_Pos = 0x9 DISPCNT_SCREENDISPLAY_BG1_ENABLE = 0x1 DISPCNT_SCREENDISPLAY_BG1_DISABLE = 0x0 // Screen Display BG2 DISPCNT_SCREENDISPLAY_BG2_Pos = 0xA DISPCNT_SCREENDISPLAY_BG2_ENABLE = 0x1 DISPCNT_SCREENDISPLAY_BG2_DISABLE = 0x0 // Screen Display BG3 DISPCNT_SCREENDISPLAY_BG3_Pos = 0xB DISPCNT_SCREENDISPLAY_BG3_ENABLE = 0x1 DISPCNT_SCREENDISPLAY_BG3_DISABLE = 0x0 // Screen Display OBJ DISPCNT_SCREENDISPLAY_OBJ_Pos = 0xC DISPCNT_SCREENDISPLAY_OBJ_ENABLE = 0x1 DISPCNT_SCREENDISPLAY_OBJ_DISABLE = 0x0 // Window 0 Display Flag (0=Off, 1=On) DISPCNT_WINDOW0_DISPLAY_Pos = 0xD DISPCNT_WINDOW0_DISPLAY_ENABLE = 0x1 DISPCNT_WINDOW0_DISPLAY_DISABLE = 0x0 // Window 1 Display Flag (0=Off, 1=On) DISPCNT_WINDOW1_DISPLAY_Pos = 0xE DISPCNT_WINDOW1_DISPLAY_ENABLE = 0x1 DISPCNT_WINDOW1_DISPLAY_DISABLE = 0x0 // OBJ Window Display Flag DISPCNT_WINDOWOBJ_DISPLAY_Pos = 0xF DISPCNT_WINDOWOBJ_DISPLAY_ENABLE = 0x1 DISPCNT_WINDOWOBJ_DISPLAY_DISABLE = 0x0 // DISPSTAT: display status. // V-blank DISPSTAT_VBLANK_Pos = 0x0 DISPSTAT_VBLANK_ENABLE = 0x1 DISPSTAT_VBLANK_DISABLE = 0x0 // H-blank DISPSTAT_HBLANK_Pos = 0x1 DISPSTAT_HBLANK_ENABLE = 0x1 DISPSTAT_HBLANK_DISABLE = 0x0 // V-counter match DISPSTAT_VCOUNTER_Pos = 0x2 DISPSTAT_VCOUNTER_MATCH = 0x1 DISPSTAT_VCOUNTER_NOMATCH = 0x0 // V-blank IRQ DISPSTAT_VBLANK_IRQ_Pos = 0x3 DISPSTAT_VBLANK_IRQ_ENABLE = 0x1 DISPSTAT_VBLANK_IRQ_DISABLE = 0x0 // H-blank IRQ DISPSTAT_HBLANK_IRQ_Pos = 0x4 DISPSTAT_HBLANK_IRQ_ENABLE = 0x1 DISPSTAT_HBLANK_IRQ_DISABLE = 0x0 // V-counter IRQ DISPSTAT_VCOUNTER_IRQ_Pos = 0x5 DISPSTAT_VCOUNTER_IRQ_ENABLE = 0x1 DISPSTAT_VCOUNTER_IRQ_DISABLE = 0x0 // V-count setting DISPSTAT_VCOUNT_SETTING_Pos = 0x8 ) const ( BGCNT_PRIORITY_Pos = 0x0 BGCNT_PRIORITY_Msk = 0x3 BGCNT_CHAR_BASE_Pos = 0x2 BGCNT_CHAR_BASE_Msk = 0x3 BGCNT_MOSAIC_Pos = 0x6 BGCNT_MOSAIC_DISABLE = 0x0 BGCNT_MOSAIC_ENABLE = 0x1 BGCNT_COLORS_Pos = 0x7 BGCNT_COLORS_16 = 0x0 BGCNT_COLORS_256 = 0x1 BGCNT_BASE_Pos = 0x8 BGCNT_BASE_Msk = 0x1F BGCNT_OVERFLOW_Pos = 0xD BGCNT_OVERFLOW_TRANS = 0x0 BGCNT_OVERFLOW_WRAP = 0x1 BGCNT_SIZE_Pos = 0xE BGCNT_SIZE_Msk = 0x3 ) const ( BG_HOFS_Pos = 0x0 BG_HOFS_Msk = 0x1FF BG_VOFS_Pos = 0x0 BG_VOFS_Msk = 0x1FF ) // Constants for TIMER const ( // PRESCALER: Prescaler Selection (0=F/1, 1=F/64, 2=F/256, 3=F/1024) // Position of PRESCALER field. TIMERCNT_PRESCALER_Pos = 0x0 // Bit mask of PRESCALER field. TIMERCNT_PRESCALER_Msk = 0x2 // 0=F/1 TIMERCNT_PRESCALER_1 = 0x0 // 1=F/64 TIMERCNT_PRESCALER_64 = 0x1 // 2=F/256 TIMERCNT_PRESCALER_256 = 0x2 // F/1024 TIMERCNT_PRESCALER_1024 = 0x3 // COUNTUP: Count-up Timing (0=Normal, 1=See below) ;Not used in TM0CNT_H // Position of COUNTUP_TIMING field. TIMERCNT_COUNTUP_TIMING_Pos = 0x2 TIMERCNT_COUNTUP_TIMING_NORMAL = 0x0 TIMERCNT_COUNTUP_TIMING_ENABLED = 0x1 TIMERCNT_TIMER_IRQ_ENABLED_Pos = 0x06 TIMERCNT_TIMER_IRQ_ENABLED = 0x01 TIMERCNT_TIMER_IRQ_DISABLED = 0x00 TIMERCNT_TIMER_STARTSTOP_Pos = 0x07 TIMERCNT_TIMER_START = 0x1 TIMERCNT_TIMER_STOP = 0x0 ) const ( // normal mode SIOCNT_NORMAL_SC_Pos = 0x0 SIOCNT_NORMAL_SC_INTERNAL = 0x1 SIOCNT_NORMAL_SC_EXTERNAL = 0x0 SIOCNT_NORMAL_SCSPEED_Pos = 0x1 SIOCNT_NORMAL_SCSPEED_256K = 0x0 SIOCNT_NORMAL_SCSPEED_2M = 0x1 SIOCNT_NORMAL_SCSTATE_Pos = 0x2 SIOCNT_NORMAL_SCSTATE_LOW = 0x0 SIOCNT_NORMAL_SCSTATE_HIGH = 0x1 SIOCNT_NORMAL_SO_INACTIVE_Pos = 0x3 SIOCNT_NORMAL_SO_INACTIVE_LOW = 0x0 SIOCNT_NORMAL_SO_INACTIVE_HIGH = 0x1 SIOCNT_NORMAL_START_Pos = 0x7 SIOCNT_NORMAL_START_READY = 0x0 SIOCNT_NORMAL_START_ACTIVE = 0x1 SIOCNT_NORMAL_LEN_Pos = 0xC SIOCNT_NORMAL_LEN8 = 0x0 SIOCNT_NORMAL_LEN32 = 0x1 SIOCNT_NORMAL_MODE_Pos = 0xD SIOCNT_NORMAL_MODE = 0x0 // multiplayer mode SIOCNT_MULTI_BR_Pos = 0x0 SIOCNT_MULTI_BR_Msk = 0x3 SIOCNT_MULTI_BR_9600 = 0x0 SIOCNT_MULTI_BR_38400 = 0x1 SIOCNT_MULTI_BR_57600 = 0x2 SIOCNT_MULTI_BR_115200 = 0x3 SIOCNT_MULTI_SI_Pos = 0x2 SIOCNT_MULTI_SI_PARENT = 0x0 SIOCNT_MULTI_SI_CHILD = 0x1 SIOCNT_MULTI_SD_Pos = 0x3 SIOCNT_MULTI_SD_BAD = 0x0 SIOCNT_MULTI_SD_READY = 0x1 SIOCNT_MULTI_ID_Pos = 0x4 SIOCNT_MULTI_ID_Msk = 0x3 SIOCNT_MULTI_ID_PARENT = 0x0 SIOCNT_MULTI_ID_CHILD1 = 0x1 SIOCNT_MULTI_ID_CHILD2 = 0x2 SIOCNT_MULTI_ID_CHILD3 = 0x3 SIOCNT_MULTI_ERR_Pos = 0x6 SIOCNT_MULTI_ERR_NORMAL = 0x0 SIOCNT_MULTI_ERR_ERROR = 0x1 SIOCNT_MULTI_STARTBUSY_Pos = 0x7 SIOCNT_MULTI_STARTBUSY_INACTIVE = 0x0 SIOCNT_MULTI_STARTBUSY_STARTBUSY = 0x1 SIOCNT_MULTI_MODE_Pos = 0xC SIOCNT_MULTI_MODE_Msk = 0x3 SIOCNT_MULTI_MODE = 0x01 // uart mode SIOCNT_UART_BR_Pos = 0x0 SIOCNT_UART_BR_Msk = 0x3 SIOCNT_UART_BR_9600 = 0x0 SIOCNT_UART_BR_38400 = 0x1 SIOCNT_UART_BR_57600 = 0x2 SIOCNT_UART_BR_115200 = 0x3 SIOCNT_UART_CTS_Pos = 0x2 SIOCNT_UART_CTS_ALWAYS = 0x0 SIOCNT_UART_CTS_SENDLOW = 0x1 SIOCNT_UART_PARITY_Pos = 0x3 SIOCNT_UART_PARITY_EVEN = 0x0 SIOCNT_UART_PARITY_ODD = 0x1 SIOCNT_UART_SEND_Pos = 0x4 SIOCNT_UART_SEND_NOTFULL = 0x0 SIOCNT_UART_SEND_FULL = 0x1 SIOCNT_UART_REC_Pos = 0x5 SIOCNT_UART_REC_NOTEMPTY = 0x0 SIOCNT_UART_REC_EMPTY = 0x1 SIOCNT_UART_ERR_Pos = 0x6 SIOCNT_UART_ERR_NOERROR = 0x0 SIOCNT_UART_ERR_ERROR = 0x1 SIOCNT_UART_DATALEN_Pos = 0x7 SIOCNT_UART_DATALEN_7 = 0x0 SIOCNT_UART_DATALEN_8 = 0x1 SIOCNT_UART_FIFO_Pos = 0x8 SIOCNT_UART_FIFO_DISABLE = 0x0 SIOCNT_UART_FIFO_ENABLE = 0x1 SIOCNT_UART_PARITY_ENABLE_Pos = 0x9 SIOCNT_UART_PARITY_DISABLE = 0x0 SIOCNT_UART_PARITY_ENABLE = 0x1 SIOCNT_UART_SEND_ENABLE_Pos = 0xA SIOCNT_UART_SEND_DISABLE = 0x0 SIOCNT_UART_SEND_ENABLE = 0x1 SIOCNT_UART_REC_ENABLE_Pos = 0xB SIOCNT_UART_REC_DISABLE = 0x0 SIOCNT_UART_REC_ENABLE = 0x1 SIOCNT_UART_MODE_Pos = 0xC SIOCNT_UART_MODE_Msk = 0x3 SIOCNT_UART_MODE = 0x11 // IRQs used by all SIOCNT_IRQ_Pos = 0xE SIOCNT_IRQ_DISABLE = 0x0 SIOCNT_IRQ_ENABLE = 0x1 ) const ( SIO_RCNT_MODE_Pos = 0xF SIO_RCNT_MODE_NORMAL = 0x0 SIO_RCNT_MODE_MULTI = 0x0 SIO_RCNT_MODE_UART = 0x0 ) // Constants for KEY const ( // KEYINPUT KEYINPUT_PRESSED = 0x0 KEYINPUT_RELEASED = 0x1 KEYINPUT_BUTTON_A_Pos = 0x0 KEYINPUT_BUTTON_B_Pos = 0x1 KEYINPUT_BUTTON_SELECT_Pos = 0x2 KEYINPUT_BUTTON_START_Pos = 0x3 KEYINPUT_BUTTON_RIGHT_Pos = 0x4 KEYINPUT_BUTTON_LEFT_Pos = 0x5 KEYINPUT_BUTTON_UP_Pos = 0x6 KEYINPUT_BUTTON_DOWN_Pos = 0x7 KEYINPUT_BUTTON_R_Pos = 0x8 KEYINPUT_BUTTON_L_Pos = 0x9 // KEYCNT KEYCNT_IGNORE = 0x0 KEYCNT_SELECT = 0x1 KEYCNT_BUTTON_A_Pos = 0x0 KEYCNT_BUTTON_B_Pos = 0x1 KEYCNT_BUTTON_SELECT_Pos = 0x2 KEYCNT_BUTTON_START_Pos = 0x3 KEYCNT_BUTTON_RIGHT_Pos = 0x4 KEYCNT_BUTTON_LEFT_Pos = 0x5 KEYCNT_BUTTON_UP_Pos = 0x6 KEYCNT_BUTTON_DOWN_Pos = 0x7 KEYCNT_BUTTON_R_Pos = 0x8 KEYCNT_BUTTON_L_Pos = 0x9 KEYCNT_BUTTON_IRQ_DISABLE = 0x0 KEYCNT_BUTTON_IRQ_ENABLE = 0x1 KEYCNT_BUTTON_IRQ_ENABLE_Pos = 0xE KEYCNT_BUTTON_IRQ_COND_OR = 0x0 KEYCNT_BUTTON_IRQ_COND_AND = 0x1 KEYCNT_BUTTON_IRQ_COND_Pos = 0xF ) // Constants for INTERRUPT const ( // IE INTERRUPT_IE_ENABLED = 0x1 INTERRUPT_IE_DISABLED = 0x0 INTERRUPT_IE_VBLANK_Pos = 0x0 INTERRUPT_IE_HBLANK_Pos = 0x1 INTERRUPT_IE_VCOUNTER_MATCH_Pos = 0x2 INTERRUPT_IE_TIMER0_OVERFLOW_Pos = 0x3 INTERRUPT_IE_TIMER1_OVERFLOW_Pos = 0x4 INTERRUPT_IE_TIMER2_OVERFLOW_Pos = 0x5 INTERRUPT_IE_TIMER3_OVERFLOW_Pos = 0x6 INTERRUPT_IE_SERIAL_Pos = 0x7 INTERRUPT_IE_DMA0_Pos = 0x8 INTERRUPT_IE_DMA1_Pos = 0x9 INTERRUPT_IE_DMA2_Pos = 0xA INTERRUPT_IE_DMA3_Pos = 0xB INTERRUPT_IE_KEYPAD_Pos = 0xC INTERRUPT_IE_GAMPAK_Pos = 0xD // IF INTERRUPT_IF_ENABLED = 0x1 INTERRUPT_IF_DISABLED = 0x0 INTERRUPT_IF_VBLANK_Pos = 0x0 INTERRUPT_IF_HBLANK_Pos = 0x1 INTERRUPT_IF_VCOUNTER_MATCH_Pos = 0x2 INTERRUPT_IF_TIMER0_OVERFLOW_Pos = 0x3 INTERRUPT_IF_TIMER1_OVERFLOW_Pos = 0x4 INTERRUPT_IF_TIMER2_OVERFLOW_Pos = 0x5 INTERRUPT_IF_TIMER3_OVERFLOW_Pos = 0x6 INTERRUPT_IF_SERIAL_Pos = 0x7 INTERRUPT_IF_DMA0_Pos = 0x8 INTERRUPT_IF_DMA1_Pos = 0x9 INTERRUPT_IF_DMA2_Pos = 0xA INTERRUPT_IF_DMA3_Pos = 0xB INTERRUPT_IF_KEYPAD_Pos = 0xC INTERRUPT_IF_GAMPAK_Pos = 0xD ) const ( OAMOBJ_ATT0_Y_Pos = 0x0 OAMOBJ_ATT0_Y_Msk = 0xFF OAMOBJ_ATT0_OM_Pos = 0x8 OAMOBJ_ATT0_OM_Msk = 0x3 OAMOBJ_ATT0_OM_REG = 0x0 OAMOBJ_ATT0_OM_AFF = 0x1 OAMOBJ_ATT0_OM_HIDE = 0x2 OAMOBJ_ATT0_OM_DBL = 0x3 OAMOBJ_ATT0_GM_Pos = 0xA OAMOBJ_ATT0_GM_Msk = 0x3 OAMOBJ_ATT0_GM_REG = 0x0 OAMOBJ_ATT0_GM_BLEND = 0x1 OAMOBJ_ATT0_GM_WIN = 0x2 OAMOBJ_ATT0_MOSAIC_Pos = 0xC OAMOBJ_ATT0_MOSAIC_DISABLE = 0x0 OAMOBJ_ATT0_MOSAIC_ENABLE = 0x1 OAMOBJ_ATT0_COLOR_Pos = 0xD OAMOBJ_ATT0_COLOR_4BPP = 0x0 OAMOBJ_ATT0_COLOR_8BPP = 0x1 OAMOBJ_ATT0_SH_Pos = 0xE OAMOBJ_ATT0_SH_Msk = 0x3 OAMOBJ_ATT0_SH_SQUARE = 0x0 OAMOBJ_ATT0_SH_WIDE = 0x1 OAMOBJ_ATT0_SH_TALL = 0x2 OAMOBJ_ATT1_X_Pos = 0x0 OAMOBJ_ATT1_X_Msk = 0xFF OAMOBJ_ATT1_AID_Pos = 0x9 OAMOBJ_ATT1_AID_Msk = 0x1F OAMOBJ_ATT1_HF_Pos = 0xC OAMOBJ_ATT1_HF_NOFLIP = 0x0 OAMOBJ_ATT1_HF_FLIP = 0x1 OAMOBJ_ATT1_VF_Pos = 0xD OAMOBJ_ATT1_VF_NOFLIP = 0x0 OAMOBJ_ATT1_VF_FLIP = 0x1 OAMOBJ_ATT1_SZ_Pos = 0xE OAMOBJ_ATT1_SZ_Msk = 0x3 OAMOBJ_ATT2_TID_Pos = 0x0 OAMOBJ_ATT2_TID_Msk = 0xFF OAMOBJ_ATT2_PR_Pos = 0xA OAMOBJ_ATT2_PR_Msk = 0x3 OAMOBJ_ATT2_PB_Pos = 0xC OAMOBJ_ATT2_PB_Msk = 0xF )