add sh7091 and holly registers

This commit is contained in:
Zack Buhman 2023-10-11 09:01:56 -07:00
commit 5c4c107eaf
11 changed files with 977 additions and 0 deletions

3
.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
*.pyc
__pycache__
.~*

166
holly.h Normal file
View File

@ -0,0 +1,166 @@
#include <stdint.h>
#include <stddef.h>
struct holly_reg {
uint32_t ID; /* Device ID */
uint32_t REVISION; /* Revision Number */
uint32_t SOFTRESET; /* CORE & TA software reset */
uint8_t _pad0[8];
uint32_t STARTRENDER; /* Drawing start */
uint32_t TEST_SELECT; /* Test (writing this register is prohibited) */
uint8_t _pad1[4];
uint32_t PARAM_BASE; /* Base address for ISP parameters */
uint8_t _pad2[8];
uint32_t REGION_BASE; /* Base address for Region Array */
uint32_t SPAN_SORT_CFG; /* Span Sorter control */
uint8_t _pad3[12];
uint32_t VO_BORDER_COL; /* Border area color */
uint32_t FB_R_CTRL; /* Frame buffer read control */
uint32_t FB_W_CTRL; /* Frame buffer write control */
uint32_t FB_W_LINESTRIDE;/* Frame buffer line stride */
uint32_t FB_R_SOF1; /* Read start address for field - 1/strip - 1 */
uint32_t FB_R_SOF2; /* Read start address for field - 2/strip - 2 */
uint8_t _pad4[4];
uint32_t FB_R_SIZE; /* Frame buffer XY size */
uint32_t FB_W_SOF1; /* Write start address for field - 1/strip - 1 */
uint32_t FB_W_SOF2; /* Write start address for field - 2/strip - 2 */
uint32_t FB_X_CLIP; /* Pixel clip X coordinate */
uint32_t FB_Y_CLIP; /* Pixel clip Y coordinate */
uint8_t _pad5[4];
uint32_t FPU_SHAD_SCALE; /* Intensity Volume mode */
uint32_t FPU_CULL_VAL; /* Comparison value for culling */
uint32_t FPU_PARAM_CFG; /* Parameter read control */
uint32_t HALF_OFFSET; /* Pixel sampling control */
uint32_t FPU_PERP_VAL; /* Comparison value for perpendicular polygons */
uint32_t ISP_BACKGND_D; /* Background surface depth */
uint32_t ISP_BACKGND_T; /* Background surface tag */
uint8_t _pad6[8];
uint32_t ISP_FEED_CFG; /* Translucent polygon sort mode */
uint8_t _pad7[4];
uint32_t SDRAM_REFRESH; /* Texture memory refresh counter */
uint32_t SDRAM_ARB_CFG; /* Texture memory arbiter control */
uint32_t SDRAM_CFG; /* Texture memory control */
uint8_t _pad8[4];
uint32_t FOG_COL_RAM; /* Color for Look Up table Fog */
uint32_t FOG_COL_VERT; /* Color for vertex Fog */
uint32_t FOG_DENSITY; /* Fog scale value */
uint32_t FOG_CLAMP_MAX; /* Color clamping maximum value */
uint32_t FOG_CLAMP_MIN; /* Color clamping minimum value */
uint32_t SPG_TRIGGER_POS;/* External trigger signal HV counter value */
uint32_t SPG_HBLANK_INT; /* H-blank interrupt control */
uint32_t SPG_VBLANK_INT; /* V-blank interrupt control */
uint32_t SPG_CONTROL; /* Sync pulse generator control */
uint32_t SPG_HBLANK; /* H-blank control */
uint32_t SPG_LOAD; /* HV counter load value */
uint32_t SPG_VBLANK; /* V-blank control */
uint32_t SPG_WIDTH; /* Sync width control */
uint32_t TEXT_CONTROL; /* Texturing control */
uint32_t VO_CONTROL; /* Video output control */
uint32_t VO_STARTX; /* Video output start X position */
uint32_t VO_STARTY; /* Video output start Y position */
uint32_t SCALER_CTL; /* X & Y scaler control */
uint8_t _pad9[16];
uint32_t PAL_RAM_CTRL; /* Palette RAM control */
uint32_t SPG_STATUS; /* Sync pulse generator status */
uint32_t FB_BURSTCTRL; /* Frame buffer burst control */
uint32_t FB_C_SOF; /* Current frame buffer start address */
uint32_t Y_COEFF; /* Y scaling coefficent */
uint32_t PT_ALPHA_REF; /* Alpha value for Punch Through polygon comparison */
uint8_t _pad10[4];
uint32_t TA_OL_BASE; /* Object List write start address */
uint32_t TA_ISP_BASE; /* ISP/TSP Parameter write start address */
uint32_t TA_OL_LIMIT; /* Object List write limit address */
uint32_t TA_ISP_LIMIT; /* ISP/TSP Parameter limit address */
uint32_t TA_NEXT_OPB; /* Start address for the Object Pointer Block */
uint32_t TA_ITP_CURRENT; /* Starting address where the next ISP/TSP Parameters are stored */
uint32_t TA_GLOB_TILE_CLIP;/* Global Tile Clip control */
uint32_t TA_ALLOC_CTRL; /* Object list control */
uint32_t TA_LIST_INIT; /* TA initialization */
uint32_t TA_YUV_TEX_BASE;/* YUV422 texture write start address */
uint32_t TA_YUV_TEX_CTRL;/* YUV converter control */
uint32_t TA_YUV_TEX_CNT; /* YUV converter macro block counter value */
uint8_t _pad11[12];
uint32_t TA_LIST_CONT; /* TA continuation processing */
uint32_t TA_NEXT_OPB_INIT;/* Additional OPB starting address */
uint8_t _pad12[152];
uint8_t FOG_TABLE[512]; /* Look-up table fog data */
uint8_t _pad13[512];
uint8_t TA_OL_POINTERS[2400];/* TA Object List Pointer data */
uint8_t _pad14[160];
uint8_t PALETTE_RAM[4096];/* Palette RAM */
};
static_assert((offsetof (struct holly_reg, ID)) == 0x0);
static_assert((offsetof (struct holly_reg, REVISION)) == 0x4);
static_assert((offsetof (struct holly_reg, SOFTRESET)) == 0x8);
static_assert((offsetof (struct holly_reg, STARTRENDER)) == 0x14);
static_assert((offsetof (struct holly_reg, TEST_SELECT)) == 0x18);
static_assert((offsetof (struct holly_reg, PARAM_BASE)) == 0x20);
static_assert((offsetof (struct holly_reg, REGION_BASE)) == 0x2c);
static_assert((offsetof (struct holly_reg, SPAN_SORT_CFG)) == 0x30);
static_assert((offsetof (struct holly_reg, VO_BORDER_COL)) == 0x40);
static_assert((offsetof (struct holly_reg, FB_R_CTRL)) == 0x44);
static_assert((offsetof (struct holly_reg, FB_W_CTRL)) == 0x48);
static_assert((offsetof (struct holly_reg, FB_W_LINESTRIDE)) == 0x4c);
static_assert((offsetof (struct holly_reg, FB_R_SOF1)) == 0x50);
static_assert((offsetof (struct holly_reg, FB_R_SOF2)) == 0x54);
static_assert((offsetof (struct holly_reg, FB_R_SIZE)) == 0x5c);
static_assert((offsetof (struct holly_reg, FB_W_SOF1)) == 0x60);
static_assert((offsetof (struct holly_reg, FB_W_SOF2)) == 0x64);
static_assert((offsetof (struct holly_reg, FB_X_CLIP)) == 0x68);
static_assert((offsetof (struct holly_reg, FB_Y_CLIP)) == 0x6c);
static_assert((offsetof (struct holly_reg, FPU_SHAD_SCALE)) == 0x74);
static_assert((offsetof (struct holly_reg, FPU_CULL_VAL)) == 0x78);
static_assert((offsetof (struct holly_reg, FPU_PARAM_CFG)) == 0x7c);
static_assert((offsetof (struct holly_reg, HALF_OFFSET)) == 0x80);
static_assert((offsetof (struct holly_reg, FPU_PERP_VAL)) == 0x84);
static_assert((offsetof (struct holly_reg, ISP_BACKGND_D)) == 0x88);
static_assert((offsetof (struct holly_reg, ISP_BACKGND_T)) == 0x8c);
static_assert((offsetof (struct holly_reg, ISP_FEED_CFG)) == 0x98);
static_assert((offsetof (struct holly_reg, SDRAM_REFRESH)) == 0xa0);
static_assert((offsetof (struct holly_reg, SDRAM_ARB_CFG)) == 0xa4);
static_assert((offsetof (struct holly_reg, SDRAM_CFG)) == 0xa8);
static_assert((offsetof (struct holly_reg, FOG_COL_RAM)) == 0xb0);
static_assert((offsetof (struct holly_reg, FOG_COL_VERT)) == 0xb4);
static_assert((offsetof (struct holly_reg, FOG_DENSITY)) == 0xb8);
static_assert((offsetof (struct holly_reg, FOG_CLAMP_MAX)) == 0xbc);
static_assert((offsetof (struct holly_reg, FOG_CLAMP_MIN)) == 0xc0);
static_assert((offsetof (struct holly_reg, SPG_TRIGGER_POS)) == 0xc4);
static_assert((offsetof (struct holly_reg, SPG_HBLANK_INT)) == 0xc8);
static_assert((offsetof (struct holly_reg, SPG_VBLANK_INT)) == 0xcc);
static_assert((offsetof (struct holly_reg, SPG_CONTROL)) == 0xd0);
static_assert((offsetof (struct holly_reg, SPG_HBLANK)) == 0xd4);
static_assert((offsetof (struct holly_reg, SPG_LOAD)) == 0xd8);
static_assert((offsetof (struct holly_reg, SPG_VBLANK)) == 0xdc);
static_assert((offsetof (struct holly_reg, SPG_WIDTH)) == 0xe0);
static_assert((offsetof (struct holly_reg, TEXT_CONTROL)) == 0xe4);
static_assert((offsetof (struct holly_reg, VO_CONTROL)) == 0xe8);
static_assert((offsetof (struct holly_reg, VO_STARTX)) == 0xec);
static_assert((offsetof (struct holly_reg, VO_STARTY)) == 0xf0);
static_assert((offsetof (struct holly_reg, SCALER_CTL)) == 0xf4);
static_assert((offsetof (struct holly_reg, PAL_RAM_CTRL)) == 0x108);
static_assert((offsetof (struct holly_reg, SPG_STATUS)) == 0x10c);
static_assert((offsetof (struct holly_reg, FB_BURSTCTRL)) == 0x110);
static_assert((offsetof (struct holly_reg, FB_C_SOF)) == 0x114);
static_assert((offsetof (struct holly_reg, Y_COEFF)) == 0x118);
static_assert((offsetof (struct holly_reg, PT_ALPHA_REF)) == 0x11c);
static_assert((offsetof (struct holly_reg, TA_OL_BASE)) == 0x124);
static_assert((offsetof (struct holly_reg, TA_ISP_BASE)) == 0x128);
static_assert((offsetof (struct holly_reg, TA_OL_LIMIT)) == 0x12c);
static_assert((offsetof (struct holly_reg, TA_ISP_LIMIT)) == 0x130);
static_assert((offsetof (struct holly_reg, TA_NEXT_OPB)) == 0x134);
static_assert((offsetof (struct holly_reg, TA_ITP_CURRENT)) == 0x138);
static_assert((offsetof (struct holly_reg, TA_GLOB_TILE_CLIP)) == 0x13c);
static_assert((offsetof (struct holly_reg, TA_ALLOC_CTRL)) == 0x140);
static_assert((offsetof (struct holly_reg, TA_LIST_INIT)) == 0x144);
static_assert((offsetof (struct holly_reg, TA_YUV_TEX_BASE)) == 0x148);
static_assert((offsetof (struct holly_reg, TA_YUV_TEX_CTRL)) == 0x14c);
static_assert((offsetof (struct holly_reg, TA_YUV_TEX_CNT)) == 0x150);
static_assert((offsetof (struct holly_reg, TA_LIST_CONT)) == 0x160);
static_assert((offsetof (struct holly_reg, TA_NEXT_OPB_INIT)) == 0x164);
static_assert((offsetof (struct holly_reg, FOG_TABLE)) == 0x200);
static_assert((offsetof (struct holly_reg, TA_OL_POINTERS)) == 0x600);
static_assert((offsetof (struct holly_reg, PALETTE_RAM)) == 0x1000);
extern holly_reg HOLLY;

