ファミコンのプログラム4
>>245 一通り読んでみました。 .bank 0 ; バンク0 .org $0300 ; $0300から開始、スプライトDMAデータ配置 Paddle00_Y: .db 0 ; スプライト#1 Y座標 Paddle00_T: .db 0 ; スプライト#1 ナンバー WRAM領域の$0300にデータ定義の記述があるが、 ビルド出来ているのであろうが、記述としてはまぎわらしいので Paddle00_Y = $0300 Paddle00_T = $0301 と記述した方が良い .memclearloop sta [$00],y iny cpy #255 bne .memclearloop 254までしかループしていない。cpy #255が不要 >>257 続き VBlank直後に行うべき処理と、ゲーム本体の処理を分離したほうが良い。 パッドとボールの座標と、スプライトの座標は別に持っておき、 パッドとボールの座標をスプライトデータに反映するにように 実装した方が、プログラムの書き方としては綺麗だと思う。 VBlankのタイミングを考えずに、スプライトとBGの表示をOFF/ONにして VRAMを書き換えるのはやめた方が良いと思う。 nestopiaとかでも普通に表示できていたけど、書き換え量が多くなると 画面がちらつくのでは? jsr Pad_Check ソース上に Pad_Check が見つからない。 lda #0 ;これはROMなので出来ないので、こうする sta STAGE1,x ;〃 ROMに0を書き込む意図がわからない。 VRAM書き込み先のアドレスをブロックの座標から 計算しているが、ブロックの配置位置が有限個であれば 表引きで求める方法もある。 (Y座標だけでも表引きにすると処理が結構簡素化します) ギコ猫さんのところで、覚えた技術ばかりという理由は 英語が出来ないという理由なのですが、これは理由になってないみたいですね。 @英語が出来ない ↓ A英語の技術情報が分からない ↓ B日本語だけの技術情報に頼る の無限ループなので、英語を中学英語から やり直したいと思います。 ちょうど良い本がアマゾンで見つかったので ttp://www.amazon.co.jp/%E4%B8%AD%E5%AD%A6%E3%83%BB%E9%AB%98%E6%A0%A16%E5%B9%B4%E5%88%86%E3%81%AE%E8%8B%B1%E8%AA%9E%E3%82%92%E7%B7%8F%E5%BE%A9%E7%BF%92%E3%81%99%E3%82%8B-CD%E4%BB%98-CD-BOOK-%E5%B9%B3%E5%B1%B1/dp/4860641663 あと、スプライトの定義のその定義の仕方は知らなかったです。 でも、ある意味スプライトDMAのアドレスを考えれば当たり前なんでしょうけど。 iny cpy bneの間違いは、間違えて覚えていました。 ギコ猫さんとこはパレットの読み込み時に ldx #0 .loop lda ourpal,x sta $2007 inx cpx #32 bne .loop みたいにやっていたのですがよく考えれば、0-31までを読み込んでいたんですね。 これは、引き算の小学一年レベルの間違えですね。差がNの時、合計数は、N+1になるという事なんでしょう。 つづく >>257-258 VBlankとゲーム本体処理を分離ということはNMIを使うって事ですね。他の方も言ってましたが スプライトと実際の座標を別に持つというのは、以前やったことがあるのですが、クソ汚いソースになってしまいましたが、少しだけわかってきた気がします。こんな感じですかね。 >>261 に書きます。 VBlankのタイミングと書き換えは理解しずらいのですが、ファミコンのPPUの仕様なんですかね。 Pad_Checkは、他の方が作られたソースなので、あえて外しました。ROMに0を書き込んだ意図は、恐らくないです。気づかないまま放置してしまいました。 ブロックの配置位置が有限個ならテーブル化できるんですか?今度やってみます。 アドバイスありがとうございます!!ホント助かりました。知らなかった事や理解出来なかった事が分かってよかったです。 .org $300 ;データ定義 Sprite: Sp00_Y: $0300 Sp00_T: $0301 Sp00_S: $0302 Sp00_X: $0303 01_Y: $0304 01_T: $0305 01_S: $0306 01_X: $0307 ... ldx #0 .SetObjAxis2RealAxis ;スプライト座標を実際の座標に代入する lda Sprite+0,x sta Real_Y,x lda Sprite+3,x sta Real_X,x inx inx inx inx cpx #(4*4) ;4つのスプライトを代入する bne .SetObjAxis2RealAxis 間違えました。 .org $300 ;データ定義 Sprite: Sp00_Y= $0300 Sp00_T= $0301 Sp00_S= $0302 Sp00_X= $0303 01_Y= $0304 01_T= $0305 01_S= $0306 01_X= $0307 ... ldx #0 .SetObjAxis2RealAxis ;スプライト座標を実際の座標に代入する lda Sprite+0,x sta Real_Y,x lda Sprite+3,x sta Real_X,x inx inx inx inx cpx #(4*4) ;4つのスプライトを代入する bne .SetObjAxis2RealAxis 英検三級、即ち中学卒業程度の英語力とgoogle翻訳があれば十分。 海外サイトの情報も何も全部理解する必要はないし、図、表、技術用語さえわかれば殆ど問題ない。 それに今では日本語資料も充実していると思うし、あえてギコ猫のところだけを参考にすることもないだろう。 初心者のうちは他人が作ったソースを見てよく理解し、そこからいろいろ学ぶのもいいだろう。 公開されているソースによっては丁寧に説明が細かく書いてあるものもある。 >>263 英検3級は持ってますが、かなり文法が怪しいです。単語に関しては最も初期の「萌えたん」を P-StudySystemを自作問題集を作って覚えた程度です。 1つ1つの単語が読めても何を言いたいのかわからないので、今持っているくもん中学英文法 という本をゆっくりと確実にやる事にします。 初心者というにも、初めてから時間がかかり過ぎてる面はあるのですが、 恐らく他の方の作ったソースを断片的にしか分かっていないというのはあると思います。 google翻訳に関しては、使うブラウザがchromeなので、標準で使えます。 >>252 セレクトは効果音テストだったのね。疑問解消しました ソフトの完成楽しみにしてます >>260 > VBlankのタイミングと書き換えは理解しずらいのですが、ファミコンのPPUの仕様なんですかね。 VBlankの意味を理解していない節があるので、まずは、ブラウン管の話からします。 機知の情報かも知れませんが聞いてください。 ブラウン管の裏から電子銃で電子を飛ばし、ブラウン管表の蛍光面を発光します。 真っ直ぐ飛ばしただけでは、ただの点なので、磁界をかけて電子が飛ぶ方向を変えて 左上から右へ水平方向に線を書くように発光させ、再び左端に戻ってさっきより ちょっと下の位置で同じように水平方向の線を発光させます。 これを画面下まで繰り返して、再び左上に戻ります。 これをすばやく繰り返すことで、ブラウン管の蛍光面全体に画像を表示します。(ラスタスキャン方式) 電子の飛ばし先が右端から左端に戻る期間を水平帰線消去期間(HBlank期間)、 下端から上端に戻る期間を垂直帰線消去期間(VBlank期間)と呼びます。 >>266 続き VBlank期間は、一瞬で戻るのではなく、NTSC(日本のアナログ放送の信号規格)の場合 20本分の横線を描くぐらいの時間があります。この間、電子銃から電子は飛びません。 非VBlank期間は、ファミコンのPPUは画像の信号を作るため、 CHR-ROMからパターンを読み込んだり、VRAMからネームテーブルや 属性情報を読み込んでいて、PPUの信号線(PPUバス)を占有しています。 VBlank期間は、PPUが画像の信号を作らないので、PPUバスは開放されており CPUはPPUを介してPPUバスにつながっているVRAMにアクセスできます。 「VBlank待ちの直後にVRAMの書き換えを行え」というのは、PPUが映像信号を 作るのに邪魔にならないタイミングでVRAMにアクセスしなさいということです。 >>267 続き 非VBlank期間中にCPUがVRAMにアクセスできる方法があります。 PPUレジスタ $2001 のbit3とbit4を0にして、BGとスプライトを非表示にすることです。 画像の信号を作るためのPPUのCHR-ROMやVRAMへのアクセスが止まるので PPUバスが開放され、CPUはPPUを介してVRAMにアクセスできます。 代わりに、画面に何も表示されない箇所が現れることになります。 BGとスプライトを非表示にするタイミングにばらつきがあると、 画面がちらつく現象となります。 > VBlankのタイミングと書き換えは理解しずらいのですが、ファミコンのPPUの仕様なんですかね。 ファミコンの設計による制限であるため、仕様と言えば、その通りです。 >>268 続き 同世代の他のパソコンとかでは、表示中にもCPUからVRAMにアクセスできるものが あるのに、ファミコンで出来ないのはなぜ? →画面表示用の信号線とCPUからVRAMにアクセスする信号線が別になっているためです。 VRAMもデュアルポートメモリという、アクセスの口が2つある特別なRAMを使っています。 ファミコンのWRAMやVRAMに使われているのは、アクセスの口が1つのシングルポートメモリです。 →信号線も増えるため、基板上の配線が複雑化し、基板のサイズや層が増えてコスト増になる可能性があります。 ファミコンのVRAMにデュアルポートメモリを使わなかったのはなぜ? →コスト削減のためです。 一般的にアクセスポートが余分にあるデュアルポートメモリの方がシングルポートメモリより部品代が高くなります。 また、WRAMとVRAMに同じ部品を使うことで、大量に発注し部品メーカーに単価の引き下げを交渉できます。 とりあえず、わかりやすく説明したつもりですが、間違いなどがありましたら フォローお願いします。>All >>266 VBlankに関しては、「ファミコンの驚くべき発想力」という本の78ページ前後に 記述がありました。が、>>266 さんの説明の方がより詳しく説明しているように 見えます。 HBlank期間のHはホライゾン?(水平)の略でしょうね。VBlankのVは、バーチカル(垂直) の略な気がします。 NTSCとPALの違いも知らなかったのですが、日本は、NTSCだったんですね。 VBlank待ちの直後にビデオメモリの書き換えをするのはそういう理由が あったんですか。 非VBlank期間中にCPUがVRAMにアクセスできる方法、これは知っていましたが、 欠点は知りませんでした。 Horizontal Blankingですかね かつてはPPUの特定のバージョンのみで発生する不具合なんてのもありました スクロールレジスタがある値の時、VRAMアドレスレジスタを触ると背景色が化けるというもの・・ PPUの特定バージョンというのが分かりませんが、製造されたファミコン本体 ですか?それともエミュレータか何かですか? スクロールレジスタは、$2005の二度書きレジスタですよね。 RPGやなんかでフィールドから街へフィールドから戦闘への場面変更で一旦ブラックアウトするのは 画面初期化して書き直す時間を稼ぐためでもあったんだろうか? 製造ロットによるがファミコンの中には2つのカスタムLSIが入っている。 一つはRP2A03というもの もう一つがRP2C02というもの。 前者がCPUとAPUやI/Oポート周りで、後者がPPU。 PPUがRP2C02なのはNTSC出力のものだけで、PALならRP2C03、RGBならRC2C05など。 型番の後に続くアルファベット(例:RP2C02EのE)がバージョンを表している。 特定バージョンというか、初期型に不具合が多かった。 ちなみに製造後期になるとデコーダやインバータも1チップのカスタムLSIにまとめられる。 でもなぜかSRAMがSOPからDIPに戻ってる。入手先が限られてきたのかな? >>273 スクロールは基本的にネームテーブルを2枚とも使うので 表示されていない方を裏画面として使うのはちょっとめんどくさい だから場面転換時には画面表示を一旦オフにする必要はあるけど 画面全体を書き換えるにしても数フレームだからほぼ一瞬で終わる わざわざ時間稼ぎしなければならないほどでもないので フェードなりの画面効果は演出を目的としてると思っていい >>269 同世代のパソコンなどのVRAMはシングルポートのDRAMだよ CPUをウェイトで止めたり、DMAで勝手にCPUが止まったり、アクセスするタイミングを 工夫して見かけ上同時に読み書き出来るようにしてあったり、VDPが調停してくれたり 色々あるけども >>245-246 名乗り出なくてもバグだらけのキ○ガイプログラムだからすぐわかるよ。 人の言うことを聞かないで数年間NMI使えないで、いつも同じバグ出して、「正常動作の定義は?」って逆ギレ。愚痴キ○ガイ消えてくれ。 ・あちこちでゼロページ < 忘れすぎ → auto-zeropageが施された改造版のnesasmあるよ ・なにをしているのかよくわからない。ROMに書き込んではいけない。実機動作を狙ってるなら lda #0 ;これはROMなので出来ないので、こうする sta STAGE1,x ;〃 ・Aボタン押したときのデューティ比的な音バグ(数年間放置されたバグ 誤 lda APU_REG0_DUTY_875 誤 ora APU_REG0_COUNT_ON ← PadStat = $20 と重複! 誤 ora APU_REG0_FIX_ON 正 lda #( APU_REG0_DUTY_875 | APU_REG0_COUNT_ON | APU_REG0_FIX_ON ) ・ 誤 lda APU_REG1_FRQCHG_ON 正 lda #APU_REG1_FRQCHG_ON ・既に指摘があるようにcmpが変。loadのフラグの変化とブランチのフラグ条件を理解していない。 lda なんたら cmp #0 beq または bne ・jsr Pad_Check は 他人 >>236 の? 算術sbc使ってるから変だと思ったけど パッと見でこれだけミスしてて、どこにまともに動く要素があるわけ?氷山の一角だろう。 今回も 「.dw 0; VBlank割り込み」見てまたお前かとやる気を失ったけど、BLOCK.symが同梱されていたので捗った。 NMI使えない、各種メモリやレジスタの初期化していない奴って ギコ猫の前半章のコピペ&拡張だったんだな 後半章ばかり見てたから原因がわからなかった>>221 言い訳にもならないけどね 他人のソース調べればわかることだから 後半章のソースも問題あり >>270 指摘されると、「私は〜知ってましたが、あえてやりませんでした」 じゃなんでNMI使えないの? 「VBlank待ちの直後にビデオメモリの書き換えをするのはそういう理由があったんですか。 」 (レトロ)ゲームのプログラムに興味ある人はみんな知ってるよ。Direct3Dだって垂直同期の概念あるでしょ。 >>273 ゲームによる。 特にCHRがRAMでドラクエVやWのようにROM容量がきつくて圧縮されたゲームは遅い。 数10フレームかかる。 エミュのパレットをハックしてネームテーブルビュワー見ると展開のスピードを見やすい。 ・戦闘画面に移行するとき CHRのパターンテーブルがRAMな場合は普通に書き換えるだけで時間がかかる。 書き換える前にPRG内の画像圧縮を展開するだろうからもっと時間がかかる。 ・マップ画面に移行するとき マップとマップチップの展開に時間がかかる 市販のゲームは限られたRAMやROMのスペースで展開と転送をこなさなければならず 我々が専用のルーチンで高速転送するのとはわけが違う場合もある 全部ROMで持ってるゲームならもっと速くて10フレーム程度かな >>277 NMIは使わなかったのは、確かにギコ猫のコピペだからと使い方を知らないからです。 いろいろ問題があったのは、事実ですし、バグがあったのも事実です。 何と言ったら良いか分かりませんが、ガッカリさせてすみませんでした。 みなさん、wという笑いや嘲笑の意味の文字を使っていないので、自分の為を思って 書き込んでいるのが見て取れます。 >>あちこちでゼロページ < 忘れすぎ → auto-zeropageが施された改造版のnesasmあるよ どうもアドバイスありがとうございます。 >>・なにをしているのかよくわからない。ROMに書き込んではいけない。実機動作を狙ってるなら >>lda #0 ;これはROMなので出来ないので、こうする >>sta STAGE1,x ;〃 ROMは書き込めないということは知っていましたが、放置したバグの結果であることは この前言ったはずです。 >>・Aボタン押したときのデューティ比的な音バグ(数年間放置されたバグ >>誤 lda APU_REG0_DUTY_875 >>誤 ora APU_REG0_COUNT_ON ← PadStat = $20 と重複! >>誤 ora APU_REG0_FIX_ON >>正 lda #( APU_REG0_DUTY_875 | APU_REG0_COUNT_ON | APU_REG0_FIX_ON ) ありがとうございます。どうしてボタンを押すと変な音なのか分かりませんでした。 何か原因があるとは思っていましたが何が原因かは全くわかりませんでした >>・ 誤 lda APU_REG1_FRQCHG_ON >>正 lda #APU_REG1_FRQCHG_ON これもありがとうございます。 つづく >>・既に指摘があるようにcmpが変。loadのフラグの変化とブランチのフラグ条件を理解していない。 >>lda なんたら >>cmp #0 >>beq または bne これは言えてますね。単純な頭なので、単純に考えていました。 >>・jsr Pad_Check は 他人 >>236 の? 算術sbc使ってるから変だと思ったけど はい、他人のソースを使いました。 >>パッと見でこれだけミスしてて、どこにまともに動く要素があるわけ?氷山の一角だろう。 >>今回も 「.dw 0; VBlank割り込み」見てまたお前かとやる気を失ったけど、BLOCK.symが同梱されていたので捗った。 えーとこれも失敗してしまいましたね。ファミコン開発は思ったより難しいんですね。 >>278 :名前は開発中のものです。:2014/06/08(日) 20:24:54.45 ID:p43hB49G >>NMI使えない、各種メモリやレジスタの初期化していない奴って >>ギコ猫の前半章のコピペ&拡張だったんだな >>後半章ばかり見てたから原因がわからなかった>>221 はい、そうです。ギコ猫の前半章の主に9章のコピペです。 >>言い訳にもならないけどね >>他人のソース調べればわかることだから 他人のソースを調べるという事がどんなに重要か分かりました。 >>後半章のソースも問題あり >>270 >>指摘されると、「私は〜知ってましたが、あえてやりませんでした」 じゃなんでNMI使えないの? >>「VBlank待ちの直後にビデオメモリの書き換えをするのはそういう理由があったんですか。 」 >>(レトロ)ゲームのプログラムに興味ある人はみんな知ってるよ。Direct3Dだって垂直同期の概念あるでしょ。 ”NMI”という言葉を知っていても言葉を忘れていたのと、使い方を知らないからです。 >>236 さんのソースではなく、ネット上に公開されていたソースを使いました。 変数に >>・ 誤 lda APU_REG1_FRQCHG_ON >>正 lda #APU_REG1_FRQCHG_ON の違いって何ですか? 実機で検証してくれたことに対して >本当に実機で試したのか知りたいですが って何気に失礼だよなこいつ >>280 > ”NMI”という言葉を知っていても言葉を忘れていたのと、使い方を知らないからです。 131さんには申し訳ないが、 まずは、WikipediaでCPUの割り込みについて勉強してきた上で ttp://ja.wikipedia.org/wiki/%e5%89%b2%e3%82%8a%e8%be%bc%e3%81%bf_(%e3%82%b3%e3%83%b3%e3%83%94%e3%83%a5%e3%83%bc%e3%82%bf) 1) NMIとVBlankの違い 2) ファミコンのプログラミングでNMIとVBlankを混在しても話が通る理由 3) .org $FFFA .dw 0 .dw Start .dw 0 というソースを見た他人が呆れる理由 を、自分なりの理解や考えで説明してもらえるかな。 言い訳になっちゃうかわかりませんが、できたら明日の朝に書き込みます。 ホント自分は基地外なのと、頭が痛いし熱いのでこのままほおっておくと 風邪をこじらすので、すみませんが、失礼します。 リアルが充実してる人たちがうらやましいです。 >>285 別に急がなくてもいいよ。その代わり自分でちゃんと考えること。 体お大事に。 頭の悪い高校生なんだから察してやれよ こいつ高校の名前を自分から暴露するような奴だぞ しかしまぁ基地外って自覚あるなら5年ぐらいROMってればいいのに 色々と知識が欠けすぎててこのスレで質問できるレベルにすら至ってないわ 自分の理解不足を棚に上げて正常動作の定義がおかしいなどと言い張るのは 自分を肯定するために社会を逆恨みする典型的秋葉原通り魔みたいな思考回路だよな 近所でネコの惨殺死体がなければいいけど 多くのエミュレータの再現目標は「市販ゲームが動作すること」であって 不完全なプログラムが「実機と同じように動作しない」というレベルでの再現には至っていません ファミコン程度の規模であっても完全再現するエミュレータはいまだに存在していません たとえばファミコンでは電源投入時にRAMの内容が不定であり すべての市販ソフトでは確実に動作させるために必ずRAMを上書き消去するなど、必ずそれを前提とした実装がされています しかしエミュレータの中には通電直後のRAMの初期値が&H00に設定されているものがあり 初期値が何であれRAM内容を消去するように実装されている市販ゲームは問題なく動作しますが RAMの初期値が&H00になっているものであるとして組まれた不完全なプログラムだと そのエミュレータでは動作するが実機では意図した動作をしないという問題に陥ってしまいます 同様ににVBlank期間が実機より長めに設定されているエミュレータも存在しています VBlank期間が長いことで市販ゲームを動作させることに影響はありませんが そのエミュレータ固有のVBlank期間を基準として作成された自作プログラムは 実機上だとプログラマの意図通りの動作をしないことになります このようにエミュレータ上のほぼすべての挙動において、実機ほどシビアではなく動作してしまう方向に緩く設計・再現されているため 実機の挙動を意識せずにエミュレータを基準として作成された自作プログラムの多くは 結果として実機で動かないものになってしまいます マッパーが電源投入時に選択するバンクですが 通常、実機ではハードワイヤードされている最終バンク以外の選択可能バンクは第1バンクが選択されるケースがほとんどですが 多くのエミュレータはなぜか先頭から順番通り昇順に選択されます 市販プログラムは必ず初期バンクを設定するように実装されているため問題なく動作しますが バンクの並びをアテにした不完全なプログラムはエミュレータでは動くが実機では動かないというケースが起こります >>240 のプログラムはCHRバンクの初期設定がされていないので CHRバンクが未設定でも順並びに選択されるようなエミュレータでは問題なく動作しているように見えますが 実機だとスプライト側のバンクがすべてバンク0になっているので、宝石落下時のスプライトがBG用のCHRで表示されてしまっています >>287 :名前は開発中のものです。:2014/06/09(月) 21:32:44.17 ID:fvy3sA+P >>頭の悪い高校生なんだから察してやれよ >>こいつ高校の名前を自分から暴露するような奴だぞ >>しかしまぁ基地外って自覚あるなら5年ぐらいROMってればいいのに >>色々と知識が欠けすぎててこのスレで質問できるレベルにすら至ってないわ 以前チャタリングに関して質問したり、ネームテーブルが固定画面で960もあるから どうやって書き込むのかと質問した者でもあるのですが、それではマズイんですか。 あと、これはおかしい話なんですが、このスレッドのパート1からROMってました。 もう10年も前の話ですよね。 >>288 :名前は開発中のものです。:2014/06/09(月) 21:38:04.12 ID:dEpln6L7 >>自分の理解不足を棚に上げて正常動作の定義がおかしいなどと言い張るのは >>自分を肯定するために社会を逆恨みする典型的秋葉原通り魔みたいな思考回路だよな >>近所でネコの惨殺死体がなければいいけど 猫や犬は可愛いので、そんな事しません。小さい子供に馬鹿にされても黙ってしまうような 性格なので。あと、その時は、自分でも実力が足りない自覚が無かったんです。 逆ギレ云々言った人たちには悪いですが、切れたのは事実ですが、本音と建前を 使い分けるのが日本人の美徳じゃないですかね。 そもそも、逆ギレと決めつけるあたり、あなたたちは 叱ったのではなく、怒ったと考えてよろしいでしょうか。 >>284 途中ですみませんが、 1)NMIは、ハードウェア割り込みの一種でマスク不可能な割り込み、 VBlankはブラウン管の電子銃が下端から上端に戻る際の割り込み。 NMIとVBlの正確なタイミングが分からないんだよな。 同時だと動かない市販タイトルがある。 10年もこのスレ見ててそのレベル・・・そして技術資料すら理解できない英語力・・・ 最早かわいそう過ぎて同情するわ・・・ 他のパソコンから書き込みです。 なんというか、僕が素直じゃなくてしかも怒りっぽくて 先人の知恵を学ばないという姿勢が悪いと思っています。 低能という言葉がありますが、まさに自分がそうだと思っていますよ。 自他ともに認める低能です。ファミコンのCPUより遅い動作周波数 なので。>>246 は撤回します。まことにすみませんでした。 ごめんなさい >>284 2) VBlankに入った時に必ずNMIの割り込みが訪れるからでしょうか 3) 本来ならばメインループにNMIを使うべきだからでしょうか VBlankにポーリング?という言葉を初めて知りました。 >>245 ところで NES Assembler (v3.21, 2005/04/09, Denki Release) これどこで手に入れたの? かなりレアなバージョンぽくて見つからない。 RAMの初期化、スプライトメモリの初期化 以前誰かに指導してるでしょ、あちこちの他人ソースでも示されているし スプライトONにしているデモプログラムでスプライトメモリ初期化してないのは論外なんだよ だからG-NESのスプライトメモリビュワー使えって 未初期化メモリにアクセスしたら他の言語のコンパイラは警告出すでしょ 逆にファミコンほどの原始的なハードで、なぜ0フィルされると思った? 0フィル傾向が強いエミュだってハードリセット、ソフトリセットで挙動違うわけだしね 1)Vblankは厳密には割り込みそのものではない。語源を考えればわかる。 あとマスク不可能な割り込みでは説明不足。 2)ファミコンにおいてNMIは必ず訪れるものか。 もし必ず訪れるのならあんたが今まで書いてきたプログラムはどうなる。 $0000から命令を実行しまくる羽目になってるだろ。 3)それならばなぜNMIを使うべきか。 全体的に不正解および説明不足そして調査不足、理解や考えも不足。 わからない言葉があったらまず目の前のPCで調べろ。 あと自虐がまるでへそを曲げた子供のようでみっともない。自虐は反省とは違う。 しばらくROMって頭冷やすことをおすすめする。 分かりました。しばらくROMることにします。 ただ、僕は本当に低能ですよ。何しろ、IQが69なんで (test the nation) 言葉選べない奴ってみっともないなぁ 上級者気取ってふんぞり返って偉そうに他人に説教しとるが相変わらずガキ丸出し これが一人だけやってるんだから目立つわな いいかげんさあ、そのチンピラみたいな恥ずかしい態度で人に接するのはおよしなさいよ まあ、こういう苦言を呈してあげても 前みたいに自分の口汚さを正当化するための言い訳しか言わないで 何が悪いのか理解出来ないまま同じ事を繰り返し続けるんだろうけど 他人に反省促す前に、自分がまず反省して態度改めなよ 多重人格らしき ”リバーシ君” が湧いてから同時期湧いて来た子たち ”YY-CHRとNESASMが使いづらい君” ”NESASMが難しいからC言語で組もうよ君” ”iNESヘッダや.incbinのことはわからないけど、nesdevの仕様書すべて読んできます君” 能書き”ダブラ君” 三日坊主の”まとめwiki君” ”DPCMの仕様教えて君” ”www.dotup.org大好き君” スタックぶちこわしてても ”PPU制御レジスタのタイミング等も問題無いはずなのに。 君” ”デバッガ使えません君” こんな初歩の初歩教えるのが上級者扱いなのか だから自演て言われてるのに ゴミみたいな不良動作のプログラムのアップロードに対し わずか数時間で ”fceuで陽性かくにん よかった” とレスが付くのも特徴 追い込まれると 〜とは別人だけど、と枕詞をつけて自己弁護 >>292 >>296 1) NMIの説明はまぁ正解。300さんの指摘の通りVBlankを割り込みと言い切るのは誤り。 NMIは割り込みの種類を示す言葉でVBlankは映像信号に関する言葉であり、そもそもカテゴリが違う。 2) 私が考えていた正解は、 PPUから出るVBlank期間を示す信号線が、CPUのNMI割り込みの入力ピンにつながっているから 300さんが「必ず訪れる」は誤りと言っているのは、VBlank期間に入ったときに VBlank期間を示す信号線に信号を出すか出さないかをPPUで制御できるため 3) NMIを使用するかどうかは別に問題ではない。 NMIとIRQのベクタ(割り込み時に実行されるアドレス)に0が設定されているから。 PPUなどのレジスタの設定を誤り割込みを受け付ける状態になった場合に 何が書かれているかわからない0番地をプログラムが走ることになり、 安全性を考慮しておらず、知識不足であることが読み取れるから。 割り込みを使わないのであれば、すぐに rti で戻るルーチンのアドレスをベクタに設定するべき。 Nmi: rti Irq: rti .org $FFFA .dw Nmi .dw Start .dw Irq >>290 指摘ありがとうざいます。 初期化するよう処理に反映します。 #やっぱり実機で確認できる環境欲しいな >>301 ROMてても知識は身に付かないだろうし、お題を出すのでプログラミングの経験を積んでみてはどうだろうか。 第1ステップ スタック、メモリ、PPUなどの初期化を行い、VBlank待ちのループを行う、基本のプログラムを実装する。 NMIの割り込みも実装し、NMIの割り込みの度に、$ffのメモリを1増加させる。 割り込み処理でないVBlank待ちのループでは、$ffのメモリを監視して255から0になる度に$feのメモリを1増加させる。 エミュレータのメモリビュアーで約4秒ごとに$feのメモリの値が1増加することを確認する。 第2ステップ BG画面を16x16サイズのブロックで画面いっぱいに埋める。 パレットの設定を行う。 画面にゴミが出ないように全スプライトを画面外(Y>=240)の位置に表示する。 第1ステップのプログラムを改良する。 割り込み処理ではないVBlank待ちのループで、VRAMに書き込みたいデータを用意してバッファに格納する。 NMI割り込みで、スプライトデータのDMA転送の実行とバッファに格納されたデータをVRAMに書き込む処理を行う。 プログラムを書く際に、他人のソースを参照するのは良いが、コピペは絶対行わないこと。 必ず目で見て手打ちすること。 書いたソースは、何度も読み直して、処理を説明できるぐらいまで理解すること。 プログラムが出来たら内容をレビューしたいので、批判にめげずに公開して欲しいと思う。 書き込みたい気持ちはありますが、大分経って事態が鎮静化 してから書き込みたいです。あと、少なくとも今から 100レス程度は様子を見ながら、今から同時にお題を解いてみます。 というのも技術的な指導ならゲーム開発技術板のスレッドなので分かります。 しかし、自分の未熟な部分があるのは自分でも分かるのですが、 明らかに何度も自分の人格を否定していてスレ違いになってるのもあります。 それがどうした?悪いのはお前だろと言われればそうなのですが これが何度も続くようなら、明らかにいじめとしか思えないのです。 いじめと思うのは間違っていると思うのなら、どうして簡単に何度も いろんな欠点や粗を探してこうも傷つけたがるのですか? あと、自演と言っている人へ、 自演をしているように見えるのは、明らかにおかしいですね。 IPアドレスを2chの運営元に頼んでもらって調べれば分かる とは思います。IPアドレスが分かるという事は、書き込んだ場所も 特定されます。 ファミコンのプログラムを公開する書き込んでから家から出かけて 帰ってきてから同じパソコンで書き込んだ事くらい見抜けると思うのですが。 それにしてもやけに静岡県民が多いな 自演に間違いないな不自然すぎるわ あと100レスと言わず一生ROMってればいいのに そうすりゃスレも荒れずに済む まってください。静岡県民が多いのは、俺が周囲から基地外呼ばわり されてるのと、症状のせいだと思いますよ。 それと、自演と決めつるのはまだ早いです。なぜなら、 専門用語を知らない人間が自分を弁護できると思いますか? そして、恐らくその症状のせいで、うざったく思うから このスレで叩かれているのだと思います これで最後にします。100レス待ちます いいから>>307 が終わるまで書きこみを控えてくれ・・ スレ違いかもしれないけど、ディスクカードをromに焼くことができる? >>315 何のソフトかにもよるが原則不可能と思っていいだろう マッパー0相当のソフトだってアドレスの手直しが要る分相当な作業量になる >>316 機械語レベルの理解力があれば、できる? 理解力と相当な根気が要るだろうな 絶対アドレス参照の命令で$6000以降参照のものをすべて書き換えなきゃいけないのだから >>318 ディスクシステムの片面の容量は64Kバイト?64Kビット? ディスクシステムの仕組みも理解する必要があるだろう。 64Kバイトといわれている 実際にはもっと少ないけど というか厳密には1バイト単位のような定まった容量はなかったはず もし片面8Kバイト(64Kビット)だとしたらドンキーコングすら収まらないよ というかこれぐらい調べれば出てくるのでまず調べようね >>321 ディスクシステムのソフトには、名作が多いのでリンクの冒険、ドラキュラ2など海外版を所有してますが、ディスクシステムでしか遊べないソフトがあるので、ROM化出来たらなと思いました。音源も積んで。って誰かやってないですかね? かつてmdc5linkerというものがあった(ROM化の際にはこれの個別パッチが参考になるかもしれない) ただし悪用が多すぎてサポートは終了した、ディスク>カセット変換したものを売りさばくような輩が続出した 事実、ある時期ヤフオクで本来ディスクでしか出ていないソフトがカセットとして出品されている例が多数確認できた というか普通にディスクシステムでやれば? 一体ROM化ってなんのため?ディスク持ってるならディスクシステムでやればいいじゃん ROM化前提なら吸出しも完了してるだろうしバックアップも万全、なのにあえてROM化しようとする意図がわからない どの道、音源までサポートした上でROM化するにはいろんな知識が要る ディスク音源と互換性のあるチップは存在しないため、RAMアダプタ内のもの(ただし非常に大きい、64pinDipだったかな?)を使用するか、もしくは 新たにFPGAなどのPLDを使って実装するか・・・方法はあるがディスク音源如きにそこまでする人がいるかどうか >>323 ディスクシステムは、ツインファミコンもそうですが、ベルトの劣化もありますし、ヘッドも劣化するでしょう。 >>324 http://fcs.main.jp/archives/fcs_road/Diskbelt/diskbelt2.html 知っているかもしれないがこういう方法もある。 バックアップについてはエミュが嫌なら、FDSLOADRという、 PCを仮想ディスクドライブとして使えるようにするソフトがある。ただ数年前の記憶では、相当PCの機種を選ぶソフトだった。 それからDOSベースのソフトのため現代のNT系OSじゃ動かないから、古いWin9x系の動くPCが必要になる。 更にRAMアダプタとの接続のためPCが双方向通信可能なパラレルポートを持っている必要がある。 これを使うとPCに存在するFDSファイルをRAMアダプタに転送できる。 最近FDSLOADRrの上位版のようなfdsloadersaverを作った方がいるよ >>325 アドバイスありがとうございます。今思いついたんですが、ディスクのRAMアダプターを改造してMicroSDカードに入っているディスクのイメージを転送できるに出来たらいいのになあ 機械語の知識(開発ができるレベル)と、 論理回路の知識(設計ができるレベル)に加えて、 電子工作を行えるスキルが必要 あと、英語力(データシートとか、ほとんど英語)。 131氏は何が嫌われてるか分かってないんだろうな 何か指摘されたら「あ、はい俺が悪いですさて、」くらいの勢いで 全く態度を変えず話を続けるのがどれだけ人を無視した行為か 理解できないんだろうからもう書き込むなって言われてるんだよ なんだそりゃ ヤクザの因縁レベルだな キチガイに粘着されて可哀想 Vblank(NMI)発生待ちじゃなくてVblank(NMI)終了待ちの書き方がわからない。 $2002読めばVblank中でも即座にスキャンラインの頭に戻るのかな? 普通は終了待ちなんてしないと思うが・・・ あるとすればフレームIRQをVblank終了間際に起こすようにするとか、かな? 試していないからできるかどうかわからないけど あのバカはまだデバッガ扱えないんだな 他人のソースを読む気もない 何だかんだ、がんばっているんだし応援しようと思う 完成を楽しみに待っています〜 RevolvingGemsで予定していた実装が全て出来たので公開します。 指摘を受けていた ・ゲーム開始時に消滅が発生しないよう駒を配置 ・初期化時にCHR-ROMのバンクセレクトを明示的に行う の処理も盛り込んでいます。 あと、フレームワーク部分(main.asm)も処理を見直して結構手が入っています。 ttp://homepage3.nifty.com/~kyoske/nes/RevolvingGems100.zip ここまでお付き合いして頂きありがとうございました。 ここを見てても本当に良いのだろうか?という気持ちと ヤジでいまだに言ってくる人がいて、不快感しか湧かない ので、ここはまず、書き込みも見ることも辞める事にします。 なのでいさぎよく、このスレから出ていく事にします。 ちなみに、「逃げる理由が出来て良かったな」とか書き込みそうなんで 言っておきますが、言う人は何とでも言うので仕方ないと思います。 最後まで不快感をお互いに感じあってしまい、すみませんでした。 前スレで戦力外通告されてなぜ残った 英語読む気ないのはこの板的にも戦力外 >>340 気に入らなきゃほっときなよ 小言を言うとまたグダグダと返答されるよ 他スレみたいにテンプレに 初心者向けに何か書いておいたほうがいいかもね 東方Projectみたいな画面は作れないか?との興味から作りはじめたのですが、弾丸の表示時点で、CPUの処理能力不足により先が見えてしまいました。 http://homepage3.nifty.com/ ~kyoske/nes/Experi9.zip Experi9.nes .. 160発表示版 Experi9x.nes .. 負荷可視化板 Experi8_noshot.nes .. 弾丸非表示版 Select+下 でスクロール開始、Select+左右 で画面モード切替です。 弾丸の最大数を96に落として、仕切り直す予定。 自キャラ、敵キャラ、弾丸以外は、BGで描画しています。 枠内のスクロールは、ハードウェアスクロールとソフトウェアスクロールの併用です。 16x8の範囲でパレット指定や会話ウィンドウの表示に、縦方向のラスタスクロールを駆使しています。 ジェムの人キター 消えてる時間が結構長いのでかなりスプライトが見難いですねぇ BGは相変わらずえらいことになってますが、負荷軽減でパレットはあきらめて MMC5の画面分割機能の使用を考えてみても良いかも >>344 160発を56個のスプライトで表示しているので、 大体3フレームに1回の表示でちらつきが目立ちます。 次の版は、96発にスペックを落とすので、 2フレームに1回の表示になるので多少は改善されるはず。 MMC5は魅力的なのですが、最終目標が実機での動作なので 勿体無くないMMC3で頑張ろうと思っています。 あと、負荷は弾丸の処理が半分以上占めているので MMC5を使っても状況はあまり変わらないかと思います。 すでに96発MAXに書き換えて、弾丸1つ辺り5byteの領域から 8byteに増えて、Tile番号と属性値が保持できるようになったので 処理が軽くなりました。 弾丸の角度の変化が無ければ、Bombの下辺りまでの 処理時間で済んでいます。 >>345 1/2フレーム表示ならグラIIのミサイルなどで使ってましたね 欲を言えばですが、弾数が少ないときは1/1フレームで表示出来たら いいかも 試しに割り込み無しにしたところ18ライン分くらい処理が減ってました MMC5自体は光栄のゲームで結構出回ってるので入手は簡単かと 思いますが、今更変えるのもあれですね… 期待してますので頑張ってください NESASMでアセンブルしたNESファイルは自作カートリッジに焼く時もそのまま使えるんですか? RevolvingGems 1.00を実機で動かしたら不具合が出たので、 今さらですが調べて直してみました。 ・タイトル画面の表示が乱れる ウエイトが足りず、割込み処理での最後の$2006への書込みが HBLANK中に行われていないようので、user.asmのUser_Irq_Title:直後に nopを(余裕を持たせて)3つ追加して乱れを消しました。 ・あそびかたを選ぶと止まる タイトルで設定された割込みが無効化できずに発生し続けているようです。 Guide_Init:でIRQ_FNC+1を0にしたことで、 Irq:のjsr IRQ_FNC-1が飛ばされるため、 User_Irq_Title:中での割込みの無効化が動かないのが原因と思います。 user.asm 474行目のsta IRQ_FNC+1をコメントアウトして動くようになりました。 >>347 kazzo+anagoのような環境だと直接NESファイルを使って書けますね。 ROMライタで直接書き込む場合だとPRGとCHRへの分割が必要かと。 >>350 ありがとうございますNESplitという分割ツールがありました。 >>348 実機での動作確認ありがとうございます。 >タイトル画面の乱れ 割り込みが入ってから110clk目に最後の$2006を書いていたのですが、 nop3つ追加ということで、116clk目が正解ということですね。 今のやつも直さないと。 >あそびかたを選ぶと止まる VBlank中にIRQ_FNCを更新する仕組みを追加します。 >>352 MMC3だとラスタの260ppu_clk辺りで割込み発生みたいなので、 そこから次ラスタの表示期間終了の256ppu_clkまでの、 (341-260)+256=337ppu_clk = 112.3cpu_clk が必要な待ち時間だと思います。 sta $2006を確実にHBLANKに入れるために+4clkしましたが、 書込みが最後の1clkに行われるとすれば、数クロック削れるかもしれません。 >>352 追実験して、nopは一つでも乱れは消えました。 割込み発生から最後のsta $2006完了までが112clkになるので、 ちょっとぎりぎりな感じはしますが。 >>353 ttp://wiki.nesdev.com/w/index.php/MMC3#Hardware Regarding PPU A12 rises: If the BG uses $0000, and the sprites use $1000, then the IRQ will occur after PPU cycle 260 (as in, a little after the visible part of the target scanline has ended). If the BG uses $1000, and the sprites use $0000, then the IRQ will occur after PPU cycle 324 of the previous scanline (as in, right before the target scanline is about to be drawn). When using 8x16 sprites: When there are less than 8 sprites on a scanline, the PPU makes a dummy fetch to tile $FF for each leftover sprite. In 8x16 sprite mode, tile $FF corresponds to the right pattern table ($1000). PPUアドレスバスA12がスキャンラインカウンタのクロックとなっている。 The counter is clocked on each rising edge of PPU A12, no matter what caused it, so it is possible to (intentionally or not) clock the counter by writing to $2006 BGとSPRをどっちに配置するかで、立ち上がり、立下りが変わるので、 IRQが起きる位置とライン数が変わるようだ。 >>354 追試ありがとうございます。 clkを伸ばした場合、エミュレータでどうなるか確認したのですが こちらでは1clk伸ばしただけでも乱れが発生しました。 実機向けとエミュレータ向けの2つのバイナリを用意する必要があるようです。 だれかギコ猫より分かりやすいサイト作って もしくは解説コメント付きのソース read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる