more of the same (nw)

This commit is contained in:
Vas Crabb 2018-07-08 18:08:10 +10:00
parent f0773a505b
commit e56b1e0cda
12 changed files with 171 additions and 222 deletions

View File

@ -114,34 +114,6 @@ to implement the card in both systems.
#pragma once #pragma once
#define MCFG_INTELLEC4_UNIV_BUS_ROM_SPACE(tag, space) \
downcast<bus::intellec4::univ_bus_device &>(*device).set_rom_space(tag, space);
#define MCFG_INTELLEC4_UNIV_BUS_ROM_PORTS_SPACE(tag, space) \
downcast<bus::intellec4::univ_bus_device &>(*device).set_rom_ports_space(tag, space);
#define MCFG_INTELLEC4_UNIV_BUS_MEMORY_SPACE(tag, space) \
downcast<bus::intellec4::univ_bus_device &>(*device).set_memory_space(tag, space);
#define MCFG_INTELLEC4_UNIV_BUS_STATUS_SPACE(tag, space) \
downcast<bus::intellec4::univ_bus_device &>(*device).set_status_space(tag, space);
#define MCFG_INTELLEC4_UNIV_BUS_RAM_PORTS_SPACE(tag, space) \
downcast<bus::intellec4::univ_bus_device &>(*device).set_ram_ports_space(tag, space);
#define MCFG_INTELLEC4_UNIV_BUS_TEST_CB(obj) \
downcast<bus::intellec4::univ_bus_device &>(*device).set_test_out_cb(DEVCB_##obj);
#define MCFG_INTELLEC4_UNIV_BUS_STOP_CB(obj) \
downcast<bus::intellec4::univ_bus_device &>(*device).set_stop_out_cb(DEVCB_##obj);
#define MCFG_INTELLEC4_UNIV_BUS_RESET_4002_CB(obj) \
downcast<bus::intellec4::univ_bus_device &>(*device).set_reset_4002_out_cb(DEVCB_##obj);
#define MCFG_INTELLEC4_UNIV_BUS_USER_RESET_CB(obj) \
downcast<bus::intellec4::univ_bus_device &>(*device).set_user_reset_out_cb(DEVCB_##obj);
namespace bus { namespace intellec4 { namespace bus { namespace intellec4 {
class univ_slot_device; class univ_slot_device;
@ -188,10 +160,10 @@ public:
template <typename T> void set_ram_ports_space(T &&tag, int space) { m_ram_ports_device.set_tag(std::forward<T>(tag)); m_ram_ports_space = space; } template <typename T> void set_ram_ports_space(T &&tag, int space) { m_ram_ports_device.set_tag(std::forward<T>(tag)); m_ram_ports_space = space; }
// callback configuration // callback configuration
template <typename Obj> devcb_base &set_stop_out_cb(Obj &&cb) { return m_stop_out_cb.set_callback(std::forward<Obj>(cb)); } auto stop_out_cb() { return m_stop_out_cb.bind(); }
template <typename Obj> devcb_base &set_test_out_cb(Obj &&cb) { return m_test_out_cb.set_callback(std::forward<Obj>(cb)); } auto test_out_cb() { return m_test_out_cb.bind(); }
template <typename Obj> devcb_base &set_reset_4002_out_cb(Obj &&cb) { return m_reset_4002_out_cb.set_callback(std::forward<Obj>(cb)); } auto reset_4002_out_cb() { return m_reset_4002_out_cb.bind(); }
template <typename Obj> devcb_base &set_user_reset_out_cb(Obj &&cb) { return m_user_reset_out_cb.set_callback(std::forward<Obj>(cb)); } auto user_reset_out_cb() { return m_user_reset_out_cb.bind(); }
univ_bus_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock); univ_bus_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock);

View File

@ -30,6 +30,7 @@ public:
address_map_bank_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); address_map_bank_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// configuration helpers // configuration helpers
template <typename... T> void set_map(T &&... args) { set_addrmap(0, std::forward<T>(args)...); }
void set_endianness(endianness_t endianness) { m_endianness = endianness; } void set_endianness(endianness_t endianness) { m_endianness = endianness; }
void set_data_width(uint8_t data_width) { m_data_width = data_width; } void set_data_width(uint8_t data_width) { m_data_width = data_width; }
void set_addr_width(uint8_t addr_width) { m_addr_width = addr_width; } void set_addr_width(uint8_t addr_width) { m_addr_width = addr_width; }

View File

@ -817,35 +817,36 @@ DEVICE_INPUT_DEFAULTS_START(tty)
DEVICE_INPUT_DEFAULTS("FLOW_CONTROL", 0x0001, 0x0000) DEVICE_INPUT_DEFAULTS("FLOW_CONTROL", 0x0001, 0x0000)
DEVICE_INPUT_DEFAULTS_END DEVICE_INPUT_DEFAULTS_END
MACHINE_CONFIG_START(intellec4_state::intellec4) void intellec4_state::intellec4(machine_config &config)
MCFG_DEVICE_ADD(m_program_banks, ADDRESS_MAP_BANK, 0) {
MCFG_DEVICE_PROGRAM_MAP(intellec4_program_banks) ADDRESS_MAP_BANK(config, m_program_banks, 0);
MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE) m_program_banks->set_map(&intellec4_state::intellec4_program_banks);
MCFG_ADDRESS_MAP_BANK_DATA_WIDTH(8) m_program_banks->set_endianness(ENDIANNESS_LITTLE);
MCFG_ADDRESS_MAP_BANK_ADDR_WIDTH(14) m_program_banks->set_data_width(8);
MCFG_ADDRESS_MAP_BANK_STRIDE(0x1000) m_program_banks->set_addr_width(14);
m_program_banks->set_stride(0x1000);
MCFG_DEVICE_ADD(m_rom_port_banks, ADDRESS_MAP_BANK, 0) ADDRESS_MAP_BANK(config, m_rom_port_banks, 0);
MCFG_DEVICE_PROGRAM_MAP(intellec4_rom_port_banks) m_rom_port_banks->set_map(&intellec4_state::intellec4_rom_port_banks);
MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE) m_rom_port_banks->set_endianness(ENDIANNESS_LITTLE);
MCFG_ADDRESS_MAP_BANK_DATA_WIDTH(8) m_rom_port_banks->set_data_width(8);
MCFG_ADDRESS_MAP_BANK_ADDR_WIDTH(14) m_rom_port_banks->set_addr_width(14);
MCFG_ADDRESS_MAP_BANK_STRIDE(0x1000) m_rom_port_banks->set_stride(0x1000);
MCFG_DEVICE_ADD(m_prom_programmer, INTEL_IMM6_76, 0) INTEL_IMM6_76(config, m_prom_programmer, 0);
MCFG_DEVICE_ADD(m_tty, RS232_PORT, default_rs232_devices, "terminal") RS232_PORT(config, m_tty, default_rs232_devices, "terminal");
MCFG_SLOT_OPTION_DEVICE_INPUT_DEFAULTS("terminal", tty) m_tty->set_option_device_input_defaults("terminal", DEVICE_INPUT_DEFAULTS_NAME(tty));
MCFG_SLOT_OPTION_DEVICE_INPUT_DEFAULTS("null_modem", tty) m_tty->set_option_device_input_defaults("null_modem", DEVICE_INPUT_DEFAULTS_NAME(tty));
MCFG_DEVICE_ADD(m_bus, INTELLEC4_UNIV_BUS, 518000. / 7) INTELLEC4_UNIV_BUS(config, m_bus, 518000. / 7);
MCFG_INTELLEC4_UNIV_BUS_ROM_SPACE(m_program_banks, AS_PROGRAM) m_bus->set_rom_space(m_program_banks, AS_PROGRAM);
MCFG_INTELLEC4_UNIV_BUS_ROM_PORTS_SPACE(m_rom_port_banks, AS_PROGRAM) m_bus->set_rom_ports_space(m_rom_port_banks, AS_PROGRAM);
MCFG_INTELLEC4_UNIV_BUS_MEMORY_SPACE(m_cpu, mcs40_cpu_device_base::AS_RAM_MEMORY) m_bus->set_memory_space(m_cpu, mcs40_cpu_device_base::AS_RAM_MEMORY);
MCFG_INTELLEC4_UNIV_BUS_STATUS_SPACE(m_cpu, mcs40_cpu_device_base::AS_RAM_STATUS) m_bus->set_status_space(m_cpu, mcs40_cpu_device_base::AS_RAM_STATUS);
MCFG_INTELLEC4_UNIV_BUS_RAM_PORTS_SPACE(m_cpu, mcs40_cpu_device_base::AS_RAM_PORTS) m_bus->set_ram_ports_space(m_cpu, mcs40_cpu_device_base::AS_RAM_PORTS);
MCFG_INTELLEC4_UNIV_BUS_RESET_4002_CB(WRITELINE(*this, intellec4_state, bus_reset_4002)) m_bus->reset_4002_out_cb().set(FUNC(intellec4_state::bus_reset_4002));
MCFG_INTELLEC4_UNIV_BUS_USER_RESET_CB(WRITELINE(*this, intellec4_state, bus_user_reset)) m_bus->user_reset_out_cb().set(FUNC(intellec4_state::bus_user_reset));
INTELLEC4_UNIV_SLOT(config, "j7", 5.185_MHz_XTAL / 7, m_bus, intellec4_univ_cards, "imm4_90"); INTELLEC4_UNIV_SLOT(config, "j7", 5.185_MHz_XTAL / 7, m_bus, intellec4_univ_cards, "imm4_90");
INTELLEC4_UNIV_SLOT(config, "j8", 5.185_MHz_XTAL / 7, m_bus, intellec4_univ_cards, "imm6_26"); INTELLEC4_UNIV_SLOT(config, "j8", 5.185_MHz_XTAL / 7, m_bus, intellec4_univ_cards, "imm6_26");
INTELLEC4_UNIV_SLOT(config, "j9", 5.185_MHz_XTAL / 7, m_bus, intellec4_univ_cards, nullptr); INTELLEC4_UNIV_SLOT(config, "j9", 5.185_MHz_XTAL / 7, m_bus, intellec4_univ_cards, nullptr);
@ -859,7 +860,7 @@ MACHINE_CONFIG_START(intellec4_state::intellec4)
INTELLEC4_UNIV_SLOT(config, "j17", 5.185_MHz_XTAL / 7, m_bus, intellec4_univ_cards, nullptr); INTELLEC4_UNIV_SLOT(config, "j17", 5.185_MHz_XTAL / 7, m_bus, intellec4_univ_cards, nullptr);
INTELLEC4_UNIV_SLOT(config, "j18", 5.185_MHz_XTAL / 7, m_bus, intellec4_univ_cards, nullptr); INTELLEC4_UNIV_SLOT(config, "j18", 5.185_MHz_XTAL / 7, m_bus, intellec4_univ_cards, nullptr);
INTELLEC4_UNIV_SLOT(config, "j19", 5.185_MHz_XTAL / 7, m_bus, intellec4_univ_cards, nullptr); INTELLEC4_UNIV_SLOT(config, "j19", 5.185_MHz_XTAL / 7, m_bus, intellec4_univ_cards, nullptr);
MACHINE_CONFIG_END }
/*---------------------------------- /*----------------------------------
@ -1134,8 +1135,7 @@ MACHINE_CONFIG_START(mod4_state::mod4)
MCFG_I4004_BUS_CYCLE_CB(BUSCYCLE(mod4_state, bus_cycle)); MCFG_I4004_BUS_CYCLE_CB(BUSCYCLE(mod4_state, bus_cycle));
MCFG_I4004_SYNC_CB(WRITELINE(m_bus, bus::intellec4::univ_bus_device, sync_in)) MCFG_I4004_SYNC_CB(WRITELINE(m_bus, bus::intellec4::univ_bus_device, sync_in))
MCFG_DEVICE_MODIFY("bus") m_bus->test_out_cb().set(FUNC(mod4_state::bus_test));
MCFG_INTELLEC4_UNIV_BUS_TEST_CB(WRITELINE(*this, mod4_state, bus_test))
MCFG_DEFAULT_LAYOUT(layout_intlc44) MCFG_DEFAULT_LAYOUT(layout_intlc44)
MACHINE_CONFIG_END MACHINE_CONFIG_END
@ -1361,9 +1361,8 @@ MACHINE_CONFIG_START(mod40_state::mod40)
MCFG_I4040_SYNC_CB(WRITELINE(m_bus, bus::intellec4::univ_bus_device, sync_in)) MCFG_I4040_SYNC_CB(WRITELINE(m_bus, bus::intellec4::univ_bus_device, sync_in))
MCFG_I4040_STP_ACK_CB(WRITELINE(*this, mod40_state, stp_ack)) MCFG_I4040_STP_ACK_CB(WRITELINE(*this, mod40_state, stp_ack))
MCFG_DEVICE_MODIFY("bus") m_bus->stop_out_cb().set(FUNC(mod40_state::bus_stop));
MCFG_INTELLEC4_UNIV_BUS_STOP_CB(WRITELINE(*this, mod40_state, bus_stop)) m_bus->test_out_cb().set(FUNC(mod40_state::bus_test));
MCFG_INTELLEC4_UNIV_BUS_TEST_CB(WRITELINE(*this, mod40_state, bus_test))
MCFG_DEFAULT_LAYOUT(layout_intlc440) MCFG_DEFAULT_LAYOUT(layout_intlc440)
MACHINE_CONFIG_END MACHINE_CONFIG_END

View File

@ -213,6 +213,8 @@ MACHINE_CONFIG_START(microtan_state::microtan)
MCFG_DEVICE_PROGRAM_MAP(main_map) MCFG_DEVICE_PROGRAM_MAP(main_map)
MCFG_DEVICE_VBLANK_INT_DRIVER("screen", microtan_state, interrupt) MCFG_DEVICE_VBLANK_INT_DRIVER("screen", microtan_state, interrupt)
// The 6502 IRQ line is active low and probably driven by open collector outputs (guess).
INPUT_MERGER_ANY_HIGH(config, m_irq_line).output_handler().set_inputline(m_maincpu, 0);
/* video hardware - include overscan */ /* video hardware - include overscan */
MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_ADD("screen", RASTER)
@ -247,20 +249,20 @@ MACHINE_CONFIG_START(microtan_state::microtan)
MCFG_MOS6551_XTAL(XTAL(1'843'200)) MCFG_MOS6551_XTAL(XTAL(1'843'200))
/* via */ /* via */
MCFG_DEVICE_ADD(m_via6522[0], VIA6522, XTAL(6'000'000) / 8) VIA6522(config, m_via6522[0], 6_MHz_XTAL / 8);
MCFG_VIA6522_READPA_HANDLER(READ8(*this, microtan_state, via_0_in_a)) m_via6522[0]->readpa_handler().set(FUNC(microtan_state::via_0_in_a));
MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, microtan_state, via_0_out_a)) m_via6522[0]->writepa_handler().set(FUNC(microtan_state::via_0_out_a));
MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, microtan_state, via_0_out_b)) m_via6522[0]->writepb_handler().set(FUNC(microtan_state::via_0_out_b));
MCFG_VIA6522_CA2_HANDLER(WRITELINE(*this, microtan_state, via_0_out_ca2)) m_via6522[0]->ca2_handler().set(FUNC(microtan_state::via_0_out_ca2));
MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, microtan_state, via_0_out_cb2)) m_via6522[0]->cb2_handler().set(FUNC(microtan_state::via_0_out_cb2));
MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, microtan_state, via_0_irq)) m_via6522[0]->irq_handler().set(m_irq_line, FUNC(input_merger_device::in_w<IRQ_VIA_0>));
MCFG_DEVICE_ADD(m_via6522[1], VIA6522, XTAL(6'000'000) / 8) MCFG_DEVICE_ADD(m_via6522[1], VIA6522, XTAL(6'000'000) / 8)
MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, microtan_state, via_1_out_a)) m_via6522[1]->writepa_handler().set(FUNC(microtan_state::via_1_out_a));
MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, microtan_state, via_1_out_b)) m_via6522[1]->writepb_handler().set(FUNC(microtan_state::via_1_out_b));
MCFG_VIA6522_CA2_HANDLER(WRITELINE(*this, microtan_state, via_1_out_ca2)) m_via6522[1]->ca2_handler().set(FUNC(microtan_state::via_1_out_ca2));
MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, microtan_state, via_1_out_cb2)) m_via6522[1]->cb2_handler().set(FUNC(microtan_state::via_1_out_cb2));
MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, microtan_state, via_1_irq)) m_via6522[1]->irq_handler().set(m_irq_line, FUNC(input_merger_device::in_w<IRQ_VIA_1>));
MACHINE_CONFIG_END MACHINE_CONFIG_END
ROM_START( microtan ) ROM_START( microtan )

