ラベル 逆アセンブラ の投稿を表示しています。 すべての投稿を表示
ラベル 逆アセンブラ の投稿を表示しています。 すべての投稿を表示

2024年4月25日木曜日

必要に迫られて自作したアセンブラ等のツールソフトの紹介(第2回)

 必要に迫られて自作したアセンブラ等のツールソフトの紹介(第2回)です


【11月15日追記】クロスアセンブラ(6809用、6800用)の修正版を11月15日のブログ「必要に迫られて自作したツールソフト(クロスアセンブラ)の紹介(第3回)」にアップしましたので、そちらの方を参照ください。また、6801用、6303用も同時に公開しました。


【5月23日追記】コメントでご指摘いただいた点を改善した6809AsmWin.exeと6800AsmWin.exeを公開しました。末尾を参照ください。


【4月30日追記】コメントでご指摘いただいた点を改善中です。かなり大幅に書き換えましたので、他の箇所でバグが発生していないかチェック中です。チェックが済みましたら改めて、6809AsmWin.exeと6800AsmWin.exeを公開する予定です。


2021年9月1日のブログ「必要に迫られて自作したアセンブラ等のツールソフトの紹介」https://www.blogger.com/blog/post/edit/1662007451717538019/137356729684879777

で私が日常使用しているいくつかの自作ソフトを紹介して公開しましたが、その後、必要に応じて修正を重ねてきましたので、ここで改めて最新のバージョンを紹介することにしました。

紹介するものはほぼ前回と同じです。

(1)クロスアセンブラ

 ・6809クロスアセンブラ 6809AsmWin.exe  

 ・6800クロスアセンブラ 6800AsmWin.exe 

クロスアセンブラの主な修正点はFCB疑似命令のオペランド処理の改善です。

「'A',-'B'」や「'A,-'B」のような両書式に対応しました。また、カンマ「,」やスペース「 」もそのまま「','」や「',」の形で使用できます。ただし、文末にカンマやスペースが来る場合は誤変換が生じる場合がありますので、「','」のように閉じの「'」をつける必要があります。


(2)クロス逆アセンブラ

 ・6809クロス逆アセンブラ 6809DasmWin.exe

 ・6800クロス逆アセンブラ 6800DasmWin.exe

逆アセンブラの修正点は、データ部をスキップさせる場合の範囲指定処理の改善です。


(3)転送ツール

 転送ツールとして良く使用するのは仮想ドライブ構築ソフトです。それぞれのDOS(?)に合わせて4種類制作しています。

 ・Flex9用のFlexDrvWin.exe

 ・OS-9用のOS9DrvWin.exe

 ・F-BASIC3.0用のFBasDrvWin.exe

 ・CP/M-80用のCpmDrvWin.exe

主な修正点は、扱えるファイル書式を.D77、.DSKに加えて、各セクタの先頭に16バイトのセクタデータを付加した.DAT形式に対応したことと、パソコンとの通信にRS232Cに加えてFT245高速通信カードに対応したことです。


(4)ツールソフト

 ・CnvTxtTl1Src.exe

  Windows機で作成したTL/1やGAMEのプログラムをTL/1形式やGAME形式に変換するソフト

 ・CvtMotHexBin.exe

  バイナリファイルをBin, Hex, Mot形式に変換するソフト

 ・CvtDskD77.exe

  フロッピィディスクイメージの形式を変換するソフト 


その他として、

(5)FT245高速通信カードを用いたFM-7とWindows機との間の高速通信ソフト

 ・ディスクコピープログラム(F-BASIC3.0用、OS-9用、FLEX用、CP/M用)

 ・ファイルコピープログラム(F-BASIC3.0用、OS-9用、FLEX用、CP/M用)

がありますが、その都度ブログで報告していますのでそれらをご参照ください。


各ソフトを画像で紹介しておきます。

(1)クロスアセンブラ

アセンブルしたいファイルを「ファイル名」ボックスにドラッグ&ドロップして「アセンブル実行」ボタンを押します。


6809AsmWin.exe


6800AsmWin.exe


(2)クロス逆アセンブラ