25
regs/gen/generate.py Normal file
View File

@ -0,0 +1,25 @@
import io
def _render(out, lines):
indent = " "
level = 0
for l in lines:
if l and (l[0] == "}" or l[0] == ")"):
level -= 2
assert level >= 0, out.getvalue()
out.write(indent * level + l + "\n")
if l and (l[-1] == "{" or l[-1] == "("):
level += 2
if level == 0 and l and l[-1] == ";":
if "static_assert" not in l:
out.write("\n")
return out
def renderer():
out = io.StringIO()
def render(lines):
return _render(out, lines)
return render, out

18
regs/gen/holly.py Normal file
View File

@ -0,0 +1,18 @@
import sys
from sh7091 import new_writer
from sh7091 import read_input
from sh7091 import headers
from generate import renderer
def block():
yield "extern holly_reg HOLLY;"
input_file = sys.argv[1]
rows = read_input(input_file)
process = new_writer()
render, out = renderer()
render(headers())
render(process(rows))
render(block())
sys.stdout.write(out.getvalue())

160
regs/gen/sh7091.py Normal file
View File

@ -0,0 +1,160 @@
import csv
import sys
from functools import partial
from pprint import pprint
from generate import renderer
def as_dict(header, row):
return dict(zip(header, row))
def read_input(filename):
with open(filename) as f:
reader = csv.reader(f, delimiter=",", quotechar='"')
header, *rows = reader
rows = [
as_dict(header, row)
for row in rows
if "".join(map(str, row)).strip()
]
return rows
def size_p(size):
return size in {1, 2, 4}
def size_to_type(size):
if size == 1:
return "uint8_t "
elif size == 2:
return "uint16_t"
elif size == 4:
return "uint32_t"
else:
raise NotImplemented(size)
def new_writer():
first_address = 0
last_address = 0
last_block = None
size_total = 0
reserved_num = 0
stack = []
def terminate():
nonlocal last_block
nonlocal first_address
nonlocal stack
if last_block is not None:
yield "};"
for address, name in stack:
relative_address = address - first_address
yield f"static_assert((offsetof (struct {last_block.lower()}_reg, {name})) == {hex(relative_address)});"
yield ""
stack = []
def process_row(row):
nonlocal first_address
nonlocal last_address
nonlocal last_block
nonlocal reserved_num
nonlocal size_total
nonlocal stack
block = row["block"]
_offset = int(row["offset"], 16) if "offset" in row else 0
_address = int(row["address"], 16)
assert _offset <= 0xff
assert _address <= 0xffff
address = (_offset << 16) | (_address << 0)
size = int(row["size"], 10)
name = row["name"]
description = row["description"]
if block != last_block:
yield from terminate()
first_address = address
last_address = address
size_total = 0
reserved_num = 0
yield f"struct {block.lower()}_reg {{"
if address != last_address:
padding = address - last_address
assert padding > 0, (row, address, last_address)
type = size_to_type(1)
yield f"{type} _pad{reserved_num}[{padding}];"
reserved_num += 1
size_total += padding
def field():
if size_p(size):
assert address % size == 0
type = size_to_type(size)
return f"{type} {name};"
else:
type = size_to_type(1)
return f"{type} {name}[{size}];"
yield field().ljust(25) + f"/* {description} */"
stack.append((address, name))
last_address = address + size
last_block = block
size_total += size
def process(rows):
for row in rows:
yield from process_row(row)
yield from terminate()
return process
def blocks(rows):
stack = []
last_block = None
for row in rows:
block = row["block"]
if last_block != block:
offset = int(row["offset"], 16)
stack.append((block, offset))
last_block = block
yield "struct sh7091_reg {"
last_offset = 0
last_block = None
reserved_num = 0
for block, offset in stack:
if offset != last_offset:
assert last_block is not None
type = size_to_type(1)
raw_pad = (offset - last_offset) << 16
yield f"{type} _pad{reserved_num}[{hex(raw_pad)} - (sizeof (struct {last_block.lower()}_reg))];"
reserved_num += 1
yield f"{block.lower()}_reg {block};"
last_offset = offset
last_block = block
yield "};"
for block, offset in stack:
yield f"static_assert((offsetof (struct sh7091_reg, {block})) == {hex(offset << 16)});"
yield ""
yield "extern sh7091_reg SH7091;"
def headers():
yield "#include <stdint.h>"
yield "#include <stddef.h>"
yield ""
if __name__ == "__main__":
input_file = sys.argv[1]
rows = read_input(input_file)
process = new_writer()
render, out = renderer()
render(headers())
render(process(rows))
render(blocks(rows))
sys.stdout.write(out.getvalue())