View File

@ -1700,16 +1700,16 @@ via software as INT1
/* */ /* */
/*************************************************************/ /*************************************************************/
MACHINE_CONFIG_START(namcos2_state::configure_c148_standard) void namcos2_state::configure_c148_standard(machine_config &config)
MCFG_NAMCO_C148_ADD("master_intc","maincpu",true) {
MCFG_NAMCO_C148_LINK("slave_intc") NAMCO_C148(config, m_master_intc, 0, m_maincpu, true);
MCFG_NAMCO_C148_EXT1_CB(WRITE8(*this, namcos2_state, sound_reset_w)) m_master_intc->link_c148_device(m_slave_intc);
MCFG_NAMCO_C148_EXT2_CB(WRITE8(*this, namcos2_state, system_reset_w)) m_master_intc->out_ext1_callback().set(FUNC(namcos2_state::sound_reset_w));
m_master_intc->out_ext2_callback().set(FUNC(namcos2_state::system_reset_w));
MCFG_NAMCO_C148_ADD("slave_intc","slave",false) NAMCO_C148(config, m_slave_intc, 0, m_slave, false);
MCFG_NAMCO_C148_LINK("master_intc") m_slave_intc->link_c148_device(m_master_intc);
}
MACHINE_CONFIG_END
// TODO: temp // TODO: temp
TIMER_DEVICE_CALLBACK_MEMBER(namcos2_state::screen_scanline) TIMER_DEVICE_CALLBACK_MEMBER(namcos2_state::screen_scanline)

