English
INDEX戻る(STN-28)
STN-28 添付資料

SEGASATURN

デュアルCPU使用方法

Ver1.1

1995年2月10日


目次

  1. はじめに
  2. セガサターンにおけるデュアルCPUの概要
  3. デュアルCPUの開発機材の設定について
  4. スレーブCPUを使用したプログラミングについて
  5. マスタCPU/スレーブCPU間の通信について
  6. マスタとスレーブ間のデータ受渡しについて
  7. スレーブCPUを利用したプログラム
  8. IBM−PC(互換機含む)1台よるデバック方法

■1.はじめに

 本マニュアルは、セガサターンの搭載しているCPU(SH2)を2個使用する方法を記したものです。 セガサターンの起動時には、メインCPUのみで動作しています。スレーブCPUを起動するには、 本マニュアルで説明する手順を行うことが必要です。
 本マニュアルは、セガサターンのハードウェアおよびソフトウェアの全般的知識があることを想定して 説明しています。以下のマニュアルをご用意の上お読みください。


■2.セガサターンにおけるデュアルCPUの概要

 セガサターンにおけるデュアルCPUの概要について説明します。

 ●2.1 完全共有モード(メモリの共有)

 セガサターンのスレーブCPUは全ての外部デバイスをマスタCPUと共有しています。 スレーブCPUで実行されるプログラムや、リセット時に取得するリセットベクタは、完全に マスタCPUのそれと同一なのもです。
 だたし、BOOTROM内でマスタCPUとスレーブCPUの判定を行い、それぞれのCPU にたいして別々の初期化を行い必要があるため、BOOTROM内部でマスタ/スレーブの判断を行っています。
 マスタCPUとスレーブCPUの外部アクセスが競合すると、どちらかのCPUがアクセスを待たされて、実行速度の低下が発生します。

 ●2.2 フリーランニングタイマ(FRT)による通信

 セガサターンにおいて、マスタCPUとスレーブCPUの通信手段として、SH2内臓モジュール のフリーランニングタイマ(FRT)インプットキャプチャ信号を利用することができるようになっています。
 具体的には、21000000H番地に16ビット長の任意のデータを書き込むとスレーブCPUに、また、21800000H番地に16ビット長の任意のデータを書き込むとマスタCPUにFRTインプット キャプチャ信号を入力することができます。

 ●2.3 スレーブCPUの割り込みについて

 スレーブCPUは、マスタCPUと違いSCUからの割り込みは設定されません。そのため、 このデュアルCPUをコントロールする周辺モジュール(DCC)から割り込みが接続されています。

  (1) スレーブCPUで使用する割り込み

  (2) HブランクIN割り込みとVブランクIN割り込みについて
 スレーブCPUにおいては、HブランクIN割り込みおよびVブランクIN割り込み は両方ともブランク期間中に割り込みを受け付けるレベル信号割り込みになっています。
例えば、VブランクIN割り込み処理が開始され完了しても、なおVブランク期間中ではれば 再び割り込みが開始されることになります。
□1回の割り込みに対して1回だけ割り込み関数を呼び出すためには、アプリケーション側で対策 する必要があります。具体的な方法として次の2つ方法が考えられます。

1.割り込み関数内でブランクの終了を待つ方法
 ブランクの終了を待つ方法として、 VDP2の画面ステータスレジスタのブランクフラグを監視して、ブランク期間が終了したら割り込み関数から復帰する方法と 割り込み処理の先頭でブランク期間と同じ長さにタイマを設定し、設定時間が経過したことを確認してから割り込み関数から復帰する方法 が考えられます。前者は、外部アドレス(VDP2)をアクセスするので、マスタ側のパフォーマンスが低下する場合があります。

2.復帰時の割り込みマスクを操作する方法
 スタック上にセーブされた割り込みマスクを操作して、割り込み関数から復帰した後もブランク期間中は割り込みマスクを 戻さないようにして、同じ割り込みを受け付けないようにする方法が考えられます。
 この方法を実現するためにはタイマ割り込みを使用する方法が考えられますが、その際の注意点として HブランクIN・VブランクIN・タイマ割り込みよりも他の割り込み(内部割り込み)は高いレベルにする必要があります。


