diff -r -c -N old/emu/cheat.c src/emu/cheat.c *** old/emu/cheat.c Thu Aug 2 11:20:02 2007 --- src/emu/cheat.c Thu Aug 2 11:21:22 2007 *************** *** 525,530 **** --- 525,531 ---- EXPORTED VARIABLES ***************************************************************************/ + int he_did_cheat = 0; static const char * cheatfile = NULL; /*************************************************************************** *************** *** 1461,1466 **** --- 1462,1468 ---- void cheat_init(running_machine *machine) { /* ----- initialize lists ----- */ + he_did_cheat = 0; cheatList = NULL; cheatListLength = 0; *************** *** 11173,11178 **** --- 11175,11181 ---- } entry->flags |= kCheatFlag_Active; + he_did_cheat = 1; } /*-------------------------------------------------------------------------------------- diff -r -c -N old/emu/cheat.h src/emu/cheat.h *** old/emu/cheat.h Sun Feb 18 16:47:38 2007 --- src/emu/cheat.h Thu Aug 2 11:21:22 2007 *************** *** 16,21 **** --- 16,23 ---- #include "mamecore.h" + extern int he_did_cheat; + void cheat_init(running_machine *machine); int cheat_menu(int selection); diff -r -c -N old/emu/emu.mak src/emu/emu.mak *** old/emu/emu.mak Thu Aug 2 11:19:46 2007 --- src/emu/emu.mak Thu Aug 2 11:21:22 2007 *************** *** 42,47 **** --- 42,48 ---- $(EMUOBJ)/emuopts.o \ $(EMUOBJ)/fileio.o \ $(EMUOBJ)/hash.o \ + $(EMUOBJ)/hiscore.o \ $(EMUOBJ)/info.o \ $(EMUOBJ)/input.o \ $(EMUOBJ)/inputseq.o \ diff -r -c -N old/emu/emuopts.c src/emu/emuopts.c *** old/emu/emuopts.c Thu Aug 2 11:19:52 2007 --- src/emu/emuopts.c Thu Aug 2 11:21:22 2007 *************** *** 57,62 **** --- 57,63 ---- /* filename options */ { NULL, NULL, OPTION_HEADER, "CORE FILENAME OPTIONS" }, { "cheat_file", "cheat.dat", 0, "cheat filename" }, + { "hiscore_directory", "hi", 0, "directory to save hiscores" }, /* state/playback options */ { NULL, NULL, OPTION_HEADER, "CORE STATE/PLAYBACK OPTIONS" }, diff -r -c -N old/emu/emuopts.h src/emu/emuopts.h *** old/emu/emuopts.h Thu Aug 2 11:19:52 2007 --- src/emu/emuopts.h Thu Aug 2 11:21:22 2007 *************** *** 57,62 **** --- 57,63 ---- /* core filename options */ #define OPTION_CHEAT_FILE "cheat_file" + #define OPTION_HISCORE_DIRECTORY "hiscore_directory" /* core state/playback options */ #define OPTION_STATE "state" diff -r -c -N old/emu/fileio.h src/emu/fileio.h *** old/emu/fileio.h Thu Aug 2 11:20:02 2007 --- src/emu/fileio.h Thu Aug 2 11:21:22 2007 *************** *** 55,60 **** --- 55,61 ---- #define SEARCHPATH_SCREENSHOT OPTION_SNAPSHOT_DIRECTORY #define SEARCHPATH_MOVIE OPTION_SNAPSHOT_DIRECTORY #define SEARCHPATH_COMMENT OPTION_COMMENT_DIRECTORY + #define FILETYPE_HIGHSCORE OPTION_HISCORE_DIRECTORY diff -r -c -N old/emu/hiscore.c src/emu/hiscore.c *** old/emu/hiscore.c Thu Jan 1 00:00:00 1970 --- src/emu/hiscore.c Thu Aug 2 11:34:36 2007 *************** *** 0 **** --- 1,389 ---- + /*************************************************************************** + + hiscore.c + + Manages the hiscore system. + + Copyright (c) 1996-2006, Nicola Salmoria and the MAME Team. + Visit http://mamedev.org for licensing and usage restrictions. + + ***************************************************************************/ + + #include "driver.h" + #include "hiscore.h" + #include "cheat.h" + + #define MAX_CONFIG_LINE_SIZE 48 + + #define VERBOSE 0 + + static mame_timer *timer; + + #if VERBOSE + #define LOG(x) logerror x + #else + #define LOG(x) + #endif + + const char *db_filename = "hiscore.dat"; /* high score definition file */ + + + struct _memory_range + { + UINT32 cpu, addr, num_bytes, start_value, end_value; + struct _memory_range *next; + }; + typedef struct _memory_range memory_range; + + + static struct + { + int hiscores_have_been_loaded; + memory_range *mem_range; + } state; + + + static int is_highscore_enabled(void) + { + /* disable high score when record/playback is on */ + if (Machine->record_file != NULL || Machine->playback_file != NULL) + return FALSE; + + /* disable high score when cheats are used */ + if (he_did_cheat != 0) + return FALSE; + + return TRUE; + } + + + + /*****************************************************************************/ + + static void copy_to_memory (int cpu, int addr, const UINT8 *source, int num_bytes) + { + int i; + for (i=0; i='0' && c<='9') + { + digit = c-'0'; + } + else if (c>='a' && c<='f') + { + digit = 10+c-'a'; + } + else if (c>='A' && c<='F') + { + digit = 10+c-'A'; + } + else + { + /* not a hexadecimal digit */ + /* safety check for premature EOL */ + if (!c) string = NULL; + break; + } + result = result*16 + digit; + } + *pString = string; + } + return result; + } + + /* given a line in the hiscore.dat file, determine if it encodes a + memory range (or a game name). + For now we assume that CPU number is always a decimal digit, and + that no game name starts with a decimal digit. + */ + static int is_mem_range (const char *pBuf) + { + char c; + for(;;) + { + c = *pBuf++; + if (c == 0) return 0; /* premature EOL */ + if (c == ':') break; + } + c = *pBuf; /* character following first ':' */ + + return (c>='0' && c<='9') || + (c>='a' && c<='f') || + (c>='A' && c<='F'); + } + + /* matching_game_name is used to skip over lines until we find : */ + static int matching_game_name (const char *pBuf, const char *name) + { + while (*name) + { + if (*name++ != *pBuf++) return 0; + } + return (*pBuf == ':'); + } + + /*****************************************************************************/ + + /* safe_to_load checks the start and end values of each memory range */ + static int safe_to_load (void) + { + memory_range *mem_range = state.mem_range; + while (mem_range) + { + if (cpunum_read_byte (mem_range->cpu, mem_range->addr) != + mem_range->start_value) + { + return 0; + } + if (cpunum_read_byte (mem_range->cpu, mem_range->addr + mem_range->num_bytes - 1) != + mem_range->end_value) + { + return 0; + } + mem_range = mem_range->next; + } + return 1; + } + + /* hiscore_free disposes of the mem_range linked list */ + static void hiscore_free (void) + { + memory_range *mem_range = state.mem_range; + while (mem_range) + { + memory_range *next = mem_range->next; + free (mem_range); + mem_range = next; + } + state.mem_range = NULL; + } + + static void hiscore_load (void) + { + file_error filerr; + mame_file *f; + astring *fname; + if (is_highscore_enabled()) + { + fname = astring_assemble_2(astring_alloc(), Machine->gamedrv->name, ".hi"); + filerr = mame_fopen(FILETYPE_HIGHSCORE, astring_c(fname), OPEN_FLAG_READ, &f); + astring_free(fname); + state.hiscores_have_been_loaded = 1; + LOG(("hiscore_load\n")); + if (filerr == FILERR_NONE) + { + memory_range *mem_range = state.mem_range; + LOG(("loading...\n")); + while (mem_range) + { + UINT8 *data = malloc (mem_range->num_bytes); + if (data) + { + /* this buffer will almost certainly be small + enough to be dynamically allocated, but let's + avoid memory trashing just in case + */ + mame_fread (f, data, mem_range->num_bytes); + copy_to_memory (mem_range->cpu, mem_range->addr, data, mem_range->num_bytes); + free (data); + } + mem_range = mem_range->next; + } + mame_fclose (f); + } + } + } + + static void hiscore_save (void) + { + file_error filerr; + mame_file *f; + astring *fname; + if (is_highscore_enabled()) + { + fname = astring_assemble_2(astring_alloc(), Machine->gamedrv->name, ".hi"); + filerr = mame_fopen(FILETYPE_HIGHSCORE, astring_c(fname), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE, &f); + astring_free(fname); + LOG(("hiscore_save\n")); + if (filerr == FILERR_NONE) + { + memory_range *mem_range = state.mem_range; + LOG(("saving...\n")); + while (mem_range) + { + UINT8 *data = malloc (mem_range->num_bytes); + if (data) + { + /* this buffer will almost certainly be small + enough to be dynamically allocated, but let's + avoid memory trashing just in case + */ + copy_from_memory (mem_range->cpu, mem_range->addr, data, mem_range->num_bytes); + mame_fwrite(f, data, mem_range->num_bytes); + free (data); + } + mem_range = mem_range->next; + } + mame_fclose(f); + } + } + } + + + /* call hiscore_update periodically (i.e. once per frame) */ + static void hiscore_periodic (int param) + { + if (state.mem_range) + { + if (!state.hiscores_have_been_loaded) + { + if (safe_to_load()) + { + hiscore_load(); + mame_timer_enable(timer, FALSE); + } + } + } + } + + static TIMER_CALLBACK( hiscore_periodic_callback ) + { + hiscore_periodic(param); + } + + + /* call hiscore_close when done playing game */ + void hiscore_close (running_machine *machine) + { + if (state.hiscores_have_been_loaded) hiscore_save(); + hiscore_free(); + } + + + /*****************************************************************************/ + /* public API */ + + /* call hiscore_open once after loading a game */ + void hiscore_init (running_machine *machine) + { + file_error filerr; + const char *name = machine->gamedrv->name; + memory_range *mem_range = state.mem_range; + mame_file *f; + state.hiscores_have_been_loaded = 0; + + while (mem_range) + { + cpunum_write_byte( + mem_range->cpu, + mem_range->addr, + ~mem_range->start_value + ); + + cpunum_write_byte( + mem_range->cpu, + mem_range->addr + mem_range->num_bytes-1, + ~mem_range->end_value + ); + mem_range = mem_range->next; + } + + state.mem_range = NULL; + filerr = mame_fopen(NULL, db_filename, OPEN_FLAG_READ, &f); + if (filerr == FILERR_NONE) + { + char buffer[MAX_CONFIG_LINE_SIZE]; + enum { FIND_NAME, FIND_DATA, FETCH_DATA } mode; + mode = FIND_NAME; + + while (mame_fgets (buffer, MAX_CONFIG_LINE_SIZE, f)) + { + if (mode==FIND_NAME) + { + if (matching_game_name (buffer, name)) + { + mode = FIND_DATA; + LOG(("hs config found!\n")); + } + } + else if (is_mem_range (buffer)) + { + const char *pBuf = buffer; + memory_range *mem_range = malloc(sizeof(memory_range)); + if (mem_range) + { + mem_range->cpu = hexstr2num (&pBuf); + mem_range->addr = hexstr2num (&pBuf); + mem_range->num_bytes = hexstr2num (&pBuf); + mem_range->start_value = hexstr2num (&pBuf); + mem_range->end_value = hexstr2num (&pBuf); + + mem_range->next = NULL; + { + memory_range *last = state.mem_range; + while (last && last->next) last = last->next; + if (last == NULL) + { + state.mem_range = mem_range; + } + else + { + last->next = mem_range; + } + } + + mode = FETCH_DATA; + } + else + { + hiscore_free(); + break; + } + } + else + { + /* line is a game name */ + if (mode == FETCH_DATA) break; + } + } + mame_fclose (f); + } + + timer = mame_timer_alloc(hiscore_periodic_callback); + mame_timer_adjust(timer, MAME_TIME_IN_HZ(60), 0, MAME_TIME_IN_HZ(60)); + add_exit_callback(machine, hiscore_close); + } diff -r -c -N old/emu/hiscore.h src/emu/hiscore.h *** old/emu/hiscore.h Thu Jan 1 00:00:00 1970 --- src/emu/hiscore.h Thu Aug 2 11:21:22 2007 *************** *** 0 **** --- 1,19 ---- + /*************************************************************************** + + hiscore.h + + Manages the hiscore system. + + Copyright (c) 1996-2006, Nicola Salmoria and the MAME Team. + Visit http://mamedev.org for licensing and usage restrictions. + + ***************************************************************************/ + + #pragma once + + #ifndef __HISCORE_H__ + #define __HISCORE_H__ + + void hiscore_init( running_machine *machine ); + + #endif /* __HISCORE_H__ */ diff -r -c -N old/emu/inptport.c src/emu/inptport.c *** old/emu/inptport.c Thu Aug 2 11:20:02 2007 --- src/emu/inptport.c Thu Aug 2 11:21:22 2007 *************** *** 963,969 **** INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_ON_SCREEN_DISPLAY,"On Screen Display", SEQ_DEF_1(KEYCODE_TILDE) ) INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_DEBUG_BREAK, "Break in Debugger", SEQ_DEF_1(KEYCODE_TILDE) ) INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_CONFIGURE, "Config Menu", SEQ_DEF_1(KEYCODE_TAB) ) ! INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_PAUSE, "Pause", SEQ_DEF_1(KEYCODE_P) ) INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_RESET_MACHINE, "Reset Game", SEQ_DEF_2(KEYCODE_F3, KEYCODE_LSHIFT) ) INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_SOFT_RESET, "Soft Reset", SEQ_DEF_3(KEYCODE_F3, SEQCODE_NOT, KEYCODE_LSHIFT) ) INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_SHOW_GFX, "Show Gfx", SEQ_DEF_1(KEYCODE_F4) ) --- 963,969 ---- INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_ON_SCREEN_DISPLAY,"On Screen Display", SEQ_DEF_1(KEYCODE_TILDE) ) INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_DEBUG_BREAK, "Break in Debugger", SEQ_DEF_1(KEYCODE_TILDE) ) INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_CONFIGURE, "Config Menu", SEQ_DEF_1(KEYCODE_TAB) ) ! INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_PAUSE, "Pause", SEQ_DEF_3(KEYCODE_P, SEQCODE_OR, KEYCODE_TAB) ) INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_RESET_MACHINE, "Reset Game", SEQ_DEF_2(KEYCODE_F3, KEYCODE_LSHIFT) ) INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_SOFT_RESET, "Soft Reset", SEQ_DEF_3(KEYCODE_F3, SEQCODE_NOT, KEYCODE_LSHIFT) ) INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_SHOW_GFX, "Show Gfx", SEQ_DEF_1(KEYCODE_F4) ) *************** *** 983,989 **** INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_END, "UI End", SEQ_DEF_1(KEYCODE_END) ) INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_PAGE_UP, "UI Page Up", SEQ_DEF_1(KEYCODE_PGUP) ) INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_PAGE_DOWN, "UI Page Down", SEQ_DEF_1(KEYCODE_PGDN) ) ! INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_SELECT, "UI Select", SEQ_DEF_3(KEYCODE_ENTER, SEQCODE_OR, INDEXED(JOYCODE_BUTTON1, 0)) ) INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_CANCEL, "UI Cancel", SEQ_DEF_1(KEYCODE_ESC) ) INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_CLEAR, "UI Clear", SEQ_DEF_1(KEYCODE_DEL) ) INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_ZOOM_IN, "UI Zoom In", SEQ_DEF_1(KEYCODE_EQUALS) ) --- 983,989 ---- INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_END, "UI End", SEQ_DEF_1(KEYCODE_END) ) INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_PAGE_UP, "UI Page Up", SEQ_DEF_1(KEYCODE_PGUP) ) INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_PAGE_DOWN, "UI Page Down", SEQ_DEF_1(KEYCODE_PGDN) ) ! INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_SELECT, "UI Select", SEQ_DEF_3(KEYCODE_1, SEQCODE_OR, INDEXED(JOYCODE_BUTTON1, 0)) ) INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_CANCEL, "UI Cancel", SEQ_DEF_1(KEYCODE_ESC) ) INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_CLEAR, "UI Clear", SEQ_DEF_1(KEYCODE_DEL) ) INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_ZOOM_IN, "UI Zoom In", SEQ_DEF_1(KEYCODE_EQUALS) ) diff -r -c -N old/emu/mame.c src/emu/mame.c *** old/emu/mame.c Thu Aug 2 11:20:02 2007 --- src/emu/mame.c Thu Aug 2 11:21:22 2007 *************** *** 78,83 **** --- 78,84 ---- #include "driver.h" #include "config.h" #include "cheat.h" + #include "hiscore.h" #include "debugger.h" #include "profiler.h" #include "render.h" *************** *** 350,356 **** nvram_load(); /* display the startup screens */ ! ui_display_startup_screens(firstrun, !settingsloaded); firstrun = FALSE; /* start resource tracking; note that soft_reset assumes it can */ --- 351,357 ---- nvram_load(); /* display the startup screens */ ! ui_display_startup_screens(firstrun, !1); firstrun = FALSE; /* start resource tracking; note that soft_reset assumes it can */ *************** *** 1498,1503 **** --- 1499,1505 ---- /* initialize miscellaneous systems */ saveload_init(machine); + hiscore_init(machine); if (options_get_bool(mame_options(), OPTION_CHEAT)) cheat_init(machine); } diff -r -c -N old/emu/profiler.c src/emu/profiler.c *** old/emu/profiler.c Wed May 30 19:49:10 2007 --- src/emu/profiler.c Thu Aug 2 11:21:22 2007 *************** *** 137,142 **** --- 137,143 ---- "Sound ", "Mixer ", "Callbck", + "Hiscore", "Input ", "Movie ", "Logerr ", diff -r -c -N old/emu/profiler.h src/emu/profiler.h *** old/emu/profiler.h Sun Feb 11 20:43:02 2007 --- src/emu/profiler.h Thu Aug 2 11:21:22 2007 *************** *** 39,44 **** --- 39,45 ---- PROFILER_SOUND, PROFILER_MIXER, PROFILER_TIMER_CALLBACK, + PROFILER_HISCORE, PROFILER_INPUT, /* input.c and inptport.c */ PROFILER_MOVIE_REC, /* movie recording */ PROFILER_LOGERROR, /* logerror */ diff -r -c -N old/emu/ui.c src/emu/ui.c *** old/emu/ui.c Thu Aug 2 11:20:02 2007 --- src/emu/ui.c Thu Aug 2 11:21:22 2007 *************** *** 338,348 **** --- 338,350 ---- switch (state) { case 0: + break; if (show_disclaimer && sprintf_disclaimer(messagebox_text)) ui_set_handler(handler_messagebox_ok, 0); break; case 1: + break; if (show_warnings && sprintf_warnings(messagebox_text)) { ui_set_handler(handler_messagebox_ok, 0); *************** *** 352,357 **** --- 354,360 ---- break; case 2: + break; if (show_gameinfo && sprintf_game_info(messagebox_text)) ui_set_handler(handler_messagebox_anykey, 0); break; diff -r -c -N old/emu/video.c src/emu/video.c *** old/emu/video.c Thu Aug 2 11:20:02 2007 --- src/emu/video.c Thu Aug 2 11:21:22 2007 *************** *** 1930,1936 **** viddata->crosshair_needed |= 1 << ipt->player; /* all visible by default */ ! viddata->crosshair_visible = viddata->crosshair_needed; /* loop over each player and load or create a bitmap */ for (player = 0; player < MAX_PLAYERS; player++) --- 1930,1938 ---- viddata->crosshair_needed |= 1 << ipt->player; /* all visible by default */ ! // viddata->crosshair_visible = viddata->crosshair_needed; ! // Not for me ;-) ! viddata->crosshair_visible = 0; /* loop over each player and load or create a bitmap */ for (player = 0; player < MAX_PLAYERS; player++)