View File

@ -1901,16 +1901,16 @@ TIMER_DEVICE_CALLBACK_MEMBER(namcos21_state::screen_scanline)
} }
} }
MACHINE_CONFIG_START(namcos21_state::configure_c148_standard) void namcos21_state::configure_c148_standard(machine_config &config)
MCFG_NAMCO_C148_ADD("master_intc","maincpu",true) {
MCFG_NAMCO_C148_LINK("slave_intc") NAMCO_C148(config, m_master_intc, 0, m_maincpu, true);
MCFG_NAMCO_C148_EXT1_CB(WRITE8(*this, namcos21_state, sound_reset_w)) m_master_intc->link_c148_device(m_slave_intc);
MCFG_NAMCO_C148_EXT2_CB(WRITE8(*this, namcos21_state, system_reset_w)) m_master_intc->out_ext1_callback().set(FUNC(namcos21_state::sound_reset_w));
m_master_intc->out_ext2_callback().set(FUNC(namcos21_state::system_reset_w));
MCFG_NAMCO_C148_ADD("slave_intc","slave",false) NAMCO_C148(config, m_slave_intc, 0, m_slave, false);
MCFG_NAMCO_C148_LINK("master_intc") m_slave_intc->link_c148_device(m_master_intc);
}
MACHINE_CONFIG_END
MACHINE_CONFIG_START(namcos21_state::namcos21) MACHINE_CONFIG_START(namcos21_state::namcos21)
MCFG_DEVICE_ADD("maincpu", M68000,12288000) /* Master */ MCFG_DEVICE_ADD("maincpu", M68000,12288000) /* Master */
@ -2071,7 +2071,7 @@ MACHINE_CONFIG_START(namcos21_state::winrun)
MCFG_DEVICE_PROGRAM_MAP(winrun_gpu_map) MCFG_DEVICE_PROGRAM_MAP(winrun_gpu_map)
configure_c148_standard(config); configure_c148_standard(config);
MCFG_NAMCO_C148_ADD("gpu_intc","gpu",false) NAMCO_C148(config, m_gpu_intc, 0, "gpu", false);
MCFG_NAMCO_C139_ADD("sci") MCFG_NAMCO_C139_ADD("sci")
MCFG_QUANTUM_TIME(attotime::from_hz(6000)) /* 100 CPU slices per frame */ MCFG_QUANTUM_TIME(attotime::from_hz(6000)) /* 100 CPU slices per frame */

