MZ700GBA開発日記のようなもの


2005/10/09

とりあえずここまで動いた…。
VRAMしかエミュレートしてないので、起動時のビープを鳴らすところで無限ループに入ってます。

しかしこの段階でかなり速度が遅いような気がする。
どうしよう。


2005/10/11

ぐええなんだこりゃ重すぎるー
これでは実使用に耐えん!


2005/10/13

GBAの表示画面は240x160ドットしかないので、MZ-700のテキスト画面(40x25)のエミュレートをやろうとすると1文字を6x6ドットで表示するしかありません。そーするとGBAのBG画面は8x8ドット単位のため使えないので、仕方なく256色ビットマップモードでゴリゴリ描いていたんですが、これではやっぱり遅い気がする…。

が、8x8ドットの枠内に右詰め/左詰めで2種類のパターンを定義してBG面2枚をうまいこと重ね合わせれば、横方向に関しては何の問題もなく6x6ドット文字の40桁表示ができることに気づいた。BGならパターン番号を書くだけでパターンが表示されるので高速化が期待できます。MZのVRAMはBG面だけで再現できそう。

縦方向は8ドット単位になってしまうので2ドットずつ隙間が空きますが、これは指定ラスタ割り込みでBGのスクロールレジスタをいじって縮めます。いきなりラスタ割り込みか…。

というわけでテストプログラムでゴリゴリ。できたー。
これで多少は高速化されることを期待…。

全然速くならなかったー!! ガーン


2005/10/14

BG面を使っても全然速くならなかったので簡易スピードメーターをつけてみた。左に行くほど高速で、緑部分が実機以上の速度。

遅すぎる…(泣)

ちなみにギャラクシアンはこのあとスタートすると暴走。


2005/10/16

インデックスレジスタの実装がものすごい間違ってた。はずかしー
直したらランドエスケイプが動くようになった。ギャラクシアンは自機だけ出てくるようになった。何故。

スタックでレジスタ保存とかしてたところを全部取っ払ったらちょっとだけ速くなった。でもまだまだ遅い…(泣)


2005/10/17

命令フェッチを

    opecode = mem_read_cycle(pc);
    pc = (pc+1) & 0xffff;
的な実装から単なる opecode = *p++; に変えた。(実際はアセンブラですが)
これだとPCがオーバーフローしたりDRAMからVRAMに突入したりすると正しく動作しないんですが、まあそんな組み方しないだろうということで…。
でも大して速くならなかった。泣。

DD CB系の隠し命令のあたりの実装を変えたらギャラクシアンが動くようになった。


2005/10/18

分岐だ! 分岐命令を排除するのだ!
というわけでARMの1クロックは血の一滴とばかりにゴリゴリとせこい最適化。意外と速くなった。ばんざーい。ってもまだ割り込みとか8253とか実装してないのでまた遅くなるんですが。
そのへんが未実装のせいかホッパーさんはゲームスタートすると固まってしまいます。泣。

MZ700Winのソース見たらハーフキャリーフラグの算出法が膝ポンものでした。というかこれに気づかないとはまだまだだわ…。


2005/10/20

サウンドを実装してみた。8253のカウンタ0への書き込み値を変換してGBAのGB互換音源(矩形波)に突っ込んでるだけですが。それっぽく鳴ってるけどノイジーだなあ。ランドエスケイプの面クリア時の「ぴうーーーぅ゛----」では明らかに違う音が鳴っている…。

今回音だけなのでスクリーンショットなし。


2005/10/21

8253と割り込みを実装したらビルディングホッパーが動くようになった! て…鉄アレイの音が実機と同じなんです!!(わかりにくい感動をお伝えしています) 敵つぶれ音は全然違う音が鳴っちゃってるんですけどね。

スペースハリアーはまだ動かない…。


2005/10/23

ランドエスケイプの面クリア音やビルディングホッパーの敵つぶれ音が正しく鳴るようになった。

8253のモード3(矩形波出力モード)においてカウント値をガンガン変更しまくっても、反映されるのは1波長分の切れ目なので、出力はちゃんとデューティ比50%のきれいな波形になる。が、エミュレータではカウント値の変更をGB互換音源に即反映してしまっていたので、ガンガン書き込まれると出力がほとんどHigh側に張り付いてしまって音にならなかったのでした。

さてどーすりゃいいんだーというと初回の発音以外ではGB互換音源のInitial(Restart Sound)ビットを立てずに周波数だけ変えればよいのであった。これでほぼ8253と同じ動作になってる模様。


2005/10/25

IPL ROMイメージとテープイメージを後からくっつける構成にした。今までダンプしてCの配列にしてからまたコンパイルするというめんどくさいことをしてたんですが、さすがにテープイメージを取り替えるほうがめんどくさくなってきました。

んで色々と試してみたんですが、
…古籏氏のゲームが全部動きません(泣)
S-BASICとHuBASICも動きませんよ? だめだこりゃ〜


2005/10/26

8253のカウンタ・ラッチ・オペレーションってRead/Loadの設定が保存されるのかー! 修正したらS-BASICとHuBASICが動くようになった。どっちもIPL ROM内の?TMSTで死んでた。時刻設定で8253に書き込んだ値とカウンタの値が一致するのを待つループで読み込み値が正しくなかったために無限ループしてました。しかしマニュアルにIPL ROMのソースが載ってるってすばらしい。

んでもってZ80エミュレータのコードを見直したらインデックスレジスタ関係の命令にバグがぼろぼろと…。よくこんなんで動いてたなあ。見つけた限りのバグを修正したところ、スペースハリアーが動くようになりました!


2005/10/28

MZ700Winと同じ仕様でテープイメージの読み込みエミュレーションに対応。2段ロードが可能になったのでほとんどのMZTイメージが動くようになった。やったー。(といってもそんなに色々持ってるわけではないが…)
あとMZ-NEWMONITORにもテキトーに対応。

VisualBoyAdvanceはDMA3のラスタ同期DMAのエミュレーションをやってないみたいだなあ。実機でしか動かん。実機でも本来の目的(フレームバッファの表示済み部分を更新する)以外に使うのは難しそうだ。指定ラスタ割り込みを使わなくてもすむかと思ったのになー。



2005/10/31

ボタンのカスタマイズが出来るようにしたので、tiny XEVIOUSで弾が撃てるようになった(笑)

あとBASICプログラムの自動実行の実験。IPLからの機械語プログラムの自動実行はIPLのホットスタートアドレスをパッチしてLコマンドに飛ばすだけでいいんですが、BASICプログラムはそうもいきません。いろいろ失敗した結果「BASICのロード後ちょっと待ってからファンクションキーを(内部的に)押す、ファンクションキーには『RUN"[CR]』を入れておくようにパッチ」という手抜きくさい方法で解決。
MZ700WinのBASICパッチを流用することでテープからのロードも何の問題もなく動きました。ありがたや。


11/03

テープイメージをまとめてくっつけといて起動するイメージを選択する機能を超適当に作った。設定ファイルに各イメージ用のキーアサインを書いてエミュレータのバイナリに結合するようにしたので、コンパイルせずに使えるようにはなったはず…。


2005/11/12

分岐がいやなら自己書き換えすればいいじゃない
との悪魔の囁きにあっさり従ってしまいました。まあGBAのARM7TDMIには命令キャッシュも無いことだし。

しかしもう焼け石に水程度にしか速くならん…。


2005/11/16

爪に火をともすような最適化を続けておりますよ。計算間違いで速度メーターの緑部分が2目盛多かったしな(泣)
そして必死こいてレジスタを1本空けた。これでAF,BC,DE,HL,SPは全部ARMのレジスタに割り付けられる! やったね!(やったねとか言われても)

使用頻度の高いZ80のAレジスタは単独でARMのレジスタ1本を割り当ていて、ふつーにBit7〜0に値を格納してたのですが、よく考えたらBit31〜24に割り当てたほうが効率的だった。演算結果のオーバーフローを捨てられるのと、ARMはあらゆる演算の前に第2オペランドに対して強力なローテート/シフト操作をノーコストで行えるため、上位ビット詰めで配置することに特にデメリットがない。もう速くならね〜と思っていたがまだまだ甘いね。

しかしARMのアセンブラは楽しいなあ。Cコンパイラとか使うのは大損。台無し。とまで思える。しかもGBAのARM7TDMIはパイプライン3段キャッシュなし、てことで簡単に実行クロック数が数えられるのもステキポイントだね。いやん。


2005/11/24

ようやく平均的にMZ-700の実機よりちょい速いくらいの速度で動くようになったので、垂直タイミング60Hzでタイミングを合わせるようにした。作り始めたときは実用的な速度で動くかどうかも怪しかったものですが、やれば速くなるものだなあ。

EUGEAでスクロール時にちらつきが見えるようになっちゃったので、ノーウェイトモードも選べるようにすべきかもしれない。EUGEA、盾は洞窟に無造作に置いてあるのですが剣のほうが見つからない…。無くてもラスボス倒せちゃうみたいだけど。


戻る