ダビスタ96 完全解析

ROMアドレスのメモ

はじめに

基本的に自分用メモ。間違ってるかも。

ROMのマップ

???

0x208117 : 距離の文字表現リスト : 384bytes

6バイト(4バイト + 2バイト空白)ごとに文字列距離のリストを格納。
1000~3600まで芝用全角,ダート用全角,芝用半角,ダート用半角で4回列挙している。

 D1 D0 D0 D0 FF FF : 1000
 13 16 10 10 FF FF : 3600
end: 0x208296
???

0x20F36E : 重量条件文字列ポインタ : 148bytes

4バイトごとに重量条件コードに対応する文字列のポインタを
バンク番号からのlong アドレスで格納している。

 62 E1 98 00 -> 実行時アドレス 98/E162 = 0x2C6162
 そこには「馬齢重量」の文字が格納されている。
end: 0x20F401
???
0x27F800 : ブランク : 2048bytes

0x280000 : ライバル馬データ : 36,256bytes

0x280000 - 0x28000B : 2byte表現で馬のカテゴリ分け,賞金条件の境界線
 0x280000 : 0x180A = 362*17 : 362頭目 リスクフローラ
 0x280002 : 0x3322 = 770*17 : 770頭目 ネオタイクーン
 0x280004 : 0x5BA4 = 1380*17 : 1380頭目 ワイドトッキュウ
 0x280006 : 0x869B = 2027*17 : 2027頭目 テイエムブランド
 0x280008 : 0x87EF = 2047*17 : 国内馬末尾 ユキノコンコン
 0x28000A : 0x8D94 = 2132*17 : 全データ末尾

0x28000C - 0x288D9F : ライバル馬データ 17byte x 2132頭
byte[0]-[8] (bit6-0) :馬名(文字コード)
byte[1]-[8] (bit7) :馬体重, byte[8]= +256kg, byte[1]= +2kg
byte[9] (bit7-5) :年齢幅? (001で+0)
byte[9] (bit4-2) :基準年齢(000:3歳, 101:8歳)
byte[9] (bit1-0) :性別(00:牡 01:牝 10:セン)
byte[10] : 騎手コード
byte[11](bit7-5) : 脚質(000:自在 001:逃げ 010:先行 011:差し 100:追込)
byte[11](bit4-3) : 重馬場適正(00:△ 01:〇 10:◎)
byte[11](bit2-0) : 毛色(毛色コード)
byte[12] : 人気
byte[13] : スピード
byte[14] : スタミナ
byte[15] (bit6-0): 勝負根性
byte[15] (bit7): 父内国産フラグ
byte[16] (bit7-2): 気性 (6bit数値の2倍が実値なので, 常に偶数)
byte[16] (bit1-0): 条件馬の出走傾向(0:ダート, 1:短距離, 2:中距離 3:長距離)
end: 0x288D9F
0x288DA0 : ブランク : 608bytes
???
0x289048 : ブランク : 952bytes
???

0x2894F0 : 騎手パラメータ(地方,ランク) : 240bytes

騎手コード順に各1バイトで以下の情報を格納。
LLLLRRRR
L (bit 7-4) : 地方グループ (0x0 - 0x9) [詳細は0x293824]
R (bit 3-0) : 騎手ランク (0:S 1:A 2:B 3:C 4:D 5:E 6:F(-1kg) 7:H(-2kg) 8:G(-3kg)
end: 0x2895DF

0x2895E0 : 騎手パラメータ(得意戦法) : 240bytes

騎手コード順に各1バイトで以下の情報を格納。
脚質(0:自在 1:逃げ 2:先行 3:差し 4:追込)
end: 0x2896CF
???
0x289850 : ブランク : 944bytes

0x289C00 : 出走馬データ : 16910bytes

各レースごとの出走馬がリストされている。

 0x289C00 - 0x289D83 : ポインタ部
  2byte表現で後のテーブルでの各レースの区切り位置を指定。

 0x289D84 : 出走馬テーブル
2byte ごとにライバル馬を指定する数値 (ライバル馬のID x 17)が格納されている。
17を掛けてあるのは0x28000Cにあるライバル馬テーブルの番地を直接参照するため?
例) 0x289D84 : 0x00AA = 170 -> ライトカラー

