星期一, 3月 12, 2012

OB解析再開

呃....我還活著!
事實上有點活得太好,過得太爽了....
所以自虐老毛病又犯....突然對OB解析又有興趣了

雖然這兩年Blog被FB等整個覆滅了
不過我還是比較喜歡這種半日記的記事方式

之前.....哇~一年半前嗎(笑)
OB解析到一半時   因為要換工作太忙而停了
結果最近打開之前OB資料夾來看....完全看不懂XD
所以乾脆直接重來(爆)

先來確認一下情況一下吧!

OB系統面全部是8x8字  劇情面是16x16字
16x16字原始約有900字可用  まぁ....這完全是小case
壓縮法很簡單  索引方式比較不正規罷了
這部份有看到之前寫的解壓程式 但我卻完全沒有印象何時寫的(爆

討厭的是8x8字  主要有三大問題...

1. 顯示的方法太多種:
有Sprites的、有BG的、有字庫全讀的、有用到才讀的、有解壓展開的....etc.
之前解決法是case by case直接根據函式進入點寫死到VRAM固定位置
但這樣會變成不同視窗裡同代碼用不同字庫...

 2. 8x8字庫有夠小:
只有256個字可用  扣掉約一半是基本符號不能用....剩128字 
再加上至少2個字才能組出8x16中文字....變64字
雖然可以用取巧方法  讓64字變回兩倍128字....
但OB光武器名就需要兩倍量了吧.....

3. 沒辦法隨便擴容:
8x8字基本上只用到1 byte代碼
2 byte代碼"基本上是不存在的"(濁音字雖是2byte但其實是用table湊出來)
在同一地方要顯示超過256種字以上就一定要用到2byte
簡單來說就是....程式要"加寫"很大 orz
如果是C語言其實不是大問題  可惜這邊全是機械碼...
(e.g. AF 00  ff 7f表示將Ram 7fff00位置的值載入A暫存器)
一個for loop就能讓人看到淚目  更不用說去改了.....

好吧   對這種改很大的...好的工具是絕對必要的
除了看圖的YY-CHR跟看binary code的UltraEdit,下面是我ASM解析時不可缺的:

Snes9X1.43.ep9r8
>> 兩年前用的SFC debugger,用來輸出執行過程函式,很方便就沒想過要換了

65816 Reference (http://wiki.superfamicom.org/snes/show/65816+Reference)
>> SFC OP code一覽,沒這個就看不懂ROM在講什麼

總之....經過幾個假日約30~40小時的重新解析   8x8的主問題算解決了
簡單來說,就是將VRAM tile B1~FE兩兩一組  依顯示順序固定配給
再使代碼多出19xx~1Bxx  依不同顯示函式進行大小修改   
遇到這範圍的代碼就依序將整個字送到tile B1~FE的對應位置
用更白話一點的方式說
就是雖然知道有700多人  但同時間會進來房間坐的最多只有近40
所以乾脆準備40張椅子  有人進來就發一張椅子隨他要坐哪(位置不固定)
(之前的方式是把700人分組在不同房間  每個房間椅子都是固定位置)
好處是700字總算夠讓8x8系統用字使用  而且可以跟16x16代碼同步一致


測試圖如下  就解析來說是完成的
但因為我只有改其中兩個8x16字的代碼跟字樣而已  所以一副未完成樣XD
事實上是比之前做的方案還完善得多!