呃....我還活著!
事實上有點活得太好,過得太爽了....
所以自虐老毛病又犯....突然對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
事實上是比之前做的方案還完善得多!
沒有留言:
張貼留言