Skip to content

Latest commit

 

History

History
146 lines (98 loc) · 8.3 KB

normal.md

File metadata and controls

146 lines (98 loc) · 8.3 KB

このモードは、2台のユニット間の通信に使用します。

転送速度は、256Kbps と 2Mbps が選択できますが、高速の2Mbpsは、GBAのリンクポートに直接接続される、つまりGBAと拡張ハードウェアの間にケーブルを介さないような特殊な拡張ハードウェアにのみ使用されます。

通常の場合は、安定した結果が得られる256Kbpsの転送速度を使用してください。

転送サイズは8bitと32bitがあり、8bitモードはDMG/CGBゲームボーイと同じですが、「GBAのカートリッジをGBAに装着した場合」と「DMG/CGBのカートリッジをDMG/CGB/GBAに装着した場合」では電圧が異なり、DMG/CGBのゲームとGBAのゲームは通信できません。

レジスタ

4000134h - RCNT (R) - モード選択レジスタ

SIOCNTのbit13-12と合わせて、転送モードを設定するのに利用します。

使われているのはbit15だけです。

ビット 内容
0-3 未定義 (current SC,SD,SI,SO state, as for General Purpose mode)
4-8 不使用 (常に0が望ましいが1を書き込むこともできる)
9-13 不使用 (常に0,読み取り専用)
14 不使用 (常に0が望ましいが1を書き込むこともできる)
15 0 (モードをノーマル/マルチプレイ/UARTにしたい場合)

4000128h - SIOCNT - SIO制御レジスタ (R/W)

ビット 内容
0 シフトクロック (0=外部クロック, 1=内部クロック)
1 内部シフトクロックの転送レート (0=256KHz, 1=2MHz)
2 SI (Serial Input) (0=Low, 1=High/None) --- (Read Only)
3 SO during inactivity (0=Low, 1=High) (applied ONLY when Bit7=0)
4-6 不使用 (常に0,読み取り専用)
7 スタートビット (0=Inactive/Ready, 1=Start/Active)
8-11 不使用 (常に0が望ましいが1を書き込むこともできる)
12 転送サイズ (0=8bit, 1=32bit)
13 0 (通常モードでは必ず0)
14 IRQビット(0=無効, 1=転送完了時にIRQをリクエスト)
15 不使用 (常に0,読み取り専用)

スタートビット(bit7)は、転送が完了すると自動的にリセットされます。

IRQビット(bit14)がセットされている場合、8bitまたは32bitすべての転送が完了すると、その時点でIRQが生成されます。

400012Ah - SIODATA8 - 通信データレジスタ8 (R/W)

転送サイズが8bitで、転送モードが通常モードのときのためのレジスタです。

8bitのデータが格納されています。(下位8bitのみ使用)

送信データは、転送を開始する前にこのレジスタに書き込む必要があります。

転送中、MSBからシフトアウトされたビットが送信され、同時にこのレジスタに受信したビットがシフトインされます。

転送が完了すると,このレジスタには受信した8bitの値が格納されます。

o7 o6 o5 o4 o3 o2 o1 o0
o6 o5 o4 o3 o2 o1 o0 i7
o5 o4 o3 o2 o1 o0 i7 i6
o4 o3 o2 o1 o0 i7 i6 i5
o3 o2 o1 o0 i7 i6 i5 i4
o2 o1 o0 i7 i6 i5 i4 i3
o1 o0 i7 i6 i5 i4 i3 i2
o0 i7 i6 i5 i4 i3 i2 i1
i7 i6 i5 i4 i3 i2 i1 i0

4000120h - SIODATA32_L - 通信データレジスタ32の下位16bit (R/W)

4000122h - SIODATA32_H - 通信データレジスタ32の上位16bit (R/W)

内容は大きさが32bitレジスタになった以外、SIODATA8と同じです。転送サイズが32bit用のときに使われます。

SIODATA32に書き込み始める前に、必ずSIOCNTとRCNTを32bitの通常転送モードに設定する必要があります。

初期化処理

  1. まず、RCNTレジスタを初期化します。

  2. 次に、スタートビット(SIOCNT.7)をクリアした状態で、SIOCNTのモード/クロックビットを設定します。

