ここは?

カスタムブロック挿入ツールについてまとめます。
もちろんまとめるのはあなたですよ^^


blktool

2002年にJonathan Wilson氏*1がリリースした初のカスタムブロック挿入ツール。
最新バージョンは2.0。プリセットで350個ものブロックがあるので今でもそれらのブロックは利用されているが、環境依存な謎コードも含まれているので注意。

blklight

2005年09月22日、マリオワールド改造しようぜ!World9にて公開されたblktool用パッチ。
ソースコードを見る限り製作者はbliteの人?
Map16番号がページ2未満のときblktool処理を実行しない事で処理速度を改善している。

制約

  • 容量制限はblktoolシステムコード・データテーブル・カスタムブロックのコードを全て含めて32KB以下だと思われる。
  • offset1個につきデータテーブルに8bytes追加される。
  • offset毎に挿入制限があり、各offset255個のブロックまでしか挿入できない。
  • 非常に重い。原因はカスタムブロック処理を線形探索で行っている事が原因。このため無関係のブロックに触れているほど重い。

+ 参考:blktoolの探索ルーチン
; $7EBD00	2bytes	ブロック番号の配列へのポインタ
; $7EBD02	2bytes	ブロック実行アドレスの配列へのポインタ
; $7EBD04	2bytes	登録されてるブロックの数
; $7EBD06	2bytes	WholePageの配列へのポインタ

; このルーチンはOffset毎生成される
AnyOffset:	REP #$20
		LDA.w #$XXYY
		STA $7EBD00
		LDA.w #$XXYY
		STA $7EBD02
		LDA.w #$XXYY
		STA $7EBD04
		LDA.w #$XXYY
		STA $7EBD06
		JSR ExecuteBlktool
		NOP
		RTL


ExecuteBlktool:	PHX
		PHY
		PHB
		PHK
		PLB
		REP #$30
		LDA $7EBD06
		STA $05
		LDA $7EBD04
		AND.w #$00FF
		TAX
		LDA.w #$0000
		TAY
		LDA $7EBD00
		STA $00

.Loop		LDA ($05),y		;\ 検索対象のブロックに
		BEQ .WholePage		;/ WholePageにチェックが入っていた場合
		LDA ($00),y		;\
		CMP $03			; | 接触ブロック番号と
		BEQ .Found		; | 対象ブロック番号が一致した場合
		BRA .Next		;/  Foundラベルへ飛ぶ

.WholePage	INY			;\
		SEP #$20		; |
		LDA ($00),y		; | 接触ブロック番号のページと
		DEY			; | 対象ブロック番号のページが一致した場合
		CMP $04			; | Foundラベルへ飛ぶ
		REP #$20		; |
		BEQ .Found		;/
.Next		INY #2			;
		DEX			;\ カウンタがゼロになるまで検索
		BNE .Loop		;/
		SEP #$30
		PLB
		PLY
		PLX
		RTS

.Found		REP #$20
		NOP #3
		LDA $7EBD02
		STA $00
		LDA ($00),y
		STA $00
		SEP #$30
		PLB
		PLY
		PLX
		LDA #$00
		STA $7EBD06
		JMP ($0000)

見ての通り間接アドレッシングを多用し、ただでさえ遅いルーチンに追い打ちをかけている。
ブロック探索ループに入る時点で既にbliteの実行コードに負けかけているので挿入数1の時点でbliteより遅い事は確定している。


blite

2007年01月02日、マリオワールド改造しようぜ!World20にて公開されたblktool互換ツール。
同梱のdbfconv.exeを利用するとblktool用のブロックをblite用に変換できたので楽にbliteに移行できた。
日本で未だに主流のツール。
v1.10から角判定サポート?

ちなみに唯一のオープンソースのカスタムブロック挿入ツール。
GPSもオープンソースでした。

uo blite

製作者はromi氏?
.asmファイルもサポート。カスタムブロックの作成が楽になった。
SHAREDラベルというライブラリ機能も持っていたが、SHAREDラベルを持つブロックを先に挿入する必要があるため使われることは無かった・・・と思う。

制約

  • 容量制限はbliteシステムコード・データテーブルが32KB、カスタムブロック実行コードが32KB
    • 挿入するブロックがいくら少なくてもこの64KBは常に確保される。
  • 使い方によって挿入可能なブロックの数が4個*2~16,128個*3になる。
    • なるべく多くのブロックを挿入したいならカスタムブロックを一つのページにまとめると良い。
    • 以下原因
  1. 挿入したブロックのデータをoffsetの種類・Map16ページ番号ごとに管理している(以下Segmentと呼ぶ)
  2. 挿入しようとしたSegmentに一つもブロックが挿入されていない場合、Segment用領域として512byte確保。
  3. Segment用領域が32,256(0x7E00)bytesを超えた場合確保に失敗し、「ちょっとブロック挿入しすぎですぜw」というエラーを出す。



blktool Omega

Acmlm's Boardで開発されていた新型blktool・・・らしい。
詳細不明



Blocktool Super Deluxe (BTSD)

smkdan氏が作ったツール。リリース時期は不明。
リターン命令がRTSからRTLになったためblktoolのコードとは非互換?

.asmファイルのみ角判定がサポートされた。
.binファイルと違いoffset情報を別に用意する必要は無い代わりに、
.asmファイル一つあたり一つのブロックしか作れなくなった。

