ファミコンのプログラム4

2012/07/29(日) 14:19:03.64ID:a5QeqSA0
■過去スレ

ファミコンのプログラム
http://pc8.2ch.net/test/read.cgi/gamedev/1013696305/

ファミコンのプログラム2
http://pc11.2ch.net/test/read.cgi/gamedev/1135099156/

ファミコンのプログラム3
http://toro.2ch.net/test/read.cgi/gamedev/1214210285/

■関連サイト

MagicKit Homepage
http://www.magicengine.com/mkit/
すずめ愛好会
http://web.archive.org/web/*/http://vsync.org/ns/index.html
ギコ猫でもわかるファミコンプログラミング
http://gikofami.fc2web.com/
わいわいの巣
http://www.geocities.jp/yy_6502/
mck hogehoge
http://takamatsu.cool.ne.jp/dutycycle/
NES info, programs, and demos
http://nesdev.parodius.com/
pgate1@crystal
http://crystal.freespace.jp/pgate1/
cc65 @ wiki
http://www34.atwiki.jp/cc65/
2013/10/28(月) 15:22:51.38ID:mnXgpw7y
キラキラスターナイトの音楽って当初はmckで作ってログなんだってな。
音楽で800kbとかワロタ。
最終的には92のサウンドドライバにさしかわったそうだ。
2013/11/22(金) 17:22:34.78ID:0CxishgT
すいません、16進数でFCはリターンですか?
2013/11/22(金) 19:13:43.33ID:ePLUfS2n
難しい質問だ
2013/11/22(金) 21:49:34.37ID:dQaQiKPU
6502の話ならRTSは0x60でしょ
0xFCは未定義
2013/11/27(水) 18:47:29.95ID:2qPkVWWu
6502は未定義命令多いよね
2013/11/27(水) 22:25:07.60ID:AIPgO1s0
108です、ポートピア連続殺人事件のバイナリを見ていて
文章の後からなずFCになっているので
文章のサブルーチンからリターンするコードがFCなのかな?と思ったのです
未定義というのはユーザー定義で自由に使えるということなのでしょうか?
だとすれば中村光一氏が定義したのかな?と思います
2013/11/27(水) 22:34:47.33ID:2GaPYVty
な、なんだってー!! Ω ΩΩ
2013/11/27(水) 23:17:01.96ID:H3/K2JY+
ただ単に、文章の最後を表すために、FC使っているだけ。
ちなみに、ポートピアなら、固有名詞にも特定の値を当てはめて、
容量を節約している。
2013/11/27(水) 23:56:34.99ID:xJTLP5X/
なんだ、ただのバカじゃねえか
2013/11/29(金) 23:43:36.26ID:+yLhVUXN
>>112
君はまず命令とデータの区別をつけるところからだな
あと未定義というのは何らかの既定の動作はするが使い道が無いということ
他と同じ動作だったり、ナンセンスな動作だったり、何かを破壊したり
2013/12/28(土) 09:38:36.09ID:NXkYsMWn
6502の未定義命令表ってどっかに落ちていたような・・・
とはいっても2a03とオリジナルで違うような気もする
2014/02/25(火) 00:48:36.47ID:PEseuuNL
同人でファミコンゲーだしてみたいので勉強中
実機でできるようになるまで遠いなぁ
2014/03/11(火) 21:45:52.01ID:xOOt/lks
BG読書き時のレジスタアクセス等の手順を日本語で正しく説明しているサイトってないかね?
2014/03/11(火) 23:17:40.95ID:Ee7AGpD7
古い情報を掲載してるとこしか知らない。
どこかで詰まってて表示できないとかトラブル抱えてるならソースファイルちょっと見せて?
2014/03/12(水) 00:28:23.93ID:WZH/SRI7
ロジックは正しいハズなのにBG表示上手く行かねーって時あるけど
そういう時って大抵「ブランク期間中に全ての処理を一括でやらせて終わるのを待つ」的なロジックだったりする

