2019-09-22 23:00 — asano
ハードウェア編に続いて今回はソフトウェア編です。
最初のテストはJMP
でループを作ってみます。これは3バイト命令なのできりの良いアドレスに配置すればA0, A1が変化しA2以降のアドレスは変化しません。
これでメモリ基板から読んで実行できていることがわかります。メモリ基板のターゲット側ポートはこれまで未確認だったのですが、ここで確認が取れました。
この後はメモリへの書き込みなど一つずつ確認していくのが堅実だとは思いますが、一気にUniversal Monitorの移植に進むことにしました。
実はこの時点ではR65C51 ACIAは未搭載だったのでメモリ基板のコンソール機能を利用します。この機能も未確認なのでまずはオープニングメッセージを表示するところまで移植してみます。
6502のアセンブリ言語を書くのは初めてです。
以前 Z80, 8080からMC6800, MC6809へ移植したときも勝手が違って戸惑いましたが、6502はそれ以上ですね。文字列出力ルーチンをどう書くかで悩むことになるとは思いませんでした。
16ビット長のレジスタは(PCしか)無いので文字列の先頭アドレスはゼロページに置くしかありません。ここまでは良いのですが問題は1文字ずつ取り出す方法です。
- ゼロページのポインタを直接インクリメント
とはいっても上下に分けて一旦Aに持ってきてとかなり面倒なことになります。Z80などがINC HL
一発でできるのとは大違いです。 - ゼロページのポインタはそのままにIndirect Y
Indirect Yアドレッシングを使えばYのインクリメントですみます。Yは8ビットしかないので文字列長に制限が生じますが、モニタでそう長い文字列は扱わないので問題ありません。
今回は後者を使いました。
旬な時期にやっていればさまざまな「定石」も簡単に手に入ったのでしょうが、今からですと難しいですね。効率にはあまりこだわらずにとにかく動かす方針で進めることにします。
メモリ基板経由のコンソール機能はあっさり動作したので続いて行入力、Dumpコマンド、Setコマンド、Goコマンドと実装が済んで一通り使えるようになっています。
またR65C51経由のコンソールも使えるようになりました。
今後の追加予定としては、Punchコマンド、Loadコマンド、CPU識別、Registerコマンドなどです。
コメントを追加