レースごとに可変長のデータだが、区切りは0x289C00からの数値で決まっている。
例) 0x289C02 : 0x0042 = 66, 0x289C04 : 0x0068 = 104
→ 2バイトずつなので、最初のレースは66/2 = 33頭, 次のレースは(104-66)/2 = 19頭

レース名コードの順に コスモス賞~凱旋門賞のオープン戦193レース分が指定されている。
区切り(ポインタ)データ : 2byte x 194 = 388 byte
出走馬データ : のべ8261頭分 16522 byte

end: 0x28DE0D
0x28DE0E : ブランク : 4594bytes

0x28F000 : 初期レコードタイム : 1067bytes

タイム2バイト, 馬名9バイトで1セット
格納順 : 東京→中山→京都→阪神→福島→新潟→中京→小倉→札幌→函館 で
     各競馬場について表示順の上から(芝短距離→芝長距離→ダート)
byte[0-1] : タイム(2バイト数値) 0.1秒単位
byte[2-10] : 馬名(文字コード)

例) タイム部 0x039c = 924 → 1:32.4
end: 0x28F42A
0x28F42B : ブランク : 981bytes

0x28F800 : 賞金額リスト : 400bytes

1着から5着までの賞金額のリストを格納している。
1つあたり2バイトで(万円)単位、全部で40セット。
例) 0x24B8 = 9400 → 9400万円
end: 0x28F98F
0x28F990 : ブランク : 624bytes
???
0x28FCF0 : ブランク : 784bytes

0x290000 : 番組表データ : 2596bytes

 0x290000-0x290003 : 04 0A 18 0E  調査中
 0x290004-0x290A23 : 2バイトで1レース分の情報
  格納順 : 1月1週1R 関東→関西→地方, 1月1週2R 関東→関西→地方 ...
       1月1週9R 関東→関西→地方, 1月2週1R 関東→関西→地方 ...
  該当レースなしは 0xFFFFで埋められ、1週分=54バイトになる。
  凱旋門賞は10月1週地方9R相当の位置にある。
  0xFFFFではないとき、以下の通り。
2バイトで下位8bit→上位8bit の順に格納
XDLLLLRR RRRRRRRR
R (bit 9-0) : レース名コード
L (bit 13-10) : 距離コード
D (bit 14) : ダート = 1, 芝 = 0
X (bit 15) : 未使用

例) 0x290A18 : 0x2E54
 ここに格納されているのは順番から12月4週関東8R
 R = 0x254 = 596 → 有馬記念
 L = 1011b = 11 → 2500m
 D = 0 → 芝
end: 0x290A23

0x290A24 : 週内レース優先順 : 1344bytes

レース出走馬の確定のための計算を行う優先順を週ごとに定義している。
1月1週から12月4週までの順で各28バイト。
00:関東1R 01:関西1R 02:地方1R 03:関東2R ...
17:地方8R 18:関東9R 19:関西9R FF:開催レースなし
凱旋門賞のみ 1A:地方9R相当
例えば、7月1週分のデータは0x29CCD以下の28バイトであり
16 17 13 15 14 12 10 11 18 0E ... 08

最初が 16 = 関西8R = 阪急杯 (G3)
2番目 17 = 地方8R = 札幌日経オープン (OP)
最後は 08 = 地方3R = 3歳新馬

end: 0x290F63
???

0x291036 : G1優先出走/必要本賞金テーブル : 66bytes

各6バイトで10レース分の定義をしている。最後の1つは空データ。
それぞれ以下のように2バイト数値が3データのセットになっている。
byte[0-1] : レース名コード
byte[2-3] : 必要本賞金(10万円単位)
byte[4-5] : 優先出走フラグbit
 保有馬のデータ先頭+30h (7E2AA6からにデータがある馬の場合は7E2AD6)の
 ここで指定されたbit が1 であるときに優先出走(本賞金制限無視)になる。
例えば、4番目のデータは 48 02 78 00 08 00 の6バイトだが
 0x0248 = レースコード584 -> 皐月賞
 0x0078 = 120 -> 本賞金1200万円
 0x0008 -> 優先出走管理bit は0x08 (下から4bit目)

end: 0x291077
???

0x2910A4 : 開催競馬場テーブル : 48bytes

各4バイトで1月から12月の開催競馬場を定義している。
byte[0] : 関東開催の競馬場番号
byte[1] : 関西開催の競馬場番号
byte[2] : 地方開催の競馬場番号
byte[3] : 未使用
 0xFF は開催なし

end: 0x2910D3
???

0x291187 : レース属性データ : 604bytes

レース名コードの順に 各1バイトで全604レースの属性を定義している。
MMMJSSYY
M (bit 7-5) : 賞金クラスコード (新馬~オープン)
J (bit 4) : 内国産限定フラグ( 1 = 父内国産限定)
S (bit 3-2) : 性別 0:制限なし 1:牝馬限定 2:牝馬禁止(未使用?) 3:セン禁止(牡牝限定)
Y (bit 1-0) : 年齢 0:3歳 1:4歳 2:5歳上 3:4歳上
end: 0x2913E2

0x2913F3 : レース重量条件 : 604bytes

レース名コードの順に 各1バイトで全604レースの重量条件を定義している。
数値は0~36の重量条件コードによる表現。

計算内容は0x29302Fからのテーブル, 表示内容は0x20F36Eからのテーブルに依存する。

end: 0x29163E
???

0x29302F : 負担重量処理関数ポインタ : 74bytes

重量条件コードごとに2バイトのデータ。
その条件にて負担重量の計算を行うプログラムのポインタを示している。
例) 冒頭2バイト = EA B2 = 0xB2EA, 1つ進めて0xB2EB
 → 92/B2EB からの関数にジャンプ
なお、重量条件コード2の「牡馬57kg牝馬55kg」と牝馬戦で使われるコード3の「55kg」など
表記は違うが実質同じ条件のものは同じ数値→同じ処理が行われるようになっている。

end: 0x293078
???

0x29325D : 負担重量計算用定数 : 56bytes

本賞金による負担重量の計算に使う定数を3歳から9歳までに対して各4バイト数値で定義。
単位は10万円。
2C 01 2C 01 90 01 F4 01 F4 01 F4 01 F4 01
→ 3000 3000 4000 5000 5000 5000 5000
なお、レース条件によっては年齢を1つシフトして(最初のデータを4歳に適用)使うこともある。

end: 0x293294
???

0x293726 : 出走傾向用の距離分類 : 32bytes

芝、ダートについて16byteずつ0-15の距離コード
に対応する距離のレースがライバル馬の出走傾向を決める際にどのカテゴリに分類されるかを定義
00 : 芝単距離
04 : 芝マイル
08 : 芝中距離
0C : 芝長距離
10 : ダ短距離
14 : ダ長距離
例) 冒頭3byteが0x00なので芝の距離コード0~2 (1000m, 1200m, 1400m)が芝短距離扱いになる。

end: 0x293745

0x293746 : 出走傾向テーブル : 24bytes

上記の6つの各距離分類について、それぞれ4byteで
00 : ダート好み
01 : 短距離好み
02 : 中距離好み
03 : 長距離好み
の出走傾向が設定された馬が出走しやすくなる度合いを格納しているテーブル

例) 冒頭4byteは18 38 28 00 なので、芝単距離レースには
 短距離好みの馬が出やすく(38h)、長距離好みの馬は出にくい(00h)

end: 0x29375D

0x29375E : 性別と出走条件の対応 : 16bytes

レースの性別制限(0,1,2,3)に対して、性別(牡,牝,セン,未定義)が出走可能か
4x4byte で表現している。
その結果 0:制限なし 1:牝馬限定 2:牝馬禁止(未使用?) 3:セン禁止(牡牝限定)となる。

end: 0x29376D

0x29376E : 馬齢と出走条件の対応 : 28bytes