アセンブルしたいバイナリファイルを「ファイル名」ボックスにドラッグ&ドロップし、「オプション」メニュー中の「オフセット指定」でスタートアドレスを設定してから「逆アセンブル実行」ボタンを押します。

バイナリファイル中にデータ範囲があるようなら、その範囲を推定して「オプション」メニュー中の「スキップ範囲追加」で設定します。


6809DisAsmWin.exe



6800DisAsmWin.exe


(3)仮想ドライブ構築ソフト

 ドライブ0~3にディスクイメージファイルをドラッグ&ドロップすればその内容が左下のボックス中に一覧表示されます。イメージファイル形式ですがD77(D88)形式だけでなくDSK形式(単純にセクタデータを順番に並べたもの)やDAT形式(各セクタの先頭に16バイトのセクタ情報が付いた形式)も読み込めます。
左下のボックスにファイルをドラッグ&ドロップすればイメージファイル中に書き込まれます。ボックス中のファイルをマウスの左ボタンで選択して右ボタンでメニューを表示させることで、「読み出し」、「削除」、「名称変更」ができます。また、イメージファイル中の全ファイルを一気に読みだす場合はメニューの「編集」→「全ファイル読み出し」を用います。



FbasDrvWin.exe

 

Os9DrvWin.exe



CpmDrvWin.exe



FlexDrvWin.exe


FlexDrvWin.exeの例のように、FM-7等との通信を行う場合には、右のボックス中に送受信しているセクタの情報が R/W,Drv,Trk,Sctの順に表示されます。


(4)3種のツールソフト

(4-1)プログラムソースファイルをTL/1やGAME形式に変換します。

CnvTxtTl1Src.exe


(4-2)バイナリファイル変換ソフト
 Bin, Hex, Motファイル間の変換ソフトです。さらにFlex9のバイナリ形式にも変換できます。

CvtMotHexBin.exe


(4-1)ディスクイメージファイル変換ソフト
 普段はディスクイメージファイルの中を見やすいDSKファイルを使うことが多いのですが、XM7やGOTEKのためにはD77形式に変換する必要があります。今まではそれぞれのDOS用に制作したコンソールソフトを使用していたのですが、不便なので全DOSに対応したフォームソフトを制作しました。トラック数が40か80かは自動判別しますのでどちらでも使えます。

CvtDskD77.exe


これらをまとめてOneDriveに上げておきますので、もし使用されてみて動作がおかしいということがありましたらご一報いただけると有難いです。

(前回もこのような文を書いておきましたが、特に連絡をいただけることはありませんでしたので、恐らく使用されてみた方はいらっしゃらないのだとは思いますが、自分自身の試みの記録を兼ねてブログにアップしました。)


【5月23日追記】コメントでご指摘いただいた点を改善した6809AsmWin.exeと6800AsmWin.exeをOneDriveに公開しました。改善点などを記述した文書も添付してあります。


2021年11月17日水曜日

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

 6502の逆アセンブラを制作する過程の紹介の続きです


W65C816ボード


制作過程(6)--- pass2

pass2では再びデータの先頭から1文字ずつ読みながらアセンブルリストを作成し、ListリストとAssembleリストボックスに書き込んでいきます。その書式は次のようです。
Listリストボックスには
 行番号 アドレス オペコード オペランド ラベル ニーモニック オペランド
Assembleリストボックスには
 ラベル ニーモニック オペランド (アセンブラプログラムにかけられる形式です。)

そのアドレスにラベルがついている場合はラベルも表示し、オペランドがアドレスである場合は即値をラベルに置き換えて表示します。
該当する命令がない場合はオペコードを ?-xx- のように表示し、ニーモニック欄はそのアスキーコードを'a'のように表示します。

【ここまでの結果】 ... 06Coding-pass2

制作過程(7)

作成された逆アセンブルリストを保存します。
ListリストはLSTファイルとして、AssembleリストはASMファイルとして保存します。

【ここまでの結果】 ... 07Coding-savefile

制作過程(8)

最後に細部の見直しをして完成です。

【11月18日追加】下の2ファイルは適宜見直して差し替えることがあります。

【完成版】 ... 08Coding-complete  

