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

339: 131 [sage] 2014/07/02(水) 17:15:28.00 ID:b6UJAuU+(1) AAS
ここを見てても本当に良いのだろうか?という気持ちと
ヤジでいまだに言ってくる人がいて、不快感しか湧かない
ので、ここはまず、書き込みも見ることも辞める事にします。

なのでいさぎよく、このスレから出ていく事にします。

ちなみに、「逃げる理由が出来て良かったな」とか書き込みそうなんで
言っておきますが、言う人は何とでも言うので仕方ないと思います。

最後まで不快感をお互いに感じあってしまい、すみませんでした。
340
(1): 名前は開発中のものです。 [sage] 2014/07/02(水) 21:15:54.55 ID:ccGvVyCV(1) AAS
前スレで戦力外通告されてなぜ残った
英語読む気ないのはこの板的にも戦力外
341: 名前は開発中のものです。 [sage] 2014/07/03(木) 22:16:55.66 ID:hPES0Si7(1) AAS
>>340
気に入らなきゃほっときなよ
小言を言うとまたグダグダと返答されるよ
342: 名前は開発中のものです。 [sage] 2014/07/11(金) 02:02:23.66 ID:63/tpOMg(1) AAS
他スレみたいにテンプレに
初心者向けに何か書いておいたほうがいいかもね
343
(1): 名前は開発中のものです。 [sage] 2014/10/05(日) 12:06:25.72 ID:TCLHVT3o(1) AAS
東方Projectみたいな画面は作れないか?との興味から作りはじめたのですが、弾丸の表示時点で、CPUの処理能力不足により先が見えてしまいました。

外部リンク[zip]:homepage3.nifty.com

Experi9.nes .. 160発表示版
Experi9x.nes .. 負荷可視化板
Experi8_noshot.nes .. 弾丸非表示版

Select+下 でスクロール開始、Select+左右 で画面モード切替です。

弾丸の最大数を96に落として、仕切り直す予定。

自キャラ、敵キャラ、弾丸以外は、BGで描画しています。
枠内のスクロールは、ハードウェアスクロールとソフトウェアスクロールの併用です。
16x8の範囲でパレット指定や会話ウィンドウの表示に、縦方向のラスタスクロールを駆使しています。
344
(1): 名前は開発中のものです。 [sage] 2014/10/06(月) 04:59:32.10 ID:6+tpiQ9J(1) AAS
ジェムの人キター

消えてる時間が結構長いのでかなりスプライトが見難いですねぇ

BGは相変わらずえらいことになってますが、負荷軽減でパレットはあきらめて
MMC5の画面分割機能の使用を考えてみても良いかも
345
(1): 名前は開発中のものです。 [sage] 2014/10/06(月) 23:47:50.82 ID:5bZUXl8p(1) AAS
>>344
160発を56個のスプライトで表示しているので、
大体3フレームに1回の表示でちらつきが目立ちます。

次の版は、96発にスペックを落とすので、
2フレームに1回の表示になるので多少は改善されるはず。

MMC5は魅力的なのですが、最終目標が実機での動作なので
勿体無くないMMC3で頑張ろうと思っています。
あと、負荷は弾丸の処理が半分以上占めているので
MMC5を使っても状況はあまり変わらないかと思います。

すでに96発MAXに書き換えて、弾丸1つ辺り5byteの領域から
8byteに増えて、Tile番号と属性値が保持できるようになったので
処理が軽くなりました。
弾丸の角度の変化が無ければ、Bombの下辺りまでの
処理時間で済んでいます。
346: 名前は開発中のものです。 [sage] 2014/10/07(火) 04:35:07.91 ID:3yj7hFfS(1) AAS
>>345
1/2フレーム表示ならグラIIのミサイルなどで使ってましたね
欲を言えばですが、弾数が少ないときは1/1フレームで表示出来たら
いいかも

試しに割り込み無しにしたところ18ライン分くらい処理が減ってました
MMC5自体は光栄のゲームで結構出回ってるので入手は簡単かと
思いますが、今更変えるのもあれですね…

期待してますので頑張ってください
347
(1): 名前は開発中のものです。 [sage] 2014/10/09(木) 21:46:13.35 ID:44sWDsnn(1/2) AAS
NESASMでアセンブルしたNESファイルは自作カートリッジに焼く時もそのまま使えるんですか?
348
(1): sage [] 2014/10/09(木) 21:50:10.76 ID:hFc1Ndfq(1/3) AAS
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をコメントアウトして動くようになりました。
349: 名前は開発中のものです。 [sage] 2014/10/09(木) 21:51:03.03 ID:hFc1Ndfq(2/3) AAS
sage間違えたorz
350
(1): 名前は開発中のものです。 [sage] 2014/10/09(木) 21:56:48.11 ID:hFc1Ndfq(3/3) AAS
>>347
kazzo+anagoのような環境だと直接NESファイルを使って書けますね。
ROMライタで直接書き込む場合だとPRGとCHRへの分割が必要かと。
351: 名前は開発中のものです。 [sage] 2014/10/09(木) 22:09:17.01 ID:44sWDsnn(2/2) AAS
>>350
ありがとうございますNESplitという分割ツールがありました。
352
(2): 名前は開発中のものです。 [sage] 2014/10/09(木) 23:56:08.22 ID:EgCI09Ne(1) AAS
>>348
実機での動作確認ありがとうございます。