書式:
db $42			; 角判定使用宣言。0x42のマシン語はWDMという未定義命令なため、
			; シグネチャとして用いられていると思われる。
			; 角判定を使わない場合はdb $00とでも書くべきか?
JMP MarioBelow		; BELOW
JMP MarioAbove		; ABOVE
JMP MarioSide		; SIDES
JMP SpriteV		; SPRUD
JMP SpriteH		; SPRLR
JMP MarioCape		; CAPE
JMP MarioFireball	; FIRE 角判定を持たないブロックの場合ここまで
JMP TopCorner		; RESV1
JMP BodyInside		; RESV2
JMP HeadInside		; RESV3

JMPが大量に並ぶ。正直、美しくは無いがこの負の系譜はGPSにも引き継がれている。

GPS

2013年10月07日にp4plus2氏がリリースしたツール。
"Gopher Popcorn Stew"の略・・・らしい。
CUIベース、asmファイルのみサポート。
ブロックの説明はprint命令で埋め込む方式になっている。
main.asmでは角判定を持たないブロックの考慮を行ってないため、
角判定を持たないブロックのサポートはここで打ち切られている。

Shared Routineという共通ライブラリ機能を持っているが
この機能によって始めてライブラリが呼び出されるとそのタイミングでライブラリがアセンブルされるため、ラベル情報が破損するという欠陥を抱えている。

例:
Main:	LDA $9D
	BNE .Lock	; 絶対ラベル Main_Lockへジャンプしようとするが、
			; SharedRoutineのせいで見つからなくなる
	
	%LibTest()	; このタイミングでLibTest.asmがアセンブルされる。
			; GPSの仕様上 必ずファイル名のラベルが宣言されるため
			; ここからラベルはLibTestになる
			
.Lock			; ここでの絶対ラベルはLibTest_Lock

ちなみにGPSはLunar Magicが提供しているカスタムブロック実行領域を占有するため、
FuSoYa's Scrolling Pipes(いわゆる新型スク土)と共存できない。

GPS (unofficial)

2017年03月15日以降のアップデートはp4plus2氏による物ではないため、便宜上uoGPSと呼ぶ。

壁走りの判定をサポートされたが、RESV4 RESV5を使用していてBTSDの負のジャンプテーブルが更に肥大化した。
壁走り判定を使用する場合はdb $42をdb $37とする必要がある。
0x37はAND [dp],yなので使用されないとは言い切れない。なぜこれをシグネチャとして使用したのかは謎。
正直、壁走り判定はSIDESあたりにアサインすれば間に合う。

残念な事にShared Routineのラベル破壊は健在。お前それで良いのか?

ツール比較


ツール .bin形式 .asm形式 角判定 未定義判定 ライブラリ リターン命令 アセンブラ
blktool × × × × RTS なし
blite × × RTS なし
uoblite RTS xkas
BTSD × × RTL xkas
GPS × × RTL asar
uoGPS × RTL asar

ツール Map16番号 効果番号変更 .bin 一対多 .asm 一対多 その他
blktool 0x0000-0xFFFF × ものすごく重い
blite 0x0000-0x0FFF ※ LM v1.6xまで LM v1.7x以降で不具合あり
uoblite 0x0000-0x0FFF ※ LM v1.6xまで LM v1.7x以降で不具合あり 日本主流
BTSD 0x0000-0x3FFF × × 元 海外主流
GPS 0x0000-0x3FFF × CUIベース 海外主流
uoGPS 0x0000-0x7FFF × RESV4 RESV5改竄

※:カスタムブロックが挿入されているMap16番号(0XXXとする)よりちょうどMap16番号が1000n
大きいタイル(nXXX)に触れると、実行されるべき判定をn個ずらした0XXXのカスタムブロック処理が実行される。

例:0x0300に全ての判定(offset)が定義されているカスタムブロックを挿入した状態で、0x1300のタイルをマリオが下から触れると0x0300のABOVE判定が実行される。
0x2300のタイルをマリオが下から触れると0x0300のSIDES判定が実行される。

角判定

blktoolでは取れないマリオの判定各種。
これらの判定はLunar Magic v1.64以降で使用可能。
  • マリオ足先判定 (RESV1 / TopCorner)
  • マリオ体判定 (RESV2 / BodyInside)
  • マリオ上半身左右判定 (RESV3 / HeadInside)

未定義判定

Lunar Magicで予約されているが未定義の判定。
reserved_all.ipsをパッチすると全て定義されるが、利用価値はほとんどない。
  • RESV4
  • RESV5
  • RESV6
  • RESV7


互換性

憶測で書いてますので間違いがあるかもしれません。誰か検証してください。

binファイル

binファイルをサポートしていないGPSは除外。
blktool blite uoblite BTSD
blktool ×
blite ×
uoblite ×
BTSD × × ×

asmファイル

asmファイルをサポートしていないblktool・bliteは除外。
uoblite BTSD GPS
uoblite × ×
BTSD ×
GPS ×

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2020年11月08日 15:04

*1 その昔、Lunar MagicにOverworld Editorが実装される以前にエディタを作った方?

*2 未定義判定を含む全ての判定を持つブロックを1ページにつき1個挿入

*3 1個の判定を持つブロックをMap16番号0x0000から挿入