ここは?
カスタムブロック挿入ツールについてまとめます。
もちろんまとめるのはあなたですよ^^
blktool
2002年にJonathan Wilson氏がリリースした初のカスタムブロック挿入ツール。
最新バージョンは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個~16,128個になる。
- なるべく多くのブロックを挿入したいならカスタムブロックを一つのページにまとめると良い。
- 以下原因
- 挿入したブロックのデータをoffsetの種類・Map16ページ番号ごとに管理している(以下Segmentと呼ぶ)
- 挿入しようとしたSegmentに一つもブロックが挿入されていない場合、Segment用領域として512byte確保。
- 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をパッチすると全て定義されるが、利用価値はほとんどない。
互換性
憶測で書いてますので間違いがあるかもしれません。誰か検証してください。
binファイル
binファイルをサポートしていないGPSは除外。
|
blktool |
blite |
uoblite |
BTSD |
blktool |
\ |
○ |
○ |
× |
blite |
○ |
\ |
○ |
× |
uoblite |
○ |
○ |
\ |
× |
BTSD |
× |
× |
× |
\ |
asmファイル
asmファイルをサポートしていないblktool・bliteは除外。
|
uoblite |
BTSD |
GPS |
uoblite |
\ |
× |
× |
BTSD |
× |
\ |
○ |
GPS |
× |
○ |
\ |
最終更新:2020年11月08日 15:04