Featured image of post V53 VMEシステムで遊ぶ #20 SIOボードとCPUボードを連携する

V53 VMEシステムで遊ぶ #20 SIOボードとCPUボードを連携する

前回は、V53搭載のSIOボードに簡易モニタを実装しプログラムの実行ができる環境になりました。今回は本格的なモニタを実装し、SIOボードとCPUボードがどのように連携しているのかを探ります。

V53 RAMモニタの実装

ROMに書き込んだモニタはプログラムをロードして実行する機能しかありません。それ以上の機能はRAMモニタに実装して自在に修正ができるようにします。ここではCPUボードの解析に使用したV53 RAMモニタを移植しました。

割り込み機能はまだ細かい仕様がわからないためわかっている範囲で実装しました。

IOスキャンをする

とりあえず動作するようになったRAMモニタで、I/Oスキャンを実行したところ、想定通りの結果になりました。

> s 0000 ffff
Scanning I/O (Press any key to abort)...
  :
0080: 00   ???
  :
00A0: 66   MPSC?
00A2: 00
00A4: 00
00A6: 04
00A8: 00
00AA: 04
00AC: 00
00AE: 04
  :
00C0: 00   ICU?
00C2: 00
00C4: 00
00C6: 00
  :
00D0: C0   TCU?
00D2: 27
00D4: 88
00D6: 88
  :

まとめると以下のようになります。

IOアドレス名称役割・機能詳細
0080h詳細不明読み込みで0が返ってくる。ファームウェアでは0を書き込み初期化している
0082h詳細不明ファームウェアでは0を書き込み初期化している
0086h詳細不明ファームウェアでは0を書き込み初期化している
00A0hMPSC #1 Data AJ1コネクタ。RS232C設定
00A2hMPSC #1 Cmd/Stat A同上
00A4hMPSC #1 Data BJ2コネクタ。コネクタジャンパ未設定
00A6hMPSC #1 Cmd/Stat B同上
00A8hMPSC #2 Data AJ3コネクタ。RS232C設定
00AAhMPSC #2 Cmd/Stat A同上
00AChMPSC #2 Data BJ4コネクタ。コネクタジャンパ未設定
00AEhMPSC #2 Cmd/Stat B同上
00C0hV53 ICU REG0READ:IRQ/IIS/IPOL, WRITE:IIW1/IPFW,IMDW
00C2hV53 ICU REG1READ/WRITE:IMKW, WRITE:IIW2/IIW3/IIW4
00D0hV53 TCU TM0_CNTTimer 0 Counter (TOUT0 100.00Hz)
00D2hV53 TCU TM1_CNTTimer 1 Counter
00D4hV53 TCU TM2_CNTTimer 2 Counter
00D6hV53 TCU TM_CTLTimer Control
FF00h-FFFFhV53 内部レジスタ

0x0080~0x0086のI/Oの機能は良くわかりませんが、それ以外のI/Oアドレスはこれで確定と思われます。

4ポートシリアルを制御する

ここで4つのシリアルポートで遊んでみます。テストプログラムを作ってみました。

実行するとSIOボードのTXランプが順に点灯します。これで4つのシリアルポートのI/Oアドレスが正しいことが確認できました。

正体不明のIOポートを探る

気になるのは0x0080~0x0086のI/Oです。これまでの調査で、CPUボード側からみるとこのSIOボードはIOアドレス0x1300として見えるようです。これと何等かの関連があるように思われます。

そこで双方のボードのRAMモニタからIコマンド、Oコマンドで操作してみたところ以下のような結果となりました。

CPUボードから書き込んだ結果

CPU側 O コマンド実行SIO側 I 0080の結果その他の変化
O 1300 0000
O 1300 0101
O 1300 0202
O 1300 0404
O 1300 0808
O 1300 1010
O 1300 2020
O 1300 4000
O 1300 8080SIOボード BUSY LED点灯

SIOボード側から書き込んだ結果

SIO側 O コマンド実行CPU側 I 1300の結果その他の変化
O 0080 0000
O 0080 0101
O 0080 0202
O 0080 0404
O 0080 0808
O 0080 1010
O 0080 2020
O 0080 4000
O 0080 8000

確定ではありませんが、以下の図のような仕様ではないかと思われます。

外部ボード通信用レジスタ

  • レジスタA-レジスタBのD0~D5は書き込んだ値がそのまま見える
  • レジスタAのD7はSIOボードのBUSY LEDのON/OFFに対応
  • レジスタAのD6はREADで常に0に見える。未使用?
  • レジスタBのD7,D6はREADで常に0に見える。未使用?

CPUボードと連携してみる

この通信用とおもわれるレジスタを使いマスタCPUボードとスレーブSIOボードが連携するサンプルプログラムを作成しました。 シーケンス図は以下の通りです。

  %%{init: {'theme': 'dark'}}%%
sequenceDiagram
    participant Master
    participant Slave
    
    Master->>+Slave: LED点灯 + 処理要求(IO 0x1300に0x81をセット)
    Slave-->>-Master: 処理完了を報告 (IO 0x0080に0x01をセット)
    Master->>+Slave: LED消灯 + 処理完了確認(IO 0x1300に0x00をセット)
    Slave-->>-Master: 確認完了を報告 (IO 0x0080に0x00をセット)        

実際のデータは共有メモリでやり取りできるので、そのタイミングを通知する処理を想定しました。

サンプルプログラムは以下に置きました。

実際に動かすと以下の動画のようになりました。

あくまでも推測ですが、このような使いかたなのかなと思われます。ただし、0x82、0x86の使いかたはまだ不明です。

まとめ

今回は強化されたRAMモニタで他のVMEボードからどのようにSIOボードが見えるのかを探ってみました。実験中にVMEバスの割り込みが発生しないかと期待したのですが、SIOボードではVMEバスの割り込み端子は使われていないようで割り込みが発生することはありませんでした。その代わりにマスタCPUとの通信用に使われていると思われるレジスタの機能の一部が判明しました。

次は内部の割り込みを調査してみます。4つのシリアル通信ポートがあるので、必ず割り込みを使っているはずです。シリアル通信で発生する割り込みの仕組みが判明すればELKSの移植への道が開けます。

Hugo で構築されています。
テーマ StackJimmy によって設計されています。