ＦＰＧＡで６８０００を作ってＣＰＭ／６８Ｋを動かす（メモリ１６ＭＢ）

#目的
　ＦＬＥＸとＯＳ－９の動作により、８ビットＭＰＵのＯＳは制覇した（つもり）。
　次は１６ビットと言う事で、当然ターゲットは６８０００。
　MacPlusで制覇済みじゃないかと、ごく一部から突っ込みが有りそうですが。
　アレはハードの載せ替えのみだったので。
　６８０００のＯＳと言っても、リアルタイム系ならそこそこあるが、所詮、難しい事は出来そうも無い。
　◆◆◆　そうだ、６８０００を作ってＣＰ／Ｍ－６８Ｋを動かそう　◆◆◆
　これなら何とかなるだろう。

#経緯
　ＣＰ／Ｍ－６８Ｋは、８０８０系列では著名なＣＰＭの６８０００バージョン。
　ＢＩＯＳと呼称されるソフトに、ハード特有部分としてシリアル入出力とディスクＩ／Ｏを追加すれば動作するように出来ている。
　更に、開発中に開発中に気が付いたが、移行システムまで付属している。（先に気が付けよ○○）
　　※移行システムがシステムに付属の物なのか、元ネタ作者の物なのかは不明。
　従って、ＣＰＭ／６８Ｋ上のエディタでＢＩＯＳを作成すれば、ブート可能なＯＳディスクが出来上がるって寸法。

　そのＣＰ／Ｍ－６８Ｋが無いからダメじゃんって。うまく出来てんだなこれが。
　世の中にはＣＰ／Ｍ－６８Ｋが動作するシミュレーターを作っている方がいらっしゃる。
　このシミュレーター上でＢＩＯＳを開発すればＯＳディスクが作成可能。
　ＢＩＯＳの開発って言っても、見本が有るのでハードに合わせてちょこっと改造すればＯＫ。
　このＯＳディスクをＦＰＧＡの６８０００で動作させれば、晴れてＣＰ／Ｍ－６８Ｋの完成。
　
　そして最大の難関は、６８Ｋのディスクアクセスが128Byte/sectorだって事。
　SDカードは512Byte/sectorだから、何らかの変換が必要。
　そこで、ＢＩＯＳの動作確認用としてモニタを作成する、モニタのメイン部分をＣで記述するという暴挙。
　なんせアセンブラなんてのは、記憶のかなたに霞んでるもんね。
　　※ただ、開発環境の立ち上げを管変えると、効果はちと微妙。
　モニタからのディスクアクセスが上手く行ったら、ＢＩＯＳに組み込む。
　更に、組み込んだＢＩＯＳの動作を確認する為に、シミュレータにSDカードI/Fを用意する。
　これにより、デバッグの大部分は機能の豊富なパソコン上で行えるって訳。
　　※但し、シミュレータのデバッグが新たに必要となる。

