初代ポケモン ボックスSRAMと初期化済みフラグ

2020年8月13日 コメントを残す

初代ポケモンではボックス領域に専用のSRAMバンク2と3が使われています
(SRAM1がメインのセーブデータ、SRAM0がでんどういり情報っぽい?)

SRAM2 はボックス1-4 を保持しており、SRAM3 はボックス5-8 を保持していて、内部構造は D9B2 以降をまるごとコピーしたもの。
これとは別に、「現在D9B2 にロードされているボックス番号」を保持する領域D51F があります。
たとえば、ボックス1を見ているときは 0x80、ボックス8を見ているときは 0x87 が入っています

D51F の最上位bitは「そのセーブデータを作った後 SRAM2,3を初期化したか」というフラグに使われており、これが立っていない場合はゲーム開始後にSRAM2,3を初期化していないものとして扱います。(データを消さずに「さいしょからはじめる」をするとセーブデータを維持したままになるため)
ゲームを開始してはじめてボックスを切り替えるとき、D51F は 00 なので、「初期化されていない、ボックス1が選ばれた状態」となります。
ここでボックスを変えようとしたとき、はじめてSRAM2,3の最低限の初期化が走り、各ボックスのポケモン数を0、ボックスの先頭の見た目を FF にされることで「なにもいない」状態になります。

ということで、ボックス切り替え処理というのはこんな処理です:

  1. 選択中ボックス番号の最上位bitが立っていなければSRAM内のボックスデータを初期化
  2. 現在の WRAM D9B2 以降にある選択中ボックスデータを、WRAM D51F に記載されている「選択中のボックス」をもとに算出した SRAM の領域に書き出す
  3. 選択されたボックスを SRAM から WRAM D9B2 以降に読み込む
  4. WRAM D51F に ボックス番号(0-7) + 0x80 を書き込む

なので、実はボックス1を選んでいるときに D51F をいじって 0x81 とかにしてボックスを切り替えると、ボックス2にボックス1の内容をまるごと上書きしだすことになります。

日本語版の場合
書き込み先バンクは (D51Fの値 & 0x7F) < 4 なら SRAM2、それ以外ならSRAM3です。
その中のオフセットは (051Fの値 & 0x03) で決まります。
0,1,2,3 のとき、それぞれ A000, A566, AACC, B032 になります。
0x88とか指定した場合でも、バンクは3、オフセットは0なのでボックス5の場所を指します。

以下は余談です
もともとボックスが一つだったころ、おそらく D9B2 以降のボックス領域がそのまま単純にボックスだったのでしょう。
途中でニックネームを保持するためにSRAMの多いカートリッジを使うことが決まり、後付けでボックス切り替えを実装したという話はポケモン・ストーリーという本で語られています。
このボックス切り替えコードから、ボックス専用SRAMが後付けされ、そことWRAM上にあるボックスの同期をとることで、もともとの1ボックス時代のコードを生かしつつ複数ボックス切り替えを最小限の追加コードで実装しようとした当時の空気が感じられました。

カテゴリー:未分類

msmrrenda.net 全域の動作確認環境変更

2019年12月13日 コメントを残す

これまで開設以来 msmrrenda.net 全域の動作確認環境はその時々において最新の google chrome でしたが、本人のメインブラウザ乗り換えに伴い vivaldi に変更します。
とはいえ、エンジンは同じですし、UAでのだし分け等はしていないので何も変更はないはずです。
(そもそも最近新コンテンツが増えていないので、vivaldi 向けに何か手を加えることもない予定です)

カテゴリー:未分類

dnf system-upgrade 中に固まったシステムの復旧

2018年11月4日 コメントを残す

5年モノくらいの Fedora27 環境を dnf system-upgrade していたところ、
ディスクを載せていた glusterfs が機嫌を損ねて固まってしまいリセットを余儀なくされました。

当然アップグレード中にそんなことをすればもろもろのライブラリバージョンの不整合で動かなくなるわけで・・・ Live DVD で起動してのシステム復旧を試みることに。

  1. Fedora29 Live DVDで起動
  2. /mnt/sysroot 以下に元々のルートファイルシステムをまるごとマウント
  3. fedora-release-27-1 を削除
    • 27と29が共存しているので、削除しないと dnf が  releasever=27 と設定してしまう
  4. dnf –installroot=/mnt/sysroot update
    • 最低限これで rpm が動くようになったので、rpm DB 上に f27 と f29 のパッケージが同居してしまっているものを処理します。(この時点でまだ中のdnfは動かない)
  5. dnf check –duplicate で重複パッケージをリストアップ
  6. chroot して f29 の方を rpm -e –nodeps –justdb で DB から削除
    • f29 を消せばとりあえず再度アップデートが走る状態になり、実在しているのがどちらのバージョンであろうと f29 版に上がってくれることが期待できます
  7. chroot を抜けて  dnf –installroot=/mnt/sysroot update をやりなおす
  8. 再起動