ファミコンさんって割とレトロで非力な環境なので、毎フレームBG全書き換えできるほど速度早くないっていう。
なので、BG書き換え期間中は非表示にして、書き換え終了後にのみ表示する設定にすると、うまくいく事がある。
122名前は開発中のものです。
垢版 |
2014/03/12(水) 01:37:23.21ID:sVRc03+V
スクロールレジスタ戻してないに1票
2014/03/12(水) 21:31:45.55ID:AKXlzqE0
まだこのスレ見てる人結構いるんだな。。。。
2014/03/20(木) 16:18:48.51ID:NcrvcaHS
スレチかもしれんがSFCのことについて聞きたい。
65816でCOP命令ってあるよね、あれ普通のソフトウェア割り込み命令とどう違うの?
てかコプロセッサ使用時にどう使えばいいの?
2014/03/20(木) 23:57:41.03ID:nDoqvjBg
別枠で跳び先用意してるだけで、仕組み自体はソフトウェア割り込みそのもの。
意味があるかは別として、コプロセッサを使う以外の処理にも使用できる。(使用頻度が高いルーチンの呼び出しとか)
コプロセッサは、COP命令発行後、割り込みベクタを参照して飛んだ先のルーチンで、普通にI/O叩いて使う。
パラメータ渡したり、処理に違いをつけたかったら、レジスタで処理番号渡してルーチン側で分岐とか、
スタックにパラメータ積んどくとか。

ちょっと昔のパソコンで浮動小数点演算ユニット使うのとあんまり変わらない。(というかそのものか)
2014/03/21(金) 00:22:20.42ID:P1JaUJrV
【65816:SNES】アセンブリ【6502:NES】
http://toro.2ch.net/test/read.cgi/gamedev/1109955393/
2014/03/21(金) 00:23:50.90ID:P1JaUJrV
スーファミのプログラム
http://toro.2ch.net/test/read.cgi/gamedev/1095063252/
2014/03/27(木) 11:27:04.95ID:Boex24sn
去年あたりにCPUとPPUのデータシートが流出したって聞いたが本当かね?
2014/03/27(木) 11:33:55.73ID:6ZjkSFol
バーイ ハドソン
2014/03/31(月) 23:12:27.47ID:2ZMIQNqL
ネトウヨ「国際司法際はチョン」

なのに竹島問題もハーグで決着つけようとかいってるジャップwwww
2014/04/04(金) 07:14:22.67ID:stHAjJOS
http://www1.axfc.net/u/3214070.zip
ファミコンゲームです。操作方法は付属のtxtを参照
2014/04/04(金) 08:34:30.32ID:FAM6mLE7
>>131
fceuでは正常に動作しています
133131
垢版 |
2014/04/04(金) 16:51:41.09ID:stHAjJOS
>>132
動作確認ありがとうございます。
2014/04/05(土) 21:35:51.55ID:RihLvMZN
nnnesterJでも動いた
ずっとやってたらCLEARって表示されたわ
135131
垢版 |
2014/04/07(月) 06:20:21.08ID:ANvPoB1w
ありがとうございます。あと、透明な敵が現れるバグがあるのと、
静岡県立沼津工業高校の校歌を使っています。
2014/04/07(月) 07:28:54.96ID:fDBMyb5C
>>119の子か。お礼ぐらい言えないのかね。
2014/04/07(月) 15:41:53.87ID:YJHniqKP
2014/04/09(水) 17:36:23.74ID:Aiee0k4j
6502プログラミングの基礎はどうやって勉強するんだろ
アセンブラ言語そのものは分かるけど実装技術が・・・
2014/04/10(木) 21:35:34.35ID:hnCuty6F
>プログラミングの基礎
6502のCPUの割り込みベクタとかの仕様を確認理解して、
他人が書いたソースコードを読んでいくのが良いかと。

ファミコン(古いゲーム機)のプログラミングは、初期化の後、
VSYNC待ち→1フレーム分の処理
の繰り返しとなる独特のプログラム構造を理解する必要があるかな。
2014/04/10(木) 21:41:45.23ID:hnCuty6F
開発途中で、まだゲームの体裁になっていないけど、自作のソフトをさらしてみる。
src.zipにソース一式入っているので、参考頂ければ幸いです。

http://homepage3.nifty.com/~kyoske/nes/RevolvingGems.zip

十字キーでカーソル移動、Aボタンが時計回り、Bボタンが反時計回りに宝石を回します。
宝石が4個以上つながったら消滅します。
2014/04/12(土) 04:57:10.26ID:IdgE9LS/
おお、すげぇ