#シミュレーター
　「[ＰＩＣマイコンは面白い](https://piclabo.blog.ss-blog.jp/2018-07-22)」に書かれているCP/M-68K Simulatorが良さげだが、既にリンク切れを起こしているので下記からダウンロード。
　　◇ [Musashi](https://github.com/kstenerud/Musashi)
　　◇ [CP/M-68K Simulator](http://davesrocketworks.com/electronics/cpm68/simulator.html)
　　　※Musashiはgame用として開発されたらしい。
　　　※CP/M-68K Simulatorはシステムディスク(Ver1.2)を含め、起動に必要なものが全て入っている。
　インストールは上記ブログを参照すればいいといっても、同一ディレクトリに解凍するだけ。
　ファイルがダブっているのでSimulatorのファイルで上書き。
　インストール、実行にはにはＬｉｎｕｘ環境が必要。
　　※Windows10上にUbuntuを入れた。
　　※頑張ればMingwでも出来るらしい。
　手順通りにやれば６８Ｋが起動する。
　しかしこれではデバックができないので、モニタ機能を追加した。
　　◇ [ＣＰＭ６８Ｋモニタ機能追加版](https://github.com/hi631/FPGA_CPM68K/tree/master/sim68k)
　モニタ機能追加版では入力待ちで停止しているので、'G'+Entで６８Ｋが起動する。
　　※機能追加版ではシステムディスクは圧縮しているので、予め解凍しておく事。
![Image38-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/e5e0d739-65a3-2cab-5e5b-7f7a874ebad7.jpeg)

#シミュレータとモニタ
　開発に当たり、モニタは２種類作成した。
　　1.シミュレータの一部として動作するDOS上のシミュモニタ。
　　2.６８０００実機上で動作する実機モニタ。
　　　※勿論、実機モニタをシミュモニタ上で動かすことも可能だろう。
　　　※機能を統一すべき所深く考えなかったので、コマンドが似て非なるものになっているのはご愛敬。
　ここで機能を説明するモニタはシミュモニタです。

　シミュレータを起動すると、ブートストラップをロードした時点でプロンプト('>')を表示し停止する。
　'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番地迄実行。

#シミュレータとディスクＩ／Ｏ
　シミュレータは元々ディスクＩ／Ｏを有しているが128Byte/Setorが前提なので、実機と同様な512Byte/Sectorで動作するディスクＩ／Ｏを追加。
　　※元のＩ／Ｏも残しているので、どちらからのアクセスでも動作する。
　アドレスレジスタにセクタ番号(512Byte/Sector)、コマンドレジスタにR(1)/W(2)を書込むと実行。
　実行中はコマンドレジスタが$01になり、完了で$00になる。
　データはデータバッファに対しR/Wを行う。
　$FF0100　コマンドレジスタ
　$FF0102 - $FF0107　アドレスレジスタ
　$FF0200 - $FF03FF　データバッファ

#ＢＩＯＳの作成
　ＣＰ／Ｍ－６８Ｋを実機にフィッテングするには、ＢＩＯＳの移行が必要である。
　又同時にＢＯＯＴプログラムも移行が必要となる。
　下記のプログラムの変更が必要となる。
　　1.simbios.s　ＢＩＯＳで使用。
　　2.ldrbios.s　ＢＯＯＴで使用。
　何れもCP/M-68Kディスクの'user 5'に存在するので、これをEMACS等で編集する。
　　※当方はEDを起動して、パソコンからコピペで流し込んだ。
![Image38-3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/88656edb-b58b-0d43-7c22-bd642fa39c24.jpeg)
　CPM.SYSの更進は'MAKECPM'を起動すれば、'user 5'のCPM.SYSが更新される。
　エラーが無ければ'CPCPM'を起動すれば、ディスクが更新される。※これは自作して追加。
　ブートローダーの更新は'MAKELDR'の起動で行われる。
　　※こちらは直接ディスクを書き換えるので要注意。
　いずれにせよ、正常に起動できない場合は、ディスク(ファイル)を元に戻せは回復できる。

#ＦＰＧＡハード
　ハードはおなじみののEP2C5基板に、SDRAMとSDカードを拡張している。
　　※但し、メモリが窮屈でSignalTapが使い難い、デバッグはもう少し大きいFPGAがやり易いだろう。
　　　メモリの制約でモニタROMは4KBに縮めた。
　SDRAM(W9825G6KH 32MB)を使用しているので、６８０００のメモリとしては十分。
　　◇ [ＦＰＧＡハード](https://github.com/hi631/FPGA_CPM68K/tree/master/eagle)
  　　※いつもの通り、EAGLEで設計しCNCでパターン作成。　
　　　※ジャンパ線が見えるが、本当は０Ω抵抗を付ける部分。
　通信用として、USBシリアルが必要。(通信速度は115200bps)
![Image38-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/3548c631-7f1e-8d33-0fcb-e0a2a7792db9.jpeg)

#ＦＰＧＡソフト
　ソフトと言うか、68000は'j68_cpu'なんてのを使用。
　こじんまりしているが遅いと書かれている。※動かすと確かに遅く感じるな。
　動作クロックの1/3の性能になるので、50MHzで動作させて16MHzの68000相当になる。
　但し、使用LUTは2000LUT程度と、EP2C5でも十分お釣りが来る。
　　◇ [ｊ６８本家](https://github.com/fredrequin/j68_cpu)
　　◇ [EP2C5改造版](https://github.com/hi631/FPGA_CPM68K/tree/master/verilog)
　EP2C5は旧世代のCyclone II であり、quartus 13.0sp1以前でないとコンパイルできないので要注意。
　'VUBUG'というモニタが付いており、ハードチェックに活用できるが、アドレス範囲が64KBであり、６８Ｋのデバックには役不足。
　またTrace機能が動作して無いように思われる。
　　※当方の利用方法が誤っているかもしれない。

#システムメモリ
　システムメモリはDRAM(SDRAM)が一個で３２ＭＢの大容量
　　※個人の感覚です。
　　※そういえば、２ＭＢのＤＲＡＭボードをウン十万円で購入したのを思い出した。
　メインメモリとして１６ＭＢ使用しており、残りは放置。※キャッシュにすべきだろうな。
　クロックは125MHz駆動、但し８クロックに１回のアクセスなので、実質は15.6MHzとなる。
　MPUからのアクセスには同期していないので、さらに遅いだろう。

#実機モニタ
　二つ目のモニタ。
　手抜き作成をする為に、モニタはＣで書いたが、当然コンパイラが必要となる。
　コンパイラは、sozobon2を利用。
　　◇ [ＳＯＺＯＢＯＮ](https://sourceforge.net/projects/sozobon/)
　　※From the old ATARI ST days, is Sozobon 2.0 the 68000 compiler.なんて書いてる。
　mon68kのフォルダをsozobon2のexamplesディレクトリ下に格納すればコンパイル可能になる。
　　◇ [ＭＯＮ６８Ｋ](https://github.com/hi631/FPGA_CPM68K/tree/master/mon68k)
　少し足りないものが有るので、sozobonのbinディレクトリ下に下記Ｔｏｏｌの中身を追加。
　　◇ [Ｔｏｏｌ](https://github.com/hi631/FPGA_CPM68K/tree/master/tool)
  mon68kのフォルダでコマンドプロンプトを起動して、'make'一発でmon68kh.hexが出来上がるので、
　verilog/rtlの中にコピーしてから、コンパイルを実行する。
　　※モニタは$FF4000番地からなのに、コンパイル結果は0番地から出来てる。
　　　後ろの方だけを抽出して使っている。
　モニタのコマンドとして、BO,D,F,G,H,M,MW,R等が有るが動作の詳細はプログラムを見てくれ。
　　※N,Vは動作しないからね。

#起動とデバッグ
　予めＳＤカードに'diskc.cpm.fs'をwin32diskimager等で書き込んでおく。
　リセットによりmon68kが動作する。　ここで、'BO'+Entの入力により、ＳＤからブートする。
![Image38-3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/b04f52cc-b33d-5777-da1e-7bb414ec6a1e.jpeg)
　シミュレータの画面に見えるかも知れないが、実機の起動画面。

　起動しなかった場合、
　リセット起動時の状態をSignalTapで見れば取り合えずの原因が判るだろう。
　SDRAMが不動作の場合は、モニタからの確認は難しい。
　動作確認用の回路をFPGAに別途焼きこんで確認する方が早いだろう。
　　※作成した基板も最初は動作しなかったので、1BitずつON/OFFさせて、
    　RAMのピンに信号が来ている事をSignalで確認。半田ブリッジを発見した。
　モニタのシリアル入出力とＣＰ／Ｍ－６８Ｋは同一なので、モニタが動けばシリアルは動く筈。
　ＳＤカードは、モニタからコマンドを発行して、挙動を確認する。
　　※この時、各レジスタがワード(2Byte)アクセスな事に注意。'MW FF0100'のように操作。

#ディスクドライブ
　ＳＤカード上の下記セクター(512Byte/Sector)にドライブを確保している。
　　8000 - 87FF ドライブＡ
　　8800 - 8FFF ドライブＢ
　　0000 - 7FFF ドライブＣ　(diskc.cpm.fs)
　ドライブＣは'diskc.cpm.fs'により初期されて居るが、Ａ，Ｂは初期化が必要。

#注意事項
　現状はシミュレータと実機で挙動が異なる部分が存在します。
　具体的には'ED.68K'が実機では動作しない。
　　※他にも有るかも知れない。
　　※ディスクアクセスに差異は認められなかった。
　しかし、コンパイラやEMACS等が正常に動作しているので、致命的では無いと考え、これ以上の原因追及はせずに公開しています。
　　※実機ではドライブA,Bも有効にしており、この辺がシミュレータと異なる。
　　※気が向いたら原因追及を再開するかもしれない。

#総括
　６８０００は昔使った事の有る、思い入れのあるＭＰＵです。
　先人の資料を使う事により、其れなりの手間だけでＣＰ／Ｍ－６８Ｋを復活出来ました。
　やはり万歳と言っておこう。
　当然ですが、上記記載内容は全て無保証であり、各自の責任においてご利用願います。