diff options
| author | 2009-11-18 23:20:30 +0000 | |
|---|---|---|
| committer | 2009-11-18 23:20:30 +0000 | |
| commit | b5af35345a7783eb69ea46795d363a78c0c80e06 (patch) | |
| tree | 551d7c5c11a56dc2a225305dd427d3815d4fffac /src | |
| parent | 09cb5b9ffc1e7aa50885f7e48c3d344259b4a081 (diff) | |
Added driver_data struct and save states to n8080.c
Diffstat (limited to 'src')
| -rw-r--r-- | src/mame/audio/n8080.c | 329 | ||||
| -rw-r--r-- | src/mame/drivers/n8080.c | 388 | ||||
| -rw-r--r-- | src/mame/includes/n8080.h | 49 | ||||
| -rw-r--r-- | src/mame/video/n8080.c | 168 |
4 files changed, 545 insertions, 389 deletions
diff --git a/src/mame/audio/n8080.c b/src/mame/audio/n8080.c index 071c6b3c6da..28446632163 100644 --- a/src/mame/audio/n8080.c +++ b/src/mame/audio/n8080.c @@ -10,25 +10,9 @@ #include "sound/dac.h" #include "includes/n8080.h" -static int n8080_hardware; - -static emu_timer* sound_timer[3]; - -static int helifire_dac_phase; - static const double ATTACK_RATE = 10e-6 * 500; static const double DECAY_RATE = 10e-6 * 16000; -static double helifire_dac_volume; -static double helifire_dac_timing; - -static UINT16 prev_sound_pins; -static UINT16 curr_sound_pins; - -static int mono_flop[3]; - - - static const sn76477_interface sheriff_sn76477_interface = { RES_K(36) , /* 04 */ @@ -85,16 +69,17 @@ static const sn76477_interface spacefev_sn76477_interface = }; -static void spacefev_update_SN76477_status(const device_config *sn) +static void spacefev_update_SN76477_status( const device_config *sn ) { + n8080_state *state = (n8080_state *)sn->machine->driver_data; double dblR0 = RES_M(1.0); double dblR1 = RES_M(1.5); - if (!mono_flop[0]) + if (!state->mono_flop[0]) { dblR0 = 1 / (1 / RES_K(150) + 1 / dblR0); /* ? */ } - if (!mono_flop[1]) + if (!state->mono_flop[1]) { dblR1 = 1 / (1 / RES_K(620) + 1 / dblR1); /* ? */ } @@ -104,19 +89,20 @@ static void spacefev_update_SN76477_status(const device_config *sn) sn76477_vco_res_w(sn, dblR1); sn76477_enable_w(sn, - !mono_flop[0] && - !mono_flop[1] && - !mono_flop[2]); + !state->mono_flop[0] && + !state->mono_flop[1] && + !state->mono_flop[2]); - sn76477_vco_w(sn, mono_flop[1]); + sn76477_vco_w(sn, state->mono_flop[1]); - sn76477_mixer_b_w(sn, mono_flop[0]); + sn76477_mixer_b_w(sn, state->mono_flop[0]); } -static void sheriff_update_SN76477_status(const device_config *sn) +static void sheriff_update_SN76477_status( const device_config *sn ) { - if (mono_flop[1]) + n8080_state *state = (n8080_state *)sn->machine->driver_data; + if (state->mono_flop[1]) { sn76477_vco_voltage_w(sn, 5); } @@ -126,45 +112,48 @@ static void sheriff_update_SN76477_status(const device_config *sn) } sn76477_enable_w(sn, - !mono_flop[0] && - !mono_flop[1]); + !state->mono_flop[0] && + !state->mono_flop[1]); - sn76477_vco_w(sn, mono_flop[0]); + sn76477_vco_w(sn, state->mono_flop[0]); - sn76477_mixer_b_w(sn, !mono_flop[0]); + sn76477_mixer_b_w(sn, !state->mono_flop[0]); } -static void update_SN76477_status(const device_config *device) +static void update_SN76477_status( const device_config *device ) { - if (n8080_hardware == 1) + n8080_state *state = (n8080_state *)device->machine->driver_data; + if (state->n8080_hardware == 1) { spacefev_update_SN76477_status(device); } - if (n8080_hardware == 2) + if (state->n8080_hardware == 2) { sheriff_update_SN76477_status(device); } } -static void start_mono_flop(const device_config *sn, int n, attotime expire) +static void start_mono_flop( const device_config *sn, int n, attotime expire ) { - mono_flop[n] = 1; + n8080_state *state = (n8080_state *)sn->machine->driver_data; + state->mono_flop[n] = 1; update_SN76477_status(sn); - timer_adjust_oneshot(sound_timer[n], expire, n); + timer_adjust_oneshot(state->sound_timer[n], expire, n); } -static void stop_mono_flop(const device_config *sn, int n) +static void stop_mono_flop( const device_config *sn, int n ) { - mono_flop[n] = 0; + n8080_state *state = (n8080_state *)sn->machine->driver_data; + state->mono_flop[n] = 0; update_SN76477_status(sn); - timer_adjust_oneshot(sound_timer[n], attotime_never, n); + timer_adjust_oneshot(state->sound_timer[n], attotime_never, n); } @@ -174,10 +163,11 @@ static TIMER_CALLBACK( stop_mono_flop_callback ) } -static void spacefev_sound_pins_changed(running_machine *machine) +static void spacefev_sound_pins_changed( running_machine *machine ) { const device_config *sn = devtag_get_device(machine, "snsnd"); - UINT16 changes = ~curr_sound_pins & prev_sound_pins; + n8080_state *state = (n8080_state *)machine->driver_data; + UINT16 changes = ~state->curr_sound_pins & state->prev_sound_pins; if (changes & (1 << 0x3)) { @@ -206,10 +196,11 @@ static void spacefev_sound_pins_changed(running_machine *machine) } -static void sheriff_sound_pins_changed(running_machine *machine) +static void sheriff_sound_pins_changed( running_machine *machine ) { const device_config *sn = devtag_get_device(machine, "snsnd"); - UINT16 changes = ~curr_sound_pins & prev_sound_pins; + n8080_state *state = (n8080_state *)machine->driver_data; + UINT16 changes = ~state->curr_sound_pins & state->prev_sound_pins; if (changes & (1 << 0x6)) { @@ -230,13 +221,14 @@ static void sheriff_sound_pins_changed(running_machine *machine) } -static void helifire_sound_pins_changed(running_machine *machine) +static void helifire_sound_pins_changed( running_machine *machine ) { - UINT16 changes = ~curr_sound_pins & prev_sound_pins; + n8080_state *state = (n8080_state *)machine->driver_data; + UINT16 changes = ~state->curr_sound_pins & state->prev_sound_pins; - /* ((curr_sound_pins >> 0xA) & 1) not emulated */ - /* ((curr_sound_pins >> 0xB) & 1) not emulated */ - /* ((curr_sound_pins >> 0xC) & 1) not emulated */ + /* ((state->curr_sound_pins >> 0xa) & 1) not emulated */ + /* ((state->curr_sound_pins >> 0xb) & 1) not emulated */ + /* ((state->curr_sound_pins >> 0xc) & 1) not emulated */ if (changes & (1 << 6)) { @@ -245,30 +237,26 @@ static void helifire_sound_pins_changed(running_machine *machine) } -static void sound_pins_changed(running_machine *machine) +static void sound_pins_changed( running_machine *machine ) { - if (n8080_hardware == 1) - { + n8080_state *state = (n8080_state *)machine->driver_data; + + if (state->n8080_hardware == 1) spacefev_sound_pins_changed(machine); - } - if (n8080_hardware == 2) - { + if (state->n8080_hardware == 2) sheriff_sound_pins_changed(machine); - } - if (n8080_hardware == 3) - { + if (state->n8080_hardware == 3) helifire_sound_pins_changed(machine); - } - prev_sound_pins = curr_sound_pins; + state->prev_sound_pins = state->curr_sound_pins; } -static void delayed_sound_1(running_machine *machine, int data) +static void delayed_sound_1( running_machine *machine, int data ) { - static UINT8 prev_data = 0; + n8080_state *state = (n8080_state *)machine->driver_data; - curr_sound_pins &= ~( + state->curr_sound_pins &= ~( (1 << 0x7) | (1 << 0x5) | (1 << 0x6) | @@ -276,26 +264,26 @@ static void delayed_sound_1(running_machine *machine, int data) (1 << 0x4) | (1 << 0x1)); - if (~data & 0x01) curr_sound_pins |= 1 << 0x7; - if (~data & 0x02) curr_sound_pins |= 1 << 0x5; /* pulse */ - if (~data & 0x04) curr_sound_pins |= 1 << 0x6; /* pulse */ - if (~data & 0x08) curr_sound_pins |= 1 << 0x3; /* pulse (except in Helifire) */ - if (~data & 0x10) curr_sound_pins |= 1 << 0x4; /* pulse (except in Helifire) */ - if (~data & 0x20) curr_sound_pins |= 1 << 0x1; + if (~data & 0x01) state->curr_sound_pins |= 1 << 0x7; + if (~data & 0x02) state->curr_sound_pins |= 1 << 0x5; /* pulse */ + if (~data & 0x04) state->curr_sound_pins |= 1 << 0x6; /* pulse */ + if (~data & 0x08) state->curr_sound_pins |= 1 << 0x3; /* pulse (except in Helifire) */ + if (~data & 0x10) state->curr_sound_pins |= 1 << 0x4; /* pulse (except in Helifire) */ + if (~data & 0x20) state->curr_sound_pins |= 1 << 0x1; - if (n8080_hardware == 1) + if (state->n8080_hardware == 1) { - if (data & ~prev_data & 0x10) + if (data & ~state->prev_snd_data & 0x10) { spacefev_start_red_cannon(machine); } - spacefev_red_screen = data & 0x08; + state->spacefev_red_screen = data & 0x08; } sound_pins_changed(machine); - prev_data = data; + state->prev_snd_data = data; } @@ -305,31 +293,29 @@ static TIMER_CALLBACK( delayed_sound_1_callback ) } -static void delayed_sound_2(running_machine *machine, int data) +static void delayed_sound_2( running_machine *machine, int data ) { - curr_sound_pins &= ~( + n8080_state *state = (n8080_state *)machine->driver_data; + + state->curr_sound_pins &= ~( (1 << 0x8) | (1 << 0x9) | - (1 << 0xA) | - (1 << 0xB) | + (1 << 0xa) | + (1 << 0xb) | (1 << 0x2) | - (1 << 0xC)); + (1 << 0xc)); - if (~data & 0x01) curr_sound_pins |= 1 << 0x8; - if (~data & 0x02) curr_sound_pins |= 1 << 0x9; - if (~data & 0x04) curr_sound_pins |= 1 << 0xA; - if (~data & 0x08) curr_sound_pins |= 1 << 0xB; - if (~data & 0x10) curr_sound_pins |= 1 << 0x2; /* pulse */ - if (~data & 0x20) curr_sound_pins |= 1 << 0xC; + if (~data & 0x01) state->curr_sound_pins |= 1 << 0x8; + if (~data & 0x02) state->curr_sound_pins |= 1 << 0x9; + if (~data & 0x04) state->curr_sound_pins |= 1 << 0xa; + if (~data & 0x08) state->curr_sound_pins |= 1 << 0xb; + if (~data & 0x10) state->curr_sound_pins |= 1 << 0x2; /* pulse */ + if (~data & 0x20) state->curr_sound_pins |= 1 << 0xc; - if (n8080_hardware == 1) - { + if (state->n8080_hardware == 1) flip_screen_set_no_update(machine, data & 0x20); - } - if (n8080_hardware == 3) - { - helifire_flash = data & 0x20; - } + if (state->n8080_hardware == 3) + state->helifire_flash = data & 0x20; sound_pins_changed(machine); } @@ -354,16 +340,17 @@ WRITE8_HANDLER( n8080_sound_2_w ) static READ8_HANDLER( n8080_8035_p1_r ) { + n8080_state *state = (n8080_state *)space->machine->driver_data; UINT8 val = 0; - if ((curr_sound_pins >> 0xB) & 1) val |= 0x01; - if ((curr_sound_pins >> 0xA) & 1) val |= 0x02; - if ((curr_sound_pins >> 0x9) & 1) val |= 0x04; - if ((curr_sound_pins >> 0x8) & 1) val |= 0x08; - if ((curr_sound_pins >> 0x5) & 1) val |= 0x10; - if ((curr_sound_pins >> 0x3) & 1) val |= 0x20; - if ((curr_sound_pins >> 0x2) & 1) val |= 0x40; - if ((curr_sound_pins >> 0x1) & 1) val |= 0x80; + if ((state->curr_sound_pins >> 0xb) & 1) val |= 0x01; + if ((state->curr_sound_pins >> 0xa) & 1) val |= 0x02; + if ((state->curr_sound_pins >> 0x9) & 1) val |= 0x04; + if ((state->curr_sound_pins >> 0x8) & 1) val |= 0x08; + if ((state->curr_sound_pins >> 0x5) & 1) val |= 0x10; + if ((state->curr_sound_pins >> 0x3) & 1) val |= 0x20; + if ((state->curr_sound_pins >> 0x2) & 1) val |= 0x40; + if ((state->curr_sound_pins >> 0x1) & 1) val |= 0x80; return val; } @@ -371,32 +358,37 @@ static READ8_HANDLER( n8080_8035_p1_r ) static READ8_HANDLER( n8080_8035_t0_r ) { - return (curr_sound_pins >> 0x7) & 1; + n8080_state *state = (n8080_state *)space->machine->driver_data; + return (state->curr_sound_pins >> 0x7) & 1; } static READ8_HANDLER( n8080_8035_t1_r ) { - return (curr_sound_pins >> 0xC) & 1; + n8080_state *state = (n8080_state *)space->machine->driver_data; + return (state->curr_sound_pins >> 0xc) & 1; } static READ8_HANDLER( helifire_8035_t0_r ) { - return (curr_sound_pins >> 0x3) & 1; + n8080_state *state = (n8080_state *)space->machine->driver_data; + return (state->curr_sound_pins >> 0x3) & 1; } static READ8_HANDLER( helifire_8035_t1_r ) { - return (curr_sound_pins >> 0x4) & 1; + n8080_state *state = (n8080_state *)space->machine->driver_data; + return (state->curr_sound_pins >> 0x4) & 1; } static READ8_HANDLER( helifire_8035_external_ram_r ) { + n8080_state *state = (n8080_state *)space->machine->driver_data; UINT8 val = 0; - if ((curr_sound_pins >> 0x7) & 1) val |= 0x01; - if ((curr_sound_pins >> 0x8) & 1) val |= 0x02; - if ((curr_sound_pins >> 0x9) & 1) val |= 0x04; - if ((curr_sound_pins >> 0x1) & 1) val |= 0x08; + if ((state->curr_sound_pins >> 0x7) & 1) val |= 0x01; + if ((state->curr_sound_pins >> 0x8) & 1) val |= 0x02; + if ((state->curr_sound_pins >> 0x9) & 1) val |= 0x04; + if ((state->curr_sound_pins >> 0x1) & 1) val |= 0x08; return val; } @@ -404,7 +396,8 @@ static READ8_HANDLER( helifire_8035_external_ram_r ) static READ8_HANDLER( helifire_8035_p2_r ) { - return ((curr_sound_pins >> 0xC) & 1) ? 0x10 : 0x00; /* not used */ + n8080_state *state = (n8080_state *)space->machine->driver_data; + return ((state->curr_sound_pins >> 0xc) & 1) ? 0x10 : 0x00; /* not used */ } @@ -416,38 +409,41 @@ static WRITE8_HANDLER( n8080_dac_w ) static WRITE8_HANDLER( helifire_dac_w ) { - dac_data_w(devtag_get_device(space->machine, "dac"), data * helifire_dac_volume); + n8080_state *state = (n8080_state *)space->machine->driver_data; + dac_data_w(devtag_get_device(space->machine, "dac"), data * state->helifire_dac_volume); } static WRITE8_HANDLER( helifire_sound_ctrl_w ) { - helifire_dac_phase = data & 0x80; + n8080_state *state = (n8080_state *)space->machine->driver_data; + state->helifire_dac_phase = data & 0x80; /* data & 0x40 not emulated */ /* data & 0x20 not emulated */ - if (helifire_dac_phase) + if (state->helifire_dac_phase) { - helifire_dac_timing = ATTACK_RATE * log(1 - helifire_dac_volume); + state->helifire_dac_timing = ATTACK_RATE * log(1 - state->helifire_dac_volume); } else { - helifire_dac_timing = DECAY_RATE * log(helifire_dac_volume); + state->helifire_dac_timing = DECAY_RATE * log(state->helifire_dac_volume); } - helifire_dac_timing += attotime_to_double(timer_get_time(space->machine)); + state->helifire_dac_timing += attotime_to_double(timer_get_time(space->machine)); } static TIMER_CALLBACK( spacefev_vco_voltage_timer ) { const device_config *sn = devtag_get_device(machine, "snsnd"); + n8080_state *state = (n8080_state *)machine->driver_data; double voltage = 0; - if (mono_flop[2]) + if (state->mono_flop[2]) { - voltage = 5 * (1 - exp(- attotime_to_double(timer_timeelapsed(sound_timer[2])) / 0.22)); + voltage = 5 * (1 - exp(- attotime_to_double(timer_timeelapsed(state->sound_timer[2])) / 0.22)); } sn76477_vco_voltage_w(sn, voltage); @@ -456,66 +452,113 @@ static TIMER_CALLBACK( spacefev_vco_voltage_timer ) static TIMER_CALLBACK( helifire_dac_volume_timer ) { - double t = helifire_dac_timing - attotime_to_double(timer_get_time(machine)); + n8080_state *state = (n8080_state *)machine->driver_data; + double t = state->helifire_dac_timing - attotime_to_double(timer_get_time(machine)); - if (helifire_dac_phase) + if (state->helifire_dac_phase) { - helifire_dac_volume = 1 - exp(t / ATTACK_RATE); + state->helifire_dac_volume = 1 - exp(t / ATTACK_RATE); } else { - helifire_dac_volume = exp(t / DECAY_RATE); + state->helifire_dac_volume = exp(t / DECAY_RATE); } } -static MACHINE_RESET( spacefev_sound ) +MACHINE_START( spacefev_sound ) { - n8080_hardware = 1; + n8080_state *state = (n8080_state *)machine->driver_data; - timer_pulse(machine, ATTOTIME_IN_HZ(1000), NULL, 0, spacefev_vco_voltage_timer); + state->sound_timer[0] = timer_alloc(machine, stop_mono_flop_callback, NULL); + state->sound_timer[1] = timer_alloc(machine, stop_mono_flop_callback, NULL); + state->sound_timer[2] = timer_alloc(machine, stop_mono_flop_callback, NULL); + + state_save_register_global(machine, state->prev_snd_data); + state_save_register_global(machine, state->prev_sound_pins); + state_save_register_global(machine, state->curr_sound_pins); + state_save_register_global(machine, state->n8080_hardware); + state_save_register_global_array(machine, state->mono_flop); +} + +MACHINE_RESET( spacefev_sound ) +{ + n8080_state *state = (n8080_state *)machine->driver_data; + state->n8080_hardware = 1; - sound_timer[0] = timer_alloc(machine, stop_mono_flop_callback, NULL); - sound_timer[1] = timer_alloc(machine, stop_mono_flop_callback, NULL); - sound_timer[2] = timer_alloc(machine, stop_mono_flop_callback, NULL); + timer_pulse(machine, ATTOTIME_IN_HZ(1000), NULL, 0, spacefev_vco_voltage_timer); - mono_flop[0] = 0; - mono_flop[1] = 0; - mono_flop[2] = 0; + state->mono_flop[0] = 0; + state->mono_flop[1] = 0; + state->mono_flop[2] = 0; + state->prev_snd_data = 0; + state->prev_sound_pins = 0; + state->curr_sound_pins = 0; delayed_sound_1(machine, 0); delayed_sound_2(machine, 0); } -static MACHINE_RESET( sheriff_sound ) +MACHINE_START( sheriff_sound ) { - n8080_hardware = 2; + n8080_state *state = (n8080_state *)machine->driver_data; - sound_timer[0] = timer_alloc(machine, stop_mono_flop_callback, NULL); - sound_timer[1] = timer_alloc(machine, stop_mono_flop_callback, NULL); + state->sound_timer[0] = timer_alloc(machine, stop_mono_flop_callback, NULL); + state->sound_timer[1] = timer_alloc(machine, stop_mono_flop_callback, NULL); - mono_flop[0] = 0; - mono_flop[1] = 0; + state_save_register_global(machine, state->prev_snd_data); + state_save_register_global(machine, state->prev_sound_pins); + state_save_register_global(machine, state->curr_sound_pins); + state_save_register_global(machine, state->n8080_hardware); + state_save_register_global_array(machine, state->mono_flop); +} + +MACHINE_RESET( sheriff_sound ) +{ + n8080_state *state = (n8080_state *)machine->driver_data; + state->n8080_hardware = 2; + + state->mono_flop[0] = 0; + state->mono_flop[1] = 0; + state->prev_snd_data = 0; + state->prev_sound_pins = 0; + state->curr_sound_pins = 0; delayed_sound_1(machine, 0); delayed_sound_2(machine, 0); } -static MACHINE_RESET( helifire_sound ) +MACHINE_START( helifire_sound ) +{ + n8080_state *state = (n8080_state *)machine->driver_data; + + state_save_register_global(machine, state->prev_snd_data); + state_save_register_global(machine, state->prev_sound_pins); + state_save_register_global(machine, state->curr_sound_pins); + state_save_register_global(machine, state->n8080_hardware); + state_save_register_global(machine, state->helifire_dac_volume); + state_save_register_global(machine, state->helifire_dac_timing); + state_save_register_global(machine, state->helifire_dac_phase); +} + +MACHINE_RESET( helifire_sound ) { - n8080_hardware = 3; + n8080_state *state = (n8080_state *)machine->driver_data; + state->n8080_hardware = 3; timer_pulse(machine, ATTOTIME_IN_HZ(1000), NULL, 0, helifire_dac_volume_timer); - helifire_dac_volume = 1; - helifire_dac_timing = 0; + state->helifire_dac_volume = 1; + state->helifire_dac_timing = 0; + state->helifire_dac_phase = 0; + state->prev_snd_data = 0; + state->prev_sound_pins = 0; + state->curr_sound_pins = 0; delayed_sound_1(machine, 0); delayed_sound_2(machine, 0); - - helifire_dac_phase = 0; } @@ -553,8 +596,6 @@ MACHINE_DRIVER_START( spacefev_sound ) MDRV_CPU_PROGRAM_MAP(n8080_sound_cpu_map) MDRV_CPU_IO_MAP(n8080_sound_io_map) - MDRV_MACHINE_RESET(spacefev_sound) - /* sound hardware */ MDRV_SPEAKER_STANDARD_MONO("mono") @@ -574,8 +615,6 @@ MACHINE_DRIVER_START( sheriff_sound ) MDRV_CPU_PROGRAM_MAP(n8080_sound_cpu_map) MDRV_CPU_IO_MAP(n8080_sound_io_map) - MDRV_MACHINE_RESET(sheriff_sound) - /* sound hardware */ MDRV_SPEAKER_STANDARD_MONO("mono") @@ -595,8 +634,6 @@ MACHINE_DRIVER_START( helifire_sound ) MDRV_CPU_PROGRAM_MAP(n8080_sound_cpu_map) MDRV_CPU_IO_MAP(helifire_sound_io_map) - MDRV_MACHINE_RESET(helifire_sound) - /* sound hardware */ MDRV_SPEAKER_STANDARD_MONO("mono") diff --git a/src/mame/drivers/n8080.c b/src/mame/drivers/n8080.c index 6d98aad75cf..a72f6944197 100644 --- a/src/mame/drivers/n8080.c +++ b/src/mame/drivers/n8080.c @@ -16,36 +16,36 @@ #define MASTER_CLOCK XTAL_20_16MHz -static unsigned shift_data; -static unsigned shift_bits; -static int inte; static WRITE8_HANDLER( n8080_shift_bits_w ) { - shift_bits = data & 7; + n8080_state *state = (n8080_state *)space->machine->driver_data; + state->shift_bits = data & 7; } static WRITE8_HANDLER( n8080_shift_data_w ) { - shift_data = (shift_data >> 8) | (data << 8); + n8080_state *state = (n8080_state *)space->machine->driver_data; + state->shift_data = (state->shift_data >> 8) | (data << 8); } static READ8_HANDLER( n8080_shift_r ) { - return shift_data >> (8 - shift_bits); + n8080_state *state = (n8080_state *)space->machine->driver_data; + return state->shift_data >> (8 - state->shift_bits); } static ADDRESS_MAP_START( main_cpu_map, ADDRESS_SPACE_PROGRAM, 8 ) ADDRESS_MAP_GLOBAL_MASK(0x7fff) AM_RANGE(0x0000, 0x3fff) AM_ROM - AM_RANGE(0x4000, 0x7fff) AM_RAM AM_BASE(&videoram) + AM_RANGE(0x4000, 0x7fff) AM_RAM AM_BASE_MEMBER(n8080_state, videoram) ADDRESS_MAP_END static ADDRESS_MAP_START( helifire_main_cpu_map, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x0000, 0x3fff) AM_ROM - AM_RANGE(0x4000, 0x7fff) AM_RAM AM_BASE(&videoram) - AM_RANGE(0xc000, 0xdfff) AM_RAM AM_BASE(&colorram) + AM_RANGE(0x4000, 0x7fff) AM_RAM AM_BASE_MEMBER(n8080_state, videoram) + AM_RANGE(0xc000, 0xdfff) AM_RAM AM_BASE_MEMBER(n8080_state, colorram) ADDRESS_MAP_END static ADDRESS_MAP_START( main_io_map, ADDRESS_SPACE_IO, 8 ) @@ -63,130 +63,8 @@ static ADDRESS_MAP_START( main_io_map, ADDRESS_SPACE_IO, 8 ) AM_RANGE(0x06, 0x06) AM_WRITE(n8080_video_control_w) ADDRESS_MAP_END -/* Interrupts */ - -static TIMER_DEVICE_CALLBACK( rst1_tick ) -{ - int state = inte ? ASSERT_LINE : CLEAR_LINE; - - /* V7 = 1, V6 = 0 */ - cputag_set_input_line_and_vector(timer->machine, "maincpu", INPUT_LINE_IRQ0, state, 0xcf); -} - -static TIMER_DEVICE_CALLBACK( rst2_tick ) -{ - int state = inte ? ASSERT_LINE : CLEAR_LINE; - - /* vblank */ - cputag_set_input_line_and_vector(timer->machine, "maincpu", INPUT_LINE_IRQ0, state, 0xd7); -} - -static WRITE_LINE_DEVICE_HANDLER( n8080_inte_callback ) -{ - inte = state; -} - -static WRITE8_DEVICE_HANDLER( n8080_status_callback ) -{ - if (data & I8085_STATUS_INTA) - { - /* interrupt acknowledge */ - cpu_set_input_line(device, INPUT_LINE_IRQ0, CLEAR_LINE); - } -} - -static I8085_CONFIG( n8080_cpu_config ) -{ - DEVCB_HANDLER(n8080_status_callback), /* STATUS changed callback */ - DEVCB_LINE(n8080_inte_callback), /* INTE changed callback */ - DEVCB_NULL, /* SID changed callback (8085A only) */ - DEVCB_NULL /* SOD changed callback (8085A only) */ -}; - -static MACHINE_DRIVER_START( spacefev ) - - /* basic machine hardware */ - MDRV_CPU_ADD("maincpu", 8080, MASTER_CLOCK / 10) - MDRV_CPU_CONFIG(n8080_cpu_config) - MDRV_CPU_PROGRAM_MAP(main_cpu_map) - MDRV_CPU_IO_MAP(main_io_map) - - /* video hardware */ - MDRV_SCREEN_ADD("screen", RASTER) - MDRV_SCREEN_REFRESH_RATE(60) - MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MDRV_SCREEN_SIZE(256, 256) - MDRV_SCREEN_VISIBLE_AREA(0, 255, 16, 239) - - MDRV_PALETTE_LENGTH(8) - MDRV_PALETTE_INIT(n8080) - MDRV_VIDEO_START(spacefev) - MDRV_VIDEO_UPDATE(spacefev) - - MDRV_TIMER_ADD_SCANLINE("rst1", rst1_tick, "screen", 128, 256) - MDRV_TIMER_ADD_SCANLINE("rst2", rst2_tick, "screen", 240, 256) - - /* sound hardware */ - MDRV_IMPORT_FROM( spacefev_sound ) -MACHINE_DRIVER_END - - -static MACHINE_DRIVER_START( sheriff ) - - /* basic machine hardware */ - MDRV_CPU_ADD("maincpu", 8080, MASTER_CLOCK / 10) - MDRV_CPU_CONFIG(n8080_cpu_config) - MDRV_CPU_PROGRAM_MAP(main_cpu_map) - MDRV_CPU_IO_MAP(main_io_map) - - /* video hardware */ - MDRV_SCREEN_ADD("screen", RASTER) - MDRV_SCREEN_REFRESH_RATE(60) - MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MDRV_SCREEN_SIZE(256, 256) - MDRV_SCREEN_VISIBLE_AREA(0, 255, 16, 239) - - MDRV_PALETTE_LENGTH(8) - MDRV_PALETTE_INIT(n8080) - MDRV_VIDEO_START(sheriff) - MDRV_VIDEO_UPDATE(sheriff) - - MDRV_TIMER_ADD_SCANLINE("rst1", rst1_tick, "screen", 128, 256) - MDRV_TIMER_ADD_SCANLINE("rst2", rst2_tick, "screen", 240, 256) - - /* sound hardware */ - MDRV_IMPORT_FROM( sheriff_sound ) -MACHINE_DRIVER_END - - -static MACHINE_DRIVER_START( helifire ) - - /* basic machine hardware */ - MDRV_CPU_ADD("maincpu", 8080, MASTER_CLOCK / 10) - MDRV_CPU_CONFIG(n8080_cpu_config) - MDRV_CPU_PROGRAM_MAP(helifire_main_cpu_map) - MDRV_CPU_IO_MAP(main_io_map) - - /* video hardware */ - MDRV_SCREEN_ADD("screen", RASTER) - MDRV_SCREEN_REFRESH_RATE(60) - MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MDRV_SCREEN_SIZE(256, 256) - MDRV_SCREEN_VISIBLE_AREA(0, 255, 16, 239) - - MDRV_PALETTE_LENGTH(8 + 0x400) - MDRV_PALETTE_INIT(helifire) - MDRV_VIDEO_START(helifire) - MDRV_VIDEO_UPDATE(helifire) - MDRV_VIDEO_EOF(helifire) - - MDRV_TIMER_ADD_SCANLINE("rst1", rst1_tick, "screen", 128, 256) - MDRV_TIMER_ADD_SCANLINE("rst2", rst2_tick, "screen", 240, 256) - - /* sound hardware */ - MDRV_IMPORT_FROM( helifire_sound ) -MACHINE_DRIVER_END +/* Input ports */ static INPUT_PORTS_START( spacefev ) PORT_START("IN0") @@ -487,8 +365,7 @@ static INPUT_PORTS_START( helifire ) PORT_DIPSETTING( 0x00, DEF_STR( Cocktail )) /* potentiometers */ - - PORT_START("POT0") /* 04 */ + PORT_START("POT0") PORT_DIPNAME( 0xff, 0x50, "VR1 sun brightness" ) PORT_DIPSETTING( 0x00, "00" ) PORT_DIPSETTING( 0x10, "10" ) @@ -499,7 +376,7 @@ static INPUT_PORTS_START( helifire ) PORT_DIPSETTING( 0x60, "60" ) PORT_DIPSETTING( 0x70, "70" ) - PORT_START("POT1") /* 05 */ + PORT_START("POT1") PORT_DIPNAME( 0xff, 0x00, "VR2 sea brightness" ) PORT_DIPSETTING( 0x00, "00" ) PORT_DIPSETTING( 0x10, "10" ) @@ -509,10 +386,227 @@ static INPUT_PORTS_START( helifire ) PORT_DIPSETTING( 0x50, "50" ) PORT_DIPSETTING( 0x60, "60" ) PORT_DIPSETTING( 0x70, "70" ) - INPUT_PORTS_END +/* Interrupts */ + +static TIMER_DEVICE_CALLBACK( rst1_tick ) +{ + n8080_state *n8080 = (n8080_state *)timer->machine->driver_data; + int state = n8080->inte ? ASSERT_LINE : CLEAR_LINE; + + /* V7 = 1, V6 = 0 */ + cputag_set_input_line_and_vector(timer->machine, "maincpu", INPUT_LINE_IRQ0, state, 0xcf); +} + +static TIMER_DEVICE_CALLBACK( rst2_tick ) +{ + n8080_state *n8080 = (n8080_state *)timer->machine->driver_data; + int state = n8080->inte ? ASSERT_LINE : CLEAR_LINE; + + /* vblank */ + cputag_set_input_line_and_vector(timer->machine, "maincpu", INPUT_LINE_IRQ0, state, 0xd7); +} + +static WRITE_LINE_DEVICE_HANDLER( n8080_inte_callback ) +{ + n8080_state *n8080 = (n8080_state *)device->machine->driver_data; + n8080->inte = state; +} + +static WRITE8_DEVICE_HANDLER( n8080_status_callback ) +{ + if (data & I8085_STATUS_INTA) + { + /* interrupt acknowledge */ + cpu_set_input_line(device, INPUT_LINE_IRQ0, CLEAR_LINE); + } +} + +static I8085_CONFIG( n8080_cpu_config ) +{ + DEVCB_HANDLER(n8080_status_callback), /* STATUS changed callback */ + DEVCB_LINE(n8080_inte_callback), /* INTE changed callback */ + DEVCB_NULL, /* SID changed callback (8085A only) */ + DEVCB_NULL /* SOD changed callback (8085A only) */ +}; + +static MACHINE_START( n8080 ) +{ + n8080_state *state = (n8080_state *)machine->driver_data; + + state_save_register_global(machine, state->shift_data); + state_save_register_global(machine, state->shift_bits); + state_save_register_global(machine, state->inte); +} + +static MACHINE_START( spacefev ) +{ + MACHINE_START_CALL(n8080); + MACHINE_START_CALL(spacefev_sound); +} + +static MACHINE_START( sheriff ) +{ + MACHINE_START_CALL(n8080); + MACHINE_START_CALL(sheriff_sound); +} + +static MACHINE_START( helifire ) +{ + MACHINE_START_CALL(n8080); + MACHINE_START_CALL(helifire_sound); +} + + +static MACHINE_RESET( n8080 ) +{ + n8080_state *state = (n8080_state *)machine->driver_data; + + state->shift_data = 0; + state->shift_bits = 0; + state->inte = 0; +} + +static MACHINE_RESET( spacefev ) +{ + n8080_state *state = (n8080_state *)machine->driver_data; + + MACHINE_RESET_CALL(n8080); + MACHINE_RESET_CALL(spacefev_sound); + + state->spacefev_red_screen = 0; + state->spacefev_red_cannon = 0; +} + +static MACHINE_RESET( sheriff ) +{ + n8080_state *state = (n8080_state *)machine->driver_data; + + MACHINE_RESET_CALL(n8080); + MACHINE_RESET_CALL(sheriff_sound); + + state->sheriff_color_mode = 0; + state->sheriff_color_data = 0; +} + +static MACHINE_RESET( helifire ) +{ + n8080_state *state = (n8080_state *)machine->driver_data; + + MACHINE_RESET_CALL(n8080); + MACHINE_RESET_CALL(helifire_sound); + + state->helifire_mv = 0; + state->helifire_sc = 0; + state->helifire_flash = 0; +} + + +static MACHINE_DRIVER_START( spacefev ) + + /* driver data */ + MDRV_DRIVER_DATA(n8080_state) + + /* basic machine hardware */ + MDRV_CPU_ADD("maincpu", 8080, MASTER_CLOCK / 10) + MDRV_CPU_CONFIG(n8080_cpu_config) + MDRV_CPU_PROGRAM_MAP(main_cpu_map) + MDRV_CPU_IO_MAP(main_io_map) + + MDRV_MACHINE_START(spacefev) + MDRV_MACHINE_RESET(spacefev) + + /* video hardware */ + MDRV_SCREEN_ADD("screen", RASTER) + MDRV_SCREEN_REFRESH_RATE(60) + MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MDRV_SCREEN_SIZE(256, 256) + MDRV_SCREEN_VISIBLE_AREA(0, 255, 16, 239) + + MDRV_PALETTE_LENGTH(8) + MDRV_PALETTE_INIT(n8080) + MDRV_VIDEO_START(spacefev) + MDRV_VIDEO_UPDATE(spacefev) + + MDRV_TIMER_ADD_SCANLINE("rst1", rst1_tick, "screen", 128, 256) + MDRV_TIMER_ADD_SCANLINE("rst2", rst2_tick, "screen", 240, 256) + + /* sound hardware */ + MDRV_IMPORT_FROM( spacefev_sound ) +MACHINE_DRIVER_END + + +static MACHINE_DRIVER_START( sheriff ) + + /* driver data */ + MDRV_DRIVER_DATA(n8080_state) + + /* basic machine hardware */ + MDRV_CPU_ADD("maincpu", 8080, MASTER_CLOCK / 10) + MDRV_CPU_CONFIG(n8080_cpu_config) + MDRV_CPU_PROGRAM_MAP(main_cpu_map) + MDRV_CPU_IO_MAP(main_io_map) + + MDRV_MACHINE_START(sheriff) + MDRV_MACHINE_RESET(sheriff) + + /* video hardware */ + MDRV_SCREEN_ADD("screen", RASTER) + MDRV_SCREEN_REFRESH_RATE(60) + MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MDRV_SCREEN_SIZE(256, 256) + MDRV_SCREEN_VISIBLE_AREA(0, 255, 16, 239) + + MDRV_PALETTE_LENGTH(8) + MDRV_PALETTE_INIT(n8080) + MDRV_VIDEO_START(sheriff) + MDRV_VIDEO_UPDATE(sheriff) + + MDRV_TIMER_ADD_SCANLINE("rst1", rst1_tick, "screen", 128, 256) + MDRV_TIMER_ADD_SCANLINE("rst2", rst2_tick, "screen", 240, 256) + + /* sound hardware */ + MDRV_IMPORT_FROM( sheriff_sound ) +MACHINE_DRIVER_END + + +static MACHINE_DRIVER_START( helifire ) + + /* driver data */ + MDRV_DRIVER_DATA(n8080_state) + + /* basic machine hardware */ + MDRV_CPU_ADD("maincpu", 8080, MASTER_CLOCK / 10) + MDRV_CPU_CONFIG(n8080_cpu_config) + MDRV_CPU_PROGRAM_MAP(helifire_main_cpu_map) + MDRV_CPU_IO_MAP(main_io_map) + + MDRV_MACHINE_START(helifire) + MDRV_MACHINE_RESET(helifire) + + /* video hardware */ + MDRV_SCREEN_ADD("screen", RASTER) + MDRV_SCREEN_REFRESH_RATE(60) + MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MDRV_SCREEN_SIZE(256, 256) + MDRV_SCREEN_VISIBLE_AREA(0, 255, 16, 239) + + MDRV_PALETTE_LENGTH(8 + 0x400) + MDRV_PALETTE_INIT(helifire) + MDRV_VIDEO_START(helifire) + MDRV_VIDEO_UPDATE(helifire) + MDRV_VIDEO_EOF(helifire) + + MDRV_TIMER_ADD_SCANLINE("rst1", rst1_tick, "screen", 128, 256) + MDRV_TIMER_ADD_SCANLINE("rst2", rst2_tick, "screen", 240, 256) + + /* sound hardware */ + MDRV_IMPORT_FROM( helifire_sound ) +MACHINE_DRIVER_END + + /* Space Fever (3 sets, Space Fever?, High Splitter?, Space Launcher?) Nintendo, 1979 @@ -824,14 +918,14 @@ ROM_START( helifirea ) ROM_END -GAME( 1979, spacefev, 0, spacefev, spacefev, 0, ROT270, "Nintendo", "Space Fever (New Ver.)", 0 ) -GAME( 1979, spacefevo, spacefev, spacefev, spacefev, 0, ROT270, "Nintendo", "Space Fever (Old Ver.)", 0 ) -GAME( 1979, spacefevo2, spacefev, spacefev, spacefev, 0, ROT270, "Nintendo", "Space Fever (Older Ver.)", 0 ) -GAME( 1979, highsplt, 0, spacefev, highsplt, 0, ROT270, "Nintendo", "Space Fever High Splitter (set 1)", 0 ) -GAME( 1979, highsplta, highsplt, spacefev, highsplt, 0, ROT270, "Nintendo", "Space Fever High Splitter (set 2)", 0 ) -GAME( 1979, highspltb, highsplt, spacefev, highsplt, 0, ROT270, "Nintendo", "Space Fever High Splitter (alt Sound)", 0 ) -GAME( 1979, spacelnc, 0, spacefev, spacelnc, 0, ROT270, "Nintendo", "Space Launcher", GAME_NOT_WORKING ) -GAME( 1979, sheriff, 0, sheriff, sheriff, 0, ROT270, "Nintendo", "Sheriff", 0 ) -GAME( 1980, bandido, sheriff, sheriff, bandido, 0, ROT270, "Exidy", "Bandido", 0 ) -GAME( 1980, helifire, 0, helifire, helifire, 0, ROT270, "Nintendo", "HeliFire (set 1)", GAME_NOT_WORKING | GAME_NO_COCKTAIL ) -GAME( 1980, helifirea, helifire, helifire, helifire, 0, ROT270, "Nintendo", "HeliFire (set 2)", GAME_NOT_WORKING | GAME_NO_COCKTAIL ) +GAME( 1979, spacefev, 0, spacefev, spacefev, 0, ROT270, "Nintendo", "Space Fever (New Ver.)", GAME_SUPPORTS_SAVE ) +GAME( 1979, spacefevo, spacefev, spacefev, spacefev, 0, ROT270, "Nintendo", "Space Fever (Old Ver.)", GAME_SUPPORTS_SAVE ) +GAME( 1979, spacefevo2, spacefev, spacefev, spacefev, 0, ROT270, "Nintendo", "Space Fever (Older Ver.)", GAME_SUPPORTS_SAVE ) +GAME( 1979, highsplt, 0, spacefev, highsplt, 0, ROT270, "Nintendo", "Space Fever High Splitter (set 1)", GAME_SUPPORTS_SAVE ) +GAME( 1979, highsplta, highsplt, spacefev, highsplt, 0, ROT270, "Nintendo", "Space Fever High Splitter (set 2)", GAME_SUPPORTS_SAVE ) +GAME( 1979, highspltb, highsplt, spacefev, highsplt, 0, ROT270, "Nintendo", "Space Fever High Splitter (alt Sound)", GAME_SUPPORTS_SAVE ) +GAME( 1979, spacelnc, 0, spacefev, spacelnc, 0, ROT270, "Nintendo", "Space Launcher", GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) +GAME( 1979, sheriff, 0, sheriff, sheriff, 0, ROT270, "Nintendo", "Sheriff", GAME_SUPPORTS_SAVE ) +GAME( 1980, bandido, sheriff, sheriff, bandido, 0, ROT270, "Exidy", "Bandido", GAME_SUPPORTS_SAVE ) +GAME( 1980, helifire, 0, helifire, helifire, 0, ROT270, "Nintendo", "HeliFire (set 1)", GAME_NOT_WORKING | GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE ) +GAME( 1980, helifirea, helifire, helifire, helifire, 0, ROT270, "Nintendo", "HeliFire (set 2)", GAME_NOT_WORKING | GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE ) diff --git a/src/mame/includes/n8080.h b/src/mame/includes/n8080.h index 11885909d44..67c6002a58b 100644 --- a/src/mame/includes/n8080.h +++ b/src/mame/includes/n8080.h @@ -1,9 +1,42 @@ -/*----------- defined in video/n8080.c -----------*/ -extern int helifire_flash; +typedef struct _n8080_state n8080_state; +struct _n8080_state +{ + /* memory pointers */ + UINT8 * videoram; + UINT8 * colorram; // for helifire + + /* video-related */ + emu_timer* cannon_timer; + int spacefev_red_screen; + int spacefev_red_cannon; + int sheriff_color_mode; + int sheriff_color_data; + int helifire_flash; + UINT8 helifire_LSFR[63]; + unsigned helifire_mv; + unsigned helifire_sc; /* IC56 */ + + /* sound-related */ + int n8080_hardware; + emu_timer* sound_timer[3]; + int helifire_dac_phase; + double helifire_dac_volume; + double helifire_dac_timing; + UINT16 prev_sound_pins; + UINT16 curr_sound_pins; + int mono_flop[3]; + UINT8 prev_snd_data; + + /* other */ + unsigned shift_data; + unsigned shift_bits; + int inte; +}; + -extern int spacefev_red_screen; -extern int spacefev_red_cannon; + +/*----------- defined in video/n8080.c -----------*/ WRITE8_HANDLER( n8080_video_control_w ); @@ -26,6 +59,12 @@ MACHINE_DRIVER_EXTERN( spacefev_sound ); MACHINE_DRIVER_EXTERN( sheriff_sound ); MACHINE_DRIVER_EXTERN( helifire_sound ); +MACHINE_START( spacefev_sound ); +MACHINE_START( sheriff_sound ); +MACHINE_START( helifire_sound ); +MACHINE_RESET( spacefev_sound ); +MACHINE_RESET( sheriff_sound ); +MACHINE_RESET( helifire_sound ); + WRITE8_HANDLER( n8080_sound_1_w ); WRITE8_HANDLER( n8080_sound_2_w ); - diff --git a/src/mame/video/n8080.c b/src/mame/video/n8080.c index 514c830bb62..b7d7cc5f9d3 100644 --- a/src/mame/video/n8080.c +++ b/src/mame/video/n8080.c @@ -7,27 +7,13 @@ #include "driver.h" #include "includes/n8080.h" -int spacefev_red_screen; -int spacefev_red_cannon; - -int helifire_flash; - -static emu_timer* cannon_timer; - -static int sheriff_color_mode; -static int sheriff_color_data; - -static UINT8 helifire_LSFR[63]; - -static unsigned helifire_mv; -static unsigned helifire_sc; /* IC56 */ - WRITE8_HANDLER( n8080_video_control_w ) { - sheriff_color_mode = (data >> 3) & 3; - sheriff_color_data = (data >> 0) & 7; + n8080_state *state = (n8080_state *)space->machine->driver_data; + state->sheriff_color_mode = (data >> 3) & 3; + state->sheriff_color_data = (data >> 0) & 7; flip_screen_set_no_update(space->machine, data & 0x20); } @@ -37,7 +23,7 @@ PALETTE_INIT( n8080 ) int i; for (i = 0; i < 8; i++) - palette_set_color_rgb(machine,i,pal1bit(i >> 0),pal1bit(i >> 1),pal1bit(i >> 2)); + palette_set_color_rgb(machine, i, pal1bit(i >> 0), pal1bit(i >> 1), pal1bit(i >> 2)); } @@ -51,86 +37,92 @@ PALETTE_INIT( helifire ) { int level = 0xff * exp(-3 * i / 255.); /* capacitor discharge */ - palette_set_color(machine,0x000 + 8 + i, MAKE_RGB(0x00, 0x00, level)); /* shades of blue */ - palette_set_color(machine,0x100 + 8 + i, MAKE_RGB(0x00, 0xC0, level)); /* shades of blue w/ green star */ + palette_set_color(machine, 0x000 + 8 + i, MAKE_RGB(0x00, 0x00, level)); /* shades of blue */ + palette_set_color(machine, 0x100 + 8 + i, MAKE_RGB(0x00, 0xC0, level)); /* shades of blue w/ green star */ - palette_set_color(machine,0x200 + 8 + i, MAKE_RGB(level, 0x00, 0x00)); /* shades of red */ - palette_set_color(machine,0x300 + 8 + i, MAKE_RGB(level, 0xC0, 0x00)); /* shades of red w/ green star */ + palette_set_color(machine, 0x200 + 8 + i, MAKE_RGB(level, 0x00, 0x00)); /* shades of red */ + palette_set_color(machine, 0x300 + 8 + i, MAKE_RGB(level, 0xC0, 0x00)); /* shades of red w/ green star */ } } -void spacefev_start_red_cannon(running_machine *machine) +void spacefev_start_red_cannon( running_machine *machine ) { - spacefev_red_cannon = 1; + n8080_state *state = (n8080_state *)machine->driver_data; - timer_adjust_oneshot(cannon_timer, ATTOTIME_IN_USEC(550 * 68 * 10), 0); + state->spacefev_red_cannon = 1; + timer_adjust_oneshot(state->cannon_timer, ATTOTIME_IN_USEC(550 * 68 * 10), 0); } static TIMER_CALLBACK( spacefev_stop_red_cannon ) { - spacefev_red_cannon = 0; + n8080_state *state = (n8080_state *)machine->driver_data; - timer_adjust_oneshot(cannon_timer, attotime_never, 0); + state->spacefev_red_cannon = 0; + timer_adjust_oneshot(state->cannon_timer, attotime_never, 0); } -static void helifire_next_line(running_machine *machine) +static void helifire_next_line( running_machine *machine ) { - helifire_mv++; + n8080_state *state = (n8080_state *)machine->driver_data; - if (helifire_sc % 4 == 2) + state->helifire_mv++; + + if (state->helifire_sc % 4 == 2) { - helifire_mv %= 256; + state->helifire_mv %= 256; } else { if (flip_screen_get(machine)) - { - helifire_mv %= 255; - } + state->helifire_mv %= 255; else - { - helifire_mv %= 257; - } + state->helifire_mv %= 257; } - if (helifire_mv == 128) + if (state->helifire_mv == 128) { - helifire_sc++; + state->helifire_sc++; } } VIDEO_START( spacefev ) { - cannon_timer = timer_alloc(machine, spacefev_stop_red_cannon, NULL); + n8080_state *state = (n8080_state *)machine->driver_data; + + state->cannon_timer = timer_alloc(machine, spacefev_stop_red_cannon, NULL); flip_screen_set_no_update(machine, 0); - spacefev_red_screen = 0; - spacefev_red_cannon = 0; + state_save_register_global(machine, state->spacefev_red_screen); + state_save_register_global(machine, state->spacefev_red_cannon); } VIDEO_START( sheriff ) { + n8080_state *state = (n8080_state *)machine->driver_data; + flip_screen_set_no_update(machine, 0); - sheriff_color_mode = 0; - sheriff_color_data = 0; + state_save_register_global(machine, state->sheriff_color_mode); + state_save_register_global(machine, state->sheriff_color_data); } VIDEO_START( helifire ) { + n8080_state *state = (n8080_state *)machine->driver_data; UINT8 data = 0; - int i; - helifire_mv = 0; - helifire_sc = 0; + state_save_register_global(machine, state->helifire_mv); + state_save_register_global(machine, state->helifire_sc); + state_save_register_global(machine, state->helifire_flash); + state_save_register_global_array(machine, state->helifire_LSFR); for (i = 0; i < 63; i++) { @@ -140,23 +132,22 @@ VIDEO_START( helifire ) data = (data << 1) | (bit & 1); - helifire_LSFR[i] = data; + state->helifire_LSFR[i] = data; } flip_screen_set_no_update(machine, 0); - - helifire_flash = 0; } VIDEO_UPDATE( spacefev ) { + n8080_state *state = (n8080_state *)screen->machine->driver_data; UINT8 mask = flip_screen_get(screen->machine) ? 0xff : 0x00; int x; int y; - const UINT8* pRAM = videoram; + const UINT8* pRAM = state->videoram; const UINT8* pPROM = memory_region(screen->machine, "proms"); for (y = 0; y < 256; y++) @@ -169,17 +160,15 @@ VIDEO_UPDATE( spacefev ) UINT8 color = 0; - if (spacefev_red_screen) - { + if (state->spacefev_red_screen) color = 1; - } else { UINT8 val = pPROM[x >> 3]; if ((x >> 3) == 0x06) { - color = spacefev_red_cannon ? 1 : 7; + color = state->spacefev_red_cannon ? 1 : 7; } if ((x >> 3) == 0x1b) @@ -222,6 +211,7 @@ VIDEO_UPDATE( spacefev ) VIDEO_UPDATE( sheriff ) { + n8080_state *state = (n8080_state *)screen->machine->driver_data; UINT8 mask = flip_screen_get(screen->machine) ? 0xff : 0x00; const UINT8* pPROM = memory_region(screen->machine, "proms"); @@ -229,7 +219,7 @@ VIDEO_UPDATE( sheriff ) int x; int y; - const UINT8* pRAM = videoram; + const UINT8* pRAM = state->videoram; for (y = 0; y < 256; y++) { @@ -241,20 +231,14 @@ VIDEO_UPDATE( sheriff ) UINT8 color = pPROM[32 * (y >> 3) + (x >> 3)]; - if (sheriff_color_mode == 1 && !(color & 8)) - { - color = sheriff_color_data ^ 7; - } + if (state->sheriff_color_mode == 1 && !(color & 8)) + color = state->sheriff_color_data ^ 7; - if (sheriff_color_mode == 2) - { - color = sheriff_color_data ^ 7; - } + if (state->sheriff_color_mode == 2) + color = state->sheriff_color_data ^ 7; - if (sheriff_color_mode == 3) - { + if (state->sheriff_color_mode == 3) color = 7; - } for (n = 0; n < 8; n++) { @@ -270,13 +254,14 @@ VIDEO_UPDATE( sheriff ) VIDEO_UPDATE( helifire ) { + n8080_state *state = (n8080_state *)screen->machine->driver_data; int SUN_BRIGHTNESS = input_port_read(screen->machine, "POT0"); int SEA_BRIGHTNESS = input_port_read(screen->machine, "POT1"); static const int wave[8] = { 0, 1, 2, 2, 2, 1, 0, 0 }; - unsigned saved_mv = helifire_mv; - unsigned saved_sc = helifire_sc; + unsigned saved_mv = state->helifire_mv; + unsigned saved_sc = state->helifire_sc; int x; int y; @@ -285,7 +270,7 @@ VIDEO_UPDATE( helifire ) { UINT16* pLine = BITMAP_ADDR16(bitmap, y, 0); - int level = 120 + wave[helifire_mv & 7]; + int level = 120 + wave[state->helifire_mv & 7]; /* draw sky */ @@ -296,28 +281,28 @@ VIDEO_UPDATE( helifire ) /* draw stars */ - if (helifire_mv % 8 == 4) /* upper half */ + if (state->helifire_mv % 8 == 4) /* upper half */ { - int step = (320 * (helifire_mv - 0)) % sizeof helifire_LSFR; + int step = (320 * (state->helifire_mv - 0)) % sizeof state->helifire_LSFR; int data = - ((helifire_LSFR[step] & 1) << 6) | - ((helifire_LSFR[step] & 2) << 4) | - ((helifire_LSFR[step] & 4) << 2) | - ((helifire_LSFR[step] & 8) << 0); + ((state->helifire_LSFR[step] & 1) << 6) | + ((state->helifire_LSFR[step] & 2) << 4) | + ((state->helifire_LSFR[step] & 4) << 2) | + ((state->helifire_LSFR[step] & 8) << 0); pLine[0x80 + data] |= 0x100; } - if (helifire_mv % 8 == 5) /* lower half */ + if (state->helifire_mv % 8 == 5) /* lower half */ { - int step = (320 * (helifire_mv - 1)) % sizeof helifire_LSFR; + int step = (320 * (state->helifire_mv - 1)) % sizeof state->helifire_LSFR; int data = - ((helifire_LSFR[step] & 1) << 6) | - ((helifire_LSFR[step] & 2) << 4) | - ((helifire_LSFR[step] & 4) << 2) | - ((helifire_LSFR[step] & 8) << 0); + ((state->helifire_LSFR[step] & 1) << 6) | + ((state->helifire_LSFR[step] & 2) << 4) | + ((state->helifire_LSFR[step] & 4) << 2) | + ((state->helifire_LSFR[step] & 8) << 0); pLine[0x00 + data] |= 0x100; } @@ -341,16 +326,16 @@ VIDEO_UPDATE( helifire ) { if (flip_screen_get(screen->machine)) { - if ((videoram[offset ^ 0x1fff] << n) & 0x80) + if ((state->videoram[offset ^ 0x1fff] << n) & 0x80) { - pLine[x + n] = colorram[offset ^ 0x1fff] & 7; + pLine[x + n] = state->colorram[offset ^ 0x1fff] & 7; } } else { - if ((videoram[offset] >> n) & 1) + if ((state->videoram[offset] >> n) & 1) { - pLine[x + n] = colorram[offset] & 7; + pLine[x + n] = state->colorram[offset] & 7; } } } @@ -361,15 +346,16 @@ VIDEO_UPDATE( helifire ) helifire_next_line(screen->machine); } - helifire_mv = saved_mv; - helifire_sc = saved_sc; + state->helifire_mv = saved_mv; + state->helifire_sc = saved_sc; return 0; } VIDEO_EOF( helifire ) { - int n = (video_screen_get_frame_number(machine->primary_screen) >> 1) % sizeof helifire_LSFR; + n8080_state *state = (n8080_state *)machine->driver_data; + int n = (video_screen_get_frame_number(machine->primary_screen) >> 1) % sizeof state->helifire_LSFR; int i; @@ -379,9 +365,9 @@ VIDEO_EOF( helifire ) int G = (i & 2); int B = (i & 4); - if (helifire_flash) + if (state->helifire_flash) { - if (helifire_LSFR[n] & 0x20) + if (state->helifire_LSFR[n] & 0x20) { G |= B; } |