再起動してみたところ、dbus 周りがおかしそうでうまく起動しないのでもう一度 Live DVD 環境に戻って rpm -qa | grep dbus で出てきたパッケージを reinstall したら動くように。

ついでに dnf check で出てくるdependency brokenなパッケージを適切に処理してやって対応終了。

カテゴリー:GNU/Linux

意図せず他人のサービスを乗っ取ってしまっている

2018年2月18日 コメントを残す

とある都合でアクセスログを眺めていたときのこと。/event/xxxx の謎のアクセスログがいっぱい。

最初はwordpress狙いのいつものかと思ったらどうやら様子が違うようで、追いかけてみるとどうやらとあるドメインが anju.msmrrenda.net のIPアドレスを向いている模様。

現anju(2代目)は2017年夏ごろにanju(初代)のリプレース先として借りたさくらのVPSなので、おそらく以前使っていたユーザがレコードを残したままにしており、それがIPアドレスの使いまわしでうっかりこちらを向いてしまったようです。

これがただの自社サイトの残骸とかだったらバーカバーカで済んだのですが、サービス提供用ドメインでわずかながらリンクが貼られてしまっているため無関係な一般ユーザも知らずにこちらに流れてしまっています。

そんなわけで急遽トラフィック吸い込み用のバーチャルホストを追加、警告ページを表示しつつ410 GONEを返すだけのページを配置しました。

410はmod_rewriteのフラグに「G」と書けば出ますが、これだと単に標準エラーページが出るだけなので410用のカスタムエラーページ設定をかいてやります。

サービスを廃止するときはちゃんとレコード消したりしましょう・・・

カテゴリー:GNU/Linux

FreeBSD fuse glusterfsでstale NFS file handle になる問題の解消

FreeBSDマシンでfuse mountしたglusterfsの領域を別ホストから読み書きしたときに、
たびたび 「失効した NFS ファイルハンドルです / stale NFS file handle」となってremountする他なくなる状況をようやく打開しました。
(fuse cacheの実装によるFreeBSD特有の問題とまでは分かっていましたが、対策が見つかっていませんでした)

sysctl で vfs.fuse.lookup_cache_enable=0 してやると、
fuseのキャッシュが無効化されて(既に発症しているファイルも含めて)正常に読み書きできるようになります。

カテゴリー:未分類

スクフェスACカスタマイズサイト 発動スキル表示のバグ

プロフィールカード・協力プレイ時のスキル発動について、桐さんとの三日間にわたる検証の過程で副次的に発覚したバグのお話です。

本記事は、プロフィールカードのスキル発動タイミングについて、スクフェスAC ライブ撮影 Wikiの知識レベルを前提とします。

大雑把な結論から言ってしまうと、「プレイヤーのスキルが一部存在しない」「プロフィールカードのスキルが一部存在しない」「1,4,7番目の☆を落とす」のいずれかを満たすとき、
プロフィールカードと協力プレイヤーの発動スキルが履歴に表示されない不具合があります。

細かい条件と症状は、
1.「プレイヤーのスキルが一部存在しない」「1,4,7番目の☆を落とす」
この場合、プロフィールカード・協力プレイヤーの全ての同種スキルが表示されなくなります。
2. 「1枚目のプロフィールカードに一部スキルが存在しない」
この場合、2枚目のプロフィールカードと協力プレイヤーの同種スキルが表示されなくなります。
3. 「2枚目のプロフィールカードに一部スキルが存在しない」
この場合、おそらく協力プレイヤーの同種スキルが表示されなくなります。これだけ未確認。
4. 「2,5,8番目の☆を落とす」
星を落としても1枚目のプロフィールカードのスキルが発動する(仕様なんでしょうか)ため、影響はありません。

プログラマー的視点ではとっても簡単です。
発動しなかった場合にスキル表示を終端してしまい、以降を無視してしまうありがちなやつですね。
まあ、撮影部門メンバーでもないかぎりスキルなしのカードを読ませるだとか、星を落とすとかそういう変なことしませんからね・・・

この不具合のせいで根本の検証に3時間余計に持っていかれました。
「その雑でお気楽で大雑把な表記がどれだけの迷惑と混乱を引き起こしていると思っているのですか!!!」

4/30追記
問い合わせ上げたら「再現しないわー、ビジュアルスコアの計算もあってるわー」って帰ってきました。
いや合計値あってないって問い合わせ本文中で足し算して証明してるんですがね・・・
開発者まで上がってないんだと思いますが、最低限一般プレイヤーのレベルまで仕様を理解してから回答してほしいですね。もう二度と問い合わせしないけど。

www.msmrrenda.net リプレース計画 day4

2017年3月12日 コメントを残す

ゴミリクエストしか来なくなったようなので tsuyukusa.msmrrenda.net をシャットダウンしました。
常設webサーバとしては3代目、稼働日開始は2014/10/7とかだったようです。

カテゴリー:未分類

www.msmrrenda.netリプレース計画 day3

レコードの向け変え、全作業おわりました。表示できないページがあったら教えてください。
tsuyukusa移行時に無効化されたsuexecが再有効化されたので、特にCGI周りが怪しい感じです。

(うまくつながらない場合、一時的に www-sakura.3sh.msmrrenda.net に繋いでみてください。)

2017/3/6 20:54追記: 朝7時半ごろまで、1/2の確率で間違ったバーチャルホストにつながる状態になっていました。現在は修正済みです。

カテゴリー:未分類

www.msmrrenda.net リプレース計画day2

いままではごちゃまぜに置いていた非公開ページを別ホストに分離しようとしてはまった件。

通常、公開用ページは ~/public_html に置きますが、ホームは全ホスト共有です。
したがって、非公開ページを ~/private_html に分離しました。

ところが、なにやってもcgiが呼び出せません。

Mar 4 22:22:24 ainya suexec[1158]: command not in docroot (/home/renda/private_html/env.cgi)

で、suexec -V とかしてみるとこんなことが書いてあります。

-D AP_DOC_ROOT="/var/www"
-D AP_GID_MIN=100
-D AP_HTTPD_USER="apache"
-D AP_LOG_SYSLOG
-D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
-D AP_UID_MIN=500
-D AP_USERDIR_SUFFIX="public_html"

public_htmlでしか動かないんかーい。
安全上このディレクトリ設定はハードコードされており変更できないようです。
選択肢は二つ。apache全体のリビルドか、バイナリ弄ってGORIOSHI。
ま、手間的に後者かな!!!!

public_htmlよりもprivate_htmlの方が1文字長いので、この際private_htmになっていただきました。が、なぜか動かない。

Mar 4 22:50:08 ainya suexec[1375]: uid: (500/renda) gid: (500/renda) cmd: env.cgi
Mar 4 22:50:08 ainya suexec[1375]: failed to setgid (500: env.cgi)

あれ?suidかsgidでもついてたかなん?と思い、他ホストと見比べます。cap2
cap3
パーミッションは変わらないけどなんか赤い。これはいったい・・・。最悪apacheのリビルドも覚悟し、srpmの中身を覗いてみたら・・・

%caps(cap_setuid,cap_setgid+pe) %attr(510,root,%{suexec_caller}) %{_sbindir}/suexec

そっかー。
cap1

# setcap 'cap_setgid,cap_setuid+ep' /sbin/suexec

したら動きましたとさ。善い子の皆さんは横着せずにapacheをrpmbuildしましょう・・・

カテゴリー:GNU/Linux タグ:

www.msmrrenda.net リプレース計画day1

FreeBSD10で動いていたtsuyukusa.msmrrenda.netをFreeBSD11で作り直そうと時期をうかがっていたものの、
glusterfsとの相性が残念な感じだったのでCentOS7で作り直すことにしました。とりあえず最低限動いたラインなう。

ざっくりとした変更点
・www.msmrrenda.net宛てのアクセスは(他のサービスと違って)proxy-mikanを経由せずに直接tsuyukusaが受けていましたが、こちらもすべてproxy-mikan経由にします。
 ・したがって、自宅全ダウン中でも、chika/anjuのどちらかが生きていれば503くらいは出してくれます。
・tsuyukusaは冗長構成ではありませんでしたが、今回は2台にします。
 ・冗長構成にできない各種サービスは終了します。
・スクフェスボーダー入力用ページが混ざってましたが、それはそれで分離します。

カテゴリー:未分類