3歳から9歳まで各4バイトで
3歳,4歳,5歳上,4歳上のレースに出走不能な場合は0x00
出走可能な場合はオープン馬の出走優先度の数値が入る。

end: 0x293789

0x29378A : G1レース登録頭数テーブル : 40bytes

レース名コードの順に 阪神3歳牝馬Sから凱旋門賞まで、それぞれ20レース分、各1バイト。
0x29378A ~ : 最小登録頭数
0x29379E ~ : 最大登録頭数 + 1

end: 0x2937B1

0x2937B2 : 登録馬数 100分率テーブル : 66bytes

0-5のIndexに対して、登録馬数が6~16頭になる確率のテーブル。(6 x 11 byte)
0-99の乱数と比較を行うことで100分率での分岐に使用

end: 0x2937F3

0x2937F4 : 登録馬数インデックス : 48bytes

新馬→未勝利→500万→900万→1500万→OPEN のクラス順に
それぞれ3歳→4歳→5歳上→4歳 の計24カテゴリについて各2バイトのデータ。
1バイト目 : 登録馬数インデックス(大きいほど出走馬数が多くなりやすい), 0~5の数値
2バイト目 : 距離コードがこの数値以上の長距離で登録馬数が少なくなる
「5歳上新馬」、「3歳1500万」のように存在しないカテゴリ相当の場所は0x00, 0x00 で埋められている。

end: 0x293823

0x293824 : 騎手の地方転戦テーブル : 160bytes

各騎手ごとに与えられている0~9の地方グループについて、各月に基本的にどの地方で騎乗するかを定義。
各グループごとに16バイト、最初の12バイトが1~12月の地域、最後の4バイトは不使用。
0x00 : 関東
0x01 : 関西
0x02 : 地方
0x3C : 短期免許 関東
0x3D : 短期免許 関西
0xFF : なし
各グループのおおまかな説明
0:常に関東 1:常に関西 2:関東or地方 3:関西or地方 4:関東,夏は地方 5:関西,夏は地方
6:ムンロ専用 7:クロップ専用 8:ロバーツ専用 9:ペリエ専用

end: 0x2938C3
???

0x293FE3 : 輸送判定テーブル: 20bytes

競馬場番号の順に各2バイト。
出走登録時に美浦, 栗東に居る馬の輸送条件を定義
0 : 輸送なし
1 : 当日輸送
2 : 調教済みなら当日輸送
3 : 現地入厩

end: 0x293FF6

0x293FF7 : 馬齢と出走条件の対応(自馬用) : 12bytes

3歳から5歳上まで各4バイトで
3歳,4歳,5歳上,4歳上のレースに出走不能な場合は0x04(エラーメッセージコード)
出走可能な場合は0x00の数値が入る。

end: 0x294002

0x294003 : 出走可能クラステーブル(自馬用) : 48bytes

レースの賞金クラスコード 0(新馬)~5(オープン)に対して8バイト。
所有馬の賞金クラスコードごとに出走許可になるかあるいはどのメッセージで断られるかを定義。
最後の各2バイトは不使用。
00 : クラス合致, 出走許可
FF : 格上挑戦
02 : 新馬→未勝利 (渋られるが出走は可能)
03, 04 : 出走不可 (エラーメッセージコード)

end: 0x294032

0x294033 : 性別と出走条件の対応(自馬用) : 12bytes

レースの性別制限(0,1,2,3)に対して、性別(牡,牝,セン,未定義)が出走可能か
4x4byte で表現している。
その結果 0:制限なし 1:牝馬限定 2:牝馬禁止(未使用?) 3:セン禁止(牡牝限定)となる。
出走可能な場合は0x00の数値、出走不能な場合は0x05-0x07(エラーメッセージコード)

end: 0x294042
???

0x2A0000 : 馬名データ : 13130bytes

