Jo Engine 2026.11.1
Jo Sega Saturn Engine
Loading...
Searching...
No Matches
sega_saturn.h
Go to the documentation of this file.
1/*
2** Jo Sega Saturn Engine
3** Copyright (c) 2012-2026, Johannes Fetz (johannesfetz@gmail.com)
4** All rights reserved.
5**
6** Redistribution and use in source and binary forms, with or without
7** modification, are permitted provided that the following conditions are met:
8** * Redistributions of source code must retain the above copyright
9** notice, this list of conditions and the following disclaimer.
10** * Redistributions in binary form must reproduce the above copyright
11** notice, this list of conditions and the following disclaimer in the
12** documentation and/or other materials provided with the distribution.
13** * Neither the name of the Johannes Fetz nor the
14** names of its contributors may be used to endorse or promote products
15** derived from this software without specific prior written permission.
16**
17** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
18** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20** DISCLAIMED. IN NO EVENT SHALL Johannes Fetz BE LIABLE FOR ANY
21** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27*/
34
35#ifndef __JO_SEGA_SATURN_H__
36# define __JO_SEGA_SATURN_H__
37
38/*
39
40-------------------------------------------------|-----------------------------|------------------------------
41| Function | Normal Scroll Screen | Rotation Scroll Screen |
42| |-----------------------------|-----------------------------|------------------------------
43| | NBG0 | NBG1 | NBG2 | NBG3 | RBG0 | RBG1 |
44-------------------------------------------------|-----------------------------|------------------------------
45| Character Colour | 16 colours | 16 colours | 16 colours | 16 colours | 16 colours | 16 colours |
46| Count | 256 " " | 256 " " | 256 " " | 256 " " | 256 " " | 256 " " |
47| | 2048 " " | 2048 " " | | | 2048 " " | 2048 " " |
48| | 32768 " " | 32768 " " | | | 32768 " " | 32768 " " |
49| | 16770000 " " | | | | 16770000 " " | 16770000 " " |
50-------------------------------------------------|-----------------------------|------------------------------
51| Character Size | 1x1 Cells , 2x2 Cells |
52-------------------------------------------------|-----------------------------|------------------------------
53| Pattern Name | 1 word , 2 words |
54| Data Size | |
55-------------------------------------------------|-----------------------------|------------------------------
56| Plane Size | 1 H x 1 V 1 Pages ; 2 H x 1 V 1 Pages ; 2 H x 2 V Pages (I don't understand ... ) |
57-------------------------------------------------|-----------------------------|------------------------------
58| Plane Count | 4 | 16 |
59-------------------------------------------------|-----------------------------|------------------------------
60| Bitmap Possible | Yes | No | Yes | No |
61-------------------------------------------------|-----------------------------|------------------------------
62| Bitmap Size | 512 x 256 | N/A | 512x256 | N/A |
63| | 512 x 512 | | 512x512 | |
64| | 1024 x 256 | | | |
65| | 1024 x 512 | | | |
66-------------------------------------------------|-----------------------------|------------------------------
67| Scale | 0.25 x - 256 x | None | Any ? |
68-------------------------------------------------|-----------------------------|------------------------------
69| Rotation | No | Yes |
70-------------------------------------------------|-----------------------------|-----------------------------|
71| Linescroll | Yes | No |
72-------------------------------------------------|-----------------------------|------------------------------
73| Column Scroll | Yes | No |
74-------------------------------------------------|-----------------------------|------------------------------
75| Mosaic | Yes | Horizontal Only |
76-------------------------------------------------|-----------------------------|------------------------------
77*/
78
79/*
80██╗ ██╗██████╗ ██████╗ ██╗
81██║ ██║██╔══██╗██╔══██╗███║
82██║ ██║██║ ██║██████╔╝╚██║
83╚██╗ ██╔╝██║ ██║██╔═══╝ ██║
84 ╚████╔╝ ██████╔╝██║ ██║
85 ╚═══╝ ╚═════╝ ╚═╝ ╚═╝
86
87*/
88
90# define JO_VDP1_VRAM (0x25C00000)
92# define JO_VDP1_FB (0x25C80000)
94# define JO_VDP1_REG (0x25D00000)
96# define JO_VDP1_LAST_REG (0x25D00016)
97
99# define JO_VDP1_TVMR (*(volatile unsigned short *)0x25D00000) // 0x0
101# define JO_VDP1_FBCR (*(volatile unsigned short *)0x25D00002) // 0x0
103# define JO_VDP1_PTMR (*(volatile unsigned short *)0x25D00004) // 0x2
105# define JO_VDP1_EWDR (*(volatile unsigned short *)0x25D00006) // 0x0
107# define JO_VDP1_EWLR (*(volatile unsigned short *)0x25D00008) // 0x0
109# define JO_VDP1_EWRR (*(volatile unsigned short *)0x25D0000A) // 0x58FF
111# define JO_VDP1_ENDR (*(volatile unsigned short *)0x25D0000C) // 0x0
113# define JO_VDP1_EDSR (*(volatile unsigned short *)0x25D00010) // 0x3
115# define JO_VDP1_LOPR (*(volatile unsigned short *)0x25D00012) // N/A
117# define JO_VDP1_COPR (*(volatile unsigned short *)0x25D00014) // N/A
119# define JO_VDP1_MODR (*(volatile unsigned short *)0x25D00016) // 0x1100
121# define JO_VDP1_USER_AREA_SIZE (0x70538)
123# define JO_VDP1_USER_AREA_END_ADDR (0x25C7E6F8) // Before the gouraud tables of the 3D (JO_VDP1_CLIP_GOURAUD_TABLE_OFFSET)
125# define JO_VDP1_TEXTURE_DEF_BASE_ADDRESS (0x10000)
126
127/*
128██╗ ██╗██████╗ ██████╗ ██████╗
129██║ ██║██╔══██╗██╔══██╗╚════██╗
130██║ ██║██║ ██║██████╔╝ █████╔╝
131╚██╗ ██╔╝██║ ██║██╔═══╝ ██╔═══╝
132 ╚████╔╝ ██████╔╝██║ ███████╗
133 ╚═══╝ ╚═════╝ ╚═╝ ╚══════╝
134
135*/
137# define JO_VDP2_REG (0x25F80000)
139# define JO_VDP2_LAST_REG (0x25F8011E)
141# define JO_VDP2_VRAM (0x25E00000)
143# define JO_VDP2_VRAM_A0 (JO_VDP2_VRAM)
145# define JO_VDP2_VRAM_A1 (0x25E20000)
147# define JO_VDP2_VRAM_B0 (0x25E40000)
149# define JO_VDP2_VRAM_B1 (0x25E60000)
151# define JO_VDP2_CRAM (0x25F00000)
153# define JO_VDP2_BANK_SIZE (0x20000)
154
155# define JO_VDP2_NBG0_CEL_ADR (JO_VDP2_VRAM_A1)
156# define JO_VDP2_NBG0_MAP_ADR (JO_VDP2_VRAM_B1)
157# define JO_VDP2_NBG1_CEL_ADR (JO_VDP2_VRAM_A0)
158# define JO_VDP2_NBG1_MAP_ADR (JO_VDP2_VRAM_B0)
159
160
161/* 180002 - r/w - EXTEN - External Signal Enable Register
162 bit-> /----15----|----14----|----13----|----12----|----11----|----10----|----09----|----08----\
163 | -- | -- | -- | -- | -- | -- | EXLTEN | EXSYEN |
164 |----07----|----06----|----05----|----04----|----03----|----02----|----01----|----00----|
165 | -- | -- | -- | -- | -- | -- | DASEL | EXBGEN |
166 \----------|----------|----------|----------|----------|----------|----------|---------*/
167# define JO_VDP2_TVMD (*(volatile unsigned short *)0x25F80000) // 0x8110 0x8120
168# define JO_VDP2_EXTEN (*(volatile unsigned short *)0x25F80002) // 0x0
169# define JO_VDP2_TVSTAT (*(volatile unsigned short *)0x25F80004) // N/A
171# define JO_VDP2_TVSTAT_PAL (1 << 0)
172
173/* 180006 - r/w - VRSIZE - VRAM Size
174 bit-> /----15----|----14----|----13----|----12----|----11----|----10----|----09----|----08----\
175 | VRAMSZ | -- | -- | -- | -- | -- | -- | -- |
176 |----07----|----06----|----05----|----04----|----03----|----02----|----01----|----00----|
177 | -- | -- | -- | -- | VER3 | VER2 | VER1 | VER0 |
178 \----------|----------|----------|----------|----------|----------|----------|---------*/
179# define JO_VDP2_VRSIZE (*(volatile unsigned short *)0x25F80006) // 0x0
180
181/* 180008 - r/o - HCNT - H-Counter
182 bit-> /----15----|----14----|----13----|----12----|----11----|----10----|----09----|----08----\
183 | -- | -- | -- | -- | -- | -- | HCT9 | HCT8 |
184 |----07----|----06----|----05----|----04----|----03----|----02----|----01----|----00----|
185 | HCT7 | HCT6 | HCT5 | HCT4 | HCT3 | HCT2 | HCT1 | HCT0 |
186 \----------|----------|----------|----------|----------|----------|----------|---------*/
187# define JO_VDP2_HCNT (*(volatile unsigned short *)0x25F80008) // 0x275 0x26B
188
189/* 18000A - r/o - VCNT - V-Counter
190 bit-> /----15----|----14----|----13----|----12----|----11----|----10----|----09----|----08----\
191 | -- | -- | -- | -- | -- | -- | VCT9 | VCT8 |
192 |----07----|----06----|----05----|----04----|----03----|----02----|----01----|----00----|
193 | VCT7 | VCT6 | VCT5 | VCT4 | VCT3 | VCT2 | VCT1 | VCT0 |
194 \----------|----------|----------|----------|----------|----------|----------|---------*/
195# define JO_VDP2_VCNT (*(volatile unsigned short *)0x25F8000A) // 0x36
196
197/* 18000E - r/w - RAMCTL - RAM Control
198 bit-> /----15----|----14----|----13----|----12----|----11----|----10----|----09----|----08----\
199 | CRKTE | -- | CRMD1 | CRMD0 | -- | -- | VRBMD | VRAMD |
200 |----07----|----06----|----05----|----04----|----03----|----02----|----01----|----00----|
201 | RDBSB11 | RDBSB10 | RDBSB01 | RDBSB00 | RDBSA11 | RDBSA10 | RDBSA01 | RDBSA00 |
202 \----------|----------|----------|----------|----------|----------|----------|---------*/
203# define JO_VDP2_RAMCTL (*(volatile unsigned short *)0x25F8000E) // 0x1327
204
205# define JO_VDP2_CYCA0L (*(volatile unsigned short *)0x25F80010) // 0x5555
206# define JO_VDP2_CYCA0U (*(volatile unsigned short *)0x25F80012) // 0xFEEE
207# define JO_VDP2_CYCA1L (*(volatile unsigned short *)0x25F80014) // 0x5555
208# define JO_VDP2_CYCA1U (*(volatile unsigned short *)0x25F80016) // 0xFEEE
209# define JO_VDP2_CYCB0L (*(volatile unsigned short *)0x25F80018) // 0xFFFF
210# define JO_VDP2_CYCB0U (*(volatile unsigned short *)0x25F8001A) // 0xEEEE
211# define JO_VDP2_CYCB1L (*(volatile unsigned short *)0x25F8001C) // 0x44F
212# define JO_VDP2_CYCB1U (*(volatile unsigned short *)0x25F8001E) // 0xEEEE
213
214/* 180020 - r/w - BGON - SCREEN DISPLAY ENABLE
215
216 this register allows each tilemap to be enabled or disabled and also which layers are solid
217
218 bit-> /----15----|----14----|----13----|----12----|----11----|----10----|----09----|----08----\
219 | -- | -- | -- | R0TPON | N3TPON | N2TPON | N1TPON | N0TPON |
220 |----07----|----06----|----05----|----04----|----03----|----02----|----01----|----00----|
221 | -- | -- | R1ON | R0ON | N3ON | N2ON | N1ON | N0ON |
222 \----------|----------|----------|----------|----------|----------|----------|---------*/
223# define JO_VDP2_BGON (*(volatile unsigned short *)0x25F80020) // 0x3
224
225/*
226180022 - MZCTL - Mosaic Control
227bit-> /----15----|----14----|----13----|----12----|----11----|----10----|----09----|----08----\
228 | -- | -- | -- | -- | -- | -- | -- | -- |
229 |----07----|----06----|----05----|----04----|----03----|----02----|----01----|----00----|
230 | -- | -- | -- | -- | -- | -- | -- | -- |
231 \----------|----------|----------|----------|----------|----------|----------|---------*/
232# define JO_VDP2_MZCTL (*(volatile unsigned short *)0x25F80022) // 0x0
233# define JO_VDP2_SFSEL (*(volatile unsigned short *)0x25F80024) // 0x0
234# define JO_VDP2_SFCODE (*(volatile unsigned short *)0x25F80026) // 0x0
235# define JO_VDP2_CHCTLA (*(volatile unsigned short *)0x25F80028) // 0x3210
236# define JO_VDP2_CHCTLB (*(volatile unsigned short *)0x25F8002A) // 0x1000
237/*
23818002C - BMPNA - Bitmap Palette Number (NBG0, NBG1)
239 bit-> /----15----|----14----|----13----|----12----|----11----|----10----|----09----|----08----\
240 | -- | -- | -- | -- | -- | -- | -- | -- |
241 |----07----|----06----|----05----|----04----|----03----|----02----|----01----|----00----|
242 | -- | -- | -- | -- | -- | -- | -- | -- |
243 \----------|----------|----------|----------|----------|----------|----------|---------*/
244# define JO_VDP2_BMPNA (*(volatile unsigned short *)0x25F8002C) // 0x0
245
246/* 18002E - Bitmap Palette Number (RBG0)
247 bit-> /----15----|----14----|----13----|----12----|----11----|----10----|----09----|----08----\
248 | -- | -- | -- | -- | -- | -- | -- | -- |
249 |----07----|----06----|----05----|----04----|----03----|----02----|----01----|----00----|
250 | -- | -- | -- | -- | -- | -- | -- | -- |
251 \----------|----------|----------|----------|----------|----------|----------|---------*/
252# define JO_VDP2_BMPNB (*(volatile unsigned short *)0x25F8002E) // 0x0
253
254/* 180030 - PNCN0 - Pattern Name Control (NBG0)
255 bit-> /----15----|----14----|----13----|----12----|----11----|----10----|----09----|----08----\
256 | N0PNB | N0CNSM | -- | -- | -- | -- | N0SPR | N0SCC |
257 |----07----|----06----|----05----|----04----|----03----|----02----|----01----|----00----|
258 | N0SPLT6 | N0SPLT5 | N0SPLT4 | N0SPCN4 | N0SPCN3 | N0SPCN2 | N0SPCN1 | N0SPCN0 |
259 \----------|----------|----------|----------|----------|----------|----------|---------*/
260# define JO_VDP2_PNCN0 (*(volatile unsigned short *)0x25F80030) // 0x800C
261# define JO_VDP2_PNCN1 (*(volatile unsigned short *)0x25F80032) // 0xC00E
262# define JO_VDP2_PNCN2 (*(volatile unsigned short *)0x25F80034) // 0xC000
263# define JO_VDP2_PNCN3 (*(volatile unsigned short *)0x25F80036) // 0xC000
264# define JO_VDP2_PNCR (*(volatile unsigned short *)0x25F80038) // 0xC000
265# define JO_VDP2_PLSZ (*(volatile unsigned short *)0x25F8003A) // 0x0
266# define JO_VDP2_MPOFN (*(volatile unsigned short *)0x25F8003C) // 0x0
267# define JO_VDP2_MPOFR (*(volatile unsigned short *)0x25F8003E) // 0x0
268
269# define JO_VDP2_MPABN0 (*(volatile unsigned short *)0x25F80040) // 0x3B3B
270# define JO_VDP2_MPCDN0 (*(volatile unsigned short *)0x25F80042) // 0x3B3B
271# define JO_VDP2_MPABN1 (*(volatile unsigned short *)0x25F80044) // 0x3939
272# define JO_VDP2_MPCDN1 (*(volatile unsigned short *)0x25F80046) // 0x3939
273# define JO_VDP2_MPABN2 (*(volatile unsigned short *)0x25F80048) // 0x0
274# define JO_VDP2_MPCDN2 (*(volatile unsigned short *)0x25F8004A) // 0x0
275# define JO_VDP2_MPABN3 (*(volatile unsigned short *)0x25F8004C) // 0x0
276# define JO_VDP2_MPCDN3 (*(volatile unsigned short *)0x25F8004E) // 0x0
277
278# define JO_VDP2_MPABRA (*(volatile unsigned short *)0x25F80050) // 0x2020
279# define JO_VDP2_MPCDRA (*(volatile unsigned short *)0x25F80052) // 0x2020
280# define JO_VDP2_MPEFRA (*(volatile unsigned short *)0x25F80054) // 0x2020
281# define JO_VDP2_MPGHRA (*(volatile unsigned short *)0x25F80056) // 0x2020
282# define JO_VDP2_MPIJRA (*(volatile unsigned short *)0x25F80058) // 0x2020
283# define JO_VDP2_MPKLRA (*(volatile unsigned short *)0x25F8005A) // 0x2020
284# define JO_VDP2_MPMNRA (*(volatile unsigned short *)0x25F8005C) // 0x2020
285# define JO_VDP2_MPOPRA (*(volatile unsigned short *)0x25F8005E) // 0x2020
286
287# define JO_VDP2_MPABRB (*(volatile unsigned short *)0x25F80060) // 0x2828
288# define JO_VDP2_MPCDRB (*(volatile unsigned short *)0x25F80062) // 0x2828
289# define JO_VDP2_MPEFRB (*(volatile unsigned short *)0x25F80064) // 0x2828
290# define JO_VDP2_MPGHRB (*(volatile unsigned short *)0x25F80066) // 0x2838
291# define JO_VDP2_MPIJRB (*(volatile unsigned short *)0x25F80068) // 0x2828
292# define JO_VDP2_MPKLRB (*(volatile unsigned short *)0x25F8006A) // 0x2828
293# define JO_VDP2_MPMNRB (*(volatile unsigned short *)0x25F8006C) // 0x2828
294# define JO_VDP2_MPOPRB (*(volatile unsigned short *)0x25F8006E) // 0x2828
295
296# define JO_VDP2_SCXIN0 (*(volatile unsigned short *)0x25F80070) // 0x0
297# define JO_VDP2_SCXDN0 (*(volatile unsigned short *)0x25F80072) // 0x0
298# define JO_VDP2_SCYIN0 (*(volatile unsigned short *)0x25F80074) // 0x0
299# define JO_VDP2_SCYDN0 (*(volatile unsigned short *)0x25F80076) // 0x0
300# define JO_VDP2_ZMXIN0 (*(volatile unsigned short *)0x25F80078) // 0x1
301# define JO_VDP2_ZMXDN0 (*(volatile unsigned short *)0x25F8007A) // 0x0
302# define JO_VDP2_ZMYIN0 (*(volatile unsigned short *)0x25F8007C) // 0x1
303# define JO_VDP2_ZMYDN0 (*(volatile unsigned short *)0x25F8007E) // 0x0
304
305# define JO_VDP2_SCXIN1 (*(volatile unsigned short *)0x25F80080) // 0x0
306# define JO_VDP2_SCXDN1 (*(volatile unsigned short *)0x25F80082) // 0x0
307# define JO_VDP2_SCYIN1 (*(volatile unsigned short *)0x25F80084) // 0x0
308# define JO_VDP2_SCYDN1 (*(volatile unsigned short *)0x25F80086) // 0x0
309# define JO_VDP2_ZMXIN1 (*(volatile unsigned short *)0x25F80088) // 0x1
310# define JO_VDP2_ZMXDN1 (*(volatile unsigned short *)0x25F8008A) // 0x0
311# define JO_VDP2_ZMYIN1 (*(volatile unsigned short *)0x25F8008C) // 0x1
312# define JO_VDP2_ZMYDN1 (*(volatile unsigned short *)0x25F8008E) // 0x0
313
314# define JO_VDP2_SCXN2 (*(volatile unsigned short *)0x25F80090) // 0x0
315# define JO_VDP2_SCYN2 (*(volatile unsigned short *)0x25F80092) // 0x0
316# define JO_VDP2_SCXN3 (*(volatile unsigned short *)0x25F80094) // 0x0
317# define JO_VDP2_SCYN3 (*(volatile unsigned short *)0x25F80096) // 0x0
318# define JO_VDP2_ZMCTL (*(volatile unsigned short *)0x25F80098) // 0x0
319# define JO_VDP2_SCRCTL (*(volatile unsigned short *)0x25F8009A) // 0x0
320# define JO_VDP2_VCSTAU (*(volatile unsigned short *)0x25F8009C) // 0x0
321# define JO_VDP2_VCSTAL (*(volatile unsigned short *)0x25F8009E) // 0x0
322
323# define JO_VDP2_LSTA0U (*(volatile unsigned short *)0x25F800A0) // 0x0
324# define JO_VDP2_LSTA0L (*(volatile unsigned short *)0x25F800A2) // 0x0
325# define JO_VDP2_LSTA1U (*(volatile unsigned short *)0x25F800A4) // 0x0
326# define JO_VDP2_LSTA1L (*(volatile unsigned short *)0x25F800A6) // 0x0
327# define JO_VDP2_LCTAU (*(volatile unsigned short *)0x25F800A8) // 0x0
328# define JO_VDP2_LCTAL (*(volatile unsigned short *)0x25F800AA) // 0x0
329# define JO_VDP2_BKTAU (*(volatile unsigned short *)0x25F800AC) // 0x12F1
330# define JO_VDP2_BKTAL (*(volatile unsigned short *)0x25F800AE) // 0xFFFF
331
332# define JO_VDP2_RPMD (*(volatile unsigned short *)0x25F800B0) // 0x0
333# define JO_VDP2_RPRCTL (*(volatile unsigned short *)0x25F800B2) // 0x0
334# define JO_VDP2_KTCTL (*(volatile unsigned short *)0x25F800B4) // 0x0
335# define JO_VDP2_KTAOF (*(volatile unsigned short *)0x25F800B6) // 0x0
336# define JO_VDP2_OVPNRA (*(volatile unsigned short *)0x25F800B8) // 0x0
337# define JO_VDP2_OVPNRB (*(volatile unsigned short *)0x25F800BA) // 0x0
338# define JO_VDP2_RPTAU (*(volatile unsigned short *)0x25F800BC) // 0x1
339# define JO_VDP2_RPTAL (*(volatile unsigned short *)0x25F800BE) // 0xFF80
340
341# define JO_VDP2_WPSX0 (*(volatile unsigned short *)0x25F800C0) // 0x0
342# define JO_VDP2_WPSY0 (*(volatile unsigned short *)0x25F800C2) // 0x0
343# define JO_VDP2_WPEX0 (*(volatile unsigned short *)0x25F800C4) // 0x27E SCRW-1
344# define JO_VDP2_WPEY0 (*(volatile unsigned short *)0x25F800C6) // 0x1BE SCRH-1
345# define JO_VDP2_WPSX1 (*(volatile unsigned short *)0x25F800C8) // 0x0
346# define JO_VDP2_WPSY1 (*(volatile unsigned short *)0x25F800CA) // 0x0
347# define JO_VDP2_WPEX1 (*(volatile unsigned short *)0x25F800CC) // 0x27E SCRW-1
348# define JO_VDP2_WPEY1 (*(volatile unsigned short *)0x25F800CE) // 0x1BE SCRH-1
349
350# define JO_VDP2_WCTLA (*(volatile unsigned short *)0x25F800D0) // 0x0
351# define JO_VDP2_WCTLB (*(volatile unsigned short *)0x25F800D2) // 0x0
352# define JO_VDP2_WCTLC (*(volatile unsigned short *)0x25F800D4) // 0x0
353# define JO_VDP2_WCTLD (*(volatile unsigned short *)0x25F800D6) // 0x0
354# define JO_VDP2_LWTA0U (*(volatile unsigned short *)0x25F800D8) // 0x0
355# define JO_VDP2_LWTA0L (*(volatile unsigned short *)0x25F800DA) // 0x0
356# define JO_VDP2_LWTA1U (*(volatile unsigned short *)0x25F800DC) // 0x0
357# define JO_VDP2_LWTA1L (*(volatile unsigned short *)0x25F800DE) // 0x0
358
359# define JO_VDP2_SPCTL (*(volatile unsigned short *)0x25F800E0) // 0x23
360# define JO_VDP2_SDCTL (*(volatile unsigned short *)0x25F800E2) // 0x0
361# define JO_VDP2_CRAOFA (*(volatile unsigned short *)0x25F800E4) // 0x0
362# define JO_VDP2_CRAOFB (*(volatile unsigned short *)0x25F800E6) // 0x0
364# define JO_VDP2_CRAOFB_SPRITE_OFFSET_MASK (0x00F0)
366# define JO_VDP2_CRAOFB_SPRITE_OFFSET(N) (((N) & 7) << 4)
367# define JO_VDP2_LNCLEN (*(volatile unsigned short *)0x25F800E8) // 0x0
368# define JO_VDP2_SFPRMD (*(volatile unsigned short *)0x25F800EA) // 0x0
369# define JO_VDP2_CCCTL (*(volatile unsigned short *)0x25F800EC) // 0x0
370# define JO_VDP2_SFCCMD (*(volatile unsigned short *)0x25F800EE) // 0x0
371
372# define JO_VDP2_PRISA (*(volatile unsigned short *)0x25F800F0) // 0x506
373# define JO_VDP2_PRISB (*(volatile unsigned short *)0x25F800F2) // 0x505
374# define JO_VDP2_PRISC (*(volatile unsigned short *)0x25F800F4) // 0x505
375# define JO_VDP2_PRISD (*(volatile unsigned short *)0x25F800F6) // 0x505
376# define JO_VDP2_PRINA (*(volatile unsigned short *)0x25F800F8) // 0x607
377# define JO_VDP2_PRINB (*(volatile unsigned short *)0x25F800FA) // 0x102
378# define JO_VDP2_PRIR (*(volatile unsigned short *)0x25F800FC) // 0x4
379# define JO_VDP2_RESERVE (*(volatile unsigned short *)0x25F800FE) // 0x0
380
381# define JO_VDP2_CCRSA (*(volatile unsigned short *)0x25F80100) // 0x0
382# define JO_VDP2_CCRSB (*(volatile unsigned short *)0x25F80102) // 0x0
383# define JO_VDP2_CCRSC (*(volatile unsigned short *)0x25F80104) // 0x0
384# define JO_VDP2_CCRSD (*(volatile unsigned short *)0x25F80106) // 0x0
385# define JO_VDP2_CCRNA (*(volatile unsigned short *)0x25F80108) // 0x0
386# define JO_VDP2_CCRNB (*(volatile unsigned short *)0x25F8010A) // 0x0
387# define JO_VDP2_CCRR (*(volatile unsigned short *)0x25F8010C) // 0x0
388# define JO_VDP2_CCRLB (*(volatile unsigned short *)0x25F8010E) // 0x0
389
390# define JO_VDP2_CLOFEN (*(volatile unsigned short *)0x25F80110) // 0x0
391# define JO_VDP2_CLOFSL (*(volatile unsigned short *)0x25F80112) // 0x0
392# define JO_VDP2_COAR (*(volatile unsigned short *)0x25F80114) // 0x0
393# define JO_VDP2_COAG (*(volatile unsigned short *)0x25F80116) // 0x0
394# define JO_VDP2_COAB (*(volatile unsigned short *)0x25F80118) // 0x0
395# define JO_VDP2_COBR (*(volatile unsigned short *)0x25F8011A) // 0x0
396# define JO_VDP2_COBG (*(volatile unsigned short *)0x25F8011C) // 0x0
397# define JO_VDP2_COBB (*(volatile unsigned short *)0x25F8011E) // 0x0
398
399/*
400██╗ ██╗ ██████╗ ██████╗ ██╗ ██╗ ██████╗ █████╗ ███╗ ███╗
401██║ ██║██╔═══██╗██╔══██╗██║ ██╔╝ ██╔══██╗██╔══██╗████╗ ████║
402██║ █╗ ██║██║ ██║██████╔╝█████╔╝ ██████╔╝███████║██╔████╔██║
403██║███╗██║██║ ██║██╔══██╗██╔═██╗ ██╔══██╗██╔══██║██║╚██╔╝██║
404╚███╔███╔╝╚██████╔╝██║ ██║██║ ██╗ ██║ ██║██║ ██║██║ ╚═╝ ██║
405 ╚══╝╚══╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝
406
407*/
408
410# define JO_WORK_RAM_HIGH (0x06000000)
412# define JO_WORK_RAM_LOW (0x00200000)
414# define JO_WORK_RAM_SIZE (0x100000)
416# define JO_WORK_RAM_BOOT_ROM (0x06000000)
418# define JO_WORK_RAM_SLAVE_CPU_STACK_AREA (0x06000800)
420# define JO_WORK_RAM_MASTER_CPU_DEFAULT_STACK (0x06001000)
422# define JO_WORK_RAM_UNKNOWN_USAGE (0x06002000)
424# define JO_WORK_RAM_USER_PROGRAM_AND_DATA (0x06004000)
426extern unsigned int _jo_work_start;
427# define JO_WORK_RAM_ENGINE_WORK ((unsigned int)&_jo_work_start)
429# define JO_WORK_RAM_USER_PROGRAM_AND_DATA_END (JO_WORK_RAM_ENGINE_WORK)
431# define JO_WORK_RAM_STACK_TOP (0x060FFC00)
433# define JO_WORK_RAM_STACK_BOTTOM (0x060FBC00)
435# define JO_WORK_RAM_SLAVE_STACK_TOP (0x06004000)
436
438# define JO_RAM_CARTRIDGE_ID (*(volatile unsigned char *)0x24FFFFFF)
440# define JO_RAM_CARTRIDGE_ID_8MBITS (0x5a)
442# define JO_RAM_CARTRIDGE_ID_32MBITS (0x5c)
444# define JO_RAM_CARTRIDGE_ENABLE (*(volatile unsigned short *)0x257EFFFE)
446# define JO_RAM_CARTRIDGE_ADDRESS (0x22400000)
448# define JO_RAM_CARTRIDGE_8MBITS_BANK2_ADDRESS (0x22600000)
450# define JO_RAM_CARTRIDGE_8MBITS_BANK_SIZE (0x80000)
452# define JO_RAM_CARTRIDGE_32MBITS_SIZE (0x400000)
454# define JO_RAM_CARTRIDGE_ASR0 (0x23301FF0)
456# define JO_RAM_CARTRIDGE_AREF (0x00000013)
457
459# define JO_WORK_RAM_ENGINE_WORK_SECTION __attribute__((section("JO_WORK")))
461# define JO_WORK_RAM_ENGINE_WORK_ALIGNED_SECTION __attribute__((section("JO_WORK_ALIGNED")))
462
463/*
464███████╗ ██████╗██╗ ██╗
465██╔════╝██╔════╝██║ ██║
466███████╗██║ ██║ ██║
467╚════██║██║ ██║ ██║
468███████║╚██████╗╚██████╔╝
469╚══════╝ ╚═════╝ ╚═════╝
470*/
471
473# define JO_SCU_IMS (*(volatile unsigned int *)0x25FE00A0)
476# define JO_BIOS_SCU_IMS (*(volatile unsigned int *)0x06000348)
479# define JO_BIOS_CHANGE_SYSTEM_CLOCK(CLOCK) ((**(void (**)(unsigned int))0x06000320)(CLOCK))
481# define JO_BIOS_SYSTEM_CLOCK_320 (0)
483# define JO_BIOS_SYSTEM_CLOCK_352 (1)
485# define JO_SCU_IST (*(volatile unsigned int *)0x25FE00A4)
487# define JO_SCU_ASR0 (*(volatile unsigned int *)0x25FE00B0)
489# define JO_SCU_AREF (*(volatile unsigned int *)0x25FE00B8)
491# define JO_SCU_DMA_READ(N) (*(volatile unsigned int *)(0x25FE0000 + (N) * 0x20))
492# define JO_SCU_DMA_WRITE(N) (*(volatile unsigned int *)(0x25FE0004 + (N) * 0x20))
493# define JO_SCU_DMA_COUNT(N) (*(volatile unsigned int *)(0x25FE0008 + (N) * 0x20))
494# define JO_SCU_DMA_ADD(N) (*(volatile unsigned int *)(0x25FE000C + (N) * 0x20))
495# define JO_SCU_DMA_ENABLE(N) (*(volatile unsigned int *)(0x25FE0010 + (N) * 0x20))
496# define JO_SCU_DMA_MODE(N) (*(volatile unsigned int *)(0x25FE0014 + (N) * 0x20))
498# define JO_SCU_DMA_STATUS (*(volatile unsigned int *)0x25FE007C)
500# define JO_SCU_DMA_STATUS_BUSY(N) (1 << (4 + (N) * 4))
502# define JO_SCU_DMA_ADD_READ4_WRITE2 (0x101)
504# define JO_SCU_DMA_ENABLE_START (0x101)
506# define JO_SCU_DMA_MODE_DIRECT (0x00000007)
508# define JO_SCU_DMA_MODE_INDIRECT (0x01000007)
510# define JO_SCU_DMA_INDIRECT_END (0x80000000)
511
513# define JO_SCU_INT_VBLANK_IN (1 << 0)
514# define JO_SCU_INT_VBLANK_OUT (1 << 1)
515# define JO_SCU_INT_HBLANK_IN (1 << 2)
516# define JO_SCU_INT_TIMER0 (1 << 3)
517# define JO_SCU_INT_TIMER1 (1 << 4)
518# define JO_SCU_INT_SOUND (1 << 6)
519# define JO_SCU_INT_SMPC (1 << 7)
520# define JO_SCU_INT_SPRITE_END (1 << 13)
521# define JO_SCU_INT_ALL (0x0000BFFF)
522
524# define JO_VECTOR_VBLANK_IN (0x40)
525# define JO_VECTOR_VBLANK_OUT (0x41)
526# define JO_VECTOR_HBLANK_IN (0x42)
527# define JO_VECTOR_TIMER0 (0x43)
528# define JO_VECTOR_TIMER1 (0x44)
529# define JO_VECTOR_SOUND (0x46)
530# define JO_VECTOR_SMPC (0x47)
531# define JO_VECTOR_SPRITE_END (0x4D)
532
533/*
534███████╗██╗ ██╗ ██████╗
535██╔════╝██║ ██║ ╚════██╗
536███████╗███████║ █████╔╝
537╚════██║██╔══██║ ██╔═══╝
538███████║██║ ██║ ███████╗
539╚══════╝╚═╝ ╚═╝ ╚══════╝
540*/
541
543# define JO_CACHE_THROUGH(ADDR) ((unsigned int)(ADDR) | 0x20000000)
545# define JO_SH2_CCR (*(volatile unsigned char *)0xFFFFFE92)
547# define JO_SH2_CCR_CACHE_ENABLE (1 << 0)
549# define JO_SH2_CCR_CACHE_PURGE (1 << 4)
551# define JO_SH2_SR_INTERRUPT_MASK (0xF0)
553# define JO_SH2_SR_INTERRUPTS_ON (0x00)
555# define JO_SH2_FRT_TIER (*(volatile unsigned char *)0xFFFFFE10)
557# define JO_SH2_FRT_FTCSR (*(volatile unsigned char *)0xFFFFFE11)
559# define JO_SH2_FRT_TIER_NO_INTERRUPT (1 << 0)
561# define JO_SH2_FRT_FTCSR_ICF (1 << 7)
563# define JO_SH2_FRT_FTCSR_OCFA (1 << 3)
565# define JO_SH2_FRT_TIER_ICIE (1 << 7)
567# define JO_SH2_FRT_TIER_OCIAE (1 << 3)
569# define JO_SH2_FRT_OCRAH (*(volatile unsigned char *)0xFFFFFE14)
571# define JO_SH2_FRT_OCRAL (*(volatile unsigned char *)0xFFFFFE15)
573# define JO_SH2_FRT_TOCR (*(volatile unsigned char *)0xFFFFFE17)
575# define JO_SH2_FRT_TOCR_OCRA (0xE0)
577# define JO_SH2_IPRB (*(volatile unsigned short *)0xFFFFFE60)
579# define JO_SH2_VCRC (*(volatile unsigned short *)0xFFFFFE66)
581# define JO_SH2_DVSR (*(volatile int *)0xFFFFFF00)
583# define JO_SH2_DVDNT (*(volatile int *)0xFFFFFF04)
585# define JO_SH2_DVDNTH (*(volatile int *)0xFFFFFF10)
587# define JO_SH2_DVDNTL (*(volatile int *)0xFFFFFF14)
589# define JO_SH2_SAR0 (*(volatile unsigned int *)0xFFFFFF80)
591# define JO_SH2_DAR0 (*(volatile unsigned int *)0xFFFFFF84)
593# define JO_SH2_TCR0 (*(volatile unsigned int *)0xFFFFFF88)
595# define JO_SH2_CHCR0 (*(volatile unsigned int *)0xFFFFFF8C)
597# define JO_SH2_DMAOR (*(volatile unsigned int *)0xFFFFFFB0)
599# define JO_SH2_CHCR_DEST_INCREMENT (1 << 14)
601# define JO_SH2_CHCR_SRC_INCREMENT (1 << 12)
603# define JO_SH2_CHCR_SIZE_8 (0 << 10)
605# define JO_SH2_CHCR_SIZE_16 (1 << 10)
607# define JO_SH2_CHCR_SIZE_32 (2 << 10)
609# define JO_SH2_CHCR_AUTO_REQUEST (1 << 9)
611# define JO_SH2_CHCR_TRANSFER_END (1 << 1)
613# define JO_SH2_CHCR_ENABLE (1 << 0)
615# define JO_SH2_DMAOR_ENABLE (1 << 0)
617# define JO_SH2_CACHE_PURGE_AREA (0x40000000)
619# define JO_SH2_CACHE_LINE_SIZE (16)
620
621/*
622███████╗ ██████╗███████╗██████╗
623██╔════╝██╔════╝██╔════╝██╔══██╗
624███████╗██║ ███████╗██████╔╝
625╚════██║██║ ╚════██║██╔═══╝
626███████║╚██████╗███████║██║
627╚══════╝ ╚═════╝╚══════╝╚═╝
628*/
629
631# define JO_SOUND_RAM (0x25A00000)
633# define JO_SCSP_SLOT(SLOT, OFFSET) (*(volatile unsigned short *)(0x25B00000 + ((SLOT) << 5) + (OFFSET)))
635# define JO_SCSP_COMMON(OFFSET) (*(volatile unsigned short *)(0x25B00400 + (OFFSET)))
636
638# define JO_SCSP_SLOT_COUNT (32)
639
640/*
641** SCSP slot registers (offset in bytes)
642*/
644# define JO_SCSP_SLOT_CONTROL (0x00)
646# define JO_SCSP_SLOT_START_ADDRESS (0x02)
648# define JO_SCSP_SLOT_LOOP_START (0x04)
650# define JO_SCSP_SLOT_LOOP_END (0x06)
652# define JO_SCSP_SLOT_ENVELOPE_ATTACK (0x08)
654# define JO_SCSP_SLOT_ENVELOPE_RELEASE (0x0A)
656# define JO_SCSP_SLOT_TOTAL_LEVEL (0x0C)
658# define JO_SCSP_SLOT_MODULATION (0x0E)
660# define JO_SCSP_SLOT_PITCH (0x10)
662# define JO_SCSP_SLOT_LFO (0x12)
664# define JO_SCSP_SLOT_DSP_INPUT (0x14)
666# define JO_SCSP_SLOT_MIXER (0x16)
667
668/*
669** JO_SCSP_SLOT_CONTROL fields
670*/
672# define JO_SCSP_KEY_ON_EXECUTE (1 << 12)
674# define JO_SCSP_KEY_ON (1 << 11)
676# define JO_SCSP_KEY_MASK (0x07FF)
678# define JO_SCSP_LOOP_NORMAL (1 << 5)
680# define JO_SCSP_PCM_8BITS (1 << 4)
682# define JO_SCSP_START_ADDRESS_HIGH(ADDR) (((ADDR) >> 16) & 0xF)
684# define JO_SCSP_START_ADDRESS_LOW(ADDR) ((ADDR) & 0xFFFF)
685
687# define JO_SCSP_SOURCE_NOISE (1 << 7)
688
690# define JO_SCSP_ENVELOPE_ATTACK(AR, D1R, D2R) ((((D2R) & 0x1F) << 11) | (((D1R) & 0x1F) << 6) | ((AR) & 0x1F))
693# define JO_SCSP_ENVELOPE_RELEASE(RR) ((0xF << 10) | ((RR) & 0x1F))
696# define JO_SCSP_MODULATION(MDL, X, Y) ((((MDL) & 0xF) << 12) | (((X) & 0x3F) << 6) | ((Y) & 0x3F))
698# define JO_SCSP_LFO(LFOF, ALFOWS, ALFOS) ((((LFOF) & 0x1F) << 10) | (((ALFOWS) & 3) << 3) | ((ALFOS) & 7))
700# define JO_SCSP_LFO_TRIANGLE (2)
703# define JO_SCSP_DSP_SEND(ISEL, IMXL) ((((ISEL) & 0xF) << 3) | ((IMXL) & 7))
704
706# define JO_SCSP_ATTACK_RATE_MAX (0x1F)
708# define JO_SCSP_RELEASE_RATE_MAX (0x1F)
709
714# define JO_SCSP_PITCH(OCT, FNS) ((((OCT) & 0xF) << 11) | ((FNS) & 0x3FF))
716# define JO_SCSP_FNS_MAX (1023)
718# define JO_SCSP_FNS_PER_OCTAVE (1024)
720# define JO_SCSP_BASE_SAMPLING_RATE (44100)
724# define JO_SCSP_TOTAL_LEVEL(VOLUME) (((127 - ((VOLUME) & 127)) << 1) & 0xFF)
725
731static __jo_force_inline unsigned short __jo_scsp_pitch(unsigned int rate)
732{
733 int oct;
734 unsigned int base;
735 unsigned int fns;
736
737 if (rate == 0)
739 oct = 0;
741 while (rate < base && oct > -8)
742 {
743 base >>= 1;
744 --oct;
745 }
746 while (rate >= (base << 1) && oct < 7)
747 {
748 base <<= 1;
749 ++oct;
750 }
751 fns = ((rate - base) * JO_SCSP_FNS_PER_OCTAVE) / base;
752 if (fns > JO_SCSP_FNS_MAX)
753 fns = JO_SCSP_FNS_MAX;
754 return ((unsigned short)JO_SCSP_PITCH(oct, fns));
755}
756
757/*
758** JO_SCSP_SLOT_MIXER fields
759*/
761# define JO_SCSP_DIRECT_LEVEL(LEVEL) ((LEVEL) << 13)
763# define JO_SCSP_DIRECT_PAN(PAN) (((PAN) & 0x1F) << 8)
765# define JO_SCSP_EFFECT_LEVEL(LEVEL) ((LEVEL) << 5)
767# define JO_SCSP_EFFECT_PAN(PAN) ((PAN) & 0x1F)
769# define JO_SCSP_PAN_CENTER (0x00)
771# define JO_SCSP_PAN_LEFT_SIDE (0x10)
773# define JO_SCSP_PAN_RIGHT (0x0F)
775# define JO_SCSP_PAN_LEFT (0x1F)
777# define JO_SCSP_LEVEL_MAX (7)
778
780# define JO_SCSP_CDDA_LEFT_SLOT (16)
782# define JO_SCSP_CDDA_RIGHT_SLOT (17)
783
784/*
785** SCSP common registers
786*/
788# define JO_SCSP_COMMON_MASTER_VOLUME (0x00)
790# define JO_SCSP_COMMON_RING_BUFFER (0x02)
793# define JO_SCSP_DSP_AREA (0x25B00700)
794# define JO_SCSP_DSP_AREA_SIZE (0x500)
796# define JO_SCSP_DSP_COEF (0x000)
798# define JO_SCSP_DSP_ADDRESS (0x080)
800# define JO_SCSP_DSP_PROGRAM (0x100)
802# define JO_SCSP_DSP_FLOAT_ZERO (0x6000)
807# define JO_SCSP_RING_BUFFER(WORDS, ADDR) ((((WORDS) >= 65536 ? 3 : (WORDS) >= 32768 ? 2 : (WORDS) >= 16384 ? 1 : 0) << 7) | (((ADDR) >> 13) & 0x7F))
809# define JO_SCSP_MASTER_VOLUME_MASK (0x000F)
811# define JO_SCSP_MASTER_VOLUME_MAX (0x000F)
812
813/*
814██╗ ██╗███████╗██╗ ██████╗ ███████╗██████╗ ███████╗
815██║ ██║██╔════╝██║ ██╔══██╗██╔════╝██╔══██╗██╔════╝
816███████║█████╗ ██║ ██████╔╝█████╗ ██████╔╝███████╗
817██╔══██║██╔══╝ ██║ ██╔═══╝ ██╔══╝ ██╔══██╗╚════██║
818██║ ██║███████╗███████╗██║ ███████╗██║ ██║███████║
819╚═╝ ╚═╝╚══════╝╚══════╝╚═╝ ╚══════╝╚═╝ ╚═╝╚══════╝
820
821*/
822
826# define JO_IS_PTR_INSIDE_USER_RAM_AREA(PTR) (((unsigned int)(PTR)) >= JO_WORK_RAM_USER_PROGRAM_AND_DATA && \
827 ((unsigned int)(PTR)) < JO_WORK_RAM_USER_PROGRAM_AND_DATA_END)
828
832# define JO_IS_ARRAY_INSIDE_USER_RAM_AREA(ARRAY) (JO_IS_PTR_INSIDE_USER_RAM_AREA((unsigned char *)ARRAY) && \
833 JO_IS_PTR_INSIDE_USER_RAM_AREA(((unsigned char *)ARRAY) + sizeof(ARRAY)))
834
835#endif /* !__JO_SEGA_SATURN_H__ */
836
837/*
838** END OF FILE
839*/
#define JO_SCSP_FNS_PER_OCTAVE
Frequency number count per octave.
Definition sega_saturn.h:718
#define JO_SCSP_BASE_SAMPLING_RATE
Sampling rate at octave 0 and frequency number 0 (Hz).
Definition sega_saturn.h:720
#define JO_SCSP_PITCH(OCT, FNS)
Pitch register value.
Definition sega_saturn.h:714
#define JO_SCSP_FNS_MAX
Maximum frequency number.
Definition sega_saturn.h:716
unsigned int _jo_work_start
Start of the engine work area (VDP1 command lists, 3D buffers, etc): after the program and its data (...
static __jo_force_inline unsigned short __jo_scsp_pitch(unsigned int rate)
Pitch register value for a sampling rate (Internal usage).
Definition sega_saturn.h:731
#define __jo_force_inline
force inline attribute (and prevent Doxygen prototype parsing bug)
Definition types.h:39