since 2014 3.19 by TPM.CO / update 2014 11.8 go toトップページ




日頃の行動をメモ。消しゴムで消して作品へと昇華する前の、日々の下書き。
This is my dairy memo. These will be a work after brush up process. .




    2014.SEP

9/3 ループ無駄排除

先日タロティカを学生さんにプレイしてもらったら、手の甲がつりそうと言われた。検証してみると扉が表示されるまでに微細に間があるため無意識にキーを押しっぱなしにしてしまうことがわかった。
よって、表示ルーチン周りの速度向上を検証へ。以下が現行の画像表示コード。



若い自分が90年代に書いたコードだけあって無駄がかなり散見できる。

A9A7番地からA9BE番地がメインループだが、結構な数のPUSH/POPがあり、あきらかに時間を浪費しているのがわかる(もちろんサブをコールする前に退避させる基本的な組み方である)。ループ内に裏レジスタも使っていないので使うことで速度アップが期待できる。
また、メインループ内に定数ロード(A9AA番地)があるが、これはループ外でレジスタに入れておきたい。
ループ内の無駄はループ分累積するため、速度アップを図りたいならループ内部の無駄を排除するのがプログラムにおいては鉄則で、そこはMSXだろうと64bitだろうと同じである。

まず膨大なPUSH/POPを解消したい。そのためには、A9B1番地の5Cサブルーチンがどうレジスタを使っているか?を知る必要がある。この 5Cサブは、メインメモリ(HLレジスタが指す)の内容を、VRAM(DEレジスタが指す)に、BCレジスタの数だけ転送するBIOSサブである。MOLITORで、5C番地からコードを追っていく



780番地にジャンプしているので780番地へ


裏レジスタは使っていない。しかし、MSXというのはいろんな会社から発売されており、どの機種がどうプログラムしているかはわからない。今使っている機種がたまたまこのコードであるだけだ。BIOSエントリでは「使用レジスタ:すべて」と記載されてあるので、ほかのMSX機種で裏レジスタが使われる可能性は排除できない。となると呼ぶ前に裏レジスタを使うと、それも退避させる必要がでてしまい、今よりpush/popが増えてしまう。

そこで、上記サブをコールせず、サブ内のコードを引き写せば裏レジスタも使えるし、闇雲にpushする必要もなくなる。VRAMへのアクセスは別途ルールがありそれに従えば互換性は守られる。

よく見ると、078F番地で転送先vramアドレスを設定したあと、OUT命令でちまちま転送している。なぜまとめて転送できるOTIR命令を使わないのだろう?と一瞬思うのだが、実はOTIR命令のカウンタはLDIR命令などと違いBCではなくBのみなので、256コ以上の転送ができない。よってこういうコードになっていると思われる。
幸い、今回のBOXOUTルーチン内は、1ループあたり256コ以内の転送になっているので、OTIRを使うことができる。

改良したのが以下



PUSH/POPがなくなりシンプルになった。
元のコードで、DEレジスタに100Hを加算していた部分も、実体はEレジスタに下位00、Dレジスタに上位1を加算するだけなので、実は、INC Dで代用できることを発見、さらにシンプルに。

ただ、内部で定数、つまり(0DE05H)の値を何度も読み直しているのが無駄である。また LD,C98Hもループ外に出すべきだ。
しかし現状ではもう使用できるレジスタがない。そこで裏レジスタを使う方法を考える。
よくよく観察すると、VRAMアドレスを設定するCALL 53Hと、転送するOTIR周りは独立している。よって、どちらかを裏レジスタ側に入れておけばいいことがわかる。そうするとDEレジスタが浮く。

以下が最終完成コード:



冒頭でDEレジスタの内容を裏レジスタに送っておくと、表のDEレジスタがフリーになるので、内部の定数読込をループ外でEレジスタに読んでおき、また、ループ数値が入っているBをDレジスタに入れ、これをループ変数とできた。つまりループカウンタAを退避させていた EX AF,AF' が削減できる。これはpush/popをなるべく削除する発想と同じである。また、OTIRで使うCレジスタの定数もループ外で定義。

結果、それまで1ループ142サイクルかかっていたが、37サイクルになり
恐ろしく短くかつ速くなった。おそらくこのコードが最速であるが、こういった突き詰めはパズル面を作る過程と似ていて美しい。

otir命令がBレジスタ必須でなければ、BレジスタをDJNZループにすればdec命令が削れるのでキレイだ。


9/18-9/21 東京ゲームショウ2014

Our game at TOKYO GAME SHOW 2014 indie booth.

東京ゲームショウ2014のインディーブースにて4日間、タロティカブードゥーを出展

準備中..

週刊ファミ通のメディアアワード ノミネートをいただきました!

ちなみに担当の方は後日バッタリ出会って「実はワタシでした!」とノミネートのことを言われておりました。ああ、アナタだったんですね〜と(笑)結構やり込んでいたので私も憶えていたのでした。ちなみに彼女同様、今回女性率が結構高く、それもちゃんとゾンビを倒せたりするのでオドロキでした!女性向けのゲームを作るといいのかも?(笑


ブース全容。
右が、HB-F900(MSX)で、左がpc上でのMSXPlayerでの展示。
背景に巨大な全体mapを作成。黒が美しく仕上がった。後日訪れたメディア?の方に「なんというゲームですか?」といわれて初めて、ああっ!タイトル表示がない!と気づいたほど(笑)


たくさんの方にプレイいただきました!見た目が地味なため、お声をかけてプレイいただくことが多かったのですが、プレイ後「ゲームショウに来た甲斐があった!」と言われることが多く、嬉しかったです。もちろんなんとなくでは遊べないゲームなので、最初の犬を倒せず諦める方も半数くらい居ました(笑)ゲーム冒頭で犬に負け「わ、死んだ!」と驚く方が多かったのも印象的でした。

プレイいただいた方で名刺を下さった方には、後日思いついた、BGMをピアノ演奏した限定動画をお礼でお送りしました。散々遊んだ人には耳に残るメロディなので体験が蘇るかなと(笑)こちらも反響が大きく嬉しかったです!



to be described..

...
このページでは私の成果、発見のみ記述しております。