MSXマシン語適当講座その2

前へもどる>mon.html



マシン語は誰でもプログラムできます!体験してみてください。

 やってみましょうZ80マシン語 初心者でマシン 語を始めたい人向けです

 MSXマシン語適当講座その1 マシン語からBASICの変数を取得、LD、CALL、INC

 *MSXマシン語適当講座その2 SUPER-X、実行、アセンブラ、ソースを書く

 MSXマシン語適当講座その3 一時的にレジスタを使う、フラグ、レジスタ、転送

 MSXでマシン語BASIC 中級編 ハンド アセンブルから開発環境の話題です。

前回はMSXBASICでマシン語プログラムを書き込んでみました。
今回からSUPER-Xというツールを使ってメモリからプログラムを見てみます。
体験版の後編です。これからは16進数を使います。
マシン語モニタの基礎知識を勉強します。

16進数については
basic/hexa.html

■SUPER-Xのダウンロード

マシン語モニタアセンブラ'SUPER-X'をダウンロードします。
http://applekid.at.infoseek.co.jp/super-x.html

※Webサービスが終了したことで
SUPER-Xのダウンロードできません。
FULLMSXサイトではモニタアセンブラを制作中です。
以下のリンクからダウンロードしてください。

命令セット一覧:Z80マシン語
mon.html

■SUPER-Xをインストールする

MSXBASICの起動画面で

BLOAD"SUPER-X.LDR",R

を実行すると

SUPER-X version 1.2
Copyright 1994 by Romi
Ok

となります。


SUPER-X.BATがある場合はMSX-DOSで
A>SUPER-X
と実行できます。

■SUPER-Xを実行する

インストールが終わったら
CALL @
を実行すると何やら現在の状態を示す-Tips-
マシン語は実行アドレスをカンタンに変えることもできる反面
プログラムの最初の実行開始アドレスがわからないと
マシン語を正しく実行できないことにもなります。
難しい画面になります。
MSX-DOSのような画面ですが、ここでは
QTで戻ります。

■前回のプログラムを実行して、再び戻る

環境が整ったら前回のプログラムを実行させましょう。
メモリにプログラムが書き込まれます。
INC命令のプログラムでしたら
LOAD"INC.BAS"
で実行すると11でOkになりましたね。
ここでCALL @を入力します。

■SUPER-X:コマンド一覧

[アドレス]#[基本スロット番号]-[拡張スロット]

*ダンプ
D[開始アドレス]<#スロット指定>,<終了アドレス>,<ファイル名>

*アスキー
A[開始アドレス]<#スロット指定>,<終了アドレス>,<ファイル名>

*ディスアセンブラ
I[開始アドレス]<#スロット指定>,<終了アドレス>,<ファイル名>

*キャラクタエディット
H[開始アドレス]<#スロット指定>,<終了アドレス>,<ファイル名>

*マルチライティング
M[開始アドレス]<#スロット指定>

*BASICリスト
BL<行番号>

*16進テンキー設定
TK[番号]

*ブロック転送
BT[転送元開始アドレス]<#スロット指定>,<転送元終了アドレス>,[転送先開始アドレス]<#スロット指定>
※転送元、転送先がオーバーラップしている場合も有効

*リロケート
RT[転送元開始アドレス]<#スロット指定>,<転送元終了アドレス>,[転送先開始アドレス]<#スロット指定>
※転送元、転送先がオーバーラップしている場合も有効

*フィルメモリ
FL[開始アドレス]<#スロット指定>,<終了アドレス>,<数値>

*メモリコンペア
CM[比較元開始アドレス]<#スロット指定>,<比較元終了アドレス>,[比較先開始アドレス]<#スロット指定><,S>

*データ検索
FD[開始アドレス]<#スロット指定>,[終了アドレス]

*チェックサムタイプ変更
CS

*総合計の算出
TS[開始アドレス]<#スロット指定>,[終了アドレス]

*プログラムの実行
GO[開始アドレス]<#スロット指定>

*レジスタ操作
RS<レジスタ名,数値>

*トレース
TR<アドレス>

*マシンチェック
CK

*ファンクションキーの設定
SF(キー番号(数値),文字列)

*計算
CL[数値]

*BASICリスト中からの検索
BF

*マッパ操作
PP (ページ番号,セグメント番号(数値))

*スーパーディスアセンブラ/データ作成
SD[開始アドレス]<#スロット指定>,[終了アドレス],[ファイル名],<データ作成スイッチ>

*ファイル一覧
FS <ドライブ名>

*ディスクの使用状況
CI <ドライブ名>

