LoginSignup
2
4

More than 3 years have passed since last update.

FPGAで68000を作ってCPM/68Kを動かす(メモリ16MB)

Last updated at Posted at 2021-05-18

目的

 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が起動する。
  ※機能追加版ではシステムディスクは圧縮しているので、予め解凍しておく事。
Image38-1.jpg

シミュレータとモニタ

 開発に当たり、モニタは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を起動して、パソコンからコピペで流し込んだ。
Image38-3.jpg
 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)
Image38-2.jpg

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からブートする。
Image38-3.jpg
 シミュレータの画面に見えるかも知れないが、実機の起動画面。

 起動しなかった場合、
 リセット起動時の状態を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を復活出来ました。
 やはり万歳と言っておこう。
 当然ですが、上記記載内容は全て無保証であり、各自の責任においてご利用願います。

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4