View File

@ -17,8 +17,11 @@
#ifndef MAME_INCLUDES_MICROTAN_H #ifndef MAME_INCLUDES_MICROTAN_H
#define MAME_INCLUDES_MICROTAN_H #define MAME_INCLUDES_MICROTAN_H
#pragma once
#include "imagedev/snapquik.h" #include "imagedev/snapquik.h"
#include "machine/6522via.h" #include "machine/6522via.h"
#include "machine/input_merger.h"
#include "sound/ay8910.h" #include "sound/ay8910.h"
#include "imagedev/cassette.h" #include "imagedev/cassette.h"
@ -29,6 +32,7 @@ public:
driver_device(mconfig, type, tag), driver_device(mconfig, type, tag),
m_videoram(*this, "videoram"), m_videoram(*this, "videoram"),
m_maincpu(*this, "maincpu"), m_maincpu(*this, "maincpu"),
m_irq_line(*this, "irq_line"),
m_cassette(*this, "cassette"), m_cassette(*this, "cassette"),
m_via6522(*this, "via6522%u", 0), m_via6522(*this, "via6522%u", 0),
m_ay8910(*this, "ay8910%u", 0), m_ay8910(*this, "ay8910%u", 0),
@ -41,20 +45,23 @@ public:
void init_microtan(); void init_microtan();
protected: protected:
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void video_start() override;
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
private:
enum enum
{ {
TIMER_READ_CASSETTE, TIMER_READ_CASSETTE,
TIMER_PULSE_NMI TIMER_PULSE_NMI
}; };
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void video_start() override;
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
private:
enum { IRQ_VIA_0, IRQ_VIA_1, IRQ_KBD };
required_shared_ptr<uint8_t> m_videoram; required_shared_ptr<uint8_t> m_videoram;
required_device<cpu_device> m_maincpu; required_device<cpu_device> m_maincpu;
required_device<input_merger_device> m_irq_line;
required_device<cassette_image_device> m_cassette; required_device<cassette_image_device> m_cassette;
required_device_array<via6522_device, 2> m_via6522; required_device_array<via6522_device, 2> m_via6522;
required_device_array<ay8910_device, 2> m_ay8910; required_device_array<ay8910_device, 2> m_ay8910;
@ -67,8 +74,6 @@ private:
uint8_t m_keyboard_ascii; uint8_t m_keyboard_ascii;
emu_timer *m_read_cassette_timer; emu_timer *m_read_cassette_timer;
emu_timer *m_pulse_nmi_timer; emu_timer *m_pulse_nmi_timer;
int m_via_irq_line[2];
int m_kbd_irq_line;
uint8_t m_keyrows[10]; uint8_t m_keyrows[10];
int m_lastrow; int m_lastrow;
int m_mask; int m_mask;
@ -96,10 +101,7 @@ private:
DECLARE_WRITE8_MEMBER(via_1_out_b); DECLARE_WRITE8_MEMBER(via_1_out_b);
DECLARE_WRITE_LINE_MEMBER(via_1_out_ca2); DECLARE_WRITE_LINE_MEMBER(via_1_out_ca2);
DECLARE_WRITE_LINE_MEMBER(via_1_out_cb2); DECLARE_WRITE_LINE_MEMBER(via_1_out_cb2);
DECLARE_WRITE_LINE_MEMBER(via_0_irq);
DECLARE_WRITE_LINE_MEMBER(via_1_irq);
uint8_t read_dsw(); uint8_t read_dsw();
void set_irq_line();
void store_key(int key); void store_key(int key);
image_verify_result verify_snapshot(uint8_t *data, int size); image_verify_result verify_snapshot(uint8_t *data, int size);
image_init_result parse_intel_hex(uint8_t *snapshot_buff, char *src); image_init_result parse_intel_hex(uint8_t *snapshot_buff, char *src);

