[FM]FULLMSX for BLOG

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

MSXマシン語適当講座 フラグあれこれ 割り算のモジュール ベースでエラー音

2011-11-27 12:55:27 | MSXマシン語適当講座

ゲームなどでフラグ判定をしたい場合にBIT,SET,RES命令を含んだ
マシン語プログラムを組むとプログラムをわからないようにできます。
例えばGOTO480と実行するとエンディングになったりするプログラムがあったりします。
ビットのフラグは複雑な条件などにも使えそうな感じがします。

さて、前回の終わりの続きです。
実はハンドだったのでD000Hに仮配置して実行してみました。

SUPER-Xのアセンブラのモニタです。
 左からアドレス、コード、文字コード、アセンブラという順番になっています。
もう1回おさらいしますが、BASICの変数はまったく使えません。
メモリに書き込むか、直接レジスタにマシン語で数をセットします。

Z(ゼット)フラグはCP nの数とイコールの時にZフラグが1になります。
NC(ノンゼロ)は逆の一致しない場合になります。
Aレジスタの数が1、CPのnの数が2の場合、1-1=0というわけです。
C(キャリー)フラグは繰り上がり、繰り下がりになった時のフラグです。
Aレジスタの数が1、CPのnの数が2の場合、1-2=-1となり、繰り下がりになります。
NC(ノンキャリー)は逆ですね。Zを含んだ場合になります。

ソースは(D000-D015H)で16+5=21バイトほどでした。
 前回の復習ですが、計算する前に計算をしない数を分岐してから、
計算させるようにしています。割り算は引き算を何回やったかをカウントして
Bレジスタに入れています。

LD A,64Hならば割り切れますので、レジスタペアAFのAレジスタはゼロになります。
カウントした数がレジスタペアのBCのBレジスタに32Hと入りましたね。
このモジュールができましたので、VRAMに書き込む準備が整ったことになります。

このように部分的にプログラムをしていきましたが、
やはりアセンブラが必要な感じになりました。
そこで、D000Hのアドレスからマシン語を書いていきましたが、
別のアドレスで仕上げていき、逆アセンブラでD000Hに戻すことにします。
 BASICのアセンブラはMSXポケットバンクのマシン語入門のものを使って
書き込みをしていきます。

次回は懐かしいのアスキーのMSXマシン語モニタの登場です。
MSXBASICのインラインアセンブラです!

こんなことも★

何か今でも通じるシンセっぽい音が欲しいと思っていましたが、
これなら、ちょっとMSXイメージが変わりそうな感じです!
夜中に目が覚めて、いびきの音とテレビのベースの音が妙に一致して

ちょこっとMSXでメロディを作ってみました。
 いびきの音?は(O2D)でベースの音が(O3D)とどうなったかといいますと
PLAY#2,"@33T80L8O2DO3DC16DO2D"
 でしたが、音が低いので1オクターブ上げました。

10 CALLMUSIC
20 PLAY#2,"@33T80L8O3DO4DC16DO3D"

結局はテンポ80の8分音符でオクターブ3のD、オクターブ4のD、16分音符でC
8分音符でD、オクターブ3でDというメロディで何か問題が発生したエラーの音になりました。
 ちょっと一発芸っぽいネタですね。C16でズッコケさせてDに戻しています。

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

MSXマシン語適当講座 BIT命令 チートなビット操作 BASICで試してみる

2011-11-23 20:08:13 | MSXマシン語適当講座

 またまた問題になってきました。
今回は本格的にビット操作命令を解説します。
ビットは0,1をリセット、セットする命令、
 何ビット目を読むかという命令です。
実はパソコンはビット演算から生まれて計算ができました。
 でも、チートなビット演算はどのように使うのかがわかりません。
今回はビットを見てみましょう。
□□□■■■■■
これは1Fhです。
4ビットを境にして上位下位ビットという所に注目します。
上位は□□□■で1hです。下位は■■■■です。Fhです。
これに7ビットをセットします。

SET 7,A

そうすると■□□■で1hが9hになりましたね。
では確認してみましょう。

BIT  7,A

これを実行するとZフラグが変化します。

RES  7,A

これで元に戻ります。
さて、今回はこの命令を活用してみます。

CレジスタFh、Bレジスタの3Ehを
FEHに変える場合はAレジスタは0、
3Fhに変える場合はAレジスタは1になります。
前回からつなげるとプログラムは3番目になります。
ビット演算とは一言で言えば…
「そんなのズルいぞ!ちゃんと計算しろ!」と、
言いたくなりそうな感じがします。
2番目はBASICにしたものを書いてからマシン語にします。

