First round of fixes for post-initialization allocs.

In the process, converted 7474, 74148, and 74153 to
devices.
This commit is contained in:
Aaron Giles 2009-12-20 23:57:25 +00:00
parent 8a90eaaa0b
commit d0af9ba1e8
30 changed files with 676 additions and 589 deletions

View File

@ -2019,6 +2019,9 @@ static CPU_INIT( z180 )
cpustate->daisy = z80daisy_init(device, (const z80_daisy_chain *)device->static_config); cpustate->daisy = z80daisy_init(device, (const z80_daisy_chain *)device->static_config);
cpustate->irq_callback = irqcallback; cpustate->irq_callback = irqcallback;
SZHVC_add = auto_alloc_array(device->machine, UINT8, 2*256*256);
SZHVC_sub = auto_alloc_array(device->machine, UINT8, 2*256*256);
/* set up the state table */ /* set up the state table */
cpustate->state = state_table_template; cpustate->state = state_table_template;
cpustate->state.baseptr = cpustate; cpustate->state.baseptr = cpustate;
@ -2064,8 +2067,6 @@ static CPU_RESET( z180 )
int oldval, newval, val; int oldval, newval, val;
UINT8 *padd, *padc, *psub, *psbc; UINT8 *padd, *padc, *psub, *psbc;
/* allocate big flag arrays once */ /* allocate big flag arrays once */
SZHVC_add = auto_alloc_array(device->machine, UINT8, 2*256*256);
SZHVC_sub = auto_alloc_array(device->machine, UINT8, 2*256*256);
padd = &SZHVC_add[ 0*256]; padd = &SZHVC_add[ 0*256];
padc = &SZHVC_add[256*256]; padc = &SZHVC_add[256*256];
psub = &SZHVC_sub[ 0*256]; psub = &SZHVC_sub[ 0*256];

View File

@ -691,6 +691,13 @@ static DEVICE_START(duart68681)
assert(device != NULL); assert(device != NULL);
assert(device->tag != NULL); assert(device->tag != NULL);
duart68681->duart_config = (const duart68681_config *)device->static_config;
duart68681->device = device;
duart68681->channel[0].tx_timer = timer_alloc(device->machine, tx_timer_callback, (void*)device);
duart68681->channel[1].tx_timer = timer_alloc(device->machine, tx_timer_callback, (void*)device);
duart68681->duart_timer = timer_alloc(device->machine, duart_timer_callback, (void*)device);
state_save_register_device_item(device, 0, duart68681->ACR); state_save_register_device_item(device, 0, duart68681->ACR);
state_save_register_device_item(device, 0, duart68681->IMR); state_save_register_device_item(device, 0, duart68681->IMR);
state_save_register_device_item(device, 0, duart68681->ISR); state_save_register_device_item(device, 0, duart68681->ISR);
@ -739,29 +746,29 @@ static DEVICE_START(duart68681)
static DEVICE_RESET(duart68681) static DEVICE_RESET(duart68681)
{ {
duart68681_state *duart68681 = get_safe_token(device); duart68681_state *duart68681 = get_safe_token(device);
emu_timer *save0, *save1;
memset(duart68681, 0, sizeof(duart68681_state)); duart68681->ACR = 0; /* Interrupt Vector Register */
duart68681->duart_config = (const duart68681_config *)device->static_config;
duart68681->device = device;
duart68681->IVR = 0x0f; /* Interrupt Vector Register */ duart68681->IVR = 0x0f; /* Interrupt Vector Register */
// "reset clears internal registers (SRA, SRB, IMR, ISR, OPR, OPCR) puts OP0-7 in the high state, stops the counter/timer, and puts channels a/b in the inactive state"
duart68681->channel[0].SR = 0;
duart68681->channel[1].SR = 0;
duart68681->IMR = 0; /* Interrupt Mask Register */ duart68681->IMR = 0; /* Interrupt Mask Register */
duart68681->ISR = 0; /* Interrupt Status Register */ duart68681->ISR = 0; /* Interrupt Status Register */
duart68681->OPCR = 0; /* Output Port Conf. Register */ duart68681->OPCR = 0; /* Output Port Conf. Register */
duart68681->OPR = 0; /* Output Port Register */ duart68681->OPR = 0; /* Output Port Register */
duart68681->CTR.d = 0; /* Counter/Timer Preset Value */
duart68681->IP_last_state = 0; /* last state of IP bits */
// "reset clears internal registers (SRA, SRB, IMR, ISR, OPR, OPCR) puts OP0-7 in the high state, stops the counter/timer, and puts channels a/b in the inactive state"
save0 = duart68681->channel[0].tx_timer;
save1 = duart68681->channel[1].tx_timer;
memset(duart68681->channel, 0, sizeof(duart68681->channel));
duart68681->channel[0].tx_timer = save0;
duart68681->channel[1].tx_timer = save1;
if (duart68681->duart_config->output_port_write) if (duart68681->duart_config->output_port_write)
duart68681->duart_config->output_port_write(duart68681->device, duart68681->OPR ^ 0xff); duart68681->duart_config->output_port_write(duart68681->device, duart68681->OPR ^ 0xff);
// allocate timers // reset timers
duart68681->channel[0].tx_timer = timer_alloc(device->machine, tx_timer_callback, (void*)device);
timer_adjust_oneshot(duart68681->channel[0].tx_timer, attotime_never, 0); timer_adjust_oneshot(duart68681->channel[0].tx_timer, attotime_never, 0);
duart68681->channel[1].tx_timer = timer_alloc(device->machine, tx_timer_callback, (void*)device);
timer_adjust_oneshot(duart68681->channel[1].tx_timer, attotime_never, 1); timer_adjust_oneshot(duart68681->channel[1].tx_timer, attotime_never, 1);
duart68681->duart_timer = timer_alloc(device->machine, duart_timer_callback, (void*)device);
} }
/*------------------------------------------------- /*-------------------------------------------------

View File

@ -42,12 +42,11 @@
#include "machine/74148.h" #include "machine/74148.h"
#define MAX_TTL74148 4 typedef struct _ttl74148_state ttl74148_state;
struct _ttl74148_state
struct TTL74148
{ {
/* callback */ /* callback */
void (*output_cb)(running_machine *machine); void (*output_cb)(const device_config *device);
/* inputs */ /* inputs */
int input_lines[8]; /* pins 1-4,10-13 */ int input_lines[8]; /* pins 1-4,10-13 */
@ -64,139 +63,163 @@ struct TTL74148
int last_enable_output; int last_enable_output;
}; };
static struct TTL74148 chips[MAX_TTL74148];
INLINE ttl74148_state *get_safe_token(const device_config *device)
void TTL74148_update(running_machine *machine, int which)
{ {
if (chips[which].enable_input) assert(device != NULL);
assert(device->token != NULL);
assert(device->type == ttl74148);
return (ttl74148_state *)device->token;
}
void ttl74148_update(const device_config *device)
{
ttl74148_state *state = get_safe_token(device);
if (state->enable_input)
{ {
// row 1 in truth table // row 1 in truth table
chips[which].output = 0x07; state->output = 0x07;
chips[which].output_valid = 1; state->output_valid = 1;
chips[which].enable_output = 1; state->enable_output = 1;
} }
else else
{ {
int bit0, bit1, bit2; int bit0, bit1, bit2;
/* this comes straight off the data sheet schematics */ /* this comes straight off the data sheet schematics */
bit0 = !(((!chips[which].input_lines[1]) & bit0 = !(((!state->input_lines[1]) &
chips[which].input_lines[2] & state->input_lines[2] &
chips[which].input_lines[4] & state->input_lines[4] &
chips[which].input_lines[6]) | state->input_lines[6]) |
((!chips[which].input_lines[3]) & ((!state->input_lines[3]) &
chips[which].input_lines[4] & state->input_lines[4] &
chips[which].input_lines[6]) | state->input_lines[6]) |
((!chips[which].input_lines[5]) & ((!state->input_lines[5]) &
chips[which].input_lines[6]) | state->input_lines[6]) |
(!chips[which].input_lines[7])); (!state->input_lines[7]));
bit1 = !(((!chips[which].input_lines[2]) & bit1 = !(((!state->input_lines[2]) &
chips[which].input_lines[4] & state->input_lines[4] &
chips[which].input_lines[5]) | state->input_lines[5]) |
((!chips[which].input_lines[3]) & ((!state->input_lines[3]) &
chips[which].input_lines[4] & state->input_lines[4] &
chips[which].input_lines[5]) | state->input_lines[5]) |
(!chips[which].input_lines[6]) | (!state->input_lines[6]) |
(!chips[which].input_lines[7])); (!state->input_lines[7]));
bit2 = !((!chips[which].input_lines[4]) | bit2 = !((!state->input_lines[4]) |
(!chips[which].input_lines[5]) | (!state->input_lines[5]) |
(!chips[which].input_lines[6]) | (!state->input_lines[6]) |
(!chips[which].input_lines[7])); (!state->input_lines[7]));
chips[which].output = (bit2 << 2) | (bit1 << 1) | bit0; state->output = (bit2 << 2) | (bit1 << 1) | bit0;
chips[which].output_valid = (chips[which].input_lines[0] & state->output_valid = (state->input_lines[0] &
chips[which].input_lines[1] & state->input_lines[1] &
chips[which].input_lines[2] & state->input_lines[2] &
chips[which].input_lines[3] & state->input_lines[3] &
chips[which].input_lines[4] & state->input_lines[4] &
chips[which].input_lines[5] & state->input_lines[5] &
chips[which].input_lines[6] & state->input_lines[6] &
chips[which].input_lines[7]); state->input_lines[7]);
chips[which].enable_output = !chips[which].output_valid; state->enable_output = !state->output_valid;
} }
/* call callback if any of the outputs changed */ /* call callback if any of the outputs changed */
if ( chips[which].output_cb && if ( state->output_cb &&
((chips[which].output != chips[which].last_output) || ((state->output != state->last_output) ||
(chips[which].output_valid != chips[which].last_output_valid) || (state->output_valid != state->last_output_valid) ||
(chips[which].enable_output != chips[which].last_enable_output))) (state->enable_output != state->last_enable_output)))
{ {
chips[which].last_output = chips[which].output; state->last_output = state->output;
chips[which].last_output_valid = chips[which].output_valid; state->last_output_valid = state->output_valid;
chips[which].last_enable_output = chips[which].enable_output; state->last_enable_output = state->enable_output;
chips[which].output_cb(machine); state->output_cb(device);
} }
} }
void TTL74148_input_line_w(int which, int input_line, int data) void ttl74148_input_line_w(const device_config *device, int input_line, int data)
{ {
chips[which].input_lines[input_line] = data ? 1 : 0; ttl74148_state *state = get_safe_token(device);
state->input_lines[input_line] = data ? 1 : 0;
} }
void TTL74148_enable_input_w(int which, int data) void ttl74148_enable_input_w(const device_config *device, int data)
{ {
chips[which].enable_input = data ? 1 : 0; ttl74148_state *state = get_safe_token(device);
state->enable_input = data ? 1 : 0;
} }
int TTL74148_output_r(int which) int ttl74148_output_r(const device_config *device)
{ {
return chips[which].output; ttl74148_state *state = get_safe_token(device);
return state->output;
} }
int TTL74148_output_valid_r(int which) int ttl74148_output_valid_r(const device_config *device)
{ {
return chips[which].output_valid; ttl74148_state *state = get_safe_token(device);
return state->output_valid;
} }
int TTL74148_enable_output_r(int which) int ttl74148_enable_output_r(const device_config *device)
{ {
return chips[which].enable_output; ttl74148_state *state = get_safe_token(device);
return state->enable_output;
} }
static DEVICE_START( ttl74148 )
void TTL74148_config(running_machine *machine, int which, const struct TTL74148_interface *intf)
{ {
if (which >= MAX_TTL74148) ttl74148_config *config = (ttl74148_config *)device->inline_config;
{ ttl74148_state *state = get_safe_token(device);
logerror("Only %d 74148's are supported at this time.\n", MAX_TTL74148); state->output_cb = config->output_cb;
return;
}
state_save_register_device_item_array(device, 0, state->input_lines);
chips[which].output_cb = (intf ? intf->output_cb : 0); state_save_register_device_item(device, 0, state->enable_input);
chips[which].enable_input = 1; state_save_register_device_item(device, 0, state->output);
chips[which].input_lines[0] = 1; state_save_register_device_item(device, 0, state->output_valid);
chips[which].input_lines[1] = 1; state_save_register_device_item(device, 0, state->enable_output);
chips[which].input_lines[2] = 1; state_save_register_device_item(device, 0, state->last_output);
chips[which].input_lines[3] = 1; state_save_register_device_item(device, 0, state->last_output_valid);
chips[which].input_lines[4] = 1; state_save_register_device_item(device, 0, state->last_enable_output);
chips[which].input_lines[5] = 1;
chips[which].input_lines[6] = 1;
chips[which].input_lines[7] = 1;
chips[which].last_output = -1;
chips[which].last_output_valid = -1;
chips[which].last_enable_output = -1;
state_save_register_item_array(machine, "ttl74148", NULL, which, chips[which].input_lines);
state_save_register_item(machine, "ttl74148", NULL, which, chips[which].enable_input);
state_save_register_item(machine, "ttl74148", NULL, which, chips[which].output);
state_save_register_item(machine, "ttl74148", NULL, which, chips[which].output_valid);
state_save_register_item(machine, "ttl74148", NULL, which, chips[which].enable_output);
state_save_register_item(machine, "ttl74148", NULL, which, chips[which].last_output);
state_save_register_item(machine, "ttl74148", NULL, which, chips[which].last_output_valid);
state_save_register_item(machine, "ttl74148", NULL, which, chips[which].last_enable_output);
} }
static DEVICE_RESET( ttl74148 )
{
ttl74148_state *state = get_safe_token(device);
state->enable_input = 1;
state->input_lines[0] = 1;
state->input_lines[1] = 1;
state->input_lines[2] = 1;
state->input_lines[3] = 1;
state->input_lines[4] = 1;
state->input_lines[5] = 1;
state->input_lines[6] = 1;
state->input_lines[7] = 1;
state->last_output = -1;
state->last_output_valid = -1;
state->last_enable_output = -1;
}
static const char DEVTEMPLATE_SOURCE[] = __FILE__;
#define DEVTEMPLATE_ID(p,s) p##ttl74148##s
#define DEVTEMPLATE_FEATURES DT_HAS_START | DT_HAS_RESET | DT_HAS_INLINE_CONFIG
#define DEVTEMPLATE_NAME "74148"
#define DEVTEMPLATE_FAMILY "TTL"
#include "devtempl.h"