View File

@ -7,6 +7,10 @@
Common functions & declarations for the Namco System 2 driver Common functions & declarations for the Namco System 2 driver
***************************************************************************/ ***************************************************************************/
#ifndef MAME_INCLUDES_NAMCOS2_H
#define MAME_INCLUDES_NAMCOS2_H
#pragma once
#include "machine/namco_c139.h" #include "machine/namco_c139.h"
#include "machine/namco_c148.h" #include "machine/namco_c148.h"
@ -101,27 +105,28 @@ class namcos2_shared_state : public driver_device
{ {
public: public:
namcos2_shared_state(const machine_config &mconfig, device_type type, const char *tag) namcos2_shared_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag), : driver_device(mconfig, type, tag)
m_dspmaster(*this, "dspmaster"), , m_dspmaster(*this, "dspmaster")
m_dspslave(*this, "dspslave"), , m_dspslave(*this, "dspslave")
m_gametype(0), , m_gametype(0)
m_c68(*this, "c68"), , m_c68(*this, "c68")
m_master_intc(*this, "master_intc"), , m_master_intc(*this, "master_intc")
m_slave_intc(*this, "slave_intc"), , m_slave_intc(*this, "slave_intc")
m_sci(*this, "sci"), , m_sci(*this, "sci")
m_gpu(*this, "gpu"), , m_gpu(*this, "gpu")
m_c169_roz_videoram(*this, "rozvideoram", 0), , m_c169_roz_videoram(*this, "rozvideoram", 0)
m_c169_roz_gfxbank(0), , m_c169_roz_gfxbank(0)
m_c169_roz_mask(nullptr), , m_c169_roz_mask(nullptr)
m_c355_obj_gfxbank(0), , m_c355_obj_gfxbank(0)
m_c355_obj_palxor(0), , m_c355_obj_palxor(0)
m_maincpu(*this, "maincpu"), , m_maincpu(*this, "maincpu")
m_audiocpu(*this, "audiocpu"), , m_audiocpu(*this, "audiocpu")
m_slave(*this, "slave"), , m_slave(*this, "slave")
m_mcu(*this, "mcu"), , m_mcu(*this, "mcu")
m_gfxdecode(*this, "gfxdecode"), , m_gfxdecode(*this, "gfxdecode")
m_screen(*this, "screen"), , m_screen(*this, "screen")
m_palette(*this, "palette") { } , m_palette(*this, "palette")
{ }
optional_device<cpu_device> m_dspmaster; optional_device<cpu_device> m_dspmaster;
optional_device<cpu_device> m_dspslave; optional_device<cpu_device> m_dspslave;
@ -468,3 +473,5 @@ extern void (*namcos2_kickstart)(running_machine &machine, int internal);
/**************************************************************/ /**************************************************************/
/* Sound CPU support handlers - 6809 */ /* Sound CPU support handlers - 6809 */
/**************************************************************/ /**************************************************************/
#endif // MAME_INCLUDES_NAMCOS2_H

View File

@ -3,6 +3,10 @@
/** /**
* @file namcos21.h * @file namcos21.h
*/ */
#ifndef MAME_INCLUDES_NAMCOS21_H
#define MAME_INCLUDES_NAMCOS21_H
#pragma once
#include "namcos2.h" #include "namcos2.h"
#include "machine/namcoio_gearbox.h" #include "machine/namcoio_gearbox.h"
@ -45,8 +49,8 @@ struct edge
class namcos21_state : public namcos2_shared_state class namcos21_state : public namcos2_shared_state
{ {
public: public:
namcos21_state(const machine_config &mconfig, device_type type, const char *tag) namcos21_state(const machine_config &mconfig, device_type type, const char *tag) :
: namcos2_shared_state(mconfig, type, tag), namcos2_shared_state(mconfig, type, tag),
m_master_dsp_code(*this,"master_dsp_code"), m_master_dsp_code(*this,"master_dsp_code"),
m_winrun_dspbios(*this,"winrun_dspbios"), m_winrun_dspbios(*this,"winrun_dspbios"),
m_winrun_polydata(*this,"winrun_polydata"), m_winrun_polydata(*this,"winrun_polydata"),
@ -57,7 +61,7 @@ public:
m_dsp(*this, "dsp"), m_dsp(*this, "dsp"),
m_io_gearbox(*this, "gearbox"), m_io_gearbox(*this, "gearbox"),
m_gpu_intc(*this, "gpu_intc") m_gpu_intc(*this, "gpu_intc")
{ } { }
void configure_c148_standard(machine_config &config); void configure_c148_standard(machine_config &config);
void driveyes(machine_config &config); void driveyes(machine_config &config);
@ -221,3 +225,5 @@ private:
void winrun_master_map(address_map &map); void winrun_master_map(address_map &map);
void winrun_slave_map(address_map &map); void winrun_slave_map(address_map &map);
}; };
#endif // MAME_INCLUDES_NAMCOS21_H

View File

@ -24,14 +24,8 @@
//#include "imagedev/snapquik.h" //#include "imagedev/snapquik.h"
//#define VERBOSE 1
#ifndef VERBOSE #include "logmacro.h"
#define VERBOSE 0
#endif
#define LOG(x) do { if (VERBOSE) logerror x; } while (0)
static const char keyboard[8][9][8] = { static const char keyboard[8][9][8] = {
@ -138,51 +132,36 @@ uint8_t microtan_state::read_dsw()
} }
} }
void microtan_state::set_irq_line()
{
/* The 6502 IRQ line is active low and probably driven
by open collector outputs (guess). Since MAME uses
a non-0 value for ASSERT_LINE we OR the signals here */
m_maincpu->set_input_line(0, m_via_irq_line[0] | m_via_irq_line[1] | m_kbd_irq_line);
}
/************************************************************** /**************************************************************
* VIA callback functions for VIA #0 * VIA callback functions for VIA #0
**************************************************************/ **************************************************************/
READ8_MEMBER(microtan_state::via_0_in_a) READ8_MEMBER(microtan_state::via_0_in_a)
{ {
int data = ioport("JOY")->read(); int data = ioport("JOY")->read();
LOG(("via_0_in_a %02X\n", data)); LOG("via_0_in_a %02X\n", data);
return data; return data;
} }
WRITE8_MEMBER(microtan_state::via_0_out_a) WRITE8_MEMBER(microtan_state::via_0_out_a)
{ {
LOG(("via_0_out_a %02X\n", data)); LOG("via_0_out_a %02X\n", data);
} }
WRITE8_MEMBER(microtan_state::via_0_out_b) WRITE8_MEMBER(microtan_state::via_0_out_b)
{ {
LOG(("via_0_out_b %02X\n", data)); LOG("via_0_out_b %02X\n", data);
/* bit #7 is the cassette output signal */ /* bit #7 is the cassette output signal */
m_cassette->output(data & 0x80 ? +1.0 : -1.0); m_cassette->output(data & 0x80 ? +1.0 : -1.0);
} }
WRITE_LINE_MEMBER(microtan_state::via_0_out_ca2) WRITE_LINE_MEMBER(microtan_state::via_0_out_ca2)
{ {
LOG(("via_0_out_ca2 %d\n", state)); LOG("via_0_out_ca2 %d\n", state);
} }
WRITE_LINE_MEMBER(microtan_state::via_0_out_cb2) WRITE_LINE_MEMBER(microtan_state::via_0_out_cb2)
{ {
LOG(("via_0_out_cb2 %d\n", state)); LOG("via_0_out_cb2 %d\n", state);
}
WRITE_LINE_MEMBER(microtan_state::via_0_irq)
{
LOG(("via_0_irq %d\n", state));
m_via_irq_line[0] = state;
set_irq_line();
} }
/************************************************************** /**************************************************************
@ -191,29 +170,22 @@ WRITE_LINE_MEMBER(microtan_state::via_0_irq)
WRITE8_MEMBER(microtan_state::via_1_out_a) WRITE8_MEMBER(microtan_state::via_1_out_a)
{ {
LOG(("via_1_out_a %02X\n", data)); LOG("via_1_out_a %02X\n", data);
} }
WRITE8_MEMBER(microtan_state::via_1_out_b) WRITE8_MEMBER(microtan_state::via_1_out_b)
{ {
LOG(("via_1_out_b %02X\n", data)); LOG("via_1_out_b %02X\n", data);
} }
WRITE_LINE_MEMBER(microtan_state::via_1_out_ca2) WRITE_LINE_MEMBER(microtan_state::via_1_out_ca2)
{ {
LOG(("via_1_out_ca2 %d\n", state)); LOG("via_1_out_ca2 %d\n", state);
} }
WRITE_LINE_MEMBER(microtan_state::via_1_out_cb2) WRITE_LINE_MEMBER(microtan_state::via_1_out_cb2)
{ {
LOG(("via_1_out_cb2 %d\n", state)); LOG("via_1_out_cb2 %d\n", state);
}
WRITE_LINE_MEMBER(microtan_state::via_1_irq)
{
LOG(("via_1_irq %d\n", state));
m_via_irq_line[1] = state;
set_irq_line();
} }
void microtan_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) void microtan_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
@ -236,7 +208,7 @@ TIMER_CALLBACK_MEMBER(microtan_state::read_cassette)
{ {
double level = m_cassette->input(); double level = m_cassette->input();
LOG(("read_cassette: %g\n", level)); LOG("read_cassette: %g\n", level);
if (level < -0.07) if (level < -0.07)
m_via6522[0]->write_cb2(0); m_via6522[0]->write_cb2(0);
else if (level > +0.07) else if (level > +0.07)
@ -246,13 +218,13 @@ TIMER_CALLBACK_MEMBER(microtan_state::read_cassette)
READ8_MEMBER(microtan_state::sound_r) READ8_MEMBER(microtan_state::sound_r)
{ {
int data = 0xff; int data = 0xff;
LOG(("sound_r: -> %02x\n", data)); LOG("sound_r: -> %02x\n", data);
return data; return data;
} }
WRITE8_MEMBER(microtan_state::sound_w) WRITE8_MEMBER(microtan_state::sound_w)
{ {
LOG(("sound_w: <- %02x\n", data)); LOG("sound_w: <- %02x\n", data);
} }
@ -263,17 +235,17 @@ READ8_MEMBER(microtan_state::bffx_r)
{ {
case 0: /* BFF0: read enables chunky graphics */ case 0: /* BFF0: read enables chunky graphics */
m_chunky_graphics = 1; m_chunky_graphics = 1;
LOG(("bff0_r: -> %02x (chunky graphics on)\n", data)); LOG("bff0_r: -> %02x (chunky graphics on)\n", data);
break; break;
case 1: /* BFF1: read undefined (?) */ case 1: /* BFF1: read undefined (?) */
LOG(("bff1_r: -> %02x\n", data)); LOG("bff1_r: -> %02x\n", data);
break; break;
case 2: /* BFF2: read undefined (?) */ case 2: /* BFF2: read undefined (?) */
LOG(("bff2_r: -> %02x\n", data)); LOG("bff2_r: -> %02x\n", data);
break; break;
default: /* BFF3: read keyboard ASCII value */ default: /* BFF3: read keyboard ASCII value */
data = m_keyboard_ascii; data = m_keyboard_ascii;
LOG(("bff3_r: -> %02x (keyboard ASCII)\n", data)); LOG("bff3_r: -> %02x (keyboard ASCII)\n", data);
} }
return data; return data;
} }
@ -291,31 +263,29 @@ WRITE8_MEMBER(microtan_state::bffx_w)
{ {
case 0: /* BFF0: write reset keyboard interrupt flag */ case 0: /* BFF0: write reset keyboard interrupt flag */
/* This removes bit 7 from the ASCII value of the last key pressed. */ /* This removes bit 7 from the ASCII value of the last key pressed. */
LOG(("bff0_w: %d <- %02x (keyboard IRQ clear )\n", offset, data)); LOG("bff0_w: %d <- %02x (keyboard IRQ clear )\n", offset, data);
m_keyboard_ascii &= ~0x80; m_keyboard_ascii &= ~0x80;
m_kbd_irq_line = CLEAR_LINE; m_irq_line->in_w<IRQ_KBD>(0);
set_irq_line();
break; break;
case 1: /* BFF1: write delayed NMI */ case 1: /* BFF1: write delayed NMI */
LOG(("bff1_w: %d <- %02x (delayed NMI)\n", offset, data)); LOG("bff1_w: %d <- %02x (delayed NMI)\n", offset, data);
m_pulse_nmi_timer->adjust(m_maincpu->cycles_to_attotime(8)); m_pulse_nmi_timer->adjust(m_maincpu->cycles_to_attotime(8));
break; break;
case 2: /* BFF2: write keypad column write (what is this meant for?) */ case 2: /* BFF2: write keypad column write (what is this meant for?) */
LOG(("bff2_w: %d <- %02x (keypad column)\n", offset, data)); LOG("bff2_w: %d <- %02x (keypad column)\n", offset, data);
m_keypad_column = data; m_keypad_column = data;
break; break;
default: /* BFF3: write disable chunky graphics */ default: /* BFF3: write disable chunky graphics */
LOG(("bff3_w: %d <- %02x (chunky graphics off)\n", offset, data)); LOG("bff3_w: %d <- %02x (chunky graphics off)\n", offset, data);
m_chunky_graphics = 0; m_chunky_graphics = 0;
} }
} }
void microtan_state::store_key(int key) void microtan_state::store_key(int key)
{ {
LOG(("microtan: store key '%c'\n", key)); LOG("microtan: store key '%c'\n", key);
m_keyboard_ascii = key | 0x80; m_keyboard_ascii = key | 0x80;
m_kbd_irq_line = ASSERT_LINE; m_irq_line->in_w<IRQ_KBD>(1);
set_irq_line();
} }
INTERRUPT_GEN_MEMBER(microtan_state::interrupt) INTERRUPT_GEN_MEMBER(microtan_state::interrupt)
@ -509,8 +479,6 @@ void microtan_state::machine_start()
save_item(NAME(m_chunky_graphics)); save_item(NAME(m_chunky_graphics));
save_item(NAME(m_keypad_column)); save_item(NAME(m_keypad_column));
save_item(NAME(m_keyboard_ascii)); save_item(NAME(m_keyboard_ascii));
save_item(NAME(m_via_irq_line));
save_item(NAME(m_kbd_irq_line));
save_item(NAME(m_keyrows)); save_item(NAME(m_keyrows));
save_item(NAME(m_lastrow)); save_item(NAME(m_lastrow));
save_item(NAME(m_mask)); save_item(NAME(m_mask));

