[FM]FULLMSX for BLOG

詳しいMSXパソコンなどの情報はホームページで!
https://fullmsx.web.fc2.com/

MSXマシン語適当講座 Hello,World! マシン語モニタで入力

2011-11-15 00:23:26 | MSXマシン語適当講座

 今回はマシン語中級向けの話になります。ちょっと説明が難しいかもしれません。
でもわかれば、もっと広くPCを使えるようになります。
MSXBASICでは配列変数ができるといろいろな事ができます。

今回はSUPER-Xを使っていきます。
SUPER-Xは裏RAMにプログラムがありますから、
普通にBASICを使う場合はラクに使うことができます。
前回のデータエリアの話に続いてマシン語のデータ構造の説明をちょっとだけします。
これから、データエリアのことも話すのでここまでしておきます。
マシン語には配列変数はありませんので作ります。(え?)
「Hello,World!」はマシン語モニタで指定したアドレスから文字を入れます。
 ですから、Hello,World!は12文字ですから文字を入れたアドレスから+0Chまでが
データの範囲(領域)になります。
改行コードの「¥n(13)」まで表示させます。これで文字の長さを変えることができます。
いろいろな文字をメモリに入れて最後にコード13を入れるとRET Zで終わりにします。

ORG 0D000h
(アセンブラの擬似命令)

LD HL,0D200h
 (D200hがデータが格納されているポインタになる)
LD A,(HL)
 (0D003Hになる。)
CP 13
 (0DH=CR)
RET Z
 (CPが13になるとZ=1で、RETになる。) 
CALL 00A2h
 (BIOSコールCHPUT、キャラクタプット)
INC HL
 (文字データのアドレスを+1加算)
JR F6H
 (SUPER-XではJR 0D003H)

HLレジスタを使ってみましたが、HLが入ればメモリ操作という感じで
わかりやすくなった気がします。次にマシン語モニタで文字を入れていきます。
なお、今回からはJPではなくJRを使います。好きなアドレスにロードしてみてください。
JR F6Hと調べる必要がありましたが、SUPER-Xを使えばJR F6Hではなく、
JR 0D003Hと実アドレスで表示してくれます。

しかも、ワンラインアセンブラでJR命令を使うとF6Hとコード化します。
ということはアセンブラでJPを使っていたところを
JRに書き換えれば1バイト節約できますね。(おい)
「Sherryさんたちが、SHEM開発のときにJR命令がボソボソ言っていたのは」
「これだったのかな。こういう機能を入れようかとか言ったような気がする。」

D200hからA D200で「Hello,World!」と入れ、ダンプでD20Chに0D(13)を入れます。
BASICの場合はPRINT HEX$(PEEK(&HAD200))になります。アドレスの数値を16進数へ変換しています。

「なぜDEFを使わないか」と言うと、仮にアセンブラで使って逆アセンブラをかけるとプログラムが化けます。
これはDB命令などは擬似命令といいメモリに文字、数値を書き込むためです。
この書き込んだ文字がソースの途中からアセンブラニーモニックに化けて読みづらくなります。
逆アセンブラには擬似命令はありません。

プログラムが完成しましたら、
動作しなくなること(暴走)がありますからBSAVEします。
GコマンドでG D000または

BASICで
DEFUSR=&HD000:A=USR(0)
で実行します。
Hello,World!
Ok
となります。では、マシン語モニタのダンプに戻り0Dを0Eに書き換えます。
書き換えるアドレスがわかればBASICではPOKE &H<アドレス>,0Eになります。


A=USR(0)
を実行しますと、意味不明な文字が表示されました。
このように、0Dを忘れると次の0Dまで表示してしまいますね。

実はこれがPCのバグの正体でもあります。
「ゲームのバグはおそらく終了コードがなく次のコードに行ってしまったために
たまたまの大バグだったのでしょう。」
「また、宇宙船の操作パネルをずれて調べるとバグるのは宇宙船の操作パネルの位置を
メーカー側が修正したのに以前の定義した座標の判定が残ってしまったものだろうと思います。」
こんなふうにフェイルセーフしていないとPCが動かなくなってしまうのがマシン語の怖いところです。
MSXBASICでマシン語を実行するとマシン語を間違えればリセットがかかりますが、
無限ループになったり、不可解な文字などが発生してリセットすることにもなります。

Windowsはエラーが発生すると直ぐにスレッドを停止してアプリを閉じたり応答がありませんと出ます。
先読みをしてエラーがないかをチェックします。

バグがあっても途中から復帰するゲームはなかなかのプログラマと思いますね。
しかしバグったデータが残ったりして不具合になるリスクもあるので、
まぁリセットにもっていくのが賢明でしょう。

今回はデータエリア(プログラムのワークエリア)に文字を入れて遊んでみました。
条件つきRETも初めて使いましたが、安心してBASICに戻ることができました!

最後に1chipMSXをモニタしているとMSDOS5という文字列が見つかりました。
何でしょうか、調べてみるとおもしろいかもしれません。

プログラムが完成しましたら、
動作しなくなること(暴走)がありますからBSAVEします。

「どうもこの講座はうますぎる」と思う方もいますが、
まだ、これでも序の口(え?)ですから、
まぁ一人でも多くの方にZ80のアセンブラをなんとなく知ってもらうためです。
MSXシステムとなるとソースを見ても何をやっているのかサッパリというのが本音です。
でもマシン語の基本が少しわかれば、カンタンにマシン語にできるか、できないかという
プログラムの特性がわかると思います。
いろいろと改良したり手を加えるならBASICでいい部分も多くあります。

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする