mirror of
https://github.com/holub/mame
synced 2025-04-19 23:12:11 +03:00
twincobr, fshark, wardner: Add LS259 latches (nw)
This commit is contained in:
parent
7a4160bd29
commit
480ec3cfda
@ -385,6 +385,7 @@ Shark Zame
|
||||
#include "cpu/mcs48/mcs48.h"
|
||||
#include "cpu/tms32010/tms32010.h"
|
||||
#include "cpu/z80/z80.h"
|
||||
#include "machine/74259.h"
|
||||
#include "sound/3812intf.h"
|
||||
#include "speaker.h"
|
||||
|
||||
@ -411,8 +412,8 @@ static ADDRESS_MAP_START( main_program_map, AS_PROGRAM, 16, twincobr_state )
|
||||
AM_RANGE(0x078004, 0x078005) AM_READ_PORT("P1")
|
||||
AM_RANGE(0x078006, 0x078007) AM_READ_PORT("P2")
|
||||
AM_RANGE(0x078008, 0x078009) AM_READ_PORT("VBLANK") /* V-Blank & FShark Coin/Start */
|
||||
AM_RANGE(0x07800a, 0x07800b) AM_WRITE(fshark_coin_dsp_w) /* Flying Shark DSP Comms & coin stuff */
|
||||
AM_RANGE(0x07800c, 0x07800d) AM_WRITE(twincobr_control_w) /* Twin Cobra DSP Comms & system control */
|
||||
AM_RANGE(0x07800a, 0x07800b) AM_DEVWRITE8("coinlatch", ls259_device, write_nibble_d0, 0x00ff) /* Flying Shark DSP Comms & coin stuff */
|
||||
AM_RANGE(0x07800c, 0x07800d) AM_DEVWRITE8("mainlatch", ls259_device, write_nibble_d0, 0x00ff) /* Twin Cobra DSP Comms & system control */
|
||||
AM_RANGE(0x07a000, 0x07afff) AM_READWRITE(twincobr_sharedram_r, twincobr_sharedram_w) /* 16-bit on 68000 side, 8-bit on Z80 side */
|
||||
AM_RANGE(0x07e000, 0x07e001) AM_READWRITE(twincobr_txram_r, twincobr_txram_w) /* data for text video RAM */
|
||||
AM_RANGE(0x07e002, 0x07e003) AM_READWRITE(twincobr_bgram_r, twincobr_bgram_w) /* data for bg video RAM */
|
||||
@ -431,7 +432,7 @@ static ADDRESS_MAP_START( sound_io_map, AS_IO, 8, twincobr_state )
|
||||
ADDRESS_MAP_GLOBAL_MASK(0xff)
|
||||
AM_RANGE(0x00, 0x01) AM_DEVREADWRITE("ymsnd", ym3812_device, read, write)
|
||||
AM_RANGE(0x10, 0x10) AM_READ_PORT("SYSTEM") /* Twin Cobra - Coin/Start */
|
||||
AM_RANGE(0x20, 0x20) AM_WRITE(twincobr_coin_w) /* Twin Cobra coin count-lockout */
|
||||
AM_RANGE(0x20, 0x20) AM_DEVWRITE("coinlatch", ls259_device, write_nibble_d0) /* Twin Cobra coin count-lockout */
|
||||
AM_RANGE(0x40, 0x40) AM_READ_PORT("DSWA")
|
||||
AM_RANGE(0x50, 0x50) AM_READ_PORT("DSWB")
|
||||
ADDRESS_MAP_END
|
||||
@ -675,6 +676,20 @@ static MACHINE_CONFIG_START( twincobr )
|
||||
|
||||
MCFG_MACHINE_RESET_OVERRIDE(twincobr_state,twincobr)
|
||||
|
||||
MCFG_DEVICE_ADD("mainlatch", LS259, 0)
|
||||
MCFG_ADDRESSABLE_LATCH_Q2_OUT_CB(WRITELINE(twincobr_state, int_enable_w))
|
||||
MCFG_ADDRESSABLE_LATCH_Q3_OUT_CB(WRITELINE(twincobr_state, flipscreen_w))
|
||||
MCFG_ADDRESSABLE_LATCH_Q4_OUT_CB(WRITELINE(twincobr_state, bg_ram_bank_w))
|
||||
MCFG_ADDRESSABLE_LATCH_Q5_OUT_CB(WRITELINE(twincobr_state, fg_rom_bank_w))
|
||||
MCFG_ADDRESSABLE_LATCH_Q6_OUT_CB(WRITELINE(twincobr_state, dsp_int_w))
|
||||
MCFG_ADDRESSABLE_LATCH_Q7_OUT_CB(WRITELINE(twincobr_state, display_on_w))
|
||||
|
||||
MCFG_DEVICE_ADD("coinlatch", LS259, 0)
|
||||
MCFG_ADDRESSABLE_LATCH_Q4_OUT_CB(WRITELINE(twincobr_state, coin_counter_1_w))
|
||||
MCFG_ADDRESSABLE_LATCH_Q5_OUT_CB(WRITELINE(twincobr_state, coin_counter_2_w))
|
||||
MCFG_ADDRESSABLE_LATCH_Q6_OUT_CB(WRITELINE(twincobr_state, coin_lockout_1_w))
|
||||
MCFG_ADDRESSABLE_LATCH_Q7_OUT_CB(WRITELINE(twincobr_state, coin_lockout_2_w))
|
||||
|
||||
/* video hardware */
|
||||
MCFG_MC6845_ADD("crtc", HD6845, "screen", XTAL_28MHz/8) /* 3.5MHz measured on CLKin */
|
||||
MCFG_MC6845_SHOW_BORDER_AREA(false)
|
||||
@ -707,6 +722,12 @@ MACHINE_CONFIG_END
|
||||
|
||||
|
||||
static MACHINE_CONFIG_DERIVED( fshark, twincobr )
|
||||
MCFG_DEVICE_MODIFY("mainlatch")
|
||||
MCFG_ADDRESSABLE_LATCH_Q6_OUT_CB(NOOP)
|
||||
|
||||
MCFG_DEVICE_MODIFY("coinlatch")
|
||||
MCFG_ADDRESSABLE_LATCH_Q0_OUT_CB(WRITELINE(twincobr_state, dsp_int_w))
|
||||
|
||||
MCFG_DEVICE_MODIFY("scu")
|
||||
toaplan_scu_device::static_set_xoffsets(*device, 32, 14);
|
||||
MACHINE_CONFIG_END
|
||||
|
@ -132,6 +132,7 @@ out:
|
||||
|
||||
#include "cpu/tms32010/tms32010.h"
|
||||
#include "cpu/z80/z80.h"
|
||||
#include "machine/74259.h"
|
||||
#include "machine/bankdev.h"
|
||||
#include "sound/3812intf.h"
|
||||
#include "speaker.h"
|
||||
@ -200,8 +201,8 @@ static ADDRESS_MAP_START( main_io_map, AS_IO, 8, wardner_state )
|
||||
AM_RANGE(0x54, 0x54) AM_READ_PORT("P1")
|
||||
AM_RANGE(0x56, 0x56) AM_READ_PORT("P2")
|
||||
AM_RANGE(0x58, 0x58) AM_READ_PORT("SYSTEM")
|
||||
AM_RANGE(0x5a, 0x5a) AM_WRITE(wardner_coin_dsp_w) /* Machine system control */
|
||||
AM_RANGE(0x5c, 0x5c) AM_WRITE(wardner_control_w) /* Machine system control */
|
||||
AM_RANGE(0x5a, 0x5a) AM_DEVWRITE("coinlatch", ls259_device, write_nibble_d0)
|
||||
AM_RANGE(0x5c, 0x5c) AM_DEVWRITE("mainlatch", ls259_device, write_nibble_d0)
|
||||
AM_RANGE(0x60, 0x65) AM_READWRITE(wardner_videoram_r, wardner_videoram_w)
|
||||
AM_RANGE(0x70, 0x70) AM_WRITE(wardner_bank_w)
|
||||
ADDRESS_MAP_END
|
||||
@ -357,7 +358,6 @@ void wardner_state::machine_reset()
|
||||
MACHINE_RESET_CALL_MEMBER(twincobr);
|
||||
|
||||
m_toaplan_main_cpu = 1; /* Z80 */
|
||||
twincobr_display(1);
|
||||
|
||||
m_membank->set_bank(0);
|
||||
}
|
||||
@ -389,6 +389,20 @@ static MACHINE_CONFIG_START( wardner )
|
||||
|
||||
MCFG_QUANTUM_TIME(attotime::from_hz(6000)) /* 100 CPU slices per frame */
|
||||
|
||||
MCFG_DEVICE_ADD("mainlatch", LS259, 0)
|
||||
MCFG_ADDRESSABLE_LATCH_Q2_OUT_CB(WRITELINE(wardner_state, int_enable_w))
|
||||
MCFG_ADDRESSABLE_LATCH_Q3_OUT_CB(WRITELINE(wardner_state, flipscreen_w))
|
||||
MCFG_ADDRESSABLE_LATCH_Q4_OUT_CB(WRITELINE(wardner_state, bg_ram_bank_w))
|
||||
MCFG_ADDRESSABLE_LATCH_Q5_OUT_CB(WRITELINE(wardner_state, fg_rom_bank_w))
|
||||
MCFG_ADDRESSABLE_LATCH_Q6_OUT_CB(WRITELINE(wardner_state, display_on_w))
|
||||
|
||||
MCFG_DEVICE_ADD("coinlatch", LS259, 0)
|
||||
MCFG_ADDRESSABLE_LATCH_Q0_OUT_CB(WRITELINE(wardner_state, dsp_int_w))
|
||||
MCFG_ADDRESSABLE_LATCH_Q4_OUT_CB(WRITELINE(wardner_state, coin_counter_1_w))
|
||||
MCFG_ADDRESSABLE_LATCH_Q5_OUT_CB(WRITELINE(wardner_state, coin_counter_2_w))
|
||||
MCFG_ADDRESSABLE_LATCH_Q6_OUT_CB(WRITELINE(wardner_state, coin_lockout_1_w))
|
||||
MCFG_ADDRESSABLE_LATCH_Q7_OUT_CB(WRITELINE(wardner_state, coin_lockout_2_w))
|
||||
|
||||
/* video hardware */
|
||||
MCFG_MC6845_ADD("crtc", HD6845, "screen", XTAL_14MHz/4) /* 3.5MHz measured on CLKin */
|
||||
MCFG_MC6845_SHOW_BORDER_AREA(false)
|
||||
|
@ -70,13 +70,14 @@ public:
|
||||
DECLARE_READ16_MEMBER(fsharkbt_dsp_r);
|
||||
DECLARE_WRITE16_MEMBER(fsharkbt_dsp_w);
|
||||
DECLARE_READ_LINE_MEMBER(twincobr_BIO_r);
|
||||
DECLARE_WRITE16_MEMBER(twincobr_control_w);
|
||||
DECLARE_WRITE8_MEMBER(wardner_control_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(int_enable_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(dsp_int_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(coin_counter_1_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(coin_counter_2_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(coin_lockout_1_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(coin_lockout_2_w);
|
||||
DECLARE_READ16_MEMBER(twincobr_sharedram_r);
|
||||
DECLARE_WRITE16_MEMBER(twincobr_sharedram_w);
|
||||
DECLARE_WRITE16_MEMBER(fshark_coin_dsp_w);
|
||||
DECLARE_WRITE8_MEMBER(twincobr_coin_w);
|
||||
DECLARE_WRITE8_MEMBER(wardner_coin_dsp_w);
|
||||
DECLARE_WRITE16_MEMBER(twincobr_txoffs_w);
|
||||
DECLARE_READ16_MEMBER(twincobr_txram_r);
|
||||
DECLARE_WRITE16_MEMBER(twincobr_txram_w);
|
||||
@ -112,12 +113,11 @@ public:
|
||||
INTERRUPT_GEN_MEMBER(wardner_interrupt);
|
||||
void twincobr_restore_dsp();
|
||||
void twincobr_create_tilemaps();
|
||||
void twincobr_display(int enable);
|
||||
void twincobr_flipscreen(int flip);
|
||||
DECLARE_WRITE_LINE_MEMBER(display_on_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(flipscreen_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(bg_ram_bank_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(fg_rom_bank_w);
|
||||
void twincobr_log_vram();
|
||||
void twincobr_dsp(int enable);
|
||||
void toaplan0_control_w(int offset, int data);
|
||||
void toaplan0_coin_dsp_w(address_space &space, int offset, int data);
|
||||
void twincobr_driver_savestate();
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<cpu_device> m_dsp;
|
||||
|
@ -13,7 +13,6 @@
|
||||
|
||||
#define LOG_DSP_CALLS 0
|
||||
#define LOG(x) do { if (LOG_DSP_CALLS) logerror x; } while (0)
|
||||
static const int toaplan_port_type[2] = { 0x7800c, 0x5c };
|
||||
|
||||
|
||||
INTERRUPT_GEN_MEMBER(twincobr_state::twincobr_interrupt)
|
||||
@ -176,64 +175,55 @@ READ_LINE_MEMBER(twincobr_state::twincobr_BIO_r)
|
||||
}
|
||||
|
||||
|
||||
void twincobr_state::twincobr_dsp(int enable)
|
||||
WRITE_LINE_MEMBER(twincobr_state::int_enable_w)
|
||||
{
|
||||
m_dsp_on = enable;
|
||||
if (enable) {
|
||||
m_intenable = state;
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(twincobr_state::dsp_int_w)
|
||||
{
|
||||
m_dsp_on = state;
|
||||
if (state)
|
||||
{
|
||||
// assert the INT line to the DSP
|
||||
LOG(("Turning DSP on and main CPU off\n"));
|
||||
m_dsp->set_input_line(INPUT_LINE_HALT, CLEAR_LINE);
|
||||
m_dsp->set_input_line(0, ASSERT_LINE); /* TMS32010 INT */
|
||||
m_dsp->set_input_line(0, ASSERT_LINE); // TMS32010 INT
|
||||
m_maincpu->set_input_line(INPUT_LINE_HALT, ASSERT_LINE);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
// inhibit the INT line to the DSP
|
||||
LOG(("Turning DSP off\n"));
|
||||
m_dsp->set_input_line(0, CLEAR_LINE); /* TMS32010 INT */
|
||||
m_dsp->set_input_line(0, CLEAR_LINE); // TMS32010 INT
|
||||
m_dsp->set_input_line(INPUT_LINE_HALT, ASSERT_LINE);
|
||||
}
|
||||
}
|
||||
|
||||
void twincobr_state::twincobr_restore_dsp()
|
||||
{
|
||||
twincobr_dsp(m_dsp_on);
|
||||
dsp_int_w(m_dsp_on);
|
||||
}
|
||||
|
||||
|
||||
void twincobr_state::toaplan0_control_w(int offset, int data)
|
||||
WRITE_LINE_MEMBER(twincobr_state::coin_counter_1_w)
|
||||
{
|
||||
LOG(("%s:Writing %08x to %08x.\n",machine().describe_context(),data,toaplan_port_type[m_toaplan_main_cpu] - offset));
|
||||
|
||||
if (m_toaplan_main_cpu == 1) {
|
||||
if (data == 0x0c) { data = 0x1c; } /* Z80 ? */
|
||||
if (data == 0x0d) { data = 0x1d; } /* Z80 ? */
|
||||
}
|
||||
|
||||
switch (data) {
|
||||
case 0x0004: m_intenable = 0; break;
|
||||
case 0x0005: m_intenable = 1; break;
|
||||
case 0x0006: twincobr_flipscreen(0); break;
|
||||
case 0x0007: twincobr_flipscreen(1); break;
|
||||
case 0x0008: m_bg_ram_bank = 0x0000; break;
|
||||
case 0x0009: m_bg_ram_bank = 0x1000; break;
|
||||
case 0x000a: m_fg_rom_bank = 0x0000; break;
|
||||
case 0x000b: m_fg_rom_bank = 0x1000; break;
|
||||
case 0x000c: twincobr_dsp(1); break; /* Enable the INT line to the DSP */
|
||||
case 0x000d: twincobr_dsp(0); break; /* Inhibit the INT line to the DSP */
|
||||
case 0x000e: twincobr_display(0); break; /* Turn display off */
|
||||
case 0x000f: twincobr_display(1); break; /* Turn display on */
|
||||
}
|
||||
machine().bookkeeping().coin_counter_w(0, state);
|
||||
}
|
||||
|
||||
WRITE16_MEMBER(twincobr_state::twincobr_control_w)
|
||||
WRITE_LINE_MEMBER(twincobr_state::coin_counter_2_w)
|
||||
{
|
||||
if (ACCESSING_BITS_0_7)
|
||||
{
|
||||
toaplan0_control_w(offset, data & 0xff);
|
||||
}
|
||||
machine().bookkeeping().coin_counter_w(1, state);
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(twincobr_state::wardner_control_w)
|
||||
WRITE_LINE_MEMBER(twincobr_state::coin_lockout_1_w)
|
||||
{
|
||||
toaplan0_control_w(offset, data);
|
||||
machine().bookkeeping().coin_counter_w(0, !state);
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(twincobr_state::coin_lockout_2_w)
|
||||
{
|
||||
machine().bookkeeping().coin_counter_w(1, !state);
|
||||
}
|
||||
|
||||
|
||||
@ -251,59 +241,9 @@ WRITE16_MEMBER(twincobr_state::twincobr_sharedram_w)
|
||||
}
|
||||
|
||||
|
||||
void twincobr_state::toaplan0_coin_dsp_w(address_space &space, int offset, int data)
|
||||
{
|
||||
if (data > 1)
|
||||
LOG(("%s:Writing %08x to %08x.\n",machine().describe_context(),data,toaplan_port_type[m_toaplan_main_cpu] - offset));
|
||||
switch (data) {
|
||||
case 0x08: machine().bookkeeping().coin_counter_w(0,0); break;
|
||||
case 0x09: machine().bookkeeping().coin_counter_w(0,1); break;
|
||||
case 0x0a: machine().bookkeeping().coin_counter_w(1,0); break;
|
||||
case 0x0b: machine().bookkeeping().coin_counter_w(1,1); break;
|
||||
case 0x0c: machine().bookkeeping().coin_lockout_w(0,1); break;
|
||||
case 0x0d: machine().bookkeeping().coin_lockout_w(0,0); break;
|
||||
case 0x0e: machine().bookkeeping().coin_lockout_w(1,1); break;
|
||||
case 0x0f: machine().bookkeeping().coin_lockout_w(1,0); break;
|
||||
/****** The following apply to Flying Shark/Wardner only ******/
|
||||
case 0x00: /* This means assert the INT line to the DSP */
|
||||
LOG(("Turning DSP on and main CPU off\n"));
|
||||
m_dsp->set_input_line(INPUT_LINE_HALT, CLEAR_LINE);
|
||||
m_dsp->set_input_line(0, ASSERT_LINE); /* TMS32010 INT */
|
||||
m_maincpu->set_input_line(INPUT_LINE_HALT, ASSERT_LINE);
|
||||
break;
|
||||
case 0x01: /* This means inhibit the INT line to the DSP */
|
||||
LOG(("Turning DSP off\n"));
|
||||
m_dsp->set_input_line(0, CLEAR_LINE); /* TMS32010 INT */
|
||||
m_dsp->set_input_line(INPUT_LINE_HALT, ASSERT_LINE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
WRITE16_MEMBER(twincobr_state::fshark_coin_dsp_w)
|
||||
{
|
||||
if (ACCESSING_BITS_0_7)
|
||||
{
|
||||
toaplan0_coin_dsp_w(space, offset, data & 0xff);
|
||||
}
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(twincobr_state::twincobr_coin_w)
|
||||
{
|
||||
toaplan0_coin_dsp_w(space, offset, data);
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(twincobr_state::wardner_coin_dsp_w)
|
||||
{
|
||||
toaplan0_coin_dsp_w(space, offset, data);
|
||||
}
|
||||
|
||||
|
||||
MACHINE_RESET_MEMBER(twincobr_state,twincobr)
|
||||
{
|
||||
m_toaplan_main_cpu = 0; /* 68000 */
|
||||
twincobr_display(0);
|
||||
m_intenable = 0;
|
||||
m_dsp_addr_w = 0;
|
||||
m_main_ram_seg = 0;
|
||||
m_dsp_execute = 0;
|
||||
|
@ -122,14 +122,24 @@ VIDEO_START_MEMBER(twincobr_state,toaplan0)
|
||||
Video I/O interface
|
||||
***************************************************************************/
|
||||
|
||||
void twincobr_state::twincobr_display(int enable)
|
||||
WRITE_LINE_MEMBER(twincobr_state::display_on_w)
|
||||
{
|
||||
m_display_on = enable;
|
||||
m_display_on = state;
|
||||
}
|
||||
|
||||
void twincobr_state::twincobr_flipscreen(int flip)
|
||||
WRITE_LINE_MEMBER(twincobr_state::flipscreen_w)
|
||||
{
|
||||
machine().tilemap().set_flip_all((flip ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0));
|
||||
machine().tilemap().set_flip_all((state ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0));
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(twincobr_state::bg_ram_bank_w)
|
||||
{
|
||||
m_bg_ram_bank = state ? 0x1000 : 0x0000;
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(twincobr_state::fg_rom_bank_w)
|
||||
{
|
||||
m_fg_rom_bank = state ? 0x1000 : 0x0000;
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user