View File

@ -65,8 +65,8 @@ DEFINE_DEVICE_TYPE(NAMCO_C148, namco_c148_device, "namco_c148", "Namco C148 Inte
// namco_c148_device - constructor // namco_c148_device - constructor
//------------------------------------------------- //-------------------------------------------------
namco_c148_device::namco_c148_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) namco_c148_device::namco_c148_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
: device_t(mconfig, NAMCO_C148, tag, owner, clock), device_t(mconfig, NAMCO_C148, tag, owner, clock),
m_out_ext1_cb(*this), m_out_ext1_cb(*this),
m_out_ext2_cb(*this), m_out_ext2_cb(*this),
m_hostcpu(*this, finder_base::DUMMY_TAG), m_hostcpu(*this, finder_base::DUMMY_TAG),
@ -98,6 +98,17 @@ void namco_c148_device::map(address_map &map)
//-------------------------------------------------
// device_validity_check - device-specific checks
//-------------------------------------------------
void namco_c148_device::device_validity_check(validity_checker &valid) const
{
if ((m_linked_c148.finder_tag() != finder_base::DUMMY_TAG) && !m_linked_c148)
osd_printf_error("Linked C148 configured but not found.\n");
}
//------------------------------------------------- //-------------------------------------------------
// device_start - device-specific startup // device_start - device-specific startup
//------------------------------------------------- //-------------------------------------------------

View File

@ -11,26 +11,6 @@
#pragma once #pragma once
//**************************************************************************
// INTERFACE CONFIGURATION MACROS
//**************************************************************************
#define MCFG_NAMCO_C148_ADD(_tag, _cputag, _cpumaster) \
MCFG_DEVICE_ADD(_tag, NAMCO_C148, 0) \
downcast<namco_c148_device &>(*device).configure_device(_cputag, _cpumaster);
#define MCFG_NAMCO_C148_LINK(_tag) \
downcast<namco_c148_device &>(*device).link_c148_device(_tag);
#define MCFG_NAMCO_C148_EXT1_CB(_cb) \
downcast<namco_c148_device &>(*device).set_out_ext1_callback(DEVCB_##_cb);
#define MCFG_NAMCO_C148_EXT2_CB(_cb) \
downcast<namco_c148_device &>(*device).set_out_ext2_callback(DEVCB_##_cb);
//************************************************************************** //**************************************************************************
// TYPE DEFINITIONS // TYPE DEFINITIONS
//************************************************************************** //**************************************************************************
@ -41,23 +21,26 @@ class namco_c148_device : public device_t
{ {
public: public:
// construction/destruction // construction/destruction
template <typename T>
namco_c148_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &&hostcpu, bool is_master)
: namco_c148_device(mconfig, tag, owner, clock)
{
set_hostcpu(std::forward<T>(hostcpu), is_master);
}
namco_c148_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); namco_c148_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
void map(address_map &map); void map(address_map &map);
template <class T> void configure_device(T &&tag, bool is_master) template <typename T> void set_hostcpu(T &&tag, bool is_master)
{ {
m_hostcpu.set_tag(std::forward<T>(tag)); m_hostcpu.set_tag(std::forward<T>(tag));
m_hostcpu_master = is_master; m_hostcpu_master = is_master;
} }
template <class T> void link_c148_device(T &&tag) { m_linked_c148.set_tag(std::forward<T>(tag)); } template <typename T> void link_c148_device(T &&tag) { m_linked_c148.set_tag(std::forward<T>(tag)); }
template <class Object> devcb_base &set_out_ext1_callback(Object &&cb) { return m_out_ext1_cb.set_callback(std::forward<Object>(cb)); } auto out_ext1_callback() { return m_out_ext1_cb.bind(); }
template <class Object> devcb_base &set_out_ext2_callback(Object &&cb) { return m_out_ext2_cb.set_callback(std::forward<Object>(cb)); } auto out_ext2_callback() { return m_out_ext2_cb.bind(); }
devcb_write8 m_out_ext1_cb;
devcb_write8 m_out_ext2_cb;
DECLARE_READ8_MEMBER( vblank_irq_level_r ); DECLARE_READ8_MEMBER( vblank_irq_level_r );
DECLARE_WRITE8_MEMBER( vblank_irq_level_w ); DECLARE_WRITE8_MEMBER( vblank_irq_level_w );
@ -103,9 +86,14 @@ public:
protected: protected:
void cpu_irq_trigger(); void cpu_irq_trigger();
// device-level overrides // device-level overrides
virtual void device_validity_check(validity_checker &valid) const override;
virtual void device_start() override; virtual void device_start() override;
virtual void device_reset() override; virtual void device_reset() override;
private: private:
devcb_write8 m_out_ext1_cb;
devcb_write8 m_out_ext2_cb;
required_device<cpu_device> m_hostcpu; // reference to the host cpu required_device<cpu_device> m_hostcpu; // reference to the host cpu
optional_device<namco_c148_device> m_linked_c148; // reference to linked master/slave c148 optional_device<namco_c148_device> m_linked_c148; // reference to linked master/slave c148
bool m_hostcpu_master; // define if host cpu is master bool m_hostcpu_master; // define if host cpu is master
@ -128,11 +116,4 @@ private:
DECLARE_DEVICE_TYPE(NAMCO_C148, namco_c148_device) DECLARE_DEVICE_TYPE(NAMCO_C148, namco_c148_device)
//**************************************************************************
// GLOBAL VARIABLES
//**************************************************************************
#endif // MAME_MACHINE_NAMCO_C148_H #endif // MAME_MACHINE_NAMCO_C148_H