はむのブログ Ver.4.8.6 ~= Irregular child

Imaha486の雑記用ブログ。ツイッターもやってます http://twitter.com/Imaha486

広告

※このエリアは、60日間投稿が無い場合に表示されます。記事を投稿すると、表示されなくなります。

PassKey2すげー

2006-01-29 22:16:22 | Weblog
いつのまにやら情報をやり取りするようになったM3日本代理店のM3FLASH.jpさんから、
ニンテンドーDS(FW4)対応のPassKey2が届きました。
(詳細はこことか)

今までバンブラ対応のPassMe2は持ってたんですが、それが激しく要らなくなる一品ですた。
普通、PassMe2の場合は

・PassMe2の内部プログラムに起動キーが予め書き込まれている製品を購入
 (自力で書き換えることも可能だが非常に面倒)
・起動する際には必ず起動キーとなるNDSゲームを入れておく
・マジコンのSRAM(0000h-1000h)に起動キー専用のSRAM.BINを入れる

の3つが成り立って初めて「起動できる」というシロモノだったため、
「必ずFlashMeを導入して本体のファームウェアを書き換えないと使い物にならない」
という難点があるのですが、PassKey2の場合…

・PassKey2内部に既に多くの起動キーIDが入っているため変更不要。
(もしキーを増やしたい場合は付属のライタを用いて実機でファームウェア書き換えを行う)
・専用のSRAM.BINはファイル個別に用意するのではなくM3Flash.jpで公開している
 K2-RAM0x.GBAをGBAモードで起動してSRAMに直接書き込む。

という仕組みのため「PassMe2(バンブラ専用)」みたいに意識する必要が全くありません。
ある程度NDSハックで遊ぶにはFlashMeは必須ですが、できるだけ本体をいじらず、
単純にM3やG6で遊びたいだけの人には激しくオススメできる一品ですな。
コメント (2)

そろそろProject-DipStar- Ver1.50組みますかね

2006-01-29 00:40:08 | Weblog
実装予定
・現状のアドレス記法を 1xxxxxxx(HalfWord) と2xxxxxxxx(Word)にする。
 あわせてハーフバイトコードの実装。
 バイトコードはARMの仕様上できない気もするけど実験だけはしてみる。
・マスターコード宣言を00000000区切りではなくFxxxxxxxxに変更する。
・起動時にワンス書き込みを行うコードのアドレスはAxxxxxxxxに変更する。
要はPS2PAR準拠ですな。

既存の改造コードが使えなくなるといっても、まだたいした本数も出てませんので。
コメント (6)

気づいたらNEO MAGIC KEYがDSバックアップをサポート

2006-01-24 22:34:22 | Weblog
http://www.neoflash.com/forum/index.php/topic,1463.0.html
Topic: NEO_MK2_3_Menu_V0.5 release (Read 2616 times)

NEO MAGIC KEY MK2/3用ローダがDSゲームのバックアップをサポート。
(このローダを起動できる環境がかなり限られるのがアレですが…ウチはSuperCardくらいしか動かん)。

試しに動かしてみたところ、ノロマながら結構いい感じに吸出してくれますた。
ROMも変なパッチを当ててるようには見えない(トリミングは施されてますが)ので、
吸出しプログラムとしてはなかなか優秀ですね。
NDSROMDUMPERのようにFATを無視することも無くファイルを生成してくれるので、
連続で何本も読み込ませるときは便利です。

ただ、やはりJAP1.5には非対応ですね(まあ技術的に無理か…)。
読み込ませるとエラーで進行不可、無理やり挿してもゲーム名認識でフリーズ。
今、試しに途中で無理やり引っこ抜いて吸い出してますが、まあ無理でしょう。

果たしてJAP1.5をまともにDS実機で吸える日はくるのでしょうか~。
コメント (4)

NDSで「高速化パッチ」は可能か?

2006-01-24 00:15:58 | Weblog
とりあえずNDS homebrewを参考にswiWaitForVBlank(swi 0x50)に関する処理を潰してみる。

(例)ぷよぷよフィーバー
:020002DC DF052200 swile 0x00052200 ;ARM9
:0238BDD8 DF052200 swile 0x00052200 ;ARM7
※本来はthumbモードDF05(swi 0x50)ですがNDSDIS2はthumb非対応。

