マッパー0でCHR-ROM/RAM両対応なプログラムを作ってみた。
去年夏コミ前に近しい辺りのコードを弄っていて
多分出来るんじゃないか?とは思っていたけど。
実証実験がまだだったのでサクッと作ってみた。
ビルドして出来上がったNESイメージを
kazzo+anago_wx.exe(nrom_wx.af)にて
マッパー0カートリッジ(※1)に書込む。
するととある一枚絵(オリジナル)を表示する。
今度は同じNESイメージを
kazzo+anago_wx.exe(nrom_cram.af)にて
マッパー0 CHR-RAMカートリッジ(※2)に書込む。
先程とは違う一枚絵(ファンアート)を表示する。
やってる事は単純だけど気になったので…。f(^^;
※1 C102新作頒布物
※2 C103新作頒布物
P.S.
テストカートリッジシェルにラベルが無く、
今回作業時に若干の不便を感じた…。
絵素材はあるので(水着な女の子達)
近々ラベルシールこさえなくちゃだな。
Pythonで小物ツール作り(2つ目)
7月末にちょっとした画像コンバータを作り、
1月程空けて2つ目のツールを昨日一昨日で作成した。
こちらはテキストコンバータ。
他の高級言語で得た知識が多少作用するので、
簡単なものなら数日~1週間くらいで作れちゃうのだが
その後継続して触っていないため文法周りが
中々頭に定着しない辛み…。
苦手意識は薄れていっているので、
今はそれで良しとすべきか。
enriさんのサイト消滅している?
もしかして…enriさんのサイト消滅している?
毎月の末日更新が密かな楽しみだったんだけど、
ここ数日ずっと見れないので調べてみたら…
tok2無料プランがサービス終了らしくて。
実情は知らんのでこれが原因なのか確証は持てないが。
言うてもこのページ自体(自分の知る限り)2代目なので…。
enriさんの事だし、そのうち別サーバでしれっと復活してるんじゃない?
といった楽観は持っていたりする。
VRAM初期化ルーチンの作成
ネームテーブル初期化ルーチンを弄ってVRAM初期化ルーチンを作成した。
こちらはネームテーブル初期化ルーチン。
; ネームテーブルの消去 ; A=消去するネームテーブル clearNT: ldy #4 cmp #00 ; Aレジスタ分岐 bne .clear1 .clear0: ; ネームテーブル0 ($2000-$23FF) lda $2002 lda #$20 sta $2006 lda #$00 sta $2006 tax beq .loop .clear1: ; ネームテーブル1 ($2400-$27FF) lda $2002 lda #$24 sta $2006 lda #$00 sta $2006 tax .loop: sta $2007 inx bne .loop dey bne .loop rts
でもって、野うさぎ亭さんのところの解説を改めて読み返し。
※以下表の引用
■PPUアドレス空間に対する画面の割り付け
NESDEV wikiより引用 (0,0) (256,0) (511,0) +-----------+-----------+ | | | | | | | $2000 | $2400 | | | | | | | (0,240)+-----------+-----------+(511,240) | | | | | | | $2800 | $2C00 | | | | | | | +-----------+-----------+ (0,479) (256,479) (511,479)
■ミラーリング選択時におけるPPU用RAMアドレスの変化
PPUのアドレス | RAMのアドレス (水平ミラーリング) |
RAMのアドレス (垂直ミラーリング) |
---|---|---|
$2000~$23ff | $0000~$03ff | $0000~$03ff |
$2400~$27ff | $0000~$03ff | $0400~$07ff |
$2800~$2bff | $0400~$07ff | $0000~$03ff |
$2c00~$2fff | $0400~$07ff | $0400~$07ff |
上記を踏まえた上で先のコードを見てみると、
垂直ミラーリング設定時にしかVRAM全体が初期化出来ていない事が分かる。
(水平ミラーリング設定時、ネームテーブル1を指定しても
VRAMアドレスはネームテーブル0と等しいままなので、
結果VRAM前半を2回初期化してしまっている。)
ミラーリング設定に関係無くVRAM前半・後半を
確実に初期化するには以下のように書く。
; 内蔵VRAM領域をクリアする ; A=消去するVRAM範囲 0:VRAM前半, 1:VRAM後半 clearVRam: ldy #4 cmp #00 ; Aレジスタ分岐 bne .clear1 .clear0: ; VRAM前半 ($0000-$03FF) lda $2002 lda #$20 sta $2006 lda #$00 sta $2006 tax beq .loop .clear1: ; VRAM後半 ($0400-$07FF) lda $2002 lda #$2c sta $2006 lda #$00 sta $2006 tax .loop: sta $2007 inx bne .loop dey bne .loop rts
なお、マッパー30のような外部RAMを利用した4画面モードの場合、
サクッと対応させるなら前述のネームテーブル初期化ルーチンに
ネームテーブル2・3も初期化するよう処理を増やしてやれば良いだろう。
FamiTracker公式サイトが…
NES用でフリーのサウンドドライバについて調べていたんだけれども…。
ふらっとFamiTracker公式サイトに訪れたらページが妙な事になっとった。
FamiTracker
famitracker.com
今後復活するのかちょい心配…。
念の為インターネットアーカイブの方も貼っておく。
FamiTracker(Internet Archive)
web.archive.org
スーパーマリオブラザーズのソースコード(非公式、逆アセ)
こんなにも詳しく解析されていたのね。
A Comprehensive Super Mario Bros. Disassembly
もっと早くに(せめて去年のウチに)
その存在を知っておきたかった…。orz
まあ時間見て読ませて貰うとしよう。
NES研究室のハロワサンプル修正
NES研究室にあるCC65サンプル(hello, world)をNESASM用に修正してみた。
…つっても、結構前に書いたやつなので只の供養目的ではあるけど(苦笑)。
主な変更はnesasmに無い疑似命令を潰し込みしただけ。
コード自体は同じように書けるみたいなので
ソース間のやり取り(フォーラムのコードを試す等)に苦労はしなさそう。
;---------------------------------------------------------------------------- ; NES Sample1 "HELLO, WORLD!" ; Copyright (C) 2007, Tekepen ; nesasm modified by 2019, Regekatsu ;---------------------------------------------------------------------------- ; iNESヘッダ .inesprg 1 ; プログラムにいくつのバンクを使うか。今は1つ。 .ineschr 1 ; グラフィックデータにいくつのバンクを使うか。今は1つ。 .inesmir 1 ; - 垂直ミラーリング .inesmap 0 ; - マッパー。0番にする。 ; 起動 .bank 0 ; バンク0 .org $8000 ; $8000から開始 ; リセット割り込み Reset: sei ldx #$ff txs ; スクリーンオフ lda #$00 sta $2000 sta $2001 ; パレットテーブルへ転送(BG用のみ転送) lda #$3f sta $2006 lda #$00 sta $2006 ldx #$00 ldy #$10 copypal: lda palettes, x sta $2007 inx dey bne copypal ; ネームテーブルへ転送(画面の中央付近) lda #$21 sta $2006 lda #$c9 sta $2006 ldx #$00 ldy #$0d ; 13文字表示 copymap: lda string, x sta $2007 inx dey bne copymap ; スクロール設定 lda #$00 sta $2005 sta $2005 ; スクリーンオン lda #$08 sta $2000 lda #$1e sta $2001 ; 無限ループ mainloop: jmp mainloop ; パレットテーブル palettes: .byte $0f, $00, $10, $20 .byte $0f, $06, $16, $26 .byte $0f, $08, $18, $28 .byte $0f, $0a, $1a, $2a ; 表示文字列 string: .byte "HELLO, WORLD!" ; 割り込みベクタテーブル .bank 1 ; バンク1 .org $FFFA ; $FFFAから開始 .word $0000 ; VBlank割り込み .word Reset ; リセット割り込み。起動時とリセットでResetに飛ぶ .word $0000 ; ハードウェア割り込みとソフトウェア割り込みによって発生 ; パターンテーブル .bank 2 ; バンク2 .org $0000 ; $0000から開始 .incbin "character.chr"