2014-08-06 22:17:42 +00:00
|
|
|
#!/usr/bin/env python2
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
# usage: gen_romdb.py mupen64plus.ini
|
|
|
|
import io
|
|
|
|
import os
|
|
|
|
import re
|
|
|
|
import sys
|
|
|
|
from pprint import pprint # for debugging
|
|
|
|
from ConfigParser import ConfigParser
|
|
|
|
from collections import OrderedDict
|
|
|
|
|
|
|
|
OUTPUT_FILE='rom_luts.c'
|
|
|
|
|
|
|
|
if len(sys.argv) < 2:
|
|
|
|
print("usage: %s mupen64plus.ini" % sys.argv[0])
|
|
|
|
sys.exit(0)
|
|
|
|
|
|
|
|
gConf = ConfigParser()
|
|
|
|
gGames = dict()
|
|
|
|
|
|
|
|
def get_save_type(t):
|
|
|
|
return t.upper().replace(' ', '_')
|
|
|
|
|
|
|
|
sys.stderr.write("Parsing " + sys.argv[1] + "...\n")
|
|
|
|
gConf.readfp(open(sys.argv[1]))
|
|
|
|
gNameRe = re.compile(r'([^(]+)', re.IGNORECASE)
|
|
|
|
|
|
|
|
gEeprom16k = list()
|
2014-12-28 18:17:58 +00:00
|
|
|
gEeprom4k = list()
|
2014-08-06 22:17:42 +00:00
|
|
|
gCountPerOp = list()
|
|
|
|
|
|
|
|
for section in gConf.sections():
|
|
|
|
conf = dict(gConf.items(section))
|
|
|
|
conf['crc'] = conf['crc'].replace(' ', '')
|
|
|
|
conf['simplename'] = gNameRe.search(conf['goodname']).group(0).strip()
|
|
|
|
name = conf['simplename'].lower()
|
|
|
|
|
|
|
|
if not name in gGames:
|
|
|
|
gGames[name] = []
|
|
|
|
|
|
|
|
skip = False
|
|
|
|
for game in gGames[name]:
|
|
|
|
if game['crc'] == conf['crc']:
|
|
|
|
skip = True
|
|
|
|
break
|
|
|
|
|
|
|
|
if not skip:
|
|
|
|
gGames[name].append(conf)
|
|
|
|
|
|
|
|
# order by rom name
|
|
|
|
gGames = OrderedDict(sorted(gGames.items(), key=lambda t: t[0]))
|
|
|
|
|
|
|
|
# detect eeprom16k
|
|
|
|
for _, games in gGames.items():
|
|
|
|
for game in games:
|
|
|
|
if game.get('savetype', '').lower() == 'eeprom 16kb':
|
|
|
|
gEeprom16k.append(game)
|
|
|
|
|
2014-12-28 18:17:58 +00:00
|
|
|
if game.get('savetype', '').lower() == 'eeprom 4kb':
|
|
|
|
gEeprom4k.append(game)
|
|
|
|
|
2014-08-06 22:17:42 +00:00
|
|
|
if 'countperop' in game:
|
|
|
|
gCountPerOp.append(game)
|
|
|
|
|
|
|
|
print("Wrote " + OUTPUT_FILE)
|
|
|
|
romdb = open(OUTPUT_FILE, 'w')
|
|
|
|
romdb.write("/* This file was generated by gen_romdb.py */\n")
|
|
|
|
romdb.write("/* Games that use 16Kbit EEPROM */\n")
|
|
|
|
romdb.write("static const uint64_t lut_ee16k[] = {\n")
|
|
|
|
|
|
|
|
i = 0
|
|
|
|
for game in gEeprom16k:
|
|
|
|
comma = ','
|
|
|
|
|
|
|
|
if i == len(gEeprom16k) - 1:
|
|
|
|
comma = ' '
|
|
|
|
|
|
|
|
romdb.write(' 0x' + game['crc'] + 'ULL' + comma + ' /* ' + game['goodname'] + " */\n")
|
|
|
|
|
|
|
|
i = i + 1
|
|
|
|
|
|
|
|
romdb.write("};\n")
|
|
|
|
|
2014-12-28 18:17:58 +00:00
|
|
|
romdb.write("/* Games that use 4Kbit EEPROM */\n")
|
|
|
|
romdb.write("static const uint64_t lut_ee4k[] = {\n")
|
|
|
|
|
|
|
|
i = 0
|
|
|
|
for game in gEeprom4k:
|
|
|
|
comma = ','
|
|
|
|
|
|
|
|
if i == len(gEeprom4k) - 1:
|
|
|
|
comma = ' '
|
|
|
|
|
|
|
|
romdb.write(' 0x' + game['crc'] + 'ULL' + comma + ' /* ' + game['goodname'] + " */\n")
|
|
|
|
|
|
|
|
i = i + 1
|
|
|
|
|
|
|
|
romdb.write("};\n")
|
|
|
|
|
2014-08-06 22:17:42 +00:00
|
|
|
i = 0
|
|
|
|
|
|
|
|
romdb.write("/* Cycles per emulated instruction (aka CountPerOp) */\n")
|
|
|
|
romdb.write("static const uint64_t lut_cpop[][2] = {\n")
|
|
|
|
for game in gCountPerOp:
|
|
|
|
comma = ','
|
|
|
|
|
|
|
|
if i == len(gEeprom16k) - 1:
|
|
|
|
comma = ' '
|
|
|
|
|
2014-12-28 18:17:58 +00:00
|
|
|
if i == len(gEeprom4k) - 1:
|
|
|
|
comma = ' '
|
|
|
|
|
2014-08-06 22:17:42 +00:00
|
|
|
romdb.write(' { 0x' + game['crc'] + 'ULL, ' + game['countperop'] + ' }' + comma + ' /* ' + game['goodname'] + " */\n")
|
|
|
|
|
|
|
|
romdb.write("};\n")
|
|
|
|
|
|
|
|
romdb.close()
|
|
|
|
|
|
|
|
|