PlayLoud!!

Since1997

バトルガレッガ ランク表示改造

ガレッガの改造するよ!

きっかけは@Messyieさんの「ガレッガ基板にランク表示機能つけたい」という発言。
http://twitter.com/#!/Messyie/status/43902292398850048
ちょっと気になったのでMAMEのチートを見たら、ちゃんとランク表示機能があるじゃないですか。流石だ……

早速MAMEのデバッガで該当アドレスを覗いてみると、確かにバトルガレッガ研究所さんに書いてあるような数値が格納されていますね。

しかし、今回は数値を書き換えるのではなく、この数値を画面に表示しなければならないのでちょっと面倒です。
ここでまた登場するのがMAMEドライバのソース。本当にありがたいです。
バトルガレッガの基板は「toaplan2.c」で定義されてます。

 1489      AM_RANGE(0x500000, 0x501fff) AM_READWRITE(toaplan2_txvideoram16_r, toaplan2_txvideoram16_w)_
            AM_BASE_SIZE_MEMBER(toaplan2_state, txvideoram16, tx_vram_size)
 1490      AM_RANGE(0x502000, 0x5021ff) AM_READWRITE(toaplan2_txvideoram16_offs_r, toaplan2_txvideoram16_offs_w)_
            AM_BASE_SIZE_MEMBER(toaplan2_state, txvideoram16_offs, tx_offs_vram_size)

テキストのVRAMは500000h〜に割り振られてるのかな?
とりあえずデバッガでリアルタイムに値を書き込んじゃいましょう。
おおっ!w

ちょっと書き間違いで数字抜けてますが、40x30キャラでそれぞれのアドレスもわかりました。

ちなみに縦画面なので、左下がアドレスの最下位。1キャラ1ワードで上の方に進んでいきます。
紙メモしか無いのでわかりにくいけど写真で載せておきます……

まあ、そんなわけでスコアを表示するときに一緒にランク値を表示すればいいんじゃないかな?と、思って探してみました。
11E0hから、スコア等表示ルーチンを呼び出しているようです。

0011E0: 6100 000C                  bsr     $11ee
・
・
0011EE: 4BF9 0050 0000             lea     $500000.l, A5
0011F4: 4DF9 0010 0D32             lea     $100d32.l, A6
0011FA: 4A2E 0500                  tst.b   ($500,A6)
0011FE: 6700 00BE                  beq     $12be
001202: 422E 0500                  clr.b   ($500,A6)
001206: 41EE 0000                  lea     ($0,A6), A0
00120A: 43ED 004C                  lea     ($4c,A5), A1
00120E: 3298                       move.w  (A0)+, (A1)
001210: 43E9 0080                  lea     ($80,A1), A1
001214: 3298                       move.w  (A0)+, (A1)
001216: 43E9 0080                  lea     ($80,A1), A1
・
・

11EEhでテキストVRAMの先頭アドレスをレジスタにセット。
11F4hは検証してませんがスコア値を文字コードに変換したものが格納されているアドレスをレジスタに入れてるんでしょう。
lea命令でA1レジスタに盛んに80hを加算していますが、これは縦画面に対して横向きに文字を並べていくので、その分のアドレスを加算しているわけですね。
早速、後ろの方の空いているアドレス7FBB0h〜に勝手ルーチンを作り、11EEhから一旦そこへジャンプするようにプログラムを書き換え。

やっぱりROMチェックに引っかかりますよねw
ガレッガDIPスイッチでテストモードにして、3ボタン同時押しで起動すればROMチェックをパスできるのでそれを使ってROMチェックを通過させます。
キター!

いや、とりあえず残機表示の下に「RANK」という文字を表示しただけです。
実際はランク値を文字コードに変換して、それを書きこまなければならないのでちょっと面倒です。
うーん……どうしたものか。
 
ほむほむ!ほむほむ!

……すいません、プログラム作る前にやりたいことだけやっておきました。
紙に書いてハンドアセンブルしてたのですが、そろそろ限界を感じたのでAS68Kというフリーのアセンブラを見つけてきて使ってみます。

こんなプログラムを書いてみました。

;レジスタを保存
00001 000000 48E7FFFF                      movem.l D0-D7/A0-A7,-(A7)
;ランク値のアドレスと、テキストVRAMのアドレスをレジスタにセット
00002 000004 41F90010C9D2                  lea     $10c9d2.l,a0    
00003 00000A 43F900500046                  lea     $500046.l,a1    
00004 000010 343C0003                      move.w  #$03,d2         
;文字の書き込みランク値が4バイトなので、1バイトずつ取り出して4回ループするよ!
00005 000014                      loop                             
;ランク値の取り出し
00006 000014 1018                          move.b  (a0)+,d0        
00007 000016 1200                          move.b  d0,d1           
;d0レジスタはランク値の上位4ビット
00008 000018 E858                          ror     #4,d0           
00009 00001A 0200000F                      andi.b  #$0f,d0         
;d1レジスタはランク値の下位4ビット
00010 00001E 0201000F                      andi.b  #$0f,d1         
;文字コードに変換するために30hを加算
00011 000022 06000030                      addi.b  #$30,d0         
00012 000026 06010030                      addi.b  #$30,d1         
;もし0Ah〜0Fhならさらに文字コードを加算
00013 00002A 0C00003A                      cmpi.b  #$3a,d0         
00014 00002E 65000006                      bcs     skip1           
00015 000032 06000007                      addi.b  #7,d0           
00016 000036                      skip1                            
00017 000036 0C01003A                      cmpi.b  #$3a,d1         
00018 00003A 65000006                      bcs     skip2           
00019 00003E 06010007                      addi.b  #7,d1           
00020 000042                      skip2                            
;1文字目(上位4ビット)をテキストVRAMに書きこみ CChは文字色(?)的なもの
00021 000042 12FC00CC                      move.b  #$cc,(a1)+      
;実際の数値の文字コード
00022 000046 12C0                          move.b  d0,(a1)+        
;テキストVRAMを横に移動(縦画面なのでー)
00023 000048 43E9007E                      lea     $7E(a1),a1      
;2文字目(下位4ビット)をテキストVRAMに書き込み
00024 00004C 12FC00CC                      move.b  #$cc,(a1)+      
00025 000050 12C1                          move.b  d1,(a1)+        
00026 000052 43E9007E                      lea     $7E(a1),a1      
00027 000056 51CAFFBC                      dbra    d2,loop         
00028 00005A                                                       
;保存していたレジスタを復帰
00029 00005A 4CDFFFFF                      movem.l (a7)+,d0-d7/a0-a7
;ジャンプ元の本来の処理
00030 00005E 4BF900500000                  lea     $500000.l,a5    
00031 000064                                                       
;元の場所へ帰るよ
00032 000064 4EF9000011F4                  jmp     $11f4.l         

68000はアドレッシングモードが豊富でホントに使いやすいです。
上のプログラムを7FB00h〜に置いて、11EEhを以下の通り書き換えます。

11EE jmp $7FBB0.l

はい、これでOKですね。

一応、これで動いているようなので、あとはROMチェックを通過させたら実機で動かしてみようかと思います。
ランク値の変化によって文字色を変えたりしても面白いかもしれないですね。
まあ、続きはまたそのうち……w


 
 
 
ほむほむ!ほむほむ!期待ほむ!www
http://cosgogo.jp/?pid=26461580

あ!w