View File

@ -42,22 +42,29 @@
#define TTL74148_H #define TTL74148_H
/* The interface structure */ typedef struct _ttl74148_config ttl74148_config;
struct TTL74148_interface struct _ttl74148_config
{ {
void (*output_cb)(running_machine *machine); void (*output_cb)(const device_config *device);
}; };
void TTL74148_config(running_machine *machine, int which, const struct TTL74148_interface *intf); #define MDRV_74148_ADD(_tag, _output_cb) \
MDRV_DEVICE_ADD(_tag, TTL74148, 0) \
MDRV_DEVICE_CONFIG_DATAPTR(ttl74148_config, output_cb, _output_cb)
/* must call TTL74148_update() after setting the inputs */
void TTL74148_update(running_machine *machine, int which);
void TTL74148_input_line_w(int which, int input_line, int data); /* must call ttl74148_update() after setting the inputs */
void TTL74148_enable_input_w(int which, int data); void ttl74148_update(const device_config *device);
int TTL74148_output_r(int which);
int TTL74148_output_valid_r(int which); void ttl74148_input_line_w(const device_config *device, int input_line, int data);
int TTL74148_enable_output_r(int which); void ttl74148_enable_input_w(const device_config *device, int data);
int ttl74148_output_r(const device_config *device);
int ttl74148_output_valid_r(const device_config *device);
int ttl74148_enable_output_r(const device_config *device);
/* device get info callback */
#define TTL74148 DEVICE_GET_INFO_NAME(ttl74148)
DEVICE_GET_INFO( ttl74148 );
#endif #endif

View File

@ -37,14 +37,11 @@
#include "machine/74153.h" #include "machine/74153.h"
#define MAX_TTL74153 9 typedef struct _ttl74153_state ttl74153_state;
struct _ttl74153_state
struct TTL74153
{ {
running_machine *machine;
/* callback */ /* callback */
void (*output_cb)(running_machine *machine); void (*output_cb)(const device_config *device);
/* inputs */ /* inputs */
int a; /* pin 14 */ int a; /* pin 14 */
@ -59,109 +56,132 @@ struct TTL74153
int last_output[2]; int last_output[2];
}; };
static struct TTL74153 chips[MAX_TTL74153]; INLINE ttl74153_state *get_safe_token(const device_config *device)
void TTL74153_update(int which)
{ {
assert(device != NULL);
assert(device->token != NULL);
assert(device->type == TTL74153);
return (ttl74153_state *)device->token;
}
void ttl74153_update(const device_config *device)
{
ttl74153_state *state = get_safe_token(device);
int sel; int sel;
int section; int section;
sel = (chips[which].b << 1) | chips[which].a; sel = (state->b << 1) | state->a;
/* process both sections */ /* process both sections */
for (section = 0; section < 2; section++) for (section = 0; section < 2; section++)
{ {
if (chips[which].enable[section]) if (state->enable[section])
chips[which].output[section] = 0; // row 1 in truth table state->output[section] = 0; // row 1 in truth table
else else
chips[which].output[section] = chips[which].input_lines[section][sel]; state->output[section] = state->input_lines[section][sel];
} }
/* call callback if either of the outputs changed */ /* call callback if either of the outputs changed */
if ( chips[which].output_cb && if ( state->output_cb &&
((chips[which].output[0] != chips[which].last_output[0]) || ((state->output[0] != state->last_output[0]) ||
(chips[which].output[1] != chips[which].last_output[1]))) (state->output[1] != state->last_output[1])))
{ {
chips[which].last_output[0] = chips[which].output[0]; state->last_output[0] = state->output[0];
chips[which].last_output[1] = chips[which].output[1]; state->last_output[1] = state->output[1];
chips[which].output_cb(chips[which].machine); state->output_cb(device);
} }
} }
void TTL74153_a_w(int which, int data) void ttl74153_a_w(const device_config *device, int data)
{ {
chips[which].a = data ? 1 : 0; ttl74153_state *state = get_safe_token(device);
state->a = data ? 1 : 0;
} }
void TTL74153_b_w(int which, int data) void ttl74153_b_w(const device_config *device, int data)
{ {
chips[which].b = data ? 1 : 0; ttl74153_state *state = get_safe_token(device);
state->b = data ? 1 : 0;
} }
void TTL74153_input_line_w(int which, int section, int input_line, int data) void ttl74153_input_line_w(const device_config *device, int section, int input_line, int data)
{ {
chips[which].input_lines[section][input_line] = data ? 1 : 0; ttl74153_state *state = get_safe_token(device);
state->input_lines[section][input_line] = data ? 1 : 0;
} }
void TTL74153_enable_w(int which, int section, int data) void ttl74153_enable_w(const device_config *device, int section, int data)
{ {
chips[which].enable[section] = data ? 1 : 0; ttl74153_state *state = get_safe_token(device);
state->enable[section] = data ? 1 : 0;
} }
int TTL74153_output_r(int which, int section) int ttl74153_output_r(const device_config *device, int section)
{ {
return chips[which].output[section]; ttl74153_state *state = get_safe_token(device);
return state->output[section];
} }
static DEVICE_START( ttl74153 )
void TTL74153_config(running_machine *machine, int which, const struct TTL74153_interface *intf)
{ {
if (which >= MAX_TTL74153) ttl74153_config *config = (ttl74153_config *)device->inline_config;
{ ttl74153_state *state = get_safe_token(device);
logerror("Only %d 74153's are supported at this time.\n", MAX_TTL74153); state->output_cb = config->output_cb;
return;
}
state_save_register_device_item_array(device, 0, state->enable);
chips[which].machine = machine; state_save_register_device_item_array(device, 0, state->last_output);
chips[which].output_cb = (intf ? intf->output_cb : 0); state_save_register_device_item(device, 0, state->input_lines[0][0]);
chips[which].a = 1; state_save_register_device_item(device, 0, state->input_lines[0][1]);
chips[which].b = 1; state_save_register_device_item(device, 0, state->input_lines[0][2]);
chips[which].enable[0] = 1; state_save_register_device_item(device, 0, state->input_lines[0][3]);
chips[which].enable[1] = 1; state_save_register_device_item(device, 0, state->input_lines[1][0]);
chips[which].input_lines[0][0] = 1; state_save_register_device_item(device, 0, state->input_lines[1][1]);
chips[which].input_lines[0][1] = 1; state_save_register_device_item(device, 0, state->input_lines[1][2]);
chips[which].input_lines[0][2] = 1; state_save_register_device_item(device, 0, state->input_lines[1][3]);
chips[which].input_lines[0][3] = 1; state_save_register_device_item(device, 0, state->a);
chips[which].input_lines[1][0] = 1; state_save_register_device_item(device, 0, state->b);
chips[which].input_lines[1][1] = 1;
chips[which].input_lines[1][2] = 1;
chips[which].input_lines[1][3] = 1;
chips[which].last_output[0] = -1;
chips[which].last_output[1] = -1;
state_save_register_item_array(machine, "ttl74153", NULL, which, chips[which].enable);
state_save_register_item_array(machine, "ttl74153", NULL, which, chips[which].last_output);
state_save_register_item(machine, "ttl74153", NULL, which, chips[which].input_lines[0][0]);
state_save_register_item(machine, "ttl74153", NULL, which, chips[which].input_lines[0][1]);
state_save_register_item(machine, "ttl74153", NULL, which, chips[which].input_lines[0][2]);
state_save_register_item(machine, "ttl74153", NULL, which, chips[which].input_lines[0][3]);
state_save_register_item(machine, "ttl74153", NULL, which, chips[which].input_lines[1][0]);
state_save_register_item(machine, "ttl74153", NULL, which, chips[which].input_lines[1][1]);
state_save_register_item(machine, "ttl74153", NULL, which, chips[which].input_lines[1][2]);
state_save_register_item(machine, "ttl74153", NULL, which, chips[which].input_lines[1][3]);
state_save_register_item(machine, "ttl74153", NULL, which, chips[which].a);
state_save_register_item(machine, "ttl74153", NULL, which, chips[which].b);
} }
static DEVICE_RESET( ttl74153 )
{
ttl74153_state *state = get_safe_token(device);
state->a = 1;
state->b = 1;
state->enable[0] = 1;
state->enable[1] = 1;
state->input_lines[0][0] = 1;
state->input_lines[0][1] = 1;
state->input_lines[0][2] = 1;
state->input_lines[0][3] = 1;
state->input_lines[1][0] = 1;
state->input_lines[1][1] = 1;
state->input_lines[1][2] = 1;
state->input_lines[1][3] = 1;
state->last_output[0] = -1;
state->last_output[1] = -1;
}
static const char DEVTEMPLATE_SOURCE[] = __FILE__;
#define DEVTEMPLATE_ID(p,s) p##ttl74153##s
#define DEVTEMPLATE_FEATURES DT_HAS_START | DT_HAS_RESET | DT_HAS_INLINE_CONFIG
#define DEVTEMPLATE_NAME "74153"
#define DEVTEMPLATE_FAMILY "TTL"
#include "devtempl.h"

View File

@ -37,22 +37,30 @@
#define TTL74153_H #define TTL74153_H
/* The interface structure */ typedef struct _ttl74153_config ttl74153_config;
struct TTL74153_interface struct _ttl74153_config
{ {
void (*output_cb)(running_machine *machine); void (*output_cb)(const device_config *device);
}; };
void TTL74153_config(running_machine *machine, int which, const struct TTL74153_interface *intf); #define MDRV_74153_ADD(_tag, _output_cb) \
MDRV_DEVICE_ADD(_tag, TTL74153, 0) \
MDRV_DEVICE_CONFIG_DATAPTR(ttl74153_config, output_cb, _output_cb)
/* must call TTL74153_update() after setting the inputs */ /* must call TTL74153_update() after setting the inputs */
void TTL74153_update(int which); void ttl74153_update(const device_config *device);
void TTL74153_a_w(int which, int data); void ttl74153_a_w(const device_config *device, int data);
void TTL74153_b_w(int which, int data); void ttl74153_b_w(const device_config *device, int data);
void TTL74153_input_line_w(int which, int section, int input_line, int data); void ttl74153_input_line_w(const device_config *device, int section, int input_line, int data);
void TTL74153_enable_w(int which, int section, int data); void ttl74153_enable_w(const device_config *device, int section, int data);
int TTL74153_output_r(int which, int section); int ttl74153_output_r(const device_config *device, int section);
/* device get info callback */
#define TTL74153 DEVICE_GET_INFO_NAME(ttl74153)
DEVICE_GET_INFO( ttl74153 );
#endif #endif

View File

