星期日, 4月 18, 2010

OB戰鬥用文字顯示

這部份平片假名看起來跟別處沒不同
不過其實是另外壓縮的2 bytes文字(別處的是未壓縮4 bytes)
我因為嫌麻煩    於是根本不管壓縮資料在哪
豪爽的直接把自訂字庫丟到VRAM覆蓋掉原字庫

扣除掉那精美的戰鬥畫面所耗掉的VRAM空間
VRAM原則上只剩最多100個中文字的空間
塔羅牌+攻擊技+解說等大概要250字吧....沒辦法一次放入
加上顯示位置不固定   也沒辦法用之前挑字寫入的方式
只好把字庫拆成3個    依不同函式出現時機載入不同字庫到VRAM

例如:
攻擊技是平常用的字庫
按a鍵使用戰術時是塔羅牌名與戰術名的字庫  
再按選擇鍵看解說時用的又是另一個字庫(這個還沒弄好)

幸好只有塔羅牌名會在不同字庫間共用同一代碼
只要在全字庫中    把塔羅牌名用的字固定放在相同位置
就不會有對應不到的問題了

另外    因為函式有可能於別處被呼叫    而在別處產生亂碼
所以還用暫存器中的特定值來判定是不是該載入字庫(危險的秘技)
至少....目前看來顯示上暫時是沒什麼問題(笑)

因為字庫小的關係    技名也要先決定好才行
以前某些用過的技名也重新改過了
例如:アイスフィ-ルド(ice field) -〉 冰之領域 -〉 冰之結界
舊名在TO、TOG改版中會再修改以符合一致性

以全中文為目標的話    現在OB技術層面大概解決6~7成了吧

不過    這次在技術上真的是一次蠻不同的經驗
跟TO幾乎很少修改函式的作法相比
這次是完全不管壓縮演算法    直接硬改函式與VRAM
兩者正好是兩種極端的作法  















戰神.....終於破了.....

星期四, 4月 01, 2010

OB opening完成

OB的opening跟TO一樣是壓縮的
不過這次不採用像上次重壓回去的方法了(太累了....)

簡單來說   正因為是壓縮的
所以這些字一定會解壓排好到RAM裡  然後一起送到VRAM
只要寫一小段函式   在程式送出前
搶先讓取代用文字覆蓋RAM裡的原文字就ok了
基本上大概不用1小時就能完成這工作

下圖是混合中文(古印體字型)與原漢字使用的結果
當然   採用的是與TO、TOG一樣的譯文
文字是剛剛隨手弄的   未來會再修整一下

星期二, 3月 30, 2010

VRAM & DMA

因為有人問  所以在此就我所知的做簡單解說
如有誤   歡迎給予指教 (畢竟我也只是個中文化路人....)

又因為我只對皇騎系有興趣  所以這邊僅以SFC為例來解說
(GBA上的TOG沒用到debugger  所以不清楚......)

以SFC為例來說
通常會把字庫圖像放到RAM(7E0000~7FFFFF)裡
再用DMA一次丟到VRAM中  然後輸出畫面


ROM --解讀字庫--〉RAM --DMA--〉VRAM  --〉螢幕畫面



VRAM中每個8x8字庫圖像(tile)會對應一個tile編號
依模式不同  VRAM中可用的tile數量
與及每個tile所佔的byte數也不同(通常是8x2或8x4個bytes)
在繪製畫面前  SFC會把用到的tile編號
依畫面顯示順序存在VRAM的另一個地方
VRAM中的字庫tile   大致會以下圖所示方法顯示




















因為VRAM只有64kB  所以一次可以放進去的字不多
加上其他圖標、欄框、背景也要佔tile數量
如果只有平片假名  大概還能全部塞進VRAM
但如果是大量的漢字  通常會把畫面用到的字先存到RAM
再把這些挑出來的字存到VRAM

所以
如果遊戲因為只用到少數平片假名文字
而採用一口氣全部讀到VRAM裡的作法時
就沒辦法透過改字庫pointer等方式來擴增可用字數
因為程式無法一次讀更多字進去
只能用ASM改寫原程式  只挑出要用的字到RAM裡
用DMA把這些字送到VRAM中
並且根據這些字在畫面上該出現的位置
填寫對應的tile編號 

基本上  除了上面黃字的Case
中文化好像不太需要去動VRAM這一塊
DMA倒是比較常用到
傳輸大塊連續資料很快速方便

要修改VRAM中的資料不是很直覺
必須要去存取幾個特定位址  才能更動裡面資料
參考連結1
*參考連結2


舉例(這是國外某文章的範例  借花獻佛一下):
如果要從ROM位置$18000的地方
複製128個8x8大小的4色(2bytes)文字
到VRAM中$0000的位置時
(也就是共複製$800 bytes到VRAM中$0000的位置)
可以用下面這個函式完成

#$表示16進位數字  $表示16進位位址的值
除".w"表示處理資料為2bytes外  其餘皆為1byte 

    ldx.w #$0000    ; 設定VRAM pointer($2116)為#$0000
    stx $2116       
    lda #$01        ; 設定DMA control value($4300) 為 "normal"
    sta $4300
    lda #$18        ; 設定DMA至VRAM($2118)
    sta $4301        ; 參考上面的*連結   
    ldx.w #$8000    ; 設定DMA來源位址($18000)
    stx $4302
    lda #$01       
    sta $4304
    ldx.w #$0800    ; 設定DMA要傳的總Byte數
    stx $4305
    lda #$01        ; 經由channel 0開始DMA傳輸
    sta $420B

這邊要注意的一點是
DMA傳輸有0~7八種channel    各自有對應使用的特定位址
如果是經由channel 1做DMA傳輸  $430X要改為$431X
如果是經由channel 2做DMA傳輸  $430X要改為$432X
以此類推 $420B亦如是

雖然前述例子是ROM --DMA--〉VRAM
但當然也能RAM --DMA--〉VRAM  作法上沒啥改變
我處理OB就是把要顯示的字先從ROM挑好排到RAM中
再用DMA傳到VRAM

DMA也能用在ROM --〉RAM或RAM --〉RAM(單純移動位址)
這時就有一個專門op code處理
不用像傳到VRAM中那麼麻煩