6502の逆アセンブラを制作する過程の紹介の続きです
W65C816ボード |
W65C816ボード |
W65C816ボード |
6502CPUには触れたことがなかったのですが、最近W65C02やW65C816用のボードを製作した(2021年5月20日のブログ「W65C816も動作する6502基板を製作してみました」)こともあって、6502のアセンブラプログラミングに取り組んでみようと思っています。
W65C816ボード |
必要になるのはアセンブラですが、何しろ全く知識のないCPUですので、まず逆アセンブラを制作することで6502の命令体系に慣れ、それからアセンブラを制作することにしました。
なお、ここで制作するのはオリジナルの6502ではなく、Rockwell のR65C02ですので、オリジナルよりも命令が拡張されています。(オリジナルの6502のデータシートが入手できなかったため)
完成した逆アセンブラの動作画面を紹介します。
R65C02用逆アセンブラ |
以前制作した6800や6809用の逆アセンブラをベースにしていますので、画面や操作性はほとんど同じです。
この逆アセンブラを制作する過程を順に紹介し、ソースプログラムも公開しようと思いますが、アセンブラや逆アセンブラの構造などについて全く知識のない素人が自己流で制作したものですので、知識のある方から見ると何だこれはと思われるかもしれませんが、私が調べた限りではアセンブラや逆アセンブラを作成するために役立つ情報はほとんど見当たらないようです。(専門家から見ると簡単すぎるので解説する気にもならないということなのでしょう。)
(1)操作性を考えてFormアプリとし、使い慣れているVC++で作成する。
(2)自動的にラベルを付けることができること。
(3)データ部分を指定できること。
(4)変換結果が画面で確認できること。
(5)作成されたアセンブラリストはそのままでアセンブラにかけられること。
上記を目標に制作した結果、上記画面のような構成となりました。
次のような段階で進めていきます。
(1)必要なFormをVisual Studio 2010のC++で作成します。
(2)作成したFormをVisual Studio 2019のC++に移行します。
(3)処理ファイルを読み込む処理をします。
(4)オプションの処理をします。
オフセットアドレスやスキップアドレス範囲などの設定をします。
(5)pass1の処理をします。
ラベルの作成・登録をします。
(6)pass2の処理をします。
アセンブルリストを作成します。
(7)処理結果を保存する処理をします。
アセンブルリストを2つの形式(リスト形式、アセンブラ形式)で保存します。
(8)最終確認をして仕上げます。
入力データはファイルメニューから選択するか、あるいは直接ファイル名ボックスにドラッグ&ドロップします。スタートアドレスはBINの場合は$0000に、HEXやMOTの場合はその先頭アドレスになります。オフセットアドレスを設定するとアセンブル開始アドレスを変更することができます。
データ範囲はスキップアドレス範囲として設定します。もちろん複数範囲を指定できます。それらの範囲はFCBあるいはFCC疑似命令となります。
処理結果はListリストボックスやAssemblerリストボックスに表示されますが、変換中も表示させるようにすると時間がかかるので、処理終了後に表示されるように設定しています。
まずはFormの作成ですが、最近使用しているVisual Studio 2019(フリー版)ではC++のFormアプリは作成できないようですので、昔使っていたVisual Studio 2010で元のFormを作成し、それを2019で扱うことにします。
必要なメインForm、OffsetInForm、SkipAreaInForm、HelpFormの4つを作ります。
【ここまでの結果】... 01OriginalForm_byVC2010 (OneDriveで公開。以下同様)
(1)で作成したものを2019で読み込み、OffsetInForm、SkipAreaInForm、HelpFormをProjectに設定し、さらにメニューの項目を設定します。
【ここまでの結果】 ... 02SetForm_byVC2019
逆アセンブルすべきファイルを読み込む処理をします。BINファイルのみでなく、HEX,MOTファイルも読み込めます。
スタートアドレスはBINでは$0000、HEX,MOTでは設定されている先頭アドレスになります。アドレスが不連続の場合はその空白区間は$00になります。
(とりあえず、逆アセンブル実行ボタンを押すと読み込んだデータを表示するようにしてありますが、先頭アドレスから読み込んだ数だけ表示しますので、アドレスが連続していない場合は正常に表示されません。)
【ここまでの結果】 ... 03Coding-inputfile
オフセットアドレスやスキップアドレス範囲などのオプションの処理をします。
【ここまでの結果】 ... 04Coding-setoption
これは以前の報告(6809SBCボードやFM-7にArduinoを接続してRTCやLCDを制御 2021年8月24日)の続編です。
実現しようとしているのは6809SBCボードやFM-7にArduinoやRaspberry Piのようなマイコンを接続して、その先の様々なセンサー等を制御することです。そのスタートが上記の報告だったのですが、SBCボードやFM-7に搭載したPIAとArduinoの通信にハードI2Cを用いざるを得なかったために、肝心のセンサー等の制御にソフトI2Cを用いることになり、これでは制御の自由度が狭まってしまっていました。
ということで、PIAとArduino間にSPI通信を用いることができれば、Arduinoに接続したセンサー等をI2C(ハード、ソフト)やSPIで自由に制御できると考えました。
手始めに、Arduinoを仲介せずにPIAにADコンバータMCP3208 を直接接続して制御してみました。写っていませんが前回同様にフラットケーブルの先でPIAと接続しています。
接続図です。