姉妹企画

線で

センセンセーン

せんだ、みつお、ナハ

 

前回があんまりわかりにくかったというクレームと、MSXに戻って線を描いていたら「これじゃ線でセンセンセンじゃないの」という妻のクレームを聞いたその日はサラダ記念日。

 

さて、MSX(しゃば)に帰ってきたぜ。

MSXで円を書こうというこの企画だったが、スピードがものすんごい遅いのと、計算間違えてなんだか線がブーン、となってしまった。計算はチクチクかえていけばなんとかなるだろうが、スピードはどうにもなりそうにない。どのぐらい遅いかというのを知ってもらうために動画ファイルにしたので診てほしい。

http://rukeichi.jdyn.cc/okachang/en.avi

64メガもあるのでぜんぜんおすすめしないが・・・

 

これはどうにかせねばらならない。ということでマシン語にすることにした。

 

俺は涙を流さないダダッダー/ロボットだからマシーンだからダダッダー/だけど解るぜ燃える友情/君と一緒に悪を討つ

 

昔はマシン語モニタをつくったもんだったが、手順を忘れたので、コマンドを調べてみると手ごろなのがあった。

http://msx.ms/basic/DEF%20USR.txt

http://msx.ms/basic/USR.txt

MSX2のものらしいが、とりあえずこだわりをそこでは見せない。

 

で二―モック一覧を見る

http://msx.ms/z80_____.txt

これによると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    Hn

LD L,n        ・・・・・・  2E n            7     2    2    Ln

LD A,n        ・・・・・・  3E n            7     2    2    An

CALL nn       ・・・・・・  CD nn nn        17    5    3    (SP)PC PCnn

 

これがネタで今回は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

こちらがマシン語により改善された速度ヴィデオ

 

気分はトロン

 

ビューン

 

センセンセーン(最後に)

 

おわり