宝石がヌルヌル流れるのがいいね。
なんでわざわざラスターしてるのかとおもったら、パレットのために必要なのか。
勉強になる・・・
2014/04/12(土) 13:04:08.62ID:BjcqFb8t
すごい
仕事がコンピュータに関係ない仕事で趣味だけでここまで作ったのなら偉いと思われるレベル
当時のベーマガに投稿していれば採用されたと思う
2014/04/12(土) 16:34:03.45ID:D7Ld43hD
>>140
なかなか出来が良さそう
.macro 〜 .endm (引数付きで)
.func
なんかも使うと楽になる場合もあるよ

>>140
ttp://wiki.nesdev.com/w/index.php/Controller_port_registers
$4017への書き込み(W)によるstrobe(コントローラーのリセット行為)は無意味、
そもそも出力ポートにつながってないかと。
strobe行為は$4016だけで十分。

$4016のbit0が1か0かで、
Tコン、Uコン、bothのコントローラーの中のTC4021BP(シフトレジスタのIC)の、
パラレル、シリアルの各モードが変わる。
1→0で押しボタンのパラレルデータがシフトレジスタに取り込まれて、
シリアル化されたということだ。

シリアル化されたデータは
Tコンは$4016の読み込み(R)で、
Uコンは$4017の読み込み(R)で、
それぞれ独立にシフトされる。

ttp://green.ap.teacup.com/junker/116.html この回路図もいいな
ttp://nesdev.com/Ntd_8bit.jpg

>>141
パレットはいじってないよ?
2014/04/12(土) 19:24:29.80ID:Gzkbouk5
欲を言えば、宝石回転をもっと速くして欲しい。
145141
垢版 |
2014/04/13(日) 00:08:08.07ID:KkvqpUBo
>>143
>パレットはいじってないよ?
パレットというか、アトリビュートテーブル?
ラスターしないとパレットの違う宝石が水平に8ドットずれの位置で表示できないよね
2014/04/13(日) 16:38:48.65ID:SW34DfG1
ラスタスクロールでずらす、って発想すごいなー。
こういう使い方初めて見た。勉強になりました。

当時もこういう使い方あったのかな?
ヘックスマップの戦略シミュとかでも使えそうだ。
2014/04/13(日) 21:10:32.33ID:mdytbhuJ
>>146
理解力なさすぎ
いくらでもある

スプライト0ヒットで同期とった分割スクロール
  スーパーマリオ、エキサイトバイク
ラスタースクロールの塊
  F-1レースのカーブ演出、ドラクエVとWの旅の扉、rstrdemo.zip(VirtuaNES作者による)
IRQで同期とったスクロール(これが無ければゲームにならぬ)
  >>140、ロックマン3(武器、ボス選択、ワイリーステージ高速リフト)
  http://nozomi.2ch.net/test/read.cgi/gameurawaza/1352627490/143


>>145
色だけがズレるわけじゃない、BGそのものがズレる。
>>140の作品やいろいろなゲームの
G-NESのIRQライン表示をみてみ、ネームテーブル表示みながら。
無機能初期カセットのスプライト0ヒットのゲームでは何も表示されないけど
148145
垢版 |
2014/04/14(月) 00:05:28.57ID:Ye30GFaz
>>147
なんでそんな否定からはいるのさ?

「アトリビュートテーブルの制限で、パレットが2x2BGキャラクタごとにしか
指定できないのを回避するために、ラスターでずらしてるのね」
まで言わないと伝わらない?
あなたの発言をみると、ファミコンの知識はあるのは分かるので、
ちょっと考えれば想像できると思うんだが。

146もラスターで「位置をずらす」んじゃなくて、「パレットの制限を回避」
するって発想を褒めてるんだろ。


