アーカイブ

Archive for 2015年7月

道具を使った場合の処理@緑初期版

2015年7月29日 7件のコメント

せっかくなのでついでに調査しました。コードはピカ版と同様ですが、アドレスがずれています。
ROM3:5642から。テーブルは5657から始まっているので、5657 + (アイテム番号 – 1) *2に書いてあるアドレスにjpします。
一応テーブル眺めてみましたが5かい以外にうまいこと飛んでくれるアイテムはなさそうですね・・・

カテゴリー:セレクトバグ タグ:

道具を使った場合の処理@ピカ版

回復、じてんしゃ、ボール、技マシン等を除いた道具の処理はROM3:52EDから。CF78には使用した道具の番号が入っています。
このへんは要は3:52fa + (使った道具番号-1)*2に書かれているアドレスにjpするコードで、
はやぶさバッヂの道具番号65だと3:53c2から53c3を参照し、必ずD4CAに飛びます。


ld a,(CF78) [a:65]
ld hl,52FA  [a:65 hl:52fa]
dec a       [a:64 hl:52fa]
add a       [a:c8 hl:52fa]
ld c,a      [a:c8 bc:??c8 hl:52fa]
ld b,00     [a:c8 bc:00c8 hl:52fa]
add hl,bc   [a:c8 bc:00c8 hl:53c2]
ldi a,(hl)  [a:ca bc:00c8 hl:53c3]
ld h,(hl)   [a:ca bc:00c8 hl:d4c2]
ld l,a      [a:ca bc:00c8 hl:d4ca]
jp hl やったね!D4CAに飛ぶよ!

カテゴリー:未分類

ピカチュウ版での任意コード実行+没BGM再生

雫月さん初代ポケモンのBGM周りの話に触発されてピカ版の没BGMをうまく鳴らせないか試したらできちゃいました。

私の任意コード実行の主戦場は緑なのでピカ版はあんまりちゃんとやってませんでしたが、
ピカ版の「5かい」はエントリポイントがずれているためD123に飛んでくれず、
もっと手前に飛ぶのでだいたいは主人公の名前に引っかかって固まるようです。
特に名前「れんだ(DA DE 30 50)」は1文字目からしてjp cなのでキャリーが立ってたら30deにジャンプして暴走確実です。
ということで代用品を探したところ、どうやら「はやぶさバッヂ(65)」がD4CAに飛ぶっぽいということを確認しました。
(今のところ条件付きとかではないと思っているのですが、ちゃんと追ったわけではないので100%飛ぶかは怪しい)追跡しました、必ずD4CAに飛びます。
これは自分のパソコンの9番目の種類にあたります。

ということで、ポケスタを利用するなりして「はやぶさバッヂ」をピカ版に密輸、
自分のパソコンの9番目から
9: かみなりのいし x 99
10: 技22 x 35 ←2015/7/28修正、0x23なので10進数では35個が正しいです
11: 技33 x any
を並べるとjp de64が達成されてボックスのニックネーム1文字目から実行されます。
これで赤緑用と同様の5かいプログラムが実行できます。しかも手持ちが制限されないおまけつき。

本題に戻り、これを利用して没BGMを再生するコードを書きました。
例によってボックス頭から並べ、自転車に乗って「はやぶさバッヂ」を起動、自転車から降りるとBGMが変わります。
このまま赤緑で実行すると多分フリーズしますが、適切にBGMのバンク番号とBGM番号を設定してやれば流用可能です。
(02とかは文字にできないので引き算するなり改造が必要です)

; 1匹目 ヅろめゆゅ
11 db d2; ld de, d2db
d5; push de
e1; pop hl
50;

; 2匹目 ぼぐづぼム
3e 28; ld a, 28 ここがBGMバンク号 28はピカ版専用曲バンク
32; ldd (hl), a
3e 9f; ld a, 9f ここがBGM番号 9fは没曲
50;

; 3匹目 づの
32; ldd (hl), a
c9; ret
50;

カテゴリー:セレクトバグ タグ:

クチバジムのゴミ箱と戦う 決着

2015年7月26日 17件のコメント

2015/7/26 17:30 テーブル外で見てるアドレスが一つずつずれていたため修正しました
2015/8/7 11:20 追加実験分にデータ更新

結果だけのまとめ。ゴミ箱左上から下にむかって012、つぎの列の上から345・・・右端列cdeと振っていったときに、

1st (試行326400回):
ゴミ箱0,2,4,6,8,a,c,eは順に、12.6%, 12.2%, 12.5%, 12.7%, 12.3%, 12.6%, 12.6%, 12.5%

2nd (各パターン※につき試行326400回):
1stのゴミ箱が・・・ のとき2ndは・・・
0のとき: 1(50.0%) or 3(50.0%)
2のとき: 3(50.0%) or 5(50.0%)
4のとき: e(50.0%) or 7(50.0%)
6のとき: e(25.0%) or 3(24.9%) or 7(25.1%) or 9(25.0%)
8のとき: f(25.0%) or 5(24.9%) or 7(25.1%) or b(25.0%) ※fの場合該当ゴミ箱が消滅
aのとき: 6(50.0%) or d(50.0%)
cのとき: 7(50.0%) or d(50.0%)
eのとき: 3(50.0%) or d(50.0%)

