職人養成道場


Date: 12/01/10 23:09:55
From: 名無しさん

マシン語モニタ Super-X の使い方(1)


● マシン語モニタSuper-X

モニタとはマシン語を入力する最低限の機能を持つソフトウエアでOSよりも
小規模で、OS以前に開発された非常に原始的なプログラムだ。

マシン語モニタはかつてワンボードマイコン上で動作し、
初期の8bitパソコンCP/M上でも動作していた。
その後はMSDOSのデバッカコマンドdebugとしても利用され、現在のWinodws
環境にも名残を残している。
変わった所ではポケットコンピュータ(電卓)内にも備えられており、
組み込み用機器のデバッカとして現在も利用されている。

モニタの役割は、コンピュータの基本的な最低限のハードウエアレベルの機能を用いて
ソフトウエアを読み書きする事だ。
基本的なソフトウエアや開発環境がない環境で、メモリー上に一から機械語を入力
したり、メモリー内容を表示する際に利用される。
さらに特定の番地から機械語を実行し、結果を得るという事も可能である。

モニタはフロッピーやフラッシュメモリなどの外部記憶から機械語をロードし、特定の
メモリ番地にプログラムをロードする、という機能も持つ。これらはOSが持つ機能である
実行ファイルをメモリーにロードしてプログラムを開始する処理と等しい。
原始的なOSとしての機能も併せ持っている。

MSXで動作するモニタプログラムは二種類ある。
DOS環境上で動作するものと、BASIC環境上で動作するものである。
前者のDOS環境用としてSHEMがある。BASIC環境用としてはSuper-Xがある。
Super-Xは元々はシェアウエアであった日本製ソフトウエアを海外の方が
メンテナンスを行なっているものだ。

Super-Xは、BASIC環境と連携して動作する極めて高機能なモニタで、アセンブル機能や
トレース実行、レジスタ表示などが可能だ。
MSXには標準でマシン語モニタ機能を備えていない。マシン語モニタ無くして
Z80アセンブラやマシン語のセルフ開発は不可能だ。
Super-Xはマシン語を入力し実行したり、ハードウエアの状態を分析、
BASIC機械語を開発する場合や、
デバックする際に極めて利用価値の高いソフトウエアである。




● ダウンロードと起動方法。

モニタ自体はインターネットからダウンロード可能である。
下記のアドレスのSuper-XからMSX実行形式とマニュアルをダウンロード可能だ。

http://msx.fi/nyyrikki/software.html


モニタの起動方法はBASIC環境から以下の命令文を実行する。

RUN "SUPER-X.BAS"


BASICとの連携を考慮しているのでモニタとBASIC環境を行き来する事が可能だ。
モニタを開始する場合、BASIC環境上からCALL @を入力する。

CALL @

または、

_@

と入力することでモニタが起動する。
BASICに戻る場合はモニタ上から、

>QT 

と入力する。基本操作はこれだけだ。














Date: 11/12/09 02:32:09
From: 名無しさん

Re:マイクロベンチマーク MSX Microbenchmark(Disk I/O)


●ディスクI/O性能マイクロベンチマーク

ディスク性能テストとして、0-1000までの数値が書かれたテキストファイルを作成し
完了時間を計測する。
テスト内容は、フロッピードライブ、RAMドライブ、BASIC環境での仮想ドライブ(CALL MEMINI)
それぞれに対するディスク書き込み時間計測を行なった。
データは0-1000までの数値をテキストファイルとして出力するものでファイルサイズは約7KByte。

BASICコンパイラはファイル命令をサポートしない為、ここではBASICインタプリタのみで、
コンパイラのテストを除く、ドライブと機種テストとする。

以下テスト用のプログラムを示す。

10 defint i
20 st=time
30 open "a:t1.dat" for output as #1
40 for i=0 to 1000
50 print #1,i
60 next i
70 close #1
80 en=time
90 print (en-st)/60


MSXTR(r800,7Mhz,DO2)の測定結果

Normal(Floppy) 4.7 sec
Normal(RAMDISK h:) 3.6 sec
Normal(mem:) 3.9 sec

MSX2(3.5Mhz)の測定結果

Normal(Floppy) 20 sec
Normal(mem:) 19.3 sec


※MEM:はBASIC環境でCALL MEMINI命令を実行し、32kbyteのRAMエリアを仮想ディスクとして
利用した場合の例。