@ -41,12 +41,11 @@
#include "7474.h" #include "7474.h"
#define MAX_TTL7474 12 typedef struct _ttl7474_state ttl7474_state;
struct _ttl7474_state
struct TTL7474
{ {
/* callback */ /* callback */
void (*output_cb)(running_machine *); void (*output_cb)(const device_config *);
/* inputs */ /* inputs */
UINT8 clear; /* pin 1/13 */ UINT8 clear; /* pin 1/13 */
@ -64,108 +63,133 @@ struct TTL7474
UINT8 last_output_comp; UINT8 last_output_comp;
}; };
static struct TTL7474 chips[MAX_TTL7474]; INLINE ttl7474_state *get_safe_token(const device_config *device)
void TTL7474_update(running_machine *machine, int which)
{ {
if (!chips[which].preset && chips[which].clear) /* line 1 in truth table */ assert(device != NULL);
assert(device->token != NULL);
assert(device->type == TTL7474);
return (ttl7474_state *)device->token;
}
void ttl7474_update(const device_config *device)
{
ttl7474_state *state = get_safe_token(device);
if (!state->preset && state->clear) /* line 1 in truth table */
{ {
chips[which].output = 1; state->output = 1;
chips[which].output_comp = 0; state->output_comp = 0;
} }
else if (chips[which].preset && !chips[which].clear) /* line 2 in truth table */ else if (state->preset && !state->clear) /* line 2 in truth table */
{ {
chips[which].output = 0; state->output = 0;
chips[which].output_comp = 1; state->output_comp = 1;
} }
else if (!chips[which].preset && !chips[which].clear) /* line 3 in truth table */ else if (!state->preset && !state->clear) /* line 3 in truth table */
{ {
chips[which].output = 1; state->output = 1;
chips[which].output_comp = 1; state->output_comp = 1;
} }
else if (!chips[which].last_clock && chips[which].clock) /* line 4 in truth table */ else if (!state->last_clock && state->clock) /* line 4 in truth table */
{ {
chips[which].output = chips[which].d; state->output = state->d;
chips[which].output_comp = !chips[which].d; state->output_comp = !state->d;
} }
chips[which].last_clock = chips[which].clock; state->last_clock = state->clock;
/* call callback if any of the outputs changed */ /* call callback if any of the outputs changed */
if ( chips[which].output_cb && if ( state->output_cb &&
((chips[which].output != chips[which].last_output) || ((state->output != state->last_output) ||
(chips[which].output_comp != chips[which].last_output_comp))) (state->output_comp != state->last_output_comp)))
{ {
chips[which].last_output = chips[which].output; state->last_output = state->output;
chips[which].last_output_comp = chips[which].output_comp; state->last_output_comp = state->output_comp;
chips[which].output_cb(machine); state->output_cb(device);
} }
} }
void TTL7474_clear_w(int which, int data) void ttl7474_clear_w(const device_config *device, int data)
{ {
chips[which].clear = data ? 1 : 0; ttl7474_state *state = get_safe_token(device);
state->clear = data ? 1 : 0;
} }
void TTL7474_preset_w(int which, int data) void ttl7474_preset_w(const device_config *device, int data)
{ {
chips[which].preset = data ? 1 : 0; ttl7474_state *state = get_safe_token(device);
state->preset = data ? 1 : 0;
} }
void TTL7474_clock_w(int which, int data) void ttl7474_clock_w(const device_config *device, int data)
{ {
chips[which].clock = data ? 1 : 0; ttl7474_state *state = get_safe_token(device);
state->clock = data ? 1 : 0;
} }
void TTL7474_d_w(int which, int data) void ttl7474_d_w(const device_config *device, int data)
{ {
chips[which].d = data ? 1 : 0; ttl7474_state *state = get_safe_token(device);
state->d = data ? 1 : 0;
} }
int TTL7474_output_r(int which) int ttl7474_output_r(const device_config *device)
{ {
return chips[which].output; ttl7474_state *state = get_safe_token(device);
return state->output;
} }
int TTL7474_output_comp_r(int which) int ttl7474_output_comp_r(const device_config *device)
{ {
return chips[which].output_comp; ttl7474_state *state = get_safe_token(device);
return state->output_comp;
} }
void TTL7474_config(running_machine *machine, int which, const struct TTL7474_interface *intf) static DEVICE_START( ttl7474 )
{ {
if (which >= MAX_TTL7474) ttl7474_config *config = (ttl7474_config *)device->inline_config;
{ ttl7474_state *state = get_safe_token(device);
logerror("Only %d 7474's are supported at this time.\n", MAX_TTL7474); state->output_cb = config->output_cb;
return;
} state_save_register_device_item(device, 0, state->clear);
state_save_register_device_item(device, 0, state->preset);
state_save_register_device_item(device, 0, state->clock);
state_save_register_device_item(device, 0, state->d);
state_save_register_device_item(device, 0, state->output);
state_save_register_device_item(device, 0, state->output_comp);
state_save_register_device_item(device, 0, state->last_clock);
state_save_register_device_item(device, 0, state->last_output);
state_save_register_device_item(device, 0, state->last_output_comp);
}
chips[which].output_cb = (intf ? intf->output_cb : 0); static DEVICE_RESET( ttl7474 )
{
ttl7474_state *state = get_safe_token(device);
/* all inputs are open first */ /* all inputs are open first */
chips[which].clear = 1; state->clear = 1;
chips[which].preset = 1; state->preset = 1;
chips[which].clock = 1; state->clock = 1;
chips[which].d = 1; state->d = 1;
chips[which].last_clock = 1; state->last_clock = 1;
chips[which].last_output = -1; state->last_output = -1;
chips[which].last_output_comp = -1; state->last_output_comp = -1;
state_save_register_item(machine, "ttl7474", NULL, which, chips[which].clear);
state_save_register_item(machine, "ttl7474", NULL, which, chips[which].preset);
state_save_register_item(machine, "ttl7474", NULL, which, chips[which].clock);
state_save_register_item(machine, "ttl7474", NULL, which, chips[which].d);
state_save_register_item(machine, "ttl7474", NULL, which, chips[which].output);
state_save_register_item(machine, "ttl7474", NULL, which, chips[which].output_comp);
state_save_register_item(machine, "ttl7474", NULL, which, chips[which].last_clock);
state_save_register_item(machine, "ttl7474", NULL, which, chips[which].last_output);
state_save_register_item(machine, "ttl7474", NULL, which, chips[which].last_output_comp);
} }
static const char DEVTEMPLATE_SOURCE[] = __FILE__;
#define DEVTEMPLATE_ID(p,s) p##ttl7474##s
#define DEVTEMPLATE_FEATURES DT_HAS_START | DT_HAS_RESET | DT_HAS_INLINE_CONFIG
#define DEVTEMPLATE_NAME "7474"
#define DEVTEMPLATE_FAMILY "TTL"
#include "devtempl.h"

View File

@ -25,7 +25,7 @@
H L X X | L H H L X X | L H
L L X X | H H (Note 1) L L X X | H H (Note 1)
H H _- X | D /D H H _- X | D /D
H H L X | Q0 /Q0 H H L X | Q0 /Q01
--------------+------- --------------+-------
L = lo (0) L = lo (0)
H = hi (1) H = hi (1)
@ -41,23 +41,31 @@
#define TTL7474_H #define TTL7474_H
/* The interface structure */ typedef struct _ttl7474_config ttl7474_config;
struct TTL7474_interface struct _ttl7474_config
{ {
void (*output_cb)(running_machine *machine); void (*output_cb)(const device_config *device);
}; };
void TTL7474_config(running_machine *machine, int which, const struct TTL7474_interface *intf); #define MDRV_7474_ADD(_tag, _output_cb) \
MDRV_DEVICE_ADD(_tag, TTL7474, 0) \
MDRV_DEVICE_CONFIG_DATAPTR(ttl7474_config, output_cb, _output_cb)
/* must call TTL7474_update() after setting the inputs */ /* must call TTL7474_update() after setting the inputs */
void TTL7474_update(running_machine *machine, int which); void ttl7474_update(const device_config *device);
void TTL7474_clear_w(int which, int data); void ttl7474_clear_w(const device_config *device, int data);
void TTL7474_preset_w(int which, int data); void ttl7474_preset_w(const device_config *device, int data);
void TTL7474_clock_w(int which, int data); void ttl7474_clock_w(const device_config *device, int data);
void TTL7474_d_w(int which, int data); void ttl7474_d_w(const device_config *device, int data);
int TTL7474_output_r(int which); int ttl7474_output_r(const device_config *device);
int TTL7474_output_comp_r(int which); /* NOT strictly the same as !TTL7474_output_r() */ int ttl7474_output_comp_r(const device_config *device); /* NOT strictly the same as !ttl7474_output_r() */
/* device get info callback */
#define TTL7474 DEVICE_GET_INFO_NAME(ttl7474)
DEVICE_GET_INFO( ttl7474 );
#endif #endif

View File

@ -218,7 +218,6 @@ if (resource_tracking_tag == 2) mame_printf_warning("auto_malloc(%ld) called wit
void *auto_realloc_file_line(running_machine *machine, void *ptr, size_t size, const char *file, int line) void *auto_realloc_file_line(running_machine *machine, void *ptr, size_t size, const char *file, int line)
{ {
object_pool *pool = current_pool(); object_pool *pool = current_pool();
if (resource_tracking_tag == 2) mame_printf_warning("auto_realloc(%p, %ld) called within reset scope by %s, line %d\n", ptr, (long) size, file, line);
if (ptr != NULL) if (ptr != NULL)
{ {
int tag = resource_tracking_tag; int tag = resource_tracking_tag;
@ -230,6 +229,7 @@ if (resource_tracking_tag == 2) mame_printf_warning("auto_realloc(%p, %ld) calle
} }
assert_always(tag > 0, "Failed to find alloc in pool"); assert_always(tag > 0, "Failed to find alloc in pool");
} }
else if (resource_tracking_tag == 2) mame_printf_warning("auto_realloc(%p, %ld) called within reset scope by %s, line %d\n", ptr, (long) size, file, line);
return pool_realloc_file_line(pool, ptr, size, file, line); return pool_realloc_file_line(pool, ptr, size, file, line);
} }

View File

@ -175,6 +175,7 @@ struct _tms5110_state
INT32 speech_rom_bitnum; INT32 speech_rom_bitnum;
emu_timer *romclk_timer; emu_timer *romclk_timer;
UINT8 romclk_timer_started;
UINT8 romclk_state; UINT8 romclk_state;
}; };
@ -206,6 +207,7 @@ static void tms5110_PDC_set(tms5110_state *tms, int data);
static void tms5110_process(tms5110_state *tms, INT16 *buffer, unsigned int size); static void tms5110_process(tms5110_state *tms, INT16 *buffer, unsigned int size);
static void parse_frame(tms5110_state *tms); static void parse_frame(tms5110_state *tms);
static STREAM_UPDATE( tms5110_update ); static STREAM_UPDATE( tms5110_update );
static TIMER_CALLBACK( romclk_timer_cb );
#define DEBUG_5110 0 #define DEBUG_5110 0
@ -964,6 +966,7 @@ static DEVICE_START( tms5110 )
} }
tms->state = CTL_STATE_INPUT; /* most probably not defined */ tms->state = CTL_STATE_INPUT; /* most probably not defined */
tms->romclk_timer = timer_alloc(device->machine, romclk_timer_cb, (void *) device);
register_for_save_states(tms); register_for_save_states(tms);
} }
@ -1139,9 +1142,9 @@ READ8_DEVICE_HANDLER( tms5110_romclk_r )
stream_update(tms->stream); stream_update(tms->stream);
/* create and start timer if necessary */ /* create and start timer if necessary */
if (tms->romclk_timer == NULL) if (!tms->romclk_timer_started)
{ {
tms->romclk_timer = timer_alloc(device->machine, romclk_timer_cb, (void *) device); tms->romclk_timer_started = TRUE;
timer_adjust_periodic(tms->romclk_timer, ATTOTIME_IN_HZ(device->clock / 40), 0, ATTOTIME_IN_HZ(device->clock / 40)); timer_adjust_periodic(tms->romclk_timer, ATTOTIME_IN_HZ(device->clock / 40), 0, ATTOTIME_IN_HZ(device->clock / 40));
} }
return tms->romclk_state; return tms->romclk_state;

View File

