ファミコンのプログラム4 (563レス)
1-

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
省7
177
(1): 166 2014/04/22(火)03:41 ID:+4JN+sCM(1/5) AAS
>>175
おおお、これは技術の粋が詰まったコードですね!素晴らしい!!
私もレベル3上昇して、レベル4になった〜

クロック管理が神々しく緻密・・・
ちなみに、ゲームでこのテクニックを使うとすると、IRQが入りそうなタイミングで
メインスレッドはnop連打になってないとダメという認識でおk?
とすると、実用は難しいけど、、、
ジャストアイデアとしては
2、3ラインくらい前にIRQいれて、一時的にメインスレッドをnop連打ループに切り替えて、
終わったらまたもとのメインスレッドに戻すというのは可能かな?
省6
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フラグが立った状態でルーチンが
省2
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).
省7
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関係もゴミだらけだし気にすることはない

直前に入れるのはいいアイディアだね
189: 2014/04/23(水)17:56 ID:eYt0ULQB(1) AAS
>>186 >>187
なるほど、、、
まだ理解してないけど、このあたり読めばわかる気がしてきた。ありがと

しかし、PPUのアドレスレジスタの兼用さえなければ、レンダリング中に読み書きできて
BGアニメーションとかもっと便利だったろうにって思ってたけど、
Ntsc_timing.png みるかぎり、ひっきりなしにアクセスしてるんだね・・・
とするとメモリポートが2つないとだめだから、結局は無理だったのか。

>>188
了解。
sei/cliさえしなければ最大6クロックだから、6*3=18dot(nopにくらべて12dot大きく)
省2
190
(1): 2014/04/23(水)20:09 ID:yop1NMPn(1) AAS
この現象で分った事。
パレットの04 08 0Cは00とは別の値を格納できるが、実用上何も使われていないと言う事(合ってるよね?)。
191
(1): 2014/04/23(水)21:35 ID:bXRTGLw+(1) AAS
↑あってるっぽい
ただしスプライトの四の倍数とは共有か

void _fastcall Write7 (int Val)
{
if ((VRAMAddr & 0x3F00) == 0x3F00)
{
register unsigned char Addr = (unsigned char)VRAMAddr & 0x1F;
Val = Val & 0x3F;

Palette[Addr] = (unsigned char)Val;
if (!(Addr & 0x3))
省1
192
(1): 2014/04/24(木)07:57 ID:RDg08ToE(1/2) AAS
流れぶったぎるようで申し訳ないけど、デバッガ機能が一番使いやすいNESエミュはどれですか?
1-
あと 371 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.022s