マリオ2ってスコアなどのパラメータ表示に
ディスクシステムのタイマー割り込み利用してたんだね
1だと0爆弾だったのに
なんかどのサイトにも
ディスクシステムのIRQタイマに関する記述があまりないんだよね・・・
どのアドレスを使うかはわかってんだけど
1カウントが何秒位なのかの載ってるとこがない・・・
自分で測った感じだと
カウンタに65535(MAX)を設定してみたところ
11フレーム中に5回割り込みが発生した
1回の割り込み毎に2.2フレームであるから
1/60*2.2=0.036666・・・秒、つまり
65,535カウント≒36,666,667n秒 よって
1カウント≒560n秒位
夢工場のことか?
スーパーマリオUSAか?
NESのマリオ2か?
>>4 ディスクシステムのスーパーマリオブラザーズ2
でも
>>3の計算だと少し精度が甘いからラスタスクロールとか使うときは
NMIが起きるごとに再設定した方が確実だろうね
それからRAMアダプタに入ってる水晶は21.47727MHzだったから
21,477,270*0.00000056≒12
つまり12分周されたクロックが入ってるっぽい
(つまりファミコンのMPUと同じ1.79MHz)
あとタイマーへのクロックを何分周するか変えられないのだろうか
$4022になにか知らないオプションもありそうな気がしてならない
>ディスクシステムのスーパーマリオブラザーズ2
そういえばそんなのあったな
すまんボケまくったw
結局はエミュのソース見ちゃえばいいんですよ
ディスクシステムなら日本人エミュ作者のがいい
見てきたらCPU同様の1.79MHzのカウンタのようです
CPUのクロックは12分周が基本だから
それ以上でもそれ以下でもメリットは無いでしょ
>CPUのクロックは12分周が基本だから
>それ以上でもそれ以下でもメリットは無いでしょ
まあそうなんだけどね
何秒とかそんな世界じゃ無い。
何クロックと考えた方が良い。1h=約113.7クロック
なんでファミコンは描画中
PPUアドレス空間にアクセスできないようにしたんだろうね・・・
やはりコストからか
アクセスできないんだっけ、アクセスすると異常なデータが読めるとかでなく
アクセスはできるけど$2006自体が現在の画面描写位置そのものだから
画面表示が引きずられちゃう
ファミコンほど理解しやすいハードウェアって
なかなかない気がする
>>14 あの頃のPCだとほとんど同じような感じだったと思うけどな
MSXとか感覚的にはファミコンとほぼ同じというかもっと簡単だけど
あの頃は個人レベルでハードウェアの隅々まで理解できる環境が多かったな
0爆弾で画面2分割し、
上は縦スクロール、下は固定(「沙羅曼蛇」のような画面)に挑戦しています
0番スプライトを画面左端に持ってきて、左端8ピクセルを$2001で隠すと
$2002のヒット検出はできないでしょうか
ためしにやった所
G-NES:できる VirtuaNES:できる
実機(AV仕様):できていない(下画面が描画されない。左端クリップ無ければできる)
おそらく実機PPUの仕様かと想像しています。
マッパー変更してIRQ使えるやつで
やるってことじゃだめなのか?
実機でできないなら、できないものなんだろ
0spriteを1dotだけのものにするとか、回避策はいろいろあるだろう
開発の止まったエミュ持ち出していまさら何がしたいのか理解に苦しむ
単純に考えると、
・クリップ領域から出るように、左から9ピクセル目に仕掛ける
・1つ前のラインの右端に仕掛ける。
のどちらかで出来ると思うんだけど。
クリップ領域に0爆弾置いたら不発になるのは、0爆弾はスプライトを表示するタイミングに依存してるからでないの。
つまり、クリップした区間ではスプライトの表示処理自体がスキップされるとかそういう理由で。
俺、0爆弾なんて使わないから想像なんで違ってたらすまんが。
左端だと描写中だからおかしくなって当然だろ
HBlank中に掛かるように右端でやれよ
すごくザックリ&うろ覚えで申し訳ないのだけど、
背景ピクセルの上に0番スプライトのピクセルを重ねて、ピクセルを描画。
→ このとき、描画したピクセルが透明色でなければ、
$2002の[6]番目のビットが立つ。
→ このとき、描画したピクセルが透明色ならば、
$2002の[6]番目のビットは立たない。
って感じじゃなかったっけ?
クリップで強制的に透明色にされた背景ピクセル+強制的に透明色にされた透明スプライト=透明色
なので、0爆弾がヒットしないんじゃないかと。
実機もないし、エミュで試してもいないので、想像ですまん。
てか、過疎っぽく見えて、読んでる人いるんですねw
22 :
16:2012/08/29(水) 21:37:22.64 ID:3N5g/q8u
ありがとうございます
やっぱり0スプライトを左端、というのは
いい方法じゃないですね
右端に置くとか、IRQ割り込みとかでやってみます
0番スプライトでやるとなると、BGもひと工夫が必要ですね
>>16 ヒット検出しないのが正解だろうね。 実機でそうなったんだし。
上から覆い隠してる訳ではなくキャラクタを表示していない(と俺は考えてる)のだから、ヒットしなくて当然と思うけど。
左端がダメとかは、関係ない。横スクロールの指定はいつでもできる。
検出してからレジスタ叩いてるクロック分だけ画面描画進んでるから
次のラインまで最低でも12クロックはズレたままでしょ
ライン単位での描画しかサポートされてないエミュだと再現できないけど
>>23 がはぼ正しい
>>20 はどちらかというと間違い HBlank中が必須というわけではない
>>24 のようにCPUがフェッチ&デコード&実行&ライトやってる時間にも、PPUのドットは結構動くことに注意
普段はG-NESの使いやすいデバッガでデバッグ。
使いやすいVirtuaNESやNNNesterJでおおまかな確認。
際どいタイミングが必要なデバッグはFCEUXとNintendulator。
Nestopiaでタイミングの最終動作確認。
大まかなデバッグはエミュでやって最終的に実機で動作確認してるわ
0爆弾の設置場所は捨てライン用意するならどこでもいいけど
右端なら画面に影響は出ないわな
28 :
名前は開発中のものです。:2012/10/10(水) 21:49:54.07 ID:Z4BAuN6X
ファミコンゲーム作ってみたいんだけど時間がないんだよなー
現実的な問題がな
プログラミングにアセンブラから入った身だから
最初のうちはなれていたけど
CとかC++とかASに触れていくにつれて
面倒になっていったな・・・
ASってのはFlashですか?
あぁそれはありますよね…。感覚というか形態が違いますからね…アセンブラは
そうActionScript(2.0だけどw)
最初のうちは高級言語のクラスとかオブジェクト指向とか全く理解できなくて、
アセンブラ至上主義で6502とか8080とか8086とかいろいろ手を出してたんだけどね・・・
6502向けのCコンパイラとかいいのないよね
てかそもそも8bitCPUに高級言語使うのもおかしな話だけどさ
某C言語が使えたポケコンは、全然速くなかったよ
さすがにBASICよりは速かったけど・・・
そもそも6502でC言語を使う需要が無いしな
Z80なら需要があって割とあるけど
cc65があるだろう。
最適化があまりうまくないけどな。
素人レベルだと十分だわ。
Cは16bitな石からでいい。色々ともったいない。
メガドラ以降ってことですか
同じ6502でもPCエンジンだと、ハドソンが優秀なCコンパイラ作ってたりしたんだろか?
SFC末期やプレイステーション頃まではC言語に出番はなかった。
C言語だけでリアルタイム処理なゲームを作って動かせる、それを配布できるってことは、今で考えるよりもずっと贅沢な事。
個人ユーザ中心のホビー分野ではそれなりに需要あったんだろうけど。
それとFDみたいに安いメディアかつ少数生産で済む16bit世代なPCゲーとか。
8bit機だと非力すぎる上にどうせ機種依存バリバリな処理系しかないからCで書いても他で流用のしようがない。
使うことにデメリットは多くても、メリットになる部分が全くと言っていいほど無い。
メガドラは時期的に言ってアセンブリ言語手書きだと思われる。
人間が手書きしても全然苦にならない整然としたアーキテクチャだったし、セガが発売したゲームがどれもROM容量ケチってるあたり、C言語使って容量無駄に使うことが許されたとは思えない。
しかし、Cで組むとなんであんなにコード太るんだろうな
ただ単に、
当時は、ハードメーカーから提供されているのが
アセンブラだけとかだったからだろう。
プログラムといえば、BASICかアセンブラという時代なんだから、
c言語がなくてもしょうがない
当時を知らない人間は、そう考えるのね。
アセンブラでやったって速度足りなくて神業が要るっていうのに
なぜC厨が湧く
42 :
名前は開発中のものです。:2012/11/04(日) 00:17:55.67 ID:CsVJLmvl
最近MMC1AとMMC1Bをいじったけど、電源投入時はバンクサイズ16kモードで後半の16kは最終バンクで確定してるみたい
よく言われるように16k毎にベクターやリセットルーチンとかを設置する必要はなく、
32k毎の設置で一切問題はなかったので、リセットで偶数バンクが後半16kにあてがわれることはない模様
ファイナルファンタジーや三國志とかを見ると最終バンク以外にリセット等のベクタを置いていないから
バンクサイズ16kで後半最終バンクFIXモードだと不定になることはなさそうな感じ
無印のMMC1が手元になく確認していないのでひょっとしたら仕様変更があったのかもしれないけど
それとbit7立ててバンクの初期化って古いエミュだと実装されていないから
GNESとかVirtuaNES使ってると理解できないのはしかたがないと思う
44 :
名前は開発中のものです。:2012/11/13(火) 20:19:26.33 ID:CAAAMru1
話割ってしまうけど、自作したデータを既存のROM内のデータと交換して売るのって違法なの?売っているのを見たことないんだが。
カートリッジは意匠があるからやるなら基板むき出しか。
でも動作保障とかめんどいからキット販売がせいぜいか。
>>36 pcエンジンエミュレータ「MagicEngine」の作者が作ったものを
バージョンアップしたコンパイラHuC
http://www.zeograd.com/ HuC使ったけどすごく重いです
stgを作ろうとしたんだけれど
タスクを自機弾10、敵3、敵がばらまき弾8方向くらいで処理オチしてやる気無くなた
この程度のゲーム30fps20fpsにする意味無いし
エミュもリアル本体並み程度の能力しかないから処理落ちします
処理落ちしても良いアドベンチャーならまだしも
日本語表示の壁が
最大容量もPCEは2メガバイトが限界
古いHuCは多少軽いし、マジックエンジンHPからダウンロードできますが
機能が足りないです
47 :
名前は開発中のものです。:2012/12/17(月) 11:39:43.53 ID:pzS/xX0F
NESはファミコンと違ってカセットに音源積めないから
そういう方向に進化せざるをえなかったのかな
クソゲと酷評されるソルスティスだが面白かったね
主人公キャラクタがオブジェに隠れる演出はすごいよ〜
パターンがRAMでキャラ側をマスクで消してるんだっけ
曲とデモプレイ画面しか見たことなかったが…。
キャラと重なるBGオブジェを、重なっているときだけスプライトにしてるのかと思ってた…。
でも素直にそうやっちまうと、スプライト用のパレットが足りなくなるのね。
ほんと凄まじい発想だわ…
もっと派手な演出なら、既出だろうがRareのBattletoadsも良いな。
https://www.youtube.com/watch?v=-1UwbUencb4 しっかりした2重スクロールは、PCエンジン以降でしか見たことない気がする。
カエルのしゃがみポーズで笑う
ずっと気になってて最近確認した物に関連する話題が出てたので…。
スプライトモード8x16の時、普通指定するのとは逆のキャラ番号(偶数なら奇数、
奇数なら偶数)を指定すると、BGバンクのキャラがスプライトで出ます。
また、このBGバンクのスプライトを他の表示するスプライトよりも優先度を上げ、
BGより優先度を下にすると、他のスプライトはこのスプライトより下、つまり
BGより下に表示されます。
BGより下に表示されるのでパレットコストは必要ありません。
これを効果的に使えば細かいマスク処理が出来るはず。
横並びが厳しいので使い所は限られると思いますが…。
自分もソルスティスはコレを使ってるのかと思ってたんですが違いましたね。
何か問題があるのか、単にこの方法を知らなかったからなのかは分かりませんが。
PCエンジンでは使われてたらしいけど、ファミコンでこの方法を使ってるゲームはあるのかな?
そのスクショ実機じゃないならなんの証明にもならんよ
ていうか、全然分からない。(8*16スプライトの仕様はおいといて)
スプライトの優先度とBGの前後の関係は、まずスプライト番号の若いものが最優勢され、
1番目のsprがbgの裏、2番目がbgの表だったら、2番のsprは1番に重なる部分は1番に消されて、表示されない。
1番sprからはみ出た部分だけがBGの表に見える。
がんばれゴエモン外伝のオープニングで、えびす丸がドアから出るシーン、スプライト優先度をうまく使ってる。
シルバーホークとか固有名詞を当然のように出されても伝わらない
いまどきダライアスとか言ってるのってリタイアしたキチガイ互助会の方なのかな
いやいや、ダライアスは新作出たよw
わざとスプライトを8個以上置いてスプライトを消してるソフトもあるな
>>54-55 結局BGをスプライトにしてるから、VRAMの余裕はできても、
スプライトパレットの余裕はできないんじゃね?
あとソルスティスのデモ画面、パターンテーブルで見たけど、
CHR-RAMは極めるとすごいな。
弱点としては、VBLANK時に1フレームあたり
10キャラくらいしかロードできないんだっけ。
扱い方が難しいところも燃えるなぁ。
CHR-RAM直打ちでいちいちキャラクタを書き換えているのが
ソルスティスの技術。上位オブジェクトの重なりと非描画判定は凄い。
後にラグランジュポイントはCHR-RAMって8KBなんかな。あのパターン
量を見ると8KBではなさそう。
セリフ用の文字画像部分を足して16KB搭載かつセリフウィンドウ部分
で割り込みバンク切り替えしているんじゃないかと推測しとるんだけど。
それともただのCHR-RAMなのだろうか。
64 :
名前は開発中のものです。:2013/01/01(火) 12:13:51.02 ID:wi03Ie1H
わかってないなら適当なこと言わなきゃいいのに
66 :
名前は開発中のものです。:2013/01/02(水) 01:00:10.06 ID:sqh/nOWC
>>65 あ り え な い 。それは。
バストダンジョンでリリカのおっぱい値を800近くまで調教強化してやらないと、そのフラグは立たない。
仮にフィリオナをメンバーから外してリリカを集中調教しても、アナルバイブが使えないその段階では
スカリバーはまだ手に入れられないはず。 妄 想 で つ か ?
とりあえずアンダー草原で淫獣マリリスを大量に調教して淫度をどんどん稼いどけ。
展開が不安ならバックアップ取っておくのを忘れんなよ。説教くさくなってスマソ・・・。ついな・・・。
は?
昔どっかで見たコピペだな
いつのコピペだw
63です。本気の解説ありがとうござんす。
RAMのバンク切り替えの様なもの、というかメモリ参照の位置が変更
できるなんて想像の斜め上を行っていたとは・・。驚きました。
64です。CHR-RAMなのは知っていたけど、
63の書き込みを見て調べた結果に驚きました。
ROMを乗せるはずのところに、一工夫してRAMを乗せるとこうなるのですね。
( ;∀;)イイハナシダナー
逆にネームテーブルのRAMを置くべきとこにバンクROM配置ってのもなかったっけ
サン電子のアフターバーナーだね
某サイトに$4018-$401Aにもレジスタがある(ミラーではなく)みたいな記述があるんだけど
誰か何のことか分かる人いる?
今調べてるんだけど出てこない・・・
まじか。あさってやってみる。
でも、実用上ほぼ全く役に立たなそうだな。
decapまでされてるのか
>>75 有益な情報をありがとう
ファミコンのプログラムはもうずっと前からしてるがこれははじめて知った・・・
>>78 これらを使用していたソフトが無いから、任天堂からの資料にも書いて
いなかったんだと思う
使いどころを考えてみたら、DPCMのを鳴らす前のプチノイズが出ない
ようにしたり出来るかもって位かなあ?
>>75 やっぱり
NesDev界隈には回路の写真から解析しちゃう人いるんだな
色付きの線で実に説明上手だ
祭りだワショーイ
>>80 オープンバスって「レジスタに繋がってないただのアドレス」
という意味でいい?
どうなるんだか試さないとわかんねw
ちょっと質問なんだけど、アセンブラってみんな何使ってる?
ファミコン用のCライクな言語のコンパイラを作っていて、
とりあえずnesasm向けのasmを出力してるんだけど、
リンクとか考えるとcc65のアセンブラのほうが高機能っぽいので現在迷い中・・・
Cライクってのがわからん
このスレにCは需要無い
Cでやるならcc65のCを使うでしょ
x86のCコンパイラが吐く自動変数っぽい仕組みのを
nesasmで書けるマクロ組んでみたけど
遅くて使い物にならなかった
85 :
83:2013/01/15(火) 10:34:28.65 ID:DThX962j
>> 84
自分が見た範囲だとnesasm使ってる人が多そうだけど、それ以外にもメジャーなアセンブラがあって、
そっちのほうが便利だったら乗り換えたいなというくらいの気持ち。
nesasmは、リンク機能がないのが直近の不満なんでそれ書いた。
> 遅くて使い物にならなかった
cc65が出力するasmを見て、このままだと遅すぎて使えないってのは同意。
工夫すれば実用的(アセンブラの1/2くらい?)にはなりそうなのでちょっと作ってみてるというところ。
といっても、割り込みや速度が必要なコードはasmで書かないとだめなのは諦めてる。
> このスレにCは需要無い
高級言語の需要はなさそうだなぁというのはわかってて、そういうの作ってるっていうのを書いたのは、
もしかしたら興味あるひとがいたらいいな、という下心はすこしありましたw
4018-401Aを読んでみたけど、どれも64が返ってくるだけだった。
がっかりして書き込みなし?
nesdev消滅したのかと思った
数年前に比べてファミコンに関する資料がかなり増えたね
10年前はもっと…
ファミコン用の音楽ドライバを見つけたぜ。cc65でコンパイルした
libファイルを組み込んで鳴らしい。使い方はまったく解らん。内部構造
とかは詳しく解説してはあるヘルプが付いてるけどね。ちなみに、これ
用のmmlコンパイラも付属しているよ。
ttp://shaw.la.coocan.jp/nsdl/
あ、そういうことする人なんだ
94 :
名前は開発中のものです。:2013/04/18(木) 23:16:17.58 ID:IMzwu5mh
>>92 すごい.
なによりも,この開発者さんの情熱が凄い.
ぜひ使わせてもらおう.
来月はファミコン発売30周年だな
初歩的なこと聞くけどBGのネームテーブルとかスプライトデータ64*4
のデータを見ること出来る?スーパーマリオで土管に乗るとかPPUのデータ
から判定してるかな?まさかCPUのRAM0x0000-0x07ffに入れてそれを見てる
ってことはないよね?
画面描写中はVRAM見れないよ
デュアルポートRAMなんてなかったし
98 :
名前は開発中のものです。:2013/08/06(火) NY:AN:NY.AN ID:3KQG/adI
マリオブラザーズなら
VRAMのデータで当たり判定してたはず
画像ハックすると永久落下とか?
こんなのは例外で
スーパーマリオなど普通はCPU空間のRAMに仮想地形を作る
99 :
名前は開発中のものです。:2013/08/14(水) NY:AN:NY.AN ID:qLnn+CpW
>>98 >VRAMのデータで当たり判定してたはず
>画像ハックすると永久落下とか?
自機の移動先座標のドット色情報で当たり判定してたベーマガの投稿プログラムを思い出した
101 :
名前は開発中のものです。:2013/10/13(日) 05:30:26.19 ID:2zt6NDsD
スクロールなしの固定画面で
走査線割り込みによってパレットを書き換えて色数を増やしている
ソフトの代表例を教えてください
3Dホットラリー
メタルスレイダーグローリー
元々の選べる色が50数色程度じゃ
パレット書き換えしても劇的な変化はないんだな
パレットを高速で入れ替えると中間色みたいになる
ドルアーガでやってたな
キラキラスターナイトの音楽って当初はmckで作ってログなんだってな。
音楽で800kbとかワロタ。
最終的には92のサウンドドライバにさしかわったそうだ。
すいません、16進数でFCはリターンですか?
難しい質問だ
6502の話ならRTSは0x60でしょ
0xFCは未定義
6502は未定義命令多いよね
108です、ポートピア連続殺人事件のバイナリを見ていて
文章の後からなずFCになっているので
文章のサブルーチンからリターンするコードがFCなのかな?と思ったのです
未定義というのはユーザー定義で自由に使えるということなのでしょうか?
だとすれば中村光一氏が定義したのかな?と思います
な、なんだってー!! Ω ΩΩ
ただ単に、文章の最後を表すために、FC使っているだけ。
ちなみに、ポートピアなら、固有名詞にも特定の値を当てはめて、
容量を節約している。
なんだ、ただのバカじゃねえか
>>112 君はまず命令とデータの区別をつけるところからだな
あと未定義というのは何らかの既定の動作はするが使い道が無いということ
他と同じ動作だったり、ナンセンスな動作だったり、何かを破壊したり
6502の未定義命令表ってどっかに落ちていたような・・・
とはいっても2a03とオリジナルで違うような気もする
同人でファミコンゲーだしてみたいので勉強中
実機でできるようになるまで遠いなぁ
BG読書き時のレジスタアクセス等の手順を日本語で正しく説明しているサイトってないかね?
古い情報を掲載してるとこしか知らない。
どこかで詰まってて表示できないとかトラブル抱えてるならソースファイルちょっと見せて?
ロジックは正しいハズなのにBG表示上手く行かねーって時あるけど
そういう時って大抵「ブランク期間中に全ての処理を一括でやらせて終わるのを待つ」的なロジックだったりする
ファミコンさんって割とレトロで非力な環境なので、毎フレームBG全書き換えできるほど速度早くないっていう。
なので、BG書き換え期間中は非表示にして、書き換え終了後にのみ表示する設定にすると、うまくいく事がある。
122 :
名前は開発中のものです。:2014/03/12(水) 01:37:23.21 ID:sVRc03+V
スクロールレジスタ戻してないに1票
まだこのスレ見てる人結構いるんだな。。。。
スレチかもしれんがSFCのことについて聞きたい。
65816でCOP命令ってあるよね、あれ普通のソフトウェア割り込み命令とどう違うの?
てかコプロセッサ使用時にどう使えばいいの?
別枠で跳び先用意してるだけで、仕組み自体はソフトウェア割り込みそのもの。
意味があるかは別として、コプロセッサを使う以外の処理にも使用できる。(使用頻度が高いルーチンの呼び出しとか)
コプロセッサは、COP命令発行後、割り込みベクタを参照して飛んだ先のルーチンで、普通にI/O叩いて使う。
パラメータ渡したり、処理に違いをつけたかったら、レジスタで処理番号渡してルーチン側で分岐とか、
スタックにパラメータ積んどくとか。
ちょっと昔のパソコンで浮動小数点演算ユニット使うのとあんまり変わらない。(というかそのものか)
去年あたりにCPUとPPUのデータシートが流出したって聞いたが本当かね?
バーイ ハドソン
ネトウヨ「国際司法際はチョン」
なのに竹島問題もハーグで決着つけようとかいってるジャップwwww
133 :
131:2014/04/04(金) 16:51:41.09 ID:stHAjJOS
nnnesterJでも動いた
ずっとやってたらCLEARって表示されたわ
135 :
131:2014/04/07(月) 06:20:21.08 ID:ANvPoB1w
ありがとうございます。あと、透明な敵が現れるバグがあるのと、
静岡県立沼津工業高校の校歌を使っています。
?
6502プログラミングの基礎はどうやって勉強するんだろ
アセンブラ言語そのものは分かるけど実装技術が・・・
>プログラミングの基礎
6502のCPUの割り込みベクタとかの仕様を確認理解して、
他人が書いたソースコードを読んでいくのが良いかと。
ファミコン(古いゲーム機)のプログラミングは、初期化の後、
VSYNC待ち→1フレーム分の処理
の繰り返しとなる独特のプログラム構造を理解する必要があるかな。
おお、すげぇ
宝石がヌルヌル流れるのがいいね。
なんでわざわざラスターしてるのかとおもったら、パレットのために必要なのか。
勉強になる・・・
すごい
仕事がコンピュータに関係ない仕事で趣味だけでここまで作ったのなら偉いと思われるレベル
当時のベーマガに投稿していれば採用されたと思う
欲を言えば、宝石回転をもっと速くして欲しい。
145 :
141:2014/04/13(日) 00:08:08.07 ID:KkvqpUBo
>>143 >パレットはいじってないよ?
パレットというか、アトリビュートテーブル?
ラスターしないとパレットの違う宝石が水平に8ドットずれの位置で表示できないよね
ラスタスクロールでずらす、って発想すごいなー。
こういう使い方初めて見た。勉強になりました。
当時もこういう使い方あったのかな?
ヘックスマップの戦略シミュとかでも使えそうだ。
148 :
145:2014/04/14(月) 00:05:28.57 ID:Ye30GFaz
>>147 なんでそんな否定からはいるのさ?
「アトリビュートテーブルの制限で、パレットが2x2BGキャラクタごとにしか
指定できないのを回避するために、ラスターでずらしてるのね」
まで言わないと伝わらない?
あなたの発言をみると、ファミコンの知識はあるのは分かるので、
ちょっと考えれば想像できると思うんだが。
146もラスターで「位置をずらす」んじゃなくて、「パレットの制限を回避」
するって発想を褒めてるんだろ。
まぁ、喧嘩したいわけじゃないんで、そこんとこご理解を(^^
149 :
146:2014/04/14(月) 00:18:00.10 ID:BSoZ156l
150 :
145:2014/04/14(月) 00:44:20.53 ID:Ye30GFaz
補足。
ラスターに関して147の言ってることは技術的に正しいんだけど、
他人がそれを理解してないのを前提に、否定してるのが、ちょっとカチンときたということ。
(145も146もこの件に関して技術的に勘違いはしてないと思う)
>>140 とか
>>131 とか手を動かしてるひとを応援してるんで、こんなレスでスレを汚してごめんよ。
>>146 当時のこういう使い方はあったのかは気になるね。
ヘックスといったら信長の野望くらいしか記憶にないなぁ・・・あれは4x4だから問題ないし。
>>149 似たようなのでテトラスターもあるね
コズミックイプシロンは横にラスタースクロールもしているけど、ベースの
アイデアとしてはBGのバンク切り替えアニメと同じことで実現してる
1ラインずつ別バンクに切り替えて絵を組み上げていく感じ
140です。
>143
strobeの件、情報ありがとうございます。
ソースに反映したいと思います。
>144
回転時のアニメーションは確かに落下時より遅いので修正します。
パラメータいじるだけなので、修正は難しくありません。
>149
>151
コズミックイプシロン見てみましたが、縦方向にも若干スクロールして立体感出しているみたいですね。
BGのバンク切り替えとの複合技でスゲーなと思います。
今作っているソフトも、2x2ブロック毎にずらしてあげれば
HEX表示できるな と思いつき実証の意味で作っています。
あと、1色共通で2色で描けば、1パレットで2種類、
3パレットで6種類の駒が表示できるなと。
ラスター割り込みは、他にもネタがあります。
例えば、8ドット毎に8ドット縦にずらせば、16x8ドット単位で
BGのパレット指定ができるなとか。
コズミックイプシロン、初めて知ったけど、たしかにすごいね・・・
デバッガで見るまで、どうやってるか想像もできんかった。
しかも、この手の3Dビュー系のゲームは個人的にはいまいち面白くないのが
多いけど、ゲームとしても楽しいw
good luck!
>>152 カーソル枠でまわる宝石が▽と△の時でカーソル枠の上と下を少し
狭くしたほうがわかりやすいかなと思いました
>>151 テトラスターは知らなかったんで見てきた。おんなじ感じっす。
それにしても、バンク切り替えでやるのか…すげーな。
ちゃんと地形の模様になってんだもん、良く考えついたもんだ。
いま手元にないんでアレだけど、そのうちデバッガで見てみたい。
>>152 思いついたのか、発想力すげー…。
>>154 最初、指摘の通り、カーソル枠を台形にして、▽か△かわかるようにしたのですが、
カーソル移動時にうねうねカーソルの形が変わるのが気持ち悪く感じたので、
今のただの四角にしています。
>>148-150 >>131 自演気持ち悪い
わかってないからってファビョって「他人」を弁護?w
>>148 >「アトリビュートテーブルの制限で、パレットが2x2BGキャラクタごとにしか
>指定できないのを回避するために、ラスターでずらしてるのね」
>まで言わないと伝わらない?
伝わってるからそれは違うって言ってるんだけどね
手を動かしていてもね
延々と即値でスプライト初期化してたから変な奴と思ったらやっぱりな
ずらしてパレット指定の限界突破という謎技術を語ってる人が他にもいるようだけど
158 :
145:2014/04/14(月) 22:05:09.05 ID:Ye30GFaz
>>131 の名誉のために、131と私は別人だよ。
スレのためにもう返事はしないし、あなたが正しいってことでいいよ(^^
>>140 さんに質問です。
勉強にソースを読ませてもらってます〜
タスクのなかが下記のようなフローになっていると思うのですが理解あってますか?
...
jsr Yeild
...Vcmd_SequenceDataなど BG書き込み予約系処理、完了時はzフラグで判定...
jsr Yeild_Eq
(zフラグが立っていた場合は jsr Yieldの直後から再実行)
(zフラグが立っていない場合は、下に抜ける)
...
また、あってるとしたら、こういうフローっていうのは
8bitなアセンブラだとわりとよくある手法ですか?
C言語脳なので、pla pla とかで返りアドレス捨ててるの見て、
どこに帰るんだ〜、とか、しばらく混乱してました(^^;
不躾な質問ですいませんが、お暇だったら見て頂ければ幸いです。
>>159 さん
> タスクのなかが下記のようなフローになっていると思うのですが理解あってますか?
> (zフラグが立っていた場合は jsr Yieldの直後から再実行)
> (zフラグが立っていない場合は、下に抜ける)
Yesです。
> また、あってるとしたら、こういうフローっていうのは
> 8bitなアセンブラだとわりとよくある手法ですか?
あまりないかと思います。
ゲーム屋として仕事したことはないので、どのような手法が一般的かは
知らないのですが、現在の進捗状態を番号で管理してジャンプテーブルで
飛ぶみたいな話は聞いたことがあります。
私の場合は、各処理を分解してジャンプテーブルで呼び出すのが
面倒そうだったので、次の呼び出し先のアドレスで管理する方式としました。
>>160 Yesと書いちゃったけど、確かに、zフラグが立っている場合に抜けるでした。
あ、ご指摘どうもです。逆でした
あら、、、フラグは z なのに beq/bne だから、頭が混乱する(xx
すいません、書き込み順の前後で混乱しました。160さんの指摘で正解ですね。
>>161 なるほど〜。ジャンプテーブルより柔軟性がありそうですね。
あと、継続っぽくてカッコイイ。
ありがとうございます
画面表示中にパレットを書き換えるサンプルプログラムつくってみたので、興味があるひとはみてみてね。
自分は、情報がなくてけっこう試行錯誤したので。
http://www1.axfc.net/u/3224863 メタルスレイダーグローリーのIRQ割り込みを参考にしたんだけど、
7ラインくらい表示ができないのはしかたないのか。
もっといい方法とかあったら、教えてくだしあ。
>>166 中央が黒いのは、書き換え中に色が付くのを防ぐため?
168 :
166:2014/04/19(土) 02:10:32.86 ID:ENCcy0CN
>>167 うん。
たぶん、ラスター使えるようになってラスターでパレット変更もできるぜぃ、
と思って試した人(過去の俺とか)は、なぞのゴミが表示されて悩まされてると思う。
そのゴミをHBlankに押し込めるために、16byteの書き換えに7lineも画面表示を消してるって感じです。
あ、ほんとだw
実は、3Dホットラリーの名前は以前でてたんで画面見たんだけど、
上2パレット、下2パレットくらいでやってるんじゃない?とおもって、スルーしてた。
ちゃんとパレット書き換えしてたのねw 失礼しますた
ゴミなんて消してやんよ
って思ったら
意外と無理だった
if ((!IsRendering) && ((VRAMAddr & 0x3F00) == 0x3F00))
PalIndex = Palette[VRAMAddr & 0x1F];
こんな仕様しらんがな
nintendulatorのPPU.cppより
ちなみに、これってハードウェア的にはどういう原理なの?
詳しい人いたら教えて。
>>171 そんな断片ソースで理解できるのがすごい。
177 :
166:2014/04/22(火) 03:41:30.42 ID:+4JN+sCM
>>175 おおお、これは技術の粋が詰まったコードですね!素晴らしい!!
私もレベル3上昇して、レベル4になった〜
クロック管理が神々しく緻密・・・
ちなみに、ゲームでこのテクニックを使うとすると、IRQが入りそうなタイミングで
メインスレッドはnop連打になってないとダメという認識でおk?
とすると、実用は難しいけど、、、
ジャストアイデアとしては
2、3ラインくらい前にIRQいれて、一時的にメインスレッドをnop連打ループに切り替えて、
終わったらまたもとのメインスレッドに戻すというのは可能かな?
考えるだけで、脳髄が痛い・・・
>パレットの0x0dは使えないよ
一部の黒はつかっちゃだめというのは聞いてたんだけど、反対におぼえてたみたい(^^;
今後は0x0f使います〜
>>176 の情報も含めて、いろいろありがたい(^^
やっぱり、コードは晒してみるものだなぁ・・・
178 :
166:2014/04/22(火) 03:55:38.11 ID:+4JN+sCM
いままでの自分の致命的な間違いに気づいた・・・
nopは2クロックだったのね。1クロックだとばっかり思ってた(^^;
よくいままでのコードうごいてたなぁw
てす
>>173 PPUのデータのバス(信号線)が1組で、PPUのレンダリング中はVRAMからデータを読み出している。
CPUがVRAMアクセスのためにPPUアドレスを設定するレジスタ($2006)とPPUがネームテーブルにアクセスするアドレスのレジスタが兼用のため、CPUがパレットのアドレスを書き込むとPPUはパレットデータを読み出してレンダリングすることになる。
と理解しているのですが、間違っていたら指摘お願いします。>他の人
182 :
166:2014/04/22(火) 20:46:59.02 ID:+4JN+sCM
>>180 >で、PPUのレンダリング止めると、PPUのバスが空くので
>その間は自由にVRAMアクセスできたと理解していたんだが
>違っていたかな?
そう思ってたんだけど、PPUのアドレスレジスタが0x3f**だと、
**の色(=ゴミ)が出力されるっていうのが、171のコード片の意味。
183 :
166:2014/04/22(火) 20:59:26.06 ID:+4JN+sCM
>>181 なるほど〜、
ハードウェアは素人(簡単なワンチップマイコンをいじったくらい)
なんで、解説してもらえて助かるっす。ありがと〜
用語があってるかわからないけど、バスコンフリクトってやつでいいのかな?
あとチップに損傷を与えたりはしないのかしら・・・
まぁ、あとは電子回路関係の情報で調べてみます。
184 :
166:2014/04/22(火) 21:04:00.85 ID:+4JN+sCM
連投でスマソ
>>181 追加で疑問。
そうすると、0x3f**以外のアドレスでも、そのアドレスのVRAMデータの色が出力されそうなんだけど、
0x3f**以外ではそうはならないみたいなんだよね・・・
これはレジスタ兼用でもそうならないものなのかな?
>>182 なるほど、了解です。
自分も実験してみよう。
>>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.
この辺あやしいね
>>177 今回はjmp *にしてもHBlankに収まるっぽく大丈夫なようですが
127 line目で
$2001のレンダリングオフにする瞬間の
PPU tickのばらつきが
249〜254 nop連打の場合
249〜257 jmp連打の場合
ばらつきが3dot分増えることになります
市販ゲームのIRQ関係もゴミだらけだし気にすることはない
直前に入れるのはいいアイディアだね
>>186 >>187 なるほど、、、
まだ理解してないけど、このあたり読めばわかる気がしてきた。ありがと
しかし、PPUのアドレスレジスタの兼用さえなければ、レンダリング中に読み書きできて
BGアニメーションとかもっと便利だったろうにって思ってたけど、
Ntsc_timing.png みるかぎり、ひっきりなしにアクセスしてるんだね・・・
とするとメモリポートが2つないとだめだから、結局は無理だったのか。
>>188 了解。
sei/cliさえしなければ最大6クロックだから、6*3=18dot(nopにくらべて12dot大きく)
ずれるのが許容できればおkってことね。
許容できるのか、計算するのが大変だけど(xx
この現象で分った事。
パレットの04 08 0Cは00とは別の値を格納できるが、実用上何も使われていないと言う事(合ってるよね?)。
↑あってるっぽい
ただしスプライトの四の倍数とは共有か
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;
流れぶったぎるようで申し訳ないけど、デバッガ機能が一番使いやすいNESエミュはどれですか?
>>192 FCEUXがおすすめ。
(読/書/実行)ブレークポイント、スキャンラインごとのVRAM内容表示、RAMウォッチ あたりの機能をよく使ってる。
ありがとう
ブレークポイントの使いやすさは
G-NESじゃないか
よっぽどトリッキーなコーディングしないならこれで十分
G-NES は使いやすい、指定行まで実行がStepOverを兼ねる
FCEUX はログ機能が最強、シンボル機能搭載、エミュ精度も結構よい
Nintendulator はデバッガ付きではエミュの精度が最強かな、使いにくい
>>191 そう、スプライトと共通(04=14、…)
僕は実機で確認したけど、nendoかnestopiaと同じなら間違いないだろうな。
古いネット上のドキュメントとか間違ってたりするから100%鵜呑みにしない方がいいよ(エミュのソースも)。
G-NESは使ってなかったから、ちょっと触ってみた。
デバッガは、FCEUXとG-NESほぼ同等やね。
ちょっとわかりにくいけど、アドレスクリックして"Seek To"で指定行まで実行もできるし。
(この機能が超欲しかったけど、いま探すまでアドレスクリックで指定できるの気付かなかったw)
しかし、FECUXのシンボル情報って吐き出してくれるコンパイラあるのかな・・・
使えれば便利そうなんだけど。
マッパー0のカセットを何本か作りたいんですが
既存のソフトのHVC-NROM-256K-02基板からICを外すのが面倒なので
プリント基板だけを通販しているところとかないですかね?
もしくは,CADデータとか.
ちなみに作りたいカセットとはこれです.
この1週間ちょっと頑張ってインプリしてました.
アセンブラなんか普段いじらないので,めちゃくちゃです.
でも,このスレはちょくちょく見てるので,恩返しに公開します.
ttp://sayonari.com/famicom/FamilyBird.zip 綺麗に書き直したかったですが,しばらくいじれそうにないので,
皆さんに託します.
FCEUXではちゃんと動くんですが,ROMに焼いて,
FC互換機(GCC NEXT)で動かすと,
スプライトがチラチラと画面中に散らばって表示されます.
メモリ管理とかちゃんとしてないし,変なところに書き込んだり,
PPUアクセスのタイミングがむちゃくちゃだったりとかが原因だと思います.
互換機じゃなくて正規版本体ならちゃんとうごくのかな・・.
そこまでやって正規版FCを持っていないというのが謎過ぎる
高いわけじゃないんだから普通に買えばいいのに
>>199 スプライトDMAの前に$2003に$00入れるといいかも
>>201 すごい!かなり軽減されました.しかしまだチラチラがあります.
しかしさすがのアドバイスありがとうございます.勉強になります.
なんで土管に触っただけで死ぬんだ
こんなクソゲー久しぶりに見たわ
>>200 ファミコン本体は実家にはいっぱいあるんですが,今の家にはなくて,
急遽必要になったので,とりあえず,ヤフオクで互換機を送料込み900円で落札しました.
その後,今もですが,正規版ファミコンをどれにしようかと,ヤフオクでキョロキョロしてます.
互換機は今日届きました
>>203 これは,FlappyBirdっていう人気アプリのオマージュですが,それも土管で即死です
ROMライターのLEAPER-3Cのドライバが64bitWin7では動かなかったので焦りましたが,
VirtualPC上のXPmodeというやつで,そのOSからLEAPER-3Cが使えたので
良かったです(´ρ`)
非VBlanc期間がループで一切の処理をしていないからDMA転送がVblank内に収まってないんじゃないかね
通常は非VBlank期間にキー入力だのスプライトのデータ準備だのデータを用意しておいて
Vblank期間は描画処理だけを行うようにする
>>205 ありがとうございます!
チャレンジしてみましたが,上手く実装できませんでした(´ρ`)
どの処理をどこでやればよいか・・・.
もう時間的に頭が働いていないのかも.とりあえず寝ます.
>>207 nestopia情報ありがとうございます!
試してみましたが,パレットがおかしくなるバグはありますが,
実機互換機で起こるチラチラ飛び散りバグは出ません.
正規本体でもでないかな.正規本体早く買おうかな.
nesdevにも凸したいと思います(〃゜ω゜〃)
>>208 最初のロゴでスプライトのゴミが出るのはメモリの初期化をして
いないからだと思う
パレットがおかしいとかスクロールがぶれるとかそういうのは恐らく
表示期間中にPPUに書き込みしてるんじゃないかな
fceuだとチラツキは見えない
時々音がおかしくなる。
>>199 タイミングめちゃくちゃ&画面ゴミ&遷移時ちらつき&各PPU系メモリ初期化すらできない
こういった初心者はG-NESだけ使ってればいい
そもそも仕組みをちゃんと理解していればこういった不具合を起こすことはない
最近うpる人っていつもこういう傾向だけど、わざと間違えてレス貰う釣りなの?
見た目綺麗だけど不器用で挙動めちゃくちゃなソースの人多いね、BGオンする前にVBlank待たずにチラつかせたりとか
最低限NESTECJ.TXTかndox200.zip理解しとけよ
・スプライトメモリの初期化をしていない、Y座標(0xef <= y <=0xff)とするとスプライトはオフになる、Reset:とシーン#1入り口等でやれ
・NMI直後にJSR PadGetやる暇はない、まずSPRDMA。プログラムのあちこちにSPRDMAがばら撒かれているのはおかしい
・シーンチェンジのVRAM初期化から離脱するときに、VBlankを逃してVRAMに書き込んでる
・あなたは当分.macroは使用禁止、これは上級者向け
・シーン#1の初期化でPPU $23be-$23bfへ書き込めていない
・シーンチェンジの瞬間に下記と同じ理由でカクついていると思う
シーン#0の初期化の際
inc <BGUPDATED
.g2
jmp EndBG もうこの時点で123ライン程度経過している、つまりブラウン管のど真ん中描画中に
こんなことをやっている
sta VRAMADDR これはゴミがでるね
sta SCROLL カクつくね
lda #%00011110 ; スプライトとBGの表示をONにする
sta PPUCTL1 カクつくね
この次の箇所へ提案…
パッドはここにおけばいいはず
各〜_playはたぶんここでいい
snddrv_playはここでいい
rti
各シーン初期化最後の inc <BGUPDATED 直後にNMIオンにして大胆にrtiしちゃえばすこしマシになるかな
根本解決にはならないけど
>>199 もう構造的に破綻しているけど
この先スクロールゲームにするなら
今の構造のままだともっと破綻する
理想的には
バッファに命令語を用意しておき
NMI直後に命令語を読み取ってVRAMに書き込む
こういうスタイルじゃないとね
構造が悪いからデバッグの難度も上がる
小規模なうちに治さないと
シーンが増えると結局テーブルジャンプや間接ジャンプ( jmp [mem] )、こういった関数ポインタを使わないとやってられないと思う、
デカくなったswitch文のアセンブラでの効率のよい実装のことね。
cmp #n の比較地獄をしていたら、デカくなればなるほど後の方は遅くてやってられない。
シーンが続き番号でないなら比較地獄も免れないけど
>>198 >>200 LEAPER-3C
謎な奴だよなw
IC引っこ抜くよりCADデータある方が時短になるのかw
エミュでデバッグできないやつが、実機ROM焼きしてたら、ますます時間無駄にすると思うけど
>>201 姑息な手かと思ったら、少し根拠あったのね > Obscure details of OAMADDR
ファミコンは画面周りがややこしいからなぁ
自分も昔は資料が少なかったこともあって
BGを正常に表示できるようになるまでけっこうな時間を要したな
215 :
名前は開発中のものです。:2014/05/11(日) 17:55:22.28 ID:vl3SyvU7
原理的にはむしろ単純だろ
なぜそうなるかの理解がないから理不尽に受け取るだけで
>>214 ハードウェア的には単純なので、ソフトウェア側での配慮が必要
という方が適切だと思う。
惜しいなあ、技術的にはいいこと書いてるハズなのに口調で台無し
必要もなく刺々しい言葉「しとけよ」「やれ」などを使ったかと思えば
「釣りなの?」「と思う」などと子どもじみた表現が混ざる
いい歳こいて言葉を選べないって、それはもう恥ずかしい事だよ
書き込む前にきちんと自分の書いた文章、推敲したするべきだよ
自分も、他人も、傷つけないために
>>199 □ゲームについて
全体的に良い感じにまとまっていると思いました。
ただ、ミス即ゲームオーバーなので、残機制かライフ制にした方が少し長く遊べて楽しいかなと思います。
あと、果物などのアイテムを出して取ればボーナス点が入るとか。
□プログラムについて
BG書き換えについては、VBlankを深く考えていない実装になっているので、ここから立て直すのはきついと思いました。
205さんの指摘のように、PPUに転送するデータを一旦バッファに入れてVBlank中に転送するフレームワークを作って移行する方が早いかと。
VBlank中にPPUに転送できるデータ量は限界があるので、BG書き換えの実装部分はそれを配慮した作りに直さないと駄目ですね。
>>217 ゆとりメンタルなやつは2ちゃん見なきゃいいんじゃない?
お前らは延々と即値でスプライトのバッファ初期化して、
100レス前も読めずNMI使えず$2002のポーリングでループ作ってるアホと同類だろ?w
何度同じこと言われても改善しようとしないやつw
前スレの
>>700あたりから湧いてる
画面カクついてる時点で釣りかと思ったし
全部のシーンを厳密に検証する気はないから「思う」と書いただけでね
こういう書き込みも増えたね
>〜エミュで動作しました、バグってました
そりゃ画面がカクついていたり、
ソフトリセット、ハードリセット時に挙動が乱れたりするのは誰が見てもバグだよな
>>218 つくりはじめたばかりのやつが、まとまってるのか?
220 :
199:2014/05/11(日) 23:30:36.97 ID:Mnx9Nf8g
皆さんご親切に本当に有難うございます.実際にプログラミングしながら勉強することで,
たくさん吸収出来てます!!
>>212 親切にソースチェック&修正案ありがとうございます.
こういう方が即レスくれるのも,さすがこのスレという感じです.
プログラムは,何も考えずに,ここまでとりあえずという感じなので,
皆さんから頂いた意見と,わかったことを入れて,プログラムし直したいとおもいます.
>>218 PPUへのアクセスに時間がかかるし,BG描画後にVRAM周りにアクセスするとヤバイ
っていうことを知らずに実装していった結果が今のプログラムです.
ご指摘のように,バッファに用意→転送にすることと, VBlankの時間を考慮した
実装にしたいです.
ソース公開は恥ずかしかったですが,頑張って出して良かったです!
想定よりも,皆さんからレスを頂けて嬉しいです.頑張ります!
>NMI使えず$2002のポーリングでループ作ってる
初心者でこれやらかす奴はたぶん某サイトの影響受けてるだろ
あそこは全体的に説明が不足しすぎてるよ
更新も長いこと止まってるし、当てにするのはやめたほうがいい
Nesdevの日本語資料理解するだけでもだいぶ変わるし
他にも今ではNES関連資料のサイトなんていっぱいある
特にI/Oレジスタについてはサイトによって書いてあること違ったりするから
一つのサイトに拘らず色々見るといい
>>220 BG描画後にVRAMアクセスがNGではなくて、
非VBlank中にVRAMアクセスするのがNGなんです。(画面が乱れる)
短いVBlank中にVRAMを書き換えるために、バッファにデータを溜め込んでおいて、
VBlank(NMI)割り込みに入ったらすぐにバッファのデータを転送しろってことです。
あと、もちろんですが、スプライトのDMA転送もVBlank中に行わなければなりません。
>>199 みたいな、打たれてもへこたれないヤツは2ch向きだね。ガンバレ!
>>217 の意見には同意だけど、そういうヤツもいるのが2chの味なのかなぁ
自分に対して
>>213 みたいな反応されたときは、頭来たけどなw
修行が足りない
225 :
名前は開発中のものです。:2014/05/12(月) 10:39:31.18 ID:cuBtqyJP
当時のRAMはデュアルポートではないから読んでいる最中に書き込みはできない
単純な構造だよね?
で、画面を描画している最中は(BGもOBJも)データをVRAMから読み出している真っ最中だから
そこで無理やりデータを書き込むと、今まで画面描画時に参照していたVRAMのアドレスが置き換えられてしまうため
元の描画処理を継続することができなくなり画面の表示が破綻してしまう
表示周りをいじる際VBlank期間中にアクセスしなければならないのはこういう理由
キラキラスターナイトのソースを読んでみたい。
遊び方にパテントはないわけでして
>>226 絵は卓越しているけど
プログラムは大して高度なことはやってないでしょ
229 :
名前は開発中のものです。:2014/05/13(火) 19:16:50.69 ID:srI4FW40
RIKIがパソファミの安藤に媚び売っててワロタ
ロジックボム組み込んだりする基地外なのを知らんのか近頃のもんは
パソファミ作者はメールでの対応が最悪レベル
自分の非を認めないどころか人を犯罪者扱いしたりするキ○○イ
おまけにホンコンのソース盗用疑惑もあるしな ホントどうしようもねぇよ
素人にはこれしかないから売れるんだろうけど それが余計にたち悪いね
>>229 >>ロジックボム
そういう噂を聞いたから
その後にちょっとだけ調べたけど
プリンタポートでないI/Oポートに向けて
x86のout命令が発せられてたような、ないような
windows98なら簡単に発動するのかな
より堅牢なOSであるwindows2000にしてたから
効果なしっぽかったけど
近頃のもんが吸出しやROM焼き実機動作させてるのをよく見かけるようになったけど
ソソハメさんの名前がなぜあまり挙がらないか理由をよく認識しておいた方がいい>もっと近頃のもんたちへ
気持ち悪いのが涌いてきたな
すみません、吸出しというのは英語では何というのでしょうか?スペルを教えて下さい
dump
>>140 宝石のラスタスクロール凄いね。あと、スプライト吹雪は気持ちいいっす
このスレッドで新しい演出ジャンルに出会えたのは嬉しいね
>>199 土管避けるの難しいけど楽しいね
BGの判定は凄いと思う
どんどん成長してゆくのが楽しみ
236 :
140:2014/05/28(水) 20:00:45.64 ID:pcO3WytB
ジョイパッドの読み取りルーチンをリファクタリングしたら結構コンパクトになった。
6502のアセンブラは奥深い。
Joypad_Update:
lda #$01
sta $4016
lsr a ; same as lda $00 & sec
sta $4016
ror a ; same as lda $80 & clc
sta <JOYPAD
sta <JOYPAD+1
.1
lda $4016
and #$03
; clc
sbc #0
ror <JOYPAD
lda $4017
and #$03
; clc
sbc #0
ror <JOYPAD+1
bcc .1
rts
>>235 ありがとうございます。
237 :
140:2014/05/28(水) 20:07:39.22 ID:pcO3WytB
あ、
sta <JOYPAD
ror a ; same as lda $80 & clc
sta <JOYPAD+1
として、JOYPADには$00入れないと不味いね。
238 :
名前は開発中のものです。:2014/05/29(木) 00:32:25.75 ID:Ix+yqrZv
>>237 (clcと)sbc #0をcmp #1にすればsta <JOYPADは不要
239 :
140:2014/05/29(木) 01:07:17.19 ID:Lo1UVUXb
>>238 ああ、確かに。さらに小さくなりました。
ありがとうございます。
すげー
商用レベルのできだと思う。
気になるのは、連鎖がどんどん発生しやすすぎではないのかなと
>>242 連鎖しやすいのは、6方向に対して6種類の駒しかないので
仕様上、確率的につながり易いのが原因です。
駒の種類を増やせれば良いのですが、パレットが足りないw
最初は3個つながったらで実装していたのですが、
あまりにも連鎖が続くので4個にしています。
それでも消せなくなることが無く延々と続けられるので、時間制に逃げました。
作って思ったのは、ぷよぷよの仕様は絶妙なバランスなんだなぁと。
追加された音楽がスタートで変更できるのは、個人的にうれしいですね!
後、セレクトボタンはどんな効果があるのでしょうか?(効果音だけ?)
245 :
131:2014/06/06(金) 19:17:42.85 ID:5n3Zcu9W
131です。あの後、
いろいろ注意深く書き込みを見ていたのですが
人に意見されるってすごく大事だと思いました。
ちなみに、cc65でオセロとShootingGameSampleを作ったのと、
nesasmでブロック崩しを作ったのも
自分です。
今までは自分はチキンで人に意見言われるだけで、
むっつりと黙っていましたが、これからは
もっと能動的に動きたいです。
ファミコンのブロック崩しをソース付きで晒すので
汚いし、ロジック的におかしいところばかりですが、
見てやってください。
僕はカービィやマリオ、くにおくんのファミコン少年の一人の
つもりなのでファミコンは、ホント好きですし、このスレッド
を最初から見ています
http://www1.axfc.net/u/3252687.zip
246 :
131:2014/06/06(金) 21:24:59.35 ID:5n3Zcu9W
こんな事書き込みたくて書き込むわけじゃないですけど、
ファミコンの正常動作って何ですか?
どうすれば正常動作っていうんですか?
いつまにか、このスレッドは本物のROMと同じように動かす為に努力してる
人たちを称え、褒めてきました。
正常動作って定義がどこにあるかはファミコンで動作すれば分かるんじゃないですかね。
それ以外を異常動作というなら、エミュレータはほぼ全て異常動作ですよ。
>>243 始まった瞬間操作する前に勝手に連鎖するってのだけでも
どうにかならないかな
初期配置のみパターンで持つとか
>>246 そうですよエミュは異常動作ですよ
実機で動かないのを言い訳してるだけにしか聞こえませんね
249 :
131:2014/06/07(土) 03:42:43.36 ID:hwRmu2MG
本当に実機で試したのか知りたいですが、
自分の言いたい事は実機で動かない事の言い訳じゃなくて、
ファミコンのプログラミングが1つの古代技術でそれが通用するのはあくまでファミコンのみ
という事なんですが**が素晴らしいとか**の技術は優れているとかのある意味
マニアックな話の流れになっているというか、
ぶっちゃけ、自分の作ったファミコンゲームは技術的には全然優れてないので、
優れた技術を持った人たちに憧れたみたいなところがあります。
250 :
131:2014/06/07(土) 03:52:27.88 ID:hwRmu2MG
**には、ラスタースクロールやスプライトダブラー、
FFの高速スクロール、BGの高速書き換え、パレットアニメーション
を入れてください。
251 :
131:2014/06/07(土) 09:33:01.78 ID:hwRmu2MG
cc65の作ったやつは(REVERSI,SHOOTING GAME SAMPLE)動く自信がないですが、
nesasmで作ったやつも(IWA WO OTOSE,BLOCK)動かないんですかね。
>>244 スタートとセレクトは、サウンド系の開発用にテストできるように追加していた機能で
今回スタートを少し改良して選曲出来るようにしました。
セレクトは、効果音を作る時以外は意味を成さないので、次の完成版では削除する予定です。
>>247 初期配置をパターンで持つのは、バリエーションを作るのが大変なので、
採択したくないですね。
代わりに内部で連鎖が止まるまで処理を繰り返して、
そこからゲーム開始するよう実装してみます。
>>249 私も最終目標は実機で動作させてみることなのですが、
そこまでの道が遠い状態です。
一応、動作させるための目処は立っていて、材料とかもそろえたのですが
ROMライターから自作せねばならないため、いつになるかわかりません。
実機で動作したのを確認して初めて、ファミコンのプログラムを作ったと、
胸張って言えるかと個人的には思っています。
255 :
131:2014/06/07(土) 14:24:42.36 ID:HAL7UNXv
>>254 ネットカフェから書き込みです。
そうですね。ファミコンの実機で動いたら感動しますし、
実機で動かしたいです。
ファミコンの実機は持っているのですが、ROMライターや
EEPROM、同軸ケーブル、ビデオデッキ、自分用のテレビ
256 :
131:2014/06/07(土) 14:27:25.94 ID:HAL7UNXv
など問題が山積しているので、現段階では難しいです。
>>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座標だけでも表引きにすると処理が結構簡素化します)
259 :
131:2014/06/07(土) 17:02:04.46 ID:hwRmu2MG
260 :
131:2014/06/07(土) 17:29:43.93 ID:hwRmu2MG
>>257-258 VBlankとゲーム本体処理を分離ということはNMIを使うって事ですね。他の方も言ってましたが
スプライトと実際の座標を別に持つというのは、以前やったことがあるのですが、クソ汚いソースになってしまいましたが、少しだけわかってきた気がします。こんな感じですかね。
>>261に書きます。
VBlankのタイミングと書き換えは理解しずらいのですが、ファミコンのPPUの仕様なんですかね。
Pad_Checkは、他の方が作られたソースなので、あえて外しました。ROMに0を書き込んだ意図は、恐らくないです。気づかないまま放置してしまいました。
ブロックの配置位置が有限個ならテーブル化できるんですか?今度やってみます。
アドバイスありがとうございます!!ホント助かりました。知らなかった事や理解出来なかった事が分かってよかったです。
261 :
131:2014/06/07(土) 17:30:36.51 ID:hwRmu2MG
.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
262 :
131:2014/06/07(土) 17:32:41.18 ID:hwRmu2MG
間違えました。
.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翻訳があれば十分。
海外サイトの情報も何も全部理解する必要はないし、図、表、技術用語さえわかれば殆ど問題ない。
それに今では日本語資料も充実していると思うし、あえてギコ猫のところだけを参考にすることもないだろう。
初心者のうちは他人が作ったソースを見てよく理解し、そこからいろいろ学ぶのもいいだろう。
公開されているソースによっては丁寧に説明が細かく書いてあるものもある。
264 :
131:2014/06/07(土) 18:21:24.08 ID:hwRmu2MG
>>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
270 :
131:2014/06/08(日) 06:24:49.26 ID:RIyNgnKh
>>266 VBlankに関しては、「ファミコンの驚くべき発想力」という本の78ページ前後に
記述がありました。が、
>>266さんの説明の方がより詳しく説明しているように
見えます。
HBlank期間のHはホライゾン?(水平)の略でしょうね。VBlankのVは、バーチカル(垂直)
の略な気がします。
NTSCとPALの違いも知らなかったのですが、日本は、NTSCだったんですね。
VBlank待ちの直後にビデオメモリの書き換えをするのはそういう理由が
あったんですか。
非VBlank期間中にCPUがVRAMにアクセスできる方法、これは知っていましたが、
欠点は知りませんでした。
Horizontal Blankingですかね
かつてはPPUの特定のバージョンのみで発生する不具合なんてのもありました
スクロールレジスタがある値の時、VRAMアドレスレジスタを触ると背景色が化けるというもの・・
272 :
131:2014/06/08(日) 10:50:38.68 ID:RIyNgnKh
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フレーム程度かな
279 :
131:2014/06/09(月) 18:51:10.28 ID:Sx48Gggw
>>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
これもありがとうございます。
つづく
280 :
131:2014/06/09(月) 18:53:26.51 ID:Sx48Gggw
>>・既に指摘があるように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”という言葉を知っていても言葉を忘れていたのと、使い方を知らないからです。
281 :
131:2014/06/09(月) 18:55:00.34 ID:Sx48Gggw
>>236さんのソースではなく、ネット上に公開されていたソースを使いました。
282 :
131:2014/06/09(月) 18:57:30.62 ID:Sx48Gggw
変数に
>>・ 誤 lda APU_REG1_FRQCHG_ON
>>正 lda #APU_REG1_FRQCHG_ON
の違いって何ですか?
実機で検証してくれたことに対して
>本当に実機で試したのか知りたいですが
って何気に失礼だよなこいつ
284 :
266:2014/06/09(月) 20:51:16.15 ID:oKltYKig
>>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 :
131:2014/06/09(月) 21:16:45.44 ID:Sx48Gggw
言い訳になっちゃうかわかりませんが、できたら明日の朝に書き込みます。
ホント自分は基地外なのと、頭が痛いし熱いのでこのままほおっておくと
風邪をこじらすので、すみませんが、失礼します。
リアルが充実してる人たちがうらやましいです。
286 :
266:2014/06/09(月) 21:30:37.71 ID:oKltYKig
>>285 別に急がなくてもいいよ。その代わり自分でちゃんと考えること。
体お大事に。
頭の悪い高校生なんだから察してやれよ
こいつ高校の名前を自分から暴露するような奴だぞ
しかしまぁ基地外って自覚あるなら5年ぐらいROMってればいいのに
色々と知識が欠けすぎててこのスレで質問できるレベルにすら至ってないわ
自分の理解不足を棚に上げて正常動作の定義がおかしいなどと言い張るのは
自分を肯定するために社会を逆恨みする典型的秋葉原通り魔みたいな思考回路だよな
近所でネコの惨殺死体がなければいいけど
多くのエミュレータの再現目標は「市販ゲームが動作すること」であって
不完全なプログラムが「実機と同じように動作しない」というレベルでの再現には至っていません
ファミコン程度の規模であっても完全再現するエミュレータはいまだに存在していません
たとえばファミコンでは電源投入時にRAMの内容が不定であり
すべての市販ソフトでは確実に動作させるために必ずRAMを上書き消去するなど、必ずそれを前提とした実装がされています
しかしエミュレータの中には通電直後のRAMの初期値が&H00に設定されているものがあり
初期値が何であれRAM内容を消去するように実装されている市販ゲームは問題なく動作しますが
RAMの初期値が&H00になっているものであるとして組まれた不完全なプログラムだと
そのエミュレータでは動作するが実機では意図した動作をしないという問題に陥ってしまいます
同様ににVBlank期間が実機より長めに設定されているエミュレータも存在しています
VBlank期間が長いことで市販ゲームを動作させることに影響はありませんが
そのエミュレータ固有のVBlank期間を基準として作成された自作プログラムは
実機上だとプログラマの意図通りの動作をしないことになります
このようにエミュレータ上のほぼすべての挙動において、実機ほどシビアではなく動作してしまう方向に緩く設計・再現されているため
実機の挙動を意識せずにエミュレータを基準として作成された自作プログラムの多くは
結果として実機で動かないものになってしまいます
マッパーが電源投入時に選択するバンクですが
通常、実機ではハードワイヤードされている最終バンク以外の選択可能バンクは第1バンクが選択されるケースがほとんどですが
多くのエミュレータはなぜか先頭から順番通り昇順に選択されます
市販プログラムは必ず初期バンクを設定するように実装されているため問題なく動作しますが
バンクの並びをアテにした不完全なプログラムはエミュレータでは動くが実機では動かないというケースが起こります
>>240のプログラムはCHRバンクの初期設定がされていないので
CHRバンクが未設定でも順並びに選択されるようなエミュレータでは問題なく動作しているように見えますが
実機だとスプライト側のバンクがすべてバンク0になっているので、宝石落下時のスプライトがBG用のCHRで表示されてしまっています
初期化処理って重要なんだなぁ
292 :
131:2014/06/10(火) 07:44:01.93 ID:rVY6XcCX
>>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年もこのスレ見ててそのレベル・・・そして技術資料すら理解できない英語力・・・
最早かわいそう過ぎて同情するわ・・・
295 :
131:2014/06/10(火) 12:27:03.05 ID:21YAZMo1
他のパソコンから書き込みです。
なんというか、僕が素直じゃなくてしかも怒りっぽくて
先人の知恵を学ばないという姿勢が悪いと思っています。
低能という言葉がありますが、まさに自分がそうだと思っていますよ。
自他ともに認める低能です。ファミコンのCPUより遅い動作周波数
なので。
>>246は撤回します。まことにすみませんでした。
ごめんなさい
296 :
131:2014/06/10(火) 18:17:23.08 ID:rVY6XcCX
>>284 2)
VBlankに入った時に必ずNMIの割り込みが訪れるからでしょうか
3)
本来ならばメインループにNMIを使うべきだからでしょうか
VBlankにポーリング?という言葉を初めて知りました。
>>245 ところで
NES Assembler (v3.21, 2005/04/09, Denki Release)
これどこで手に入れたの?
かなりレアなバージョンぽくて見つからない。
RAMの初期化、スプライトメモリの初期化
以前誰かに指導してるでしょ、あちこちの他人ソースでも示されているし
スプライトONにしているデモプログラムでスプライトメモリ初期化してないのは論外なんだよ
だからG-NESのスプライトメモリビュワー使えって
未初期化メモリにアクセスしたら他の言語のコンパイラは警告出すでしょ
逆にファミコンほどの原始的なハードで、なぜ0フィルされると思った?
0フィル傾向が強いエミュだってハードリセット、ソフトリセットで挙動違うわけだしね
HuC v3.21付属のやつじゃねえかな
見つけた
1)Vblankは厳密には割り込みそのものではない。語源を考えればわかる。
あとマスク不可能な割り込みでは説明不足。
2)ファミコンにおいてNMIは必ず訪れるものか。
もし必ず訪れるのならあんたが今まで書いてきたプログラムはどうなる。
$0000から命令を実行しまくる羽目になってるだろ。
3)それならばなぜNMIを使うべきか。
全体的に不正解および説明不足そして調査不足、理解や考えも不足。
わからない言葉があったらまず目の前のPCで調べろ。
あと自虐がまるでへそを曲げた子供のようでみっともない。自虐は反省とは違う。
しばらくROMって頭冷やすことをおすすめする。
301 :
131:2014/06/11(水) 04:31:31.45 ID:FDPL1IKA
分かりました。しばらくROMることにします。
ただ、僕は本当に低能ですよ。何しろ、IQが69なんで
(test the nation)
言葉選べない奴ってみっともないなぁ
上級者気取ってふんぞり返って偉そうに他人に説教しとるが相変わらずガキ丸出し
これが一人だけやってるんだから目立つわな
いいかげんさあ、そのチンピラみたいな恥ずかしい態度で人に接するのはおよしなさいよ
まあ、こういう苦言を呈してあげても
前みたいに自分の口汚さを正当化するための言い訳しか言わないで
何が悪いのか理解出来ないまま同じ事を繰り返し続けるんだろうけど
他人に反省促す前に、自分がまず反省して態度改めなよ
多重人格らしき
”リバーシ君” が湧いてから同時期湧いて来た子たち
”YY-CHRとNESASMが使いづらい君”
”NESASMが難しいからC言語で組もうよ君”
”iNESヘッダや.incbinのことはわからないけど、nesdevの仕様書すべて読んできます君”
能書き”ダブラ君”
三日坊主の”まとめwiki君”
”DPCMの仕様教えて君”
”www.dotup.org大好き君”
スタックぶちこわしてても ”PPU制御レジスタのタイミング等も問題無いはずなのに。 君”
”デバッガ使えません君”
こんな初歩の初歩教えるのが上級者扱いなのか
だから自演て言われてるのに
ゴミみたいな不良動作のプログラムのアップロードに対し
わずか数時間で
”fceuで陽性かくにん よかった”
とレスが付くのも特徴
追い込まれると
〜とは別人だけど、と枕詞をつけて自己弁護
305 :
266:2014/06/12(木) 01:31:23.63 ID:VinxFlKC
>>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に書き込む処理を行う。
プログラムを書く際に、他人のソースを参照するのは良いが、コピペは絶対行わないこと。
必ず目で見て手打ちすること。
書いたソースは、何度も読み直して、処理を説明できるぐらいまで理解すること。
プログラムが出来たら内容をレビューしたいので、批判にめげずに公開して欲しいと思う。
なんでこいつが仕切っとるの?
309 :
131:2014/06/12(木) 16:17:30.84 ID:kfJUEFGs
書き込みたい気持ちはありますが、大分経って事態が鎮静化
してから書き込みたいです。あと、少なくとも今から
100レス程度は様子を見ながら、今から同時にお題を解いてみます。
というのも技術的な指導ならゲーム開発技術板のスレッドなので分かります。
しかし、自分の未熟な部分があるのは自分でも分かるのですが、
明らかに何度も自分の人格を否定していてスレ違いになってるのもあります。
310 :
131:2014/06/12(木) 16:19:26.08 ID:kfJUEFGs
それがどうした?悪いのはお前だろと言われればそうなのですが
これが何度も続くようなら、明らかにいじめとしか思えないのです。
いじめと思うのは間違っていると思うのなら、どうして簡単に何度も
いろんな欠点や粗を探してこうも傷つけたがるのですか?
あと、自演と言っている人へ、
自演をしているように見えるのは、明らかにおかしいですね。
IPアドレスを2chの運営元に頼んでもらって調べれば分かる
とは思います。IPアドレスが分かるという事は、書き込んだ場所も
特定されます。
ファミコンのプログラムを公開する書き込んでから家から出かけて
帰ってきてから同じパソコンで書き込んだ事くらい見抜けると思うのですが。
それにしてもやけに静岡県民が多いな
自演に間違いないな不自然すぎるわ
あと100レスと言わず一生ROMってればいいのに
そうすりゃスレも荒れずに済む
313 :
131:2014/06/12(木) 22:17:28.55 ID:kfJUEFGs
まってください。静岡県民が多いのは、俺が周囲から基地外呼ばわり
されてるのと、症状のせいだと思いますよ。
それと、自演と決めつるのはまだ早いです。なぜなら、
専門用語を知らない人間が自分を弁護できると思いますか?
そして、恐らくその症状のせいで、うざったく思うから
このスレで叩かれているのだと思います
これで最後にします。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 ディスクシステムは、ツインファミコンもそうですが、ベルトの劣化もありますし、ヘッドも劣化するでしょう。
最近FDSLOADRrの上位版のようなfdsloadersaverを作った方がいるよ
>>325 アドバイスありがとうございます。今思いついたんですが、ディスクのRAMアダプターを改造してMicroSDカードに入っているディスクのイメージを転送できるに出来たらいいのになあ
機械語の知識(開発ができるレベル)と、
論理回路の知識(設計ができるレベル)に加えて、
電子工作を行えるスキルが必要
あと、英語力(データシートとか、ほとんど英語)。
131氏は何が嫌われてるか分かってないんだろうな
何か指摘されたら「あ、はい俺が悪いですさて、」くらいの勢いで
全く態度を変えず話を続けるのがどれだけ人を無視した行為か
理解できないんだろうからもう書き込むなって言われてるんだよ
なんだそりゃ
ヤクザの因縁レベルだな
キチガイに粘着されて可哀想
Vblank(NMI)発生待ちじゃなくてVblank(NMI)終了待ちの書き方がわからない。
$2002読めばVblank中でも即座にスキャンラインの頭に戻るのかな?
普通は終了待ちなんてしないと思うが・・・
あるとすればフレームIRQをVblank終了間際に起こすようにするとか、かな?
試していないからできるかどうかわからないけど
あのバカはまだデバッガ扱えないんだな
他人のソースを読む気もない
何だかんだ、がんばっているんだし応援しようと思う
完成を楽しみに待っています〜
夜中2時に書き込む
出来る方の別人格さんおつ
すげー(2回目)
乙
335氏
ソース勉強させていただきます
339 :
131:2014/07/02(水) 17:15:28.00 ID:b6UJAuU+
ここを見てても本当に良いのだろうか?という気持ちと
ヤジでいまだに言ってくる人がいて、不快感しか湧かない
ので、ここはまず、書き込みも見ることも辞める事にします。
なのでいさぎよく、このスレから出ていく事にします。
ちなみに、「逃げる理由が出来て良かったな」とか書き込みそうなんで
言っておきますが、言う人は何とでも言うので仕方ないと思います。
最後まで不快感をお互いに感じあってしまい、すみませんでした。
前スレで戦力外通告されてなぜ残った
英語読む気ないのはこの板的にも戦力外
>>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ファイルは自作カートリッジに焼く時もそのまま使えるんですか?
348 :
sage:2014/10/09(木) 21:50:10.76 ID:hFc1Ndfq
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をコメントアウトして動くようになりました。
sage間違えたorz
>>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つのバイナリを用意する必要があるようです。
だれかギコ猫より分かりやすいサイト作って
もしくは解説コメント付きのソース
ギコ猫があるだけ恵まれた環境。1990年代のネットはファミコンの
内部資料は英語しか無かったからね。だから普通に挫折した。
バッ活とファミリーベーシック
Experi9(
>>343)の改良版をアップしました。
http://homepage3.nifty.com/~kyoske/nes/Experi10.zip 結局のところ、ファミコン本体の2KBのWRAMだけでは
性能面を向上させつつ、やりくりするのは難しいとわかったので
MMC3の拡張WRAMを解禁、弾丸のワーク領域をそちらに移しました。
本体のWRAMに余裕が出来たので、マップの仮想バッファを
倍に増加して、既存の処理を最適化して負荷を下げました。
色々なテーブルを乗せている関係で、共通ルーチン用のプログラム領域の
サイズが足りないか不安になってきたのですが、拡張WRAMの空き領域に
プログラムを転送すれば良い事に気づき、さらにRAMに転送するんだから
自己書き換えルーチンにできるな、ということで、自己書き換えで性能が
上がりそうなルーチンを試作してみました。
あと、当たり判定実装したり、弾丸の移動処理作ったり、BGM鳴らしてみたりで
処理落ちしないのを確認できたので、性能面で目処が立ったかなというところです。
試作した自己書き換えルーチンその1
ClearExtWorkMemory:
ldy #$60
lda #$00
tax
.1:
sty SMCLabel(.2+2)
.2:
sta $6000,x
inx
bne .2
iny
cpy #$68
bne .1
rts
SMCLabelは、転送先のアドレスに変換するユーザ関数です。
sta $6000,xの$60を書き換えています。
Indirect Indexモード 6clkに対して、Absolute Indexモード 4clkで
((6clk-4clk)*256-4clk)*8 = 4064clkの節約。
試作した自己書き換えルーチンその2
Shot_Alloc:
ldx SMCLabel(.2+1)
.1:
lda SH_X,x
bmi .9
lda Round96+1,x
tax
.2:
cpx #0
bne .1
.db $24 ; bit <$b8 (set v-flag)
.9:
clv
lda Round96+1,x
sta SMCLabel(.2+1)
rts
cpx #0の#0の部分を書き換え。
弾丸の空きを検索するルーチンで、次回の検索時は空きを検出した
次の場所から検索を始める処理となっています。
Round96は、0,1,2,...94,95,0,1,..と定義されているテーブルで
lda Round96+1,x で (x+1)%96 の計算をしています。
ゼロページの$b8には、$6cが格納されており、bit <$b8 でv-flagが設定されます。
空きがない場合にv-flagが設定されてリターンします。
ファミコンのプログラム領域はROMだし、メモリも余裕無いから、
自己書き換えルーチンには縁が無いと思っていたのですが、
拡張WRAM使うとなると、有効な手段であるなと。
ただ、よく考えないと自己書き換えやっても効果を得られないので
どのようなパターンが有効か思考する必要ありだなというところです。
>>360 おお、スプライトも見易くなりましたね。
実機(MMC3B)でExperi10.nes焼いて動かしてみましたが、BGが結構
崩れています。
Experi10_irq114.nesですとBGが崩れはしませんが東方の文字の中心あたり
からチラチラしています。
また、東方を知らないのでわかりませんが会話表示とスクロールをするとたまに
BGが崩れるようです。
(バンク切り替えに失敗したような感じで別の絵が出てました)
参考になれば
>>364 実機での確認ありがとうございます。
会話画面表示時のBG崩れは、IRQのCHR-BANKの切り替えと
メイン処理のPRG-BANKの切り替えの衝突です。
PRG-BANKの切り替えは弾丸の移動量や角度算出のテーブル引きで使用しており、
会話画面では行わなくなるので、現在そのままにしています。
ファイル実行したけど会話画面っていったい何のことなんだ
セレクトボタンを押しながら上下でバックグラウンドのスクロール量調整
同じく左右で会話画面、ボスHPゲージ消去などができる
今月号(先月号から?)のゲーラボに、ファミコンソフト開発って記事が載ってた
初歩的な奴だったから、今月号からかも。立ち読みしかしてないけど
ゲーラボのファミコン開発は1回のみなのかな
DSみたいに連載して欲しいなーと思う
好奇心的な需要が有るんではないかと思ったり
>>360 弾幕が素晴らしいです。ファミコンでは史上初?なのではないでしょうか
BGのIRQスクロールも面白いです。
>>367 参考になりました。ありがとうございます。
このスレに常駐して間違いを指摘してる人は何者なのかね?
元ハドソンの中○さん?
もしかしてカル○ャーブ○ーンのあの社長か?
おい、具体名だすんじゃねえ
373 :
名前は開発中のものです。:2014/12/27(土) 07:48:51.33 ID:wLqAfx70
このスレではみなさんからのプログラムの投稿をお待ちしています
CじゃなくてFORTHだったら需要あったんだがなぁ
俺の
>>376 プログラム言語のこと
似たものにMindがある