完成版の中の実行ファイルのみ ... 6502DAsmWin

最後に

10年ほど前に制作した6800用の逆アセンブラの制作過程をほとんど忘れてしまっていたので、それを復習するためもあって今回、6502の逆アセンブラの制作に取り組んでみました。
自分の場合は、ソースが公開されていてもあまりに長いとなかなか読み切れないことが多いので、いくつかに分割して紹介してみましたがどうだったでしょうか。

手持ちに6502のバイナリがないので十分に動作確認ができてはいないのですが、とりあえずelectrelicさんのUniversal Monitor 6502版が正常に逆アセンブルできることは確認してあります。

6502の命令コードの解釈やその他の誤り・勘違いなどがありましたらお知らせいただけるとありがたいです。






 

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

 6502の逆アセンブラを制作する過程の紹介の続きです


W65C816ボード

制作過程(5)--- pass1

いよいよここからが逆アセンブラの本体作成となりますが、まず検討すべきは命令の分類です。RockwellのデータシートによるとR65C02の命令は次の16通りに分類できるようです。

 0:(no opcode)
 1:Absolute 1:a
 2:Absolute Indexed Indirect 2:(a,x)
 3:Absolute Indexed with X 3:a,x
 4:Absolute Indexed with Y 4:a,y
 5:Absolute Indirect 5:(a)
 6:Accumulator 6:A
 7:Immediate 7:#
 8:Implied 8:i
 9:Program Counter Relative  9:r
10:Zero page Relative 10:zp,r
11:Zero page 11:zp
12:Zero page Indexed Indirect 12:(zp,x)
13:Zero page Indexed with X 13:zp,x
14:Zero page Indexed with Y 14:zp,y
15:Zero Page Indirect 15:(zp)
16:Zero Page Indirect Indexed with Y 16:(zp),y

これを元にして、オペコード、ニーモニック、命令長、命令タイプの表を作成しました。
それが下に示すファイルR65C02dopcode.hです。

         
 
pass1はデータファイルを1文字ずつ読みながら、スキップ範囲指定されていなければR65C02dopcode.hを参照して該当するopcodeを見つけ、そのオペランドがアドレスであったらL_xxxx(xxxxはアドレス)というラベル名でラベルテーブルに格納するという作業を繰り返します。(スキップ範囲指定されている場合は下記の処理をします。)
従って、上記のaやzpはそのアドレスにラベルが付き、rは相対アドレスを絶対アドレスに変換したアドレスにラベルが付くことになります。
該当する命令が存在しない場合はエラーにはせずにそのコードをスキップします。(pass2で処理します。)

スキップ範囲の処理
スキップ範囲に指定したデータの扱いですが、範囲の先頭の1バイトの値がアスキー表示可能($20~$7F)ならその範囲全体をFCC /abc.../のように表示し、そうでない場合はFCB $xx,$yy,$zz,...のように表示します。

【ここまでの結果】 ... 05Coding-pass1

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



2021年10月2日土曜日

紹介した6809/6800用クロス逆アセンブラの修正版

 6809/6800用クロス逆アセンブラを修正しました

9月1日のブログ「必要に迫られて自作したアセンブラ等のツールソフトの紹介」で紹介した自作ソフトの内のクロス逆アセンブラですが、不具合がありました。

公開したものより以前のバージョンでは、スキップ範囲で指定した部分が1バイトずつFCB疑似命令に置き換えられていたので、表示メッセージなどではそれを手作業でFCC疑似命令に置き換えていました。

例えば、スキップ範囲指定したデータが 36,38,30,39,53,59,53,54,45,4D や 0D,0A,04では
        FCB $36            FCB $0D
        FCB $38            FCB $0A
        FCB $30            FCB $04
        FCB $39
        FCB $53
        FCB $59
        FCB $53
        FCB $54
        FCB $45
        FCB $4D
となっていましたが、リストを見やすくするために、それを手作業で
        FCC /6809SYSTEM/ や FCB $0D,$0A,$04
と書き換えていました。

これを逆アセンブラ自身にさせたいということで、公開したものでは、スキップ範囲に指定したデータの先頭の値が$20~$7Fの表示可能データの場合にはFCC疑似命令に、それ以外の場合にはFCB疑似命令に置き換えるとともに複数バイト列を一つの疑似命令にまとめられるようにしました。

この置き換えが可能になるようにプログラムを書き換えたのですが、一つ忘れていたのは、結果として作成されるFCCやFCB疑似命令のオペランドの長さが不定であり、場合によってはかなり長くなることがあるということでした。特にFCB疑似命令の場合には1バイトのデータあたり4バイト必要になります。

ということで、公開したバージョンではスキップ範囲指定の範囲を大きくとりすぎるとオペランドを格納するための文字列変数のサイズを超えてしまってプログラムが落ちてしまいました。(動作テストではそれほど大きな範囲を指定していなかったので気づきませんでした... ちなみに、スキップ範囲指定は100個まで可能なので、細かく分ければこのバグを回避できます。)

今回公開する修正版では、スキップ範囲指定の入力時に長さをチェックして32バイトを超えた場合は32バイトに制限することにしました。


指定範囲が32バイトを超えている場合は


32バイトに縮小される


動作している様子を示します。FCC,FCB疑似命令のオペランドが複数バイトになっています。

まず6809版です。

6809版のLst


6800版も同様です。

6800版のLst


Asmリストはそのままアセンブラに入力することができます。画像は6800版の例ですが6809版も同様です。

6800版のAsmリスト

修正版をOneDriveに上げておきます。


2021年9月1日水曜日

必要に迫られて自作したアセンブラ等のツールソフトの紹介

 6809用のクロスアセンブラやクロス逆アセンブラなどを紹介します

【10月2日追記】6800・6809逆アセンブラの修正版を10月2日にアップしました。

私は主に6809のプログラムを作成して楽しんでいますが、その中で必要に迫られて作成したいくつかのプログラムを紹介します。

基本的にWindows上でソースを作成し、自作したクロスアセンブラでアセンブルした後、生成されたバイナリを6809SBCなどの実機に転送して実行するという手順を踏んでいますので、必要なものは

(1)クロスアセンブラ、クロス逆アセンブラ

(2)実機への転送ツール

(3)ファイル形式の変換ツール

というわけで、10年ほどのあいだに6800用と6809用ののクロスアセンブラ、クロス逆アセンブラなどを制作してきました。(その他にも必要に応じて6801用、6303用のクロスアセンブラも作りました。)

プログラムのうちのいくつかは今までのブログで紹介してきましたが、その後もあれこれと修正を加えているものがありますので、ここでまとめて紹介します。

紹介するものは

(1)アセンブラ・逆アセンブラ

 6809クロスアセンブラ 6809AsmWin.exe とクロス逆アセンブラ 6809DasmWin.exe 

 6800クロスアセンブラ 6800AsmWin.exe とクロス逆アセンブラ 6800DasmWin.exe

(2)転送ツール

 転送ツールとして良く使用するのは仮想ドライブ構築ソフトです。それぞれのDOS(?)に合わせて4種類制作しています。

 Flex9用のFlexDrvWin.exe

 OS-9用のOS9DrvWin.exe

 F-BASIC3.0用のFBasDrvWin.exe

 CP/M-80用のCpmDrvWinFT.exeとCpmDrvWinRS.exe

(3)その他のツールソフト

 フロッピィディスクイメージの形式を変換するソフトとして CvtDskD77.exe

 バイナリファイルをBin, Hex, Mot形式に変換するソフト CvtMotHexBin.exe

以上のソフトのうち、CvtMotHexBin.exe以外はすべてVC++2019でビルドしています。


各ソフトの簡単な説明を加えておきます。

(1)クロスアセンブラ

 ファイルを選択して「アセンブル実行」ボタンを押すだけですが、エラーだけを表示する機能やワーニング表示を止める機能などがあります。結果の保存形式はLST, BIN, MOT, HEXがあります。特長としてはローカルラベル機能があります。この機能を有効にすると、例えばLOOPのようなよく使われるラベルを複数箇所で宣言できます。


6809クロスアセンブラ