@ -166,19 +166,11 @@ enum
static UINT16 dsp_regs[DSP_REGS]; static UINT16 dsp_regs[DSP_REGS];
static UINT16 serial_frequency; static UINT16 serial_frequency;
static emu_timer *serial_timer;
static UINT8 gpu_irq_state; static UINT8 gpu_irq_state;
#if ENABLE_SPEEDUP_HACKS #if ENABLE_SPEEDUP_HACKS
static TIMER_CALLBACK( serial_chunky_callback );
static WRITE32_HANDLER( dsp_flags_w ); static WRITE32_HANDLER( dsp_flags_w );
#else
static TIMER_CALLBACK( serial_callback );
#endif #endif
@ -276,23 +268,6 @@ void cojag_sound_init(running_machine *machine)
/*************************************
*
* Sound reset
*
*************************************/
void cojag_sound_reset(running_machine *machine)
{
#if ENABLE_SPEEDUP_HACKS
serial_timer = timer_alloc(machine, serial_chunky_callback, NULL);
#else
serial_timer = timer_alloc(machine, serial_callback, NULL);
#endif
}
/************************************* /*************************************
* *
* Jerry 16-bit register access * Jerry 16-bit register access
@ -390,11 +365,11 @@ static WRITE32_HANDLER( dsp_flags_w )
#if ENABLE_SPEEDUP_HACKS #if ENABLE_SPEEDUP_HACKS
static TIMER_CALLBACK( serial_chunky_callback ) TIMER_DEVICE_CALLBACK( jaguar_serial_callback )
{ {
/* assert the A2S IRQ on CPU #2 (DSP) */ /* assert the A2S IRQ on CPU #2 (DSP) */
cputag_set_input_line(machine, "audiocpu", 1, ASSERT_LINE); cputag_set_input_line(timer->machine, "audiocpu", 1, ASSERT_LINE);
jaguar_dsp_resume(machine); jaguar_dsp_resume(timer->machine);
/* fix flaky code in interrupt handler which thwarts our speedup */ /* fix flaky code in interrupt handler which thwarts our speedup */
if ((jaguar_dsp_ram[0x3e/4] & 0xffff) == 0xbfbc && if ((jaguar_dsp_ram[0x3e/4] & 0xffff) == 0xbfbc &&
@ -409,11 +384,11 @@ static TIMER_CALLBACK( serial_chunky_callback )
#else #else
static TIMER_CALLBACK( serial_callback ) TIMER_DEVICE_CALLBACK( jaguar_serial_callback )
{ {
/* assert the A2S IRQ on CPU #2 (DSP) */ /* assert the A2S IRQ on CPU #2 (DSP) */
cputag_set_input_line(machine, "audiocpu", 1, ASSERT_LINE); cputag_set_input_line(timer->machine, "audiocpu", 1, ASSERT_LINE);
jaguar_dsp_resume(machine); jaguar_dsp_resume(timer->machine);
} }
#endif #endif
@ -459,7 +434,7 @@ WRITE32_HANDLER( jaguar_serial_w )
if ((data & 0x3f) == 0x15) if ((data & 0x3f) == 0x15)
{ {
attotime rate = attotime_mul(ATTOTIME_IN_HZ(26000000), 32 * 2 * (serial_frequency + 1)); attotime rate = attotime_mul(ATTOTIME_IN_HZ(26000000), 32 * 2 * (serial_frequency + 1));
timer_adjust_periodic(serial_timer, rate, 0, rate); timer_device_adjust_periodic(devtag_get_device(space->machine, "serial_timer"), rate, 0, rate);
} }
break; break;

View File

@ -79,9 +79,11 @@ READ8_DEVICE_HANDLER( frogger_portB_r )
WRITE8_DEVICE_HANDLER( scramble_sh_irqtrigger_w ) WRITE8_DEVICE_HANDLER( scramble_sh_irqtrigger_w )
{ {
const device_config *target = devtag_get_device(device->machine, "konami_7474");
/* the complement of bit 3 is connected to the flip-flop's clock */ /* the complement of bit 3 is connected to the flip-flop's clock */
TTL7474_clock_w(2, ~data & 0x08); ttl7474_clock_w(target, ~data & 0x08);
TTL7474_update(device->machine, 2); ttl7474_update(target);
/* bit 4 is sound disable */ /* bit 4 is sound disable */
sound_global_enable(device->machine, ~data & 0x10); sound_global_enable(device->machine, ~data & 0x10);
@ -89,39 +91,34 @@ WRITE8_DEVICE_HANDLER( scramble_sh_irqtrigger_w )
WRITE8_DEVICE_HANDLER( mrkougar_sh_irqtrigger_w ) WRITE8_DEVICE_HANDLER( mrkougar_sh_irqtrigger_w )
{ {
/* the complement of bit 3 is connected to the flip-flop's clock */ const device_config *target = devtag_get_device(device->machine, "konami_7474");
TTL7474_clock_w(2, ~data & 0x08);
TTL7474_update(device->machine, 2);
}
#ifdef UNUSED_FUNCTION /* the complement of bit 3 is connected to the flip-flop's clock */
WRITE8_HANDLER( froggrmc_sh_irqtrigger_w ) ttl7474_clock_w(target, ~data & 0x08);
{ ttl7474_update(target);
/* the complement of bit 0 is connected to the flip-flop's clock */
TTL7474_clock_w(2, ~data & 0x01);
TTL7474_update(space->machine, 2);
} }
#endif
static IRQ_CALLBACK(scramble_sh_irq_callback) static IRQ_CALLBACK(scramble_sh_irq_callback)
{ {
const device_config *target = devtag_get_device(device->machine, "konami_7474");
/* interrupt acknowledge clears the flip-flop -- /* interrupt acknowledge clears the flip-flop --
we need to pulse the CLR line because MAME's core never clears this we need to pulse the CLR line because MAME's core never clears this
line, only asserts it */ line, only asserts it */
TTL7474_clear_w(2, 0); ttl7474_clear_w(target, 0);
TTL7474_update(device->machine, 2); ttl7474_update(target);
TTL7474_clear_w(2, 1); ttl7474_clear_w(target, 1);
TTL7474_update(device->machine, 2); ttl7474_update(target);
return 0xff; return 0xff;
} }
static void scramble_sh_7474_callback(running_machine *machine) void scramble_sh_7474_callback(const device_config *device)
{ {
/* the Q bar is connected to the Z80's INT line. But since INT is complemented, */ /* the Q bar is connected to the Z80's INT line. But since INT is complemented, */
/* we need to complement Q bar */ /* we need to complement Q bar */
cputag_set_input_line(machine, "audiocpu", 0, !TTL7474_output_comp_r(2) ? ASSERT_LINE : CLEAR_LINE); cputag_set_input_line(device->machine, "audiocpu", 0, !ttl7474_output_comp_r(device) ? ASSERT_LINE : CLEAR_LINE);
} }
WRITE8_HANDLER( hotshock_sh_irqtrigger_w ) WRITE8_HANDLER( hotshock_sh_irqtrigger_w )
@ -166,19 +163,12 @@ WRITE8_HANDLER( frogger_filter_w )
filter_w(devtag_get_device(space->machine, "filter.0.2"), (offset >> 10) & 3); filter_w(devtag_get_device(space->machine, "filter.0.2"), (offset >> 10) & 3);
} }
static const struct TTL7474_interface scramble_sh_7474_intf =
{
scramble_sh_7474_callback
};
void scramble_sh_init(running_machine *machine) void scramble_sh_init(running_machine *machine)
{ {
cpu_set_irq_callback(cputag_get_cpu(machine, "audiocpu"), scramble_sh_irq_callback); cpu_set_irq_callback(cputag_get_cpu(machine, "audiocpu"), scramble_sh_irq_callback);
TTL7474_config(machine, 2, &scramble_sh_7474_intf);
/* PR is always 0, D is always 1 */ /* PR is always 0, D is always 1 */
TTL7474_d_w(2, 1); ttl7474_d_w(devtag_get_device(machine, "konami_7474"), 1);
} }

View File

@ -94,7 +94,6 @@ static MACHINE_RESET( artmagic )
tms_irq = hack_irq = 0; tms_irq = hack_irq = 0;
update_irq_state(machine); update_irq_state(machine);
tlc34076_reset(6); tlc34076_reset(6);
tlc34076_state_save(machine);
} }

View File

@ -198,7 +198,11 @@ static void scanline_update(const device_config *screen, int scanline)
static MACHINE_START( badlands ) static MACHINE_START( badlands )
{ {
badlands_state *state = (badlands_state *)machine->driver_data;
atarigen_init(machine); atarigen_init(machine);
state_save_register_global_array(machine, state->pedal_value);
} }
@ -214,8 +218,6 @@ static MACHINE_RESET( badlands )
atarigen_sound_io_reset(cputag_get_cpu(machine, "audiocpu")); atarigen_sound_io_reset(cputag_get_cpu(machine, "audiocpu"));
memcpy(state->bank_base, &state->bank_source_data[0x0000], 0x1000); memcpy(state->bank_base, &state->bank_source_data[0x0000], 0x1000);
state_save_register_global_array(machine, state->pedal_value);
} }

View File

@ -18,6 +18,9 @@
#include "driver.h" #include "driver.h"
#include "cpu/m6502/m6502.h" #include "cpu/m6502/m6502.h"
#include "machine/7474.h"
#include "machine/74148.h"
#include "machine/74153.h"
#include "machine/6821pia.h" #include "machine/6821pia.h"
#include "carpolo.h" #include "carpolo.h"
@ -241,6 +244,22 @@ static MACHINE_DRIVER_START( carpolo )
MDRV_PIA6821_ADD("pia0", carpolo_pia0_intf) MDRV_PIA6821_ADD("pia0", carpolo_pia0_intf)
MDRV_PIA6821_ADD("pia1", carpolo_pia1_intf) MDRV_PIA6821_ADD("pia1", carpolo_pia1_intf)
MDRV_7474_ADD("7474_2s_1", carpolo_7474_2s_1_cb)
MDRV_7474_ADD("7474_2s_2", carpolo_7474_2s_2_cb)
MDRV_7474_ADD("7474_2u_1", carpolo_7474_2u_1_cb)
MDRV_7474_ADD("7474_2u_2", carpolo_7474_2u_2_cb)
MDRV_7474_ADD("7474_1f_1", NULL)
MDRV_7474_ADD("7474_1f_2", NULL)
MDRV_7474_ADD("7474_1d_1", NULL)
MDRV_7474_ADD("7474_1d_2", NULL)
MDRV_7474_ADD("7474_1c_1", NULL)
MDRV_7474_ADD("7474_1c_2", NULL)
MDRV_7474_ADD("7474_1a_1", NULL)
MDRV_7474_ADD("7474_1a_2", NULL)
MDRV_74148_ADD("74148_3s", carpolo_74148_3s_cb)
MDRV_74153_ADD("74153_1k", NULL)
/* video hardware */ /* video hardware */
MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(60) MDRV_SCREEN_REFRESH_RATE(60)

View File

@ -53,7 +53,7 @@ Note about version levels using Mutant Fighter as the example:
#include "sound/okim6295.h" #include "sound/okim6295.h"
static int cninja_scanline, cninja_irq_mask; static int cninja_scanline, cninja_irq_mask;
static emu_timer *raster_irq_timer; static const device_config *raster_irq_timer;
static UINT16 *cninja_ram; static UINT16 *cninja_ram;
/**********************************************************************************/ /**********************************************************************************/
@ -70,7 +70,7 @@ static WRITE16_HANDLER( stoneage_sound_w )
cputag_set_input_line(space->machine, "audiocpu", INPUT_LINE_NMI, PULSE_LINE); cputag_set_input_line(space->machine, "audiocpu", INPUT_LINE_NMI, PULSE_LINE);
} }
static TIMER_CALLBACK( interrupt_gen ) static TIMER_DEVICE_CALLBACK( interrupt_gen )
{ {
int scanline = param; int scanline = param;
@ -85,8 +85,8 @@ static TIMER_CALLBACK( interrupt_gen )
deco16_raster_display_list[deco16_raster_display_position++] = deco16_pf34_control[3] & 0xffff; deco16_raster_display_list[deco16_raster_display_position++] = deco16_pf34_control[3] & 0xffff;
deco16_raster_display_list[deco16_raster_display_position++] = deco16_pf34_control[4] & 0xffff; deco16_raster_display_list[deco16_raster_display_position++] = deco16_pf34_control[4] & 0xffff;
cputag_set_input_line(machine, "maincpu", (cninja_irq_mask&0x10) ? 3 : 4, ASSERT_LINE); cputag_set_input_line(timer->machine, "maincpu", (cninja_irq_mask&0x10) ? 3 : 4, ASSERT_LINE);
timer_adjust_oneshot(raster_irq_timer, attotime_never, 0); timer_device_adjust_oneshot(raster_irq_timer, attotime_never, 0);
} }
static READ16_HANDLER( cninja_irq_r ) static READ16_HANDLER( cninja_irq_r )
@ -122,9 +122,9 @@ static WRITE16_HANDLER( cninja_irq_w )
case 1: /* Raster IRQ scanline position, only valid for values between 1 & 239 (0 and 240-256 do NOT generate IRQ's) */ case 1: /* Raster IRQ scanline position, only valid for values between 1 & 239 (0 and 240-256 do NOT generate IRQ's) */
cninja_scanline=data&0xff; cninja_scanline=data&0xff;
if ((cninja_irq_mask&0x2)==0 && cninja_scanline>0 && cninja_scanline<240) if ((cninja_irq_mask&0x2)==0 && cninja_scanline>0 && cninja_scanline<240)
timer_adjust_oneshot(raster_irq_timer, video_screen_get_time_until_pos(space->machine->primary_screen, cninja_scanline, 0), cninja_scanline); timer_device_adjust_oneshot(raster_irq_timer, video_screen_get_time_until_pos(space->machine->primary_screen, cninja_scanline, 0), cninja_scanline);
else else
timer_adjust_oneshot(raster_irq_timer,attotime_never,0); timer_device_adjust_oneshot(raster_irq_timer,attotime_never,0);
return; return;
case 2: /* VBL irq ack */ case 2: /* VBL irq ack */
@ -654,7 +654,7 @@ GFXDECODE_END
static MACHINE_RESET( cninja ) static MACHINE_RESET( cninja )
{ {
raster_irq_timer = timer_alloc(machine, interrupt_gen, NULL); raster_irq_timer = devtag_get_device(machine, "raster_timer");
cninja_scanline=0; cninja_scanline=0;
cninja_irq_mask=0; cninja_irq_mask=0;
} }
@ -700,6 +700,8 @@ static MACHINE_DRIVER_START( cninja )
MDRV_MACHINE_RESET(cninja) MDRV_MACHINE_RESET(cninja)
MDRV_TIMER_ADD("raster_timer", interrupt_gen)
/* video hardware */ /* video hardware */
MDRV_VIDEO_ATTRIBUTES(VIDEO_BUFFERS_SPRITERAM) MDRV_VIDEO_ATTRIBUTES(VIDEO_BUFFERS_SPRITERAM)
@ -748,6 +750,8 @@ static MACHINE_DRIVER_START( stoneage )
MDRV_MACHINE_RESET(cninja) MDRV_MACHINE_RESET(cninja)
MDRV_TIMER_ADD("raster_timer", interrupt_gen)
/* video hardware */ /* video hardware */
MDRV_VIDEO_ATTRIBUTES(VIDEO_BUFFERS_SPRITERAM) MDRV_VIDEO_ATTRIBUTES(VIDEO_BUFFERS_SPRITERAM)
@ -793,6 +797,8 @@ static MACHINE_DRIVER_START( edrandy )
MDRV_MACHINE_RESET(cninja) MDRV_MACHINE_RESET(cninja)
MDRV_TIMER_ADD("raster_timer", interrupt_gen)
/* video hardware */ /* video hardware */
MDRV_VIDEO_ATTRIBUTES(VIDEO_BUFFERS_SPRITERAM) MDRV_VIDEO_ATTRIBUTES(VIDEO_BUFFERS_SPRITERAM)
@ -841,6 +847,8 @@ static MACHINE_DRIVER_START( robocop2 )
MDRV_MACHINE_RESET(cninja) MDRV_MACHINE_RESET(cninja)
MDRV_TIMER_ADD("raster_timer", interrupt_gen)
/* video hardware */ /* video hardware */
MDRV_VIDEO_ATTRIBUTES(VIDEO_BUFFERS_SPRITERAM) MDRV_VIDEO_ATTRIBUTES(VIDEO_BUFFERS_SPRITERAM)