※:乱数のとりかたが隣接するごみ箱の数によって変わる。
隣接2個の場合と4個の場合はどちらも候補は2つになるが乱数の処理が違うので偏り方が変わる可能性がある。
隣接2個の場合,3個の場合,4個の場合でそれぞれ4096回。

乱数テーブルを完全に読み切ったわけではないのでこの確率は参考程度。
確実に言えることは、「1stが6なら2ndは7を叩いとくのがいい」ぐらい。

なお、それぞれ1番目のデータはバグでテーブル外を参照しているが、
これはクチバジム関係のメッセージデータが入っている領域なので海外版とはゴミ箱パターンが異なると思われる。

カテゴリー:未分類

クチバジムのゴミ箱と戦う 2回戦

2015年7月26日 1件のコメント

2ndゴミ箱決定ルーチン。「なにがやりたいのかを考えればなんとなくわかる」感じのコードでした。

まず、やりたかったこと。
1. エントリ内の1番目(ゴミ箱候補数)をFFDBに入れる
2. 乱数を作る
3. 1が下限、FFDBにいれていた値が上限となるように乱数を補正する
4. 乱数をeに入れる、dに00を入れる
5. eをデクリメント deは0000から[候補数-1]になる
6. hl(エントリの2番目、つまり2nd候補1を見ている)に16bit足し算をする
7. hlの指しているエントリのゴミ箱を2ndに設定する

うん、まともになりそうだ。

実際のコードはこちら。
1. エントリ内の1番目(ゴミ箱候補数)をFFDBに入れる
2. 乱数を作る
3. FFDBにいれていた値と乱数をandする ←これバグ
4. 乱数をeに入れる、dに00を入れる
4. eをデクリメント
5. hl(該当エントリの2番目、つまり2nd候補1を見ている)に16bit足し算をする 
6. hlの指しているエントリのゴミ箱を2ndに設定する

どうやらゴミ箱のコードを書いた人はand演算を根本的に勘違いしていたようです。
よく「乱数を0-15にキャップする」という用途でand oxoFを使いますが、
そのノリで「0-14にキャップする」ためにand 0x0Eと書いてみたり、
「0-2にキャップする」ために0x03をandしてるのに下限0であることを考慮せずにdecしてみたり、
そういうミスが重なってエントリ内の偶数番目しか読まれなかったり255番目を読みに行ったりすることが多々あります。

さあ、正しいテーブルを作って偏りの調査にはいろうか。

カテゴリー:未分類

クチバジムのゴミ箱と戦う 1回戦

2015年7月26日 2件のコメント

d6c2: 1stゴミ箱
d6c3: 2ndゴミ箱

これさえわかってしまえばコードは読める!!!!!
と思っていた。

1stゴミ箱のコードはro17:7E4F近辺にあります。コードはとっても単純に、乱数発生させてand 0eしただけ。
擬似乱数がまともなら偏る要素はありません。
8192回やってみた感じではわずかに上下するくらいか。
12.2%, 13.7%, 12.7%, 12.2%, 11.6%, 12.9%, 12.5%, 12.3%

2ndゴミ箱のコードはro17:7E34近辺です。こちらは現在解析中ですが、クリティカルなバグを見つけてしまいました。そりゃゴミ箱も変な位置になるわ。
「2番目のゴミ箱の取りうる場所」テーブルを見るときに下限0の乱数に対してdecを書けているのでffになることがあります。この場合、テーブルから外れて変なところを見ます。
テーブルの中身やテーブルの読み方は調査中。

カテゴリー:未分類

5かいでニックネーム変更

2015年7月25日 14件のコメント

リクエスト第一弾。
文字コード指定で手持ちの6匹目のニックネームの1文字を変えます。
エントリポイントがあっていれば手持ち・ボックスどちらでも大丈夫ですが、多分手持ちが便利だと思います。

ゾAひぢゼ
ひぢギめな
ゅぼBにC
づの

Aには「カキクケコサ」のどれかを入れます。それぞれ名前の1文字目から6文字目に対応。
指定した文字がB+Cの文字になります。
たとえば、Aが「カ」、B+Cが0xF0であれば6匹目の名前の1文字目が「円」になる、といった具合。

文字数が増える場合(「ポリゴン」を「ポリゴン1」に変える場合など)は増えた文字の後ろに0x50の文字を入れないと暴走する可能性がありますのでご注意を。

以下、ソース

0e 85; ld c, 85 - 8aのどれか
cb 31; swap c 85 -> 58
0d; dec c 58 -> 57
50; ld d, b

cb 31; swap c 57 -> 75
06 d2; ld b, d2
c5; push bc
50; ld d, b

e1; pop hl
3e xx; ld a, xx
c6 yy; add yy
50; ld d, b

32; ldd (hl), a
c9; ret
50; ld d, b

カテゴリー:セレクトバグ タグ: