------------------------------------------------------------------------- 名称 DA61 : HD61700 DISASSEMBLER for Win32 (Rev 0.25) 動作環境 Win95/98/98SE/NT4/2000/XP/VISTA/7/8/10 制作者 あお(QZE12045@nifty.com) URL http://hd61700.yukimizake.net/ ------------------------------------------------------------------------- ■DA61とは HD61700用逆アセンブラです。 シンボルラベルの自動生成機能を持つので、JUN AMANO氏のBinToPbf.BAS及び、 添付のBin2AI.B/Bin2PB.B/Bin2VX.Bと組み合わせることで、それなりに使えると思います。 フリーソフトです。添付のSymbol.hを含め好きに使ってください。転載も自由です。 (そのかわり無保証ですが) #最近は逆アセンブラと言うより、コンバータに近くなってきました。 ■特徴 (1)HD61のサポートする全ての命令が逆アセンブル可能です。 (2)以下の拡張子を持つフォーマットを読み込むことが可能です。 .PBF(PBFファイル) .BAS(BASIC DATA文形式) .HEX(PJ HEX形式) .TXT(ASCII形式 アドレス/チェックサムなし) .BIN(バイナリファイル) .BMP (Windowsビットマップファイル--モノクロ(2色)画像のみ対応) (3)Nパス方式によるJR/JP/CAL命令ラベル解析及び、LDW/PRE命令に対する データエリア解析を行えます。 (/S /Dオプション指定にて実行) 解析により出力されるラベルフォーマットは以下の通りです。 START ---- 実行開始アドレス LBL* ---- JR/JP命令利用ラベル MDL* ---- CAL命令利用ラベル DAT* ---- LDW/PRE命令利用データラベル (* --- 該当ラベルの定義された番地) (4)DA61と同じフォルダにsymbol.hと言う名称のファイルがあると、 そこからシンボル情報を読み込むことが出来ます。 (システム用の固定リソース等を逆アセンブル結果に反映できます) 書式は、HD61のEQU命令と同じです。 疑似命令として、#if~#else~#endifが使えます。 Symbol.h読み込み中にエラーが発生した場合、以降のシンボル情報の 読み込みを中止して、逆アセンブルを開始します。 (5)上記/S,/Dによる解析にて判明したエリアは、DB命令フォーマットのリストを 自動生成します。この機能により、ソースを無くしてしまった実行ファイルも、 ほぼ自動で修復することが可能となります。(ダメな時もあります) (6)読み込んだファイルを各種フォーマットに変換する事が可能です。 サポートする出力フォーマットは、以下の通りです。 ・PBF形式(BAS/HEXからの変換に利用下さい) ・BAS形式(PBF/HEXからの変換に利用下さい) ・QL形式(クイックローダ形式:後述) ・バイナリ形式(BIN) ・ビットマップ形式(BMP) ・DB形式(アセンブラのDB命令形式です) ・PJ HEX形式(PJ誌掲載 HEX形式) ・INTEL HEX形式(8ビット) ■アーカイブ内容 Readme.txt --- このファイルです Bin2AI.b ----- AI-1000用BIOS吸い出し処理(BASIC+マシン語) Bin2PB.b ----- PB-1000用BIOS吸い出し処理(BASIC+マシン語) Bin2PBC.b ---- PB-1000C用BIOS吸い出し処理(BASIC+マシン語) Bin2FX.b ----- FX-870P/VX-4用BIOS吸い出し処理(BASIC+マシン語) Bin2VX3.b ---- VX-3用BIOS吸い出し処理(BASIC+マシン語) bin.s ----- 上記BIOS吸い出し処理マシン語ソース DA61.exe ----- HD61700逆アセンブラ実行ファイル QL.zip ----- クイックローダ本体(PB-1000/C、FX-870P/VX-4、AI-1000、VX-3用) Symbol.h ----- シンボル定義ファイルサンプル(PB-1000/PB-1000C/AI-1000/FX-870P/VX-4用) ■起動方法 Windowsのコマンドプロンプトで以下を実行します。 >DA61 [ファイル名.拡張子] [オプション(/S /D /M /LV0 /W /NC /B /DB /BMP /MONO /P /BAS /Q /PJ /HEX /NTAB)省略可][Enter] 実行すると逆アセンブル結果を.lstファイル(または変換結果を.pbf/.bas/.bin/.bmp/.ql/.hex/.hx)に出力します。 ■入力ファイル形式 以下のフォーマットが利用可能です。 .PBF(PBFファイル) .BAS(BASIC DATA文形式) .HEX(PJ HEX形式) .TXT(ASCII形式 アドレス/チェックサムなし) .BIN(バイナリファイル) .BMP (Windowsビットマップファイル--モノクロ(2色)画像のみ対応) 各ファイル形式は、拡張子名で判別されるため、間違った名称では正しく読み込めません。 (不明ファイルは、バイナリ形式(*.bin)で扱われます) 各ファイル形式と拡張子名は、以下の通りです。 (1) *.PBF --- PBF形式。HD61/BinToPbf出力形式です。 全てのアドレス情報を持つため、/ADR指定は不要です。 (2) *.BAS --- BASIC DATA文形式(16進2桁 チェックサム付) BASIC DATA文形式です。 1000 DATA D162389377AB02D6,F8 1010 DATA 40D512D600D402D6,A9 : アドレス情報を持たないため、/ADRオプションで [開始アドレス] [実行アドレス] の順で アドレスを指定してやる必要があります。 例) DA61 sample.bas /s /adr 0x7000 0x7018 (3) *.HEX --- PJ HEX形式(アドレス/16進2桁 チェックサム付) PJ HEX形式とは、以下のようなPJ誌に掲載されているHEX形式を指します。 アドレス/データ/チェックサムの区切りは、コロン[:]または、カンマ[,]、スペースが使えます。 2A65 6200C0D6001C2E77,B9 2A6D 7C2AD16200FFD600,AE : /ADRオプションで [実行アドレス] を指定することが可能です。(/ADR 省略も可能です) 例) DA61 sample.hex /s /adr 0x7018 (4) *.TXT --- ASCII形式(アドレス/チェックサム無し) TXTは、以下のようにデータ内容がASCII形式になっているファイルです。 データのみで、アドレス/チェックサム情報は持っていません。 40D512D600D402D6 20E502D8D6409513 : D600E602D620F702 /ADRオプションで [開始アドレス] [実行アドレス] を指定してやる必要があります。 例) DA61 sample.txt /s /adr 0x7000 0x7018 (5) *.BIN --- バイナリ形式 上記(1)~(4)は、ASCII形式ですが、バイナリ形式はメモリデータそのものです。 データのみで、アドレス/チェックサム情報は持っていませんので、 /ADRオプションで [開始アドレス] [実行アドレス] の順でアドレスを指定してやる必要があります。 例) DA61 sample.bin /s /d /adr 0x7000 0x7018 (6) *.BMP --- ビットマップ形式 Windowsビットマップ画像形式です。 パソコンで作成した画像をPBFフォーマットに変換してポケコンで利用する事ができます。 読み込みはモノクロ(2色)フォーマットの画像のみ可能です。 読み込める画像サイズに特に制限はありませんが、CASIOポケコンでの利用を考えると、 192×32または、192×64のいずれかで運用するのが最も便利でしょう。 一応、OS2形式も対応していますが、あまり試験していないので、なるべくWindows形式の BMP画像を利用してください。(Photoshop Elementsで作ったOS2形式のBMPでのみ確認) /ADRオプションで [開始アドレス] [実行アドレス] を指定することが可能ですが、 省略してもエラーとはなりません。(アドレス省略時は0番地から格納されます) ■オプションの説明 (1)逆アセンブル用オプション /S ---- 実行開始アドレスが指定されている場合、そのアドレスから 命令解析を開始します。 /D ---- 上記/Sオプション指定時にLDW/PRE命令に対するデータエリア 解析を実施します。 (/D単独では使えません。/Sと併用する必要があります) /M ---- 1パス目で検出したMDLラベルアドレスを命令のデコードより優先します。 動作としては2パス目以降、命令語長内のアドレスに1パス目で検出したMDL*ラベルが ある場合、命令のデコード(逆アセンブル)を中断(DBに置換)して、MDLラベル以降の 逆アセンブル動作を再開します。 説明:データとコードが混在するプログラムの場合、データ領域を逆アセンブルして しまう等の誤った解析が発生する場合に、MDLラベル解析結果を優先することで データに埋もれた 実行コードを掘り出します。 /S、/Dオプションと併用かつ、/mオプション有り/無しの結果を比較して隠れた コードを探すといった、補助的な使い方を想定しています。 /LV0 --- 最適化レベルを0に戻して、特定インデックスレジスタ(SX/SY/SZ)表示に切り替えます。 デフォルトは、SX=$31、SY=$30、SZ=$0 固定にて表示されます。 /W ---- 16ビットアドレッシングにて逆アセンブルします。 内蔵ROMイメージ用オプションです。 /NC ---- 逆アセンブル時にアドレス及びコードの出力を行いません。 ソースのみ出力します。(ソース修復専用です) /NTAB -- リスト出力にTABを使用しません。デフォルトはTAB=8で出力されます。 (Rev 0.10以降対応) 解析アルゴリズムはかなり適当なものなので、正確にコードエリアとデータエリアを 分離できるとは限りません。上手く行かない可能性も多くあります。 特にBIOS内の処理の様な命令コードとデータエリアが混在するコードには/Dオプションは 全く使えないと思った方が良いです。 (2)データ変換用オプション /P ---- 入力されたファイルをPBF形式で出力します。 /BAS --- 入力されたファイルをBAS(BASIC DATA文)形式で出力します。 /Q ---- 入力されたファイルをQL(クイックローダ用)の形式で出力します。 /DB ---- 入力されたファイルをDB命令フォーマットで出力します。 /NCオプションとの併用が可能です。 /B ---- 入力されたファイルをバイナリ形式で出力します。 出力されるファイルの拡張子は.binとなります。 /BMP (開始アドレス) ---- 入力されたファイルをビットマップ形式(192×32/192×64)で 出力します。出力されるファイルの拡張子は.bmpとなります。 /bmp [開始アドレス] とすると、その物理アドレスからビットマップを作製します。 開始アドレスは、10進数または16進数(先頭に0xを付ける)指定が可能です。 画面のスクリーンショット等を撮るのに使ってください。 (例)>DA61 Graphic.pbf /bmp 0x7010 /MONO (開始アドレス) ---- 入力されたファイルをビットマップ形式(192×32/192×64)で 出力します。出力されるファイルの拡張子は.bmpとなります。 /BMPとほぼ同じ動作ですが、出力される画像がLCD画面風になります。 (スミマセン。パレット色はかなり適当です。) /PJ ---- 入力されたファイルをPJ HEXフォーマット(拡張子.hex/.hx)で出力します。※ /HEX --- 入力されたファイルをINTEL HEXフォーマット(拡張子.hex/.hx)で出力します。※ ※入力ファイルの拡張子が.hexだった場合、出力ファイルの拡張子を.hxとします。 これらデータ変換用のオプションを選択すると、逆アセンブルは行わず終了します。 また、データ変換用オプションを複数指定した場合、最後に指定したオプションのみ有効となります。 (3)アドレス指定用オプション /ADR (アドレス1) (アドレス2) ---- BAS/HEX/BIN/TXT形式のファイルを読み込むときに、 逆アセンブル開始アドレス/実行開始アドレス等を指定します。 入力がPBFファイル時には無視されます。 ■クイックローダ(QL)形式ファイルについて オプション /Q にて生成される*.ql形式のファイルは、添付の高速ローダサブルーチンにて利用 可能な形式です。この高速ローダはDEFCHR命令を使って高速に読み込むので通常のDATA文による 読み出しの10倍程度高速にロードすることが可能です。(BIN2ai.b/BIN2pb.b/BIN2fx.b/BIN2vx3.b で使っているのと同じ方法です) 以下の手順で利用下さい。 (1)HD61 にて/p オプション付きでアセンブルしてPBFファイルを作製する。 (2)DA61 [pbfファイル名] /q [Enter] として、QL形式のファイルに変換します。 (*.qlファイルが出力されます) (3)作製したファイル内容に添付のQL.aip内のQLpb.b(PB-1000/C用)/QLfx.b(FX-870P/VX-4用)/ QLai.b(AI-1000用)/QLvx3.b(VX-3用)の内容をヘッダとして張り付けて、BASICサブルーチンと して利用します。 (4)任意のプログラムから、GOSUB900を実行すると、目的のエリアにマシン語がロードできます。 注意:本ローダはマシン語エリアのチェックを全くしないので、あらかじめ目的のエリアが マシン語用に確保されていない場合の動作は保証されません。(多分、暴走します) よって本ローダを利用する場合は、ロード前にあらかじめエリアのチェックをするか、 BASICシステムが未使用の領域(CALC/FDDBF等)に対してのみ、適用するようにして下さい。 また、LCD画面エリア先頭(24バイト)を利用しますので、そのアドレスに対するロードは 利用できません。 LCD画面アドレスに対するロードを行いたい場合は、上記24バイトのアドレスを避け、 かつ、980行のCLS命令を削除して利用してください。(少々不便でスミマセン) ■Bin2PB.b/Bin2PBC.b/Bin2FX.b/Bin2AI.b/Bin2VX3.bの使い方 FX-870P/VX-4、PB-1000/C、AI-1000、VX-3用のBIOS及びRAM内容を吸い出すプログラムを作ってみました。 BANK0、BANK1の任意のアドレスをPBF形式でRS232Cに出力します。 DA61と併用して解析等にご活用下さい。 実行方法(PB-1000C/PB-1000) Bin2PB.b --- PB-1000用 Bin2PBC.b -- PB-1000C用 (1)RS232C通信パラメータを設定(9600,N,8,1) (2)PBDCを受信状態で待機。 (3)Bin2PB.b/Bin2PBCを実行すると、開始、終了、実行アドレスを聞いてくるので、 それぞれ以下のように入力します。 START ADR=&H8000[EXE] END ADR=&HFFFF[EXE] EXEC ADR=&H8DE2[EXE] (4)入力完了すると、データ送信を開始します。 (5)送信完了にてComplete!を表示して、BEEP音をならして終了します。 10行目のPOKE文を有効にすると、&H8000~指定時にBANK1(RAM)の内容を吸い出します。 実行方法(FX-870P/VX-4) (1)PBDCのRS232C通信パラメータを設定(9600,N,8,1) (2)PBDCを受信状態で待機。 (3)Bin2FX.bを実行すると、開始、終了、実行アドレスを聞いてくるので、 それぞれ以下のように入力します。 START ADR=&HC00[EXE] END ADR=&HFFFF[EXE] EXEC ADR=&HEBB[EXE] (4)入力完了すると、データ送信を開始します。 (5)送信完了にてComplete!を表示して、BEEP音をならして終了します。 25行目のPOKE文を有効にすると、BANK1(RAM)の内容を吸い出します。 (POKEするパラメータを変更すると各BANKをアクセスします。 例:BANK1=&H10、BANK2=&H20、BANK3=&H30) 実行方法(AI-1000) (1)PBDCのRS232C通信パラメータを設定(9600,N,8,1) (2)PBDCを受信状態で待機。 (3)Bin2AI.bを実行すると、開始、終了、実行アドレスを聞いてくるので、 それぞれ以下のように入力します。 START ADR=&HC00[EXE] END ADR=&HFFFF[EXE] EXEC ADR=&HD80[EXE] (4)入力完了すると、データ送信を開始します。 (5)送信完了にてComplete!を表示して、BEEP音をならして終了します。 25行目のPOKE文を有効にすると、BANK1(RAM)の内容を吸い出します。 (POKEするパラメータを変更すると各BANKをアクセスします。 例:BANK1=&H10、BANK2=&H20、BANK3=&H30) 実行方法(VX-3) (1)PBDCのRS232C通信パラメータを設定(9600,N,8,1) (2)PBDCを受信状態で待機。 (3)Bin2VX3.bを実行すると、開始、終了、実行アドレスを聞いてくるので、 それぞれ以下のように入力します。 START ADR=&HC00[EXE] END ADR=&HFFFF[EXE] EXEC ADR=&HEB2[EXE] (4)入力完了すると、データ送信を開始します。 (5)送信完了にてComplete!を表示して、BEEP音をならして終了します。 25行目のPOKE文を有効にすると、BANK1(RAM)の内容を吸い出します。 (POKEするパラメータを変更すると各BANKをアクセスします。 例:BANK1=&H10、BANK2=&H20、BANK3=&H30) ■ 参考文献 1. 「KC-Disasembler」 こたちゃん氏 ポケコンジャーナル1990/8 2.「X-Assembler Ver.6」N.Hayashi(はっくん)氏 ポケコンジャーナル 1995/2 (Symbol.hは、FX-870P.SRCを元に作成しました) 3. 「バイナリファイル←→テキスト変換プログラム」 JUN AMANO 氏 (「CASIO PB-1000 Forever!」 URL: http://www.lsigame.com/) 4.「HD61700未公開命令の解析(PSR/GSR/GFLW/GPOW 他多数)」Miyura氏 2006/8 5.「HD61700未公開命令の解析(JP($)/LDL/LDLW/LDLM)」Piotr Piatek氏 2006/9 6.「HD61_DIS.EXE」Piotr Piatek氏 2006/9 ( http://www.pisi.com.pl/piotr433/index.htm ) 7.「IB(旧TS)レジスタの解析」Miyura氏/Piotr Piatek氏 2007/2 8.「HD61700DASM」HD61700逆アセンブラ YKS氏 2020/9 (「CASIO PB-1000 Forever!」 URL: http://www.lsigame.com/) ■あとがき HD61開発も一段落して、命令デコード処理の習作およびシステム解析用として作ってみました。 一応、ソースコードも公開しておきますので、好きなように改造してみてください。 ( http://hd61700.yukimizake.net/ ) と言うわけで、ほとんど出番がないツールかと思いますが、皆さんのお役に立てれば幸いです。 @あお 2007/02/25 追記。 Miyuraさん及び、Piotr氏によりIB(旧TS)レジスタの機能が判明したのを受け、DA61、HD61共に 修正いたしました。今回の修正でHD61700のニモニックは、ほぼ確定したと考えています。 2020/09/19 追記。 HD61700逆アセンブラの新作がYKS氏により「CASIO PB-1000 Forever!」で公開されました! Win32ネイティブでかつGUI対応と言うことで使ってみたところ非常によくできており、かつ なんとDA61のバグ(HD61の反映漏れ)まで見つけてしまいました。(おぃ) という訳で個人的に解析で利用していたRev.24と併せてRev.25として修正しました。 ■ 履歴 Rev : 0.01 2003.04.09 最初のバージョン(JR/JP/CAL命令を対象にラベル出力付きで動作) Rev : 0.02 2003.04.10 CAL命令にて呼ばれたラベルをMDL*として格納する様に修正。 命令解析処理の強化。LDW,PRE命令ラベル解析に対応。 Rev : 0.03 2003.04.14 シンボルの読み込み機能を強化(#if~#else~#endifサポート) BIOS読み出し用処理(Bin2PB.b/Bin2VX.b)を添付開始。 Rev : 0.04 2003.04.15 バイナリ出力機能を追加。(/Bにて指定) (って何に使うんでしょう?) Rev : 0.04a 2003.04.20 PB-1000修理完了記念。(おい) Symbol.hファイルを更新。 #DA61.exeは変更していません。 Rev : 0.05 2003.04.22 /NCオプションによるソース出力を追加。 /Sオプション単体動作を改良。 データ部が先頭にある場合にデータ出力できるようにした。 Rev : 0.06 2003.04.26 TS(未公開:タイマ制御系レジスタ?)を追加(PST/GST命令にて有効) Rev : 0.07 2003.05.21 ビットマップ出力用に/BMPオプションを追加。 DB命令フォーマット出力用に/DBオプションを追加。 Rev : 0.08 2003.05.23 入力ファイル形式の追加。(.bas/.hex/.bin/.txt) /ADRオプションをサポート。PBF出力を追加。(/pオプション) Rev : 0.09 2003.06.29 /BAS /Qオプション追加。それぞれBAS、QL形式出力をサポート。 クイックローダ(PB-1000/C,FX-870P/VX-4用)を添付開始。 Rev : 0.10 2003.07.25 BMP(モノクロ2色)形式読み込みをサポート。 /BMP指定時に入力データサイズに従って出力サイズ(192×32/192×64)を 切り替えるようにした。 リストをTAB=8指定で出力するようにした。 従来通りのリスト出力用に/NTABオプションを追加。 コマンドラインオプション指定時の怪しい動作を修正。 Symbol.hにAI-1000用のシンボル定義を追加。 BIN2ai.b(BIOS DUMP)、QLai.b(クイックローダ)を添付開始。 Rev : 0.11 2003.07.26 BMP形式読み込み処理の改良。きちんとパレットを比較するようにした。 OS2/BMP形式の真面目な対応。(それでも怪しい?) Rev : 0.12 2003.07.29 コマンドライン処理をさらに修正。 .BAS/.TXT/.HEXファイル入力時の終了アドレスを補正(-1)。 Rev : 0.12a 2003.08.07 Symbol.hのAI-1000用定義を一部修正/追加。 #DA61.exeは変更していません。 Rev : 0.13 2003.10.26 BMP読み込み時にバッファオーバーを起こす場合があるのを修正。 BMP出力時にLCD画面風の色合いで出力できるモードを追加(/mono指定) Symbol.hのPB-1000/C/FX-870P(VX-4)/AI-1000用定義を修正/追加。 #実は、Symbol.h更新の方がメインかも? Rev : 0.14 2003.11.21 /pj(PJ HEX形式出力)および、/hex(INTEL 8bit HEX形式)出力を追加。 INTEL HEXの読み込みは、あまり需要がなさそうなので今回は入れていません。 Rev : 0.14a 2003.11.28 VX-3対応。Bin2VX3.b/QLvx3.bを添付開始。Symbol.hにVX-3記述を追加。 Rev : 0.14b 2003.12.03 QLvx3.bを一部修正。(スミマセン) #DA61.exeは変更していません。 Rev : 0.15 2006.06.10 バグFix版。 特定の解像度のビットマップ(bmp)しか読み込めなかったのを修正。 Symbol.h読み込みを逆アセンブル出力時以外は禁止にした。 /db出力を修正。その他細かいバグ修正。 Symbol.hを更新。(6/24) Rev : 0.15a 2006.07.23 Symbol.hを更新。英語版のドキュメントを添付。ソースコードを公開。 Rev : 0.16 2006.07.28 PBF,BAS,QL出力時にバイナリ指定だったのを修正。 シンボルラベル自動生成時の名称を、通し番号からアドレスへ変更。 DOS用のコンパイルオプションを追加。 Rev : 0.17 2006.08.05 ビットマップ読み込み処理を修正。 Rev : 0.18 2006.08.28 未公開命令を追加。 (PSR/GSR系、LDC系、SNL系、ST IM8,$、TRP IM8) 特定レジスタ( $(SX/SY/SZ) )表示に対応。 オプション(/lv0)にて切り替え可能です。 Rev : 0.19 2006.09.04 オペコード(DFH) JP ($)に対応。 従来のJP ($) は、JP $ へ変更となります。 Rev : 0.20 2006.09.09 SNL命令の動作が判明した(LCDデータ読みだし)ため、ニモニックを修正。 SNL --> LDL(LoaD data from Lcd) Rev : 0.21 2006.09.29 /Wオプションを追加。16ビットアドレッシングに対応。 Rev : 0.22 2006.11.06 細かいバグを修正。(特定のラベル演算で発生) Rev : 0.23 2007.02.25 レジスタ名称を修正(TS→IB) Rev : 0.24 2008.05.25 /Mオプション追加。シンボルラベル解析処理の改良。 逆アセンブルした命令語中にMDL*ラベルがある場合、該当ラベル直前 までのコードをDB命令に変換し、該当ラベル以降、逆アセンブルを 再開するよう処理を修正しました。(BIOS解析等の補助用です) Rev : 0.25 2020.09.19 命令コード(0xD2~0xDB)に対しJump拡張を禁止。 (DIDM,DIUM,BYDM,BYUM,INVM,CMPM)