バトルガレッガ ランク表示改造
ガレッガの改造するよ!
きっかけは@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