まぁ、喧嘩したいわけじゃないんで、そこんとこご理解を(^^
149146
垢版 |
2014/04/14(月) 00:18:00.10ID:BSoZ156l
>>147
メイン画面とステータス部の分割、疑似3D、疑似多重スクロール、
ゆらゆら燃える炎、巨大ボス、
そこに挙げてくれた例含めて実際に見て知ってるし、仕組みも理解できる。
理解できないのは、コズミックイプシロンくらいなもんでさ。
http://www.youtube.com/watch?v=C8F39OhAiRc#t=25

でも16*16ドットのブロックを行ごとに8ドットずつずらして表示、なんて使い道は見たことなかった。
その発想がすごいって話よ。
150145
垢版 |
2014/04/14(月) 00:44:20.53ID:Ye30GFaz
補足。
ラスターに関して147の言ってることは技術的に正しいんだけど、
他人がそれを理解してないのを前提に、否定してるのが、ちょっとカチンときたということ。
(145も146もこの件に関して技術的に勘違いはしてないと思う)

>>140 とか >>131 とか手を動かしてるひとを応援してるんで、こんなレスでスレを汚してごめんよ。

>>146
当時のこういう使い方はあったのかは気になるね。
ヘックスといったら信長の野望くらいしか記憶にないなぁ・・・あれは4x4だから問題ないし。
2014/04/14(月) 13:15:26.05ID:PHq3J+m9
>>149
似たようなのでテトラスターもあるね

コズミックイプシロンは横にラスタースクロールもしているけど、ベースの
アイデアとしてはBGのバンク切り替えアニメと同じことで実現してる

1ラインずつ別バンクに切り替えて絵を組み上げていく感じ
2014/04/14(月) 18:55:50.61ID:dbr8gs6R
140です。

>143
strobeの件、情報ありがとうございます。
ソースに反映したいと思います。

>144
回転時のアニメーションは確かに落下時より遅いので修正します。
パラメータいじるだけなので、修正は難しくありません。

>149
>151
コズミックイプシロン見てみましたが、縦方向にも若干スクロールして立体感出しているみたいですね。
BGのバンク切り替えとの複合技でスゲーなと思います。


今作っているソフトも、2x2ブロック毎にずらしてあげれば
HEX表示できるな と思いつき実証の意味で作っています。
あと、1色共通で2色で描けば、1パレットで2種類、
3パレットで6種類の駒が表示できるなと。


ラスター割り込みは、他にもネタがあります。
例えば、8ドット毎に8ドット縦にずらせば、16x8ドット単位で
BGのパレット指定ができるなとか。
2014/04/14(月) 18:57:07.18ID:Ye30GFaz
コズミックイプシロン、初めて知ったけど、たしかにすごいね・・・
デバッガで見るまで、どうやってるか想像もできんかった。

しかも、この手の3Dビュー系のゲームは個人的にはいまいち面白くないのが
多いけど、ゲームとしても楽しいw

good luck!
2014/04/14(月) 19:22:56.78ID:PHq3J+m9
>>152
カーソル枠でまわる宝石が▽と△の時でカーソル枠の上と下を少し
狭くしたほうがわかりやすいかなと思いました
2014/04/14(月) 19:58:14.37ID:BSoZ156l
>>151
テトラスターは知らなかったんで見てきた。おんなじ感じっす。
それにしても、バンク切り替えでやるのか…すげーな。
ちゃんと地形の模様になってんだもん、良く考えついたもんだ。

いま手元にないんでアレだけど、そのうちデバッガで見てみたい。


>>152
思いついたのか、発想力すげー…。
2014/04/14(月) 20:06:28.23ID:dbr8gs6R
>>154
最初、指摘の通り、カーソル枠を台形にして、▽か△かわかるようにしたのですが、
カーソル移動時にうねうねカーソルの形が変わるのが気持ち悪く感じたので、
今のただの四角にしています。
2014/04/14(月) 21:32:22.23ID:qn3GgaV0
>>148-150 >>131
自演気持ち悪い

わかってないからってファビョって「他人」を弁護?w

>>148
>「アトリビュートテーブルの制限で、パレットが2x2BGキャラクタごとにしか
>指定できないのを回避するために、ラスターでずらしてるのね」
>まで言わないと伝わらない?

伝わってるからそれは違うって言ってるんだけどね

手を動かしていてもね
延々と即値でスプライト初期化してたから変な奴と思ったらやっぱりな




ずらしてパレット指定の限界突破という謎技術を語ってる人が他にもいるようだけど
158145
垢版 |
2014/04/14(月) 22:05:09.05ID:Ye30GFaz
>>131 の名誉のために、131と私は別人だよ。
スレのためにもう返事はしないし、あなたが正しいってことでいいよ(^^
2014/04/14(月) 22:40:16.03ID:Ye30GFaz
>>140 さんに質問です。

勉強にソースを読ませてもらってます〜
タスクのなかが下記のようなフローになっていると思うのですが理解あってますか?

...
jsr Yeild
...Vcmd_SequenceDataなど BG書き込み予約系処理、完了時はzフラグで判定...
jsr Yeild_Eq
(zフラグが立っていた場合は jsr Yieldの直後から再実行)
(zフラグが立っていない場合は、下に抜ける)
...

また、あってるとしたら、こういうフローっていうのは
8bitなアセンブラだとわりとよくある手法ですか?


C言語脳なので、pla pla とかで返りアドレス捨ててるの見て、
どこに帰るんだ〜、とか、しばらく混乱してました(^^;

不躾な質問ですいませんが、お暇だったら見て頂ければ幸いです。
2014/04/14(月) 23:59:40.63ID:qn3GgaV0
>>159
立ってる、立ってないが逆
2014/04/15(火) 00:19:44.09ID:Rogly49M
>>159 さん

> タスクのなかが下記のようなフローになっていると思うのですが理解あってますか?
> (zフラグが立っていた場合は jsr Yieldの直後から再実行)
> (zフラグが立っていない場合は、下に抜ける)

Yesです。


> また、あってるとしたら、こういうフローっていうのは
> 8bitなアセンブラだとわりとよくある手法ですか?

あまりないかと思います。
ゲーム屋として仕事したことはないので、どのような手法が一般的かは
知らないのですが、現在の進捗状態を番号で管理してジャンプテーブルで
飛ぶみたいな話は聞いたことがあります。

私の場合は、各処理を分解してジャンプテーブルで呼び出すのが
面倒そうだったので、次の呼び出し先のアドレスで管理する方式としました。
2014/04/15(火) 00:22:16.34ID:Rogly49M
>>160

Yesと書いちゃったけど、確かに、zフラグが立っている場合に抜けるでした。
2014/04/15(火) 00:24:55.54ID:4gJhlsqp
あ、ご指摘どうもです。逆でした
2014/04/15(火) 00:25:59.35ID:4gJhlsqp
あら、、、フラグは z なのに beq/bne だから、頭が混乱する(xx
2014/04/15(火) 00:52:17.35ID:4gJhlsqp
すいません、書き込み順の前後で混乱しました。160さんの指摘で正解ですね。

>>161
なるほど〜。ジャンプテーブルより柔軟性がありそうですね。
あと、継続っぽくてカッコイイ。

ありがとうございます
2014/04/18(金) 18:15:30.91ID:jpWSPUfh
画面表示中にパレットを書き換えるサンプルプログラムつくってみたので、興味があるひとはみてみてね。
自分は、情報がなくてけっこう試行錯誤したので。

http://www1.axfc.net/u/3224863

メタルスレイダーグローリーのIRQ割り込みを参考にしたんだけど、
7ラインくらい表示ができないのはしかたないのか。
もっといい方法とかあったら、教えてくだしあ。
2014/04/18(金) 21:05:20.40ID:GCyjwP+C
>>166
中央が黒いのは、書き換え中に色が付くのを防ぐため?
168166
垢版 |
2014/04/19(土) 02:10:32.86ID:ENCcy0CN
>>167

うん。

たぶん、ラスター使えるようになってラスターでパレット変更もできるぜぃ、
と思って試した人(過去の俺とか)は、なぞのゴミが表示されて悩まされてると思う。
そのゴミをHBlankに押し込めるために、16byteの書き換えに7lineも画面表示を消してるって感じです。
2014/04/19(土) 09:55:49.50ID:5+3bbh99
>>168
そうですか。知ってたらあれですが、3Dホットラリーはもろ見えてます。
ttp://img.gamefaqs.net/screens/b/3/c/gfs_18759_2_2.jpg
2014/04/19(土) 13:11:45.50ID:ENCcy0CN
あ、ほんとだw
実は、3Dホットラリーの名前は以前でてたんで画面見たんだけど、
上2パレット、下2パレットくらいでやってるんじゃない?とおもって、スルーしてた。
ちゃんとパレット書き換えしてたのねw 失礼しますた
2014/04/21(月) 00:26:08.69ID:/pAmCg0v
ゴミなんて消してやんよ
って思ったら
意外と無理だった


if ((!IsRendering) && ((VRAMAddr & 0x3F00) == 0x3F00))
PalIndex = Palette[VRAMAddr & 0x1F];

こんな仕様しらんがな
nintendulatorのPPU.cppより
2014/04/21(月) 10:13:40.71ID:LbIV6qH+
おお、こういう原理だったのか。トンクス >>171

ttp://forums.nesdev.com/viewtopic.php?t=1209
コレみて、なんとなくパレットカキコミすると色が出るのは、理解してたんだけど、
細かい挙動はよくわかってなかった。
2014/04/21(月) 10:17:13.69ID:LbIV6qH+
ちなみに、これってハードウェア的にはどういう原理なの?
詳しい人いたら教えて。
2014/04/21(月) 17:28:24.83ID:rQaSv6+b
>>171
そんな断片ソースで理解できるのがすごい。
2014/04/21(月) 23:59:09.10ID:/pAmCg0v
>>166を改造させてもらった

ttp://www1.axfc.net/u/3227965.zip

ゴミ消した


パレットの0x0dは使えないよ
垂直同期のパルスみたいな電圧になるから
2014/04/22(火) 00:47:42.57ID:Ncm5fcM0
レンダリング止めていればBGの色が出ると思ってた

>>166のおかげで本気出せていろいろ勉強になったわ
>>172系のやつへの理解向上
レベルが一気に3あがった!

rtiの戻り書き換えだとか組み終わった後に
ttp://forums.nesdev.com/viewtopic.php?t=6484
full_palette.s
の偶奇同期を見つけた
この簡潔なソースで横ブレの無さのキモさといったら


>>173
BGのレンダリングは内部で$3f00へアクセスするんだろうけど
そのバグ挙動なのかね
ttp://wiki.nesdev.com/w/index.php/Visual_2C02
これ結局まだいじったことないんだけど、使いこなせれば理解できるのかな!?



ところで、また謎現象を見つけてしまった
ttp://wiki.nesdev.com/w/index.php/PPU_registers#Bit_0_bus_conflict
ttp://forums.nesdev.com/viewtopic.php?p=112424#p112424
177166
垢版 |
2014/04/22(火) 03:41:30.42ID:+4JN+sCM
>>175
おおお、これは技術の粋が詰まったコードですね!素晴らしい!!
私もレベル3上昇して、レベル4になった〜

クロック管理が神々しく緻密・・・
ちなみに、ゲームでこのテクニックを使うとすると、IRQが入りそうなタイミングで
メインスレッドはnop連打になってないとダメという認識でおk?
とすると、実用は難しいけど、、、
ジャストアイデアとしては
2、3ラインくらい前にIRQいれて、一時的にメインスレッドをnop連打ループに切り替えて、
終わったらまたもとのメインスレッドに戻すというのは可能かな?
考えるだけで、脳髄が痛い・・・



>パレットの0x0dは使えないよ
一部の黒はつかっちゃだめというのは聞いてたんだけど、反対におぼえてたみたい(^^;
今後は0x0f使います〜


>>176 の情報も含めて、いろいろありがたい(^^
やっぱり、コードは晒してみるものだなぁ・・・
178166
垢版 |
2014/04/22(火) 03:55:38.11ID:+4JN+sCM
いままでの自分の致命的な間違いに気づいた・・・
nopは2クロックだったのね。1クロックだとばっかり思ってた(^^;

よくいままでのコードうごいてたなぁw
2014/04/22(火) 18:39:42.31ID:FEq/t9cI
てす
2014/04/22(火) 20:21:50.77ID:SP0raU7v
>>175

ソース読ませてもらったけど、
ldy #0
sty $2001
で、PPUのレンダリング止めると、PPUのバスが空くので
その間は自由にVRAMアクセスできたと理解していたんだが
違っていたかな?

そうであれば、HBlank待つ必要ないので、パレット書き換えで
非表示になるライン数を減らせると思う。

あと、割り込み時にはiフラグが立った状態でルーチンが
呼ばれるので sei は要らないと思う。

http://wiki.nesdev.com/w/index.php/CPU_interrupts#IRQ_and_NMI_tick-by-tick_execution
2014/04/22(火) 20:38:14.58ID:SP0raU7v
>>173

PPUのデータのバス(信号線)が1組で、PPUのレンダリング中はVRAMからデータを読み出している。
CPUがVRAMアクセスのためにPPUアドレスを設定するレジスタ($2006)とPPUがネームテーブルにアクセスするアドレスのレジスタが兼用のため、CPUがパレットのアドレスを書き込むとPPUはパレットデータを読み出してレンダリングすることになる。

と理解しているのですが、間違っていたら指摘お願いします。>他の人
182166
垢版 |
2014/04/22(火) 20:46:59.02ID:+4JN+sCM
>>180

>で、PPUのレンダリング止めると、PPUのバスが空くので
>その間は自由にVRAMアクセスできたと理解していたんだが
>違っていたかな?
そう思ってたんだけど、PPUのアドレスレジスタが0x3f**だと、
**の色(=ゴミ)が出力されるっていうのが、171のコード片の意味。
183166
垢版 |
2014/04/22(火) 20:59:26.06ID:+4JN+sCM
>>181
なるほど〜、
ハードウェアは素人(簡単なワンチップマイコンをいじったくらい)
なんで、解説してもらえて助かるっす。ありがと〜

用語があってるかわからないけど、バスコンフリクトってやつでいいのかな?
あとチップに損傷を与えたりはしないのかしら・・・
まぁ、あとは電子回路関係の情報で調べてみます。
184166
垢版 |
2014/04/22(火) 21:04:00.85ID:+4JN+sCM
連投でスマソ

>>181
追加で疑問。
そうすると、0x3f**以外のアドレスでも、そのアドレスのVRAMデータの色が出力されそうなんだけど、
0x3f**以外ではそうはならないみたいなんだよね・・・
これはレジスタ兼用でもそうならないものなのかな?
2014/04/22(火) 23:02:12.52ID:SP0raU7v
>>182
なるほど、了解です。
自分も実験してみよう。
2014/04/22(火) 23:13:05.47ID:SP0raU7v
>>184

The PPUDATA read buffer (post-fetch)
ttp://wiki.nesdev.com/w/index.php/PPU_registers#The_PPUDATA_read_buffer_.28post-fetch.29

ここに $0000-$3effは内部リードバッファから返すが、$3f00-$3fffは(PPU内部の)データバスに直接配置されている
と書かれているので、この辺りの差で挙動が変わるっぽいですね。
2014/04/22(火) 23:47:45.15ID:Ncm5fcM0
>>180
>seiは要らない
しまった、モロ立ってた
どうも

>>181
パレット$3fxxは通常はPPU内部アクセス、つまり擬似NTSC信号を生成する回路とのやりとりであって
普通のPPU空間には出力されないとどこかに書いてあった気がする

ttp://nesdev.com/2C02%20technical%20reference.TXT
- palette RAM is accessed internally during playfield rendering (i.e., the
palette address/data is never put on the PPU bus during this time).

ttp://wiki.nesdev.com/w/images/d/d1/Ntsc_timing.png
画像の通りパレットのアクセスはない

しかしこういう挙動もある、これはレンダリング止めた場合だろう?
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.
この辺あやしいね
2014/04/22(火) 23:59:55.97ID:Ncm5fcM0
>>177
今回はjmp *にしてもHBlankに収まるっぽく大丈夫なようですが

127 line目で
$2001のレンダリングオフにする瞬間の
PPU tickのばらつきが
249〜254 nop連打の場合
249〜257 jmp連打の場合

ばらつきが3dot分増えることになります

市販ゲームのIRQ関係もゴミだらけだし気にすることはない

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

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

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

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))
Palette[Addr ^ 0x10] = (unsigned char)Val;
2014/04/24(木) 07:57:06.72ID:RDg08ToE
流れぶったぎるようで申し訳ないけど、デバッガ機能が一番使いやすいNESエミュはどれですか?
2014/04/24(木) 10:17:47.73ID:TazbtZqQ
>>192
FCEUXがおすすめ。
(読/書/実行)ブレークポイント、スキャンラインごとのVRAM内容表示、RAMウォッチ あたりの機能をよく使ってる。
2014/04/24(木) 11:46:44.27ID:RDg08ToE
ありがとう
2014/04/24(木) 21:06:44.07ID:Ozv2HHx1
ブレークポイントの使いやすさは
G-NESじゃないか
よっぽどトリッキーなコーディングしないならこれで十分


G-NES は使いやすい、指定行まで実行がStepOverを兼ねる
FCEUX はログ機能が最強、シンボル機能搭載、エミュ精度も結構よい
Nintendulator はデバッガ付きではエミュの精度が最強かな、使いにくい
2014/04/24(木) 23:37:48.91ID:d8WjRMEc
>>191
そう、スプライトと共通(04=14、…)
僕は実機で確認したけど、nendoかnestopiaと同じなら間違いないだろうな。
古いネット上のドキュメントとか間違ってたりするから100%鵜呑みにしない方がいいよ(エミュのソースも)。
2014/04/25(金) 00:53:39.01ID:ffWieyHe
G-NESは使ってなかったから、ちょっと触ってみた。
デバッガは、FCEUXとG-NESほぼ同等やね。
ちょっとわかりにくいけど、アドレスクリックして"Seek To"で指定行まで実行もできるし。
(この機能が超欲しかったけど、いま探すまでアドレスクリックで指定できるの気付かなかったw)

しかし、FECUXのシンボル情報って吐き出してくれるコンパイラあるのかな・・・
使えれば便利そうなんだけど。
2014/05/10(土) 18:53:04.15ID:ShrxaRho
マッパー0のカセットを何本か作りたいんですが
既存のソフトのHVC-NROM-256K-02基板からICを外すのが面倒なので
プリント基板だけを通販しているところとかないですかね?
もしくは,CADデータとか.
2014/05/10(土) 19:06:34.44ID:ShrxaRho
ちなみに作りたいカセットとはこれです.
この1週間ちょっと頑張ってインプリしてました.
アセンブラなんか普段いじらないので,めちゃくちゃです.
でも,このスレはちょくちょく見てるので,恩返しに公開します.
ttp://sayonari.com/famicom/FamilyBird.zip
綺麗に書き直したかったですが,しばらくいじれそうにないので,
皆さんに託します.

FCEUXではちゃんと動くんですが,ROMに焼いて,
FC互換機(GCC NEXT)で動かすと,
スプライトがチラチラと画面中に散らばって表示されます.

メモリ管理とかちゃんとしてないし,変なところに書き込んだり,
PPUアクセスのタイミングがむちゃくちゃだったりとかが原因だと思います.
互換機じゃなくて正規版本体ならちゃんとうごくのかな・・.
2014/05/10(土) 19:40:22.36ID:WvHa+XO0
そこまでやって正規版FCを持っていないというのが謎過ぎる
高いわけじゃないんだから普通に買えばいいのに
2014/05/10(土) 20:09:58.52ID:vMtYsoKB
>>199
スプライトDMAの前に$2003に$00入れるといいかも
2014/05/10(土) 20:52:41.78ID:ShrxaRho
>>201
すごい!かなり軽減されました.しかしまだチラチラがあります.
しかしさすがのアドバイスありがとうございます.勉強になります.
2014/05/10(土) 21:59:03.95ID:2fP2DbGG
なんで土管に触っただけで死ぬんだ
こんなクソゲー久しぶりに見たわ
2014/05/10(土) 23:12:04.05ID:ShrxaRho
>>200
ファミコン本体は実家にはいっぱいあるんですが,今の家にはなくて,
急遽必要になったので,とりあえず,ヤフオクで互換機を送料込み900円で落札しました.
その後,今もですが,正規版ファミコンをどれにしようかと,ヤフオクでキョロキョロしてます.
互換機は今日届きました

>>203
これは,FlappyBirdっていう人気アプリのオマージュですが,それも土管で即死です

ROMライターのLEAPER-3Cのドライバが64bitWin7では動かなかったので焦りましたが,
VirtualPC上のXPmodeというやつで,そのOSからLEAPER-3Cが使えたので
良かったです(´ρ`)
2014/05/11(日) 01:44:45.44ID:HiLhu8FK
非VBlanc期間がループで一切の処理をしていないからDMA転送がVblank内に収まってないんじゃないかね
通常は非VBlank期間にキー入力だのスプライトのデータ準備だのデータを用意しておいて
Vblank期間は描画処理だけを行うようにする
2014/05/11(日) 02:54:20.00ID:Mnx9Nf8g
>>205
ありがとうございます!
チャレンジしてみましたが,上手く実装できませんでした(´ρ`)
どの処理をどこでやればよいか・・・.
もう時間的に頭が働いていないのかも.とりあえず寝ます.
2014/05/11(日) 04:04:19.91ID:YECX6XhP
>>199
なかなか、ファミコンらしい可愛いグラフィックやね。
nesdevでflappy bird作った奴いないの?みたいなスレがあったから、貼るのもおもしろいかも
http://forums.nesdev.com/viewtopic.php?f=2&;amp;t=11103

ちなみに、Nestopiaでもバグってるっぽいので実機の前にこっちでデバッグしたら楽かもしれない。
残念なことにデバッグ機能はほとんどないけど・・・
レスを投稿する