87
regs/holly.csv Normal file
View File

@ -0,0 +1,87 @@
"block","address","size","name","r/w","description"
"holly","0000","4","ID","R","Device ID"
"holly","0004","4","REVISION","R","Revision Number"
"holly","0008","4","SOFTRESET","RW","CORE & TA software reset"
,,,,,
"holly","0014","4","STARTRENDER","RW","Drawing start"
"holly","0018","4","TEST_SELECT","RW","Test (writing this register is prohibited)"
,,,,,
"holly","0020","4","PARAM_BASE","RW","Base address for ISP parameters"
,,,,,
"holly","002c","4","REGION_BASE","RW","Base address for Region Array"
"holly","0030","4","SPAN_SORT_CFG","RW","Span Sorter control"
,,,,,
"holly","0040","4","VO_BORDER_COL","RW","Border area color"
"holly","0044","4","FB_R_CTRL","RW","Frame buffer read control"
"holly","0048","4","FB_W_CTRL","RW","Frame buffer write control"
"holly","004c","4","FB_W_LINESTRIDE","RW","Frame buffer line stride"
"holly","0050","4","FB_R_SOF1","RW","Read start address for field - 1/strip - 1"
"holly","0054","4","FB_R_SOF2","RW","Read start address for field - 2/strip - 2"
,,,,,
"holly","005c","4","FB_R_SIZE","RW","Frame buffer XY size"
"holly","0060","4","FB_W_SOF1","RW","Write start address for field - 1/strip - 1"
"holly","0064","4","FB_W_SOF2","RW","Write start address for field - 2/strip - 2"
"holly","0068","4","FB_X_CLIP","RW","Pixel clip X coordinate"
"holly","006c","4","FB_Y_CLIP","RW","Pixel clip Y coordinate"
,,,,,
"holly","0074","4","FPU_SHAD_SCALE","RW","Intensity Volume mode"
"holly","0078","4","FPU_CULL_VAL","RW","Comparison value for culling"
"holly","007c","4","FPU_PARAM_CFG","RW","Parameter read control"
"holly","0080","4","HALF_OFFSET","RW","Pixel sampling control"
"holly","0084","4","FPU_PERP_VAL","RW","Comparison value for perpendicular polygons"
"holly","0088","4","ISP_BACKGND_D","RW","Background surface depth"
"holly","008c","4","ISP_BACKGND_T","RW","Background surface tag"
,,,,,
"holly","0098","4","ISP_FEED_CFG","RW","Translucent polygon sort mode"
,,,,,
"holly","00a0","4","SDRAM_REFRESH","RW","Texture memory refresh counter"
"holly","00a4","4","SDRAM_ARB_CFG","RW","Texture memory arbiter control"
"holly","00a8","4","SDRAM_CFG","RW","Texture memory control"
,,,,,
"holly","00b0","4","FOG_COL_RAM","RW","Color for Look Up table Fog"
"holly","00b4","4","FOG_COL_VERT","RW","Color for vertex Fog"
"holly","00b8","4","FOG_DENSITY","RW","Fog scale value"
"holly","00bc","4","FOG_CLAMP_MAX","RW","Color clamping maximum value"
"holly","00c0","4","FOG_CLAMP_MIN","RW","Color clamping minimum value"
"holly","00c4","4","SPG_TRIGGER_POS","RW","External trigger signal HV counter value"
"holly","00c8","4","SPG_HBLANK_INT","RW","H-blank interrupt control"
"holly","00cc","4","SPG_VBLANK_INT","RW","V-blank interrupt control"
"holly","00d0","4","SPG_CONTROL","RW","Sync pulse generator control"
"holly","00d4","4","SPG_HBLANK","RW","H-blank control"
"holly","00d8","4","SPG_LOAD","RW","HV counter load value"
"holly","00dc","4","SPG_VBLANK","RW","V-blank control"
"holly","00e0","4","SPG_WIDTH","RW","Sync width control"
"holly","00e4","4","TEXT_CONTROL","RW","Texturing control"
"holly","00e8","4","VO_CONTROL","RW","Video output control"
"holly","00ec","4","VO_STARTX","RW","Video output start X position"
"holly","00f0","4","VO_STARTY","RW","Video output start Y position"
"holly","00f4","4","SCALER_CTL","RW","X & Y scaler control"
,,,,,
"holly","0108","4","PAL_RAM_CTRL","RW","Palette RAM control"
"holly","010c","4","SPG_STATUS","R","Sync pulse generator status"
"holly","0110","4","FB_BURSTCTRL","RW","Frame buffer burst control"
"holly","0114","4","FB_C_SOF","R","Current frame buffer start address"
"holly","0118","4","Y_COEFF","RW","Y scaling coefficent"
"holly","011c","4","PT_ALPHA_REF","RW","Alpha value for Punch Through polygon comparison"
,,,,,
"holly","0124","4","TA_OL_BASE","RW","Object List write start address"
"holly","0128","4","TA_ISP_BASE","RW","ISP/TSP Parameter write start address"
"holly","012c","4","TA_OL_LIMIT","RW","Object List write limit address"
"holly","0130","4","TA_ISP_LIMIT","RW","ISP/TSP Parameter limit address"
"holly","0134","4","TA_NEXT_OPB","R","Start address for the Object Pointer Block"
"holly","0138","4","TA_ITP_CURRENT","R","Starting address where the next ISP/TSP Parameters are stored"
"holly","013c","4","TA_GLOB_TILE_CLIP","RW","Global Tile Clip control"
"holly","0140","4","TA_ALLOC_CTRL","RW","Object list control"
"holly","0144","4","TA_LIST_INIT","RW","TA initialization"
"holly","0148","4","TA_YUV_TEX_BASE","RW","YUV422 texture write start address"
"holly","014c","4","TA_YUV_TEX_CTRL","RW","YUV converter control"
"holly","0150","4","TA_YUV_TEX_CNT","R","YUV converter macro block counter value"
,,,,,
"holly","0160","4","TA_LIST_CONT","RW","TA continuation processing"
"holly","0164","4","TA_NEXT_OPB_INIT","RW","Additional OPB starting address"
,,,,,
"holly","0200","512","FOG_TABLE","RW","Look-up table fog data"
,,,,,
"holly","0600","2400","TA_OL_POINTERS","R","TA Object List Pointer data"
,,,,,
"holly","1000","4096","PALETTE_RAM","RW","Palette RAM"
1 block address size name r/w description
2 holly 0000 4 ID R Device ID
3 holly 0004 4 REVISION R Revision Number
4 holly 0008 4 SOFTRESET RW CORE & TA software reset
5
6 holly 0014 4 STARTRENDER RW Drawing start
7 holly 0018 4 TEST_SELECT RW Test (writing this register is prohibited)
8
9 holly 0020 4 PARAM_BASE RW Base address for ISP parameters
10
11 holly 002c 4 REGION_BASE RW Base address for Region Array
12 holly 0030 4 SPAN_SORT_CFG RW Span Sorter control
13
14 holly 0040 4 VO_BORDER_COL RW Border area color
15 holly 0044 4 FB_R_CTRL RW Frame buffer read control
16 holly 0048 4 FB_W_CTRL RW Frame buffer write control
17 holly 004c 4 FB_W_LINESTRIDE RW Frame buffer line stride
18 holly 0050 4 FB_R_SOF1 RW Read start address for field - 1/strip - 1
19 holly 0054 4 FB_R_SOF2 RW Read start address for field - 2/strip - 2
20
21 holly 005c 4 FB_R_SIZE RW Frame buffer XY size
22 holly 0060 4 FB_W_SOF1 RW Write start address for field - 1/strip - 1
23 holly 0064 4 FB_W_SOF2 RW Write start address for field - 2/strip - 2
24 holly 0068 4 FB_X_CLIP RW Pixel clip X coordinate
25 holly 006c 4 FB_Y_CLIP RW Pixel clip Y coordinate
26
27 holly 0074 4 FPU_SHAD_SCALE RW Intensity Volume mode
28 holly 0078 4 FPU_CULL_VAL RW Comparison value for culling
29 holly 007c 4 FPU_PARAM_CFG RW Parameter read control
30 holly 0080 4 HALF_OFFSET RW Pixel sampling control
31 holly 0084 4 FPU_PERP_VAL RW Comparison value for perpendicular polygons
32 holly 0088 4 ISP_BACKGND_D RW Background surface depth
33 holly 008c 4 ISP_BACKGND_T RW Background surface tag
34
35 holly 0098 4 ISP_FEED_CFG RW Translucent polygon sort mode
36
37 holly 00a0 4 SDRAM_REFRESH RW Texture memory refresh counter
38 holly 00a4 4 SDRAM_ARB_CFG RW Texture memory arbiter control
39 holly 00a8 4 SDRAM_CFG RW Texture memory control
40
41 holly 00b0 4 FOG_COL_RAM RW Color for Look Up table Fog
42 holly 00b4 4 FOG_COL_VERT RW Color for vertex Fog
43 holly 00b8 4 FOG_DENSITY RW Fog scale value
44 holly 00bc 4 FOG_CLAMP_MAX RW Color clamping maximum value
45 holly 00c0 4 FOG_CLAMP_MIN RW Color clamping minimum value
46 holly 00c4 4 SPG_TRIGGER_POS RW External trigger signal HV counter value
47 holly 00c8 4 SPG_HBLANK_INT RW H-blank interrupt control
48 holly 00cc 4 SPG_VBLANK_INT RW V-blank interrupt control
49 holly 00d0 4 SPG_CONTROL RW Sync pulse generator control
50 holly 00d4 4 SPG_HBLANK RW H-blank control
51 holly 00d8 4 SPG_LOAD RW HV counter load value
52 holly 00dc 4 SPG_VBLANK RW V-blank control
53 holly 00e0 4 SPG_WIDTH RW Sync width control
54 holly 00e4 4 TEXT_CONTROL RW Texturing control
55 holly 00e8 4 VO_CONTROL RW Video output control
56 holly 00ec 4 VO_STARTX RW Video output start X position
57 holly 00f0 4 VO_STARTY RW Video output start Y position
58 holly 00f4 4 SCALER_CTL RW X & Y scaler control
59
60 holly 0108 4 PAL_RAM_CTRL RW Palette RAM control
61 holly 010c 4 SPG_STATUS R Sync pulse generator status
62 holly 0110 4 FB_BURSTCTRL RW Frame buffer burst control
63 holly 0114 4 FB_C_SOF R Current frame buffer start address
64 holly 0118 4 Y_COEFF RW Y scaling coefficent
65 holly 011c 4 PT_ALPHA_REF RW Alpha value for Punch Through polygon comparison
66
67 holly 0124 4 TA_OL_BASE RW Object List write start address
68 holly 0128 4 TA_ISP_BASE RW ISP/TSP Parameter write start address
69 holly 012c 4 TA_OL_LIMIT RW Object List write limit address
70 holly 0130 4 TA_ISP_LIMIT RW ISP/TSP Parameter limit address
71 holly 0134 4 TA_NEXT_OPB R Start address for the Object Pointer Block
72 holly 0138 4 TA_ITP_CURRENT R Starting address where the next ISP/TSP Parameters are stored
73 holly 013c 4 TA_GLOB_TILE_CLIP RW Global Tile Clip control
74 holly 0140 4 TA_ALLOC_CTRL RW Object list control
75 holly 0144 4 TA_LIST_INIT RW TA initialization
76 holly 0148 4 TA_YUV_TEX_BASE RW YUV422 texture write start address
77 holly 014c 4 TA_YUV_TEX_CTRL RW YUV converter control
78 holly 0150 4 TA_YUV_TEX_CNT R YUV converter macro block counter value
79
80 holly 0160 4 TA_LIST_CONT RW TA continuation processing
81 holly 0164 4 TA_NEXT_OPB_INIT RW Additional OPB starting address
82
83 holly 0200 512 FOG_TABLE RW Look-up table fog data
84
85 holly 0600 2400 TA_OL_POINTERS R TA Object List Pointer data
86
87 holly 1000 4096 PALETTE_RAM RW Palette RAM

