gcc で sanitizer を使う

C++

tl;dr $ gcc -fsanitize=undefined -fno-sanitize-recover=all foo.c $ UBSAN_OPTIONS='verbosity=1:abort_on_error=1:handle_abort=2:disable_coredump=0' ./a.out 詳細 gcc では asan (address sanitizer), ubsan (undefined behavior sanitizer) といった…

C++で自動メモ化(競プロ用)

DP問題などを解く際、私はとりあえず再帰関数で書いてみて大丈夫そうならメ モ化再帰に書き換える、という手順を踏むことが多いのですが、この書き換え が若干面倒なので、手間を最小限に抑える方法を考えてみました。 再帰関数はlambdaで書くものとします。…

競技プログラミング用C++テンプレート

C++で競技プログラミングをやる際の最小限のテンプレートを考えてみます。 ここに書いていないことも色々考えてはいますが、とりあえずさわりだけ。 AtCoderのgcc(C++14)を想定しています(近々C++17に更新されそうですが)。 標準ライブラリ #include <bits/stdc++.h> using </bits/stdc++.h>…

atpagesサービス終了に伴い、旧個人サイトを移転します

今更かよと言われそうですが、atpages が 2/28 でサービス終了するようです。ということで、旧個人サイトを github pages へ移転します。 atpagesに攻略サイトなどを上げてる各位はすぐ引っ越すんだ!間に合わなくなってもしらんぞー!!

解析資料をgithubで公開します

過去にチマチマと作っていた解析資料を github に上げていこうと思います。TASってないゲームも含まれます。 アセンブリをそのまま配布するのはさすがにまずいので、Mesen デバッガ用のラベルファイル(*.mlb)にします。この形式だと若干不便なところもありま…

NES 基礎知識 - 目次

NES