View File

@ -371,12 +371,6 @@ static MACHINE_RESET( cojag )
/* halt the CPUs */ /* halt the CPUs */
jaguargpu_ctrl_w(cputag_get_cpu(machine, "gpu"), G_CTRL, 0, 0xffffffff); jaguargpu_ctrl_w(cputag_get_cpu(machine, "gpu"), G_CTRL, 0, 0xffffffff);
jaguardsp_ctrl_w(cputag_get_cpu(machine, "audiocpu"), D_CTRL, 0, 0xffffffff); jaguardsp_ctrl_w(cputag_get_cpu(machine, "audiocpu"), D_CTRL, 0, 0xffffffff);
/* init the sound system */
cojag_sound_reset(machine);
/* reset the IDE controller */
devtag_reset(machine, "ide");
} }
@ -1123,6 +1117,8 @@ static MACHINE_DRIVER_START( cojagr3k )
MDRV_IDE_CONTROLLER_ADD("ide", jaguar_external_int) MDRV_IDE_CONTROLLER_ADD("ide", jaguar_external_int)
MDRV_TIMER_ADD("serial_timer", jaguar_serial_callback)
/* video hardware */ /* video hardware */
MDRV_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK) MDRV_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)

View File

@ -54,18 +54,6 @@ static const UINT16 nvram_unlock_seq[] =
#define NVRAM_UNLOCK_SEQ_LEN (ARRAY_LENGTH(nvram_unlock_seq)) #define NVRAM_UNLOCK_SEQ_LEN (ARRAY_LENGTH(nvram_unlock_seq))
static UINT16 nvram_write_seq[NVRAM_UNLOCK_SEQ_LEN]; static UINT16 nvram_write_seq[NVRAM_UNLOCK_SEQ_LEN];
static UINT8 nvram_write_enable; static UINT8 nvram_write_enable;
static emu_timer *nvram_write_timer;
/*************************************
*
* Prototypes
*
*************************************/
static TIMER_CALLBACK( nvram_write_timeout );
@ -148,7 +136,6 @@ static void coolpool_from_shiftreg(const address_space *space, UINT32 address, U
static MACHINE_RESET( amerdart ) static MACHINE_RESET( amerdart )
{ {
nvram_write_enable = 0; nvram_write_enable = 0;
nvram_write_timer = timer_alloc(machine, nvram_write_timeout, NULL);
} }
@ -156,7 +143,6 @@ static MACHINE_RESET( coolpool )
{ {
tlc34076_reset(6); tlc34076_reset(6);
nvram_write_enable = 0; nvram_write_enable = 0;
nvram_write_timer = timer_alloc(machine, nvram_write_timeout, NULL);
} }
@ -167,7 +153,7 @@ static MACHINE_RESET( coolpool )
* *
*************************************/ *************************************/
static TIMER_CALLBACK( nvram_write_timeout ) static TIMER_DEVICE_CALLBACK( nvram_write_timeout )
{ {
nvram_write_enable = 0; nvram_write_enable = 0;
} }
@ -183,7 +169,7 @@ static WRITE16_HANDLER( nvram_thrash_w )
if (!memcmp(nvram_unlock_seq, nvram_write_seq, sizeof(nvram_unlock_seq))) if (!memcmp(nvram_unlock_seq, nvram_write_seq, sizeof(nvram_unlock_seq)))
{ {
nvram_write_enable = 1; nvram_write_enable = 1;
timer_adjust_oneshot(nvram_write_timer, ATTOTIME_IN_MSEC(1000), 0); timer_device_adjust_oneshot(devtag_get_device(space->machine, "nvram_timer"), ATTOTIME_IN_MSEC(1000), 0);
} }
} }
@ -695,6 +681,8 @@ static MACHINE_DRIVER_START( amerdart )
MDRV_MACHINE_RESET(amerdart) MDRV_MACHINE_RESET(amerdart)
MDRV_NVRAM_HANDLER(generic_0fill) MDRV_NVRAM_HANDLER(generic_0fill)
MDRV_TIMER_ADD("nvram_timer", nvram_write_timeout)
/* video hardware */ /* video hardware */
MDRV_VIDEO_UPDATE(tms340x0) MDRV_VIDEO_UPDATE(tms340x0)
@ -724,6 +712,8 @@ static MACHINE_DRIVER_START( coolpool )
MDRV_MACHINE_RESET(coolpool) MDRV_MACHINE_RESET(coolpool)
MDRV_NVRAM_HANDLER(generic_0fill) MDRV_NVRAM_HANDLER(generic_0fill)
MDRV_TIMER_ADD("nvram_timer", nvram_write_timeout)
/* video hardware */ /* video hardware */
MDRV_VIDEO_UPDATE(tms340x0) MDRV_VIDEO_UPDATE(tms340x0)

View File

@ -351,6 +351,7 @@ TO DO :
#include "cpu/z80/z80.h" #include "cpu/z80/z80.h"
#include "cpu/s2650/s2650.h" #include "cpu/s2650/s2650.h"
#include "galaxold.h" #include "galaxold.h"
#include "machine/7474.h"
#include "sound/ay8910.h" #include "sound/ay8910.h"
#include "sound/sn76496.h" #include "sound/sn76496.h"
#include "sound/dac.h" #include "sound/dac.h"
@ -2108,6 +2109,9 @@ static MACHINE_DRIVER_START( galaxold_base )
MDRV_MACHINE_RESET(galaxold) MDRV_MACHINE_RESET(galaxold)
MDRV_7474_ADD("7474_9m_1", galaxold_7474_9m_1_callback)
MDRV_7474_ADD("7474_9m_2", galaxold_7474_9m_2_callback)
/* video hardware */ /* video hardware */
MDRV_GFXDECODE(galaxian) MDRV_GFXDECODE(galaxian)
MDRV_PALETTE_LENGTH(32+2+64) /* 32 for the characters, 2 for the bullets, 64 for the stars */ MDRV_PALETTE_LENGTH(32+2+64) /* 32 for the characters, 2 for the bullets, 64 for the stars */

View File

@ -35,6 +35,7 @@ Notes/Tidbits:
#include "driver.h" #include "driver.h"
#include "cpu/z80/z80.h" #include "cpu/z80/z80.h"
#include "machine/8255ppi.h" #include "machine/8255ppi.h"
#include "machine/7474.h"
#include "galaxold.h" #include "galaxold.h"
#include "sound/ay8910.h" #include "sound/ay8910.h"
@ -859,6 +860,8 @@ static MACHINE_DRIVER_START( type1 )
MDRV_CPU_PROGRAM_MAP(scobra_sound_map) MDRV_CPU_PROGRAM_MAP(scobra_sound_map)
MDRV_CPU_IO_MAP(scobra_sound_io_map) MDRV_CPU_IO_MAP(scobra_sound_io_map)
MDRV_7474_ADD("konami_7474", scramble_sh_7474_callback)
MDRV_MACHINE_RESET(scramble) MDRV_MACHINE_RESET(scramble)
MDRV_PPI8255_ADD( "ppi8255_0", scramble_ppi_0_intf ) MDRV_PPI8255_ADD( "ppi8255_0", scramble_ppi_0_intf )
@ -983,6 +986,8 @@ static MACHINE_DRIVER_START( hustler )
MDRV_CPU_PROGRAM_MAP(hustler_sound_map) MDRV_CPU_PROGRAM_MAP(hustler_sound_map)
MDRV_CPU_IO_MAP(hustler_sound_io_map) MDRV_CPU_IO_MAP(hustler_sound_io_map)
MDRV_7474_ADD("konami_7474", scramble_sh_7474_callback)
MDRV_MACHINE_RESET(scramble) MDRV_MACHINE_RESET(scramble)
/* device config overrides */ /* device config overrides */

View File

@ -31,6 +31,7 @@ Notes:
#include "sound/ay8910.h" #include "sound/ay8910.h"
#include "sound/dac.h" #include "sound/dac.h"
#include "sound/flt_rc.h" #include "sound/flt_rc.h"
#include "machine/7474.h"
#include "machine/8255ppi.h" #include "machine/8255ppi.h"
#include "galaxold.h" #include "galaxold.h"
@ -1242,6 +1243,10 @@ static MACHINE_DRIVER_START( scramble )
MDRV_CPU_PROGRAM_MAP(scramble_sound_map) MDRV_CPU_PROGRAM_MAP(scramble_sound_map)
MDRV_CPU_IO_MAP(scramble_sound_io_map) MDRV_CPU_IO_MAP(scramble_sound_io_map)
MDRV_7474_ADD("7474_9m_1", galaxold_7474_9m_1_callback)
MDRV_7474_ADD("7474_9m_2", galaxold_7474_9m_2_callback)
MDRV_7474_ADD("konami_7474", scramble_sh_7474_callback)
MDRV_MACHINE_RESET(scramble) MDRV_MACHINE_RESET(scramble)
MDRV_PPI8255_ADD( "ppi8255_0", scramble_ppi_0_intf ) MDRV_PPI8255_ADD( "ppi8255_0", scramble_ppi_0_intf )
@ -1471,6 +1476,10 @@ static MACHINE_DRIVER_START( ad2083 )
MDRV_CPU_ADD("maincpu", Z80, 18432000/6) /* 3.072 MHz */ MDRV_CPU_ADD("maincpu", Z80, 18432000/6) /* 3.072 MHz */
MDRV_CPU_PROGRAM_MAP(ad2083_map) MDRV_CPU_PROGRAM_MAP(ad2083_map)
MDRV_7474_ADD("7474_9m_1", galaxold_7474_9m_1_callback)
MDRV_7474_ADD("7474_9m_2", galaxold_7474_9m_2_callback)
MDRV_7474_ADD("konami_7474", scramble_sh_7474_callback)
MDRV_MACHINE_RESET(galaxold) MDRV_MACHINE_RESET(galaxold)
/* video hardware */ /* video hardware */

View File

@ -15,6 +15,7 @@
#include "video/vector.h" #include "video/vector.h"
#include "vertigo.h" #include "vertigo.h"
#include "exidy440.h" #include "exidy440.h"
#include "machine/74148.h"
#include "machine/pit8253.h" #include "machine/pit8253.h"
@ -114,6 +115,8 @@ static MACHINE_DRIVER_START( vertigo )
MDRV_PIT8254_ADD( "pit8254", vertigo_pit8254_config ) MDRV_PIT8254_ADD( "pit8254", vertigo_pit8254_config )
MDRV_74148_ADD( "74148", vertigo_update_irq )
/* motor controller */ /* motor controller */
/* /*
MDRV_CPU_ADD("motor", M6805, 1000000) MDRV_CPU_ADD("motor", M6805, 1000000)

View File

@ -13,6 +13,13 @@
extern const pia6821_interface carpolo_pia0_intf; extern const pia6821_interface carpolo_pia0_intf;
extern const pia6821_interface carpolo_pia1_intf; extern const pia6821_interface carpolo_pia1_intf;
void carpolo_74148_3s_cb(const device_config *device);
void carpolo_7474_2s_1_cb(const device_config *device);
void carpolo_7474_2s_2_cb(const device_config *device);
void carpolo_7474_2u_1_cb(const device_config *device);
void carpolo_7474_2u_2_cb(const device_config *device);
MACHINE_START( carpolo ); MACHINE_START( carpolo );
MACHINE_RESET( carpolo ); MACHINE_RESET( carpolo );

View File

@ -98,6 +98,9 @@ WRITE8_HANDLER( galaxold_flip_screen_y_w );
/*----------- defined in machine/galaxold.c -----------*/ /*----------- defined in machine/galaxold.c -----------*/
void galaxold_7474_9m_2_callback(const device_config *device);
void galaxold_7474_9m_1_callback(const device_config *device);
DRIVER_INIT( 4in1 ); DRIVER_INIT( 4in1 );
DRIVER_INIT( ladybugg ); DRIVER_INIT( ladybugg );
@ -167,6 +170,7 @@ CUSTOM_INPUT( darkplnt_custom_r );
/*----------- defined in audio/scramble.c -----------*/ /*----------- defined in audio/scramble.c -----------*/
void scramble_sh_init(running_machine *machine); void scramble_sh_init(running_machine *machine);
void scramble_sh_7474_callback(const device_config *device);
WRITE8_HANDLER( scramble_filter_w ); WRITE8_HANDLER( scramble_filter_w );
WRITE8_HANDLER( frogger_filter_w ); WRITE8_HANDLER( frogger_filter_w );