(2)クロス逆アセンブラ
 元ファイルとしてはBINだけでなくMOT, HEXファイルも読み込めます。右端の「スタートアドレス」はBINでは$0000ですが、MOT, HEXの場合はその先頭アドレスが表示されます。「オフセットアドレス」は、逆アセンブルする先頭アドレスを移動させる場合に用います。先頭アドレスはスタートアドレスとオフセットアドレスの和になります。
ラベルはL_1234のようなアドレスの頭に「L_」がついた形になります。
特徴と言えるのは、データエリアと推測される個所を「スキップアドレス範囲」として指定することで、その範囲がFCBまたはFCCという疑似命令として扱われることです。どちらになるかは、範囲の先頭バイトが$20~$7Fの場合にはFCCに、それ以外の場合はFCBになります。(安直な区分けですが...)
保存形式はASMとLSTですが、ASMファイルはそのままアセンブラにかけることができる形式です。


6809クロス逆アセンブラ


(3)仮想ドライブ構築ソフト
 最初に制作したFlex9用を下に示します。ドライブ0~3にディスクイメージファイルを設定すればその内容が左下のボックス中に一覧表示されます。イメージファイル形式ですがD77(D88)形式だけでなくDSK形式(単純にセクタデータを順番に並べたもの)も読み込めます。このボックスにファイルをドラッグ&ドロップすればイメージファイル中に書き込まれます。ボックス中のファイルをマウスの左ボタンで選択して右ボタンでメニューを表示させることで、「読み出し」、「削除」、「名称変更」ができます。全ファイルを一気に読みだす場合はメニューの「編集」→「全ファイル読み出し」を用います。



FlexDrvWin.exe

 
 6809SBCやFM-7等のマイコン・パソコンとの間の通信経路を用意すればマイコン・パソコンから普通のドライブと同様に読み書きできます。下図は6809SBCのFlex9から読み出している例です。モニタのFLEXコマンドでFlex9を起動し、Flex9のCATコマンドを実行しています。上図の右のボックスはSBCから送られているコマンドをR/W,Drv,Trk,Sct形式で表示しています。


6809SBCとの通信の様子


他のソフトの例として、CpmDrvWin.exeの画面を下に示します。
表示・操作面はすべて同じようですが、内部ではもちろん、それぞれのFMS(ファイルマネージメントシステム)に合わせて処理されています。


CpmDrvWin.exe


(4)ファイル形式変換ソフト
(4-1)ディスクイメージファイル変換ソフト
 普段はディスクイメージファイルの中を見やすいDSKファイルを使うことが多いのですが、XM7やGOTEKのためにはD77形式に変換する必要があります。今まではそれぞれのDOS用に制作したコンソールソフトを使用していたのですが、不便なので全DOSに対応したフォームソフトを制作しました。トラック数が40か80かは自動判別しますのでどちらでも使えます。



D77, DSK, DAT間変換ソフト


(4-2)バイナリファイル変換ソフト
 Bin, Hex, Motファイル間の変換ソフトです。さらにFlex9のバイナリ形式にも変換できます。


Bin, Hex, Mot間変換ソフト


 以上のソフトは、必要に迫られてここ10年ぐらいの間に制作したもので、特にアセンブラや逆アセンブラは標準的な構造など全く知らないのに自己流で作ったものですが、自分にとっては結構役に立っています。(たまに動作がおかしいと思った時などには他のアセンブラなどの結果と比較することがありますが、現在の版では問題がないと思っています。)

一応、6800用ではMikbug9, Mikbug20, TL1, TinyBasic(電大版)などがアセンブルできることを確認してあります。GAMEⅢでは1文字を「'」ではなく「"」で囲むという標準ではない書き方が多数ありますのでそれを修正(#”A”→#'A')する必要がありました。

6809用ではASSIST09のリストのミス(CPX→CMPX)と4箇所の#'(sp)を#'(sp)'のようにスペース後の「'」を追加することでアセンブルできました。

これらをOneDriveに上げておきますので、もし使用してみて動作がおかしいということがありましたらご一報いただけると有難いです。

【10月2日追記】6800/6809逆アセンブラの修正版を10月2日にアップしました。