［祝］ベーシックマスター レベル３ 生誕４０周年

#目的
　DOSを探してガラクタ箱を漁っていると、MB6890.ZIPがひよっこり出てきた。
　なんだろうと思い起すと、なんと！ベーシックマスター レベル３のROM(BASIC)ではないか。
　そしてなんと、来年はレベル３が1980年5月に発売されてから来年５月で生誕４０周年ではないか。
　◆◆◆　そうだ、ベーシックマスター レベル３ 生誕４０周年を祝おうではないか　◆◆◆
　ささやかな祝福ではあるが、ベーシックマスター レベル３をFPGAで再現してみよう。
　まあ、４０周年は今から約半年後ですけどね。

#経緯
　投稿者は日立関連の会社に在籍したことが有り、それなりの思い入れが有ります。
　　※他社製の機器を購入申請すると、却下率が高かったという事情も有る。
　　※レベル３に通信アダプタ(自社製)を接続し、遠隔(リモート)監視システムを構築した。
　しかし、なにせ大昔の事であり詳細を覚えているはずもなく、まずは情報を収集。
　1.国会図書館に出向き、月刊I/Oの別冊『ベーシックマスター活用研究』に記載の回路図をコピー。
　　※回路図は入手したが、ロジックが複雑で、根気が続かず詳細分析は断念。
　2.「[日立 ベーシックマスター レベル3 マーク5 / S1](http://s-sasaji.ddo.jp/bml3mk5/)」で機能等を再確認。
　　※上記以外は断片的で、かろうじて残っているという状態か。

　<未来技術遺産登録について>
　　2015年9月1日に国立科学博物館の定めた重要科学技術史資料（通称:未来技術遺産）の第00206号として、登録されている。
　　しかし技術資料も保管せず、筐体(あえてガラクタといおう)を保管してなにをしたいのか、何の役に立つというのだろうか。
　　目的が良く判らない。
　　むしろコンセプト、回路図、ROM等を収集/公開して次の世代に、多少なりと技術を伝承すべきと思うがどうだろう。
　　過去の技術者の自己満足の世界ではなかろうか。こんな事をしているから諸外国に置いて行かれるのだろうね。
　　もしベーシックマスターの関係者がこれを見られたら、技術を公開してほしい。(まあ、いないだろうが)

#コンセプトなど
　今回の目標は完ぺきなMB6890のemulatorを作ることではない。
　その理由としては、単に投稿者の技術レベルが低い為であり、完全性は求めない(求められない)。

　ではなぜ行うのか。その理由は
　1.投稿者の知的欲求を満足させる(自己満足を含むが)。
　2.多少なりと次の世代への啓発を。
　　FPGAの例題として、LEDちかちかが推奨されているが、それ以降は極端に敷居が高く、無理と諦めてしまっているのではないか。
　　こんなことが出来る、この程度のことはできる等を見せて、連続的な技術のステップアップを図れるようにすべきであろう。

　現在のFPGAによる開発は下記のよう、昔に比べ格段に簡単になっている。
　その分、最先端は高度になっているともいえるが、昔に比べ出来る事は格段に多くなっている。
　　レベル１　専用LSI/ICを配置/配線し、グルーロジック(周辺回路)のみをFPGAで構築。　　　<-------- 黎明期
　　レベル２　専用LSI/ICをFPGAで(自分で)設計、メモリーは専用ICを配置/配線する。　　　　<-------- 10年ぐらい前か
　　レベル３　専用LSI/IC(モジュール)のVHDLを探してきて設置、全回路をFPGAで構成可能。　<-------- 現在のレベル
　　　　　　　※ちなみに今回のemulatorは現時点では、DE10の5%のロジックと10%のメモリで構成出来ている。
　　　　　　　　emulatorは32MHzで動作し、また規模は1/10程度の事より、DE10は実機の320倍の性能を有する事になる。(ほんとかいな)

#前提条件
　以下のハード・ソフトを予め準備の事。(購入先、金額は参考までに)
　1. FPGA-board 　　　　　DE10-nano(ソリトンウェーブで購入した 18k円)
　2. IO-board　　　　　　MiSTer FPGA IO 5.6 Board for DE10 Nano(ebayで購入 6k円)。VGA出力部分のみ使用。
　3.Quartus Prime　　　　　FPGAのプログラムを作成。(開発は Ver17.1)


#開発手順
　まず下記に示す順序で回路を構築。コンパイルエラーを潰していく。
　signaltapで信号確認しながら間違いを訂正していったら、一週間程度で初期画面が出た。(やったね)
　※メモリが潤沢にあるのでsignaltapを使い放題。
　これが旨く行ったら、後は個別に機能をインプリメントすればいい。
  
  <動作確認>
　1.DE10のハード動作を簡単なプログラム(例えばLチカ)で確認。
　2.VGAハードを接続し、簡単な表示プログラムを作成し、表示回路の動作確認。
　3.所持するL3(レベル３)ROM使える事を[ソフトemulator](http://s-sasaji.ddo.jp/bml3mk5/)で使える事を確認する。

　<回路設計>
　せっかくコピった回路図だが、詳細には分析しなかった(面倒くさい)。
　「[日立 ベーシックマスター レベル3 マーク5 / S1](http://s-sasaji.ddo.jp/bml3mk5/)の記載を参照し、機能を順にインプリメントした。
　※そのため、本物と似ていない部分が有るような気がする。
　1.モジュール(6808,CRTC等)を集めプログラムに配置。
　2.メモリ類をalteraのライブラリを使用して定義、ROMはROMファイルと結びつける。
　3.L3のCS(チップセレクト)信号を作成し、各モジュールに配線。
　4.CPU(MPU)のアドレスバスを、各モジュールに配線。
　5.CPU(MPU)の出力データバスを、各モジュールに配線。
　6.CPU(MPU)の入力データバスに、各モジュールの出力をCSで選択して接続。
　7.L3(レベル３)で使用している、レジスタ類を定義、CSで選択してR/W接続。
　8.ROMを逆アセンブルし、プログラムの動作(特にスタートアップ)を確認。
　9.コンパイル結果をFPGAに書き込む。
　10.リセットスタートし、RESETベクターからの、ROMの読み取り動作をchipscopeで確認。
　11.メモリへのR/W、プッシュ/プル動作部分で、RAMの動作を確認。
　12.CRTCへのアクセス信号を参照し、CRTCの初期化を確認する。
　13.CRTCが0x400(VRAM戦闘)にアクセスした時に、メモリから0x48('H')が出力され、FONTROMからは対応するビットデータが出る事を確認。
　　※ここまで正常であれば、初期画面には'HITACHI....'と表示されるはず。

#主要モジュール
　本emulatorは[MultiComp](http://searle.hostei.com/grant/Multicomp/)の6809部分をベースにして構築している。
　※webサイトが紹介出来ればいいのだが、既にサイトが閉鎖されているような気がする。
　※[MultiComp_MiSTer](https://github.com/MiSTer-devel/MultiComp_MiSTer)が技術的に同じような気がする。

　1.CPU(MPU) 6809
　　MultiCompで使用されているものを利用。
　2.RAM
　　alteraのライブラリを使用。
　　2port.ramとして定義しているので、表示アクセスとの競合を考慮する必要はない。
　3.ROM
　　alteraのライブラリにROMデータをバインド。
　　※L3BAS.HEXをROMフォルダに格納の事。
　　※ROMファイルがBINの場合はHEXに変換が必要。
　4.FONT
　　alteraのライブラリにROMデータをバインド。
　　※ROMファイルがBINの場合はHEXに変換が必要。
　5.CRTC
　　「BBC Micro for Altera DE1」に使用されているものを利用している。
　　※VGA出力とする為にインターレースは無効としている。また、表示位置補正の為にVSYNCの位置をずらしている。
　　※インターレースを無効とする為に「mc6845.vhd」に２か所改悪(----でコメントアウト&追記)。
　　　残光性のモニターが入手できるのであればコメントを取り外せば動くかな。
　　※インターレースを無効にしているので、インターレースを前提にしているソフトは動かない。
　6.キー入力
　　キーボードレジスタ(0xffe0)にスキャンコード(0x80-0xfe)をセット後、入力無(0xff)をセットすることにより入力となる。
　　PIAではなく単なるレジスタとして設計している。
　　なお、本emulatorにはキーボードを付属していない。※色々な手段が考えられるが、ハード/ソフトの追加が必要でちょつと面倒。
　　ではどうやって入力するかというと、jtag-usb接続を利用して、システムコンソールから入力する。
　　※Misterのロジックを使えばUSBからの入力が可能となるが、機構が良く判らない&コンパイル時間が長くなるのでやっていない。

#動作方法
　1.ソースをQuartusでコンパイルする。
　　[ソースファイルの場所は](https://github.com/hi631/BASIC_MASTER_LEVEL3/tree/master/vgadisp(DE10))
　2.output_filesフォルダに\*\*.rbfが出来上がるのでDE10に書き込む。
　3.システムコンソールを起動する。(Quartus tools -> System.Debugging.tools -> System.Console)
　4.System.ConsoleのSystem.Explorer(左側)のscriptsフォルダに格納したスクリプトを実行(Execute.script)する。
　　※ダウンロードしたscriptsフォルダを予めコピーしておく。

　<スクリプトに関する解説>
　スクリプトはTCLコマンドで作成している。(attera方言が微妙)
　L3にキーコードを送る場合、スクリプトファイルに ss "キーデータ"と記載し実行すると、L3の画面に"キーデータ"が表示される。
　※ssはスキャンコードを送る関数。
　※最低限のキーしか定義していないので、未定義のキーも存在する。(必要なら追加してね)
![reset.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/7564defe-6981-22ca-6b08-a7bc172daf01.jpeg)　起動画面　　　　　　　　　　　　　　　　　　　　　　6809 EXTENDED BASICでの起動
![line.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/55c75d9b-a63a-d8d7-c3b2-a36861b65c61.jpeg)　グラフィック表示の例(32Mhzにすると早いぞ)

#L3ROMが無い場合は
　L3ROMを持っていないが、どうしても試して見たい場合はROMフォルダ内のEXT_BASIC.HEXをL3BAS.HEXにリネームしてコンパイルする。
　※EXBAS.HEXは「6809 EXTENDED BASIC(Microsoft 8KBasic)」にL3用の入出力を追加したもの。(freeになっているはず)
　キー入力スクリプトは sn "キーデータ"と記載し、実行する
　※snはアスキーコードで送る関数。
<BR>
　FPGAで設計されたベーシックマスター レベル3は現存しない。(多分)
　※10年位前に開発中の記述が散見されたが、開発資料などは見当たらない。
　これは、技術資料が公開されてないことに起因すると考える。(一部公開している会社も有るが)
　過去の技術を伝承し将来につなげる為に、可能な限り公開すべきと考えるが、如何なものだろうか。
　なお、もし追試する奇特な方がおられた場合、上記記載内容は無保証であり、各自の責任においてご利用願います。