EMU

好久沒晃模擬器的網站, 想當初我可是每天狂追著GBA新ROM的LIST. 話說現在NDS, PS2, WII上的模擬器也愈來愈完善了, 偷偷下了NDS上的惡魔城新作來TEST一下~

P4 2GHz, 1G ram上的測試結果: Lag 到爆炸(用的是最新的NO$GBA), 聲音似乎也沒完美模擬, 不過畫面還不差, 只是會有鋸齒, 還沒磨平處理過, 不過如果要磨平, 模擬速度又會更慢啦.

Anyway, 推一下老牌網站 EMU ZONE

TOOLS

ASCII TO BINARY, HEX, MD5
http://www.paulschou.com/tools/xlate/

ASM TUTORIAL
http://www.xs4all.nl/~smit/asm01001.htm

CE TUTORIAL
http://img.photobucket.com/albums/v685/Labyrnth/CEStep2.swf
http://img.photobucket.com/albums/v685/Labyrnth/CEStep3.swf
http://img.photobucket.com/albums/v685/Labyrnth/CEStep4.swf
http://img.photobucket.com/albums/v685/Labyrnth/CEStep5.swf
http://img.photobucket.com/albums/v685/Labyrnth/CEStep6.swf
http://img.photobucket.com/albums/v685/Labyrnth/CEStep7.swf
http://img.photobucket.com/albums/v685/Labyrnth/CEStep8.swf

Notes: step 6 介紹 pointers 的概念與尋找方式. steps 7 介紹 code injection 的方式. 尤其是 code injection 實在是很 powerful.

Polygamy
http://forum.cheatengine.org/viewtopic.php?t=207971

FGM
http://www.cordyblog.cn/pages/

Chrome

Google 推出的新瀏覽器 Chrome [官方網頁], 我一看到Logo就笑了, 這不是神奇寶貝的怪獸球嗎XD…真的是太可愛了, 希望可以替我們捕獲WWW上新鮮且神奇的怪獸呀~

之後在Google上Search: Chrome 口袋怪獸, 果然有好多人都把這Logo和神奇寶貝球聯想在一起了XD~~

使用感想: 畫面樸素, 簡潔有力 !  果然是GOOGLE的一貫風格. 而每次使用google搜尋時, 都會記錄下來的搜尋記錄, 我猜應該是要拿來做Recommender的功能 :), 然後把功能整合在這支瀏覽器上.

Chrono Trigger

Chrono Trigger  超時空之鑰

這款遊戲, 大概是我回想童年生活時, 最具有代表性的美好回憶之一.
如今已經移植到NDS主機上了, 然而, 好遊戲永遠都是好遊戲, 永遠被世人傳頌.

如同官方網頁標題說的
After 13 long years, the wheels of the time begin to turn anew.
13年後, 時間齒輪又再度轉動了.

13年前, 我還是小學五年級呢 .
13年後, 我已經碩士畢業了.

如果現實世界真有Chrono Trigger裡的時空傳送器.
我真想回到13年前去看看當時的我, 是怎樣子的青澀懵懂 !
當然也要向 Chrono 主角一樣, 去挽回當時沒把握好的或是錯過的事件.

Crono,クロノ
タロノ, TARONO …

Anyway, 謝謝陪伴我渡過那沉溺在SFC, PS上的童年生活.

Ollydbg

好用的快捷鍵:

F2: break point
F8: step over function
F7: step into function
F4: 運行到滑鼠停止的指令上 (EIP will be changed)
F9: 執行程式
CTRL + F9 : 執行到遇到 RETN

斷點的使用思維:
在某個指令上設立斷點, 即是讓程式執行到此為止即停止.
在斷點之前的運作, 我們可以掌握.
而斷點之後的運作, 我們沒把握掌握的很清楚, 因此我們要一步步來除錯,
這時用 F7 or F8 一步一步執行指令來看 register 的改變來找出我們想要知道的東西即可

Review Assembly

  • 常用的 general registers: EAX, EBX, ECX, EDX (32 bits, 4 bytes)
  • loop 專用的 register: ECX
  • Registers細分範例 EAX(4 bytes)=>AX(2 bytes)=>AH:AL (1bytes: 1bytes)
  • CPU execution cycle: fetch, decode, fetch operand, execute, write back
  • instruction CALL的步驟: save call的下面一個指令之address到stack, 接著change EIP(instruction pointer, save目前程式所執行到的指令address)到我們要call的procedure之address.
  • RET指令所做的事情, pop return address 給 EIP
  • procedure接收參數的方式, 可以用regisrers(受register數量限制), 或是利用stack(不受數量限制).
  • 程式執行時, 均會配置data, code, stack區塊
  • 常用指令: add, sub, mov, inc, dec, xor, or, and, call, ret, push, pop
  • push, pop 可以對 stack 進行操作
  • PTR用法: byte PTR [addr], word PTR [addr], dword PTR [addr], 即針對我們所要access的記憶體位置取出某個size的大小的區塊.
  • jz(jump if ZF=1), jnz(jump if ZF=0)的用法, 即條件式跳躍, 所參考的flag是 ZF (Zero flag), set = 1, reset = 0.
  • 一條指令執行時, 其目標operand若是設成零則, ZF=1. ( sub eax, eax ; ZF=1)
  • 比較指令: cmp a, b 執行 a-b, 接著若是 a=0, 則 ZF=1.
  • [addr] 的用法: 即去記憶體位置addr處取得資訊(需配合取得的區塊大小, 利用 PTR 指引)
  • 函數呼叫概念: 呼叫一個函數來執行的時候, 我們需先把要目前程式狀態資訊保存起來(利用push), 當函數執行完後, 在pop之前保存的資訊. 而函數執行完後, 會把執行結果放入記憶體, 或是register (即是高階語言return xx 的概念).
  • Interrupt: 中斷呼叫OS service runtime 來替我們做事情, OS掌管與硬體間的溝通, 所有I/O動作都得透過OS所提供的服務來幫我們做, 因此我們可以利用Interrupt來做底層access hardware的task. 每一種Interrupt均提供一些function讓我們來指定使用. 因此在呼叫interrupt前, 要先指定function number.