TAS さんや攻略のための解析がしたい人向けです。ゲームを自作したい人は NesDevWiki をしっかり読んだ方がいいでしょう。 メモリ CPU コード読解 コントローラ PPU APU (ほとんど無内容) 他機種向けにこういう記事書いてくれる人いないかなー(チラッ

NES 基礎知識 - APU

NES

今回は APU について扱…いたかったのですが、残念ながら知識不足のためまともに解説できる気がしません^^; ということで、参考になりそうなリンクを張るにとどめておきます。 NesDevWiki - APU ニコニコ大百科 - FC音源 Plogue livenes とりあえず I/O レジ…

NES 基礎知識 - PPU

NES

今回は PPU について扱います…が、正直難しいのでゲーム内のロジックを調べたいだけなら完全に理解する必要はないと思います(私もきちんと理解してません)。完全に理解したければ NesDevWiki の PPU の項目などを参照。 NTSC を前提とします。PAL などはよく…

NES 基礎知識 - コントローラ

NES

今回は NES/FC の標準コントローラについて扱います。特殊コントローラ(アルカノイドパドルなど)は扱いません。 標準コントローラには I/O レジスタ $4016, $4017 経由でアクセスします。NES と FC で若干細部が異なりますが、基本は同じです。詳細は NesDev…

NES 基礎知識 - コード読解

NES

今回は CPU の項を踏まえた上で具体的なコード例などを見ていきます。ここで挙げるコードが自力で読めればハードウェアの絡まないロジックを追うには十分だと思います(どのゲームでも基本的にあまり難解なアルゴリズムは使われていません)。 コード例 配列ア…

NES 基礎知識 - CPU

NES

今回は CPU について扱います。NES の PPU や APU はかなり複雑ですが、CPU は単純なので理解は容易です。CPU さえ理解しておけば乱数などの「目に見えない値」を探したり、ダメージ計算などの内部ロジックを追うには十分です。 ロジックを追う際は別にアセ…

NES 基礎知識 - メモリ

NES

何回かに分けて NES に関する基礎知識を書いていこうと思います。簡単なリバースエンジニアリングができるようになる程度の内容を予定しています(ゲーム自作までは扱いません、というか扱えません)。ほとんど NesDevWiki に書いてあることばかりなので、ガチ…

FC 『カイの冒険』 デバッグモード

デバッグモードと思われる未使用コードを見つけました。 $C2FF-$C300 を NOP で潰すことで未使用コードが有効になり、以下の機能が使えるようになります: タイトルで1コンの AB を押しつつ NORMAL START を選ぶことで面セレクトができる 面セレクト画面から…

6502逆アセンブラに関する考察 その3

前回、アドレス単位のコード解析について考察しました。今回はその結果を元に制御フローを考慮したコード判定を行うことを考えます。 このパスは誤判定を避けるため、極力保守的な方針で解析を行います。まずは6502の制御フローについて再確認します。 制御…

6502逆アセンブラに関する考察 その2

前回述べた前提に基づいて解析フェーズを考えます。 簡単のため、解析はマルチパスで行うことにします。具体的には以下の通り: アドレス単位のコード判定 制御フローを考慮したコード判定(これ自体も複数パス。後述) 以前作ったC++版では解析を1パスで行って…

6502逆アセンブラに関する考察 その1

tl;dr: taotao54321/td6502 懲りずに6502逆アセンブラについて考えてみます。まあ素直に IDA を買えという話なのかもしれませんが、結構お高いですし、プロプライエタリでない選択肢があってもいいと思うので…。なお、私はNES以外のプラットフォームには詳し…

Python Packaging User Guide を訳してみた

Python Packaging User Guide (PyPUG) を日本語訳してみました。Python のパッケージング周りは変化が激しいのでいつまで役に立つのかはわかりませんが…。 PyCon JP で毎年パッケージング関連の発表があるようなので、とりあえず現状を把握するにはこれを見…

Sphinx で日本語改行が空白になる件について

Sphinx日本ユーザ会の「不自然な空白が表示される」にある通り、japanesesupport.py を使うと解消されるようです。ただしこれをそのまま使うと改行だけでなくリンクの前後の空白なども潰されてしまい、英単語が頻繁に混じる文章だとかなりギチギチした見た目…

FC 『AD&D プールオブレイディアンス』を少し解析してみた

相当手強いのでとりあえず不完全ですが途中結果だけ置いておきます。 メモリマップ 文字列デコーダ マップデータ切り出し マップデータ画像化 今までで一番読みにくいコードだと感じています。バンク切り替えが8K単位になっている上に、同じバンクが異なるア…

pyvenvをactivateすると"parameter not set"とか言われる場合の対処

zshからpyvenvをactivateしようとすると $ source bin/activate deactivate:2: _OLD_VIRTUAL_PATH: parameter not set というエラーになることがあります。これはzshでno_unsetオプションを設定していると起こります。no_unsetオプションを設定したままこれ…

OpenAI GymのPong-ram用資料

OpenAI GymのPong-ram環境用のメモ。 とりあえずメモリアドレスを軽く調べました(趣旨的には解析とか一切なしで解くことが求められているのでしょうけど)。なお、Atari2600は $80-$FF の128 バイトがRAMとなっています(参考: Atari 2600 Specifications)。 a…

Atari2600 Pong 風にぬるっと動いてみるテスト

OpenAI GymのAtariゲーム環境の中にPong-ramというのがあって、ゲーム画面ではなくメモリ内容を直接見られるようなので、Stellaで動かしながらメモリアドレスなどを調べています。 幸いAtari 2600はNESと同じでCPUが6502(正確には機能削減版の6507)なので、…

多層パーセプトロンを書いてみる

前回は単純パーセプトロン(SLP)でAND, ORを学習し、XORは学習に失敗することを確認しました。今回は多層パーセプトロン(Multi Layer Perceptron, MLP)を使ってXORも含めて学習してみます。内容的には高卒でもわかる機械学習の第3回以降に相当します。 相変わ…

単純パーセプトロンを書いてみる

今更感漂うネタですが簡単なパーセプトロンのコードを書いてみたいと思います。高卒でもわかる機械学習というシリーズが非常にわかりやすかったのですが、動くコードがなかったのでそこだけ補完してみようという感じです。 今回は単純パーセプトロン(Single …

ゲームの自動プレイAIに関する妄想

別に上手くなくていいので普通プレイができるAIがあるとTAS制作が色々捗るんだろうなぁと思ったりしてます(まぁ、それが難しいんでしょうけど)。AIだけで人間が作ったTASを超えるのは(ゲームにもよるでしょうが)難しいんじゃないかなと思いますが、逆にテク…

OpenAI GymのFrozenLakeをQ学習で解く

前回はFrozenLakeを自前のアルゴリズムで解いてみました。今回はQ学習をやってみようと思います。 その前に、前回変な結論を出してたので訂正しておきます。前回8x8が通らなかったのは明らかに試行回数不足だと思います。1エピソードあたりの成功報酬が1なの…

OpenAI Gym を触ってみる

OpenAI Gymなる強化学習用プラットフォームを触ってみました(参考: PyConJPのプレゼンテーション)。 インストール自体はpip install gymで一発です(Atariゲームなどを扱いたい場合はpip install gym[atari]のようにサブパッケージをインストールする必要があ…

エミュレータのフレーム境界

NES

FCEUXではフレーム境界がline240(post-render)となっていますが、この理由がよくわかりませんでした。しかし考えてみると、入力更新タイミングとしてはここが適切なのではないかと思いました。 NESゲームの入力処理はNMIルーチン(line241で呼び出される)内で…

SMB1などのムービーがsyncした

NES

まだgithubには反映されてませんが、手元のブランチで主にPPUをFCEUXと一致させる作業中です。とりあえず以下のムービーはsyncするようになりました: HappyLee's NES Super Mario Bros "warped" in 04:57.31 t3h Icy's NES Urban Champion in 00:26.97 アス…

pysdl2でオーディオ再生(コールバック方式)

以前SDL2でのコールバック方式オーディオ再生について書きましたが、同様のコードをpysdl2で試してみました(全コードを置いておきます)。 スレッド間のやりとりには標準のqueue.Queueを使っていますが、これが最適かどうかはよくわかりません。 動かしてみる…