とりあえずswi 0x50を潰してみる(0000はnopじゃないですが、まあご愛嬌(ぉ
Project-DipStar-用改造コード
020002DC 00002200
0238BDD8 00002200


後は、これを適用してみると…オープニングデモが爆速っ!!
…以上(死
どうやらいくつかのアニメーションやエフェクトのスピードが上がったものの、
ゲームそのもののスピードに変化は無いようです。
うーーむ、NDSの市販ソフトってどこでウェイトを調整してるんだろう…。

追記
直感ヒトフデの場合
:02000350 DF052200 swile 0x00052200 ;ARM9
:0238BD44 DF052200 swile 0x00052200 ;ARM7
この2個所を同じように潰すコードを実行すると、

02000350 00002200
0238BD44 00002200


見事にゲーム全てが高速になり、高速化コード成功しました。
(速すぎるためタッチパネルの感度が良すぎ。超やりづらい(ぉ

となると、ゲーム次第ということか…。
基準としては02000000-020007FFにあるDF05と、
02380000-0238FFFFにあるDF05を潰せば良い感じかなと。
コメント

DSエミュレータで「もっと脳トレ」を動かす。

2006-01-23 00:13:09 | Weblog
iDeaSやDeSmuMEなどは完成度が少しずつ向上してきており、不安定かつ不完全ながら
いくつかの市販ソフトの動作に成功しています。

ところが現時点ではSRAMやEEPROMをサポートしていないためセーブでコケることが多々あり、
「もっと脳を鍛える大人のDSトレーニング」などはセーブ失敗のメッセージを表示して固まってしまいます。


てわけで、そんなもんパッチで解決してやれぃっと。
とりあえずアドレス0x040001a2(EEPROM周り)にアクセスする処理の中核に
EAFFFFFE(無限ループ)命令を突っ込んでフリーズするかどうかを確認して、
炙り出したのが以下の処理。

:0238B3B4 E59F1054 ldr r1,[r15, #+0x54] ;r15+0x54=*(0238b410)=#67109282(0x040001a2)
:0238B3B8 E1C120B0 strh r2,[r1, #+0x0] ;r1+0xb0=*(000000b8)
:0238B3BC E59F2050 ldr r2,[r15, #+0x50] ;r15+0x50=*(0238b414)=#67109280(0x040001a0)
:0238B3C0 E1D210B0 ldrh r1,[r2, #+0x0] ;r2+0xb0=*(04000258)=#0(0x00000000)
:0238B3C4 E2111080 ands r1,r1,#0x80
:0238B3C8 1AFFFFFC bne 0238B3C0
:0238B3CC E59F103C ldr r1,[r15, #+0x3c] ;r15+0x3c=*(0238b410)=#67109282(0x040001a2)
:0238B3D0 E1D110B0 ldrh r1,[r1, #+0x0] ;r1+0xb0=*(0400025a)=#0(0x00000000)
:0238B3D4 E20120FF and r2,r1,#0xFF
:0238B3D8 E5901004 ldr r1,[r0, #+0x4] ;r0+0x4=*(0000000c)
:0238B3DC E5D11000 ldrb r1,[r1, #+0x0] ;r1+0x0=*(00000008)
:0238B3E0 E1520001 cmp r2,r1
:0238B3E4 0A000005 beq 0238B400

最後の:0238B3E4 0A000005 beq 0238B400をb 0238B400(EA000005)に書き換えると、
その後にr1に1を書き込む(恐らく失敗フラグ)処理がスキップされ…。


…まあこのまま固まって進行しないんですが(ぉ
とりあえずセーブ云々で固まるやつはセーブパッチでどうにか少し先には動くと思われますので、
意地でもエミュで動かしたい方は頑張ってくださいまし。

追記 PM19:11
どうやら「やわらかあたま塾」も同じEEPROM読み書きルーチンが採用されてるらしいようで、
これと全く同じ書き換え方で起動する上「ちゃんとプレイ可能」だそうです。

うーん、興味深い・・・買いたい気はするけど絶対やらないなぁ('A`;

やはり任天堂汎用のEEPROMアクセスライブラリが存在するのかな?

さらに追記 PM19:45
ぷよぷよフィーバーや他のゲームにも全く同じルーチンがありました。
なるほど、M3やSuperCardの汎用SRAMパッチなどは、ここにパッチを当ててるのですねぇ。
コメント (3)

Project-DipStar-Ver1.00 先行公開ですよっと

2006-01-21 23:09:02 | Weblog
※画像に深い意味はありません。マリオ2のエンディングっぽく配置テスト。

・・・

さて、ホントは22日の0時にアップ予定でしたがブログ先行でいきまーす。
(ドキュメント内の公開日が22日なのがミソですな)
>>Download : Project-DipStar- Ver1.00

以下、形式的っぽい説明を(翻訳ソフトに通しやすく(略。

Project-DipStar-はニンテンドーDS用メモリ改造ツールです。
EZ-FLASHなどのフラッシュカートに書き込み、PassMeと組み合わせて起動します。
起動時に1度だけ書き込む通常コード、メモリに常駐する拡張コードをサポートします。
ただし、パラメータサーチ機能はありません。
根性で逆アセンブルリストから処理を追跡して改造コードを作ってください。
>>NintendoDS Disassembler [NDSDIS2] Download

…DSエミュレータでゲームが動くようになれば、DShasteとか作りますけどね(ボソ
コメント (7)

Project -DipStar- 実機でのコード入力を実装しました

2006-01-21 01:13:12 | Weblog
NDSで起動すると改造コード実行。
GBAで起動すると改造コード入力モード。

という流れが大体できてきました。
これでようやく改造コードサーチが少し楽になりそうです。

今まで(DipStarを作る前も含めて)はNDSゲーム改造の場合、
プログラム解析→ROM書き換え→マジコン書き込み→実機検証→見つかるまで繰り返し…
でしたので。

さて、それじゃおやすみなさい。

PM13:40追記 ~ beta3先行公開
いわゆるヒトバシラー専用です。
>>Download it

PassMeを付けて起動するとNDSモードになり、入力した改造コードが実行されます。
単体や、GBAで起動するとGBAモードになり、改造コードの入力を行うことができます。
操作方法は上のスクリーンショットにも書いてますが、以下の通りです。

<NDSモード 起動時>※ボタンを押しながら電源を投入してください。
Aボタン:スロット1のコードを実行
Bボタン:スロット2のコードを実行
セレクト:スロット3のコードを実行
スタート:スロット4のコードを実行

<GBAモード 起動画面>
Aボタン:スロット1を編集
Bボタン:スロット2を編集
セレクト:スロット3を編集
スタート:スロット4を編集

<GBAモード コード入力画面>
上下キー:コードを0~255番までスクロール
左右キー:アドレス・パラメータの桁間のカーソル移動
Aボタン:値をプラス
Bボタン:値をマイナス
セレクト:セーブせずにメニューに戻る
スタート:セーブしてメニューに戻る
LR同時:選んだスロットのコードを全て消去


PM 16:31追記
L+R同時押しでコードを消去すると別スロットも巻き込むバグがあります。
使わないように気をつけてください。

さて、それじゃ正式なマニュアルつくりますのでしばらくお待ちくださいませー。
コメント (1)

Project -DipStar- beta2

2006-01-19 23:09:48 | Weblog
ニンテンドーDS用 メモリ書き換え型改造ツールProject-DipStar- beta2をアップしました。
http://hp.vector.co.jp/authors/VA018359/nds/dipstar_beta2.zip

今回より「メモリ書き換えルーチンのメモリ常駐」を実装しました。
マスターコードを指定することで、任意アドレスから常駐プログラムに分岐し、
そこでメモリ書き換えを行うようになります。
つまり、今までのように起動時に一度だけ書き換えるだけではなく、
プレイ中、常にパラメータMAXを持続させることが可能になります。

以下、詳細(れあどめ.txtより抜粋)

@beta2より「常駐式リアルタイム書き込み」テスト実装
メモリ上にDipStarを常駐させることで、起動時だけでなくプレイしている間、
常にパラメータを書き込みつづけることが出来ます。

改造コードの後に「アドレス00000000 パラメータ00000000」を指定(要は8バイトNULL)し、
続いてマスターコード「常駐プログラムに分岐するアドレス+元の命令バイナリ」を配置。
以後指定した「書き込むアドレス」「書き込むデータ」はマスターコードのルーチンから
呼び出されるごとに実行されるようになります。
終端は通常コードと同じく「アドレス00000000 パラメータ00000000」を指定です。
なお、マスターコードアドレスが00000000の場合は実行されませんので、
未入力(000....)の場合は常駐そのものを行いません。
(例)Aボタン用コード
-OFFSET- +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
00001010 8C 7B 00 02 64 00 A0 E3 00 00 00 00 00 00 00 00
↑アドレス02007B8CにE3A00064を書き込んだ後、00×8を認識。次行より常駐式スタート
00001020 F8 FF 00 02 1E FF 2F E1 FC FF 00 02 E4 BF 06 02
00001030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
↑アドレス 0200FFF8 (元のコードはE12FFF1E)をマスターコードに指定。
これによりメモリ上にDipStarが常駐され、アドレス0200FFF8の命令は、
常駐プログラムを呼び出す命令に書き換えられる。
常駐プログラムはアドレス0200FFFCに0206BFE4を書き込む命令を実行した後、
SRAM(00001030)の 00000000 の終端コードを読み込み終了。
マスターコードの分岐を上書きするために潰してしまった命令を書き戻し、
呼び出し元アドレス+4の位置にジャンプし、以後ループです。

なお、マスターコードとして使うには「キー(ボタン)入力処理」の末端、
「bx r14 (サブルーチンの呼び出し元に帰る)」のアドレスが最適です。
NDSDIS2(http://hp.vector.co.jp/authors/VA018359/nds/ndshack.html)で
NDSプログラムを逆アセした後、文字列 "04000130" で検索してヒットすれば、
そこがキー入力処理ですので参考に。
(例)きみのためなら死ねる r2レジスタにキー内容をロード
:0200FF1C E59F20DC ldr r2,[r15, #+0xdc]	;r15+0xdc=*(02010000)=#67109168(0x04000130)


さて、そろそろ実機で改造コードを入力できるようにしますよーっと。
コメント (1)

難関突破・・・か?

2006-01-19 22:22:12 | Weblog
常駐先をアドレス023FF000から0237FF00に変更することでstr命令が正常に通過。
マスターコード指定による常時メモリ書き換えコード機能を実装した
「Project-DipStar- beta2」を本日中に公開しますので、
しばらくお待ちください。

…しかし、DSエミュレータDeSmuMEすげー。
iDeaSほどレベルが高くないにしろ、市販ソフトが微妙に動きつつ、
デバッガで動きを追跡できるのが素晴らしすぎですよっと。
http://yopyop156.ifrance.com/
PCSX2みたいにパッチ作ればゲームのプレイができるかも?
「脳トレ」とかEEPROMのチェックでコケてるだけですからねぇ。
コメント

DipStar 微妙に頓挫

2006-01-19 13:08:36 | Weblog
最終目標である「常時更新コード」を実装するためにアドレス023FF000に自作ルーチンを書き込み、
// アドレス023FF000以降に自作コードを埋め込む
WriteMemory(0x023ff000,0xe92d000f); // stmdb r13!,{r0,r1,r2,r3}
WriteMemory(0x023ff004,0xe59f0020); // ldr r0,[r15, #+0x20]
WriteMemory(0x023ff008,0xe4901004); // ldr r1,[r0],#+0x4
WriteMemory(0x023ff00c,0xe4902004); // ldr r2,[r0],#+0x4
WriteMemory(0x023ff010,0xe3510000); // cmp r1,#0x0
WriteMemory(0x023ff014,0x0a000001); // beq 023ff020 : (飛び先-コード実行位置)/4-2
WriteMemory(0x023ff018,0xe5812000); // str r2,[r1, #+0x0]
WriteMemory(0x023ff01c,0xeafffff9); // b 023ff008 : [(飛び先アドレス-命令実行アドレス-8)/4]
WriteMemory(0x023ff020,0xe8bd000f); // ldmia r13!,{r0,r1,r2,r3}
WriteMemory(0x023ff024,ulMasterCodeParam); // 潰した命令を復元
ulCodeToMasterBranch=0xea000000|(((ulMasterCodeAddress-0x023ff028-4)/4)&0x00ffffff);
WriteMemory(0x023ff028,ulCodeToMasterBranch); // b 呼び出し元+4のアドレスに戻る
WriteMemory(0x023ff02c,0x023ff800); // コード格納アドレス定義
動作実験。

が、どうしてもstr命令で任意アドレスに対しパラメータを書き込むことが出来ない。
(厳密にはDSプログラムがstrを呼び出した瞬間にフリーズする。
その行のみをnopにしてしまえば正常に動作するのでルーチンに問題は無い様子)。

起動時には任意アドレスに対して書き込み・参照が可能であったものが、DSのソフトが起動してからは、
うまく動かなくなっているような感じが。
もしかするとARM9/ARM7で参照可能な値の範囲が定められており、そこを飛び越えた例外アクセスが
できないような仕組みがあるのかもしれない。

とりあえずプログラムを常駐させる処理は凍結させて、実機上でコード入力を行うための
メニューを先に実装してしまおうか…。
コメント