BIN
regs/holly.ods Normal file

Binary file not shown.

126
regs/sh7091.csv Normal file
View File

@ -0,0 +1,126 @@
"block","offset","address","size","name","r/w","description"
"CCN","00","0000",4,"PTEH","RW","Page table entry high register"
"CCN","00","0004",4,"PTEL","RW","Page table entry low register"
"CCN","00","0008",4,"TTB","RW","Translation table base register"
"CCN","00","000c",4,"TEA","RW","TLB exception address register"
"CCN","00","0010",4,"MMUCR","RW","MMU control register"
"CCN","00","0014",1,"BASRA","RW","Break ASID register A"
"CCN","00","0018",1,"BASRB","RW","Break ASID register B"
"CCN","00","001c",4,"CCR","RW","Cache control register"
"CCN","00","0020",4,"TRA","RW","TRAPA exception register"
"CCN","00","0024",4,"EXPEVT","RW","Exception event register"
"CCN","00","0028",4,"INTEVT","RW","Interrupt event register"
"CCN","00","0034",4,"PTEA","RW","Page table entry assistance register"
"CCN","00","0038",4,"QACR0","RW","Queue address control register 0"
"CCN","00","003c",4,"QACR1","RW","Queue address control register 1"
,,,,,,
"UBC","20","0000",4,"BARA","RW","Break address register A"
"UBC","20","0004",1,"BAMRA","RW","Break address mask register A"
"UBC","20","0008",2,"BBRA","RW","Break bus cycle register A"
"UBC","20","000c",4,"BARB","RW","Break address register B"
"UBC","20","0010",1,"BAMRB","RW","Break address mask register B"
"UBC","20","0014",2,"BBRB","RW","Break bus cycle register B"
"UBC","20","0018",4,"BDRB","RW","Break data register B"
"UBC","20","001c",4,"BDMRB","RW","Break data mask register B"
"UBC","20","0020",2,"BRCR","RW","Break control register"
,,,,,,
"BSC","80","0000",4,"BCR1","RW","Bus control register 1"
"BSC","80","0004",2,"BCR2","RW","Bus control register 2"
"BSC","80","0008",4,"WCR1","RW","Wait state control register 1"
"BSC","80","000c",4,"WCR2","RW","Wait state control register 2"
"BSC","80","0010",4,"WCR3","RW","Wait state control register 3"
"BSC","80","0014",4,"MCR","RW","Memory control register"
"BSC","80","0018",2,"PCR","RW","PCMCIA control register"
"BSC","80","001c",2,"RTCSR","RW","Refresh timer control/status register"
"BSC","80","0020",2,"RTCNT","RW","Refresh timer counter"
"BSC","80","0024",2,"RTCOR","RW","Refresh timer constant counter"
"BSC","80","0028",2,"RFCR","RW","Refresh count register"
"BSC","80","002c",4,"PCTRA","RW","Port control register A"
"BSC","80","0030",2,"PDTRA","RW","Port data register A"
"BSC","80","0040",4,"PCTRB","RW","Port control register B"
"BSC","80","0044",2,"PDTRB","RW","Port data register B"
"BSC","80","0048",2,"GPIOIC","RW","GPIO interrupt control register"
"BSC","90","0000",65536,"SDMR2","W","Synchronous DRAM mode registers"
"BSC","94","0000",65536,"SDMR3","W","Synchronous DRAM mode registers"
,,,,,,
"DMAC","a0","0000",4,"SAR0","RW","DMA source address register 0"
"DMAC","a0","0004",4,"DAR0","RW","DMA destination address register 0"
"DMAC","a0","0008",4,"DMATCR0","RW","DMA transfer count register 0"
"DMAC","a0","000c",4,"CHCR0","RW","DMA control register 0"
"DMAC","a0","0010",4,"SAR1","RW","DMA source address register 1"
"DMAC","a0","0014",4,"DAR1","RW","DMA destination address register 1"
"DMAC","a0","0018",4,"DMATCR1","RW","DMA transfer count register 1"
"DMAC","a0","001c",4,"CHCR1","RW","DMA control register 1"
"DMAC","a0","0020",4,"SAR2","RW","DMA source address register 2"
"DMAC","a0","0024",4,"DAR2","RW","DMA destination address register 2"
"DMAC","a0","0028",4,"DMATCR2","RW","DMA transfer count register 2"
"DMAC","a0","002c",4,"CHCR2","RW","DMA control register 2"
"DMAC","a0","0030",4,"SAR3","RW","DMA source address register 3"
"DMAC","a0","0034",4,"DAR3","RW","DMA destination address register 3"
"DMAC","a0","0038",4,"DMATCR3","RW","DMA transfer count register 3"
"DMAC","a0","003c",4,"CHCR3","RW","DMA control register 3"
"DMAC","a0","0040",4,"DMAOR","RW","DMA operation register"
,,,,,,
"CPG","c0","0000",2,"FRQCR","RW","Frequency control register"
"CPG","c0","0004",1,"STBCR","RW","Standby control register"
"CPG","c0","0008",2,"WTCNT","RW","Watchdog timer counter"
"CPG","c0","000c",2,"WTCSR","RW","Watchdog timer control/status register"
"CPG","c0","0010",1,"STBCR2","RW","Standby control register 2"
,,,,,,
"RTC","c8","0000",1,"R64CNT","R","64 Hz counter"
"RTC","c8","0004",1,"RSECCNT","RW","Second counter"
"RTC","c8","0008",1,"RMINCNT","RW","Minute counter"
"RTC","c8","000c",1,"RHRCNT","RW","Hour counter"
"RTC","c8","0010",1,"RWKCNT","RW","Day-of-week counter"
"RTC","c8","0014",1,"RDAYCNT","RW","Day counter"
"RTC","c8","0018",1,"RMONCNT","RW","Month counter"
"RTC","c8","001c",2,"RYRCNT","RW","Year counter"
"RTC","c8","0020",1,"RSECAR","RW","Second alarm register"
"RTC","c8","0024",1,"RMINAR","RW","Minute alarm register"
"RTC","c8","0028",1,"RHRAR","RW","Hour alarm register"
"RTC","c8","002c",1,"RWKAR","RW","Day-of-week alarm register"
"RTC","c8","0030",1,"RDAYAR","RW","Day alarm register"
"RTC","c8","0034",1,"RMONAR","RW","Month alarm register"
"RTC","c8","0038",1,"RCR1","RW","RTC control register 1"
"RTC","c8","003c",1,"RCR2","RW","RTC control register 2"
,,,,,,
"INTC","d0","0000",2,"ICR","RW","Interrupt control register"
"INTC","d0","0004",2,"IPRA","RW","Interrupt priority register A"
"INTC","d0","0008",2,"IPRB","RW","Interrupt priority register B"
"INTC","d0","000c",2,"IPRC","RW","Interrupt priority register C"
,,,,,,
"TMU","d8","0000",1,"TOCR","RW","Timer output control register"
"TMU","d8","0004",1,"TSTR","RW","Timer start register"
"TMU","d8","0008",4,"TCOR0","RW","Timer constant register 0"
"TMU","d8","000c",4,"TCNT0","RW","Timer counter 0"
"TMU","d8","0010",2,"TCR0","RW","Timer control register 0"
"TMU","d8","0014",4,"TCOR1","RW","Timer constant register 1"
"TMU","d8","0018",4,"TCNT1","RW","Timer counter 1"
"TMU","d8","001c",2,"TCR1","RW","Timer control register 1"
"TMU","d8","0020",4,"TCOR2","RW","Timer constant register 2"
"TMU","d8","0024",4,"TCNT2","RW","Timer counter 2"
"TMU","d8","0028",2,"TCR2","RW","Timer control register 2"
"TMU","d8","002c",4,"TCPR2","R","Timer input capture register 2"
,,,,,,
"SCI","e0","0000",1,"SCSMR1","RW","Serial mode register 1"
"SCI","e0","0004",1,"SCBRR1","RW","Bit rate register 1"
"SCI","e0","0008",1,"SCSCR1","RW","Serial control register 1"
"SCI","e0","000c",1,"SCTDR1","RW","Transmit data register 1"
"SCI","e0","0010",1,"SCSSR1","RW","Serial status register 1"
"SCI","e0","0014",1,"SCRDR1","R","Receive data register 1"
"SCI","e0","0018",1,"SCSCMR1","RW","Smart card mode register 1"
"SCI","e0","001c",1,"SCSPTR1","RW","Serial port register"
,,,,,,
"SCIF","e8","0000",2,"SCSMR2","RW","Serial mode register 2"
"SCIF","e8","0004",1,"SCBRR2","RW","Bit rate register 2"
"SCIF","e8","0008",2,"SCSCR2","RW","Serial control register 2"
"SCIF","e8","000c",1,"SCFTDR2","W","Transmit FIFO data register 2"
"SCIF","e8","0010",2,"SCFSR2","RW","Serial status register 2"
"SCIF","e8","0014",1,"SCFRDR2","R","Receive FIFO data register 2"
"SCIF","e8","0018",2,"SCFCR2","RW","FIFO control register"
"SCIF","e8","001c",2,"SCFDR2","R","FIFO data count register"
"SCIF","e8","0020",2,"SCSPTR2","RW","Serial port register 2"
"SCIF","e8","0024",2,"SCLSR2","RW","Line status register 2"
,,,,,,
"UDI","f0","0000",2,"SDIR","R","Instruction register"
"UDI","f0","0008",4,"SDDR","R","Data register"
1 block offset address size name r/w description
2 CCN 00 0000 4 PTEH RW Page table entry high register
3 CCN 00 0004 4 PTEL RW Page table entry low register
4 CCN 00 0008 4 TTB RW Translation table base register
5 CCN 00 000c 4 TEA RW TLB exception address register
6 CCN 00 0010 4 MMUCR RW MMU control register
7 CCN 00 0014 1 BASRA RW Break ASID register A
8 CCN 00 0018 1 BASRB RW Break ASID register B
9 CCN 00 001c 4 CCR RW Cache control register
10 CCN 00 0020 4 TRA RW TRAPA exception register
11 CCN 00 0024 4 EXPEVT RW Exception event register
12 CCN 00 0028 4 INTEVT RW Interrupt event register
13 CCN 00 0034 4 PTEA RW Page table entry assistance register
14 CCN 00 0038 4 QACR0 RW Queue address control register 0
15 CCN 00 003c 4 QACR1 RW Queue address control register 1
16
17 UBC 20 0000 4 BARA RW Break address register A
18 UBC 20 0004 1 BAMRA RW Break address mask register A
19 UBC 20 0008 2 BBRA RW Break bus cycle register A
20 UBC 20 000c 4 BARB RW Break address register B
21 UBC 20 0010 1 BAMRB RW Break address mask register B
22 UBC 20 0014 2 BBRB RW Break bus cycle register B
23 UBC 20 0018 4 BDRB RW Break data register B
24 UBC 20 001c 4 BDMRB RW Break data mask register B
25 UBC 20 0020 2 BRCR RW Break control register
26
27 BSC 80 0000 4 BCR1 RW Bus control register 1
28 BSC 80 0004 2 BCR2 RW Bus control register 2
29 BSC 80 0008 4 WCR1 RW Wait state control register 1
30 BSC 80 000c 4 WCR2 RW Wait state control register 2
31 BSC 80 0010 4 WCR3 RW Wait state control register 3
32 BSC 80 0014 4 MCR RW Memory control register
33 BSC 80 0018 2 PCR RW PCMCIA control register
34 BSC 80 001c 2 RTCSR RW Refresh timer control/status register
35 BSC 80 0020 2 RTCNT RW Refresh timer counter
36 BSC 80 0024 2 RTCOR RW Refresh timer constant counter
37 BSC 80 0028 2 RFCR RW Refresh count register
38 BSC 80 002c 4 PCTRA RW Port control register A
39 BSC 80 0030 2 PDTRA RW Port data register A
40 BSC 80 0040 4 PCTRB RW Port control register B
41 BSC 80 0044 2 PDTRB RW Port data register B
42 BSC 80 0048 2 GPIOIC RW GPIO interrupt control register
43 BSC 90 0000 65536 SDMR2 W Synchronous DRAM mode registers
44 BSC 94 0000 65536 SDMR3 W Synchronous DRAM mode registers
45
46 DMAC a0 0000 4 SAR0 RW DMA source address register 0
47 DMAC a0 0004 4 DAR0 RW DMA destination address register 0
48 DMAC a0 0008 4 DMATCR0 RW DMA transfer count register 0
49 DMAC a0 000c 4 CHCR0 RW DMA control register 0
50 DMAC a0 0010 4 SAR1 RW DMA source address register 1
51 DMAC a0 0014 4 DAR1 RW DMA destination address register 1
52 DMAC a0 0018 4 DMATCR1 RW DMA transfer count register 1
53 DMAC a0 001c 4 CHCR1 RW DMA control register 1
54 DMAC a0 0020 4 SAR2 RW DMA source address register 2
55 DMAC a0 0024 4 DAR2 RW DMA destination address register 2
56 DMAC a0 0028 4 DMATCR2 RW DMA transfer count register 2
57 DMAC a0 002c 4 CHCR2 RW DMA control register 2
58 DMAC a0 0030 4 SAR3 RW DMA source address register 3
59 DMAC a0 0034 4 DAR3 RW DMA destination address register 3
60 DMAC a0 0038 4 DMATCR3 RW DMA transfer count register 3
61 DMAC a0 003c 4 CHCR3 RW DMA control register 3
62 DMAC a0 0040 4 DMAOR RW DMA operation register
63
64 CPG c0 0000 2 FRQCR RW Frequency control register
65 CPG c0 0004 1 STBCR RW Standby control register
66 CPG c0 0008 2 WTCNT RW Watchdog timer counter
67 CPG c0 000c 2 WTCSR RW Watchdog timer control/status register
68 CPG c0 0010 1 STBCR2 RW Standby control register 2
69
70 RTC c8 0000 1 R64CNT R 64 Hz counter
71 RTC c8 0004 1 RSECCNT RW Second counter
72 RTC c8 0008 1 RMINCNT RW Minute counter
73 RTC c8 000c 1 RHRCNT RW Hour counter
74 RTC c8 0010 1 RWKCNT RW Day-of-week counter
75 RTC c8 0014 1 RDAYCNT RW Day counter
76 RTC c8 0018 1 RMONCNT RW Month counter
77 RTC c8 001c 2 RYRCNT RW Year counter
78 RTC c8 0020 1 RSECAR RW Second alarm register
79 RTC c8 0024 1 RMINAR RW Minute alarm register
80 RTC c8 0028 1 RHRAR RW Hour alarm register
81 RTC c8 002c 1 RWKAR RW Day-of-week alarm register
82 RTC c8 0030 1 RDAYAR RW Day alarm register
83 RTC c8 0034 1 RMONAR RW Month alarm register
84 RTC c8 0038 1 RCR1 RW RTC control register 1
85 RTC c8 003c 1 RCR2 RW RTC control register 2
86
87 INTC d0 0000 2 ICR RW Interrupt control register
88 INTC d0 0004 2 IPRA RW Interrupt priority register A
89 INTC d0 0008 2 IPRB RW Interrupt priority register B
90 INTC d0 000c 2 IPRC RW Interrupt priority register C
91
92 TMU d8 0000 1 TOCR RW Timer output control register
93 TMU d8 0004 1 TSTR RW Timer start register
94 TMU d8 0008 4 TCOR0 RW Timer constant register 0
95 TMU d8 000c 4 TCNT0 RW Timer counter 0
96 TMU d8 0010 2 TCR0 RW Timer control register 0
97 TMU d8 0014 4 TCOR1 RW Timer constant register 1
98 TMU d8 0018 4 TCNT1 RW Timer counter 1
99 TMU d8 001c 2 TCR1 RW Timer control register 1
100 TMU d8 0020 4 TCOR2 RW Timer constant register 2
101 TMU d8 0024 4 TCNT2 RW Timer counter 2
102 TMU d8 0028 2 TCR2 RW Timer control register 2
103 TMU d8 002c 4 TCPR2 R Timer input capture register 2
104
105 SCI e0 0000 1 SCSMR1 RW Serial mode register 1
106 SCI e0 0004 1 SCBRR1 RW Bit rate register 1
107 SCI e0 0008 1 SCSCR1 RW Serial control register 1
108 SCI e0 000c 1 SCTDR1 RW Transmit data register 1
109 SCI e0 0010 1 SCSSR1 RW Serial status register 1
110 SCI e0 0014 1 SCRDR1 R Receive data register 1
111 SCI e0 0018 1 SCSCMR1 RW Smart card mode register 1
112 SCI e0 001c 1 SCSPTR1 RW Serial port register
113
114 SCIF e8 0000 2 SCSMR2 RW Serial mode register 2
115 SCIF e8 0004 1 SCBRR2 RW Bit rate register 2
116 SCIF e8 0008 2 SCSCR2 RW Serial control register 2
117 SCIF e8 000c 1 SCFTDR2 W Transmit FIFO data register 2
118 SCIF e8 0010 2 SCFSR2 RW Serial status register 2
119 SCIF e8 0014 1 SCFRDR2 R Receive FIFO data register 2
120 SCIF e8 0018 2 SCFCR2 RW FIFO control register
121 SCIF e8 001c 2 SCFDR2 R FIFO data count register
122 SCIF e8 0020 2 SCSPTR2 RW Serial port register 2
123 SCIF e8 0024 2 SCLSR2 RW Line status register 2
124
125 UDI f0 0000 2 SDIR R Instruction register
126 UDI f0 0008 4 SDDR R Data register

