diff options
Diffstat (limited to 'src/emu/machine/generic.c')
-rw-r--r-- | src/emu/machine/generic.c | 261 |
1 files changed, 153 insertions, 108 deletions
diff --git a/src/emu/machine/generic.c b/src/emu/machine/generic.c index 327fd288ec2..77107ffcfb2 100644 --- a/src/emu/machine/generic.c +++ b/src/emu/machine/generic.c @@ -16,37 +16,33 @@ /*************************************************************************** - GLOBAL VARIABLES + FUNCTION PROTOTYPES ***************************************************************************/ -/* These globals are only kept on a machine basis - LBO 042898 */ -UINT32 dispensed_tickets; -UINT32 coin_count[COIN_COUNTERS]; -UINT32 coinlockedout[COIN_COUNTERS]; -static UINT32 lastcoin[COIN_COUNTERS]; - -/* generic NVRAM */ -size_t generic_nvram_size; -UINT8 *generic_nvram; -UINT16 *generic_nvram16; -UINT32 *generic_nvram32; -UINT64 *generic_nvram64; - -/* memory card status */ -static int memcard_inserted; - -/* interrupt status for up to 8 CPUs */ -static UINT8 interrupt_enable[8]; +static void counters_load(running_machine *machine, int config_type, xml_data_node *parentnode); +static void counters_save(running_machine *machine, int config_type, xml_data_node *parentnode); +static void interrupt_reset(running_machine *machine); /*************************************************************************** - FUNCTION PROTOTYPES + TYPE DEFINITIONS ***************************************************************************/ -static void counters_load(running_machine *machine, int config_type, xml_data_node *parentnode); -static void counters_save(running_machine *machine, int config_type, xml_data_node *parentnode); -static void interrupt_reset(running_machine *machine); +struct _generic_machine_private +{ + /* tickets and coin counters */ + UINT32 dispensed_tickets; + UINT32 coin_count[COIN_COUNTERS]; + UINT32 coinlockedout[COIN_COUNTERS]; + UINT32 lastcoin[COIN_COUNTERS]; + + /* memory card status */ + int memcard_inserted; + + /* interrupt status for up to 8 CPUs */ + UINT8 interrupt_enable[8]; +}; @@ -61,8 +57,9 @@ static void interrupt_reset(running_machine *machine); INLINE int interrupt_enabled(const device_config *device) { + generic_machine_private *state = device->machine->generic_machine_data; int cpunum = cpu_get_index(device); - return (cpunum >= ARRAY_LENGTH(interrupt_enable) || interrupt_enable[cpunum]); + return (cpunum >= ARRAY_LENGTH(state->interrupt_enable) || state->interrupt_enable[cpunum]); } @@ -78,33 +75,35 @@ INLINE int interrupt_enabled(const device_config *device) void generic_machine_init(running_machine *machine) { + generic_machine_private *state; int counternum; + + /* allocate our state */ + machine->generic_machine_data = auto_alloc_clear(machine, generic_machine_private); + state = machine->generic_machine_data; /* reset coin counters */ for (counternum = 0; counternum < COIN_COUNTERS; counternum++) { - lastcoin[counternum] = 0; - coinlockedout[counternum] = 0; + state->lastcoin[counternum] = 0; + state->coinlockedout[counternum] = 0; } /* register coin save state */ - state_save_register_item_array(machine, "coin", NULL, 0, coin_count); - state_save_register_item_array(machine, "coin", NULL, 0, coinlockedout); - state_save_register_item_array(machine, "coin", NULL, 0, lastcoin); + state_save_register_item_array(machine, "coin", NULL, 0, state->coin_count); + state_save_register_item_array(machine, "coin", NULL, 0, state->coinlockedout); + state_save_register_item_array(machine, "coin", NULL, 0, state->lastcoin); /* reset NVRAM size and pointers */ - generic_nvram_size = 0; - generic_nvram = NULL; - generic_nvram16 = NULL; - generic_nvram32 = NULL; - generic_nvram64 = NULL; + machine->generic.nvram.ptr.v = NULL; + machine->generic.nvram.size = 0; /* reset memory card info */ - memcard_inserted = -1; + state->memcard_inserted = -1; /* register a reset callback and save state for interrupt enable */ add_reset_callback(machine, interrupt_reset); - state_save_register_item_array(machine, "cpu", NULL, 0, interrupt_enable); + state_save_register_item_array(machine, "cpu", NULL, 0, state->interrupt_enable); /* register for configuration */ config_register(machine, "counters", counters_load, counters_save); @@ -112,7 +111,7 @@ void generic_machine_init(running_machine *machine) /* for memory cards, request save state and an exit callback */ if (machine->config->memcard_handler != NULL) { - state_save_register_global(machine, memcard_inserted); + state_save_register_global(machine, state->memcard_inserted); add_exit_callback(machine, memcard_eject); } } @@ -120,6 +119,35 @@ void generic_machine_init(running_machine *machine) /*************************************************************************** + TICKETS +***************************************************************************/ + +/*------------------------------------------------- + get_dispensed_tickets - return the number of + tickets dispensed +-------------------------------------------------*/ + +int get_dispensed_tickets(running_machine *machine) +{ + generic_machine_private *state = machine->generic_machine_data; + return state->dispensed_tickets; +} + + +/*------------------------------------------------- + increment_dispensed_tickets - increment the + number of dispensed tickets +-------------------------------------------------*/ + +void increment_dispensed_tickets(running_machine *machine, int delta) +{ + generic_machine_private *state = machine->generic_machine_data; + state->dispensed_tickets += delta; +} + + + +/*************************************************************************** COIN COUNTERS ***************************************************************************/ @@ -130,13 +158,14 @@ void generic_machine_init(running_machine *machine) static void counters_load(running_machine *machine, int config_type, xml_data_node *parentnode) { + generic_machine_private *state = machine->generic_machine_data; xml_data_node *coinnode, *ticketnode; /* on init, reset the counters */ if (config_type == CONFIG_TYPE_INIT) { - memset(coin_count, 0, sizeof(coin_count)); - dispensed_tickets = 0; + memset(state->coin_count, 0, sizeof(state->coin_count)); + state->dispensed_tickets = 0; } /* only care about game-specific data */ @@ -152,13 +181,13 @@ static void counters_load(running_machine *machine, int config_type, xml_data_no { int index = xml_get_attribute_int(coinnode, "index", -1); if (index >= 0 && index < COIN_COUNTERS) - coin_count[index] = xml_get_attribute_int(coinnode, "number", 0); + state->coin_count[index] = xml_get_attribute_int(coinnode, "number", 0); } /* get the single tickets node */ ticketnode = xml_get_sibling(parentnode->child, "tickets"); if (ticketnode != NULL) - dispensed_tickets = xml_get_attribute_int(ticketnode, "number", 0); + state->dispensed_tickets = xml_get_attribute_int(ticketnode, "number", 0); } @@ -169,6 +198,7 @@ static void counters_load(running_machine *machine, int config_type, xml_data_no static void counters_save(running_machine *machine, int config_type, xml_data_node *parentnode) { + generic_machine_private *state = machine->generic_machine_data; int i; /* only care about game-specific data */ @@ -177,22 +207,22 @@ static void counters_save(running_machine *machine, int config_type, xml_data_no /* iterate over coin counters */ for (i = 0; i < COIN_COUNTERS; i++) - if (coin_count[i] != 0) + if (state->coin_count[i] != 0) { xml_data_node *coinnode = xml_add_child(parentnode, "coins", NULL); if (coinnode != NULL) { xml_set_attribute_int(coinnode, "index", i); - xml_set_attribute_int(coinnode, "number", coin_count[i]); + xml_set_attribute_int(coinnode, "number", state->coin_count[i]); } } /* output tickets */ - if (dispensed_tickets != 0) + if (state->dispensed_tickets != 0) { xml_data_node *tickets = xml_add_child(parentnode, "tickets", NULL); if (tickets != NULL) - xml_set_attribute_int(tickets, "number", dispensed_tickets); + xml_set_attribute_int(tickets, "number", state->dispensed_tickets); } } @@ -201,15 +231,30 @@ static void counters_save(running_machine *machine, int config_type, xml_data_no coin_counter_w - sets input for coin counter -------------------------------------------------*/ -void coin_counter_w(int num, int on) +void coin_counter_w(running_machine *machine, int num, int on) { - if (num >= COIN_COUNTERS) + generic_machine_private *state = machine->generic_machine_data; + if (num >= ARRAY_LENGTH(state->coin_count)) return; /* Count it only if the data has changed from 0 to non-zero */ - if (on && (lastcoin[num] == 0)) - coin_count[num]++; - lastcoin[num] = on; + if (on && (state->lastcoin[num] == 0)) + state->coin_count[num]++; + state->lastcoin[num] = on; +} + + +/*------------------------------------------------- + coin_counter_get_count - return the coin count + for a given coin +-------------------------------------------------*/ + +int coin_counter_get_count(running_machine *machine, int num) +{ + generic_machine_private *state = machine->generic_machine_data; + if (num >= ARRAY_LENGTH(state->coin_count)) + return 0; + return state->coin_count[num]; } @@ -217,11 +262,26 @@ void coin_counter_w(int num, int on) coin_lockout_w - locks out one coin input -------------------------------------------------*/ -void coin_lockout_w(int num,int on) +void coin_lockout_w(running_machine *machine, int num,int on) { - if (num >= COIN_COUNTERS) + generic_machine_private *state = machine->generic_machine_data; + if (num >= ARRAY_LENGTH(state->coinlockedout)) return; - coinlockedout[num] = on; + state->coinlockedout[num] = on; +} + + +/*------------------------------------------------- + coin_lockout_get_state - return current lockout + state for a particular coin +-------------------------------------------------*/ + +int coin_lockout_get_state(running_machine *machine, int num) +{ + generic_machine_private *state = machine->generic_machine_data; + if (num >= ARRAY_LENGTH(state->coinlockedout)) + return FALSE; + return state->coinlockedout[num]; } @@ -230,12 +290,13 @@ void coin_lockout_w(int num,int on) inputs -------------------------------------------------*/ -void coin_lockout_global_w(int on) +void coin_lockout_global_w(running_machine *machine, int on) { + generic_machine_private *state = machine->generic_machine_data; int i; - for (i = 0; i < COIN_COUNTERS; i++) - coin_lockout_w(i, on); + for (i = 0; i < ARRAY_LENGTH(state->coinlockedout); i++) + coin_lockout_w(machine, i, on); } @@ -245,26 +306,6 @@ void coin_lockout_global_w(int on) ***************************************************************************/ /*------------------------------------------------- - nvram_select - select the right pointer based - on which ones are non-NULL --------------------------------------------------*/ - -INLINE void *nvram_select(void) -{ - if (generic_nvram != NULL) - return generic_nvram; - if (generic_nvram16 != NULL) - return generic_nvram16; - if (generic_nvram32 != NULL) - return generic_nvram32; - if (generic_nvram64 != NULL) - return generic_nvram64; - fatalerror("generic nvram handler called without nvram in the memory map"); - return 0; -} - - -/*------------------------------------------------- nvram_fopen - open an NVRAM file directly -------------------------------------------------*/ @@ -356,13 +397,13 @@ void nvram_save(running_machine *machine) NVRAM_HANDLER( generic_0fill ) { if (read_or_write) - mame_fwrite(file, nvram_select(), generic_nvram_size); + mame_fwrite(file, machine->generic.nvram.ptr.v, machine->generic.nvram.size); else if (file != NULL) - mame_fread(file, nvram_select(), generic_nvram_size); - else if (memory_region_length(machine, "nvram") == generic_nvram_size) - memcpy(generic_nvram, memory_region(machine, "nvram"), generic_nvram_size); + mame_fread(file, machine->generic.nvram.ptr.v, machine->generic.nvram.size); + else if (memory_region_length(machine, "nvram") == machine->generic.nvram.size) + memcpy(machine->generic.nvram.ptr.v, memory_region(machine, "nvram"), machine->generic.nvram.size); else - memset(nvram_select(), 0, generic_nvram_size); + memset(machine->generic.nvram.ptr.v, 0, machine->generic.nvram.size); } @@ -374,13 +415,13 @@ NVRAM_HANDLER( generic_0fill ) NVRAM_HANDLER( generic_1fill ) { if (read_or_write) - mame_fwrite(file, nvram_select(), generic_nvram_size); + mame_fwrite(file, machine->generic.nvram.ptr.v, machine->generic.nvram.size); else if (file != NULL) - mame_fread(file, nvram_select(), generic_nvram_size); - else if (memory_region_length(machine, "nvram") == generic_nvram_size) - memcpy(generic_nvram, memory_region(machine, "nvram"), generic_nvram_size); + mame_fread(file, machine->generic.nvram.ptr.v, machine->generic.nvram.size); + else if (memory_region_length(machine, "nvram") == machine->generic.nvram.size) + memcpy(machine->generic.nvram.ptr.v, memory_region(machine, "nvram"), machine->generic.nvram.size); else - memset(nvram_select(), 0xff, generic_nvram_size); + memset(machine->generic.nvram.ptr.v, 0xff, machine->generic.nvram.size); } @@ -391,18 +432,17 @@ NVRAM_HANDLER( generic_1fill ) NVRAM_HANDLER( generic_randfill ) { - int i; - if (read_or_write) - mame_fwrite(file, nvram_select(), generic_nvram_size); + mame_fwrite(file, machine->generic.nvram.ptr.v, machine->generic.nvram.size); else if (file != NULL) - mame_fread(file, nvram_select(), generic_nvram_size); - else if (memory_region_length(machine, "nvram") == generic_nvram_size) - memcpy(generic_nvram, memory_region(machine, "nvram"), generic_nvram_size); + mame_fread(file, machine->generic.nvram.ptr.v, machine->generic.nvram.size); + else if (memory_region_length(machine, "nvram") == machine->generic.nvram.size) + memcpy(machine->generic.nvram.ptr.v, memory_region(machine, "nvram"), machine->generic.nvram.size); else { - UINT8 *nvram = (UINT8 *)nvram_select(); - for (i = 0; i < generic_nvram_size; i++) + UINT8 *nvram = (UINT8 *)machine->generic.nvram.ptr.v; + int i; + for (i = 0; i < machine->generic.nvram.size; i++) nvram[i] = mame_rand(machine); } } @@ -475,15 +515,16 @@ int memcard_create(running_machine *machine, int index, int overwrite) int memcard_insert(running_machine *machine, int index) { + generic_machine_private *state = machine->generic_machine_data; file_error filerr; mame_file *file; char name[16]; astring *fname; /* if a card is already inserted, eject it first */ - if (memcard_inserted != -1) + if (state->memcard_inserted != -1) memcard_eject(machine); - assert(memcard_inserted == -1); + assert(state->memcard_inserted == -1); /* create a name */ memcard_name(index, name); @@ -501,7 +542,7 @@ int memcard_insert(running_machine *machine, int index) /* close the file */ mame_fclose(file); - memcard_inserted = index; + state->memcard_inserted = index; return 0; } @@ -513,17 +554,18 @@ int memcard_insert(running_machine *machine, int index) void memcard_eject(running_machine *machine) { + generic_machine_private *state = machine->generic_machine_data; file_error filerr; mame_file *file; char name[16]; astring *fname; /* if no card is preset, just ignore */ - if (memcard_inserted == -1) + if (state->memcard_inserted == -1) return; /* create a name */ - memcard_name(memcard_inserted, name); + memcard_name(state->memcard_inserted, name); fname = astring_assemble_3(astring_alloc(), machine->basename, PATH_SEPARATOR, name); /* open the file; if we can't, it's an error */ @@ -541,7 +583,7 @@ void memcard_eject(running_machine *machine) /* close the file */ mame_fclose(file); - memcard_inserted = -1; + state->memcard_inserted = -1; } @@ -550,9 +592,10 @@ void memcard_eject(running_machine *machine) card index, or -1 if none -------------------------------------------------*/ -int memcard_present(void) +int memcard_present(running_machine *machine) { - return memcard_inserted; + generic_machine_private *state = machine->generic_machine_data; + return state->memcard_inserted; } @@ -565,7 +608,7 @@ int memcard_present(void) set_led_status - set the state of a given LED -------------------------------------------------*/ -void set_led_status(int num, int on) +void set_led_status(running_machine *machine, int num, int on) { output_set_led_value(num, on); } @@ -583,11 +626,12 @@ void set_led_status(int num, int on) static void interrupt_reset(running_machine *machine) { + generic_machine_private *state = machine->generic_machine_data; int cpunum; /* on a reset, enable all interrupts */ - for (cpunum = 0; cpunum < ARRAY_LENGTH(interrupt_enable); cpunum++) - interrupt_enable[cpunum] = 1; + for (cpunum = 0; cpunum < ARRAY_LENGTH(state->interrupt_enable); cpunum++) + state->interrupt_enable[cpunum] = 1; } @@ -658,14 +702,15 @@ void generic_pulse_irq_line_and_vector(const device_config *device, int irqline, void cpu_interrupt_enable(const device_config *device, int enabled) { + generic_machine_private *state = device->machine->generic_machine_data; int cpunum = cpu_get_index(device); assert_always(device != NULL, "cpu_interrupt_enable() called for invalid cpu!"); - assert_always(cpunum < ARRAY_LENGTH(interrupt_enable), "cpu_interrupt_enable() called for a CPU > position 7!"); + assert_always(cpunum < ARRAY_LENGTH(state->interrupt_enable), "cpu_interrupt_enable() called for a CPU > position 7!"); /* set the new state */ - if (cpunum < ARRAY_LENGTH(interrupt_enable)) - interrupt_enable[cpunum] = enabled; + if (cpunum < ARRAY_LENGTH(state->interrupt_enable)) + state->interrupt_enable[cpunum] = enabled; /* make sure there are no queued interrupts */ if (enabled == 0) |