;A:  0-HI 1-LOW
             LD    A,0
             LD    B,3Eh
             LD    C,Fh
             CP    1
             JP     Z,BIT1              
             LD    A,C

BIT0     :CALL BIT00
             CALL BIT01
             CALL BIT02
             CALL BIT03 
             RET
BIT1     :LD    A,C
             CALL BIT10
             CALL BIT11
             CALL BIT12
             CALL BIT13
             RET

;4BIT_MOVE_HI
BIT00:   BIT    0,A
             JR      Z,ZERO00
             SET   4,B
             RET
ZERO00:RES   4,B
             RET
BIT01:   BIT    1,A
             JR      Z,ZERO01
             SET   5,B
             RET
ZERO01:RES   5,B
             RET
BIT02:   BIT    2,A
             JR      Z,ZERO02
             SET   6,B
             RET
ZERO02:RES   6,B
             RET
BIT03:   BIT    3,A
             JR      Z,ZERO03
             SET   7,B
             RET
ZERO03:RES   7,B
             RET
;4BIT_MOVE_LOW
BIT10:    BIT 0,A
              JR Z,ZERO10
              SET 0,B
              RET
ZERO10: RES 0,B
              RET
BIT11:    BIT 1,A
              JR Z,ZERO11
              SET 1,B
              RET
ZERO11: RES 1,B
              RET
BIT12:    BIT 2,A
              JR Z,ZERO12
              SET 2,B
              RET
ZERO12: RES 2,B
              RET
BIT013:  BIT 3,A
              JR Z,ZERO13
              SET 3,B
              RET
 ZERO13:RES 3,B
              RET

 かなり適当ですがフラグを調べるとzフラグが変化するだけなので、
サブルーチンでやってみました。
最初にAレジスタに0か1かを入れて分岐させるようにしました。
プログラムをする時はzフラグにしますがプログラムの途中ですから

Aレジスタに代入することにしています。
 4ビットを1ビットごとに調べてコピーしています。
さて、プログラム2に戻ります。
まぁ、プログラムは今までと同じ命令の繰り返しです。

100 X=1:Y=100
110 A=x:B=0:H=0
120 REM
130 'MOD1
140 IF A=1 GOTO 240
150 'z \ & div/0
160 IF A=0 GOTO 240
170 A=A-2
180 B=B+1
190 'C MOD
200 IF A<2 GOTO 230
210 '
220 GOTO 160
230 PRINT B,A

という感じです。
140行は座標が1で割れない場合の分岐です。
160行は数が割り切れて0、または数値が0の分岐です。
200行は割り切れない場合の分岐です。
と、このようなプログラムをマシン語化して次回はやります、
MSXBASICはマシン語作成の補助として使うことができますね。

 

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

MSXマシン語適当講座 「ながっ!」SCREEN7,5のビットマップの読み書き ゼロ除算 その1 えーっ!

2011-11-22 18:16:21 | MSXマシン語適当講座

 前々々回の講座「8ビットから4ビットに分ける」の続きです。VRAMのデータを読み出して、
たとえば0Fhでしたら、色コード0hとFhを得るためのプログラムをつくりました。

ちょっとスプライトの話をします。ビットマップのほかVRAMにはスプライトにもエリアがあります。
SPRITE$(1)と指定してデータを入れますが、
SCREEN5のVRAMに直接書き込むなら、
&H7800からスプライトパターンジェネレータというエリアに書き込みます。
第2パラメータをSCREEN5,2と設定しないと16ドットデータになりませんので注意が必要です。
16ドットの場合は左半分と右半分で32バイト(8ドットが4つの&H20)のデータになります。

 さて、今回はいよいよ、ビットマップの読み書きをBIOSを通してやってみたいと思います。
まず、「BASICではどのようなプログラムになるのか?」を書きたいと思います。

10 SCREEN 5
20 PSET(100,100),&HF
30 I$=Input$(1)

というプログラムを

10 SCREEN 5
20 PSET(100,100),&HF
30 C=POINT(100,100)
40 SCREEN 0
50 PRINT C
60 I$=INPUT$(1)

のようなプログラミングを
ちょっと長くなりますがマシン語で設定をしてみます。

MSX2テクニカルハンドブックか
MSXマガジン永久保存版3号のp188に載っています。
このBIOSではVDPを変えることができるコマンドがあります。
以前にDEFUSR=&H7E:A=USR(0)で多色刷りモードにする
コマンドはVRAMがSCREEN1でVDPがSCREEN2になりますね。

最初に手書きかテキストで入力しながらプログラムを組みます。
このBIOSのエントリを使います。
CHGMOD:005Fh
NRDVRM:0174h
NWRVRM:0177h
0D000hにこのプログラムがあるので、
さらにデータエリアを0D100hに設定します。
これは私が設定したので、0D200hでも0D400hでも
アドレスはどこでも設定できます。
(HL)はPOKE命令として見てください。

0D100 X座標(100=64h)
0D101 Y座標(100=64h)
0D102 色コード(15=0Fh)

LD      A,05h
CALL  005Fh

LD      A,64h
LD     HL,0D100h
LD      (HL),A
LD      A,64h
LD      HL,0D101h
LD      (HL),A
LD      A,0Fh
LD      HL.0D102h
LD      (HL),A

ここまでで、画面をSCREEN5に切り替えて
0D100hと0D101hに100、0D102hに15を入れました。
さて、ここからが山場です。
SCREEN5は256×212ですが、VRAMマップは
128バイトが各212バイトの構成です。なお、SCREEN7は512バイトですね。
X座標の100は50バイト目に書き込むことになります。
この50を出すことにします。カウントはBレジスタにします。
 これを2で割ります。カウント(INC B)しながら-2、(DEC 2)して
CP 2としてNC(ノンキャリア)であれば繰り返し(ループ)で計算します。
そうすると、Bが50と出ます。CP 2でZフラグ(余り1)が成立する場合は
101とかになるわけですね。
さらに、Y座標でY座標の計算を入れます。
こんな具合にVRAMの書き込みアドレスを確定していきます。

もう1つの山は座標が0(ゼロ)というのがあります。
これがPCでは厄介なもので0÷0=×と計算できないゼロ割りになってしまいます。
要するに計算をしないで答えになる例外を考えます。

たとえば1~20の通常は合計を出すとして、4の項目にデータがなく割り算が数式にある時などに
DIV/0と表示されて、Excelなどで集計ができないエラーがありますね。

 これもプログラムします。やっぱり長いので^^;
次回は計算をしてアドレスを出すことにします。では。

と、いいながら大きな問題がありました。
SCREEN5は1バイトを2ドットにしているので、たとえば100と101の2つの座標のある
アドレスの部分書き換えになります。
34hとういうデータに1ドットにfhを加えるとf4hか3fhになります。
問題はこの4hと3hを読みこまないとf0hとか0fhになって正しく表示できませんね。
MSXBASICではINSTRだったりMID$だったりするイメージが浮かんだりして
 見えない岩山が出てきたようです。はたして、SCREEN5の読み書きはいつできるのか?(おい)
短くできるか難題のような感じです。「MSXBASICはすごくラクなんだ」と実感します。

と、いうわけでやっぱりラクをするには「BITかな?」は避けて通れませんね。
 8ビットレジスタと16ビットレジスタの連携したプログラムも考えてみます。
 

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

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でシェアする

11月になりました ブログのデータ公開 FM音源の話 Windows7SP1

2011-11-12 13:15:49 | Weblog

 11月になりました。実は11月3日に公開予定でしたが、3日頃から忙しくなって、
12日の12:00ごろからFULLMSX.COMでMSXデータを公開しています。
 UCODE-Z5.BASもあります。FM-KEYB.BASは表示を若干変えました。
実はブログを書きながらエレキギターに適する音をさがしていました。
いろいろな曲を聴きながら耳コピして、合いそうな音をさがしていくことをやっていました。

 その結果、SYNTHという音色番号が「ジャンチャンチャン」という
クセのある音で似ているのかなと思いました。ギターの弦の音はちょっとビブラートがかかるんですね。
もちろん、ピアノとかオーボエとかトランペットのFM音色の高音域でもイケますが、
「AKBの曲となると、やっぱりロック系じゃないですか」と、ちょっとメリハリが効いた音が
いい気がします。そこで数回聴いて、適当に音程を合わせてみました。
222r222r222rr222r222r222rrr4rこれで「会いたかった~きみに」なので、
234rあたりをいろいろと押しながら耳コピすればハモれるでしょう。この1オクターブ下の
ベースギターは、あまり自信がないけどjmmjmjmの繰り返しで始まる感じですね。
そうするとUCODEでエレキパートはF#とかA#Bあたりをガンガン
このキーを適当にたたいても音が合うときがあるので馴染みそうですね。

 また、ハイドライド3のハーベルの塔のBGMに合いそうな音も表示しました。
