SBC8080ルーズキット用のSBC8080システムROMは電脳伝説(@vintagechips)さんの手によりPALO ALTO BASICに独自の機械語モニタを拡張してあり一行アセンブラが使えて大変便利。MONでモニタにはいりSYSTEMでBASICプロンプトに戻る。EXEC 番地で番地+8000Hに飛んでRET命令でプログラムに戻ってこれるのだけれどもPEEK/POKEがないのでパラメータのやりとりがそのままではできない。
そこでSBC8080技術資料の記述からPALO ALTO BASICの資料をたどって調べてみた。
SBC8080システムROM(電脳伝説)
Astrocade Machine Language Source Code Palo Alto Tiny BASIC, Version 3 よりPDFを取得
TINY BASICなので変数名はA〜Zのみ、@は配列。BASIC変数/バッファ領域はSBC8080システムROMの場合F000HからF087Hまで。適当に変数Aに代入してMONで覗いてみると値が変化しているところがある。調べた結果、
F002H 変数A
F004H 変数B
F006H 変数C
F008H 変数D
F00AH 変数E
F00CH 変数F
...となっていた。数値は2バイトでリトルエンディアン。ということはここを機械語とのパラメータ受け渡しに使える。
実際に作ってみた例はこちら:TeraTermに送信するときは設定(S)→シリアルポート(E)... で送信遅延を10ミリ秒/字 100ミリ秒/行にするのを忘れずに。
これは十進補正命令DAAの動作を確認するテスト。変数Aと変数Bの値を加算し結果を変数C、フラグを変数Dに格納。その後DAA命令を実行し、結果を変数E、フラグを変数Fに格納する。いずれも下位1バイトしか使わない。8080アセンブラで初めて書いたのでみてみて。
8000 LXI D,F002 変数AへのポインタDE 8003 LXI H,F004 変数BへのポインタHL 8006 LXI B,0000 BC←0 これはAFのクリア用 8009 PUSH B 800A POP PSW AFクリア 800B LDAX D Accに変数Aの内容をコピー 800C ADD M Acc ← Acc + 変数B 800D PUSH PSW いったん結果を保存 800E DAA 十進補正 800F PUSH PSW 8010 POP B AFのペアをBCにコピー 8011 MOV A,B 8012 STA F00A 変数Eに十進補正後の結果を返す 8015 MOV A,C 8016 STA F00C 変数Fに十進補正後のフラグを返す 8019 POP B 801A MOV A,B 変数Cに補正前の結果を返す 801B STA F006 801E MOV A,C 801F STA F008 変数Dに補正前のフラグを返す 8022 RETこれをBASIC側から変数Aと変数Bを0〜255の範囲で変化させてEXEC 0で呼び出し、結果を含めて画面出力するだけ。文字出力はBASIC内のサブルーチンを呼び出せばできそうだったが手を抜いてBASIC側でやった。ループも同様。どのみち9600bpsの端末への出力なのでいくら高速化してもそこで律速となる。
なんでこれを作ったかというとIntel純正8080に対してNEC 8080Aは独自改良でDAA命令を修正したが、非互換ということでNEC 8080AFでIntelとまったく同じ動作に戻したという話があったので調べてみようと思ったからだ。次回お楽しみに。
