clean up sys_ip build process

This commit is contained in:
Zack Buhman 2023-01-07 17:26:49 -08:00
parent e82dd73583
commit e8ce4eeb4e
15 changed files with 26 additions and 631 deletions

3
.gitignore vendored
View File

@ -1,6 +1,5 @@
*.o
!/dts/*
dts/smpsys.o
!/segasmp/lib/*
*.iso
*.elf
*.bin

View File

@ -12,26 +12,16 @@ OBJDUMP = $(TARGET)objdump
all: main.iso
define COPYELF
sys_%.o: segasmp/lib/sys_%.o
$(OBJCOPY) -I coff-sh -O elf32-sh -g \
--rename-section .text=.text.$1 \
--rename-section .text=.text.$* \
$< $@
endef
sys_sec.o: dts/sys_sec.o
$(call COPYELF,sec)
sys_are%.o: dts/sys_are%.o
$(call COPYELF,are)
sys_init.o: dts/sys_init.o
$(call COPYELF,init)
ID_OBJ += sys_id.o
ID_OBJ += sys_sec.o
ID_OBJ += sys_arej.o sys_aret.o sys_areu.o sys_aree.o
ID_OBJ += sys_init.o
ID_OBJ += dts/smpsys.o
SYS_IP_OBJ += sys_id.o
SYS_IP_OBJ += sys_sec.o
SYS_IP_OBJ += sys_arej.o sys_aret.o sys_areu.o sys_aree.o
SYS_IP_OBJ += sys_init.o
SYS_IP_OBJ += smpsys.o
%.o: %.s
$(AS) $(AFLAGS) $< -o $@
@ -42,8 +32,8 @@ ID_OBJ += dts/smpsys.o
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
ip.elf: $(ID_OBJ)
$(LD) --print-memory-usage -T ip.lds $^ -o $@
sys_ip.elf: $(SYS_IP_OBJ)
$(LD) --print-memory-usage -T sys_ip.lds $^ -o $@
%.bin: %.elf
$(OBJCOPY) -O binary $< $@
@ -53,15 +43,16 @@ MAIN_OBJ = main.o
main.elf: $(MAIN_OBJ)
$(LD) --print-memory-usage -T sh2.lds $^ -o $@
main.iso: main.bin ip.bin
main.iso: main.bin sys_ip.bin
mkisofs \
-sysid "SEGA SEGASATURN" \
-volid "SAMPLE_GAME_TITLE" \
-volset "SAMPLE_GAME_TITLE" \
-publisher "SEGA ENTERPRISES, LTD." \
-preparer "SEGA ENTERPRISES, LTD." \
-G ip.bin \
-G sys_ip.bin \
-o $@ \
main.bin \
main.bin
clean:

View File

@ -1,154 +0,0 @@
/*
* :
*
* : sega_sys.h
*
* : BOOT ROM
*
* (1) SCU
* (2) SH2
* (3) (BOOT ROM V0.90)
* (4) SCU (BOOT ROM V0.90)
* (5) (BOOT ROM V0.92)
* (6) SCU (SCU2.1)
* (7) CD (CD付きモデル用)
* (8) (ROM V1.00)
* (9) MPEG () (ROM V1.00)
*
* sega_sys.libで関数を定義しますVer.2.01
*
* 使:
*
* void Vfunc(void)
* {
* // ... 実行文 ... //
* }
*
* extern void Hihdr(void);
*
* void test()
* {
* void (*tmp)();
* Sint32 rep;
* Uint32 msk, clk, lval1;
* Uint8 p0;
* const Uint32 PriTab[32] = {
* 0x00f0ffff, 0x00e0fffe, 0x00d0fffc, 0x00c0fff8,
* 0x00b0fff0, 0x00a0ffe0, 0x0090ffc0, 0x0080ff80,
* 0x0080ff80, 0x0070fe00, 0x0070fe00, 0x0070fe00,
* 0x0070fe00, 0x0070fe00, 0x0070fe00, 0x0070fe00,
* 0x0070fe00, 0x0070fe00, 0x0070fe00, 0x0070fe00,
* 0x0070fe00, 0x0070fe00, 0x0070fe00, 0x0070fe00,
* 0x0070fe00, 0x0070fe00, 0x0070fe00, 0x0070fe00,
* 0x0070fe00, 0x0070fe00, 0x0070fe00, 0x0070fe00,
* };
*
* SYS_SETUINT(0x40, Vfunc); // Vfunc() を VB-In 割込み用に登録 //
* tmp = SYS_GETUINT(0x41); // 現在の VB-Out ルーチン登録を参照 //
* SYS_SETUINT(0x41, 0); // VB-Out ルーチンの登録を消去 //
*
* SYS_SETSINT(0x42, Hihdr); // Hihdr() を HB-In ベクタに登録 //
* tmp = SYS_GETSINT(0x6e); // 現在の DIVU ベクタ登録を参照 //
* SYS_SETSINT(0x6e, 0); // DIVU ベクタを再初期化 //
*
* rep = SYS_TASSEM(0x5); // セマフォ 5 をテスト・アンド・セット //
* SYS_CLRSEM(0x5); // セマフォ 5 をクリア //
*
* SYS_SETSCUIM(0xfffffffe); // VB-In 割込みのみを許可に設定 //
* SYS_CHGSCUIM(0xfffffffc, 0); // VB-In, VB-Out を許可に変更 //
* SYS_CHGSCUIM(0xffffffff, 2); // VB-Out を不許可に変更 //
* msk = SYS_GETSCUIM; // 現在の SCU 割込みマスク値を参照 //
*
* SYS_CHGSYSCK(1); // システムクロックを28Mに切替え //
* clk = SYS_GETSYSCK; // 現在の システムクロック値を参照 //
* // 0: 26 MHz 1: 28 MHz //
* // 320/640 pix/H 352/704 pix/H //
*
* SYS_CHGUIPR(PriTab); // SCU割り込みルーチン優先度変更 //
*
* SYS_EXECDMP(); // CDマルチプレーヤ起動実行 //
*
* p0 = SYS_PCLRMEM; // パワーオンクリアメモリ先頭バイト //
* lval1 = *((Uint32*)&SYS_PCLRMEM+1); // と後半ロングワードを参照 //
*
* rep = SYS_CHKMPEG(0); // 引数は必ず 0. MANSYS.DOC の使用例 //
* // に従ってください //
* }
*
* // ... 別のファイル ... //
* #pragma interrupt(Hihdr)
* void Hihdr(void)
* {
* // ... 実行文 ... //
* }
*
*
* : 1994/05/06 for BOOT 0.90,0.901,0.91 by T. S.
* 1994/07/16 for BOOT 0.92x,0.95 by T. S.
* 1994/07/29 for BOOT 0.96x,1.00 by T. S.
* 1994/08/31 how to exec CD multi-player
* 1994/09/21 for Ver.1.00 BOOT ROM
* 1995/03/31 MPEG check service
* 1995/09/26 sega_sys.lib (Ver.2.01) by M. M.
*
* : Ver.2.01
*
*/
#ifndef SEGA_SYS_H
#define SEGA_SYS_H
/***********************************************************************
*
***********************************************************************/
#include "sega_xpt.h"
/***********************************************************************
*
***********************************************************************/
#define SYS_SETUINT(_Num_, _Hdr_) \
((**(volatile void(**)(Uint32, void*))0x6000300)((_Num_), (_Hdr_)))
#define SYS_GETUINT(_Num_) \
((void*)(**(void(*(**)(Uint32))(Uint32))0x6000304)(_Num_))
#define SYS_SETSINT(_Num_, _Hdr_) \
((**(volatile void(**)(Uint32, void*))0x6000310)((_Num_), (_Hdr_)))
#define SYS_GETSINT(_Num_) \
((void*)(**(void(*(**)(Uint32))(Uint32))0x6000314)(_Num_))
#define SYS_TASSEM(_Num_) \
((**(volatile Uint32(**)(Uint32))0x6000330)(_Num_))
#define SYS_CLRSEM(_Num_) \
((**(volatile void(**)(Uint32))0x6000334)(_Num_))
#define SYS_SETSCUIM(_MaskPat_) \
((**(volatile void(**)(Uint32))0x6000340)(_MaskPat_))
#define SYS_CHGSCUIM(_AndMask_, _OrMask_) \
((**(volatile void(**)(Uint32, Uint32))0x6000344)((_AndMask_), (_OrMask_)))
#define SYS_GETSCUIM \
(*(volatile Uint32*)0x6000348)
#define SYS_CHGSYSCK(_CkMode_) \
((**(volatile void(**)(Uint32))0x6000320)(_CkMode_))
#define SYS_GETSYSCK \
(*(volatile Uint32*)0x6000324)
#define SYS_CHGUIPR(_IprTab_) \
((**(volatile void(**)(Uint32*))0x6000280)(_IprTab_))
#define SYS_EXECDMP \
(**(volatile void(**)(void))0x600026C)
#define SYS_PCLRMEM \
(*(volatile Uint8*)0x6000210)
#define SYS_CHKMPEG(_dummy_) \
((**(volatile Sint32(**)(Sint32))0x6000274)(_dummy_))
/***********************************************************************
*
***********************************************************************/
void SYS_CheckTrack(Sint32 tno);
void SYS_Exit(Sint32 code);
#endif