次に上記で作成したテキストファイルを用い、ディスクドライブ間のコピー
性能比較テストを行なった。

以下にテストプログラムを示す。

10 defint i
20 maxfiles=2
25 st=time
30 open "a:t1.dat" for input as #1
40 open "h:t2.dat" for output as #2
50 for i=0 to 1000
60 input #1,a$
70 print #2,a$
80 next i
90 close #2
100 close #1
110 en=time
120 print (en-st)/60


MSXTR(r800,7Mhz)の測定結果

normal(a: -> a:) 6.9 sec
normal(a: -> h:) 6.2 sec
normal(a: -> mem:) 6.2 sec

MSX2(3.5Mhz)の測定結果

normal(a: -> a:) 34.6 sec
noraml(a: -> mem:) 30.9 sec


テストはテキストファイルをBASICプログラムで読み込みつつ、新規に別ファイルとして
書き込みを行なった。
対象ドライブはフロッピードライブとRAMドライブで、ドライブ間の転送時間を計測。

エミュレーター上でのテストでは、BASICインタプリタ上でファイルI/O性能は
大きな差異がない。














Date: 11/12/08 19:19:20
From: starman

Re:r-type mega16 a1fx+FMPAC起動でFMが鳴らない

A1WXでは内臓FMでFM音源で鳴っています。
FMPACでメモリを喰われてしまうのかも知れません。














Date: 11/12/07 23:46:01
From: 名無しさん

Re:マイクロベンチマーク MSX Microbenchmark(Pixel search)


●ピクセルサーチ性能ベンチマーク

グラフィクス画面に描画されたピクセルを検索する簡単なプログラムで性能を測定する。
テスト項目はBASIC命令のPOINT文を用いた場合と、VRAMを経由する場合。
VDP命令は今回はテストしない。


以下にBASICのPOINT文を用いた例を示す。

10 defint a,x,y
20 screen 5
30 pset(100,5),15
40 st=time
50 for y=0 to 10
60 for x=0 to 255
70 a=point(x,y)
80 if a<>0 then goto 110
90 next x
100 next y
110 '
120 en=time
130 screen 0
140 print (en-st)/60


以下にVPEEK文を用いVRAM経由でピクセル検索する例を示す。

10 defint a,i
20 screen 5
30 st=time
40 pset(100,5),15
50 for i=0 to 1275
60 a=vpeek(i)
70 if a<>68 then goto 90
80 next i
90 '
100 en=time
110 screen 0
120 print (en-st)/60


MSX2(3.5Mhz)の結果。

Normal(point) 10.4秒
BASICコンパイラ(point) 1.4秒

Normal(vpeek) 4.3秒
BASICコンパイラ(vpeek) 0.1秒


テスト結果は座標(100,5)にプロットされた点を検索するまでの時間を示す。
VPEEK命令はScreen5の場合1byteで2 pixelを処理する事になる。0100 0100bという数列以外を
チェックする必要がある。(Screen5画面が青である時)
ベンチマークの結果ではピクセルの検索はVRAM経由の方が速い事がわかる。














Date: 11/12/07 23:43:22
From: 名無しさん

Re:マイクロベンチマーク MSX Microbenchmark(Draw pset)


●PSET描画レートベンチマーク

PSET命令によるグラフィクス画面へのピクセル描画性能を測定する。
単純なPSET命令の利用と、VDPコマンドの使用、VRAMへの直接的な書き込みを比較する。


以下にBASICで利用されるPSET命令を用いたプログラムを示す。

10 defint i,j
20 screen 5
25 st=time
30 for j=0 to 19
40 for i=0 to 255
50 pset (i,j),15
60 next i
70 next j
80 en=time
90 screen 0
100 print (en-st)/60


以下はVDP命令のPSETコマンドを使用した例を示す。

10 defint i,j
20 screen 5
30 st=time
40 'call turbo on
50 for j=0 to 19
60 for i=0 to 255
70 vdp(37)=i 'Dx
80 vdp(39)=j 'Dy
90 vdp(45)=&HF 'Color
100 vdp(47)=&H50 'Exec Cmd
110 next i
120 next j
130 'call turbo off
140 en=time
150 screen 0
160 print (en-st)/60


次にVRAMに直接描画するVPOKE命令を利用した例を示す。

