mirror of https://github.com/zeldaret/tmc.git
				
				
				
			
		
			
				
	
	
		
			257 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			257 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			C
		
	
	
	
#ifndef TYPES_H
 | 
						|
#define TYPES_H
 | 
						|
 | 
						|
#include <stdint.h>
 | 
						|
 | 
						|
typedef uint8_t u8;
 | 
						|
typedef uint16_t u16;
 | 
						|
typedef uint32_t u32;
 | 
						|
typedef uint64_t u64;
 | 
						|
typedef int8_t s8;
 | 
						|
typedef int16_t s16;
 | 
						|
typedef int32_t s32;
 | 
						|
typedef int64_t s64;
 | 
						|
 | 
						|
typedef volatile u8 vu8;
 | 
						|
typedef volatile u16 vu16;
 | 
						|
typedef volatile u32 vu32;
 | 
						|
typedef volatile u64 vu64;
 | 
						|
typedef volatile s8 vs8;
 | 
						|
typedef volatile s16 vs16;
 | 
						|
typedef volatile s32 vs32;
 | 
						|
typedef volatile s64 vs64;
 | 
						|
 | 
						|
typedef float f32;
 | 
						|
typedef double f64;
 | 
						|
 | 
						|
typedef u8 bool8;
 | 
						|
typedef u16 bool16;
 | 
						|
typedef u32 bool32;
 | 
						|
 | 
						|
struct BgCnt {
 | 
						|
    u16 priority : 2;
 | 
						|
    u16 charBaseBlock : 2;
 | 
						|
    u16 dummy : 2;
 | 
						|
    u16 mosaic : 1;
 | 
						|
    u16 palettes : 1;
 | 
						|
    u16 screenBaseBlock : 5;
 | 
						|
    u16 areaOverflowMode : 1;
 | 
						|
    u16 screenSize : 2;
 | 
						|
};
 | 
						|
typedef volatile struct BgCnt vBgCnt;
 | 
						|
 | 
						|
struct PlttData {
 | 
						|
    u16 r : 5; // red
 | 
						|
    u16 g : 5; // green
 | 
						|
    u16 b : 5; // blue
 | 
						|
    u16 unused_15 : 1;
 | 
						|
};
 | 
						|
 | 
						|
struct OamData {
 | 
						|
    /*0x00*/ u32 y : 8;
 | 
						|
    /*0x01*/ u32 affineMode : 2; // 0x1, 0x2 -> 0x4
 | 
						|
    u32 objMode : 2;             // 0x4, 0x8 -> 0xC
 | 
						|
    u32 mosaic : 1;              // 0x10
 | 
						|
    u32 bpp : 1;                 // 0x20
 | 
						|
    u32 shape : 2;               // 0x40, 0x80 -> 0xC0
 | 
						|
 | 
						|
    /*0x02*/ u32 x : 9;
 | 
						|
    u32 matrixNum : 5; // bits 3/4 are h-flip/v-flip if not in affine mode
 | 
						|
    u32 size : 2;      // 0x4000, 0x8000 -> 0xC000
 | 
						|
 | 
						|
    /*0x04*/ u16 tileNum : 10; // 0x3FF
 | 
						|
    u16 priority : 2;          // 0x400, 0x800 -> 0xC00
 | 
						|
    u16 paletteNum : 4;
 | 
						|
    /*0x06*/ u16 affineParam;
 | 
						|
};
 | 
						|
 | 
						|
#define ST_OAM_HFLIP 0x08
 | 
						|
#define ST_OAM_VFLIP 0x10
 | 
						|
#define ST_OAM_MNUM_FLIP_MASK 0x18
 | 
						|
 | 
						|
#define ST_OAM_OBJ_NORMAL 0
 | 
						|
#define ST_OAM_OBJ_BLEND 1
 | 
						|
#define ST_OAM_OBJ_WINDOW 2
 | 
						|
 | 
						|
#define ST_OAM_AFFINE_OFF 0
 | 
						|
#define ST_OAM_AFFINE_NORMAL 1
 | 
						|
#define ST_OAM_AFFINE_ERASE 2
 | 
						|
#define ST_OAM_AFFINE_DOUBLE 3
 | 
						|
 | 
						|
#define ST_OAM_AFFINE_ON_MASK 1
 | 
						|
#define ST_OAM_AFFINE_DOUBLE_MASK 2
 | 
						|
 | 
						|
#define ST_OAM_4BPP 0
 | 
						|
#define ST_OAM_8BPP 1
 | 
						|
 | 
						|
#define ST_OAM_SQUARE 0
 | 
						|
#define ST_OAM_H_RECTANGLE 1
 | 
						|
#define ST_OAM_V_RECTANGLE 2
 | 
						|
 | 
						|
#define ST_OAM_SIZE_0 0
 | 
						|
#define ST_OAM_SIZE_1 1
 | 
						|
#define ST_OAM_SIZE_2 2
 | 
						|
#define ST_OAM_SIZE_3 3
 | 
						|
 | 
						|
