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"
私的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…
ちょっとした作業の自動化や小物ツールが必要になった時など、
ささっと書いて直ぐ試せる環境は何かと便利だったりする。
・Python
Welcome to Python.org
・WSH (JScript/VBScript)
・PowerShell
・windowsバッチ コマンド
・シェルスクリプト (sh/bash/csh/…)