10 defint i
20 screen 5
30 st=time
40 for i=0 to 2550
50 vpoke i,255
60 next i
70 en=time
80 screen 0
90 print (en-st)/60


MSX2(3.5Mhz)の結果。

Normal(vpoke) 9.2秒
Normal(pset) 26.3秒
Normal(vdp) 57.7秒

BASICコンパイラ(vpoke)0.3秒
BASICコンパイラ(pset) 3.5秒
BASICコンパイラ(vdp) 15.3秒


グラフィック画面にPSETする場合、VDPコマンドの実行は遅い。
SCREEN5の単純なピクセル描画の場合は1byteで2ピクセルを描画するのでVPOKEを使う方が速い。
(BASICのPSET命令はVDPコマンドを使用せず直接VRAMへ書き込み行なっている?)
VDPコマンドはBitBLT以外は動作が遅いという結果となる。これらはマシン語でプログラムを記述しても同様であろう。














Date: 11/12/07 23:39:07
From: 名無しさん

Re:マイクロベンチマーク MSX Microbenchmark(Draw line)


●LINE描画レート、マイクロベンチマーク


LINE文を用いて描画性能を測定する。
描画は単純なLINE文と、VDP命令のLINEコマンドを使用し、それぞれに対し
インタプリタとコンパイラを使用した時の結果を示す。


以下はBASICのLINE文を用いたプログラム。

10 defint i,j
20 screen 5
30 st=time
40 'call turbo on
45 for j=10 to 15
50 for i=0 to 200
60 line(0,0)-(i,200),j
70 next i
75 next j
80 'call turbo off
90 en=time
100 screen 0
110 print (en-st)/60



以下にVDPコマンドを用いた例を示す。

10 defint i,j
20 screen 5
30 st=time
40 'call turbo on
50 for j=10 to 15
60 for i=0 to 200
70 vdp(37)=0 'Dx
80 vdp(39)=0 'Dy
90 vdp(41)=200 'Maj
100 vdp(42)=0
110 vdp(43)=i 'Min
120 vdp(44)=0
130 vdp(45)=J 'Color
140 vdp(46)=1 'Direction
150 vdp(47)=&h70 'Exec Cmd
160 if (vdp(-2) and 1)<>0 then goto 160 'CmdStatusCheck
170 next i
180 next j
190 'call turbo off
200 en=time
210 screen 0
220 print (en-st)/60



MSX2(3.5Mhz)DrawLineの結果。

Normal(cpu) 8.4 sec
BASICコンパイラ(cpu) 4.1 sec

Normal(vdp) 34.1 sec
BASICコンパイラ(vdp) 9.8 sec


VDPコマンドのLINE機能は極端に遅い。これはVDP内部のCPUの遅さが要因だろう。
LINEコマンドを実行する際はレジスタがVDP内部CPU計算に用いられる様子なので
1ラインごとに毎回初期化する必要がある。
LINEを描画する場合はVDPコマンドよりもVRAM経由でCPUの線形補間により描画する方が速いだろう。


※VDPのLINEコマンドについて

VDPのLINEコマンドは、BASICのLINE文の指定と異なり独特なので注意が必要。
VDPは線分を三角形で与えるため、線の長辺が変化するとDirectionを変える必要がある。

LINE(0,0)-(100,10)の直線の場合、線分を構成する三角形はX座標に沿った線が長辺となる。
従って線分の方向であるDirectionはVDP(46)=0となる。
長辺のピクセル量はVDP(41)=100と設定する。

一方で、LINE(0,0)-(10,200)の場合は長辺がy軸である。従って三角形を構成する線分が
変化するので、DirectionはVDP(46)=1となる。
長辺のピクセル量はVDP(41)=200となる。VDP(41)には線分を構成する長辺側の値を必ずセットする。


※BASICコンパイラのバグについて

ROM版のBASICコンパイラはLINE文の色指定にバグがある。DISK版ではFixされている。
グラフィクス画面を扱う際は、ROM版ではなくDISK版を利用すると良いだろう。














Date: 11/12/07 23:33:58
From: 名無しさん

Re:マイクロベンチマーク MSX Microbenchmark(Vram fill)

●VRAMフィルレート、マイクロベンチマーク

このプログラムはVRAMに対する直接的なI/OであるVPOKEのベンチマークを計測する。
VPOKE命令により画面全体を示すVRAMにCPU側からデータを書き、画面全体をFillする所要時間を計測する。
オペレーションは書き込み(Write)のみ。