View File

@ -1,82 +0,0 @@
/*
*
*
* sega_xpt.h
*
*
*
* (1)
* (2)
*
* 使使
*
*
*
*
*
* AUTHORVer1.00 N.T 1993/12/22
* Ver1.01 N.T 1993/12/27
* Ver1.02 N.T 1994/01/06
* Ver1.03 N.T 1994/02/23
* Ver1.04 N.T 1994/02/23
*
* DATE1994-07-29
*/
#ifndef SEGA_XPT_H
#define SEGA_XPT_H
/*****************************************************************************/
/****************************** 基本データ型宣言 *****************************/
/*****************************************************************************/
typedef unsigned char Uint8; /* 符号なし1バイト整数 */
typedef signed char Sint8; /* 符号つき1バイト整数 */
typedef unsigned short Uint16; /* 符号なし2バイト整数 */
typedef signed short Sint16; /* 符号つき2バイト整数 */
typedef unsigned long Uint32; /* 符号なし4バイト整数 */
typedef signed long Sint32; /* 符号つき4バイト整数 */
typedef float Float32; /* 4バイト実数 */
typedef double Float64; /* 8バイト実数 */
typedef int Int; /* INT型(ツール用) */
typedef int Bool; /* 論理型(論理定数を値にとる) */
/*****************************************************************************/
/********************************* 定数マクロ ********************************/
/*****************************************************************************/
#ifndef NULL
#define NULL ((void *)0) /* NULL */
#endif /* NULL */
/*****************************************************************************/
/********************************** 列挙定数 *********************************/
/*****************************************************************************/
enum BooleanLogic { /* 論理定数1(偽、真) */
FALSE = 0,
TRUE = 1
};
enum BooleanSwitch { /* 論理定数2(スイッチ) */
OFF = 0,
ON = 1
};
enum Judgement { /* 結果判定の定数(成功、失敗) */
OK = 0, /* 成功 */
NG = -1 /* 失敗 */
};
/*****************************************************************************/
/********************************* 処理マクロ ********************************/
/*****************************************************************************/
#define MAX(x, y) ((x) > (y) ? (x) : (y)) /* 最大値 */
#define MIN(x, y) ((x) < (y) ? (x) : (y)) /* 最小値 */
#define ABS(x) ((x) < 0 ? -(x) : (x)) /* 絶対値 */
#endif /* SEGA_XPT_H */

