姉妹企画
線で
センセンセーン
せんだ、みつお、ナハ
前回があんまりわかりにくかったというクレームと、MSXに戻って線を描いていたら「これじゃ線でセンセンセンじゃないの」という妻のクレームを聞いたその日はサラダ記念日。
さて、MSX(しゃば)に帰ってきたぜ。
MSXで円を書こうというこの企画だったが、スピードがものすんごい遅いのと、計算間違えてなんだか線がブーン、となってしまった。計算はチクチクかえていけばなんとかなるだろうが、スピードはどうにもなりそうにない。どのぐらい遅いかというのを知ってもらうために動画ファイルにしたので診てほしい。
http://rukeichi.jdyn.cc/okachang/en.avi
64メガもあるのでぜんぜんおすすめしないが・・・
これはどうにかせねばらならない。ということでマシン語にすることにした。
俺は涙を流さないダダッダー/ロボットだからマシーンだからダダッダー/だけど解るぜ燃える友情/君と一緒に悪を討つ
昔はマシン語モニタをつくったもんだったが、手順を忘れたので、コマンドを調べてみると手ごろなのがあった。
http://msx.ms/basic/DEF%20USR.txt
MSX2のものらしいが、とりあえずこだわりをそこでは見せない。
で二―モック一覧を見る
これによるとC9が終了コマンドのようなので、それを特定の位置に書き込んでそこへUSRコマンドを呼び出せば動作が確認できるだろう。と同時にPCというのをいじくってもモニタつくるのをなんとなくおもいだした。
でこーだ
さてどうなるか
OKと出た、終了命令だけなのでもっともだ。本当に動いたかどうか分からないので、てっとりばやく暴走させてみる。
無限ループとかがいいだろう。JPコマンドがあるんだが、
JP nn ・・・・・・ C3 nn nn 10 3 3 PC←nn
エンディアンはどうなのか
インテルなのでとりあえずリトルエンディアンでやってみる、
こんなかんじかよ
予想どおりうんともすんともいかなくなった。
暴走成功
ためしにビックエンディアンでいってみたが、普通に終了してしまった。たぶんリトルでいいんだろう。
そんでもって、Z80の命令はZ80CPUに対してで、Z80CPUというのはビデオ関係のチップは搭載されていない。ということで、だいたいこういう場合にはとあるアドレスに対して呼び出しを行うとVRAMのほうに命令を送ってくれることになっている。DOSのときにはBIOSとよんでいたが、MSXのときもBIOSといってたか忘れた。
インターネットからサンプルソースを入手した
C000 LD
H,18H
C002 LD
L,00H
C004 CALL
0171H//VDP呼び出し
C007 LD
A,01H
C009 CALL
0177H//VRAM呼び出し
C00C RET
でもってこれをハンド逆アセンブルする。
LD H,n ・・・・・・
26 n
7 2 2 H←n
LD L,n ・・・・・・
2E n
7 2 2 L←n
LD A,n ・・・・・・
3E n
7 2 2 A←n
CALL nn ・・・・・・
CD nn nn
17 5 3 −(SP)←PC PC←nn
これがネタで今回はBASICで打ち込む
サンプルのページでは漢字が表示されるという話だったが、
ぽちっと
左上にニコチャンマークが表示されることとなった。
ここまで動いているから16ビット時のアドレス表記などはリトルエンディアンであることは間違いがなかろう。わお
今回はゴールデンウィーク中なので、時間を延ばしておおくりしたい。ネタは水増しさせてもらいたい。
暴走成功
さて、コマンドの確認だ
NSTWRT (0171H)
機能 VDP にアドレスをセットして、書き込める状態にする
入力 HL に VRAM アドレス
出力 なし
レジスタ AF
NWRVRM (0177H)
機能 VRAM にデータを書き込む
入力 HL に VRAM アドレス、A にデータ
出力 なし
レジスタ AF
これもMSX2用のものらしいがここではこだわりを見せない。
ここまできてAのデータをかえればScreen2にも応用できる気がしてきた
こんな感じか
れっつら
Go------
左上のほうに黒いせんがひけてるのがわかるだろうか?
わかりづらいのでVRAMの座標をかえる
まじもんで線が引けているのがわかった。
それではこれをループさして、ほんまもんのマシン語のスピードを味わってしんぜよう。
こんなかんじで足すかな
C000 LD B,FFH//カウンタ
C002 LD
H,18H
C004 LD
L,00H
C006 CALL
0171H//VDP呼び出し
C009 LD
A,01H
C00B CALL
0177H//VRAM呼び出し
C00E INC HL //座標のインクリメント
C00F DEC B //カウンタのデクリメント
C010 JP NZ,C007 //ゼロ判定ループ
C013 RET
INC HL ・・・・・・ 23 6 1 1 HL+
LD B,n ・・・・・・ 06 n 7 2 2 B←n
DEC B ++?V1・ 05 4 1 1 B−
JP NZ,nn ・・・・・・ C2 nn nn 10 3 3 If NZ PC←nn
するってえとこんなソースだ
以下驚異的な成果が・・・・
http://rukeichi.jdyn.cc/okachang/machine2.avi
こちらが改善前の速度ヴィデオ
http://rukeichi.jdyn.cc/okachang/machine.avi
こちらがマシン語により改善された速度ヴィデオ
気分はトロン
ビューン
センセンセーン(最後に)
おわり