2021年11月17日水曜日

6502の逆アセンブラを制作する(その1)

 6502の逆アセンブラを制作する過程を紹介します

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リストボックスに表示されますが、変換中も表示させるようにすると時間がかかるので、処理終了後に表示されるように設定しています。

制作過程(1)

まずはFormの作成ですが、最近使用しているVisual Studio 2019(フリー版)ではC++のFormアプリは作成できないようですので、昔使っていたVisual Studio 2010で元のFormを作成し、それを2019で扱うことにします。

必要なメインForm、OffsetInForm、SkipAreaInForm、HelpFormの4つを作ります。

【ここまでの結果】... 01OriginalForm_byVC2010 (OneDriveで公開。以下同様)

制作過程(2)

(1)で作成したものを2019で読み込み、OffsetInForm、SkipAreaInForm、HelpFormをProjectに設定し、さらにメニューの項目を設定します。

【ここまでの結果】 ... 02SetForm_byVC2019

制作過程(3)

逆アセンブルすべきファイルを読み込む処理をします。BINファイルのみでなく、HEX,MOTファイルも読み込めます。

スタートアドレスはBINでは$0000、HEX,MOTでは設定されている先頭アドレスになります。アドレスが不連続の場合はその空白区間は$00になります。

(とりあえず、逆アセンブル実行ボタンを押すと読み込んだデータを表示するようにしてありますが、先頭アドレスから読み込んだ数だけ表示しますので、アドレスが連続していない場合は正常に表示されません。)

【ここまでの結果】 ... 03Coding-inputfile

制作過程(4)

オフセットアドレスやスキップアドレス範囲などのオプションの処理をします。

【ここまでの結果】 ... 04Coding-setoption



0 件のコメント:

コメントを投稿