tunozemichanの日記 / tunozemichan's diary

SORD社のコンピューターM68やM68MXの解析についての備忘録です。This blog is a memorandum about the analysis of SORD's computers M68 and M68MX.

SORD M68MXのBIOSを読む(まとめ その1)

私はSORD M68MXのソフトウェアを何も持っていません。以前、facebookのコミュニティを介していただいたSORD M68用のCP/M-68Kはハードウェア構成が全く違うために、当然ながら動きませんでした。

折角手に入れた希少なマシンなのに起動画面しか見られないのは残念です。そこで、M68MXのBIOSを調べて、なんとかしてCP/M-68Kを動かすことを目標としました。

 

M68MXは上下2枚の基板から構成されています。BIOSは下の基板にODDとEVENの二つのROMに分かれて実装されています。

f:id:tunozemichan:20210531150053j:plain

SORD M68MXのBIOS(ODDとEVENに分かれて実装されている)

このROMを取り外して、ROMライターで内部のデータを読み取ります。これでODDとEVENのROMバイナリが手に入りました。

次にこれを正しく並べ替えて一つのバイナリファイルに統合します。私はWinHexを用いました。何でも構わないと思います。

統合されたバイナリファイルをここではBIOS.BINと呼ぶことにします。これを逆アセンブラにかけて解析します。とりあえず、radare2を使いましたが、ghidraに出会い、今はこちらをメインに使っています。ghidraはマルチプラットフォーム対応で、しかも無料です。radare2とは設計思想が異なっていて、マウスを使った現代的な操作が特徴です。気になる個所をマウスオーバーすると参照個所を簡易的に表示してくれるなど、痒い所に手が届く設計になっています。おすすめです。

 

以後、バイナリ解析初心者向けである私なりのやりかたについて書きます。

以下のような手順で解析しました。

 

1.良い逆アセンブラリバースエンジニアリング・ツールを用意する。これはghidraが第一選択だと思います。対応チップがあればdasmも捨てがたいです。radare2は習得が難しいです。

 

2.対象CPUのリセットエントリーポイントを調べる。m68kでは、先頭0x0にスタック、0x4にリセットベクター(リセットしたときに実行開始するアドレス)が書かれています。

 

3.基板を眺めて、CRTコントローラー(M68MXではHD46505SP)やシリアル通信に使われるACIA(MC6850かHD6850)を調べておきます。M68MXではこの他に、DMAコントローラー(uPD8257C)、フロッピーディスクコントローラー(uPD765AC)、リアルタイムクロック(RTC58321S)、プログラマブルタイムモジュール(HD6840P)あたりが見えました。

 

4.一番簡単でかつ重要なACIAの初期化プロセスを調べて、逆アセンブルコードの中からその部分を探し出します。6850の場合、コントロールレジスタに対して、マスターリセット(0x3)を書き、続けてプロトコルを書き込みます。プロトコルの選択肢が多いように見えますが、7bitやストップビットを2bitで通信することはまずありませんので除外できます。

こうして枝刈りしていき、初期設定コードを探しましょう。M68MXではプロトコルは8bit, no parity, stop bit 1で、通信速度は送受信用入力クロックの1/16。このクロックの周波数は既にオシロで観測済み(過去ブログ記事にあります)で、76.9kHzでした。これを16で割った値が通信速度になるので、4800bpsが通信速度ということがわかります。

コントロールレジスタがわかると、その次のアドレスがデータレジスタです。これにより芋づる式に、1文字送受信、連続送信などのサブルーチンがわかります。

 

5.フロッピーディスクを持つ大抵のコンピューターは、最初のブートトラックを読み込んで、そこから起動します。なので、BIOSの中でフロッピーディスクコントローラー(FDC)を必ず初期化しています。M68MXのFDCはuPD765ACです。このFDCは初期化としてSPECIFYコマンドを必要とします。そのコマンドは0x3を先頭とした合計3バイトの命令です。後ろ2バイトは場合の数が大きく、探すのは大変です。ただこの3バイトは並んでいるので、データになっている領域に注意しながらコードを先頭から眺めていけば見つかります。この探索により、FDCのステータスレジスタとデータレジスタが分かりました。ただ現在、トラックリードなどは見つかっていません。原理上はあるはずですが…。

 

6.わからなくても構わないのですが、CRTコントローラー(CRTC)のコードも探しました。これは真正面から探すよりも、バイナリファイル内の文字配列情報から探す方が早いです。M68MXは富士通製の漢字ROMを搭載していて、起動時に「フロッピーディスクをセットしてください。」と日本語で画面に表示されます。この文字を定義している場所をまず探します。富士通の漢字ROMの文字はJISコードですので、当該コードを探すのは難しくありません。そこから辿っていくと、CRTCで文字を表示するサブルーチンが見つかります。

 

こんな感じで徐々にM68MXの機能を明らかにしていきます。とはいえ、ACIAとFDC周りが判明すれば、かなりCP/M-68Kの起動に近づいたと思います。RAMのマッピングがほとんど分かっていないですが、実機上でメモリテストコードを実行して調べたいと思います。