読者です 読者をやめる 読者になる 読者になる

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を使っていますが、これが最適かどうかはよくわかりません。 動かしてみる…

一応APU実装完了

NES

どうにか全チャネルがそれなりに鳴ってくれるようになりました(DMCは以前作ったPCM再生ROMでテストしましたが、本来の使い方であるDelta PCMについてはまだテストしてません)。ただ、ほとんどFCEUXのパクリなので理解度は半分以下です。 NesDevWikiの記述通…

NESエミュレータ(未完成)のリポジトリ作成

NES

とりあえず矩形波と三角波はそれっぽく鳴るようになったので一応リポジトリを作ってみました。ノイズとDMCは未実装です。 まだエミュレーション精度はガバガバです。最終的にはFCEUX互換にしたいですが…。 なお、このプロジェクトはとにかくシンプルでわかり…

SDL2のオーディオ再生

NESエミュレータはどうにか三角波がまともに鳴るようになりました。どうもSDL_QueueAudio()を使っていたのが良くなかったようで、従来のコールバック方式にしたら改善しました。そこで一応コールバック方式での再生について書いてみます(知識ゼロから調べた…

はてなダイアリーから移転しました

いきなりですがMarkdownを使いたかったので移転してみました。なんか横幅の狭いデザインばっかりなのが気になりますが…。スマホの影響なんですかね?

APUむずい

NES

とりあえず三角波だけ実装してみたけど音がおかしい(;´Д`) 音のタイミング自体は正しそうなんだけど凄く耳障りな感じになる…。エミュレーションがおかしいのかWAVEへの変換がおかしいのかよくわからないんですよねー。固定周波数の正弦波を出力する仮想チャ…

bjneのビルドが通らないのを修正

NES

元リポジトリのソースはそのままだとDebian stableでビルドが通らなかったので、一応修正版を置いておきます。ビルドシステムをwafからsconsに変更した*1ので、sconsのインストールが必要です。まあLinuxならパッケージがあるでしょうから許してくださいとい…

APUメモ

NES

APUが1割くらい理解できた(NesDevWikiを読んだだけですが)ので、既存のエミュレータの実装も合わせて少し書いてみます。まずAPUはフレームカウンタを内蔵しており、フレームカウンタはCPUサイクルに連動するシーケンサを持ちます。このシーケンサの動作サイ…

bitfield templateでハマった件

C++

C++ではテンプレートを使ってビットフィールドを実現するというテクニックがあるようです(検索すると色々出てきます)。しかしこれは注意して実装しないとハマるであろう落とし穴があった(私もハマりました)のでメモしておきます(gcc 4.9.2, clang 3.5.0で検…

FC『チャレンジャー』の乱数について

$EA-$EC が乱数、$87D9 が乱数生成器のようです。 $87D9 は乱数更新後に1Pおよび2P入力($10, $11)を加えた値を結果として返すので、適切に2P入力を行うことでかなり自由に乱数調整ができると思われます。ただし乱数が1Fで複数消費される場合は完璧とまではい…

GB『ルクル』testrun

なぜかYouTubeの一覧に出なかったので一応こっちに貼り。超適当プレイです。 地味に良ゲーだけどTASだとどうにも段差の待ち時間がダレるんですよね…。あと最適化を真面目に考えると氏ねそう\(^o^)/たまにスクロールが追いつかなくなって画面ズレが発生する…

ミニパットやってみた

submission movie: nicovideo | youtube4-2はHIO無理でした\(^o^)/ エンコードについて 今回はL-SMASHでmuxしましたが、FPSを手で指定する必要があったり、ストリーミング向けの場合 --optimize-pd を付けた方がいいという話があったり少々ややこしいです(…

FC『内藤九段将棋秘伝』の思考ログをとってみた

この局面のCOM玉の詰み判定がおかしい件について調べ中です(再現用ムービーと棋譜を置いておきます)。まだ思考ルーチンの評価ロジックまでは完全にはわかってませんが、コード自体は大体読めたのでLuaスクリプトでこの局面の思考ログをとってみました。ログ…

FC『内藤九段将棋秘伝』解析中

思考ルーチンを少しずつ読んでます。以下の要素はだいたい読めた感じです: 局面の特徴量計算 候補手生成(1手読み) PLAYER玉詰み判定 後は評価部だけと思われますが、結構いろいろな要素を評価してるのでもう少しかかりそうです。以前COM玉の詰み判定がおかし…

FC『スターソルジャー』のちょっと気になるコード

以前アップされた8面までのスコアアタックTASを引き継ごうかと思って色々調べ中です。今のところコードを読んでるだけですが、気になった点について少しメモ。 CHRバンク切り替え ; マッパー3 CHRバンク切り替え 9F88 : BD 44 D0 lda $D044,x 9F8B : 9D 44 D…

ミニパットのTASが来てる

http://tasvideos.org/5083S.html これ1-5と1-9でHIOが取れなくて投げたんですよね…。やっぱりこのムービーでもできてないようです。 1-5は頑張ればギリギリ近くまでは行けるんですが無理でした。1-9は以前手でプレイしたとき壁と遮断機の間に打ち込むことで…

FC 平成天才バカボン 資料まとめ

TAS 28:23.10基礎知識テクニック1面ボス解析2面ボス解析3面ボス解析4面ボス解析

FC 平成天才バカボン 4面ボス解析

$0396 現在の数字(0-origin) $039C 正解数 24回正解でクリアとなります。数字床は速度 0.938 以下でないと反応しないようです。$A8A2 が数字($0396)決定処理です。前回と同じになった場合、+1して8で割った余りとなります。乱数調整は床を踏むフレームをずら…

FC 平成天才バカボン 3面ボス解析

$0401 U8 ボス座標y $0402 U16 ボス座標x ボスがゴールするまで待たなければならないので、勝ちさえすれば所要フレーム数はどうやっても同じと思われます。自機が x=1184 に達した時点でゴールと判定されるようです。

FC 平成天才バカボン 2面ボス解析

最初のコインは右上で固定と思われます。このコインで500点取るのはおそらく不可能なので、最短でも11個取る必要があると思われます。$A520 がコイン位置決定処理です。前回と同じ位置になった場合1つ先の位置に変更する処理となっているので、連続で同じ場…

FC 平成天才バカボン 1面ボス解析

$039A ボール取得数 $0405 ボールy座標 $0406 ボールx座標 $04A0 ボール発射カウンタ(0x00, 0x80 で発射) $04A1 ボールy速度に関係? ボール20個取ればクリアとなります。ボール発射タイミングは一定なので、20個目を最速で取れるように調整すればOK。$B954 …

FC 平成天才バカボン テクニック

LR待機 左右同時押しするとその場で静止するので、もろもろの調整に利用できます。また、着地直後に歩き出してしばらくはジャンプができませんが、LR待機によってこの待ち時間を消化できるので、少しだけ助走してジャンプしたい場合にも利用できます。 しゃ…

FC 平成天才バカボン 基礎知識

※特に断らない限りリトルエンディアンです。 仕様 iNESマッパー: 19 (私はナムコ系マッパーはよく知りません。一応NesDevWikiに解説があります) メモリマップ 水平移動 画面内x座標 $53 とカメラx座標 $5D の和が自機のマップ内x座標(ピクセル)となります。…

ニコニコがGINZAで再生できなかった件について

Flashのグローバル記憶領域設定で「サードパーティ製 Flash コンテンツにコンピューター上のデータを格納することを許可します」にチェックを入れる必要があるようです。上のスライダーを一番左(容量0)にしておくと初めて要求された際に確認メッセージが出る…

FC 平成天才バカボン in 28:23.10

movie: website microstorage frames: 102354 re-records: 108728 (TAS Editor使用) encode: nicovideo (account | free) とりあえずうp。資料作りました。 私は原宿化してる人なのでエンコ設定は以前と同じにしてます。というかGINZAで視聴チェックしよう…

FC『平成天才バカボン』3面ボス戦

更新ポイントを見つけてはやり直すループにハマり続けてましたがようやく抜け出した感があります。現在3面ボス戦まで進んでいます。3面ボス戦ですが画像の高さ3のハードルをよじ登りなしで越える方法が見つかっていません。高さ3なので手前の高さ1のハードル…

FC『平成天才バカボン』落下キャンセルバグ

以前まで「ハシゴバグ」と呼んでいたものですが、別にハシゴがなくてもできることが判明しました。床も壁も1マス幅ならばこれで壁抜けができるようです。なお、床が2マス幅以上の場合、1マス歩いた時点で少しの間勝手にしゃがみ状態に切り替わり、その後歩き…

バカボンのRTAをやってる人がいた

普通のプレイ動画すらあまり見当たらないゲームだったんですが世界は広いですね。ゲームセンターCXでやったらしいので若干知名度が上がったのかも?なおTAS(testrun)の方は3-1-2まで進んでいます。残念ながらハシゴバグの出番はなさそうです(一応2-1-2で壁抜…

メモリの読み込み処理は emu.registerafter() で登録する

TAS

gui.register() は1フレームに1回呼び出されるわけではないので、メモリ読み込みに使うと色々おかしなことになります。例えば以下のスクリプトをFCEUXで実行するとポーズ中でもXが増え続けます。 local x_prev = 0 function f() local x = x_prev x = x + 1 …

FC『平成天才バカボン』調査メモ

$53 U8 画面内座標x $59 U8 座標y $5D U16 カメラx $7E U16 スピードx $0178 U8 座標xサブピクセル(ただし静止したりすると0にリセットされる) $017D U16 スピードy $0180 U8 ハシゴ登りや突っ張り登り時の移動カウント(意外と重要そう) $0181 U8 座標yサブ…

minttyで全角記号を正しく表示

.minttyrc で以下のようにロケール/文字セットを設定しないと全角記号が正しく表示されないようです(GUIの Options→Text からも設定できます)。 Locale=ja_JP Charset=UTF-8 これはロケールが設定されていないと wcwidth, wcswidth が1を返すのが原因のよう…

GraphicsMagickでクリップボードの画像を保存

$ gm convert clipboard: hoge.pngImageMagickでも同様にできるようです。

FDS『Zanac』ランダーフラッシュについて

6番を6回取るとランダーフラッシュ状態になる ランダーフラッシュが敵に当たると全ての敵がランダーに変化する ランダーフラッシュが敵に当たるか画面外に出るとサブウェポンは0番初期状態に戻る ランダーフラッシュ状態になれるのはゲーム中1回のみ。また、…