繁殖牝馬名, 種牡馬名, 系統名, 血統表示用の馬名が計1530個格納されている。
(空白も存在する)
[格納順]
 繁殖牝馬 ポテトグラタン→...→サヨナラ→たぼくじょうせいさんば
 種牡馬 ノーザンテースト→...→マチカネイワシミズ→持込/パス種牡馬
 系統名
 血統表示馬名(先祖) 基本的にアイウエオ順

 0x2A0000 - 0x2A0BF7 : ポインタ部 3064byte
  2byte表現で後のデータ本体部での名前の区切り位置を指定。
  例: 0x2A0002 -> 0x0007, 0x2A0004 -> 0x000F なので2つ目のデータは
  先頭から7バイト進んだ位置から15-7 = 8バイト分。

 0x2A0BF8 - 0x2A0BFF : ブランク(0xFF) 8byte

 0x2A0C00 - 0x2A3349 : データ本体部 10058byte
通常の文字コード表現。
可変長の文字列で連続して格納されている。
ポテトグラタンスクールサンデー...
end: 0x2A3349
0x2A334A : ブランク : 182bytes
???
0x2AFD40 : ブランク : 704bytes

0x2B0000 : フォントデータ(16 x 16 1BPP) : 32256bytes

16x16サイズのフォントデータ。文字コード順に並んでいる。
32バイト x (240 + 256*3)文字
最初の240要素が基本セット、0x10 - 0xFF相当
 0x10 - 0xFB : 基本セット(英数,カナ,かな)+少数の記号と漢字
 0xFC - 0xFF : 拡張セットへのエスケープ(フォントは空欄)
次の256要素が0xFCXXで表される拡張文字セット
 0xFC00 - 0xFCFF : 主にレース名用の漢字
次の256要素が0xFDXXで表される拡張文字セット
 0xFD00 - 0xFDFF : 主にレース名や実況用の漢字
次の256要素が0xFEXXで表される拡張文字セット
 0xFE00 - 0xFEFF : 主にメッセージ用の漢字
end: 0x2B7DFF
0x2B7E00 : ブランク : 512bytes
???

0x2BD63C : フォントデータ追加(16 x 16 1BPP) : 8192bytes

16x16サイズのフォントデータ。文字コード順に並んでいる。
おそらく0x2B0000 に入りきらなかった分。
32バイト x 256文字
0xFFXXで表される拡張文字セット
 0xFF00 - 0xFF8E : 主にメッセージ用の漢字
文字は0xFF8Eまでだが、0xFF8F以降用の領域も0x00で埋められている。
end: 0x2BF63B
0x2BF63C : ブランク : 2500bytes
???

0x2C0C22 : 番組表表示データ : 2304bytes

2バイトで1レース分の情報
 関東/関西は各9R, 地方は各8R, 地方開催のない月の分は切り詰めで無効データのスペースはない
 関東 2 x 9 x 4 x 12 = 864bytes
 関西 2 x 9 x 4 x 12 = 864bytes
 地方 2 x 8 x 4 x 9 = 576bytes

 格納順 : 関東1月1週1R → 9R → 関東1月2週1R → ... → 関東12月4週9R
     → 関西1月1週1R → ... → 関西12月4週9R
     → 地方2月1週1R → 8R ... → 地方12月4週8R
2バイトで下位8bit→上位8bit の順に格納
XGGGRPPPPPDLLLLL
L (bit 4-0) : 距離コード (5bitで17種類ある芝ダート兼用のもの)
D (bit 5) : 左側マーク 0:なし 1:D(ダート)
P (bit 10-6) : 表示Y位置(仕切り線の分も考慮された画面上の位置)
R (bit 11) : レース番号が赤になる(牝馬限定)
G (bit 14-12) : 右側マーク 0:なし 1:I 2:II 3:III 4:S 5:H 6:父
X (bit 15) : 未使用
end: 0x2C1521

0x2C1522 : レース名 : 5321bytes

604レース分のレース名が格納されている。 604レース目は "???" なので実質603レース分。

 0x2C1522 - 0x2C252D : データ本体部
