[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[WitchFan 00563] 4096 色同時発色



はじめまして。
以前掲示板のほうにお邪魔させていただいたみかりといいます。

この位ならまだこちら(FanML)でしょうか。


表題にある通り、天然色の表示に成功しました。
クリスタルでしか試していないため、カラーでちらつかないで
表示可能かどうかは不明です。


・実現内容

表示領域
        最大で X:79*Y:144(残りの領域に関しては通常のタイル表示が可能)
表示位置
        完全に任意ではない(表示位置によってはパレット切り替えのタイミング
        のためちらつきが出る)
スクロール
        X方向は出来ないと考えるべき
        (細かい事=中央を超えるあたりで1ライン上下にずれることや、移動中
        にちらつく場合がある:にこだわらなければ、安定位置間の移動は可能)
        仮想Vramを広く取り先頭アドレスを変更することでウィンドウ内なら
        スクロール可能。BG1,2 を連動してY方向へのハードスクロールは可能。
ドットサイズ
        1dot単位
BIOS との併用
        (恐らく)不可
        直接の描画と割り込み関連以外なら大丈夫でしょう。
        また、排他利用も可能でしょう。
サウンドILとの併用
        不可
        VBlankを利用するドライバならあるいは。
使用パレット
        最大6パレット
使用タイル
        17キャラクタ(透明を含む)
仮想VRAM
        80*144*2 を IRAM上に確保


・用途

表示領域が限定されるため、デモ以外の用途に使うことは難しいと
おもわれます。とはいっても、デモンストレーションでも天然色ツール
で間に合わないというのもあまりないでしょうし。
全画面表示が可能だったらいろいろと使えそうなのですが……。


・原理

原理は簡単で、パレット 01-0F 11-1F 21-2F 31-3F 41-4F の縞模様を
Screen1,2の両方をつかって表示させ、水平同期を取ってパレット値
を書き換えているだけです。当初は全画面書き換えをもくろんでいたので
縞模様は 224 dot 分用意していたのですが、使われませんでした。


最初CPUの IRAM to IRAM 転送で試みたところ、32パレット程度の
書き換えが限界でした。V30MZ のクロック表によると、MOV 命令は、
1クロック動作ということだったので、100パレットくらいは書きかえられる
かと思っていたのですが無理でした。

次に、転送用のコードを Flash から IRAM に移動して試したところ、
実行速度に差はありませんでした。Tech ML の過去ログで外部メモリは
遅いと書かれていましたが SRAM の話でしたので、Flash だとそう
変わらないのかもしれないですね(どなたかメモリ転送に関して
ベンチとってらっしゃいませんか?シフト命令の実行速度に関しての
ベンチマークなら初期に見かけましたけど、メモリ間の転送に
ついてはないですよね?)


そこで OSWAN のドキュメントを参考にして、DMA 転送を試してみたところ
 84 パレットまでは同期をはずさずに転送することが出来ました。
計測してみたところ DMA の転送能力は IRAM to IRAM で、
256 Bytes/HSync = 約2.9MB/s 要するに、1 clock で 1byte の転送が
できるようです。

DMA+CPU転送なら 80+32 = 112dot の表示が出来るかと期待したのですが、
残念ながら DMA と CPU 転送を同時に行った場合同期が外れてしまいました。


OSWAN のドキュメントによると Audio DMA というというものもあるそう
なのですが、DMA と同じように値を設定して使えるというのではないようです。
DMAが2チャンネルあって同時に影響を与えず利用できるとすると、
150dot 位の幅で天然色表示できる(かもしれない)のですが。
その程度の表現が出来ればノベルゲームにも使えますよね?

(転送力が4倍あったら完全フルカラーも夢ではないのですけど)



・メモ、あるいは小ネタ

Hsyncの発生タイミングですが、原点を含むラインの割り込みは表示
ラインの先頭の1ライン上すなわち原点を (0,0) とすると、(90,-1) の
あたりで発生するようです。SwanGPU の発生した割り込み信号と割り込みの
間に遅延があるのか、実際のタイミングがそうなのかは不明ですが、
水平方向の表示が 80-100dot 進んだあたりから割り込みハンドラの処理が
行われるようです。(-1,224) くらいで発生してしばらくブランク期間があったり
するのかと思っていたのですが、実際には表示期間中に割り込んでくるのですね。
意外な実験結果でした。パレットや、BGパターンを水平帰線で書き換えようとする
場合は注意が必要かもしれません。

セグメント部の表示状態も影響を与えるようです。

※画面を消してボーダーカラーのパレットを HBlankCount 割り込みで1ラインづつ
  変更するという方法で調べたところそのあたりに色の断層が出来ていました

表示ラインは、0-158 のようです。144-158 の個所が垂直帰線期間。


ラスタースクロール等でライン途中で段差が出来ないので、もしかするとスクロール
ポートの値は描画開始時にラッチされた値を利用しているのかもしれません。
(未検証)

もしそうでないとしたら、Busyウェイトでタイミングを取って左右に伸び縮みさせる
という効果の作成が可能かもしれません。応用としては、Final Fantasy の
飛空船に乗ったときの効果をフルで再現するなどでしょうか(スワン版では奥行き
方向への縮小が無くなっていました)



・展望

もうすこし、ブラッシュアップしたらデモコードを公開します。
タイル表示と、文字表示を行って、天然色表示の画像を3枚程度
切り替えるようなデモを作っているところですので、公開したら
他のカラーやクリスタルで同じように動作するか試してもらえると
幸いです(カラーは水没でお亡くなりになってしまいました)

ILの形に出来ると使いやすいかもしれないですが、こちらは時間が
取れたら挑戦してみます。

高解像度でのアプローチはこれが限界だろうと思われますので、
あとは使い勝手の向上を目指すのがよさそうですね。
見た目は結構きれいなので表示範囲の狭さがやっぱりネック。


・展望2

低解像度(56*36) ならば転送能力にも余裕がありますので、
その方向のアプローチも試みようと思います。

これが実現できたら、拡大回転縮小を駆使したゲームの作成も可能となる
でしょうから、何か作ってみようと思います。CPUが V30 8MHz 相当と非力
ですが、OF/PD/SG くらいになると難しいとしても、MF くらいなら
なんとかなるかもしれません。
↑それぞれ NEC の 98x1 シリーズで VRAM の縦方向拡大表示を利用して、
80x50のローレゾリューションドットマトリクス相当の VRAM を作成し、拡大、
縮小と立体演算を活用して作成されたインディペンデンスソフトの略称です。
    MF:ヘリコプターシューティング
    OF:浮遊車レーシング
    PD:悪路バティックレーシング
    SG:ガンシューティング


それでは何か進行があったらまた投稿します。

                              みかり☆でした



ML Archives