View File

@ -29,6 +29,8 @@ extern UINT32 *jaguar_wave_rom;
/*----------- defined in audio/jaguar.c -----------*/ /*----------- defined in audio/jaguar.c -----------*/
TIMER_DEVICE_CALLBACK( jaguar_serial_callback );
void jaguar_dsp_suspend(running_machine *machine); void jaguar_dsp_suspend(running_machine *machine);
void jaguar_dsp_resume(running_machine *machine); void jaguar_dsp_resume(running_machine *machine);

View File

@ -6,6 +6,8 @@
/*----------- defined in machine/vertigo.c -----------*/ /*----------- defined in machine/vertigo.c -----------*/
void vertigo_update_irq(const device_config *device);
extern const struct pit8253_config vertigo_pit8254_config; extern const struct pit8253_config vertigo_pit8254_config;
READ16_HANDLER( vertigo_io_convert ); READ16_HANDLER( vertigo_io_convert );

View File

@ -58,23 +58,6 @@
#define CAR_BORDER_EXTRA_BITS 0x50 #define CAR_BORDER_EXTRA_BITS 0x50
#define TTL74148_3S 0
#define TTL74153_1K 0
#define TTL7474_2S_1 0
#define TTL7474_2S_2 1
#define TTL7474_2U_1 2
#define TTL7474_2U_2 3
#define TTL7474_1F_1 4
#define TTL7474_1F_2 5
#define TTL7474_1D_1 6
#define TTL7474_1D_2 7
#define TTL7474_1C_1 8
#define TTL7474_1C_2 9
#define TTL7474_1A_1 10
#define TTL7474_1A_2 11
static UINT8 ball_screen_collision_cause; static UINT8 ball_screen_collision_cause;
static UINT8 car_ball_collision_x; static UINT8 car_ball_collision_x;
@ -86,36 +69,53 @@ static UINT8 car_border_collision_cause;
static UINT8 priority_0_extension; static UINT8 priority_0_extension;
static UINT8 last_wheel_value[4]; static UINT8 last_wheel_value[4];
static const device_config *ttl74148_3s;
static void TTL74148_3S_cb(running_machine *machine) static const device_config *ttl74153_1k;
static const device_config *ttl7474_2s_1;
static const device_config *ttl7474_2s_2;
static const device_config *ttl7474_2u_1;
static const device_config *ttl7474_2u_2;
static const device_config *ttl7474_1f_1;
static const device_config *ttl7474_1f_2;
static const device_config *ttl7474_1d_1;
static const device_config *ttl7474_1d_2;
static const device_config *ttl7474_1c_1;
static const device_config *ttl7474_1c_2;
static const device_config *ttl7474_1a_1;
static const device_config *ttl7474_1a_2;
void carpolo_74148_3s_cb(const device_config *device)
{ {
cputag_set_input_line(machine, "maincpu", M6502_IRQ_LINE, TTL74148_output_valid_r(TTL74148_3S) ? CLEAR_LINE : ASSERT_LINE); cputag_set_input_line(device->machine, "maincpu", M6502_IRQ_LINE, ttl74148_output_valid_r(device) ? CLEAR_LINE : ASSERT_LINE);
} }
/* the outputs of the flip-flops are connected to the priority encoder */ /* the outputs of the flip-flops are connected to the priority encoder */
static void TTL7474_2S_1_cb(running_machine *machine) void carpolo_7474_2s_1_cb(const device_config *device)
{ {
TTL74148_input_line_w(TTL74148_3S, COIN1_PRIORITY_LINE, TTL7474_output_comp_r(TTL7474_2S_1)); ttl74148_input_line_w(ttl74148_3s, COIN1_PRIORITY_LINE, ttl7474_output_comp_r(device));
TTL74148_update(machine, TTL74148_3S); ttl74148_update(ttl74148_3s);
} }
static void TTL7474_2S_2_cb(running_machine *machine) void carpolo_7474_2s_2_cb(const device_config *device)
{ {
TTL74148_input_line_w(TTL74148_3S, COIN2_PRIORITY_LINE, TTL7474_output_comp_r(TTL7474_2S_2)); ttl74148_input_line_w(ttl74148_3s, COIN2_PRIORITY_LINE, ttl7474_output_comp_r(device));
TTL74148_update(machine, TTL74148_3S); ttl74148_update(ttl74148_3s);
} }
static void TTL7474_2U_1_cb(running_machine *machine) void carpolo_7474_2u_1_cb(const device_config *device)
{ {
TTL74148_input_line_w(TTL74148_3S, COIN3_PRIORITY_LINE, TTL7474_output_comp_r(TTL7474_2U_1)); ttl74148_input_line_w(ttl74148_3s, COIN3_PRIORITY_LINE, ttl7474_output_comp_r(device));
TTL74148_update(machine, TTL74148_3S); ttl74148_update(ttl74148_3s);
} }
static void TTL7474_2U_2_cb(running_machine *machine) void carpolo_7474_2u_2_cb(const device_config *device)
{ {
TTL74148_input_line_w(TTL74148_3S, COIN4_PRIORITY_LINE, TTL7474_output_comp_r(TTL7474_2U_2)); ttl74148_input_line_w(ttl74148_3s, COIN4_PRIORITY_LINE, ttl7474_output_comp_r(device));
TTL74148_update(machine, TTL74148_3S); ttl74148_update(ttl74148_3s);
} }
@ -123,24 +123,24 @@ void carpolo_generate_ball_screen_interrupt(running_machine *machine, UINT8 caus
{ {
ball_screen_collision_cause = cause; ball_screen_collision_cause = cause;
TTL74148_input_line_w(TTL74148_3S, BALL_SCREEN_PRIORITY_LINE, 0); ttl74148_input_line_w(ttl74148_3s, BALL_SCREEN_PRIORITY_LINE, 0);
TTL74148_update(machine, TTL74148_3S); ttl74148_update(ttl74148_3s);
} }
void carpolo_generate_car_car_interrupt(running_machine *machine, int car1, int car2) void carpolo_generate_car_car_interrupt(running_machine *machine, int car1, int car2)
{ {
car_car_collision_cause = ~((1 << (3 - car1)) | (1 << (3 - car2))); car_car_collision_cause = ~((1 << (3 - car1)) | (1 << (3 - car2)));
TTL74148_input_line_w(TTL74148_3S, CAR_CAR_PRIORITY_LINE, 0); ttl74148_input_line_w(ttl74148_3s, CAR_CAR_PRIORITY_LINE, 0);
TTL74148_update(machine, TTL74148_3S); ttl74148_update(ttl74148_3s);
} }
void carpolo_generate_car_goal_interrupt(running_machine *machine, int car, int right_goal) void carpolo_generate_car_goal_interrupt(running_machine *machine, int car, int right_goal)
{ {
car_goal_collision_cause = car | (right_goal ? 0x08 : 0x00); car_goal_collision_cause = car | (right_goal ? 0x08 : 0x00);
TTL74148_input_line_w(TTL74148_3S, CAR_GOAL_PRIORITY_LINE, 0); ttl74148_input_line_w(ttl74148_3s, CAR_GOAL_PRIORITY_LINE, 0);
TTL74148_update(machine, TTL74148_3S); ttl74148_update(ttl74148_3s);
} }
void carpolo_generate_car_ball_interrupt(running_machine *machine, int car, int car_x, int car_y) void carpolo_generate_car_ball_interrupt(running_machine *machine, int car, int car_x, int car_y)
@ -151,8 +151,8 @@ void carpolo_generate_car_ball_interrupt(running_machine *machine, int car, int
priority_0_extension = CAR_BALL_EXTRA_BITS; priority_0_extension = CAR_BALL_EXTRA_BITS;
TTL74148_input_line_w(TTL74148_3S, PRI0_PRIORTITY_LINE, 0); ttl74148_input_line_w(ttl74148_3s, PRI0_PRIORTITY_LINE, 0);
TTL74148_update(machine, TTL74148_3S); ttl74148_update(ttl74148_3s);
} }
void carpolo_generate_car_border_interrupt(running_machine *machine, int car, int horizontal_border) void carpolo_generate_car_border_interrupt(running_machine *machine, int car, int horizontal_border)
@ -161,8 +161,8 @@ void carpolo_generate_car_border_interrupt(running_machine *machine, int car, in
priority_0_extension = CAR_BORDER_EXTRA_BITS; priority_0_extension = CAR_BORDER_EXTRA_BITS;
TTL74148_input_line_w(TTL74148_3S, PRI0_PRIORTITY_LINE, 0); ttl74148_input_line_w(ttl74148_3s, PRI0_PRIORTITY_LINE, 0);
TTL74148_update(machine, TTL74148_3S); ttl74148_update(ttl74148_3s);
} }
@ -222,7 +222,7 @@ READ8_HANDLER( carpolo_car_border_collision_cause_r )
READ8_HANDLER( carpolo_interrupt_cause_r ) READ8_HANDLER( carpolo_interrupt_cause_r )
{ {
/* the output of the 148 goes to bits 1-3 (which is priority ^ 7) */ /* the output of the 148 goes to bits 1-3 (which is priority ^ 7) */
return (TTL74148_output_r(TTL74148_3S) << 1) | priority_0_extension; return (ttl74148_output_r(ttl74148_3s) << 1) | priority_0_extension;
} }
@ -233,49 +233,57 @@ INTERRUPT_GEN( carpolo_timer_interrupt )
/* cause the timer interrupt */ /* cause the timer interrupt */
TTL74148_input_line_w(TTL74148_3S, PRI0_PRIORTITY_LINE, 0); ttl74148_input_line_w(ttl74148_3s, PRI0_PRIORTITY_LINE, 0);
priority_0_extension = TIMER_EXTRA_BITS; priority_0_extension = TIMER_EXTRA_BITS;
TTL74148_update(device->machine, TTL74148_3S); ttl74148_update(ttl74148_3s);
/* check the coins here as well - they drive the clock of the flip-flops */ /* check the coins here as well - they drive the clock of the flip-flops */
port_value = input_port_read(device->machine, "IN0"); port_value = input_port_read(device->machine, "IN0");
TTL7474_clock_w(TTL7474_2S_1, port_value & 0x01); ttl7474_clock_w(ttl7474_2s_1, port_value & 0x01);
TTL7474_clock_w(TTL7474_2S_2, port_value & 0x02); ttl7474_clock_w(ttl7474_2s_2, port_value & 0x02);
TTL7474_clock_w(TTL7474_2U_1, port_value & 0x04); ttl7474_clock_w(ttl7474_2u_1, port_value & 0x04);
TTL7474_clock_w(TTL7474_2U_2, port_value & 0x08); ttl7474_clock_w(ttl7474_2u_2, port_value & 0x08);
TTL7474_update(device->machine, TTL7474_2S_1); ttl7474_update(ttl7474_2s_1);
TTL7474_update(device->machine, TTL7474_2S_2); ttl7474_update(ttl7474_2s_2);
TTL7474_update(device->machine, TTL7474_2U_1); ttl7474_update(ttl7474_2u_1);
TTL7474_update(device->machine, TTL7474_2U_2); ttl7474_update(ttl7474_2u_2);
/* read the steering controls */ /* read the steering controls */
for (player = 0; player < 4; player++) for (player = 0; player < 4; player++)
{ {
int movement_flip_flop = TTL7474_1F_1 + (2 * player);
int dir_flip_flop = movement_flip_flop + 1;
static const char *const portnames[] = { "DIAL0", "DIAL1", "DIAL2", "DIAL3" }; static const char *const portnames[] = { "DIAL0", "DIAL1", "DIAL2", "DIAL3" };
const device_config *movement_flip_flop;
const device_config *dir_flip_flop;
switch (player)
{
case 0: movement_flip_flop = ttl7474_1f_1; dir_flip_flop = ttl7474_1f_2; break;
case 1: movement_flip_flop = ttl7474_1d_1; dir_flip_flop = ttl7474_1d_2; break;
case 2: movement_flip_flop = ttl7474_1c_1; dir_flip_flop = ttl7474_1c_2; break;
case 3: movement_flip_flop = ttl7474_1a_1; dir_flip_flop = ttl7474_1a_2; break;
}
port_value = input_port_read(device->machine, portnames[player]); port_value = input_port_read(device->machine, portnames[player]);
if (port_value != last_wheel_value[player]) if (port_value != last_wheel_value[player])
{ {
/* set the movement direction */ /* set the movement direction */
TTL7474_d_w(dir_flip_flop, ((port_value - last_wheel_value[player]) & 0x80) ? 1 : 0); ttl7474_d_w(dir_flip_flop, ((port_value - last_wheel_value[player]) & 0x80) ? 1 : 0);
last_wheel_value[player] = port_value; last_wheel_value[player] = port_value;
} }
/* as the wheel moves, both flip-flops are clocked */ /* as the wheel moves, both flip-flops are clocked */
TTL7474_clock_w(movement_flip_flop, port_value & 0x01); ttl7474_clock_w(movement_flip_flop, port_value & 0x01);
TTL7474_clock_w(dir_flip_flop, port_value & 0x01); ttl7474_clock_w(dir_flip_flop, port_value & 0x01);
TTL7474_update(device->machine, movement_flip_flop); ttl7474_update(movement_flip_flop);
TTL7474_update(device->machine, dir_flip_flop); ttl7474_update(dir_flip_flop);
} }
@ -289,85 +297,85 @@ INTERRUPT_GEN( carpolo_timer_interrupt )
how much, resulting in only two different possible levels */ how much, resulting in only two different possible levels */
if (port_value & 0x01) if (port_value & 0x01)
{ {
TTL74153_input_line_w(TTL74153_1K, 0, player, 1); ttl74153_input_line_w(ttl74153_1k, 0, player, 1);
TTL74153_input_line_w(TTL74153_1K, 1, player, 0); ttl74153_input_line_w(ttl74153_1k, 1, player, 0);
} }
else if (port_value & 0x02) else if (port_value & 0x02)
{ {
TTL74153_input_line_w(TTL74153_1K, 0, player, 1); ttl74153_input_line_w(ttl74153_1k, 0, player, 1);
TTL74153_input_line_w(TTL74153_1K, 1, player, 1); ttl74153_input_line_w(ttl74153_1k, 1, player, 1);
} }
else else
{ {
TTL74153_input_line_w(TTL74153_1K, 0, player, 0); ttl74153_input_line_w(ttl74153_1k, 0, player, 0);
/* the other line is irrelevant */ /* the other line is irrelevant */
} }
port_value >>= 2; port_value >>= 2;
} }
TTL74153_update(TTL74153_1K); ttl74153_update(ttl74153_1k);
} }
static WRITE_LINE_DEVICE_HANDLER( coin1_interrupt_clear_w ) static WRITE_LINE_DEVICE_HANDLER( coin1_interrupt_clear_w )
{ {
TTL7474_clear_w(TTL7474_2S_1, state); ttl7474_clear_w(ttl7474_2s_1, state);
TTL7474_update(device->machine, TTL7474_2S_1); ttl7474_update(ttl7474_2s_1);
} }
static WRITE_LINE_DEVICE_HANDLER( coin2_interrupt_clear_w ) static WRITE_LINE_DEVICE_HANDLER( coin2_interrupt_clear_w )
{ {
TTL7474_clear_w(TTL7474_2S_2, state); ttl7474_clear_w(ttl7474_2s_2, state);
TTL7474_update(device->machine, TTL7474_2S_2); ttl7474_update(ttl7474_2s_2);
} }
static WRITE_LINE_DEVICE_HANDLER( coin3_interrupt_clear_w ) static WRITE_LINE_DEVICE_HANDLER( coin3_interrupt_clear_w )
{ {
TTL7474_clear_w(TTL7474_2U_1, state); ttl7474_clear_w(ttl7474_2u_1, state);
TTL7474_update(device->machine, TTL7474_2U_1); ttl7474_update(ttl7474_2u_1);
} }
static WRITE_LINE_DEVICE_HANDLER( coin4_interrupt_clear_w ) static WRITE_LINE_DEVICE_HANDLER( coin4_interrupt_clear_w )
{ {
TTL7474_clear_w(TTL7474_2U_2, state); ttl7474_clear_w(ttl7474_2u_2, state);
TTL7474_update(device->machine, TTL7474_2U_2); ttl7474_update(ttl7474_2u_2);
} }
WRITE8_HANDLER( carpolo_ball_screen_interrupt_clear_w ) WRITE8_HANDLER( carpolo_ball_screen_interrupt_clear_w )
{ {
TTL74148_input_line_w(TTL74148_3S, BALL_SCREEN_PRIORITY_LINE, 1); ttl74148_input_line_w(ttl74148_3s, BALL_SCREEN_PRIORITY_LINE, 1);
TTL74148_update(space->machine, TTL74148_3S); ttl74148_update(ttl74148_3s);
} }
WRITE8_HANDLER( carpolo_car_car_interrupt_clear_w ) WRITE8_HANDLER( carpolo_car_car_interrupt_clear_w )
{ {
TTL74148_input_line_w(TTL74148_3S, CAR_CAR_PRIORITY_LINE, 1); ttl74148_input_line_w(ttl74148_3s, CAR_CAR_PRIORITY_LINE, 1);
TTL74148_update(space->machine, TTL74148_3S); ttl74148_update(ttl74148_3s);
} }
WRITE8_HANDLER( carpolo_car_goal_interrupt_clear_w ) WRITE8_HANDLER( carpolo_car_goal_interrupt_clear_w )
{ {
TTL74148_input_line_w(TTL74148_3S, CAR_GOAL_PRIORITY_LINE, 1); ttl74148_input_line_w(ttl74148_3s, CAR_GOAL_PRIORITY_LINE, 1);
TTL74148_update(space->machine, TTL74148_3S); ttl74148_update(ttl74148_3s);
} }
WRITE8_HANDLER( carpolo_car_ball_interrupt_clear_w ) WRITE8_HANDLER( carpolo_car_ball_interrupt_clear_w )
{ {
TTL74148_input_line_w(TTL74148_3S, PRI0_PRIORTITY_LINE, 1); ttl74148_input_line_w(ttl74148_3s, PRI0_PRIORTITY_LINE, 1);
TTL74148_update(space->machine, TTL74148_3S); ttl74148_update(ttl74148_3s);
} }
WRITE8_HANDLER( carpolo_car_border_interrupt_clear_w ) WRITE8_HANDLER( carpolo_car_border_interrupt_clear_w )
{ {
TTL74148_input_line_w(TTL74148_3S, PRI0_PRIORTITY_LINE, 1); ttl74148_input_line_w(ttl74148_3s, PRI0_PRIORTITY_LINE, 1);
TTL74148_update(space->machine, TTL74148_3S); ttl74148_update(ttl74148_3s);
} }
WRITE8_HANDLER( carpolo_timer_interrupt_clear_w ) WRITE8_HANDLER( carpolo_timer_interrupt_clear_w )
{ {
TTL74148_input_line_w(TTL74148_3S, PRI0_PRIORTITY_LINE, 1); ttl74148_input_line_w(ttl74148_3s, PRI0_PRIORTITY_LINE, 1);
TTL74148_update(space->machine, TTL74148_3S); ttl74148_update(ttl74148_3s);
} }
@ -391,15 +399,15 @@ static WRITE8_DEVICE_HANDLER( pia_0_port_a_w )
coin_counter_w(device->machine, 0, data & 0x01); coin_counter_w(device->machine, 0, data & 0x01);
TTL7474_clear_w(TTL7474_1F_1, data & 0x08); ttl7474_clear_w(ttl7474_1f_1, data & 0x08);
TTL7474_clear_w(TTL7474_1D_1, data & 0x08); ttl7474_clear_w(ttl7474_1d_1, data & 0x08);
TTL7474_clear_w(TTL7474_1C_1, data & 0x08); ttl7474_clear_w(ttl7474_1c_1, data & 0x08);
TTL7474_clear_w(TTL7474_1A_1, data & 0x08); ttl7474_clear_w(ttl7474_1a_1, data & 0x08);
TTL7474_update(device->machine, TTL7474_1F_1); ttl7474_update(ttl7474_1f_1);
TTL7474_update(device->machine, TTL7474_1D_1); ttl7474_update(ttl7474_1d_1);
TTL7474_update(device->machine, TTL7474_1C_1); ttl7474_update(ttl7474_1c_1);
TTL7474_update(device->machine, TTL7474_1A_1); ttl7474_update(ttl7474_1a_1);
} }
@ -412,10 +420,10 @@ static WRITE8_DEVICE_HANDLER( pia_0_port_b_w )
bit 6 - Select pedal 0 bit 6 - Select pedal 0
bit 7 - Select pdeal 1 */ bit 7 - Select pdeal 1 */
TTL74153_a_w(TTL74153_1K, data & 0x40); ttl74153_a_w(ttl74153_1k, data & 0x40);
TTL74153_b_w(TTL74153_1K, data & 0x80); ttl74153_b_w(ttl74153_1k, data & 0x80);
TTL74153_update(TTL74153_1K); ttl74153_update(ttl74153_1k);
} }
static READ8_DEVICE_HANDLER( pia_0_port_b_r ) static READ8_DEVICE_HANDLER( pia_0_port_b_r )
@ -423,8 +431,8 @@ static READ8_DEVICE_HANDLER( pia_0_port_b_r )
/* bit 4 - Pedal bit 0 /* bit 4 - Pedal bit 0
bit 5 - Pedal bit 1 */ bit 5 - Pedal bit 1 */
return (TTL74153_output_r(TTL74153_1K, 0) << 5) | return (ttl74153_output_r(ttl74153_1k, 0) << 5) |
(TTL74153_output_r(TTL74153_1K, 1) << 4); (ttl74153_output_r(ttl74153_1k, 1) << 4);
} }
@ -441,10 +449,10 @@ static READ8_DEVICE_HANDLER( pia_1_port_a_r )
bit 6 - Player 2 forward/reverse input bit 6 - Player 2 forward/reverse input
bit 7 - Player 1 forward/reverse input */ bit 7 - Player 1 forward/reverse input */
ret = (TTL7474_output_r(TTL7474_1A_2) ? 0x01 : 0x00) | ret = (ttl7474_output_r(ttl7474_1a_2) ? 0x01 : 0x00) |
(TTL7474_output_r(TTL7474_1C_2) ? 0x02 : 0x00) | (ttl7474_output_r(ttl7474_1c_2) ? 0x02 : 0x00) |
(TTL7474_output_r(TTL7474_1D_2) ? 0x04 : 0x00) | (ttl7474_output_r(ttl7474_1d_2) ? 0x04 : 0x00) |
(TTL7474_output_r(TTL7474_1F_2) ? 0x08 : 0x00) | (ttl7474_output_r(ttl7474_1f_2) ? 0x08 : 0x00) |
(input_port_read(device->machine, "IN2") & 0xf0); (input_port_read(device->machine, "IN2") & 0xf0);
return ret; return ret;
@ -460,10 +468,10 @@ static READ8_DEVICE_HANDLER( pia_1_port_b_r )
bit 6 - Player 2 steering input (wheel moving or stopped) bit 6 - Player 2 steering input (wheel moving or stopped)
bit 7 - Player 1 steering input (wheel moving or stopped) */ bit 7 - Player 1 steering input (wheel moving or stopped) */
ret = (TTL7474_output_r(TTL7474_1A_1) ? 0x10 : 0x00) | ret = (ttl7474_output_r(ttl7474_1a_1) ? 0x10 : 0x00) |
(TTL7474_output_r(TTL7474_1C_1) ? 0x20 : 0x00) | (ttl7474_output_r(ttl7474_1c_1) ? 0x20 : 0x00) |
(TTL7474_output_r(TTL7474_1D_1) ? 0x40 : 0x00) | (ttl7474_output_r(ttl7474_1d_1) ? 0x40 : 0x00) |
(TTL7474_output_r(TTL7474_1F_1) ? 0x80 : 0x00); (ttl7474_output_r(ttl7474_1f_1) ? 0x80 : 0x00);
return ret; return ret;
} }
@ -502,34 +510,25 @@ const pia6821_interface carpolo_pia1_intf =
DEVCB_NULL /* IRQB */ DEVCB_NULL /* IRQB */
}; };
static const struct TTL74148_interface TTL74148_3S_intf =
{
TTL74148_3S_cb
};
static const struct TTL7474_interface TTL7474_2S_1_intf =
{
TTL7474_2S_1_cb
};
static const struct TTL7474_interface TTL7474_2S_2_intf =
{
TTL7474_2S_2_cb
};
static const struct TTL7474_interface TTL7474_2U_1_intf =
{
TTL7474_2U_1_cb
};
static const struct TTL7474_interface TTL7474_2U_2_intf =
{
TTL7474_2U_2_cb
};
MACHINE_START( carpolo ) MACHINE_START( carpolo )
{ {
/* find flip-flops */
ttl7474_2s_1 = devtag_get_device(machine, "7474_2s_1");
ttl7474_2s_2 = devtag_get_device(machine, "7474_2s_2");
ttl7474_2u_1 = devtag_get_device(machine, "7474_2u_1");
ttl7474_2u_2 = devtag_get_device(machine, "7474_2u_2");
ttl7474_1f_1 = devtag_get_device(machine, "7474_1f_1");
ttl7474_1f_2 = devtag_get_device(machine, "7474_1f_2");
ttl7474_1d_1 = devtag_get_device(machine, "7474_1d_1");
ttl7474_1d_2 = devtag_get_device(machine, "7474_1d_2");
ttl7474_1c_1 = devtag_get_device(machine, "7474_1c_1");
ttl7474_1c_2 = devtag_get_device(machine, "7474_1c_2");
ttl7474_1a_1 = devtag_get_device(machine, "7474_1a_1");
ttl7474_1a_2 = devtag_get_device(machine, "7474_1a_2");
ttl74148_3s = devtag_get_device(machine, "74148_3s");
ttl74153_1k = devtag_get_device(machine, "74153_1k");
state_save_register_global(machine, ball_screen_collision_cause); state_save_register_global(machine, ball_screen_collision_cause);
state_save_register_global(machine, car_ball_collision_x); state_save_register_global(machine, car_ball_collision_x);
state_save_register_global(machine, car_ball_collision_y); state_save_register_global(machine, car_ball_collision_y);
@ -544,67 +543,49 @@ MACHINE_START( carpolo )
MACHINE_RESET( carpolo ) MACHINE_RESET( carpolo )
{ {
/* set up the priority encoder */ /* set up the priority encoder */
TTL74148_config(machine, TTL74148_3S, &TTL74148_3S_intf); ttl74148_enable_input_w(ttl74148_3s, 0); /* always enabled */
TTL74148_enable_input_w(TTL74148_3S, 0); /* always enabled */
/* set up the coin handling flip-flops */ /* set up the coin handling flip-flops */
TTL7474_config(machine, TTL7474_2S_1, &TTL7474_2S_1_intf); ttl7474_d_w (ttl7474_2s_1, 1);
TTL7474_config(machine, TTL7474_2S_2, &TTL7474_2S_2_intf); ttl7474_preset_w(ttl7474_2s_1, 1);
TTL7474_config(machine, TTL7474_2U_1, &TTL7474_2U_1_intf);
TTL7474_config(machine, TTL7474_2U_2, &TTL7474_2U_2_intf);
TTL7474_d_w (TTL7474_2S_1, 1); ttl7474_d_w (ttl7474_2s_2, 1);
TTL7474_preset_w(TTL7474_2S_1, 1); ttl7474_preset_w(ttl7474_2s_2, 1);
TTL7474_d_w (TTL7474_2S_2, 1); ttl7474_d_w (ttl7474_2u_1, 1);
TTL7474_preset_w(TTL7474_2S_2, 1); ttl7474_preset_w(ttl7474_2u_1, 1);
TTL7474_d_w (TTL7474_2U_1, 1); ttl7474_d_w (ttl7474_2u_2, 1);
TTL7474_preset_w(TTL7474_2U_1, 1); ttl7474_preset_w(ttl7474_2u_2, 1);
TTL7474_d_w (TTL7474_2U_2, 1);
TTL7474_preset_w(TTL7474_2U_2, 1);
/* set up the steering handling flip-flops */ /* set up the steering handling flip-flops */
TTL7474_config(machine, TTL7474_1F_1, 0); ttl7474_d_w (ttl7474_1f_1, 1);
TTL7474_config(machine, TTL7474_1F_2, 0); ttl7474_preset_w(ttl7474_1f_1, 1);
TTL7474_config(machine, TTL7474_1D_1, 0);
TTL7474_config(machine, TTL7474_1D_2, 0);
TTL7474_config(machine, TTL7474_1C_1, 0);
TTL7474_config(machine, TTL7474_1C_2, 0);
TTL7474_config(machine, TTL7474_1A_1, 0);
TTL7474_config(machine, TTL7474_1A_2, 0);
TTL7474_d_w (TTL7474_1F_1, 1); ttl7474_clear_w (ttl7474_1f_2, 1);
TTL7474_preset_w(TTL7474_1F_1, 1); ttl7474_preset_w(ttl7474_1f_2, 1);
TTL7474_clear_w (TTL7474_1F_2, 1); ttl7474_d_w (ttl7474_1d_1, 1);
TTL7474_preset_w(TTL7474_1F_2, 1); ttl7474_preset_w(ttl7474_1d_1, 1);
TTL7474_d_w (TTL7474_1D_1, 1); ttl7474_clear_w (ttl7474_1d_2, 1);
TTL7474_preset_w(TTL7474_1D_1, 1); ttl7474_preset_w(ttl7474_1d_2, 1);
TTL7474_clear_w (TTL7474_1D_2, 1); ttl7474_d_w (ttl7474_1c_1, 1);
TTL7474_preset_w(TTL7474_1D_2, 1); ttl7474_preset_w(ttl7474_1c_1, 1);
TTL7474_d_w (TTL7474_1C_1, 1); ttl7474_clear_w (ttl7474_1c_2, 1);
TTL7474_preset_w(TTL7474_1C_1, 1); ttl7474_preset_w(ttl7474_1c_2, 1);
TTL7474_clear_w (TTL7474_1C_2, 1); ttl7474_d_w (ttl7474_1a_1, 1);
TTL7474_preset_w(TTL7474_1C_2, 1); ttl7474_preset_w(ttl7474_1a_1, 1);
TTL7474_d_w (TTL7474_1A_1, 1); ttl7474_clear_w (ttl7474_1a_2, 1);
TTL7474_preset_w(TTL7474_1A_1, 1); ttl7474_preset_w(ttl7474_1a_2, 1);
TTL7474_clear_w (TTL7474_1A_2, 1);
TTL7474_preset_w(TTL7474_1A_2, 1);
/* set up the pedal handling chips */ /* set up the pedal handling chips */
TTL74153_config(machine, TTL74153_1K, 0); ttl74153_enable_w(ttl74153_1k, 0, 0);
ttl74153_enable_w(ttl74153_1k, 1, 0);
TTL74153_enable_w(TTL74153_1K, 0, 0);
TTL74153_enable_w(TTL74153_1K, 1, 0);
} }

View File

@ -16,67 +16,60 @@ static emu_timer *int_timer;
static UINT8 _4in1_bank; static UINT8 _4in1_bank;
static void galaxold_7474_9M_2_callback(running_machine *machine) void galaxold_7474_9m_2_callback(const device_config *device)
{ {
/* Q bar clocks the other flip-flop, /* Q bar clocks the other flip-flop,
Q is VBLANK (not visible to the CPU) */ Q is VBLANK (not visible to the CPU) */
TTL7474_clock_w(1, TTL7474_output_comp_r(0)); const device_config *target = devtag_get_device(device->machine, "7474_9m_1");
TTL7474_update(machine, 1); ttl7474_clock_w(target, ttl7474_output_comp_r(device));
ttl7474_update(target);
} }
static void galaxold_7474_9M_1_callback(running_machine *machine) void galaxold_7474_9m_1_callback(const device_config *device)
{ {
/* Q goes to the NMI line */ /* Q goes to the NMI line */
cputag_set_input_line(machine, "maincpu", irq_line, TTL7474_output_r(1) ? CLEAR_LINE : ASSERT_LINE); cputag_set_input_line(device->machine, "maincpu", irq_line, ttl7474_output_r(device) ? CLEAR_LINE : ASSERT_LINE);
} }
static const struct TTL7474_interface galaxold_7474_9M_2_intf =
{
galaxold_7474_9M_2_callback
};
static const struct TTL7474_interface galaxold_7474_9M_1_intf =
{
galaxold_7474_9M_1_callback
};
WRITE8_HANDLER( galaxold_nmi_enable_w ) WRITE8_HANDLER( galaxold_nmi_enable_w )
{ {
TTL7474_preset_w(1, data); const device_config *target = devtag_get_device(space->machine, "7474_9m_1");
TTL7474_update(space->machine, 1); ttl7474_preset_w(target, data);
ttl7474_update(target);
} }
static TIMER_CALLBACK( interrupt_timer ) static TIMER_CALLBACK( interrupt_timer )
{ {
const device_config *target = devtag_get_device(machine, "7474_9m_2");
/* 128V, 64V and 32V go to D */ /* 128V, 64V and 32V go to D */
TTL7474_d_w(0, (param & 0xe0) != 0xe0); ttl7474_d_w(target, (param & 0xe0) != 0xe0);
/* 16V clocks the flip-flop */ /* 16V clocks the flip-flop */
TTL7474_clock_w(0, param & 0x10); ttl7474_clock_w(target, param & 0x10);
param = (param + 0x10) & 0xff; param = (param + 0x10) & 0xff;
timer_adjust_oneshot(int_timer, video_screen_get_time_until_pos(machine->primary_screen, param, 0), param); timer_adjust_oneshot(int_timer, video_screen_get_time_until_pos(machine->primary_screen, param, 0), param);
TTL7474_update(machine, 0); ttl7474_update(target);
} }
static void machine_reset_common(running_machine *machine, int line) static void machine_reset_common(running_machine *machine, int line)
{ {
const device_config *ttl7474_9m_1 = devtag_get_device(machine, "7474_9m_1");
const device_config *ttl7474_9m_2 = devtag_get_device(machine, "7474_9m_2");
irq_line = line; irq_line = line;
/* initalize main CPU interrupt generator flip-flops */ /* initalize main CPU interrupt generator flip-flops */
TTL7474_config(machine, 0, &galaxold_7474_9M_2_intf); ttl7474_preset_w(ttl7474_9m_2, 1);
TTL7474_preset_w(0, 1); ttl7474_clear_w (ttl7474_9m_2, 1);
TTL7474_clear_w (0, 1);
TTL7474_config(machine, 1, &galaxold_7474_9M_1_intf); ttl7474_clear_w (ttl7474_9m_1, 1);
TTL7474_clear_w (1, 1); ttl7474_d_w (ttl7474_9m_1, 0);
TTL7474_d_w (1, 0); ttl7474_preset_w(ttl7474_9m_1, 0);
TTL7474_preset_w(1, 0);
/* start a timer to generate interrupts */ /* start a timer to generate interrupts */
int_timer = timer_alloc(machine, interrupt_timer, NULL); int_timer = timer_alloc(machine, interrupt_timer, NULL);

View File

@ -11,6 +11,9 @@
#include "machine/pit8253.h" #include "machine/pit8253.h"
static const device_config *ttl74148;
/************************************* /*************************************
* *
@ -20,7 +23,6 @@
static PIT8253_OUTPUT_CHANGED( v_irq4_w ); static PIT8253_OUTPUT_CHANGED( v_irq4_w );
static PIT8253_OUTPUT_CHANGED( v_irq3_w ); static PIT8253_OUTPUT_CHANGED( v_irq3_w );
static void update_irq(running_machine *machine);
@ -59,12 +61,6 @@ const struct pit8253_config vertigo_pit8254_config =
}; };
static const struct TTL74148_interface irq_encoder =
{
update_irq
};
/************************************* /*************************************
* *
@ -74,22 +70,22 @@ static const struct TTL74148_interface irq_encoder =
* *
*************************************/ *************************************/
static void update_irq(running_machine *machine) void vertigo_update_irq(const device_config *device)
{ {
if (irq_state < 7) if (irq_state < 7)
cputag_set_input_line(machine, "maincpu", irq_state ^ 7, CLEAR_LINE); cputag_set_input_line(device->machine, "maincpu", irq_state ^ 7, CLEAR_LINE);
irq_state = TTL74148_output_r(0); irq_state = ttl74148_output_r(device);
if (irq_state < 7) if (irq_state < 7)
cputag_set_input_line(machine, "maincpu", irq_state ^ 7, ASSERT_LINE); cputag_set_input_line(device->machine, "maincpu", irq_state ^ 7, ASSERT_LINE);
} }
static void update_irq_encoder(running_machine *machine, int line, int state) static void update_irq_encoder(running_machine *machine, int line, int state)
{ {
TTL74148_input_line_w(0, line, !state); ttl74148_input_line_w(ttl74148, line, !state);
TTL74148_update(machine, 0); ttl74148_update(ttl74148);
} }
@ -211,13 +207,13 @@ MACHINE_RESET( vertigo )
{ {
int i; int i;
TTL74148_config(machine, 0, &irq_encoder); ttl74148 = devtag_get_device(machine, "74148");
TTL74148_enable_input_w(0, 0); ttl74148_enable_input_w(ttl74148, 0);
for (i = 0; i < 8; i++) for (i = 0; i < 8; i++)
TTL74148_input_line_w(0, i, 1); ttl74148_input_line_w(ttl74148, i, 1);
TTL74148_update(machine, 0); ttl74148_update(ttl74148);
vertigo_vproc_init(machine); vertigo_vproc_init(machine);
irq4_time = timer_get_time(machine); irq4_time = timer_get_time(machine);

View File

@ -61,6 +61,7 @@ VIDEO_START( artmagic )
blitter_base = (UINT16 *)memory_region(machine, "gfx1"); blitter_base = (UINT16 *)memory_region(machine, "gfx1");
blitter_mask = memory_region_length(machine, "gfx1")/2 - 1; blitter_mask = memory_region_length(machine, "gfx1")/2 - 1;
tlc34076_state_save(machine);
state_save_register_global_array(machine, artmagic_xor); state_save_register_global_array(machine, artmagic_xor);
state_save_register_global(machine, artmagic_is_stoneball); state_save_register_global(machine, artmagic_is_stoneball);
state_save_register_global_array(machine, blitter_data); state_save_register_global_array(machine, blitter_data);