#define SPRITE_SIZE_8x8 ((ST_OAM_SIZE_0 << 2) | (ST_OAM_SQUARE))
 | 
						|
#define SPRITE_SIZE_16x16 ((ST_OAM_SIZE_1 << 2) | (ST_OAM_SQUARE))
 | 
						|
#define SPRITE_SIZE_32x32 ((ST_OAM_SIZE_2 << 2) | (ST_OAM_SQUARE))
 | 
						|
#define SPRITE_SIZE_64x64 ((ST_OAM_SIZE_3 << 2) | (ST_OAM_SQUARE))
 | 
						|
 | 
						|
#define SPRITE_SIZE_16x8 ((ST_OAM_SIZE_0 << 2) | (ST_OAM_H_RECTANGLE))
 | 
						|
#define SPRITE_SIZE_32x8 ((ST_OAM_SIZE_1 << 2) | (ST_OAM_H_RECTANGLE))
 | 
						|
#define SPRITE_SIZE_32x16 ((ST_OAM_SIZE_2 << 2) | (ST_OAM_H_RECTANGLE))
 | 
						|
#define SPRITE_SIZE_64x32 ((ST_OAM_SIZE_3 << 2) | (ST_OAM_H_RECTANGLE))
 | 
						|
 | 
						|
#define SPRITE_SIZE_8x16 ((ST_OAM_SIZE_0 << 2) | (ST_OAM_V_RECTANGLE))
 | 
						|
#define SPRITE_SIZE_8x32 ((ST_OAM_SIZE_1 << 2) | (ST_OAM_V_RECTANGLE))
 | 
						|
#define SPRITE_SIZE_16x32 ((ST_OAM_SIZE_2 << 2) | (ST_OAM_V_RECTANGLE))
 | 
						|
#define SPRITE_SIZE_32x64 ((ST_OAM_SIZE_3 << 2) | (ST_OAM_V_RECTANGLE))
 | 
						|
 | 
						|
#define SPRITE_SIZE(dim) ((SPRITE_SIZE_##dim >> 2) & 0x03)
 | 
						|
#define SPRITE_SHAPE(dim) (SPRITE_SIZE_##dim & 0x03)
 | 
						|
 | 
						|
struct BgAffineSrcData {
 | 
						|
    s32 texX;
 | 
						|
    s32 texY;
 | 
						|
    s16 scrX;
 | 
						|
    s16 scrY;
 | 
						|
    s16 sx;
 | 
						|
    s16 sy;
 | 
						|
    u16 alpha;
 | 
						|
};
 | 
						|
 | 
						|
struct BgAffineDstData {
 | 
						|
    s16 pa;
 | 
						|
    s16 pb;
 | 
						|
    s16 pc;
 | 
						|
    s16 pd;
 | 
						|
    s32 dx;
 | 
						|
    s32 dy;
 | 
						|
};
 | 
						|
 | 
						|
struct ObjAffineSrcData {
 | 
						|
    s16 xScale;
 | 
						|
    s16 yScale;
 | 
						|
    u16 rotation;
 | 
						|
};
 | 
						|
 | 
						|
// Normal SIO Control Structure
 | 
						|
struct SioNormalCnt {
 | 
						|
    u16 sck_I_O : 1; // Clock I/O Select
 | 
						|
    u16 sck : 1;     // Internal Clock Select
 | 
						|
    u16 ackRecv : 1; // Transfer Enable Flag Receive
 | 
						|
    u16 ackSend : 1; // Transfer Enable Flag Send
 | 
						|
    u16 unused_6_4 : 3;
 | 
						|
    u16 enable : 1; // SIO Enable
 | 
						|
    u16 unused_11_8 : 4;
 | 
						|
    u16 mode : 2;     // Communication Mode Select
 | 
						|
    u16 ifEnable : 1; // Interrupt Request Enable
 | 
						|
    u16 unused_15 : 1;
 | 
						|
    u8 data; // Data
 | 
						|
    u8 unused_31_24;
 | 
						|
};
 | 
						|
 | 
						|
#define ST_SIO_8BIT_MODE 0  // Normal 8-bit communication mode
 | 
						|
#define ST_SIO_32BIT_MODE 1 // Normal 32-bit communication mode
 | 
						|
 | 
						|
#define ST_SIO_SCK_OUT 0     // Select external clock
 | 
						|
#define ST_SIO_SCK_IN 1      // Select internal clock
 | 
						|
#define ST_SIO_IN_SCK_256K 0 // Select internal clock 256KHz
 | 
						|
#define ST_SIO_IN_SCK_2M 1   //                  Select 2MHz
 | 
						|
 | 
						|
// Multi-player SIO Control Structure
 | 
						|
struct SioMultiCnt {
 | 
						|
    u16 baudRate : 2; // baud rate
 | 
						|
    u16 si : 1;       // SI terminal
 | 
						|
    u16 sd : 1;       // SD terminal
 | 
						|
    u16 id : 2;       // ID
 | 
						|
    u16 error : 1;    // error flag
 | 
						|
    u16 enable : 1;   // SIO enable
 | 
						|
    u16 unused_11_8 : 4;
 | 
						|
    u16 mode : 2;     // communication mode (should equal 2)
 | 
						|
    u16 ifEnable : 1; // IRQ enable
 | 
						|
    u16 unused_15 : 1;
 | 
						|
    u16 data; // data
 | 
						|
};
 | 
						|
 | 
						|
#define ST_SIO_MULTI_MODE 2 // Multi-play communication mode
 | 
						|
 | 
						|
#define ST_SIO_9600_BPS 0     // Baud rate 9600 bps
 | 
						|
#define ST_SIO_38400_BPS 1    //          38400 bps
 | 
						|
#define ST_SIO_57600_BPS 2    //          57600 bps
 | 
						|
#define ST_SIO_115200_BPS 3   //         115200 bps
 | 
						|
#define ST_SIO_MULTI_PARENT 1 // Multi-play communication  Connect master
 | 
						|
#define ST_SIO_MULTI_CHILD 0  //                  Connect slave
 | 
						|
 | 
						|
// UART - SIO Control Structure
 | 
						|
struct SioUartCnt {
 | 
						|
    u16 baudRate : 2;      // Baud Rate
 | 
						|
    u16 ctsEnable : 1;     // Send Signal Enable
 | 
						|
    u16 paritySelect : 1;  // Parity Even/Odd
 | 
						|
    u16 transDataFull : 1; // Transmit Data Full
 | 
						|
    u16 recvDataEmpty : 1; // Receive Data Empty
 | 
						|
    u16 error : 1;         // Error Detect
 | 
						|
    u16 length : 1;        // Data Length
 | 
						|
    u16 fifoEnable : 1;    // FIFO Enable
 | 
						|
    u16 parityEnable : 1;  // Parity Enable
 | 
						|
    u16 transEnable : 1;   // Transmitter Enable
 | 
						|
    u16 recvEnable : 1;    // Receiver Enable
 | 
						|
    u16 mode : 2;          // Communication Mode Select
 | 
						|
    u16 ifEnable : 1;      // Interrupt Request Enable
 | 
						|
    u16 unused_15 : 1;
 | 
						|
    u8 data; // Data
 | 
						|
    u8 unused_31_24;
 | 
						|
};
 | 
						|
 | 
						|
#define ST_SIO_UART_MODE 3 // UART communication mode
 | 
						|
 | 
						|
#define ST_SIO_UART_7BIT 0   // UART communication data length 7 bits
 | 
						|
#define ST_SIO_UART_8BIT 1   //                       8 bits
 | 
						|
#define ST_SIO_PARITY_EVEN 0 // Even parity
 | 
						|
#define ST_SIO_PARITY_ODD 1  // Odd parity
 | 
						|
 | 
						|
// JOY Bus Communication Control Structure
 | 
						|
struct JoyCnt {
 | 
						|
    u8 ifReset : 1; // JOY Bus Reset Interrupt Request
 | 
						|
    u8 ifRecv : 1;  // JOY Bus Received Interrupt Request
 | 
						|
    u8 ifSend : 1;  // JOY Bus Sent Interrupt Request
 | 
						|
    u8 unused_5_3 : 3;
 | 
						|
    u8 ifEnable : 1; // Interrupt Request Enable
 | 
						|
    u8 unused_7 : 1;
 | 
						|
};
 | 
						|
 | 
						|
// JOY Bus Communication Status Structure
 | 
						|
struct JoyStat {
 | 
						|
    u8 unused_0 : 1;
 | 
						|
    u8 recv : 1; // Receive Status
 | 
						|
    u8 unused_2 : 1;
 | 
						|
    u8 send : 1;  // Send Status
 | 
						|
    u8 flags : 2; // General Flag
 | 
						|
    u8 unused_7_6 : 2;
 | 
						|
};
 | 
						|
 | 
						|
// General Input/Output Control Structure
 | 
						|
struct RCnt {
 | 
						|
    u8 sc : 1; // Data
 | 
						|
    u8 sd : 1;
 | 
						|
    u8 si : 1;
 | 
						|
    u8 so : 1;
 | 
						|
    u8 sc_i_o : 1; // I/O Select
 | 
						|
    u8 sd_i_o : 1;
 | 
						|
    u8 si_i_o : 1;
 | 
						|
    u8 so_i_o : 1;
 | 
						|
    u8 ifEnable : 1; // Interrupt Request Enable
 | 
						|
    u8 unused_13_9 : 5;
 | 
						|
    u8 sioModeMaster : 2; // SIO Mode Master
 | 
						|
};
 | 
						|
 | 
						|
#define ST_R_SIO_MASTER_MODE 0 // SIO master mode
 | 
						|
#define ST_R_DIRECT_MODE 2     // General input/output communication mode
 | 
						|
#define ST_R_JOY_MODE 3        // JOY communication mode
 | 
						|
 | 
						|
#define ST_R_IN 0  // Select input
 | 
						|
#define ST_R_OUT 1 // Select output
 | 
						|
 | 
						|
#endif // TYPES_H
 |