MSX2でもこんな音が出せるのかと、ちょっと思いました。
 そう考えるとFM音源はPSGに比べるとラクに曲に合わせることができます。
あとはJASRACがらみになるので、まぁがんばって調べてください。

PCは今年の最終メンテナンスで何だか動きがトロイっぽいので、
必要データをUSBに入れてクリーンインストールしました。

 その時は普段は表示の処理が遅くなったことがないところで、
動きが鈍くなって何か別のネット系のプログラムが動作しているようでした。
 何かのアップデートチェックの処理のような遅さを感じました。

Windows7のインストールと、Windows7updateと、Windows7SP1のインストールで
1:30分から4:00ぐらいまでで完了しました。

Windowsの表示から一旦ブラックスクリーンになって、
5分してもHDDランプも消えたままでCtrl+Alt+Deleteなど何を押しても動かなかったので
電源ボタン長押しして電源を切りました。

それから
「WindowsServicePackをインストールしています。ステージ3/3」
という表示が出て再開できて無事インストールできました。

 クリーンインストールはWindowsのフォルダの内容がクリアされます。
これによってすべてのプログラムを基本的にはインストールする必要があります。
 ただし、体験版、解凍ソフトなどのインストール情報を書く必要がないプログラムは動作する可能性があります。

これは上級者向けの設定になりますが、Windows.oldにWindowsファイルはコピーされます。
今までのプログラムもWindows.oldからのデスクトップにアイコンがあるので、辿って行けば見つかると思います。
 製品版のソフトは実行して動作するか、しないかの判断はかなり難しいケースもありますので、
不要になったフォルダを削除してから再インストールしてください。
 ソフトで作成したデータは使えることもあります。ショートカットのリンクなど不整合ですから手直しする必要があります。
なお、この書き込みによって不具合など生じる場合もありますから、書き込みは参考程度にお読みください。

と、まぁどのような感じになったか書きましたが、フォーマットをしなかったのでバックアップは不要の結果でした。
今回のメンテナンスは短時間で終わりそうですが、やはりメモリの不具合が以前にあって、
そのまま放置したのでWindows7SP1のインストールが進まなかったようでしたね。

 

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

UCODEが更新! テンキーからフリーキーボード10キーから最大20キーに Z80のJR命令で意外な方法?

2011-11-09 20:05:02 | Weblog

 各キーにギター、ピアノの演奏コードを入力してパッド代わりにするFM音源パッドUCODEの更新です。
ギターになるとCを押さえてFを押さえてGを押さえてとなかなかスムーズにはいきません。
「あ~わるい!わるい、Eだった。もう1回たのむ。」と
「おいおい、これで6回目だぞ。もうちょっと練習したほうがいいんじゃない?」となり

「いや、次は何とかするから。」と

フォローしながら練習でも合わせるのは一苦労です;

PCではキーを押すだけでリズムよくスムーズにできます。
今までは数字またはテンキーに演奏コードが最大10キー入りましたが、
今回は20キーまで入れるようにした為にPCの英数キーに対応することにしました。
 画面にはzsxdc…とパッドにするPCのキーボードでキーパッドの並びを作ります。
プリセットでzはC、sはC#という具合に入れていきます。
音は変更できるので、曲によっては演奏コードの配置を変えたり、
Shiftキーを押すと大文字にできますから、使い方によっては便利かもしれません。
FM音源のMMLを変えることで今までどおり音色を選ぶことができます。

近日公開予定です。

こんなことも★

まぁ、これからどうやってアセンブラをプログラミングしようかなと思っています;(えっ?)
他力本願(死語)でSUPER-Xとか、アセンブラできないか考えていますが、
「2パスのディスアセンブラ」という記述があって、
1パス目がCALL 0D030Hが2パス目でCALL JP0001なんか仮ラベルになるのかなと思っていたりしていました。
どちらにしても逆アセンブラは解析用で開発用ではありません。
「例えば00で空けたり、ラベルをメモリに直書きしたら、逆アセンブラで狂ってしまうかも。」
と、このままの方法はあまりよくありません。

