From 962190293136395dcca07f30abaf9210feb473f7 Mon Sep 17 00:00:00 2001 From: mooglyguy Date: Wed, 1 Aug 2018 09:18:03 +0200 Subject: -vic20: Removed MCFG and duplicated machine configs. [Ryan Holtz] --- src/devices/bus/cbmiec/cbmiec.cpp | 18 +++ src/devices/bus/cbmiec/cbmiec.h | 26 ++++- src/devices/bus/pet/cass.h | 1 + src/devices/bus/vcs_ctrl/ctrl.h | 1 + src/devices/bus/vic20/exp.cpp | 8 ++ src/devices/bus/vic20/exp.h | 30 +---- src/devices/bus/vic20/vic1010.cpp | 17 +-- src/devices/sound/mos6560.h | 35 +----- src/mame/drivers/attckufo.cpp | 13 ++- src/mame/drivers/vic20.cpp | 236 +++++++++++++++++--------------------- 10 files changed, 185 insertions(+), 200 deletions(-) diff --git a/src/devices/bus/cbmiec/cbmiec.cpp b/src/devices/bus/cbmiec/cbmiec.cpp index 34cd7d4a63b..61d5905df2a 100644 --- a/src/devices/bus/cbmiec/cbmiec.cpp +++ b/src/devices/bus/cbmiec/cbmiec.cpp @@ -273,7 +273,25 @@ void cbm_iec_slot_device::device_start() if (dev) bus->add_device(this, get_card_device()); } +/*template +void cbm_iec_slot_device::add(machine_config &config, T &&_bus_tag, const char *_default_drive) +{ + add_slot(config, "iec4", 4, nullptr); + add_slot(config, "iec8", 8, _default_drive); + add_slot(config, "iec9", 9, nullptr); + add_slot(config, "iec10", 10, nullptr); + add_slot(config, "iec11", 11, nullptr); + + CBM_IEC(config, std::forward(_bus_tag), 0); +}*/ +void cbm_iec_slot_device::add_slot(machine_config &config, const char *_tag, int _address, const char *_def_slot) +{ + cbm_iec_slot_device &slot(CBM_IEC_SLOT(config, _tag, 0)); + cbm_iec_devices(slot); + slot.set_default_option(_def_slot); + slot.set_address(_address); +} //************************************************************************** // LIVE DEVICE diff --git a/src/devices/bus/cbmiec/cbmiec.h b/src/devices/bus/cbmiec/cbmiec.h index 0ed382142e0..fb889573709 100644 --- a/src/devices/bus/cbmiec/cbmiec.h +++ b/src/devices/bus/cbmiec/cbmiec.h @@ -61,6 +61,7 @@ MCFG_CBM_IEC_BUS_ADD() +void cbm_iec_devices(device_slot_interface &device); //************************************************************************** // TYPE DEFINITIONS @@ -82,6 +83,11 @@ public: template devcb_base &set_clk_callback(Object &&wr) { return m_write_clk.set_callback(std::forward(wr)); } template devcb_base &set_data_callback(Object &&wr) { return m_write_data.set_callback(std::forward(wr)); } template devcb_base &set_reset_callback(Object &&wr) { return m_write_reset.set_callback(std::forward(wr)); } + auto srq_callback() { return m_write_srq.bind(); } + auto atn_callback() { return m_write_atn.bind(); } + auto clk_callback() { return m_write_clk.bind(); } + auto data_callback() { return m_write_data.bind(); } + auto reset_callback() { return m_write_reset.bind(); } void add_device(cbm_iec_slot_device *slot, device_t *target); @@ -150,6 +156,8 @@ private: int m_line[SIGNAL_COUNT]; }; +DECLARE_DEVICE_TYPE(CBM_IEC, cbm_iec_device) + // ======================> cbm_iec_slot_device @@ -160,6 +168,18 @@ public: // construction/destruction cbm_iec_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + static void add_slot(machine_config &config, const char *_tag, int _address, const char *_def_slot); + template static void add(machine_config &config, T &&_bus_tag, const char *_default_drive) + { + add_slot(config, "iec4", 4, nullptr); + add_slot(config, "iec8", 8, _default_drive); + add_slot(config, "iec9", 9, nullptr); + add_slot(config, "iec10", 10, nullptr); + add_slot(config, "iec11", 11, nullptr); + + CBM_IEC(config, std::forward(_bus_tag), 0); + } + void set_address(int address) { m_address = address; } int get_address() { return m_address; } @@ -198,12 +218,6 @@ protected: cbm_iec_slot_device *m_slot; }; - -// device type definition -DECLARE_DEVICE_TYPE(CBM_IEC, cbm_iec_device) DECLARE_DEVICE_TYPE(CBM_IEC_SLOT, cbm_iec_slot_device) - -void cbm_iec_devices(device_slot_interface &device); - #endif // MAME_BUS_CBMIEC_CBMIEC_H diff --git a/src/devices/bus/pet/cass.h b/src/devices/bus/pet/cass.h index 29d64278a3b..1b1bd419423 100644 --- a/src/devices/bus/pet/cass.h +++ b/src/devices/bus/pet/cass.h @@ -60,6 +60,7 @@ public: // static configuration helpers template devcb_base &set_read_handler(Object &&cb) { return m_read_handler.set_callback(std::forward(cb)); } + auto read_handler() { return m_read_handler.bind(); } // computer interface DECLARE_READ_LINE_MEMBER( read ); diff --git a/src/devices/bus/vcs_ctrl/ctrl.h b/src/devices/bus/vcs_ctrl/ctrl.h index 271001b3486..3f9b77b4c35 100644 --- a/src/devices/bus/vcs_ctrl/ctrl.h +++ b/src/devices/bus/vcs_ctrl/ctrl.h @@ -71,6 +71,7 @@ public: // static configuration helpers template devcb_base &set_trigger_wr_callback(Object &&cb) { return m_write_trigger.set_callback(std::forward(cb)); } + auto trigger_wr_callback() { return m_write_trigger.bind(); } // computer interface diff --git a/src/devices/bus/vic20/exp.cpp b/src/devices/bus/vic20/exp.cpp index 5556dcba3e9..4bc6136553b 100644 --- a/src/devices/bus/vic20/exp.cpp +++ b/src/devices/bus/vic20/exp.cpp @@ -201,6 +201,14 @@ void vic20_expansion_slot_device::cd_w(address_space &space, offs_t offset, uint } } +void vic20_expansion_slot_device::add_passthrough(machine_config &config, const char *_tag) +{ + vic20_expansion_slot_device &slot(VIC20_EXPANSION_SLOT(config, _tag, DERIVED_CLOCK(1, 1), vic20_expansion_cards, nullptr)); + slot.irq_wr_callback().set(DEVICE_SELF_OWNER, FUNC(vic20_expansion_slot_device::irq_w)); + slot.nmi_wr_callback().set(DEVICE_SELF_OWNER, FUNC(vic20_expansion_slot_device::nmi_w)); + slot.res_wr_callback().set(DEVICE_SELF_OWNER, FUNC(vic20_expansion_slot_device::res_w)); +} + //------------------------------------------------- // SLOT_INTERFACE( vic20_expansion_cards ) diff --git a/src/devices/bus/vic20/exp.h b/src/devices/bus/vic20/exp.h index eadac324dfb..b6b0dbd1346 100644 --- a/src/devices/bus/vic20/exp.h +++ b/src/devices/bus/vic20/exp.h @@ -47,28 +47,6 @@ -//************************************************************************** -// INTERFACE CONFIGURATION MACROS -//************************************************************************** - -#define MCFG_VIC20_PASSTHRU_EXPANSION_SLOT_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, VIC20_EXPANSION_SLOT, DERIVED_CLOCK(1, 1), vic20_expansion_cards, nullptr) \ - MCFG_VIC20_EXPANSION_SLOT_IRQ_CALLBACK(WRITELINE(DEVICE_SELF_OWNER, vic20_expansion_slot_device, irq_w)) \ - MCFG_VIC20_EXPANSION_SLOT_NMI_CALLBACK(WRITELINE(DEVICE_SELF_OWNER, vic20_expansion_slot_device, nmi_w)) \ - MCFG_VIC20_EXPANSION_SLOT_RES_CALLBACK(WRITELINE(DEVICE_SELF_OWNER, vic20_expansion_slot_device, res_w)) - - -#define MCFG_VIC20_EXPANSION_SLOT_IRQ_CALLBACK(_write) \ - downcast(*device).set_irq_wr_callback(DEVCB_##_write); - -#define MCFG_VIC20_EXPANSION_SLOT_NMI_CALLBACK(_write) \ - downcast(*device).set_nmi_wr_callback(DEVCB_##_write); - -#define MCFG_VIC20_EXPANSION_SLOT_RES_CALLBACK(_write) \ - downcast(*device).set_res_wr_callback(DEVCB_##_write); - - - //************************************************************************** // TYPE DEFINITIONS //************************************************************************** @@ -94,9 +72,11 @@ public: } vic20_expansion_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template devcb_base &set_irq_wr_callback(Object &&cb) { return m_write_irq.set_callback(std::forward(cb)); } - template devcb_base &set_nmi_wr_callback(Object &&cb) { return m_write_nmi.set_callback(std::forward(cb)); } - template devcb_base &set_res_wr_callback(Object &&cb) { return m_write_res.set_callback(std::forward(cb)); } + static void add_passthrough(machine_config &config, const char *_tag); + + auto irq_wr_callback() { return m_write_irq.bind(); } + auto nmi_wr_callback() { return m_write_nmi.bind(); } + auto res_wr_callback() { return m_write_res.bind(); } // computer interface uint8_t cd_r(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3); diff --git a/src/devices/bus/vic20/vic1010.cpp b/src/devices/bus/vic20/vic1010.cpp index daf191aef7b..3c00365a4bc 100644 --- a/src/devices/bus/vic20/vic1010.cpp +++ b/src/devices/bus/vic20/vic1010.cpp @@ -22,14 +22,15 @@ DEFINE_DEVICE_TYPE(VIC1010, vic1010_device, "vic1010", "VIC-1010 Expansion Modul // device_add_mconfig - add device configuration //------------------------------------------------- -MACHINE_CONFIG_START(vic1010_device::device_add_mconfig) - MCFG_VIC20_PASSTHRU_EXPANSION_SLOT_ADD("slot1") - MCFG_VIC20_PASSTHRU_EXPANSION_SLOT_ADD("slot2") - MCFG_VIC20_PASSTHRU_EXPANSION_SLOT_ADD("slot3") - MCFG_VIC20_PASSTHRU_EXPANSION_SLOT_ADD("slot4") - MCFG_VIC20_PASSTHRU_EXPANSION_SLOT_ADD("slot5") - MCFG_VIC20_PASSTHRU_EXPANSION_SLOT_ADD("slot6") -MACHINE_CONFIG_END +void vic1010_device::device_add_mconfig(machine_config &config) +{ + vic20_expansion_slot_device::add_passthrough(config, "slot1"); + vic20_expansion_slot_device::add_passthrough(config, "slot2"); + vic20_expansion_slot_device::add_passthrough(config, "slot3"); + vic20_expansion_slot_device::add_passthrough(config, "slot4"); + vic20_expansion_slot_device::add_passthrough(config, "slot5"); + vic20_expansion_slot_device::add_passthrough(config, "slot6"); +} //************************************************************************** diff --git a/src/devices/sound/mos6560.h b/src/devices/sound/mos6560.h index d4ee91e8ba2..6deca8bcbab 100644 --- a/src/devices/sound/mos6560.h +++ b/src/devices/sound/mos6560.h @@ -41,30 +41,6 @@ // DEVICE CONFIGURATION MACROS //*************************************************************************** -#define MCFG_MOS6560_ADD(_tag, _screen_tag, _clock, _videoram_map, _colorram_map) \ - MCFG_SCREEN_ADD(_screen_tag, RASTER) \ - MCFG_SCREEN_REFRESH_RATE(MOS6560_VRETRACERATE) \ - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) \ - MCFG_SCREEN_SIZE((MOS6560_XSIZE + 7) & ~7, MOS6560_YSIZE) \ - MCFG_SCREEN_VISIBLE_AREA(MOS6560_MAME_XPOS, MOS6560_MAME_XPOS + MOS6560_MAME_XSIZE - 1, MOS6560_MAME_YPOS, MOS6560_MAME_YPOS + MOS6560_MAME_YSIZE - 1) \ - MCFG_SCREEN_UPDATE_DEVICE(_tag, mos6560_device, screen_update) \ - MCFG_DEVICE_ADD(_tag, MOS6560, _clock) \ - MCFG_VIDEO_SET_SCREEN(_screen_tag) \ - MCFG_DEVICE_ADDRESS_MAP(0, _videoram_map) \ - MCFG_DEVICE_ADDRESS_MAP(1, _colorram_map) - -#define MCFG_MOS6561_ADD(_tag, _screen_tag, _clock, _videoram_map, _colorram_map) \ - MCFG_SCREEN_ADD(_screen_tag, RASTER) \ - MCFG_SCREEN_REFRESH_RATE(MOS6561_VRETRACERATE) \ - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) \ - MCFG_SCREEN_SIZE((MOS6561_XSIZE + 7) & ~7, MOS6561_YSIZE) \ - MCFG_SCREEN_VISIBLE_AREA(MOS6561_MAME_XPOS, MOS6561_MAME_XPOS + MOS6561_MAME_XSIZE - 1, MOS6561_MAME_YPOS, MOS6561_MAME_YPOS + MOS6561_MAME_YSIZE - 1) \ - MCFG_SCREEN_UPDATE_DEVICE(_tag, mos6560_device, screen_update) \ - MCFG_DEVICE_ADD(_tag, MOS6561, _clock) \ - MCFG_VIDEO_SET_SCREEN(_screen_tag) \ - MCFG_DEVICE_ADDRESS_MAP(0, _videoram_map) \ - MCFG_DEVICE_ADDRESS_MAP(1, _colorram_map) - #define MCFG_MOS656X_ATTACK_UFO_ADD(_tag, _screen_tag, _clock, _videoram_map, _colorram_map) \ MCFG_SCREEN_ADD(_screen_tag, RASTER) \ MCFG_SCREEN_REFRESH_RATE(MOS6560_VRETRACERATE) \ @@ -78,14 +54,6 @@ MCFG_DEVICE_ADDRESS_MAP(1, _colorram_map) -#define MCFG_MOS6560_POTX_CALLBACK(_read) \ - downcast(*device).set_potx_rd_callback(DEVCB_##_read); - -#define MCFG_MOS6560_POTY_CALLBACK(_read) \ - downcast(*device).set_poty_rd_callback(DEVCB_##_read); - - - //************************************************************************** // MACROS / CONSTANTS //************************************************************************** @@ -139,6 +107,9 @@ public: template devcb_base &set_potx_rd_callback(Object &&cb) { return m_read_potx.set_callback(std::forward(cb)); } template devcb_base &set_poty_rd_callback(Object &&cb) { return m_read_poty.set_callback(std::forward(cb)); } + auto potx_rd_callback() { return m_read_potx.bind(); } + auto poty_rd_callback() { return m_read_poty.bind(); } + virtual space_config_vector memory_space_config() const override; DECLARE_READ8_MEMBER( read ); diff --git a/src/mame/drivers/attckufo.cpp b/src/mame/drivers/attckufo.cpp index 873c183f434..39741ed52a3 100644 --- a/src/mame/drivers/attckufo.cpp +++ b/src/mame/drivers/attckufo.cpp @@ -128,7 +128,18 @@ MACHINE_CONFIG_START(attckufo_state::attckufo) MCFG_PIA_READPB_HANDLER(IOPORT("INPUT")) SPEAKER(config, "mono").front_center(); - MCFG_MOS656X_ATTACK_UFO_ADD("mos6560", "screen", XTAL(14'318'181) / 14, vic_videoram_map, vic_colorram_map) + + MCFG_SCREEN_ADD("screen", RASTER) + MCFG_SCREEN_REFRESH_RATE(MOS6560_VRETRACERATE) + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) + MCFG_SCREEN_SIZE((MOS6560_XSIZE + 7) & ~7, MOS6560_YSIZE) + MCFG_SCREEN_VISIBLE_AREA(0, 23*8 - 1, 0, 22*8 - 1) + MCFG_SCREEN_UPDATE_DEVICE("mos6560", mos6560_device, screen_update) + + MCFG_DEVICE_ADD("mos6560", MOS656X_ATTACK_UFO, XTAL(14'318'181) / 14) + MCFG_VIDEO_SET_SCREEN("screen") + MCFG_DEVICE_ADDRESS_MAP(0, vic_videoram_map) + MCFG_DEVICE_ADDRESS_MAP(1, vic_colorram_map) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) MACHINE_CONFIG_END diff --git a/src/mame/drivers/vic20.cpp b/src/mame/drivers/vic20.cpp index d8fca07908d..6281bfec5f4 100644 --- a/src/mame/drivers/vic20.cpp +++ b/src/mame/drivers/vic20.cpp @@ -27,8 +27,7 @@ #define M6502_TAG "ue10" #define M6522_1_TAG "uab3" #define M6522_2_TAG "uab1" -#define M6560_TAG "ub7" -#define M6561_TAG "ub7" +#define VIC_TAG "ub7" #define IEC_TAG "iec" #define SCREEN_TAG "screen" #define CONTROL1_TAG "joy1" @@ -42,13 +41,14 @@ public: m_maincpu(*this, M6502_TAG), m_via1(*this, M6522_1_TAG), m_via2(*this, M6522_2_TAG), - m_vic(*this, M6560_TAG), + m_vic(*this, VIC_TAG), m_iec(*this, CBM_IEC_TAG), m_joy(*this, CONTROL1_TAG), m_exp(*this, VIC20_EXPANSION_SLOT_TAG), m_user(*this, PET_USER_PORT_TAG), m_cassette(*this, PET_DATASSETTE_PORT_TAG), m_ram(*this, RAM_TAG), + m_screen(*this, SCREEN_TAG), m_basic(*this, "basic"), m_kernal(*this, "kernal"), m_charom(*this, "charom"), @@ -60,7 +60,10 @@ public: void ntsc(machine_config &config); void pal(machine_config &config); - void vic20(machine_config &config); + +protected: + void vic20(machine_config &config, const char* softlist_filter); + void add_clocked_devices(machine_config &config, uint32_t clock); private: required_device m_maincpu; @@ -73,6 +76,7 @@ private: required_device m_user; required_device m_cassette; required_device m_ram; + required_device m_screen; required_region_ptr m_basic; required_region_ptr m_kernal; required_region_ptr m_charom; @@ -795,144 +799,120 @@ WRITE_LINE_MEMBER(vic20_state::write_user_cassette_switch) // MACHINE DRIVERS //************************************************************************** -//------------------------------------------------- -// MACHINE_CONFIG( vic20_common ) -//------------------------------------------------- - -MACHINE_CONFIG_START(vic20_state::vic20) - // devices - MCFG_PET_DATASSETTE_PORT_ADD(PET_DATASSETTE_PORT_TAG, cbm_datassette_devices, "c1530", WRITELINE(M6522_2_TAG, via6522_device, write_ca1)) - MCFG_CBM_IEC_ADD("c1541") - MCFG_CBM_IEC_BUS_SRQ_CALLBACK(WRITELINE(M6522_2_TAG, via6522_device, write_cb1)) - - MCFG_VCS_CONTROL_PORT_ADD(CONTROL1_TAG, vcs_control_port_devices, "joy") - MCFG_VCS_CONTROL_PORT_TRIGGER_CALLBACK(WRITELINE(*this, vic20_state, write_light_pen)) - - MCFG_DEVICE_ADD(PET_USER_PORT_TAG, PET_USER_PORT, vic20_user_port_cards, nullptr) - MCFG_PET_USER_PORT_3_HANDLER(WRITELINE(*this, vic20_state, exp_reset_w)) - MCFG_PET_USER_PORT_4_HANDLER(WRITELINE(*this, vic20_state, write_user_joy0)) - MCFG_PET_USER_PORT_5_HANDLER(WRITELINE(*this, vic20_state, write_user_joy1)) - MCFG_PET_USER_PORT_6_HANDLER(WRITELINE(*this, vic20_state, write_user_joy2)) - MCFG_PET_USER_PORT_7_HANDLER(WRITELINE(*this, vic20_state, write_user_light_pen)) - MCFG_PET_USER_PORT_8_HANDLER(WRITELINE(*this, vic20_state, write_user_cassette_switch)) - MCFG_PET_USER_PORT_B_HANDLER(WRITELINE(M6522_1_TAG, via6522_device, write_cb1)) - MCFG_PET_USER_PORT_C_HANDLER(WRITELINE(M6522_1_TAG, via6522_device, write_pb0)) - MCFG_PET_USER_PORT_D_HANDLER(WRITELINE(M6522_1_TAG, via6522_device, write_pb1)) - MCFG_PET_USER_PORT_E_HANDLER(WRITELINE(M6522_1_TAG, via6522_device, write_pb2)) - MCFG_PET_USER_PORT_F_HANDLER(WRITELINE(M6522_1_TAG, via6522_device, write_pb3)) - MCFG_PET_USER_PORT_H_HANDLER(WRITELINE(M6522_1_TAG, via6522_device, write_pb4)) - MCFG_PET_USER_PORT_J_HANDLER(WRITELINE(M6522_1_TAG, via6522_device, write_pb5)) - MCFG_PET_USER_PORT_K_HANDLER(WRITELINE(M6522_1_TAG, via6522_device, write_pb6)) - MCFG_PET_USER_PORT_L_HANDLER(WRITELINE(M6522_1_TAG, via6522_device, write_pb7)) - MCFG_PET_USER_PORT_M_HANDLER(WRITELINE(M6522_1_TAG, via6522_device, write_cb2)) - - MCFG_QUICKLOAD_ADD("quickload", vic20_state, cbm_vc20, "p00,prg", CBM_QUICKLOAD_DELAY_SECONDS) - - // software lists - MCFG_SOFTWARE_LIST_ADD("cart_list", "vic1001_cart") - MCFG_SOFTWARE_LIST_ADD("cass_list", "vic1001_cass") - MCFG_SOFTWARE_LIST_ADD("flop_list", "vic1001_flop") - - // internal ram - MCFG_RAM_ADD(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("5K") -MACHINE_CONFIG_END - +void vic20_state::vic20(machine_config &config, const char* softlist_filter) +{ + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); + m_screen->set_screen_update(VIC_TAG, FUNC(mos6560_device::screen_update)); + + m_vic->set_screen(SCREEN_TAG); + m_vic->set_addrmap(0, &vic20_state::vic_videoram_map); + m_vic->set_addrmap(1, &vic20_state::vic_colorram_map); + + m_vic->potx_rd_callback().set(m_joy, FUNC(vcs_control_port_device::pot_x_r)); + m_vic->poty_rd_callback().set(m_joy, FUNC(vcs_control_port_device::pot_y_r)); + m_vic->add_route(ALL_OUTPUTS, "mono", 0.25); + + PET_DATASSETTE_PORT(config, m_cassette, 0); + cbm_datassette_devices(*m_cassette); + m_cassette->set_default_option("c1530"); + m_cassette->read_handler().set(m_via2, FUNC(via6522_device::write_ca1)); + + cbm_iec_slot_device::add(config, m_iec, "c1541"); + m_iec->srq_callback().set(m_via2, FUNC(via6522_device::write_cb1)); + + VCS_CONTROL_PORT(config, m_joy, 0); + vcs_control_port_devices(*m_joy); + m_joy->set_default_option("joy"); + m_joy->trigger_wr_callback().set(FUNC(vic20_state::write_light_pen)); + + PET_USER_PORT(config, m_user, vic20_user_port_cards, nullptr); + m_user->p3_handler().set(FUNC(vic20_state::exp_reset_w)); + m_user->p4_handler().set(FUNC(vic20_state::write_user_joy0)); + m_user->p5_handler().set(FUNC(vic20_state::write_user_joy1)); + m_user->p6_handler().set(FUNC(vic20_state::write_user_joy2)); + m_user->p7_handler().set(FUNC(vic20_state::write_user_light_pen)); + m_user->p8_handler().set(FUNC(vic20_state::write_user_cassette_switch)); + m_user->pb_handler().set(m_via1, FUNC(via6522_device::write_cb1)); + m_user->pc_handler().set(m_via1, FUNC(via6522_device::write_pb0)); + m_user->pd_handler().set(m_via1, FUNC(via6522_device::write_pb1)); + m_user->pe_handler().set(m_via1, FUNC(via6522_device::write_pb2)); + m_user->pf_handler().set(m_via1, FUNC(via6522_device::write_pb3)); + m_user->ph_handler().set(m_via1, FUNC(via6522_device::write_pb4)); + m_user->pj_handler().set(m_via1, FUNC(via6522_device::write_pb5)); + m_user->pk_handler().set(m_via1, FUNC(via6522_device::write_pb6)); + m_user->pl_handler().set(m_via1, FUNC(via6522_device::write_pb7)); + m_user->pm_handler().set(m_via1, FUNC(via6522_device::write_cb2)); + + quickload_image_device &quickload(QUICKLOAD(config, "quickload", 0)); + quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(vic20_state, cbm_vc20), this), "p00,prg", CBM_QUICKLOAD_DELAY_SECONDS); + + SOFTWARE_LIST(config, "cart_list").set_type("vic1001_cart", SOFTWARE_LIST_ORIGINAL_SYSTEM).set_filter(softlist_filter); + SOFTWARE_LIST(config, "cass_list").set_type("vic1001_cass", SOFTWARE_LIST_ORIGINAL_SYSTEM).set_filter(softlist_filter); + SOFTWARE_LIST(config, "flop_list").set_type("vic1001_flop", SOFTWARE_LIST_ORIGINAL_SYSTEM).set_filter(softlist_filter); + + RAM(config, m_ram); + m_ram->set_default_size("5K"); +} -//------------------------------------------------- -// MACHINE_CONFIG( ntsc ) -//------------------------------------------------- -MACHINE_CONFIG_START(vic20_state::ntsc) - vic20(config); +void vic20_state::add_clocked_devices(machine_config &config, uint32_t clock) +{ // basic machine hardware - MCFG_DEVICE_ADD(M6502_TAG, M6502, MOS6560_CLOCK) - MCFG_DEVICE_PROGRAM_MAP(vic20_mem) - MCFG_M6502_DISABLE_CACHE() // address decoding is 100% dynamic, no RAM/ROM banks - - MCFG_DEVICE_ADD(M6522_1_TAG, VIA6522, MOS6560_CLOCK) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, vic20_state, via1_pa_r)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, vic20_state, via1_pa_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, vic20_state, via1_pb_w)) - MCFG_VIA6522_CB1_HANDLER(WRITELINE(PET_USER_PORT_TAG, pet_user_port_device, write_b)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(PET_DATASSETTE_PORT_TAG, pet_datassette_port_device, motor_w)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(PET_USER_PORT_TAG, pet_user_port_device, write_m)) - MCFG_VIA6522_IRQ_HANDLER(INPUTLINE(M6502_TAG, M6502_NMI_LINE)) - - MCFG_DEVICE_ADD(M6522_2_TAG, VIA6522, MOS6560_CLOCK) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, vic20_state, via2_pa_r)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, vic20_state, via2_pb_r)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, vic20_state, via2_pb_w)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(*this, vic20_state, via2_ca2_w)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, vic20_state, via2_cb2_w)) - MCFG_VIA6522_IRQ_HANDLER(INPUTLINE(M6502_TAG, M6502_IRQ_LINE)) + M6502(config, m_maincpu, clock); + m_maincpu->set_addrmap(AS_PROGRAM, &vic20_state::vic20_mem); + m_maincpu->disable_cache(); // address decoding is 100% dynamic, no RAM/ROM banks + + VIA6522(config, m_via1, clock); + m_via1->readpa_handler().set(FUNC(vic20_state::via1_pa_r)); + m_via1->writepa_handler().set(FUNC(vic20_state::via1_pa_w)); + m_via1->writepb_handler().set(FUNC(vic20_state::via1_pb_w)); + m_via1->cb1_handler().set(m_user, FUNC(pet_user_port_device::write_b)); + m_via1->ca2_handler().set(m_cassette, FUNC(pet_datassette_port_device::motor_w)); + m_via1->cb2_handler().set(m_user, FUNC(pet_user_port_device::write_m)); + m_via1->irq_handler().set_inputline(m_maincpu, M6502_NMI_LINE); + + VIA6522(config, m_via2, clock); + m_via2->readpa_handler().set(FUNC(vic20_state::via2_pa_r)); + m_via2->readpb_handler().set(FUNC(vic20_state::via2_pb_r)); + m_via2->writepb_handler().set(FUNC(vic20_state::via2_pb_w)); + m_via2->ca2_handler().set(FUNC(vic20_state::via2_ca2_w)); + m_via2->cb2_handler().set(FUNC(vic20_state::via2_cb2_w)); + m_via2->irq_handler().set_inputline(m_maincpu, M6502_IRQ_LINE); // video/sound hardware SPEAKER(config, "mono").front_center(); - MCFG_MOS6560_ADD(M6560_TAG, SCREEN_TAG, MOS6560_CLOCK, vic_videoram_map, vic_colorram_map) - MCFG_MOS6560_POTX_CALLBACK(READ8(CONTROL1_TAG, vcs_control_port_device, pot_x_r)) - MCFG_MOS6560_POTY_CALLBACK(READ8(CONTROL1_TAG, vcs_control_port_device, pot_y_r)) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) // devices - MCFG_DEVICE_ADD(VIC20_EXPANSION_SLOT_TAG, VIC20_EXPANSION_SLOT, MOS6560_CLOCK, vic20_expansion_cards, nullptr) - MCFG_VIC20_EXPANSION_SLOT_IRQ_CALLBACK(INPUTLINE(M6502_TAG, M6502_IRQ_LINE)) - MCFG_VIC20_EXPANSION_SLOT_NMI_CALLBACK(INPUTLINE(M6502_TAG, M6502_NMI_LINE)) - MCFG_VIC20_EXPANSION_SLOT_RES_CALLBACK(WRITELINE(*this, vic20_state, exp_reset_w)) + VIC20_EXPANSION_SLOT(config, m_exp, clock, vic20_expansion_cards, nullptr); + m_exp->irq_wr_callback().set_inputline(m_maincpu, M6502_IRQ_LINE); + m_exp->nmi_wr_callback().set_inputline(m_maincpu, M6502_NMI_LINE); + m_exp->res_wr_callback().set(FUNC(vic20_state::exp_reset_w)); +} - // software lists - MCFG_SOFTWARE_LIST_FILTER("cart_list", "NTSC") - MCFG_SOFTWARE_LIST_FILTER("cass_list", "NTSC") - MCFG_SOFTWARE_LIST_FILTER("flop_list", "NTSC") -MACHINE_CONFIG_END +void vic20_state::ntsc(machine_config &config) +{ + add_clocked_devices(config, MOS6560_CLOCK); + MOS6560(config, m_vic, MOS6560_CLOCK); + vic20(config, "NTSC"); -//------------------------------------------------- -// MACHINE_CONFIG( pal ) -//------------------------------------------------- + m_screen->set_refresh_hz(MOS6560_VRETRACERATE); + m_screen->set_size((MOS6560_XSIZE + 7) & ~7, MOS6560_YSIZE); + m_screen->set_visarea(MOS6560_MAME_XPOS, MOS6560_MAME_XPOS + MOS6560_MAME_XSIZE - 1, MOS6560_MAME_YPOS, MOS6560_MAME_YPOS + MOS6560_MAME_YSIZE - 1); +} -MACHINE_CONFIG_START(vic20_state::pal) - vic20(config); - // basic machine hardware - MCFG_DEVICE_ADD(M6502_TAG, M6502, MOS6561_CLOCK) - MCFG_DEVICE_PROGRAM_MAP(vic20_mem) - MCFG_M6502_DISABLE_CACHE() // address decoding is 100% dynamic, no RAM/ROM banks - - MCFG_DEVICE_ADD(M6522_1_TAG, VIA6522, MOS6561_CLOCK) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, vic20_state, via1_pa_r)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, vic20_state, via1_pa_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, vic20_state, via1_pb_w)) - MCFG_VIA6522_CB1_HANDLER(WRITELINE(PET_USER_PORT_TAG, pet_user_port_device, write_b)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(PET_DATASSETTE_PORT_TAG, pet_datassette_port_device, motor_w)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(PET_USER_PORT_TAG, pet_user_port_device, write_m)) - MCFG_VIA6522_IRQ_HANDLER(INPUTLINE(M6502_TAG, M6502_NMI_LINE)) - - MCFG_DEVICE_ADD(M6522_2_TAG, VIA6522, MOS6561_CLOCK) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, vic20_state, via2_pa_r)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, vic20_state, via2_pb_r)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, vic20_state, via2_pb_w)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(*this, vic20_state, via2_ca2_w)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, vic20_state, via2_cb2_w)) - MCFG_VIA6522_IRQ_HANDLER(INPUTLINE(M6502_TAG, M6502_IRQ_LINE)) - // video/sound hardware - SPEAKER(config, "mono").front_center(); - MCFG_MOS6561_ADD(M6560_TAG, SCREEN_TAG, MOS6561_CLOCK, vic_videoram_map, vic_colorram_map) - MCFG_MOS6560_POTX_CALLBACK(READ8(CONTROL1_TAG, vcs_control_port_device, pot_x_r)) - MCFG_MOS6560_POTY_CALLBACK(READ8(CONTROL1_TAG, vcs_control_port_device, pot_y_r)) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) +void vic20_state::pal(machine_config &config) +{ + add_clocked_devices(config, MOS6561_CLOCK); + MOS6561(config, m_vic, MOS6561_CLOCK); + vic20(config, "PAL"); - // devices - MCFG_DEVICE_ADD(VIC20_EXPANSION_SLOT_TAG, VIC20_EXPANSION_SLOT, MOS6561_CLOCK, vic20_expansion_cards, nullptr) - MCFG_VIC20_EXPANSION_SLOT_IRQ_CALLBACK(INPUTLINE(M6502_TAG, M6502_IRQ_LINE)) - MCFG_VIC20_EXPANSION_SLOT_NMI_CALLBACK(INPUTLINE(M6502_TAG, M6502_NMI_LINE)) - MCFG_VIC20_EXPANSION_SLOT_RES_CALLBACK(WRITELINE(*this, vic20_state, exp_reset_w)) - - // software lists - MCFG_SOFTWARE_LIST_FILTER("cart_list", "PAL") - MCFG_SOFTWARE_LIST_FILTER("cass_list", "PAL") - MCFG_SOFTWARE_LIST_FILTER("flop_list", "PAL") -MACHINE_CONFIG_END + m_screen->set_refresh_hz(MOS6561_VRETRACERATE); + m_screen->set_size((MOS6561_XSIZE + 7) & ~7, MOS6561_YSIZE); + m_screen->set_visarea(MOS6561_MAME_XPOS, MOS6561_MAME_XPOS + MOS6561_MAME_XSIZE - 1, MOS6561_MAME_YPOS, MOS6561_MAME_YPOS + MOS6561_MAME_YSIZE - 1); +} -- cgit v1.2.3