FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

実家登場シーンを作った。

ついにDr.ワイリーがライトの研究所に攻め込む!!というところ?
(ところで、原作だとワイリーがワイリーの城に入っていくけど、どこ行ってたんだろう?)




UFOの縮小処理とかすごく大変だったんだから!(後で続きを読むの欄を作って書こうかな)




さて、スーファミ以降になると画像の拡大・縮小が標準サポートされてて、いーなー(´・ω・`)
って思うんだけど、ファミコンでも無理やり実装しているソフトがいくつかあるのです。
そのへんでググると出てくるのは、バトルトードでしょう。



他には、ELITEなんてのもある。でもこれは何かワイヤーフレームの3D画面を表示してたり
すごいことになってるからちょっと違う部類かも


これをやろうとすると、
  1.どうやって画像処理をしようかな……
  2.処理が終わったところでどうやってPPUに転送しようかな……

と、なんだかどうしようもなさそうな問題にぶつかって座礁しそうになるのです。

1.はまず置いといて、2.から手を付けることにした。
ファミコンのPPUの転送速度は悲しくなるほど遅い。2200サイクルくらいだったかなあ。

ロックマン2だとパターンテーブルのタイル2つ分ずつ転送しているらしい。
CXだとその処理をそのまま使って4タイル/フレームになんかできたのでボス選択の真ん中
などで使ったり。
だ けどそんなんでUFOのタイル転送が間に合うわけない。

解決法は・・・1つしかないんじゃないかなあ。NMIが始まった途端に全力で転送を始める。
で、その転送ルーチンも元のだと

ldx #$00
lda $03B6
sta $2006
lda $03B7
sta $2006

LOOP:
lda $03B8,x ;4サイクル
sta $2007 ;4サイクル
inx ;2サイクル
dec $47 ; 5サイクル
bne LOOP ;3サイクル(最後は2サイクル)
rts


ほぼdecのせいで遅い。18サイクル/バイト。


で、これをどうするかというと(ルーチンは新設した)

lda <$6B
sta $2006
lda <$6C
sta $2006
ldx #$00

LOOP:
lda $7E00,x
sta $2007
lda $7E01,x
sta $2007
lda $7E02,x
sta $2007
............

lda $7E3F,x
sta $2007
txa
adc #$40
tax
bne LOOP
rts


普段バイナリで打ってるから慣れないなあ……ついでに言うとアセンブラコードは縦に長いから嫌い。
無駄に伸ばしただけじゃん、って?
これをやると1バイトごとにbneをしなくて済むから3サイクル節約できるのだ!

これじゃあ書き込みサイズが100バイト固定じゃね?
そこは手抜き(´・ω・`)  そのうち80バイトで止めるようにとか処理を追加しないとなあ

で、これによって8サイクル/バイトまで軽くなった。あとはこれをNMIのいっちばん最初

pha
txa
pha
pya
pha
lda <$(判定フラグ)
beq SKIP
jmp ←ここ
SKIP:


に投入しておしまいっ!





縮小処理どうしよう!?

2016/06/09 加筆。昔過ぎて記憶が曖昧になってから書くやつです。
で、UFOの画像を用意して、そいつを縮小させなきゃないんだけど…

もちろん縮小のアルゴリズムなんて知りません。

ググってもなんか難しそうな処理だったりファミコンでこれできんの?って思うようなのが
出てきたり……

仕方がないので自分で縮小処理を考えてやったのでした。


縦も横も同じような処理なので、横方向について書くと、

最初に元画像から何ドット間引くかを決めて、
画像の幅 / 間引く量 の位置にあるドットを詰めていくのを繰り返す感じ。

16ドット幅から3ドット間引く:
①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯

①②③④ ⑥⑦⑧⑨ ⑪⑫⑬⑭ ⑯

①②③④⑥⑦⑧⑨⑪⑫⑬⑭⑯

これをファミコンのグラフィックの形式に合わせて処理するわけだ。

8バイトで1BPPの8x8画像一つ分で、2BPPだから2つ…詳しいことはNesdevあたりに
任せるとして…


それぞれのビット列が1ドットずつ対応して、こう。
1バイト目: - - - - =- - -
2バイト目: - - - =- =- -
3バイト目: - - =- - - =-
4バイト目: - =======
5バイト目: - =- - - - - =
6バイト目: - =- - - - - =
7バイト目: - =- - - - - =
8バイト目: - - - - - - - -



縦に間引く時は1バイトずつ移せばいいからまだ楽。
横はなあ…ANDでマスクをかけてシフト演算してから戻すとかやらないといけなくてとっても
面倒だった覚えがある。



………。



説明がめんどくさくなってきたのでおしまい。


関連記事

コメントの投稿

非公開コメント

見てくれたやさしい人の数
プロフィール

暇人自治区長

Author:暇人自治区長
GMODとか改造ロックマンとか、
興味のあるものが特殊らしい。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。