208 lines
5.2 KiB
C
208 lines
5.2 KiB
C
#pragma once
|
|
|
|
#include "type.h"
|
|
|
|
typedef struct sh2_reg {
|
|
reg8 SMR; // 0x000
|
|
reg8 BRR; // 0x001
|
|
reg8 SCR; // 0x002
|
|
reg8 TDR; // 0x003
|
|
reg8 SSR; // 0x004
|
|
reg8 RDR; // 0x005
|
|
reg8 _res0[10];
|
|
reg8 TIER; // 0x010
|
|
reg8 FTCSR; // 0x011
|
|
struct {
|
|
reg8 H; // 0x012
|
|
reg8 L; // 0x013
|
|
} FRC;
|
|
struct {
|
|
reg8 H; // 0x014
|
|
reg8 L; // 0x015
|
|
} OCRAB;
|
|
reg8 TCR; // 0x016
|
|
reg8 TOCR; // 0x017
|
|
struct {
|
|
reg8 H; // 0x018
|
|
reg8 L; // 0x018
|
|
} FICR;
|
|
reg8 _res1[70];
|
|
reg16 IPRB; // 0x060
|
|
reg16 VCRA; // 0x062
|
|
reg16 VCRB; // 0x064
|
|
reg16 VCRC; // 0x066
|
|
reg16 VCRD; // 0x068
|
|
reg8 _res2[7];
|
|
reg8 DRCR0; // 0x071
|
|
reg8 DRCR1; // 0x072
|
|
reg8 _res3[13];
|
|
reg8 WTCSR; // 0x080
|
|
reg8 WTCNT; // 0x081
|
|
reg8 _res4[1];
|
|
reg8 WSTCSR; // 0x083
|
|
reg8 _res5[13];
|
|
reg8 SBYCR; // 0x091
|
|
reg8 CCR; // 0x092
|
|
reg8 _res6[77];
|
|
reg16 ICR; // 0x0e0
|
|
reg16 IPRA; // 0x0e2
|
|
reg16 VCRWDT; // 0x0e4
|
|
reg8 _res7[26];
|
|
reg32 DVSR; // 0x100
|
|
reg32 DVDNT; // 0x104
|
|
reg32 DVCR; // 0x108
|
|
reg32 VCRDIV; // 0x10c
|
|
reg32 DVDNTH; // 0x110
|
|
reg32 DVDNTL; // 0x114
|
|
reg8 _res8[40];
|
|
reg16 BARAH; // 0x140
|
|
reg16 BARAL; // 0x142
|
|
reg16 BAMRAH; // 0x144
|
|
reg16 BAMRAL; // 0x146
|
|
reg16 BBRA; // 0x148
|
|
reg8 _res9[22];
|
|
reg16 BARBH; // 0x160
|
|
reg16 BARBL; // 0x162
|
|
reg16 BAMRBH; // 0x164
|
|
reg16 BAMRBL; // 0x166
|
|
reg16 BBRB; // 0x168
|
|
reg8 _res10[6];
|
|
reg16 BDRBH; // 0x170
|
|
reg16 BDRBL; // 0x172
|
|
reg16 BDMRBH; // 0x174
|
|
reg16 BDMRBL; // 0x176
|
|
reg16 BRCR; // 0x178
|
|
reg8 _res11[6];
|
|
reg32 SAR0; // 0x180
|
|
reg32 DAR0; // 0x184
|
|
reg32 TCR0; // 0x188
|
|
reg32 CHCR0; // 0x18c
|
|
reg32 SAR1; // 0x190
|
|
reg32 DAR1; // 0x194
|
|
reg32 TCR1; // 0x198
|
|
reg32 CHCR1; // 0x19c
|
|
reg32 VCRMA0; // 0x1a0
|
|
reg8 _res12[4];
|
|
reg32 VCRDMA1; // 0x1a8
|
|
reg8 _res13[4];
|
|
reg32 DMAOR; // 0x1b0
|
|
reg8 _res14[44];
|
|
reg32 BCR1; // 0x1e0
|
|
reg32 BCR2; // 0x1e4
|
|
reg32 WCR; // 0x1e8
|
|
reg32 MCR; // 0x1ec
|
|
reg32 RTCSR; // 0x1f0
|
|
reg32 RTCNT; // 0x1f4
|
|
reg32 RTCOR; // 0x1f8
|
|
reg8 _res15[4];
|
|
} sh2_reg;
|
|
|
|
static_assert((sizeof (struct sh2_reg)) == 0x200);
|
|
static_assert((offsetof (struct sh2_reg, OCRAB)) == 0x014);
|
|
static_assert((offsetof (struct sh2_reg, BCR1)) == 0x1e0);
|
|
static_assert((offsetof (struct sh2_reg, DVSR)) == 0x100);
|
|
|
|
struct sh2 {
|
|
sh2_reg reg;
|
|
};
|
|
|
|
extern struct sh2 sh2 __asm("sh2");
|
|
|
|
extern reg32 sh2_vec[0xff] __asm("sh2_vec");
|
|
|
|
enum smr_bits {
|
|
SMR__CA__ASYNCHRONOUS_MODE = (0 << 7),
|
|
SMR__CA__CLOCKED_SYNCHRONOUS_MODE = (1 << 7),
|
|
SMR__CHR__EIGHT_BIT_DATA = (0 << 6),
|
|
SMR__CHR__SEVEN_BIT_DATA = (1 << 6),
|
|
SMR__PE__PARITY_BIT_NOT_ADDED_OR_CHECKED = (0 << 5),
|
|
SMR__PE__PARITY_BIT_ADDED_AND_CHECKED = (1 << 5),
|
|
SMR__OE__EVEN_PARITY = (0 << 4),
|
|
SMR__OE__ODD_PARITY = (1 << 4),
|
|
SMR__STOP__ONE_STOP_BIT = (0 << 3),
|
|
SMR__STOP__TWO_STOP_BITS = (1 << 3),
|
|
SMR__MP__DISABLED = (0 << 2),
|
|
SMR__MP__ENABLED = (1 << 2),
|
|
SMR__CKS__PHI_4 = (0b00 << 0),
|
|
SMR__CKS__PHI_16 = (0b01 << 0),
|
|
SMR__CKS__PHI_64 = (0b10 << 0),
|
|
SMR__CKS__PHI_256 = (0b11 << 0)
|
|
};
|
|
|
|
enum scr_bits {
|
|
SCR__TIE__TRANSMITTER_INTERRUPT_ENABLE = (1 << 7),
|
|
SCR__RIE__RECEIVE_INTERRUPT_ENABLE = (1 << 6),
|
|
SCR__TE__TRANSMITTER_ENABLE = (1 << 5),
|
|
SCR__RE__RECEIVER_ENABLE = (1 << 4),
|
|
SCR__MPIE__MULTIPROCESSOR_INTERRUPT_ENABLE = (1 << 3),
|
|
SCR__TEIE__TRANSMIT_END_INTERRUPT_ENABLE = (1 << 2),
|
|
SCR__CKE__INTERNAL_CLOCK__SCK_INPUT = (0b00 << 0),
|
|
SCR__CKE__INTERNAL_CLOCK__SCK_OUTPUT = (0b01 << 0),
|
|
SCR__CKE__EXTERNAL_CLOCK__SCK_INPUT = (0b10 << 0),
|
|
};
|
|
|
|
enum ssr_bits {
|
|
SSR__TDRE = (1 << 7),
|
|
SSR__RDRF = (1 << 6),
|
|
SSR__ORER = (1 << 5),
|
|
SSR__FER = (1 << 4),
|
|
SSR__PER = (1 << 3),
|
|
SSR__TEND = (1 << 2),
|
|
SSR__MPB = (1 << 1),
|
|
SSR__MPBT = (1 << 0),
|
|
};
|
|
|
|
enum tier_bits {
|
|
TIER__ICIE = (1 << 7),
|
|
TIER__OCIAE = (1 << 3),
|
|
TIER__OCIBE = (1 << 2),
|
|
TIER__OVIE = (1 << 1),
|
|
};
|
|
enum ftcsr_bits {
|
|
FTCSR__ICF = (1 << 7),
|
|
FTCSR__OCFA = (1 << 3),
|
|
FTCSR__OCFB = (1 << 2),
|
|
FTCSR__OVF = (1 << 1),
|
|
FTCSR__CCLRA = (1 << 0),
|
|
};
|
|
enum tcr_bits {
|
|
TCR__IEDGA__RISING_EDGE = (1 << 7),
|
|
TCR__CKS__INTERNAL_DIV8 = (0b00),
|
|
TCR__CKS__INTERNAL_DIV32 = (0b01),
|
|
TCR__CKS__INTERNAL_DIV128 = (0b10),
|
|
TCR__CKS__EXTERNAL_RISING = (0b11),
|
|
};
|
|
enum tocr_bits {
|
|
TOCR__OCRS__OCRA = (0 << 4),
|
|
TOCR__OCRS__OCRB = (1 << 4),
|
|
TOCR__OLVLA = (1 << 1),
|
|
TOCR__OLBLB = (1 << 0),
|
|
};
|
|
// enum vcra_bits {
|
|
#define VCRA__SERV(n) (n << 8)
|
|
#define VCRA__SRXV(n) (n << 0)
|
|
// };
|
|
// enum vcrb_bits {
|
|
#define VCRB__STXV(n) (n << 8)
|
|
#define VCRB__STEV(n) (n << 0)
|
|
// };
|
|
// enum vcrc_bits {
|
|
#define VCRC__FICV(n) (n << 8) // input-capture interrupt vector number
|
|
#define VCRC__FOCV(n) (n << 0) // output-compare interrupt vector number
|
|
// };
|
|
// enum vcrd_bits {
|
|
#define VCRD__FOVV(n) (n << 8)
|
|
// };
|
|
|
|
enum ccr_bits {
|
|
CCR__W__WAY0 = (0b00 << 6),
|
|
CCR__W__WAY1 = (0b01 << 6),
|
|
CCR__W__WAY2 = (0b10 << 6),
|
|
CCR__W__WAY3 = (0b11 << 6),
|
|
CCR__CP__CACHE_PURGE = (0b1 << 4),
|
|
CCR__TW__TWO_WAY_MODE = (0b1 << 3),
|
|
CCR__OD__DATA_REPLACEMENT_DISABLE = (0b1 << 2),
|
|
CCR__ID__INSTRUCTION_REPLACEMENT_DISABLE = (0b1 << 1),
|
|
CCR__CE__CACHE_ENABLE = (0b1 << 0),
|
|
};
|