前回の投稿に続きSBCV20のソフトウェアの話。最初にネイティブモードのハローワールドとエコーバックテスト(受信割り込み付き)でハードウェアの動作を確認。次に、エミュレーションモード(CPU判定付き)で同じことをやって8080の機械語の動作を確認。参考までにソースをGistに貼っておく。これで8080の機械語の、いわば入れ物が完成。あとはいまハローワールドとエコーバックテストが書いてあるところにBASICを埋め込むだけ。
8080とV20はROM、RAMの順序が逆なので、8080のBASICは前後を入れ替えてからV20へ持ち込むことになる。その入れ替えがしやすいように、8080のBASICをあらかじめアドレス非依存に書き直しておく。この過程で1バイトのRST命令を3バイトのCALL命令へ置き換えたが、先頭のスカスカな領域が詰まって、全体では1バイト減。これをSBC8080で動作確認。実行速度はASCIIART.BASによるベンチマークテストで変化なし。
SBC8080で動いたBASICをSBCV20へ埋め込み可能な形に微修正。すなわち、端末制御はネイティブのサブルーチンを呼び出ように書き換え、8080の側でやっている割り込み処理を削除し、ROMとRAMの開始アドレスを変更。これは過渡的なBASICであり、単体ではテストできないから、失敗できない緊張感でいっぱい。その機械語をテキストに書きだし、SBCV20のBASICのソースに埋め込んでアセンブル。ROMに焼いてテスト。
SBCV20のBASICは、基本的にエミュレーションモードで動くが、端末制御でネイティブモードのサブルーチンを呼び出すし、端末からの受信割り込みで勝手にネイティブモードへ戻ってしまう。この往来にあたり、セグメントをどう取り扱うかで何度かやり直しを余儀なくされた。最終的にセグメントは終始0000H固定として起動に成功。V20と8080のコードが同じセグメントに混在するが、むしろアドレスの関係がわかりやすくなった。
SBCV20のBASICでASCIIART.BASが完走。これをもって当面の目標を達成したと判断する。実行時間は2分30秒。下の写真でタイマーが1分56秒を表示しているのは途中経過だから。この結果を、はせりんさんが公開しているASCIIART(マンデルブロ集合)ベンチマークのデータと照合すると、V20/10MHzのエミュレーションモードは8080/10MHzに相当。リアルな8080ではついぞ実現しなかった、未知の領域を体験しているわけだね。
SBCV20の関連ファイルをGitHubに置いておく。そのうち、MSBAS80V.HEXはSBC8080で動く。V20BASIC.HEXはSBCV20で動く。MSBASV20.LSTはSBCV20に埋め込まれたBASICのリスティングに相当し、たとえば、BASICのUSR関数で機械語を実行する際、内部構造を知るために必要となる。下の例は、USR関数の引数を取得し、1増加させ、戻り値とする処理。引数や戻り値の取り扱いでMSBASV20.LSTが示すアドレスを参照した。
SBCV20は、さしあたりスイッチサイエンスさんのマーケットプレイスで頒布するべく準備を進めているところ。あわせてオレンジピコショップさんにも協力を求めている。とはいえ、事務処理が苦手な上に一部の機能のテストができておらず、あれこれやっているうちにとうとう年末を迎えてしまった。恒例のお祭り騒ぎができるのは来年になると思う。まだちょっと早いかもしれないけれど2021年もよろしくお願い致します。