これまでも、何度かPIC32を使ってMZ-80を再現するのとか挑んできたんですがPCGや320x200のグラフィック機能とか再現したりも、ただ8253周りの動作が怪しく 実機だと音が出るところで音が出ないとか在ったりで 現状保留中。しかも画面出力がコンポジット出力なのでその辺の改善も含めてVGAで出せないかと思案中に こんなモノを発見。
VGA出力のあるPIC32のduinomiteってのも持ってはいるんだが、これも いずれはMZ-80モドキにする前提で保留中。
で、これで何がやりたいかと言うと SBC6809の上位互換マイコンでも作ろうかと fabglなどを入れなくとも、arduino-ESP32としてだけでも、シリアル端末接続で SDカードの利用も可能で 先々fabglも組み合わせれば VGAでグラ表示もできるし、単音だが音も出せる。PS2キーボードやマウスも使える。ESP32のタイマーで6809にタイマー割り込みをかけて疑似時計モドキの機能も載せれる。ヘッドセット用に開けてあるピンはGPIOなので 使い方によってはLEDチカチカもできるかも?
で、いざ6809エミュレータを誰か作ってるだろうと探してみたら 一人しかいないw
試しに入れてみたんだが、作者謹製のモニタ機能が6809コア部分にまで食い込んでいてシンプルなSBC6809の再現に激しく邪魔になる。そりゃバグ取りとかには重宝するかもしれないけど、棲み分けできるならしておきたいなと思うわけでして。そこでPC用の6809エミュレーターで端末動作前提のソースファイル構成がなるべく単純なものを探して行き着いたのが
virtual-multicomp Z80,6502,6809の複合エミュだがそれぞれ独立しているので 3つのエミュレータが一つに入ったお徳用パックみたいなものだ。しかも 6809用のフォルダ以下の部分だけで独立してビルドできるし必要なファイルも整理すると6809本体部、ヘッダ、端末処理部の3つで済む。
で、これで何がやりたいかと言うと SBC6809の上位互換マイコンでも作ろうかと fabglなどを入れなくとも、arduino-ESP32としてだけでも、シリアル端末接続で SDカードの利用も可能で 先々fabglも組み合わせれば VGAでグラ表示もできるし、単音だが音も出せる。PS2キーボードやマウスも使える。ESP32のタイマーで6809にタイマー割り込みをかけて疑似時計モドキの機能も載せれる。ヘッドセット用に開けてあるピンはGPIOなので 使い方によってはLEDチカチカもできるかも?
で、いざ6809エミュレータを誰か作ってるだろうと探してみたら 一人しかいないw
試しに入れてみたんだが、作者謹製のモニタ機能が6809コア部分にまで食い込んでいてシンプルなSBC6809の再現に激しく邪魔になる。そりゃバグ取りとかには重宝するかもしれないけど、棲み分けできるならしておきたいなと思うわけでして。そこでPC用の6809エミュレーターで端末動作前提のソースファイル構成がなるべく単純なものを探して行き着いたのが
virtual-multicomp Z80,6502,6809の複合エミュだがそれぞれ独立しているので 3つのエミュレータが一つに入ったお徳用パックみたいなものだ。しかも 6809用のフォルダ以下の部分だけで独立してビルドできるし必要なファイルも整理すると6809本体部、ヘッダ、端末処理部の3つで済む。
最初に6809部の動きとUARTの入出力を組み込んで BASICROMを 組み込んで 動作することが確認が取れたので、そこからアレコレ試行錯誤というドロ沼での悪あがきが始まる。
実際の動作は12分半掛かるので、およそ5倍速にして短縮してる。
BASICプログラムが動いてくれるのなら、他のGAMEインタープリタやコンパイルしたオブジェクトなんかも動かしたくなる。この時点ではBASICROMのデータはHEXファイルからCの配列データ形式にして、ビルドの際に組み込まれる形になっている。BASICプログラム自体はシリアル端末からその都度コピペ転送で送る方式だ。そこでSDカードに置いたHEXデータを読み込んで動作させる試みを始めた。 まず必要なのが SDからのアクセス窓口として CPM80のCCPモドキを入れてみた。初期機能としてはDIR,ERA,RENで ファイルの一覧、消去、名前変更をできるようにした。つぎに単純にHEXファイルを6809のメモリ空間に読み込ませること、実際に読み込めたか確認のためのメモリダンプ機能を追加。LOADとDUMPの追加だ。6809メモリにバイナリデータが置けるようになったなら、動作させたくなるので バイナリデータにせいぎょを渡すためにエミュレータに渡す情報はバイナリデータの起動アドレスだが普通に0xfffe、0xffffにベクターが書かれたHEXなら単に6809にリセットを指示するだけで走り出す。BASICROMはこれで十分だが、GAME09のインタプリタやコンパイルオブジェクトにはベクタ情報は入れていない。のでリセットベクタをこちらから設定してやる必要がある。その為にVSETコマンドを追加。更にUARTアクセスアドレスがデフォルトは0x8018にしているがSBCなどの違いで他のアドレスにしているものもあるのでその辺を合わせるためのUARTコマンドの追加。ともにコマンドの後に16進4桁を指定すれば6809エンジン部にそれが設定される。パラメータ無しで実行すれば今現在の設定値を表示する。
一連の手順としては、LOADでHEXファイルを読み込み、VSETでベクターを設定して、必要ならUARTのアドレスを変更して、GOコマンドで6809にリセットを指示してプログラム起動。
そう、何もしなければ プロンプトで待ち続けるだけのSP-1002状態と同じ。なにかしたければBASICなりGAME09なりのインタープリタを読み込ませるところから始める必要があり。6809なクリーンコンピュータが出来ていた。でも 結構便利w シリアル端末にコピペ転送するより早いし楽w まだエミュのソースがスパゲッティ状態でエグいので表に出せないが 何れ公開する予定。操作の様子を動画に撮りたいとも思うがその辺も時間が必要。あと今回の件の副次効果でGAME-CCの改変時に私自身がやらかしたバグを見付けたのでその辺についても次回にでも書こうと思う。
BASICプログラムが動いてくれるのなら、他のGAMEインタープリタやコンパイルしたオブジェクトなんかも動かしたくなる。この時点ではBASICROMのデータはHEXファイルからCの配列データ形式にして、ビルドの際に組み込まれる形になっている。BASICプログラム自体はシリアル端末からその都度コピペ転送で送る方式だ。そこでSDカードに置いたHEXデータを読み込んで動作させる試みを始めた。 まず必要なのが SDからのアクセス窓口として CPM80のCCPモドキを入れてみた。初期機能としてはDIR,ERA,RENで ファイルの一覧、消去、名前変更をできるようにした。つぎに単純にHEXファイルを6809のメモリ空間に読み込ませること、実際に読み込めたか確認のためのメモリダンプ機能を追加。LOADとDUMPの追加だ。6809メモリにバイナリデータが置けるようになったなら、動作させたくなるので バイナリデータにせいぎょを渡すためにエミュレータに渡す情報はバイナリデータの起動アドレスだが普通に0xfffe、0xffffにベクターが書かれたHEXなら単に6809にリセットを指示するだけで走り出す。BASICROMはこれで十分だが、GAME09のインタプリタやコンパイルオブジェクトにはベクタ情報は入れていない。のでリセットベクタをこちらから設定してやる必要がある。その為にVSETコマンドを追加。更にUARTアクセスアドレスがデフォルトは0x8018にしているがSBCなどの違いで他のアドレスにしているものもあるのでその辺を合わせるためのUARTコマンドの追加。ともにコマンドの後に16進4桁を指定すれば6809エンジン部にそれが設定される。パラメータ無しで実行すれば今現在の設定値を表示する。
一連の手順としては、LOADでHEXファイルを読み込み、VSETでベクターを設定して、必要ならUARTのアドレスを変更して、GOコマンドで6809にリセットを指示してプログラム起動。
そう、何もしなければ プロンプトで待ち続けるだけのSP-1002状態と同じ。なにかしたければBASICなりGAME09なりのインタープリタを読み込ませるところから始める必要があり。6809なクリーンコンピュータが出来ていた。でも 結構便利w シリアル端末にコピペ転送するより早いし楽w まだエミュのソースがスパゲッティ状態でエグいので表に出せないが 何れ公開する予定。操作の様子を動画に撮りたいとも思うがその辺も時間が必要。あと今回の件の副次効果でGAME-CCの改変時に私自身がやらかしたバグを見付けたのでその辺についても次回にでも書こうと思う。
コメント
コメントを投稿