>タイトル画面の乱れ
割り込みが入ってから110clk目に最後の$2006を書いていたのですが、
nop3つ追加ということで、116clk目が正解ということですね。
今のやつも直さないと。

>あそびかたを選ぶと止まる
VBlank中にIRQ_FNCを更新する仕組みを追加します。
353
(1): 名前は開発中のものです。 [sage] 2014/10/10(金) 00:27:59.23 ID:giiUNY1I(1/2) AAS
>>352
MMC3だとラスタの260ppu_clk辺りで割込み発生みたいなので、
そこから次ラスタの表示期間終了の256ppu_clkまでの、
(341-260)+256=337ppu_clk = 112.3cpu_clk
が必要な待ち時間だと思います。
sta $2006を確実にHBLANKに入れるために+4clkしましたが、
書込みが最後の1clkに行われるとすれば、数クロック削れるかもしれません。
354
(1): 名前は開発中のものです。 [sage] 2014/10/10(金) 21:22:02.81 ID:giiUNY1I(2/2) AAS
>>352
追実験して、nopは一つでも乱れは消えました。
割込み発生から最後のsta $2006完了までが112clkになるので、
ちょっとぎりぎりな感じはしますが。
355: 名前は開発中のものです。 [sage] 2014/10/11(土) 11:53:25.77 ID:JCcDlcCt(1) AAS
>>353
外部リンク:wiki.nesdev.com
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が起きる位置とライン数が変わるようだ。
356: 名前は開発中のものです。 [sage] 2014/10/13(月) 07:14:58.66 ID:khCfiiiQ(1) AAS
>>354
追試ありがとうございます。
clkを伸ばした場合、エミュレータでどうなるか確認したのですが
こちらでは1clk伸ばしただけでも乱れが発生しました。
実機向けとエミュレータ向けの2つのバイナリを用意する必要があるようです。
357: 名前は開発中のものです。 [sage] 2014/10/20(月) 02:34:56.29 ID:VhFQD/az(1) AAS
だれかギコ猫より分かりやすいサイト作って
もしくは解説コメント付きのソース
358: 名前は開発中のものです。 [sage] 2014/10/27(月) 22:58:49.97 ID:WLPSmV4W(1) AAS
ギコ猫があるだけ恵まれた環境。1990年代のネットはファミコンの
内部資料は英語しか無かったからね。だから普通に挫折した。
359: 名前は開発中のものです。 [sage] 2014/10/28(火) 05:34:41.72 ID:40z/j/Ad(1) AAS
バッ活とファミリーベーシック
360
(2): 名前は開発中のものです。 [sage] 2014/11/05(水) 02:06:14.46 ID:8FC6s1LF(1/5) AAS
Experi9(>>343)の改良版をアップしました。

外部リンク[zip]:homepage3.nifty.com

結局のところ、ファミコン本体の2KBのWRAMだけでは
性能面を向上させつつ、やりくりするのは難しいとわかったので
MMC3の拡張WRAMを解禁、弾丸のワーク領域をそちらに移しました。

本体のWRAMに余裕が出来たので、マップの仮想バッファを
倍に増加して、既存の処理を最適化して負荷を下げました。

色々なテーブルを乗せている関係で、共通ルーチン用のプログラム領域の
サイズが足りないか不安になってきたのですが、拡張WRAMの空き領域に
プログラムを転送すれば良い事に気づき、さらにRAMに転送するんだから
自己書き換えルーチンにできるな、ということで、自己書き換えで性能が
上がりそうなルーチンを試作してみました。

あと、当たり判定実装したり、弾丸の移動処理作ったり、BGM鳴らしてみたりで
処理落ちしないのを確認できたので、性能面で目処が立ったかなというところです。
361: 名前は開発中のものです。 [sage] 2014/11/05(水) 02:20:57.06 ID:8FC6s1LF(2/5) AAS
試作した自己書き換えルーチンその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の節約。
362: 名前は開発中のものです。 [sage] 2014/11/05(水) 02:32:50.39 ID:8FC6s1LF(3/5) AAS
試作した自己書き換えルーチンその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が設定されてリターンします。
363: 名前は開発中のものです。 [sage] 2014/11/05(水) 02:43:06.58 ID:8FC6s1LF(4/5) AAS
ファミコンのプログラム領域はROMだし、メモリも余裕無いから、
自己書き換えルーチンには縁が無いと思っていたのですが、
拡張WRAM使うとなると、有効な手段であるなと。

ただ、よく考えないと自己書き換えやっても効果を得られないので
どのようなパターンが有効か思考する必要ありだなというところです。
1-
あと 204 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.018s