ファミコンのプログラム4 (567レス)
上下前次1-新
159(2): 2014/04/14(月)22:40 ID:Ye30GFaz(5/5) AAS
>>140 さんに質問です。
勉強にソースを読ませてもらってます〜
タスクのなかが下記のようなフローになっていると思うのですが理解あってますか?
...
jsr Yeild
...Vcmd_SequenceDataなど BG書き込み予約系処理、完了時はzフラグで判定...
jsr Yeild_Eq
(zフラグが立っていた場合は jsr Yieldの直後から再実行)
(zフラグが立っていない場合は、下に抜ける)
...
また、あってるとしたら、こういうフローっていうのは
8bitなアセンブラだとわりとよくある手法ですか?
C言語脳なので、pla pla とかで返りアドレス捨ててるの見て、
どこに帰るんだ〜、とか、しばらく混乱してました(^^;
不躾な質問ですいませんが、お暇だったら見て頂ければ幸いです。
160(1): 2014/04/14(月)23:59 ID:qn3GgaV0(2/2) AAS
>>159
立ってる、立ってないが逆
161(1): 2014/04/15(火)00:19 ID:Rogly49M(1/2) AAS
>>159 さん
> タスクのなかが下記のようなフローになっていると思うのですが理解あってますか?
> (zフラグが立っていた場合は jsr Yieldの直後から再実行)
> (zフラグが立っていない場合は、下に抜ける)
Yesです。
> また、あってるとしたら、こういうフローっていうのは
> 8bitなアセンブラだとわりとよくある手法ですか?
あまりないかと思います。
ゲーム屋として仕事したことはないので、どのような手法が一般的かは
知らないのですが、現在の進捗状態を番号で管理してジャンプテーブルで
飛ぶみたいな話は聞いたことがあります。
私の場合は、各処理を分解してジャンプテーブルで呼び出すのが
面倒そうだったので、次の呼び出し先のアドレスで管理する方式としました。
162: 2014/04/15(火)00:22 ID:Rogly49M(2/2) AAS
>>160
Yesと書いちゃったけど、確かに、zフラグが立っている場合に抜けるでした。
163: 2014/04/15(火)00:24 ID:4gJhlsqp(1/3) AAS
あ、ご指摘どうもです。逆でした
164: 2014/04/15(火)00:25 ID:4gJhlsqp(2/3) AAS
あら、、、フラグは z なのに beq/bne だから、頭が混乱する(xx
165: 2014/04/15(火)00:52 ID:4gJhlsqp(3/3) AAS
すいません、書き込み順の前後で混乱しました。160さんの指摘で正解ですね。
>>161
なるほど〜。ジャンプテーブルより柔軟性がありそうですね。
あと、継続っぽくてカッコイイ。
ありがとうございます
166(9): 2014/04/18(金)18:15 ID:jpWSPUfh(1) AAS
画面表示中にパレットを書き換えるサンプルプログラムつくってみたので、興味があるひとはみてみてね。
自分は、情報がなくてけっこう試行錯誤したので。
外部リンク:www1.axfc.net
メタルスレイダーグローリーのIRQ割り込みを参考にしたんだけど、
7ラインくらい表示ができないのはしかたないのか。
もっといい方法とかあったら、教えてくだしあ。
167(1): 2014/04/18(金)21:05 ID:GCyjwP+C(1) AAS
>>166
中央が黒いのは、書き換え中に色が付くのを防ぐため?
168(1): 166 2014/04/19(土)02:10 ID:ENCcy0CN(1/2) AAS
>>167
うん。
たぶん、ラスター使えるようになってラスターでパレット変更もできるぜぃ、
と思って試した人(過去の俺とか)は、なぞのゴミが表示されて悩まされてると思う。
そのゴミをHBlankに押し込めるために、16byteの書き換えに7lineも画面表示を消してるって感じです。
169: 2014/04/19(土)09:55 ID:5+3bbh99(1) AAS
>>168
そうですか。知ってたらあれですが、3Dホットラリーはもろ見えてます。
画像リンク
170: 2014/04/19(土)13:11 ID:ENCcy0CN(2/2) AAS
あ、ほんとだw
実は、3Dホットラリーの名前は以前でてたんで画面見たんだけど、
上2パレット、下2パレットくらいでやってるんじゃない?とおもって、スルーしてた。
ちゃんとパレット書き換えしてたのねw 失礼しますた
171(2): 2014/04/21(月)00:26 ID:/pAmCg0v(1/2) AAS
ゴミなんて消してやんよ
って思ったら
意外と無理だった
if ((!IsRendering) && ((VRAMAddr & 0x3F00) == 0x3F00))
PalIndex = Palette[VRAMAddr & 0x1F];
こんな仕様しらんがな
nintendulatorのPPU.cppより
172(1): 2014/04/21(月)10:13 ID:LbIV6qH+(1/2) AAS
おお、こういう原理だったのか。トンクス >>171
外部リンク[php]:forums.nesdev.com
コレみて、なんとなくパレットカキコミすると色が出るのは、理解してたんだけど、
細かい挙動はよくわかってなかった。
173(2): 2014/04/21(月)10:17 ID:LbIV6qH+(2/2) AAS
ちなみに、これってハードウェア的にはどういう原理なの?
詳しい人いたら教えて。
174: 2014/04/21(月)17:28 ID:rQaSv6+b(1) AAS
>>171
そんな断片ソースで理解できるのがすごい。
175(2): 2014/04/21(月)23:59 ID:/pAmCg0v(2/2) AAS
>>166を改造させてもらった
外部リンク[zip]:www1.axfc.net
ゴミ消した
パレットの0x0dは使えないよ
垂直同期のパルスみたいな電圧になるから
176(1): 2014/04/22(火)00:47 ID:Ncm5fcM0(1/3) AAS
レンダリング止めていればBGの色が出ると思ってた
>>166のおかげで本気出せていろいろ勉強になったわ
>>172系のやつへの理解向上
レベルが一気に3あがった!
rtiの戻り書き換えだとか組み終わった後に
外部リンク[php]:forums.nesdev.com
full_palette.s
の偶奇同期を見つけた
この簡潔なソースで横ブレの無さのキモさといったら
>>173
BGのレンダリングは内部で$3f00へアクセスするんだろうけど
そのバグ挙動なのかね
外部リンク:wiki.nesdev.com
これ結局まだいじったことないんだけど、使いこなせれば理解できるのかな!?
ところで、また謎現象を見つけてしまった
外部リンク:wiki.nesdev.com
外部リンク[php]:forums.nesdev.com
177(1): 166 2014/04/22(火)03:41 ID:+4JN+sCM(1/5) AAS
>>175
おおお、これは技術の粋が詰まったコードですね!素晴らしい!!
私もレベル3上昇して、レベル4になった〜
クロック管理が神々しく緻密・・・
ちなみに、ゲームでこのテクニックを使うとすると、IRQが入りそうなタイミングで
メインスレッドはnop連打になってないとダメという認識でおk?
とすると、実用は難しいけど、、、
ジャストアイデアとしては
2、3ラインくらい前にIRQいれて、一時的にメインスレッドをnop連打ループに切り替えて、
終わったらまたもとのメインスレッドに戻すというのは可能かな?
考えるだけで、脳髄が痛い・・・
>パレットの0x0dは使えないよ
一部の黒はつかっちゃだめというのは聞いてたんだけど、反対におぼえてたみたい(^^;
今後は0x0f使います〜
>>176 の情報も含めて、いろいろありがたい(^^
やっぱり、コードは晒してみるものだなぁ・・・
178: 166 2014/04/22(火)03:55 ID:+4JN+sCM(2/5) AAS
いままでの自分の致命的な間違いに気づいた・・・
nopは2クロックだったのね。1クロックだとばっかり思ってた(^^;
よくいままでのコードうごいてたなぁw
179: 2014/04/22(火)18:39 ID:FEq/t9cI(1) AAS
てす
180(2): 2014/04/22(火)20:21 ID:SP0raU7v(1/4) AAS
>>175
ソース読ませてもらったけど、
ldy #0
sty $2001
で、PPUのレンダリング止めると、PPUのバスが空くので
その間は自由にVRAMアクセスできたと理解していたんだが
違っていたかな?
そうであれば、HBlank待つ必要ないので、パレット書き換えで
非表示になるライン数を減らせると思う。
あと、割り込み時にはiフラグが立った状態でルーチンが
呼ばれるので sei は要らないと思う。
外部リンク:wiki.nesdev.com
181(3): 2014/04/22(火)20:38 ID:SP0raU7v(2/4) AAS
>>173
PPUのデータのバス(信号線)が1組で、PPUのレンダリング中はVRAMからデータを読み出している。
CPUがVRAMアクセスのためにPPUアドレスを設定するレジスタ($2006)とPPUがネームテーブルにアクセスするアドレスのレジスタが兼用のため、CPUがパレットのアドレスを書き込むとPPUはパレットデータを読み出してレンダリングすることになる。
と理解しているのですが、間違っていたら指摘お願いします。>他の人
182(1): 166 2014/04/22(火)20:46 ID:+4JN+sCM(3/5) AAS
>>180
>で、PPUのレンダリング止めると、PPUのバスが空くので
>その間は自由にVRAMアクセスできたと理解していたんだが
>違っていたかな?
そう思ってたんだけど、PPUのアドレスレジスタが0x3f**だと、
**の色(=ゴミ)が出力されるっていうのが、171のコード片の意味。
183: 166 2014/04/22(火)20:59 ID:+4JN+sCM(4/5) AAS
>>181
なるほど〜、
ハードウェアは素人(簡単なワンチップマイコンをいじったくらい)
なんで、解説してもらえて助かるっす。ありがと〜
用語があってるかわからないけど、バスコンフリクトってやつでいいのかな?
あとチップに損傷を与えたりはしないのかしら・・・
まぁ、あとは電子回路関係の情報で調べてみます。
184(1): 166 2014/04/22(火)21:04 ID:+4JN+sCM(5/5) AAS
連投でスマソ
>>181
追加で疑問。
そうすると、0x3f**以外のアドレスでも、そのアドレスのVRAMデータの色が出力されそうなんだけど、
0x3f**以外ではそうはならないみたいなんだよね・・・
これはレジスタ兼用でもそうならないものなのかな?
185: 2014/04/22(火)23:02 ID:SP0raU7v(3/4) AAS
>>182
なるほど、了解です。
自分も実験してみよう。
186(1): 2014/04/22(火)23:13 ID:SP0raU7v(4/4) AAS
>>184
The PPUDATA read buffer (post-fetch)
外部リンク[29]:wiki.nesdev.com
ここに $0000-$3effは内部リードバッファから返すが、$3f00-$3fffは(PPU内部の)データバスに直接配置されている
と書かれているので、この辺りの差で挙動が変わるっぽいですね。
187(1): 2014/04/22(火)23:47 ID:Ncm5fcM0(2/3) AAS
>>180
>seiは要らない
しまった、モロ立ってた
どうも
>>181
パレット$3fxxは通常はPPU内部アクセス、つまり擬似NTSC信号を生成する回路とのやりとりであって
普通のPPU空間には出力されないとどこかに書いてあった気がする
外部リンク[TXT]:nesdev.com
- palette RAM is accessed internally during playfield rendering (i.e., the
palette address/data is never put on the PPU bus during this time).
画像リンク
画像の通りパレットのアクセスはない
しかしこういう挙動もある、これはレンダリング止めた場合だろう?
Additionally, when the programmer accesses palette RAM via $2006/7, the
palette address accessed actually does show up on the PPU address bus, but
the PPU's /RD & /WR flags are not activated.
この辺あやしいね
188(1): 2014/04/22(火)23:59 ID:Ncm5fcM0(3/3) AAS
>>177
今回はjmp *にしてもHBlankに収まるっぽく大丈夫なようですが
127 line目で
$2001のレンダリングオフにする瞬間の
PPU tickのばらつきが
249〜254 nop連打の場合
249〜257 jmp連打の場合
ばらつきが3dot分増えることになります
市販ゲームのIRQ関係もゴミだらけだし気にすることはない
直前に入れるのはいいアイディアだね
上下前次1-新書関写板覧索設栞歴
あと 379 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ
ぬこの手 ぬこTOP 0.020s