■3.デュアルCPUの開発機材の設定について

 デュアルCPUでの開発機材の設定方法やデバック方法について説明します。

 ●3.1 デュアルCPUの開発方法

 デュアルCPUの開発を行う場合、マスタ側・スレーブ側にそれぞれE7000エミュレータまたはEVAボードを接続して行います。

 ●3.2 E7000エミュレータの設定方法

 スレーブCPUにE7000を使用する場合は、エミュレータの MODE コマンドで、スレーブモードを設定する必要があります。

    ★スレーブ側の設定方法
	    :mode;c (RET)
	    E7000 MODE(MD5-0)=xx? 2E(RET)
	    MODE SET (C:CONFIGURATION/U:USER/M:MASTER-SALVE)=X? C(RET)
	    CONFIGURATION WRITE OK?(Y/N)? Y(RET)
    ★マスタ側の設定
    	    E7000 MODE(MD5-0)=xx? 0E(RET)
  

 ●3.3 EVAボードの設定方法

 □スレーブCPUにEVAボードを使用する場合は、次のような設定が必要です。 1.リセットの解除 □マスタCPU側のエミュレータでスレーブCPUのリセットを解除します。 ★解除方法 :m 2010001f;b(RET) 2010001f xx ? 02(RET) 20100020 xx ? _(RET) 上記の設定でスレーブCPU側のEVAボードが起動します。 2.確認事項 □スレーブCPU側のEVAボードが、em ct=d であることを確認してください。 3.注意事項 □スレーブCPU側に、EVAボードを使用する場合は、スレーブCPUのリセットが 解除されるまで、EVAボードの操作はできません。

 ●3.4 デバック環境について

 使用する環境により以下のような構成が可能です。

 1.ワークステーションでの開発
 ワークステーション(Sun SPARCシリーズ,HP9000/700シリーズ)上で開発する場合は、マスタ側、スレーブ側に それぞれE7000エミュレータを使用します。(注:EVAボードは使用できない) 使用するソフトウェアは、GUISH、LANホストシステムのどの組み合わせでも動作可能です。

 2.IBM−PC互換機での開発
 IBM−PC(互換機含む)で開発する場合、2台のPC互換機を使用する場合と1台のPC互換機を使用 する方法があります。2台使用する場合は同時にマスタ側とスレーブ側を操作することが可能です。使用する ソフトはGUISH、IPIのどの組み合わせも可能です。
 しかし、1台の場合はマスタ側とスレーブ側の操作はウインドウを切換えて行います。 (8章にて1台のIBM−PCでの開発方法と制限について説明します)


■4.スレーブCPUを使用したプログラミングについて

 ●4.1 プログラムの共存

 マスタCPUとスレーブCPUは、全ての外部デバイスを共有しているので、どちらも一つの実行ファイル のどこでも自由に実行することができます。
(キャッシュを内臓RAMとして使用する場合は内臓RAMに置くプログラムは共有しません)

 ●4.2 スタック変数とスタック,グローバル変数

 マスタCPUとスレーブCPUは、スタック領域が個々に確保(BOOT ROMの設定)されるためリエントラント な関数であれば同時に実行することが可能です。しかし、スタティック変数やグローバル変数を書き換える ようなプログラムを両CPUが実行する場合には、それぞれのCPUにおける実行順序や同時実行に注意 する必要があります。

 ●4.3 スレーブCPUの初期化

 マスタCPUが、スレーブCPUを起動する場合には、マスタCPUはBOOT ROMが読み込む 初期化後の実行エントリを書き換えた後(SYS_SETSINT(0x94, EntryFunc);)、スレーブのリセットを SMPC I/FライブラリのスレーブSH2 ON関数(PER_SMPC_SSH_ON)により解除します。

※EntryFuncはスレーブのエントリ関数です

 ●4.4 BOOT ROMによる初期化(ベクタ、スタック)

(1)BOOT ROMはスレーブCPUを以下のように初期化します
・ベクタベースレジスタ(VBR)=6000400H番地
・スタックポインタ(SP)=6001000H番地
・割り込みの初期化=FRTインプットキャプチャ割り込み有効(64H,レベル15)

(2)ワークRAM上のスレーブCPU用のベクタテーブルなどでは、スレーブSH2のON/OFF 操作で変更されることはありません。

 ●4.5 クロックチェンジについて

 クロックチェンジを行う場合、スレーブCPUは、SMPCによって、リセット状態に移行するため 、クロックチェンジを行った後にスレーブCPUをSMPCコマンド(SSH_ON = 02H)または SMPC I/F ライブラリのスレーブSH2_ON関数(PER_SMPC_SSH_ON)により、起動しなおす必要があります。

 ●4.6 スレーブCPUの使用上の注意

 以下の内容については、スレーブCPU側では実行できません。