*CPUチェンジ
CU(番号)

*画面の色を変える
CO[前景色],[背景色],[周辺色]

*メモリ中の漢字を読む
KR[開始アドレス]<#スロット指定>

*漢字タイプ
KT[ファイル名]
※漢ROMなし可能??

*漢字フォント読み込み
KL<ドライブ名>

*セーブ
SV[ファイル名],[先頭アドレス],[終了アドレス],<実行アドレス>

*ロード
LD[ファイル名]

*スーパーセーブ
S#[ファイル名],[先頭アドレス]<#スロット指定>,[終了アドレス]

*スーパーロード
L#[ファイル名],[読み込み開始アドレス]<#スロット指定>

*セクタセーブ
S%<ドライブ名:>[開始セクタ],<終了セクタ>,[開始アドレス]<#スロット指定>

*セクタロード
L%<ドライブ名:>[開始セクタ],<終了セクタ>,[開始アドレス]<#スロット指定>

*インデックス作成
IM[アドレス],[スロットデータ],[種類データ]

*インデックスの確認
IC[アドレス]

*インデックスタンクロード
IL<ドライブ名>

*インデックスタンクセーブ
IS<ドライブ名>

*アドレス変数操作
VR<変数番号,[アドレス]<#スロット指定>>

*I/Oポートイン
PI[ポート番号]

*I/Oポートアウト
PO[ポート番号],[数値]

*終了
QT

■SUPER-Xのディスアセンブラモード

プログラムはD00Hから入っていますので、
A>ID000
でディスアセンブラへ入ります。

左がアドレス、16進数、アスキーコード、ニーモニックです。

DEC BC
LD A,0AH
INC A
CALL 0D100H
RET
と入っています。
まず、DEC BCというのは数値のデータでは0Bです。
ニーモニックに書き直されているので
データかプログラムか慣れてくればわかります。
さらに><ヘ ムノ
というのはアスキーコードの文字になります。
さらに右下のゴミのようなドットはビットイメージです。
スプライトだったりする時はスプライトが表示されます。

ESCキーでコマンドへ戻ります。
CALL 0D100HのD100へ行きます。
今度はサブルーチンです。
A>ID100
でアセンブラへ入ります。
今度は[INS]と[DEL]を使って高速で移動します。
[DEL]を12回ほど押します。
アドレスの数が下がってきます。
D000Hから[INS]を12回ほど押します。
アドレスの数が上がってきます。
アドレスの差が非常に大きい場合は[ESC]でやり
少ない場合はページジャンプを使います。
これで素早く目的のプログラムへ進むことができます。

■プログラムの実行

MSXBASICではDEFUSR=&HD001:A=USR(0)でした。
D001Hが実行アドレスでしたね。

[ESC]キーで戻り
A>GOD001
を実行します。そうすると
AF BC DE HL〜と出てきました。
レジスタ、ポインタ、フラグの表示です。
この説明は時期がきた時にします。

これはペアレジスタで16ビット命令ごとになっています。

例えばAレジスタのペアはFレジスタですから
LD AF,0020H
という指定をします。16ビットというのアドレスの指定を計算する時に使います。
プログラムではAレジスタを変更しましたのでAの下の数値を見ます。
Aが0Bになっていますね。

■ソースを書く

ディスアセンブルはアセンブラと違ってメモリに直書きするので
プログラムの中で命令を加えるとアドレスを書き直すことになります。
これを配置と呼びますが、これからは再配置のしかたをやります。

プログラムを加えたいところから書きます。
とやっていくと、また書き直しという事になります。
既に書いたマシン語はブロック転送で一時待避させましょう。

例えばD000H〜D010Hまでプログラムがあって、D003Hにプログラムを加えたい。
そういう場合はD003H〜D010HまでをD020Hにコピーします。
D???H圏内であれば、どこでもコピーできます。

A>BTD003,D010,D020
とします。
そして、プログラムを加えたいところから書きます。

A>MD003H

D003 LD      A,03H

何も入力しないでRETURNキーを押すとモードの選択になるので
上キーを押してDUMPにするといつものダンプ画面になります。

またはプログラムとプログラムの区切りに00を入れておくと
何もしない命令で修正しやすくなります。

■ちょこっと命令講座

XOR A
LD A,0の代わりに使います。
OR AかAND A
CP 0の代わりに使います。

DEFMとかDEFBはメモリに文字、数値を入れる命令です。
これは入れたいアドレスに書きますが、
直接アドレスに書くアセンブラにはない場合があります。

>> MSXマシン語適当講座その3へ  >>