10 st=time
20 defint i
30 screen 5
40 for i=0 to 27000
50 vpoke i,255
60 next i
70 en=time
80 screen 0
90 print (en-st)/60


MSX2(3.5Mhz)の結果。

ループカウンタの変数型を変えつつ、インタプリタとコンパイラ時の速度比較を計測した。
コンパイラ実行は"CALL RUN"とし比較した。

Normal(defdbl) 150 sec
Normal(defint) 98 sec
BASICコンパイラ(compiler,fixnum[float]) 19 sec
BASICコンパイラ(compiler,defint) 4 sec














Date: 11/12/04 20:38:55
From: 名無しさん

Re:マイクロベンチマーク MSX Microbenchmark(Vdp BitBLT)


●VDPのBitBLT性能(YMMM)のマイクロベンチマーク

VDP内部のBitBLT機能であるYMMMコマンドを実行し、BASICのCOPY文との比較を行なう。
比較はScreen5のビットマップの一部をコピー描画し、その速度を計測する。

はじめにCOPY文を用いたプログラムを示す。

10 defint i,x,y
20 screen 5
30 for i=0 to 30
40 x=rnd(1)*255
50 y=rnd(1)*211
60 line(0,0)-(x,y)
70 next i
80 '
90 st=time
100 for i=0 to 80
110 copy(0,i)-(255,i+80) to (0,150)
120 next i
130 en=time
140 screen 0
150 print (en-st)/60

次に上記に変更を加え、VDP命令を利用するプログラムを示す。
YMMM使用時は90行以下を変更すること。

90 st=time
100 for i=0 to 80
110 vdp(37)=0 'dx
120 vdp(43)=80 'ny
130 vdp(35)=i 'sy
140 vdp(39)=150 'dy
150 vdp(47)=&he0 'YMMM Cmd Execute
160 if (vdp(-2) and 1)<>0 then goto 160 'VDPStatusCheck
170 next i
180 en=time
190 screen 0
200 print (en-st)/60


MSX2(3.5Mhz)環境での計測結果。
COPY文によるビットマップオペレーションはCPUを介在するVRAM間転送の為か遅い。
BASICコンパイラ利用時はCOPY文でもVDP命令を実行した時と等しく差が無い。

Normal(copy) ---- 13.8秒
Normal(YMMM) ---- 5.5秒
BASICコンパイラ(copy) ---- 4.8秒
BASICコンパイラ(YMMM) ---- 4.4秒














Date: 11/12/04 20:33:10
From: 名無しさん

Re:マイクロベンチマーク MSX Microbenchmark(Vdp access)


●VDP命令によるVDPアクセス性能マイクロベンチマーク

VDP命令そのものをテストする。
VDP(19)を利用してBASIC経由のVDPコマンド実行時間のベンチマークを調査する。
VDP(19)レジスタは画面補正(Adjust)のための設定レジスタで、実行すると画面が揺れる。

10 st=time
15 defint i
20 for i=0 to 255
30 vdp(19)=i
40 next i
50 en=time
60 print (en-st)/60

Normal 1.3 sec
BASICコンパイラ 0.3 sec














Date: 11/12/04 20:30:06
From: 名無しさん

Re:マイクロベンチマーク MSX Microbenchmark(float)

●float数値性能マイクロベンチマーク。

続いて浮動小数点演算の性能テストを行なう。
内容は三角関数を用いて0〜360までの角度を求める際の所要時間を求める。

10 defdbl a,r
20 defint i
30 st=time
40 rd=3.14159/180
50 for i=0 to 360
60 a=sin(rd*i*2)
70 next i
80 en=time
90 print (en-st)/60


動作環境はMSX2(3.5Mhz)。

BASICの浮動小数点表現は、MSXBASICでは倍精度(double)は8byte(64bit)で数値表現を行なう。
数値計算はBCD方式なので計算誤差は生じにくいが処理速度は遅くなる。
単精度Singleの場合4byte(32bit)の数値表現となる。double/singleの速度差は無い。

BASICコンパイラ上での浮動小数点表現は3byte表現による固定小数点と思われる。
倍精度数値表現(double)の場合は小数点以下14桁までをサポートするが、BASICコンパイラのfloat型の
内部表現では、小数点以下三桁までをサポートする。処理は速いが用途によっては計算誤差が生じるだろう。