・マルチプレイヤ呼び出し関数は使用できません
・SCU割り込み入ることを前提としたプログラムは使用できません
・SMPC I/Fライブラリのペリフェラル取得に関する処理はできません


■5.マスタCPU/スレーブCPU間の通信について

 マスタCPUとスレーブCPUとの通信方法について説明します。
参照:「SH7095ハードウェアマニュアル」/11. 16ビットフリーランニングタイマ

 ●5.1 マスタCPUからスレーブCPUへの通信

 マスタCPUとスレーブCPUを協調動作させるためには、双方向の通信手段が必要になります。

 (1) FRTインプットキャプチャ割り込み
 スレーブCPUは、BOOT ROM内の初期化でFRTインプットキャプチャ割り込みが設定 されています。アプリケーションの初期化ルーチンで、スレーブCPUの割り込みベクタの64H に割り込みルーチンを登録することによって割り込みが発生したときの処理をマスタCPUから 設定することができます。

→マスタCPUから登録する場合の割り込みベクタは164Hです

 また、マスタCPUからこの割り込みを発生させる場合には、21000000H番地に任意の 16ビット長データを書込みます。これによりスレーブCPUはあらかじめ登録された割り込み 処理を開始します。

 (2) FRTインプットキャプチャフラグのポーリング
 SH2CPUは、FRTインプットキャプチャフラグを受け付けると、FRTユニット内部の レジスタにあるフラグを設定するので、処理待ち状態(または、同期待ち状態)においては、この フラグの変化をを監視する方法もあります。この方法は割り込みを処理する場合よりも受け付けに かかる時間が短時間で済むため同期や処理待ちが多い場合には特に有効です。
□この方法を使用する場合には、アプリケーションの初期化ルーチンで、FRTインプットキャプチャ 割り込みを無効に再設定する必要があります。

→TIMER:アドレス FFFFFE10H番地にバイトで01Hを設定

 ●5.2 スレーブCPUからマスタCPUへの通信

 (1) FRTインプットキャプチャ割り込み
 マスタCPUは、BOOT ROM内の初期化でFRTインプットキャプチャ割り込みが設定されています。 アプリケーションの初期化ルーチンで、マスタCPUの割り込みベクタの64Hに割り込みルーチンを登録する ことによって割り込みが発生したときの処理をマスタCPUから設定することができます。
 また、スレーブCPUからこの割り込みを発生させる場合には、21800000H番地に任意の 16ビット長データを書込みます。これによりマスタCPUはあらかじめ登録された割り込み処理を開始します。

 (2) FRTインプットキャプチャフラグのポーリング
 SH2CPUは、FRTインプットキャプチャフラグを受け付けると、FRTユニット内部の レジスタにあるフラグを設定するので、処理待ち状態(または、同期待ち状態)においては、この フラグの変化をを監視する方法もあります。この方法は割り込みを処理する場合よりも受け付けに かかる時間が短時間で済むため同期や処理待ちが多い場合には特に有効です。
□この方法を使用する場合には、アプリケーションの初期化ルーチンで、FRTインプットキャプチャ 割り込みを無効に再設定する必要があります。


■6.マスタとスレーブ間のデータ受渡しについて

 SH2のキャッシュユニットはスヌープ機能がありません。マスタCPUとスレーブCPUの間でデータ を受け渡す場合、データを読み込む側のCPUではキャッシュスルーで読み込むか対象となるエリアの キャッシュをパージした後に読み込む必要があります。

参照:「SH7095ハードウェアマニュアル」/8.キャッシュ

 ●6.1 キャッシュスルーの読み込み

 キャッシュスルーの読み込みは、対象となるアドレスに20000000Hを加算(論理和)した アドレスから読み込むことで行われます。

詳細:「SCUユーザーズマニュアル」/SCUマッピング

 ●6.2 キャッシュの初期化(パージ)

 キャッシュメモリをパージする方法は以下の2つがあります。

 (1) キャッシュパージ(全初期化)
 初期化はSH2のCCR(アドレス FFFFFE92Hにバイトで10Hを書き込む)のCPビット (4ビット目)に「1」を書き込むことで行われます。
 なお、この全初期化を行った後はあらためてCCRに値を書込みキャッシュを有効にする必要があります。

 書込む値