何かいい方法がないかと思っていると、「そういえばJR命令ってありましたね?」(おい)
これをループに使えばリロケータブルしやすくなり、ループ元のアドレスが変わる場合の目印のラベルもいらないので便利ですね。
要するにJPは絶対アドレスでJRは相対(リラティブ)アドレスの指定ができます。
リラティブという言葉が馴染まないのでジャンプリターン(JumpReturn)と覚えています。
アドレスが絶対では0D000Hを指定でアドレスのジャンプ先をJP命令で変えることはできません。
それに対して相対は現在処理中のアドレス位置から±10Hというふうにアドレスのジャンプ先はJR命令で変えることができます。
これはBASICにはない機能で、一般的にループなどに使うと便利です。
JR命令はオペコード、引数の2バイト構成でJPに比べて1バイト節約でき、JR命令からのジャンプ先を±128アドレスまで指定できます。

具体的にはD000HにJR命令があるとCF80H~D07FHの範囲でジャンプできます。
一般的にはアセンブラでJR命令からの相対アドレスがハンドアセンブラでわかるのは、かなりの熟練者になります。

引数(パラメータ)は80Hを境にプラスマイナスで指定できます。ただし繰り返し(ループ)処理中の命令を変えると狂ってしまいます。
と、マシン語初心者には厄介な命令ですが、メモリを再配置してアドレスが変わる場合はJR命令を使うと
前例のようなダンプリスト打ち込み時のアドレスの書き直しが不要になりスッキリしますね。

waru:    sub    16
    inc    b                 
    cp    16
    jp    nc,waru

waru:    sub    16
    inc    b                 
    cp    16
    jr    nc,waru

と、ラベルが使えれば変わることになります。逆アセンブラからアセンブラとなると
ちょっとドリル的な反復学習できるプログラムツールを作って試してみたいと思います。
「この場合はJR命令からwaruのアドレスは-6になるのかな。」(ウソ)
そうすると00からデクリメントしていきFF,FE,FD,FC,FB,FAになります。指定のしかたは後でわかります。

Z80はどんな環境でも対応できるCPUと思いますね、たぶんMSXがなくても、ちょっとしたモニタで再配置できそうな感じです。
「簡易モニタに相対アドレスカウンタがあると便利かな…」

というわけで、作りました。これはD030hのアドレスをセットすると括弧内に相対アドレスがカウントされます。

D02E : JR Z,F9hという記述のときには次の命令のアドレスから0になりますので、
2バイトたしてD030hで、ここからF9hはD030hの-7でZフラグがセットの時にD029hにジャンプとわかるようになりますね。パチパチ

ここまでのプログラムを明日ごろ公開していきます。その後はもう少しいろいろと試してみたいと思います。

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

DOTRAIN マシン語デバッガモード どのようなプログラムがマシン語になるの? DM-SYSTEM2簡易モニタ

2011-11-04 01:04:18 | Weblog

 午前様になってしまいました。昨日はDOTRAIN用のマシン語モニタを制作していました!
Dコマンドでメモリを見ることができます。D003hならばDD003と入力します。

カーソルの上でアドレスがさがり、カーソルの下でアドレスがあがります。

Sコマンドでメモリを書きます。カーソルがあるアドレスを書きます。



このように間違えて書き込んでも前のデータが表示されます。
03asFFではなくて、FFas03が正しい表記ですが、このようにして書き込んだ場合のメッセージを表示します。
なにも書き込まないで、Enterの場合はアドレスが+1上がります。さらに^でアドレスが下がります。
DとSコマンド不自由なくメモリを操作できると思います。

マシン語プログラムはこのアドレスにデータを書き込みます。
なお、マシン語の実行開始アドレスの指定はDEFUSR、実行はA=USRとセーブはBSAVE、ロードはBLOAD
どちらもBASICでできるので、ここでは機能として加えていません。

BコマンドでBASICプログラムを終了とかなりシンプルですが、
これはマシン語プログラムを置けるようにするためです。

やはり、自力でやるより裏RAMにモニタアセンブラを置いたSUPER-Xを使った方がグッとラクですね。
また、MSX-DOSがあれば便利ですが、どちらもない環境で考えてみるとかなり使いにくいです。

結局、DATA文でダンプしたものをRAMに読み込む方式でやります。
 現在はDOTRAINのマシン語ソースプログラムを作成中です。

「どのようなプログラムがマシン語になるの?」と、言えば