Normal(double) --- 34.6秒
Normal(single) --- 35.3秒
BASICコンパイラ(fixed num) ---- 1.9秒














Date: 11/12/04 20:26:05
From: 名無しさん

Re:マイクロベンチマーク MSX Microbenchmark(Mem I/O)

●メモリーI/Oテストマイクロベンチマーク
続いてメモリーに対するRead/WriteのうちWrite性能テストを行ないます。

整数型(2byte,short int)の配列9000個の要素数に対してWriteテストを行なう。
BASICの整数型は2byte(16bit長)のsigned short intに相当する。
2byte*9000=約18kbyteのメモリーに対するWrite時間となる。
インタプリタとコンパイラの切替はcall turbo on/offのコメントアウトで行なう。

10 defint i
20 dim a%(9000)
30 st=time
40 '
50 'call turbo on(a%())
60 for i=0 to 9000
70 a%(i)=32700
80 next i
90 'call turbo off
100 '
110 en=time
120 print (en-st)/60


MSX2(3.5Mhz)。配列とカウンタ変数は共に整数。

Normal --- 28.9秒
BASICコンパイラ --- 1.1秒














Date: 11/12/04 20:22:32
From: 名無しさん

マイクロベンチマーク MSX Microbenchmark(loop)

ふと思いついたのでマイクロベンチマークを作ってみました。
テスト環境はblueMSXエミュレータ上、マシン構成はMSX2(3.5Mhz)です。
BASICインタプリタとコンパイラ双方でテストしてみた結果も掲載しておきます。
ご参考まで。



●3万回ループをするマイクロベンチマーク。
経過時間を秒で表す。

動作環境はblueMSXエミュレータ上のMSXBASIC。
BASICインタプリタとJIT型BASICコンパイラ"日本語名べーしっく君"(call run)を比較。


5 defint i
10 st=time
20 for i=0 to 30000
30 next i
40 en=time
50 print (en-st)/60


MSX2(3.5Mhz)動作時の指標。変数iの型を変えて計測。

Normal(defdbl) --- 64秒
Normal(defint) --- 30秒
BASICコンパイラ(fixnum[float]) --- 10秒
BASICコンパイラ(defint) --- 1秒














Date: 11/11/06 19:37:06
From: spica

Re:r-type mega16 a1fx+FMPAC起動でFMが鳴らない

本物のRTYPE+FMPACではFM音源鳴りますか?

たしかRTYPEはそのままではMEGA16で動かないはずなので、
その辺の加工をするときにミスっているのでは無いかと思いますが。














Date: 11/11/06 19:33:54
From: spica

Re:FM音源のディチューン

>これってマイクロキャビンな音色になるものでしょうか?
デチューンをしたからといってマイクロキャビンの曲を
PLAY文で再現出来るかというとそうではないですが、
それっぽい音は出るようになりますね。


>それと、POKE &HFAxC,y x=パート番号となっていますが
>どうしてこのアドレスなんでしょうか?
CALL MUSICを一旦実行したあとは、リセットをしない限り、
PLAY文の処理は全て(PSGのみの場合も)OPLLが乗っ取ります。
FM音源内蔵機だとイメージがつかみにくいですが、
FMPACで増設した場合のイメージだと、
元々内蔵のPLAY文(PSGのみ)の処理は完全に使われなくなり、
FMPACが全て処理するようになります。

FAxCというアドレスは元々内蔵PLAY文の処理用に使うアドレスで、
テクハンなどは内蔵の場合を前提とした説明しか出ていません。
ですが、FMPACが乗っ取った場合、少しでもメモリを節約するために、
使わなくなった内蔵PLAY文が使う領域を流用しているだけでしょう。


基本的にはFMPACだろうがturboRだろうがFM音源に関してはほぼ同じ
処理系を流用してるので使うワークエリアも同じです。

ですが、そういう経緯なので、開発者が全く異なる増設FM音源
(たとえば海外製など)だと、もしかしるとこの方法での
デチューンはできないかもしれませんね。














Date: 11/11/06 19:22:13
From: spica

Re:FS-A1WXクロックアップついて

違いは無かった気がしますがもう実機が無いので確認できません。

電源を切ると元には戻ります。














Baboo! JAPAN ご意見、ご要望などは まで
Copyright (c) 1995-2014 Baboo! 管理スタッフ
Baboo! BBS トップページ