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

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

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

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

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

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

Enri's Home PAGE

毎月の末日更新が密かな楽しみだったんだけど、
ここ数日ずっと見れないので調べてみたら…
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も初期化するよう処理を増やしてやれば良いだろう。

風邪でノックダウン

ここ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"

私的FC/NES開発環境、プログラミング編

このエントリーはDumBoがFC/NES開発に使っているツール類を
備忘録として書き留めておく為のものである(プログラミング編)。

当方主にWinOS+NESASM+秀丸エディタという組み合わせで開発している。
これから初めてみたいと考える方の参考になれれば幸いだ。

●処理系

スキルセットと好みでチョイスすれば良いと思う。

・NESASM
 camsaul/nesasm: NESasm -- NES 6502 assembler, version 3.1
 thentenaar/nesasm: nesasm 2.51 - modifications by Bob Rost
 MagicKit Homepage - MagicKit v2.51
 FC/NESプログラミングに特化したアセンブラ
 昔から使われておりweb上の文献も其れなりに充実している。

・cc65/ca65
 cc65 - a freeware C compiler for 6502 based systems
 cc65 - a freeware C compiler for 6502 based systems - old site
 C言語で開発出来るのが特徴。ca65を用いればアセンブラでの実装も可能。
 以前より利用者が増えたため、こちらも情報には困らない。

・NESmaker
 HOME | Nesmaker
 プログラミング不要でゲームが作れる。
 GB StudioのFC/NES版的存在。

テキストエディタ

シンタックスハイライト機能が有るエディタを使おう。
詳しく無いので未記載だが、unix系で人気のvi、Emacs
Vimといったエディタも良いらしい。

秀丸エディタ
 秀まるおのホームページ(サイトー企画)-秀丸エディタ

サクラエディタ
 サクラエディタ

Visual Studio Code
 Visual Studio Code - Code Editing. Redefined - 公式サイト
 Visual Studio Code - コード エディター | Microsoft Azure

●テキスト比較

有ると便利なテキスト比較ツール。
小規模プロジェクトなら無くても大丈夫かな。

WinMerge
 WinMerge - You will see the difference…

・DF
 DFの詳細情報 : Vector ソフトを探す!

スクリプト言語

ちょっとした作業の自動化や小物ツールが必要になった時など、
ささっと書いて直ぐ試せる環境は何かと便利だったりする。

Python
 Welcome to Python.org
WSH (JScript/VBScript)
PowerShell
windowsバッチ コマンド
シェルスクリプト (sh/bash/csh/…)