View File

@ -1,368 +0,0 @@
/* */
/* アプリケーション初期化プログラムサンプル */
/* V1.10 '94.11.11 S.U and T.S */
/* */
/* 動作タイミングと機能について: */
/* ライセンス画面表示中に、不定になっている各種デバイス */
/* 状態や、そのメモリのクリアなどを行ないます。 */
/* 処理の所要時間は、0.1 秒程度かかります。 */
/* 終了後、先読みしておいたプログラムの実行に移ります。 */
/* その実行開始アドレスは APP_ENTRY に定義してください。 */
/* */
/* リンケージについて: */
/* IPの sys_init.obj の直後にリンクしてください。 */
/* プログラムをこのまま使用した場合、約360Hバイトに */
/* なり、IPサイズは1000Hを越えますので注意して */
/* ください。 */
/* */
/* プログラム変更時の注意: */
/* main() の前に実行文を含む関数を追加しないでください。 */
/* */
#include "sega_sys.h"
/* 先読みしたプログラムの実行開始アドレス(メイン処理完了後にジャンプ)*/
#define APP_ENTRY (0x06003000)
/* デバイスを初期化するルーチン */
static void vd1Comfil(void); /* VDP1 クリッピング初期化 */
static void vd2Ramfil(void); /* VDP2 VRAMクリア */
static void colRamfil(void); /* カラーRAMクリア */
static void sndRamfil(Sint32); /* サウンドRAMクリア */
static void scuDspInit(void); /* SCU DSP 初期化 */
static void msh2PeriInit(void); /* マスタSH周辺モジュール初期化 */
static void sndDspInit(void); /* サウンドDSPクリア */
/* その他サブルーチン */
static void vbIrtn(void); /* VB-In 割込み処理 */
static void vbOrtn(void); /* VB-Out 割込み処理 */
static void syncVbI(void); /* VB-In 同期処理用 */
#ifndef __GNUC__
static void memset_w(Sint16 *, Sint16, Sint32); /* ワード memset */
static void memcpy_w(Sint16 *, Sint16 *, Sint32); /* ワード memcpy */
static Sint16 *blkmfil_w(Sint16 *, Sint16, Sint32);
/* ワード・ブロックfill */
static Sint32 *blkmfil_l(Sint32 *, Sint32, Sint32);
/* ロングワード・ブロックfill */
#else
static void memset_w(volatile Sint16 *, Sint16, Sint32);
static void memcpy_w(volatile Sint16 *, Sint16 *, Sint32);
static void blkmfil_w(volatile Sint16 *, Sint16, Sint32);
/* ワード・ブロックfill */
static void blkmfil_l(volatile Sint32 *, Sint32, Sint32);
/* ロングワード・ブロックfill */
#endif
/* 現時点の(ライセンス画面表示中)画面サイズに関する情報 */
#define XRES (320) /* ライセンス画面の水平サイズ */
#define SCLIP_UX (XRES-1) /* 〃 */
#define SCLIP_UY_N (224-1) /* 〃 (NTSCの場合) */
#define SCLIP_UY_P (256-1) /* 〃 (PALの場合) */
/* 処理対象デバイスのベースアドレス */
#define SND_RAM ((volatile Sint32 *)0x25a00000)
#define VD1_VRAM ((volatile Sint16 *)0x25c00000)
#define VD1_REG ((volatile Sint16 *)0x25d00000)
/* VD2_VRAM は、ライセンス表示で使用中のVRAM領域を除く */
#define VD2_VRAM ((volatile Sint32 *)0x25e08004)
/* COL_RAM は、ライセンス表示で使用中のカラーRAM領域を除く */
#define COL_RAM ((volatile Sint16 *)0x25f00020)
#define VD2_REG ((volatile Sint16 *)0x25f80000)
#define SCSP_DSP_RAM ((volatile Sint16 *)0x25b00800)
/* SMPCレジスタ */
#define SMPC_REG(ofs) (*(volatile Uint8 *)(0x20100000+ofs))
/* SCUレジスタ */
#define DSP_PGM_CTRL_PORT (*(volatile Sint32 *)0x25fe0080)
#define DSP_PGM_RAM_PORT (*(volatile Sint32 *)0x25fe0084)
#define DSP_DATA_RAM_ADRS_PORT (*(volatile Sint32 *)0x25fe0088)
#define DSP_DATA_RAM_DATA_PORT (*(volatile Sint32 *)0x25fe008c)
/* SCSP サウンドRAMサイズレジスタ */
#define SCSP_SNDRAMSZ (*(volatile Sint8 *)0x25b00400)
/* SH2周辺モジュールレジスタ */
#define MSH2_DMAC_SAR(ofs) (*(volatile Sint32 *)(0xffffff80 + ofs))
#define MSH2_DMAC_DAR(ofs) (*(volatile Sint32 *)(0xffffff84 + ofs))
#define MSH2_DMAC_TCR(ofs) (*(volatile Sint32 *)(0xffffff88 + ofs))
#define MSH2_DMAC_CHCR(ofs) (*(volatile Sint32 *)(0xffffff8c + ofs))
#define MSH2_DMAC_DRCR(sel) (*(volatile Sint8 *)(0xfffffe71 + sel))
#define MSH2_DMAC_DMAOR (*(volatile Sint32 *)(0xffffffb0))
#define MSH2_DIVU_CONT (*(volatile Sint32 *)(0xffffffb8))
/* メインの処理に関する情報 */
/* 現在ライセンス表示中、16ビット1024色モードを使用 */
/* VDP2のVRAMとカラーRAMは4回に分けてクリア */
/* VRAMは1回に 20000H バイト(表示中部分を除く) */
/* カラーRAMは1回に 200H バイト(表示中部分を除く) */
#define MSETDIV (4)
#define BLKMSK_VD2_VRAM (0x1fffc)
#define BLKMSK_COL_RAM (0x001fe)
/* サウンドRAMは3手順でクリア */
#define M68000_VECTBLSZ (0x00400/sizeof(Sint32))
#define BLKMSK_SND_RAM (0x003fc)
/* サウンドDSP RAMサイズ */
#define SCSP_DSP_RAMSZ (0x00400)
/* 割込み処理に関する情報 */
#define VBI_NUM (0x40) /* VBイン割込み番号 */
#define VBO_NUM (0x41) /* VBアウト割込み番号 */
#define VB_MASK (0x0003) /* SCU割込みマスク2つ分 */
/* スタティック変数 */
static Sint16 yBottom, ewBotRight;
static Sint16 vdp1cmds[48];
#ifndef __GNUC__
/* static Sint16 vbIcnt = 0, sequence = 0; */
static Sint16 vbIcnt = 0, sequence = 0;
static Sint32 *vramptr = VD2_VRAM;
static Sint16 *cramptr = COL_RAM;
#else
static volatile Sint16 vbIcnt = 0, sequence = 0;
static volatile Sint32 *vramptr = VD2_VRAM;
static volatile Sint16 *cramptr = COL_RAM;
#endif
/* メイン処理 */
void main(void)
{
/* 注意:AUTO 変数をとると、APP_ENTRY のプログラムに */
/* 制御が移るとき、スタックが若干無駄になる */
yBottom = (VD2_REG[2]&1)? SCLIP_UY_P: SCLIP_UY_N;
ewBotRight = ((XRES/8)<<9)+(yBottom);
/* 画面縦上限= 223(NTSC) or 255(PAL) */
SYS_SETUINT(VBI_NUM, vbIrtn); /* VBイン処理登録 */
SYS_SETUINT(VBO_NUM, vbOrtn); /* VBアウト 〃 */
SYS_CHGSCUIM( ~VB_MASK, 0); /* VB割込み2つ許可 */
vd1Comfil(); /* VDP1初期化 */
for (sequence = 0; sequence < MSETDIV; sequence++)
{
syncVbI(); /* カラーRAMクリアのため同期 */
colRamfil(); /* カラーRAMクリア */
vd2Ramfil(); /* VDP2RAMクリア */
sndRamfil(sequence); /* サウンドRAMクリア */
}
scuDspInit(); /* SCUのDSP初期化 */
msh2PeriInit(); /* SH周辺モジュール〃 */
sndDspInit(); /* サウンドDSP 〃 */
SYS_CHGSCUIM( -1, VB_MASK); /* VB割込み2つ禁止 */
SYS_SETUINT(VBI_NUM, (void(*)())0 ); /* フック */
SYS_SETUINT(VBO_NUM, (void(*)())0 ); /* 再初期化 */
((void(*)())APP_ENTRY)(); /* 次の実行開始アドレス */
}
#ifndef __GNUC__
static void memset_w(Sint16 *buf, Sint16 pattern, Sint32 size)
#else
static void memset_w(volatile Sint16 *buf, Sint16 pattern, Sint32 size)
#endif
{
register Sint32 i;
for (i = 0; i < size; i+= sizeof(Sint16)) {
*buf++ = pattern;
}
}
#ifndef __GNUC__
static void memcpy_w(Sint16 *dst, Sint16 *src, Sint32 size)
#else
static void memcpy_w(volatile Sint16 *dst, Sint16 *src, Sint32 size)
#endif
{
register Sint32 i;
for (i = 0; i < size; i+= sizeof(Sint16)) {
*dst++ = *src++;
}
}
/* blkmfilは、区切りのいいアドレス範囲をmemsetするもの */
#ifndef __GNUC__
static Sint16 *blkmfil_w(Sint16 *buf, Sint16 pattern, Sint32 brkmsk)
#else
static void blkmfil_w(volatile Sint16 *buf, Sint16 pattern, Sint32 brkmsk)
#endif
{
register Sint32 i;
#ifndef __GNUC__
i = (Sint32)buf & brkmsk;
#else
i = (volatile Sint32)buf & brkmsk;
#endif
for (; i <= brkmsk; i+= sizeof(Sint16)) {
*buf++ = pattern;
}
#ifndef __GNUC__
return (buf);
#endif
}
#ifndef __GNUC__
static Sint32 *blkmfil_l(Sint32 *buf, Sint32 pattern, Sint32 brkmsk)
#else
static void blkmfil_l(volatile Sint32 *buf, Sint32 pattern, Sint32 brkmsk)
#endif
{
register Sint32 i;
#ifndef __GNUC__
i = (Sint32)buf & brkmsk;
#else
i = (volatile Sint32)buf & brkmsk;
#endif
for (; i <= brkmsk; i+= sizeof(Sint32)) {
*buf++ = pattern;
}
#ifndef __GNUC__
return (buf);
#endif
}
/* VBインは、割込みでスタティック変数をインクリメントするのみ */
static void vbIrtn(void)
{
vbIcnt++;
}
/* VBアウトは、割込みでVDP1レジスタをコントロールするのみ */
static void vbOrtn(void)
{
#ifndef __GNUC__
register Sint16 *vdp1r;
#else
register volatile Sint16 *vdp1r;
#endif
/* イレースライトでフレームバッファをクリア */
vdp1r = VD1_REG;
*vdp1r++ = 0x0; /* 1/60秒自動描画モード */
*vdp1r++ = 0x0;
*vdp1r++ = 0x2;
*vdp1r++ = 0x0; /* イレースライトは透明色 */
*vdp1r++ = 0x0; /* 〃 左上座標 */
*vdp1r = ewBotRight; /* 〃 右下座標 */
}
/* VBI同期は、呼ばれると待ち、VBI直後に抜けて戻る */
static void syncVbI(void)
{
register Sint32 cur_cnt_value;
/* 待つのはカラーRAMクリアのため */
cur_cnt_value = vbIcnt;
while (cur_cnt_value == vbIcnt);
}
/* VDP1に、システムクリッピングとローカル座標を読ませる */
static void vd1Comfil(void)
{
register Sint16 *cmdbuf;
memset_w((cmdbuf=vdp1cmds), 0, sizeof(vdp1cmds));
cmdbuf[0] = 0x0009;
cmdbuf[10] = SCLIP_UX;
cmdbuf[11] = yBottom;
cmdbuf[16] = 0x000a;
cmdbuf[32] = 0x8000;
memcpy_w(VD1_VRAM, vdp1cmds, sizeof(vdp1cmds));
}
/* VDP2のRAMを、1/4ずつクリア */
static void vd2Ramfil(void)
{
#ifndef __GNUC__
vramptr = blkmfil_l(vramptr, 0, BLKMSK_VD2_VRAM);
#else
blkmfil_l(vramptr, 0, BLKMSK_VD2_VRAM);
#endif
}
/* カラーRAMを、1/4ずつクリア */
static void colRamfil(void)
{
#ifndef __GNUC__
cramptr = blkmfil_w(cramptr, 0, BLKMSK_COL_RAM);
#else
blkmfil_w(cramptr, 0, BLKMSK_COL_RAM);
#endif
}
/* サウンドRAMを、3手順でクリア */
static void sndRamfil(Sint32 initstep)
{
#ifndef __GNUC__
register Sint32 *memptr;
#else
register volatile Sint32 *memptr;
#endif
switch (initstep) {
case 0:
SMPC_REG(31) = 7; /* M68000を停止 */
break;
case 1:
SCSP_SNDRAMSZ = 2; /* サウンドRAMサイズ設定 */
/* サウンドRAM先頭400H */
memptr = SND_RAM; /* (ベクタ)に400Hをフィル */
blkmfil_l(memptr, 0x400, BLKMSK_SND_RAM);
*memptr = 0x0007fffc; /* SP初期値をセット */
memptr += M68000_VECTBLSZ;
*memptr = 0x4e7160fc; /* アドレス400Hに NOPと */
/* BRA @-2 命令を書込み */
break;
case 2:
SMPC_REG(31) = 6; /* M68000起動(無限待ち) */
break;
/* 備考: 1イントの間がある */
} /* ため、SMPCステータスの */
} /* セット/チェックを省略 */
static void msh2PeriInit(void)
{
register Sint32 i, ofs, dummy;
ofs = 0;
for(i = 0;i < 2; i++)
{ /* DMAC各レジスタを初期化 */
MSH2_DMAC_SAR(ofs) = 0x00000000;
MSH2_DMAC_DAR(ofs) = 0x00000000;
MSH2_DMAC_TCR(ofs) = 0x00000001;
dummy = MSH2_DMAC_CHCR(ofs);
MSH2_DMAC_CHCR(ofs) = 0x00000000;
MSH2_DMAC_DRCR(i) = 0x00;
ofs = 0x10;
}
dummy = MSH2_DMAC_DMAOR;
MSH2_DMAC_DMAOR = 0x00000000;
/* DIVU割込みを不許可 */
MSH2_DIVU_CONT = 0x00000000;
}
static void scuDspInit(void)
{
register Sint32 i;
DSP_PGM_CTRL_PORT = 0x0; /* DSP停止 */
for(i = 0; i < 256; i++)
DSP_PGM_RAM_PORT = 0xf0000000; /* END命令フィル */
for(i = 0; i < 256; i++){ /* DSP RAMクリア */
DSP_DATA_RAM_ADRS_PORT = i;
DSP_DATA_RAM_DATA_PORT = 0x0;
}
}
static void sndDspInit(void)
{
memset_w(SCSP_DSP_RAM, 0, SCSP_DSP_RAMSZ);
/* サウンドDSP */
} /* プログラム領域クリア */