通常の文字コード表現。
可変長の文字列で連続して格納されている。
3歳新馬3歳新馬(牝)3歳新馬(父)3歳未勝利...
 0x2C252E - 0x2C29E7: ポインタ部
  2byte表現で前のテーブルでの各レースの区切り位置を指定。
  例: 0x2C2530 -> 0x0007, 0x2C2532 -> 0x0010 なので2つ目のデータは
  先頭から7バイト進んだ位置から16-7 = 9バイト分。

 0x2C29E8-0x2C29EA : 最後のポインタの値(0x100C)を繰り返すように
  0C 10 0C の3バイトが入っている。
  おそらくは意味のないデータと思われる。

end: 0x2C29EA

0x2C29EB : セリフデータ : 12754bytes

レース中の実況や、厩舎・牧場でのコメントなどセリフのデータが格納されている。
ポインタ部の長さから全部で505文が格納されているはず。

 0x2C29EB - 0x2C57C8 : データ本体部
可変長の文字列で連続して格納されている。
通常の文字コード表現だが、以下の特殊な制御がある。

0x20 : スペース
0x0F : 改行。
0x01-0x08は文字列/変数の挿入
 0x01, 0x02 : 馬名の文字列
 0x03, 0x04 : 数字(馬番など1~2桁のもの)
 0x05 : 数字(金額など桁数多めのもの)
 0x06 : その他文字列(帽子の色など)
 0x07 : 騎手名の文字列
 0x08 : レース名の文字列
 0x09 - 0x0E : 表示タイミングにポーズを入れる?

例 : 内から<02>が<0f>先頭をうかがいますが<02>が<0f>外からかわして行きました
 0x2C57C9 - 0x2C5BBC: ポインタ部
  2byte表現で前のテーブルでの文章の区切り位置を指定。
  例: 0x2C57CB -> 0x000A, 0x2C57CD -> 0x0014 なので2つ目のデータは
  先頭から10バイト進んだ位置から20-10 = 10バイト分
  →「さあスタートしました」

end: 0x2C5BBC

0x2C5BBD : その他文字列 : 444bytes

競馬場名、毛色などセリフ以外の主に短い文字列が格納されている。
通常の文字コード表現。
可変長で要素区切りは0xFF,0xFF の2バイト
例) 東京(0xFF)(0xFF)中山(0xFF)(0xFF)...
end: 0x2C5D78

0x2C5D79 : 受胎状況の文字列 : 36bytes

通常の文字コード表現。
各9バイトで余った部分は0x00で埋められている。
空胎, 不受胎, 受胎, 不明 の4つ
end: 0x2C5D9C

0x2C5D9D : 帽子の色の文字列 : 64bytes

通常の文字コード表現。
各8バイトで余った部分は0x00で埋められている。
白い黒い赤い青い黄色のグリーンのオレンジのピンクの: 計8つ
end: 0x2C5DDC

0x2C5DDD : その他文字列 : 2962bytes

騎手コメント,重量条件などの文字列が格納されている。
通常の文字コード表現。
可変長で要素区切りは0xFF,0xFF の2バイト
「大舞台になるほど強い天才ジョッキー」
「馬齢重量本賞金800万毎1kg増」
 といった文字列を格納
end: 0x2C696E
???

0x2C6A03 : 騎手名 : 1440bytes

騎手名 (文字コード)
6バイト(漢字最大3文字)、騎手のID順に並んでいる。 岡部→武豊→...
計240人分 (末尾3人分は「?」という名前)

end: 0x2C6FA2

0x2C6FA3 : その他文字列 : 466bytes

厩舎名,厩舎コメント,出走条件などの文字列が格納されている。
通常の文字コード表現。
可変長で要素区切りは0xFF,0xFF の2バイト
「馬に無理をさせず高勝率を誇る」
「5歳以上牝」
 といった文字列を格納
end: 0x2C7174

0x2C7175 : 小サイズフォントデータ(8 x 8 1BPP) : 1904bytes

8x8サイズのフォントデータ。
0x10 = "0"から文字コード順に並んでいる。
16x16サイズの文字コードの基本セットとほとんど同じ。
8バイト x 238文字
end: 0x2C78E4
0x2C78E5 : ブランク : 1820bytes
???
inserted by FC2 system