BIN
regs/sh7091.ods Normal file

Binary file not shown.

376
sh7091.h Normal file
View File

@ -0,0 +1,376 @@
#include <cstdint>
#include <cstddef>
struct ccn_reg {
uint32_t PTEH; /* Page table entry high register */
uint32_t PTEL; /* Page table entry low register */
uint32_t TTB; /* Translation table base register */
uint32_t TEA; /* TLB exception address register */
uint32_t MMUCR; /* MMU control register */
uint8_t BASRA; /* Break ASID register A */
uint8_t _pad0[3];
uint8_t BASRB; /* Break ASID register B */
uint8_t _pad1[3];
uint32_t CCR; /* Cache control register */
uint32_t TRA; /* TRAPA exception register */
uint32_t EXPEVT; /* Exception event register */
uint32_t INTEVT; /* Interrupt event register */
uint8_t _pad2[8];
uint32_t PTEA; /* Page table entry assistance register */
uint32_t QACR0; /* Queue address control register 0 */
uint32_t QACR1; /* Queue address control register 1 */
};
static_assert((offsetof (struct ccn_reg, PTEH)) == 0x0);
static_assert((offsetof (struct ccn_reg, PTEL)) == 0x4);
static_assert((offsetof (struct ccn_reg, TTB)) == 0x8);
static_assert((offsetof (struct ccn_reg, TEA)) == 0xc);
static_assert((offsetof (struct ccn_reg, MMUCR)) == 0x10);
static_assert((offsetof (struct ccn_reg, BASRA)) == 0x14);
static_assert((offsetof (struct ccn_reg, BASRB)) == 0x18);
static_assert((offsetof (struct ccn_reg, CCR)) == 0x1c);
static_assert((offsetof (struct ccn_reg, TRA)) == 0x20);
static_assert((offsetof (struct ccn_reg, EXPEVT)) == 0x24);
static_assert((offsetof (struct ccn_reg, INTEVT)) == 0x28);
static_assert((offsetof (struct ccn_reg, PTEA)) == 0x34);
static_assert((offsetof (struct ccn_reg, QACR0)) == 0x38);
static_assert((offsetof (struct ccn_reg, QACR1)) == 0x3c);
struct ubc_reg {
uint32_t BARA; /* Break address register A */
uint8_t BAMRA; /* Break address mask register A */
uint8_t _pad0[3];
uint16_t BBRA; /* Break bus cycle register A */
uint8_t _pad1[2];
uint32_t BARB; /* Break address register B */
uint8_t BAMRB; /* Break address mask register B */
uint8_t _pad2[3];
uint16_t BBRB; /* Break bus cycle register B */
uint8_t _pad3[2];
uint32_t BDRB; /* Break data register B */
uint32_t BDMRB; /* Break data mask register B */
uint16_t BRCR; /* Break control register */
};
static_assert((offsetof (struct ubc_reg, BARA)) == 0x0);
static_assert((offsetof (struct ubc_reg, BAMRA)) == 0x4);
static_assert((offsetof (struct ubc_reg, BBRA)) == 0x8);
static_assert((offsetof (struct ubc_reg, BARB)) == 0xc);
static_assert((offsetof (struct ubc_reg, BAMRB)) == 0x10);
static_assert((offsetof (struct ubc_reg, BBRB)) == 0x14);
static_assert((offsetof (struct ubc_reg, BDRB)) == 0x18);
static_assert((offsetof (struct ubc_reg, BDMRB)) == 0x1c);
static_assert((offsetof (struct ubc_reg, BRCR)) == 0x20);
struct bsc_reg {
uint32_t BCR1; /* Bus control register 1 */
uint16_t BCR2; /* Bus control register 2 */
uint8_t _pad0[2];
uint32_t WCR1; /* Wait state control register 1 */
uint32_t WCR2; /* Wait state control register 2 */
uint32_t WCR3; /* Wait state control register 3 */
uint32_t MCR; /* Memory control register */
uint16_t PCR; /* PCMCIA control register */
uint8_t _pad1[2];
uint16_t RTCSR; /* Refresh timer control/status register */
uint8_t _pad2[2];
uint16_t RTCNT; /* Refresh timer counter */
uint8_t _pad3[2];
uint16_t RTCOR; /* Refresh timer constant counter */
uint8_t _pad4[2];
uint16_t RFCR; /* Refresh count register */
uint8_t _pad5[2];
uint32_t PCTRA; /* Port control register A */
uint16_t PDTRA; /* Port data register A */
uint8_t _pad6[14];
uint32_t PCTRB; /* Port control register B */
uint16_t PDTRB; /* Port data register B */
uint8_t _pad7[2];
uint16_t GPIOIC; /* GPIO interrupt control register */
uint8_t _pad8[1048502];
uint8_t SDMR2[65536]; /* Synchronous DRAM mode registers */
uint8_t _pad9[196608];
uint8_t SDMR3[65536]; /* Synchronous DRAM mode registers */
};
static_assert((offsetof (struct bsc_reg, BCR1)) == 0x0);
static_assert((offsetof (struct bsc_reg, BCR2)) == 0x4);
static_assert((offsetof (struct bsc_reg, WCR1)) == 0x8);
static_assert((offsetof (struct bsc_reg, WCR2)) == 0xc);
static_assert((offsetof (struct bsc_reg, WCR3)) == 0x10);
static_assert((offsetof (struct bsc_reg, MCR)) == 0x14);
static_assert((offsetof (struct bsc_reg, PCR)) == 0x18);
static_assert((offsetof (struct bsc_reg, RTCSR)) == 0x1c);
static_assert((offsetof (struct bsc_reg, RTCNT)) == 0x20);
static_assert((offsetof (struct bsc_reg, RTCOR)) == 0x24);
static_assert((offsetof (struct bsc_reg, RFCR)) == 0x28);
static_assert((offsetof (struct bsc_reg, PCTRA)) == 0x2c);
static_assert((offsetof (struct bsc_reg, PDTRA)) == 0x30);
static_assert((offsetof (struct bsc_reg, PCTRB)) == 0x40);
static_assert((offsetof (struct bsc_reg, PDTRB)) == 0x44);
static_assert((offsetof (struct bsc_reg, GPIOIC)) == 0x48);
static_assert((offsetof (struct bsc_reg, SDMR2)) == 0x100000);
static_assert((offsetof (struct bsc_reg, SDMR3)) == 0x140000);
struct dmac_reg {
uint32_t SAR0; /* DMA source address register 0 */
uint32_t DAR0; /* DMA destination address register 0 */
uint32_t DMATCR0; /* DMA transfer count register 0 */
uint32_t CHCR0; /* DMA control register 0 */
uint32_t SAR1; /* DMA source address register 1 */
uint32_t DAR1; /* DMA destination address register 1 */
uint32_t DMATCR1; /* DMA transfer count register 1 */
uint32_t CHCR1; /* DMA control register 1 */
uint32_t SAR2; /* DMA source address register 2 */
uint32_t DAR2; /* DMA destination address register 2 */
uint32_t DMATCR2; /* DMA transfer count register 2 */
uint32_t CHCR2; /* DMA control register 2 */
uint32_t SAR3; /* DMA source address register 3 */
uint32_t DAR3; /* DMA destination address register 3 */
uint32_t DMATCR3; /* DMA transfer count register 3 */
uint32_t CHCR3; /* DMA control register 3 */
uint32_t DMAOR; /* DMA operation register */
};
static_assert((offsetof (struct dmac_reg, SAR0)) == 0x0);
static_assert((offsetof (struct dmac_reg, DAR0)) == 0x4);
static_assert((offsetof (struct dmac_reg, DMATCR0)) == 0x8);
static_assert((offsetof (struct dmac_reg, CHCR0)) == 0xc);
static_assert((offsetof (struct dmac_reg, SAR1)) == 0x10);
static_assert((offsetof (struct dmac_reg, DAR1)) == 0x14);
static_assert((offsetof (struct dmac_reg, DMATCR1)) == 0x18);
static_assert((offsetof (struct dmac_reg, CHCR1)) == 0x1c);
static_assert((offsetof (struct dmac_reg, SAR2)) == 0x20);
static_assert((offsetof (struct dmac_reg, DAR2)) == 0x24);
static_assert((offsetof (struct dmac_reg, DMATCR2)) == 0x28);
static_assert((offsetof (struct dmac_reg, CHCR2)) == 0x2c);
static_assert((offsetof (struct dmac_reg, SAR3)) == 0x30);
static_assert((offsetof (struct dmac_reg, DAR3)) == 0x34);
static_assert((offsetof (struct dmac_reg, DMATCR3)) == 0x38);
static_assert((offsetof (struct dmac_reg, CHCR3)) == 0x3c);
static_assert((offsetof (struct dmac_reg, DMAOR)) == 0x40);
struct cpg_reg {
uint16_t FRQCR; /* Frequency control register */
uint8_t _pad0[2];
uint8_t STBCR; /* Standby control register */
uint8_t _pad1[3];
uint16_t WTCNT; /* Watchdog timer counter */
uint8_t _pad2[2];
uint16_t WTCSR; /* Watchdog timer control/status register */
uint8_t _pad3[2];
uint8_t STBCR2; /* Standby control register 2 */
};
static_assert((offsetof (struct cpg_reg, FRQCR)) == 0x0);
static_assert((offsetof (struct cpg_reg, STBCR)) == 0x4);
static_assert((offsetof (struct cpg_reg, WTCNT)) == 0x8);
static_assert((offsetof (struct cpg_reg, WTCSR)) == 0xc);
static_assert((offsetof (struct cpg_reg, STBCR2)) == 0x10);
struct rtc_reg {
uint8_t R64CNT; /* 64 Hz counter */
uint8_t _pad0[3];
uint8_t RSECCNT; /* Second counter */
uint8_t _pad1[3];
uint8_t RMINCNT; /* Minute counter */
uint8_t _pad2[3];
uint8_t RHRCNT; /* Hour counter */
uint8_t _pad3[3];
uint8_t RWKCNT; /* Day-of-week counter */
uint8_t _pad4[3];
uint8_t RDAYCNT; /* Day counter */
uint8_t _pad5[3];
uint8_t RMONCNT; /* Month counter */
uint8_t _pad6[3];
uint16_t RYRCNT; /* Year counter */
uint8_t _pad7[2];
uint8_t RSECAR; /* Second alarm register */
uint8_t _pad8[3];
uint8_t RMINAR; /* Minute alarm register */
uint8_t _pad9[3];
uint8_t RHRAR; /* Hour alarm register */
uint8_t _pad10[3];
uint8_t RWKAR; /* Day-of-week alarm register */
uint8_t _pad11[3];
uint8_t RDAYAR; /* Day alarm register */
uint8_t _pad12[3];
uint8_t RMONAR; /* Month alarm register */
uint8_t _pad13[3];
uint8_t RCR1; /* RTC control register 1 */
uint8_t _pad14[3];
uint8_t RCR2; /* RTC control register 2 */
};
static_assert((offsetof (struct rtc_reg, R64CNT)) == 0x0);
static_assert((offsetof (struct rtc_reg, RSECCNT)) == 0x4);
static_assert((offsetof (struct rtc_reg, RMINCNT)) == 0x8);
static_assert((offsetof (struct rtc_reg, RHRCNT)) == 0xc);
static_assert((offsetof (struct rtc_reg, RWKCNT)) == 0x10);
static_assert((offsetof (struct rtc_reg, RDAYCNT)) == 0x14);
static_assert((offsetof (struct rtc_reg, RMONCNT)) == 0x18);
static_assert((offsetof (struct rtc_reg, RYRCNT)) == 0x1c);
static_assert((offsetof (struct rtc_reg, RSECAR)) == 0x20);
static_assert((offsetof (struct rtc_reg, RMINAR)) == 0x24);
static_assert((offsetof (struct rtc_reg, RHRAR)) == 0x28);
static_assert((offsetof (struct rtc_reg, RWKAR)) == 0x2c);
static_assert((offsetof (struct rtc_reg, RDAYAR)) == 0x30);
static_assert((offsetof (struct rtc_reg, RMONAR)) == 0x34);
static_assert((offsetof (struct rtc_reg, RCR1)) == 0x38);
static_assert((offsetof (struct rtc_reg, RCR2)) == 0x3c);
struct intc_reg {
uint16_t ICR; /* Interrupt control register */
uint8_t _pad0[2];
uint16_t IPRA; /* Interrupt priority register A */
uint8_t _pad1[2];
uint16_t IPRB; /* Interrupt priority register B */
uint8_t _pad2[2];
uint16_t IPRC; /* Interrupt priority register C */
};
static_assert((offsetof (struct intc_reg, ICR)) == 0x0);
static_assert((offsetof (struct intc_reg, IPRA)) == 0x4);
static_assert((offsetof (struct intc_reg, IPRB)) == 0x8);
static_assert((offsetof (struct intc_reg, IPRC)) == 0xc);
struct tmu_reg {
uint8_t TOCR; /* Timer output control register */
uint8_t _pad0[3];
uint8_t TSTR; /* Timer start register */
uint8_t _pad1[3];
uint32_t TCOR0; /* Timer constant register 0 */
uint32_t TCNT0; /* Timer counter 0 */
uint16_t TCR0; /* Timer control register 0 */
uint8_t _pad2[2];
uint32_t TCOR1; /* Timer constant register 1 */
uint32_t TCNT1; /* Timer counter 1 */
uint16_t TCR1; /* Timer control register 1 */
uint8_t _pad3[2];
uint32_t TCOR2; /* Timer constant register 2 */
uint32_t TCNT2; /* Timer counter 2 */
uint16_t TCR2; /* Timer control register 2 */
uint8_t _pad4[2];
uint32_t TCPR2; /* Timer input capture register 2 */
};
static_assert((offsetof (struct tmu_reg, TOCR)) == 0x0);
static_assert((offsetof (struct tmu_reg, TSTR)) == 0x4);
static_assert((offsetof (struct tmu_reg, TCOR0)) == 0x8);
static_assert((offsetof (struct tmu_reg, TCNT0)) == 0xc);
static_assert((offsetof (struct tmu_reg, TCR0)) == 0x10);
static_assert((offsetof (struct tmu_reg, TCOR1)) == 0x14);
static_assert((offsetof (struct tmu_reg, TCNT1)) == 0x18);
static_assert((offsetof (struct tmu_reg, TCR1)) == 0x1c);
static_assert((offsetof (struct tmu_reg, TCOR2)) == 0x20);
static_assert((offsetof (struct tmu_reg, TCNT2)) == 0x24);
static_assert((offsetof (struct tmu_reg, TCR2)) == 0x28);
static_assert((offsetof (struct tmu_reg, TCPR2)) == 0x2c);
struct sci_reg {
uint8_t SCSMR1; /* Serial mode register 1 */
uint8_t _pad0[3];
uint8_t SCBRR1; /* Bit rate register 1 */
uint8_t _pad1[3];
uint8_t SCSCR1; /* Serial control register 1 */
uint8_t _pad2[3];
uint8_t SCTDR1; /* Transmit data register 1 */
uint8_t _pad3[3];
uint8_t SCSSR1; /* Serial status register 1 */
uint8_t _pad4[3];
uint8_t SCRDR1; /* Receive data register 1 */
uint8_t _pad5[3];
uint8_t SCSCMR1; /* Smart card mode register 1 */
uint8_t _pad6[3];
uint8_t SCSPTR1; /* Serial port register */
};
static_assert((offsetof (struct sci_reg, SCSMR1)) == 0x0);
static_assert((offsetof (struct sci_reg, SCBRR1)) == 0x4);
static_assert((offsetof (struct sci_reg, SCSCR1)) == 0x8);
static_assert((offsetof (struct sci_reg, SCTDR1)) == 0xc);
static_assert((offsetof (struct sci_reg, SCSSR1)) == 0x10);
static_assert((offsetof (struct sci_reg, SCRDR1)) == 0x14);
static_assert((offsetof (struct sci_reg, SCSCMR1)) == 0x18);
static_assert((offsetof (struct sci_reg, SCSPTR1)) == 0x1c);
struct scif_reg {
uint16_t SCSMR2; /* Serial mode register 2 */
uint8_t _pad0[2];
uint8_t SCBRR2; /* Bit rate register 2 */
uint8_t _pad1[3];
uint16_t SCSCR2; /* Serial control register 2 */
uint8_t _pad2[2];
uint8_t SCFTDR2; /* Transmit FIFO data register 2 */
uint8_t _pad3[3];
uint16_t SCFSR2; /* Serial status register 2 */
uint8_t _pad4[2];
uint8_t SCFRDR2; /* Receive FIFO data register 2 */
uint8_t _pad5[3];
uint16_t SCFCR2; /* FIFO control register */
uint8_t _pad6[2];
uint16_t SCFDR2; /* FIFO data count register */
uint8_t _pad7[2];
uint16_t SCSPTR2; /* Serial port register 2 */
uint8_t _pad8[2];
uint16_t SCLSR2; /* Line status register 2 */
};
static_assert((offsetof (struct scif_reg, SCSMR2)) == 0x0);
static_assert((offsetof (struct scif_reg, SCBRR2)) == 0x4);
static_assert((offsetof (struct scif_reg, SCSCR2)) == 0x8);
static_assert((offsetof (struct scif_reg, SCFTDR2)) == 0xc);
static_assert((offsetof (struct scif_reg, SCFSR2)) == 0x10);
static_assert((offsetof (struct scif_reg, SCFRDR2)) == 0x14);
static_assert((offsetof (struct scif_reg, SCFCR2)) == 0x18);
static_assert((offsetof (struct scif_reg, SCFDR2)) == 0x1c);
static_assert((offsetof (struct scif_reg, SCSPTR2)) == 0x20);
static_assert((offsetof (struct scif_reg, SCLSR2)) == 0x24);
struct udi_reg {
uint16_t SDIR; /* Instruction register */
uint8_t _pad0[6];
uint32_t SDDR; /* Data register */
};
static_assert((offsetof (struct udi_reg, SDIR)) == 0x0);
static_assert((offsetof (struct udi_reg, SDDR)) == 0x8);
struct sh7091_reg {
ccn_reg CCN;
uint8_t _pad0[0x200000 - (sizeof (struct ccn_reg))];
ubc_reg UBC;
uint8_t _pad1[0x600000 - (sizeof (struct ubc_reg))];
bsc_reg BSC;
uint8_t _pad2[0x200000 - (sizeof (struct bsc_reg))];
dmac_reg DMAC;
uint8_t _pad3[0x200000 - (sizeof (struct dmac_reg))];
cpg_reg CPG;
uint8_t _pad4[0x80000 - (sizeof (struct cpg_reg))];
rtc_reg RTC;
uint8_t _pad5[0x80000 - (sizeof (struct rtc_reg))];
intc_reg INTC;
uint8_t _pad6[0x80000 - (sizeof (struct intc_reg))];
tmu_reg TMU;
uint8_t _pad7[0x80000 - (sizeof (struct tmu_reg))];
sci_reg SCI;
uint8_t _pad8[0x80000 - (sizeof (struct sci_reg))];
scif_reg SCIF;
uint8_t _pad9[0x80000 - (sizeof (struct scif_reg))];
udi_reg UDI;
};
static_assert((offsetof (struct sh7091_reg, CCN)) == 0x0);
static_assert((offsetof (struct sh7091_reg, UBC)) == 0x200000);
static_assert((offsetof (struct sh7091_reg, BSC)) == 0x800000);
static_assert((offsetof (struct sh7091_reg, DMAC)) == 0xa00000);
static_assert((offsetof (struct sh7091_reg, CPG)) == 0xc00000);
static_assert((offsetof (struct sh7091_reg, RTC)) == 0xc80000);
static_assert((offsetof (struct sh7091_reg, INTC)) == 0xd00000);
static_assert((offsetof (struct sh7091_reg, TMU)) == 0xd80000);
static_assert((offsetof (struct sh7091_reg, SCI)) == 0xe00000);
static_assert((offsetof (struct sh7091_reg, SCIF)) == 0xe80000);
static_assert((offsetof (struct sh7091_reg, UDI)) == 0xf00000);
extern sh7091_reg SH7091;

16
type.h Normal file
View File

@ -0,0 +1,16 @@
#include <stddef.h>
#include <stdint.h>
#ifndef __cplusplus
#ifndef static_assert
#define static_assert _Static_assert
#endif
#endif
typedef volatile uint8_t reg8;
typedef volatile uint16_t reg16;
typedef volatile uint32_t reg32;
static_assert((sizeof (reg8)) == 1);
static_assert((sizeof (reg16)) == 2);
static_assert((sizeof (reg32)) == 4);