1
segasmp/lib/README Normal file
View File

@ -0,0 +1 @@
These files are copy-paste verbatim from "Sega DTS CD" (Nov 1996).

6
smpsys.c Normal file
View File

@ -0,0 +1,6 @@
extern unsigned long _load_addr __asm("_load_addr");
void _start(void)
{
((void(*)())&_load_addr)();
}

View File

@ -14,8 +14,8 @@
.ascii " " /* B0: */
.ascii " " /* C0: */
.long 0x00000000, 0x00000000, 0x00000000, 0x00000000 /* D0: */
.long 0x000012e8, 0x00000000, 0x00000000, 0x00000000 /* E0: IP SIZE, reserved, STACK-M, STACK-S */
.long 0x06003000, 0x00000000, 0x00000000, 0x00000000 /* F0: Transfer destination address */
.long _text_size, 0x00000000, 0x00000000, 0x00000000 /* E0: IP SIZE, reserved, STACK-M, STACK-S */
.long _load_addr, 0x00000000, 0x00000000, 0x00000000 /* F0: Transfer destination address */
/* Larger than (60020000H+IP SIZE), smaller than (6100000-4) */
/* IP SIZE of 0x1000 is manually calculated; this is coincidentally the

View File

@ -12,9 +12,11 @@ SECTIONS
{
KEEP(*(.text.id))
KEEP(*(.text.sec))
KEEP(*(.text.are))
KEEP(*(.text.are*))
KEEP(*(.text.init))
KEEP(*(.text.main))
KEEP(*(.text.*))
} > rom
}
_text_size = SIZEOF(.text);
_load_addr = 0x06010000;