#目的
FLEXとOS-9の動作により、8ビットMPUのOSは制覇した(つもり)。
次は16ビットと言う事で、当然ターゲットは68000。
MacPlusで制覇済みじゃないかと、ごく一部から突っ込みが有りそうですが。
アレはハードの載せ替えのみだったので。
68000のOSと言っても、リアルタイム系ならそこそこあるが、所詮、難しい事は出来そうも無い。
◆◆◆ そうだ、68000を作ってCP/M-68Kを動かそう ◆◆◆
これなら何とかなるだろう。
#経緯
CP/M-68Kは、8080系列では著名なCPMの68000バージョン。
BIOSと呼称されるソフトに、ハード特有部分としてシリアル入出力とディスクI/Oを追加すれば動作するように出来ている。
更に、開発中に開発中に気が付いたが、移行システムまで付属している。(先に気が付けよ○○)
※移行システムがシステムに付属の物なのか、元ネタ作者の物なのかは不明。
従って、CPM/68K上のエディタでBIOSを作成すれば、ブート可能なOSディスクが出来上がるって寸法。
そのCP/M-68Kが無いからダメじゃんって。うまく出来てんだなこれが。
世の中にはCP/M-68Kが動作するシミュレーターを作っている方がいらっしゃる。
このシミュレーター上でBIOSを開発すればOSディスクが作成可能。
BIOSの開発って言っても、見本が有るのでハードに合わせてちょこっと改造すればOK。
このOSディスクをFPGAの68000で動作させれば、晴れてCP/M-68Kの完成。
そして最大の難関は、68Kのディスクアクセスが128Byte/sectorだって事。
SDカードは512Byte/sectorだから、何らかの変換が必要。
そこで、BIOSの動作確認用としてモニタを作成する、モニタのメイン部分をCで記述するという暴挙。
なんせアセンブラなんてのは、記憶のかなたに霞んでるもんね。
※ただ、開発環境の立ち上げを管変えると、効果はちと微妙。
モニタからのディスクアクセスが上手く行ったら、BIOSに組み込む。
更に、組み込んだBIOSの動作を確認する為に、シミュレータにSDカードI/Fを用意する。
これにより、デバッグの大部分は機能の豊富なパソコン上で行えるって訳。
※但し、シミュレータのデバッグが新たに必要となる。
#シミュレーター
「PICマイコンは面白い」に書かれているCP/M-68K Simulatorが良さげだが、既にリンク切れを起こしているので下記からダウンロード。
◇ Musashi
◇ CP/M-68K Simulator
※Musashiはgame用として開発されたらしい。
※CP/M-68K Simulatorはシステムディスク(Ver1.2)を含め、起動に必要なものが全て入っている。
インストールは上記ブログを参照すればいいといっても、同一ディレクトリに解凍するだけ。
ファイルがダブっているのでSimulatorのファイルで上書き。
インストール、実行にはにはLinux環境が必要。
※Windows10上にUbuntuを入れた。
※頑張ればMingwでも出来るらしい。
手順通りにやれば68Kが起動する。
しかしこれではデバックができないので、モニタ機能を追加した。
◇ CPM68Kモニタ機能追加版
モニタ機能追加版では入力待ちで停止しているので、'G'+Entで68Kが起動する。
※機能追加版ではシステムディスクは圧縮しているので、予め解凍しておく事。
#シミュレータとモニタ
開発に当たり、モニタは2種類作成した。
1.シミュレータの一部として動作するDOS上のシミュモニタ。
2.68000実機上で動作する実機モニタ。
※勿論、実機モニタをシミュモニタ上で動かすことも可能だろう。
※機能を統一すべき所深く考えなかったので、コマンドが似て非なるものになっているのはご愛敬。
ここで機能を説明するモニタはシミュモニタです。
シミュレータを起動すると、ブートストラップをロードした時点でプロンプト('>')を表示し停止する。
'G'+EntでCPM68Kが起動する。
CPM68K動作中に'ESC'を押す事よりモニタに戻る、再度'G'+Entでモニタから抜ける。
モニタはメモリ配置を鑑み、$FF4000 - $FF7FFFに定位している。
モニタのワークは、$FF8000 - $FFBFFFとなっている。
モニタのコマンドを下記に示す。
R 全レジスタの表示
RAn hhhh Anレジスタをhhhhに変更
RBn hhhh Dnレジスタをhhhhに変更
RP hhhh PCをhhhhに変更
RR CPUをリセット
M hhhh メモリhhhhを表示し、変更(1Byte単位)可能とする。
MW hhhh メモリhhhhを表示し、変更(2Byte単位)可能とする。
: dd 該当番地をddに変更する。
: . メモリモードを終了
D hhhh 指定(hhhh)番地から128バイトを表示する。
Q モニタを終了
A hhhh 指定(PC)番地からhhhh回、逆アセンブラを実行する。
G 指定(PC)番地か実行。
G hhhh 指定(hhhh)番地から実行。
N 現在のPC番地から1ステップ実行。
N hhhh 現在のPC番地から、hhhhステップ実行。
N,aaaa 現在のPC番地から、aaaa番地迄実行。
#シミュレータとディスクI/O
シミュレータは元々ディスクI/Oを有しているが128Byte/Setorが前提なので、実機と同様な512Byte/Sectorで動作するディスクI/Oを追加。
※元のI/Oも残しているので、どちらからのアクセスでも動作する。
アドレスレジスタにセクタ番号(512Byte/Sector)、コマンドレジスタにR(1)/W(2)を書込むと実行。
実行中はコマンドレジスタが$01になり、完了で$00になる。
データはデータバッファに対しR/Wを行う。
$FF0100 コマンドレジスタ
$FF0102 - $FF0107 アドレスレジスタ
$FF0200 - $FF03FF データバッファ
#BIOSの作成
CP/M-68Kを実機にフィッテングするには、BIOSの移行が必要である。
又同時にBOOTプログラムも移行が必要となる。
下記のプログラムの変更が必要となる。
1.simbios.s BIOSで使用。
2.ldrbios.s BOOTで使用。
何れもCP/M-68Kディスクの'user 5'に存在するので、これをEMACS等で編集する。
※当方はEDを起動して、パソコンからコピペで流し込んだ。
CPM.SYSの更進は'MAKECPM'を起動すれば、'user 5'のCPM.SYSが更新される。
エラーが無ければ'CPCPM'を起動すれば、ディスクが更新される。※これは自作して追加。
ブートローダーの更新は'MAKELDR'の起動で行われる。
※こちらは直接ディスクを書き換えるので要注意。
いずれにせよ、正常に起動できない場合は、ディスク(ファイル)を元に戻せは回復できる。
#FPGAハード
ハードはおなじみののEP2C5基板に、SDRAMとSDカードを拡張している。
※但し、メモリが窮屈でSignalTapが使い難い、デバッグはもう少し大きいFPGAがやり易いだろう。
メモリの制約でモニタROMは4KBに縮めた。
SDRAM(W9825G6KH 32MB)を使用しているので、68000のメモリとしては十分。
◇ FPGAハード
※いつもの通り、EAGLEで設計しCNCでパターン作成。
※ジャンパ線が見えるが、本当は0Ω抵抗を付ける部分。
通信用として、USBシリアルが必要。(通信速度は115200bps)
#FPGAソフト
ソフトと言うか、68000は'j68_cpu'なんてのを使用。
こじんまりしているが遅いと書かれている。※動かすと確かに遅く感じるな。
動作クロックの1/3の性能になるので、50MHzで動作させて16MHzの68000相当になる。
但し、使用LUTは2000LUT程度と、EP2C5でも十分お釣りが来る。
◇ j68本家
◇ EP2C5改造版
EP2C5は旧世代のCyclone II であり、quartus 13.0sp1以前でないとコンパイルできないので要注意。
'VUBUG'というモニタが付いており、ハードチェックに活用できるが、アドレス範囲が64KBであり、68Kのデバックには役不足。
またTrace機能が動作して無いように思われる。
※当方の利用方法が誤っているかもしれない。
#システムメモリ
システムメモリはDRAM(SDRAM)が一個で32MBの大容量
※個人の感覚です。
※そういえば、2MBのDRAMボードをウン十万円で購入したのを思い出した。
メインメモリとして16MB使用しており、残りは放置。※キャッシュにすべきだろうな。
クロックは125MHz駆動、但し8クロックに1回のアクセスなので、実質は15.6MHzとなる。
MPUからのアクセスには同期していないので、さらに遅いだろう。
#実機モニタ
二つ目のモニタ。
手抜き作成をする為に、モニタはCで書いたが、当然コンパイラが必要となる。
コンパイラは、sozobon2を利用。
◇ SOZOBON
※From the old ATARI ST days, is Sozobon 2.0 the 68000 compiler.なんて書いてる。
mon68kのフォルダをsozobon2のexamplesディレクトリ下に格納すればコンパイル可能になる。
◇ MON68K
少し足りないものが有るので、sozobonのbinディレクトリ下に下記Toolの中身を追加。
◇ Tool
mon68kのフォルダでコマンドプロンプトを起動して、'make'一発でmon68kh.hexが出来上がるので、
verilog/rtlの中にコピーしてから、コンパイルを実行する。
※モニタは$FF4000番地からなのに、コンパイル結果は0番地から出来てる。
後ろの方だけを抽出して使っている。
モニタのコマンドとして、BO,D,F,G,H,M,MW,R等が有るが動作の詳細はプログラムを見てくれ。
※N,Vは動作しないからね。
#起動とデバッグ
予めSDカードに'diskc.cpm.fs'をwin32diskimager等で書き込んでおく。
リセットによりmon68kが動作する。 ここで、'BO'+Entの入力により、SDからブートする。
シミュレータの画面に見えるかも知れないが、実機の起動画面。
起動しなかった場合、
リセット起動時の状態をSignalTapで見れば取り合えずの原因が判るだろう。
SDRAMが不動作の場合は、モニタからの確認は難しい。
動作確認用の回路をFPGAに別途焼きこんで確認する方が早いだろう。
※作成した基板も最初は動作しなかったので、1BitずつON/OFFさせて、
RAMのピンに信号が来ている事をSignalで確認。半田ブリッジを発見した。
モニタのシリアル入出力とCP/M-68Kは同一なので、モニタが動けばシリアルは動く筈。
SDカードは、モニタからコマンドを発行して、挙動を確認する。
※この時、各レジスタがワード(2Byte)アクセスな事に注意。'MW FF0100'のように操作。
#ディスクドライブ
SDカード上の下記セクター(512Byte/Sector)にドライブを確保している。
8000 - 87FF ドライブA
8800 - 8FFF ドライブB
0000 - 7FFF ドライブC (diskc.cpm.fs)
ドライブCは'diskc.cpm.fs'により初期されて居るが、A,Bは初期化が必要。
#注意事項
現状はシミュレータと実機で挙動が異なる部分が存在します。
具体的には'ED.68K'が実機では動作しない。
※他にも有るかも知れない。
※ディスクアクセスに差異は認められなかった。
しかし、コンパイラやEMACS等が正常に動作しているので、致命的では無いと考え、これ以上の原因追及はせずに公開しています。
※実機ではドライブA,Bも有効にしており、この辺がシミュレータと異なる。
※気が向いたら原因追及を再開するかもしれない。
#総括
68000は昔使った事の有る、思い入れのあるMPUです。
先人の資料を使う事により、其れなりの手間だけでCP/M-68Kを復活出来ました。
やはり万歳と言っておこう。
当然ですが、上記記載内容は全て無保証であり、各自の責任においてご利用願います。