:4KBキャッシュモードの場合=01H
:2KBキャッシュ+2KB RAMの場合= 09H

 (2)特定ラインのパージ
 対象となるパージに40000000Hを加算したアドレスに16ビットアクセスで「0」を書き込む ことによって行われます。この操作により対象アドレスを含む16バイトの領域がパージされます。


■7.スレーブCPUを利用したプログラム

 スレーブCPUを利用したプログラムを示します。FRTインプットキャプチャフラグをポーリングする方法で説明します。

 ●7.1 スレーブCPUの初期化/起動を行う関数

 スレーブCPUの初期化および起動を行う関数をマスタCPU上で実行します。

	volatile Uint8 *SMPC_SF		=(Uint8 *)0x20100063;	/* SMPC status flag	*/
	volatile Uint8 *SMPC_COM	=(Uint8 *)0x2010001F;	/* SMPC command register */
	const	Uint8 SMPC_SSHON	=0x02;					/* SMPC slave SH on command */
	const	Uint8 SMPC_SSHOFF	=0x03;					/* SMPC slave SH off command */
	void 	InitSlaveCPU(void)
	{
		volatile Uint16	i;
		/* SlaveSH のリセット状態を設定する */

 ●7.2 メインCPUからスレーブCPUのエントリ関数

 FRTインプットキャプチャフラグをポーリングする方法

 ●7.3 マスタCPUからスレーブCPUへの関数実行依頼

 

■8.IBM−PC(互換機含む)1台よるデバック方法

 1台のIBM−PC(互換機含む)でE7000 PC及びEVAボードを接続しでデュアルCPUの デバックを行う場合、次の2つ方法があります。

 ●8.1 IPIのみを使用した場合の設定と操作方法

 MS-WindowsのDOSプロンプトを2つ開き、それぞれのウインド上でIPIを動作させます。設定手順を 説明するにあたりマスタ側にE7000、スレーブ側にEVAボードを接続した想定で説明します。

接続例
使用ツール ソフト IBMインタフェースボード
マスタ側 E7000PCIPI.EXE D000:0000H IRQ11
スレーブ側EVAボード IPI.EXE D400:0000H IRQ12
★上記の設定は、その他の拡張ボードの設定とぶつからないことが前提です

 (1)PC I/F ボードの実装アドレス
 マスタ側PC I/Fボード(以下、マスタ側ボード)の実装アドレスとスレーブ側PCI/Fボード(以下、スレーブ側ボード) の実装アドレスを異なったアドレスに設定する必要があります。

接続例では、マスタ側=D000:0000H、スレーブ側=D400:0000H と設定しています。

 (2)CONFIG.SYS の設定
 CONFIG.SYSで仮想EMSメモリドライバを組み込んでいる場合、その設定変更を行う 必要があります。設定方法は「IBM−PCインタフェースユーザーズマニュアル/p6〜p7」を参照してください。
 接続例では、マスタ側ボードおよびスレーブ側ボードメモリアドレス範囲(D0000H〜D3FFFHおよびD4000H〜D7FFFH) を仮想EMSドライバの管理下に設定し、EMSのページフレームの基底アドレスをE0000Hに設定する場合は、

DEVICE=C:¥WINDOWS¥EMM386.EXE RAM /X=D000-D7FF FRAME=E000

 (3)SYSTEM.INIの設定
 マスタ側ボードおよびスレーブ側ボードメモリアドレス範囲(D0000H〜D3FFFHおよびD4000H〜D7FFFH)を MS-Windowsのメモリ管理下に設定するために SYSTEM.INI を変更します。

接続例では、
	   
	   [386Enh]
	     EMMExclude=D000-D7FF
     

 (4)環境変数の設定
 マスタ側ボードをスレーブ側ボードの使用する環境変数を設定します。あらがじめこの環境変数を AUTOEXEC.BAT に定義しておくと便利です。なお、環境変数にはマスタ側ボードとスレーブ側ボードの実装アドレスを 必ず設定してください。設定しないと2つのIPIが同時にマスタボードを使用することになります。

接続例では、
	   SET SYS1=C:¥SYS1,1B,D0  マスタ側IPIの環境変数→¥SYS1にE7000PCシステムを導入する必要あり
               				   
	   SET SYS2=C:¥SYS2,1B,D4  スレーブ側IPIの環境変数
     

注意:スレーブ側にもE7000を使用する場合は¥SYS2にE7000PCシステムプログラムを導入する必要があります。

 (5)IPIによるマスタ側とスレーブ側ボードの起動
マスタ側ボードの起動
 MS-WindowsのメイングループのDOSプロンプト起動後、以下のようにIPIを起動させてE7000PCと接続します。

C:¥>IPI SYS1(RET)

 E7000モニタメニューで「S」、または「R」を入力してE7000PCのシステムプログラムをロードします。 E7000PCのプロンプト「:」が表示されたら、スレーブ側ボードの起動を行います。

スレーブ側ボードの起動
 MS-WindowsのメイングループのDOSプロンプト起動後、以下のようにIPIを起動させてEVAボードと接続します。

C:¥>IPI SYS2(RET)

 EVAボードのプロンプト「:」が表示されたら、「●3.3 EVAボードの設定方法」の手順でEVAボードを起動させます。

 ●8.2 GUISHを使用した場合の設定と操作方法

 GUISH(グラフィカルユーザインタフェースソフトウェア)は2つ同時に起動することはできません。 一方をIPIという形では動作可能です。
以下にIPIとGUISHを同時実行する設定を記します。設定手順を説明するにあたり、マスタ側、スレーブ側ともにE7000PCで 接続したという想定で説明します。

 ■接続例
使用ツール使用ソフトIBMインタフェースボード(DSW)
アドレス(1〜5)割り込みレベル(6〜7)
マスタ 側 E7000PC GUISH.EXE D000:0000H IRQ11
スレーブ側 E7000PC IPI.EXE D400:0000H IRQ12
(上記の設定は、その他の拡張ボードとぶつからないことを前提としています。)

 (1)PC I/Fボードの実装アドレスの設定
GUISHで接続するPC I/Fの実装アドレスは、IPIで接続するPC I/Fボードの実装アドレス より上位に設定する必要があります。
接続例では、マスタ側でGUISHを使用しているため、スレーブ側の実装アドレス D400:0000H  より上位の  D000:0000H を設定しています。

 (2)CONFIG.SYS の設定
 CONFIG.SYSで仮想EMSメモリドライバを組み込んでいる場合、その設定変更を行う 必要があります。設定方法は「IBM−PCインタフェースユーザーズマニュアル/p6〜p7」を参照してください。
 接続例では、マスタ側ボードおよびスレーブ側ボードメモリアドレス範囲(D0000H〜D3FFFHおよびD4000H〜D7FFFH) を仮想EMSドライバの管理下に設定し、EMSのページフレームの基底アドレスをE0000Hに設定する場合は、

DEVICE=C:¥WINDOWS¥EMM386.EXE RAM /X=D000-D7FF FRAME=E000

 (3)SYSTEM.INIの設定
 マスタ側ボードおよびスレーブ側ボードメモリアドレス範囲(D0000H〜D3FFFHおよびD4000H〜D7FFFH)を MS-Windowsのメモリ管理下に設定するために SYSTEM.INI を変更します。

接続例では、
---------------------------------------------	   

[386Enh]
    EMMExclude=D000-D7FF

---------------------------------------------

 (4)環境変数の設定
 GUISH(マスタ側)とIPI(スレーブ側)の使用する環境変数を設定します。あらかじめ この環境変数は AUTOEXEC.BAT に定義しておくと便利です。なお、IPIが使用する環境変数には スレーブ側ボードとの実装アドレスを必ず設定してください。
設定しない場合、GUISHとIPIが同時にマスタ側ボードを使用してしまうことになります。

接続例では、以下のように設定しています。

---------------------------------------------

SET GUISHPATH=C:¥GUISH      GUISH環境変数
SET E7000SYS=C:¥SYS2,IB,D4  IPIの環境変数

---------------------------------------------

 (5)起動方法について

  1. マスタ側(GUISH)の起動
     MS-WindowsのGUISHグループのE7000PCアイコンをクリックします。
    GUISHが起動してE7000PCと接続します。
    GUISHのコマンドエリアにE7000モニタメニューが表示されますので、「S」、または「R」 を入力してE7000PCのシステムプログラムのローディングを行います。E7000PCのプロンプト の:が表示されたら、次にスレーブ側の起動を行います。

  2. スレーブ側(IPI)の起動
    MS-WindowsのメイングループのDOSプロンプト起動後、以下のようにIPIを起動させてE7000PCと接続します。

    ---------------------------------------------
    
    C:¥>IPI(RET)
    
    ---------------------------------------------
    

    E7000モニタメニューで、「S」、または「R」 を入力してE7000PCのシステムプログラムのローディングを行います。

以上
INDEX戻る(STN-28)
Copyright SEGA ENTERPRISES, LTD., 1997