1段階目、座標指定と移動値を入れるとスルッと動く
2段階目、指定された座標の色を調べる
3段階目、複数のスプライトを同時に動かす
4段階目、指定された色にならって移動する

IFのような条件処理、+1,-1の加減処理、X,Y座標指定、POINT関数、
PUTSPRITEなど多いです。
特に条件処理はBASICでは遅いので、どのくらい速くなるのか気になるところです。
それでは1段階目をはじめていきます。

BASICでSCREENとスプライトを定義したVRAMデータをBLOADした設定にして、
マシン語プログラムを実行するとスプライトを表示できるようにします。

前回のソースを使ってみると

;X
    LD   HL,7600h
    LD    A,100
    CALL VRM_W

をINC A(+1)、Aレジスタを+1加算するに

;X
    LD   HL,7600h
    INC   A
    CALL VRM_W

書き変えてループさせるとスルッと右へスプライトが動きます。

LOOP: LD   HL,7600h
       INC   A

       CALL VRM_W
     CP FFh
     JP NZ,LOOP
     RET

 このようにAレジスタを加算してCPで比較します。
AレジスタがFFhならばZフラグが1でRETで終わります。
FFhは255ですから、画面の右まで移動したら実行完了となります。
では整理しますと

・VRAMに書き込む:NWRVRM(0177H)

MSXテクニカルハンドブック p352参照。

BIOSを使うので、指定されたラベルに変えます。

NWRVRM EQU 0177h

;SPR-SET
;Y
      LD   HL,7600h
      LD    A,100
      CALL NWRVRM
;X
      LD   HL,7601h
      LD    A,100
      CALL NWRVRM
;Patturn #
      LD   HL,7602h
      LD    A,0
      CALL NWRVRM
;Color
       LD   HL,7803h
       LD    A,15
       CALL NWRVRM

LOOP: LD   HL,7600h
       INC   A

       CALL NWRVRM
     CP FFh
     JP NZ,LOOP
     RET

これで動かすことができますが長いですね。そこで、初期座標までBSAVEしておけば

LOOP: LD   HL,7600h
       INC   A

       CALL NWRVRM
     CP FFh
     JP NZ,LOOP
     RET

ソースプログラムはこれだけで動作します。(本当か?)
ウソです。まず、スプライトアトリビュートテーブルからX座標をAレジスタに書き込む処理が必要です。

擬似命令を外していますが、逆アセンブラならばNWRVRM EQU 0177h
ですから、EQUはイコール、0177hに変えてCALL 0177hとします。
LOOPのラベルの場所のアドレスを書き、それがJP NZ,<アドレス>になります。

VRAMのデータのセーブは画面の保存をすることができますから、
次回動かすときはその画面の状態から始めることができます。
ということはBASICを使うとマシン語というのは大袈裟なものではありませんね。
たった数行で実行できるものです。さらにマシン語ダンプリスト?にすれば13バイト程度です。(たぶん)

D000: 21 00 76 3C CD 77 01 FE FF C2 00 D0 C9

ですが、LD A,0Ahを加えてみると

D000:3E 0A 21 05 76 3C CD 77 01 FE FF C2 02 D0 C9

この方が親切ですね、最初にAレジスタの設定を入れます。
BASICではないのでAレジスタの値は変わります。

するとLOOPのアドレスが変わりますから、C2 02 D0になっています。

ダンプができました!
たとえば違うスプライト番号を移動したい場合は7600hを7605hにすればよいです。
マシン語モニタで21 00 76を21 04 76にします。

このようにマシン語モニタではプログラムを部分的に変える場合に使います。
実行してみると速すぎて見えません。リニアのように速いです。
これに条件処理が入るので、遅くはなりますが、かなり速い感じがする予感です。

また、メモリの読み書きだけのかなりシンプルなモニタができたので、
これをスタンドアロン版として、DM-SYSTEM2のマシン語モニタにしてみたいです。
DM-SYSTEM2を使用すると裏RAMになるので、残念ながらSUPER-Xは動作できません。
そこで専用のモニタが欲しい気がします。
もし、アセンブラのシステムを組むとするなら、この環境ですとメモリマッパ上になりそうです。
そうするとMSX-DOS2でMSXturboRか1chipMSX向けになりそうかな。
でもMSX2ユーザーは使えないので、やはりディスクアクセス方式になるのが現実でしょう。

★参考資料

マシン語適当講座その3
http://www.geocities.jp/fullmsx2/u-yan/msx-mac3.html

 

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