最近は PC-88・PC-98 に関連する
プログラミングをすることが多いので
その絡みでふと思いついた事が。
「N88-BASIC でバイナリセーブされた
プログラムファイルを、そのままの形で
確認できたら便利かも~!」
SAVE 命令で普通に保存されたものは
バイナリ形式となっているので
テキストエディタでは開けません。
バイナリエディタで中を覗いても
所々に変数名などが見えたりするだけで
他の部分は意味不明な状態😅
これをアスキーセーブすることなく
そのまま解読できたら便利だっ!
てことで、昔の書籍を引っ張り出して
HSP3 を使ってプログラミング開始♪
その途中経過を簡単にご報告です。
ゲーム記事じゃなくてごめんなさい🙏
まずは中間言語の情報を取得
本棚から取り出してきた書籍の中の1冊
『PC-Techknow8800 Vol.1』を見ると
入力された BASIC のプログラムは
中間言語という形に変換されて
メモリへ格納されていることが判明。
SAVE 命令で保存されたファイルは
その中間言語が格納されている
メモリをそのままの形で保存した
バイナリ形式になっているので
ぱっと見では中身が全然わかりません。
BASIC 命令と中間言語コードの
簡易対応表を出力するプログラムが
『PC-Techknow8800 Vol.1』に
掲載されていたので早速入力して実行!
おおー!次々と命令&中間言語コードが
表示されていきました♪
これがあればコード解析の半分近くは
一気に行えるではないか~😆
てことで次は実際の中間言語格納先
メモリを覗いてみることにしました。
テキストRAMの先頭を確認
MON 命令で機械語モニタに入り
まずは O70,0 を実行します。
こうすることで BASIC ROM と重なる
中間言語が格納されたテキストRAM を
&H8000~&H83FF 部分に映せます。
O70,0 で 0 を指定しているので
映し出すのは &H0~&H03FF の範囲。
必要であれば 0 の部分を変更して
ここに映し出す範囲を変えます。
実際に出力してみたテキストRAM 。
&H8001 からがプログラム本体です。
一部そのまま読み取れる文字列が
右側に表示されているのですが
それらはコメント部分、変数名、
ラベル名などとなっています。
命令などは先にプログラムで取得した
中間言語コードに変換されているので
元のソースを見比べなければ
どうなってるかわかりませんね😅
それでは先頭の4行だけ覗いてみます。
次の項でわかりやすく抜き出しました。
少しだけ解読してみた!
リンクポインタ
+0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 0123456789ABCDEF
0000 00 09 00 64 00 3A 8F E9 00-3A 00 6E 00 3A 8F E9 ...d.:...:.n.:..
0010 2D 2D 2D 2D 2D 20 4E 38 38-2D 42 41 53 49 43 20 ----- N88-BASIC
0020 4B 65 79 20 57 6F 72 64 20-4C 69 73 74 20 2D 2D Key Word List --
0030 2D 2D 2D 20 5B 20 31 20 5D-00 42 00 78 00 3A 8F --- [ 1 ].B.x.:.
実際の番地に合わせて取り出した
プログラムの先頭 64バイトです。
プログラムは &H0001 からなので
そこからの 2バイトを確認。
ここはリンクポインタというもので
次の行が格納されている先頭番地です。
今回の場合「09,00」となっているので
&H0009 からが次の行となります。
行番号
+0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 0123456789ABCDEF
0000 00 09 00 64 00 3A 8F E9 00-3A 00 6E 00 3A 8F E9 ...d.:...:.n.:..
0010 2D 2D 2D 2D 2D 20 4E 38 38-2D 42 41 53 49 43 20 ----- N88-BASIC
0020 4B 65 79 20 57 6F 72 64 20-4C 69 73 74 20 2D 2D Key Word List --
0030 2D 2D 2D 20 5B 20 31 20 5D-00 42 00 78 00 3A 8F --- [ 1 ].B.x.:.
次の 2バイトは行番号の数値。
「64,00」となっているので
16進表記で &H0064 。
10進数にすると 100 となります。
実際の BASIC プログラムでは
「100 ‘」と記述されているので
100で合っていますね。
REMと省略形
+0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 0123456789ABCDEF
0000 00 09 00 64 00 3A 8F E9 00-3A 00 6E 00 3A 8F E9 ...d.:...:.n.:..
0010 2D 2D 2D 2D 2D 20 4E 38 38-2D 42 41 53 49 43 20 ----- N88-BASIC
0020 4B 65 79 20 57 6F 72 64 20-4C 69 73 74 20 2D 2D Key Word List --
0030 2D 2D 2D 20 5B 20 31 20 5D-00 42 00 78 00 3A 8F --- [ 1 ].B.x.:.
次の 1バイトは &H3A 。
これは文字コードとして扱うので
「:」コロンとなります。
色々試した結果、REM の省略形である
「’」アポストロフィを書くと
自動でコロンと REM の中間言語コードが
入るようになっているみたいです。
でもこのコロンは LIST では非表示。
続く &H8F が REM の中間言語コード、
&HE9 が「’」の中間言語コードです。
最後の &H00 で行の末尾となり
次が最初に取得したリンクポインタの
番地 &H0009 となりますね。
次の行も同じようにして解読していくと
リンクポインタが &H003A、
行番号は &H006E = 110 。
110行もコメント行なので 3A,8F,E9 。
その先に「—– N88-BASIC …」と
コメント文が続いています。
このような感じで中間言語を解析する
プログラムを HSP3 で開発開始♪
HSP3でプログラミング開始!
先ほど抜き出した部分には
コメント行しかありませんでしたが
その先にはプログラムが続いています。
バイナリセーブされた
N88-BASIC のソースファイルを
HSP3 で開いて解析処理開始!
リンクポインタ、行番号、中間言語
の順番で 1行ずつ解析を繰り返し
プログラムをテキストに復元して
表示するものを作ります。
ある程度仕上がってきた
開発途中のバージョンがこちら。
左側が元となるバイナリファイルで
右側が解析結果のテキストです。
まだ一部の中間言語コードには
完全に対応しきれていないため
表示できないプログラムもありますが
かなりいい感じではないでしょうか♪
N88-BASIC のコンバータが完成したら
次は N88-BASIC(86) 版も開発予定!
PC-88&98 の BASIC で作ったものは
自分もたくさん所有しているので
仕上がればかなり便利そうです。
今はわざわざアスキーセーブしないと
中を見ることができませんからねぇ。
といったところで今日はおしまい!
ゲームとは全く関係ない記事でした。
これを早く仕上げないと
落ち着いて遊ぶこともできないなぁ😅
それではまた明日の記事で♪
ポチッと応援してもらえたら嬉しいな♪
コメント