マスターの場合:内部クロック(SIOCNT.0=1)を選択し、転送レート(SIOCNT.1)として256KHzを指定します。
スレーブの場合:外部クロック(SIOCNT.0=0)を選択します。ローカルの転送レート(SIOCNT.1)の選択結果は無視され、転送レートはリモートのGBA(またはカスタム転送レートを供給する他のコンピュータ)から供給されます。
  1. 最後に、モード/クロックビットを変更せずに、SIOCNTのスタートビットをセットします。

スレーブ側(外部クロック側)が通信を行う際におすすめの手順

  1. マスター側に送る予定のデータを初期化
  2. スタートビットとSOをクリア
  3. スタートビットとSOをセット
  4. SOをクリアしてマスター側に転送準備ができたことを知らせる
  5. IRQが起きる、またはスタートビットが0になるのを待つ
  6. 受信したデータを処理する
  7. 送りたいデータがまだ存在する場合はこの手順を1から繰り返す

マスター側(内部クロック側)が通信を行う際におすすめの手順

  1. スレーブ側に送る予定のデータを初期化
  2. SI(SIOCNTのbit2)が0になる、つまりスレーブ側の準備が整うのを待つ(タイムアウトを設けることを推奨)
  3. スタートビットをセット
  4. IRQが起きる、またはスタートビットが0になるのを待つ
  5. 受信したデータを処理する
  6. 送りたいデータがまだ存在する場合はこの手順を1から繰り返す

通信ケーブルの転送プロトコル

転送がアクティブで無い場合には、シフトクロック(SC)はHighになります。送信(SO)と受信(SI)のデータ線は、上述のように手動で制御することができます。

マスターがSC=LOWを送ると、マスターとスレーブはそれぞれ次に送り出すデータビットをSOに出力しなければなりません。

マスターがSC=HIGHを送ると、各マスターとスレーブはSIから相手のデータビットを読み出す必要があります。これを8ビットまたは32ビットごとに繰り返し、完了するとSCは再びHighになります。

転送速度

SCは転送速度として、256KHz または 2MHz のどちらかを選択でき、1秒間に最大で32KB(256Kbit)または128KB(2Mbit)のデータを転送できます。ただし、8bitまたは32bitの転送データをソフトウェアで個別に処理する必要があるため、実際の転送速度はデータ単位の処理にかかる時間分だけ低下します。

GBA同士の通信など、ほとんどの場合は256KHzでないと安定した結果が得られません。2MHzは、特殊な拡張ハードウェア(配線が非常に短いもの)のみを想定しています。

マルチプレイケーブルを用いたノーマルモードでの単方向転送

マルチプレイケーブルでノーマルモードを使用する場合、通常のように最初のGBAと2番目のGBAの間でデータが交換されません。

その代わりに、リレーのようにGBA間をデータが移動していきます。

The first GBA receives zero, because master SI is shortcut to GND

この挙動は、マスターGBAから他のすべてのGBAへの一方向の高速データ転送に使用できます。例えばGBAが3つ繋がっている場合は次のようにデータが転送されます。

  Step         Sender      1st Recipient   2nd Recipient
  Transfer 1:  DATA #0 --> UNDEF      -->  UNDEF     -->
  Transfer 2:  DATA #1 --> DATA #0    -->  UNDEF     -->
  Transfer 3:  DATA #2 --> DATA #1    -->  DATA #0   -->
  Transfer 4:  DATA #3 --> DATA #2    -->  DATA #1   -->

受信者は自分のデータを送信しようとしてはいけません。次の転送時に前に受信したデータを次の受信者に転送してください。受信したデータをデータレジスタに変更せずに残しておくだけです

遅延転送のため、2番目の受信者は最初の受信データ(上の例ではTransfer 1のUNDEF)を無視する必要があります。

最後の転送の後、送信者は1つ(または複数)のダミーデータユニットを送信し、最後のデータ(上の例ではTransfer 3のDATA #3)が2番目(またはそれ以降)の受信者に転送されるようにしなければなりません。