マッパー0でCHR-ROM/RAM両対応なプログラムを作ってみた。

去年夏コミ前に近しい辺りのコードを弄っていて
多分出来るんじゃないか?とは思っていたけど。
実証実験がまだだったのでサクッと作ってみた。

ビルドして出来上がったNESイメージを
kazzo+anago_wx.exe(nrom_wx.af)にて
マッパー0カートリッジ(※1)に書込む。
するととある一枚絵(オリジナル)を表示する。

DQ2あぶない水着一枚絵(オリジナル)

今度は同じNESイメージを
kazzo+anago_wx.exe(nrom_cram.af)にて
マッパー0 CHR-RAMカートリッジ(※2)に書込む。
先程とは違う一枚絵(ファンアート)を表示する。

DQ2あぶない水着一枚絵(ファンアート)

やってる事は単純だけど気になったので…。f(^^;


※1 C102新作頒布物
※2 C103新作頒布物


P.S.
テストカートリッジシェルにラベルが無く、
今回作業時に若干の不便を感じた…。

絵素材はあるので(水着な女の子達)
近々ラベルシールこさえなくちゃだな。

Pythonで小物ツール作り(2つ目)

7月末にちょっとした画像コンバータを作り、
1月程空けて2つ目のツールを昨日一昨日で作成した。
こちらはテキストコンバータ。

他の高級言語で得た知識が多少作用するので、
簡単なものなら数日~1週間くらいで作れちゃうのだが
その後継続して触っていないため文法周りが
中々頭に定着しない辛み…。

苦手意識は薄れていっているので、
今はそれで良しとすべきか。

enriさんのサイト消滅している?

もしかして…enriさんのサイト消滅している?

Enri's Home PAGE

毎月の末日更新が密かな楽しみだったんだけど、
ここ数日ずっと見れないので調べてみたら…
tok2無料プランがサービス終了らしくて。

お知らせ - セブンアーチザン

実情は知らんのでこれが原因なのか確証は持てないが。

言うてもこのページ自体(自分の知る限り)2代目なので…。
enriさんの事だし、そのうち別サーバでしれっと復活してるんじゃない?
といった楽観は持っていたりする。

前回学習した内容の応用編

前回学習した内容の応用編として現在作っているテストプログラムに
ミラーリング設定(水平/垂直)の動的判定と結果表示を組み込んでみた。

これでテスター(DMM)を使った導通チェックが省けるかな(笑)。

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も初期化するよう処理を増やしてやれば良いだろう。

風邪でノックダウン

ここ2週間くらい風邪でノックダウンしていた。
いや、正確には現在も只中ではあるのだが峠は越えたかな?と。

まー、ほぼ何もやる気が起きず日数だけ消化していった。
出し物のFCカセット基板を製造したぐらい。(こちらは単純作業なので。)

買ったノーパソも内容物確認だけしかしていないので
そろそろセットアップしなくちゃアカン頃合いではある。

唯一の収穫として、Mesenのデバッガの使い方を覚えた事。
意識朦朧とした中、某FC新作の弾幕STGを解析したりしていた。
解って来ると断然便利。ぶっちゃけ逆アセよりも
自分にはこっちの方が扱い易いという印象。

作業用ノートPCを手配

在宅ワークより出社の割合が増えて久しいので
えいやっと移動時に使うノートPCを手配した。

騙し騙し使っていたWinタブもストレージ不足・スペック不足で
いい加減使い物にならなくなって来てたのと、
ラップトップじゃないデバイスでプログラミングするのが
結構ストレス溜める要因ではあったので…。

無事コミケにも受かったので、より一層頑張っていかなくては。

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"