diff options
Diffstat (limited to 'src/mame/drivers/vixen.cpp')
-rw-r--r-- | src/mame/drivers/vixen.cpp | 149 |
1 files changed, 142 insertions, 7 deletions
diff --git a/src/mame/drivers/vixen.cpp b/src/mame/drivers/vixen.cpp index 8fc21d8176d..d2dbe5bb211 100644 --- a/src/mame/drivers/vixen.cpp +++ b/src/mame/drivers/vixen.cpp @@ -54,13 +54,145 @@ Notes: #include "emu.h" -#include "includes/vixen.h" +#include "bus/ieee488/ieee488.h" +#include "bus/rs232/rs232.h" +#include "cpu/z80/z80.h" +#include "imagedev/floppy.h" +#include "machine/i8155.h" +#include "machine/i8251.h" +#include "machine/ram.h" +#include "machine/timer.h" +#include "machine/wd_fdc.h" +#include "sound/discrete.h" + +#include "emupal.h" #include "screen.h" #include "softlist.h" #include "speaker.h" +namespace { + +#define Z8400A_TAG "5f" +#define FDC1797_TAG "5n" +#define P8155H_TAG "2n" +#define SCREEN_TAG "screen" + +class vixen_state : public driver_device +{ +public: + vixen_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, Z8400A_TAG) + , m_fdc(*this, FDC1797_TAG) + , m_io_i8155(*this, "c7") + , m_usart(*this, "c3") + , m_discrete(*this, "discrete") + , m_ieee488(*this, IEEE488_TAG) + , m_palette(*this, "palette") + , m_ram(*this, RAM_TAG) + , m_floppy0(*this, FDC1797_TAG":0") + , m_floppy1(*this, FDC1797_TAG":1") + , m_rs232(*this, "rs232") + , m_rom(*this, Z8400A_TAG) + , m_sync_rom(*this, "video") + , m_char_rom(*this, "chargen") + , m_video_ram(*this, "video_ram") + , m_key(*this, "KEY.%u", 0) + , m_cmd_d1(0) + , m_fdint(0) + , m_vsync(0) + , m_srq(1) + , m_atn(1) + , m_rxrdy(0) + , m_txrdy(0) + { } + + void vixen(machine_config &config); + + void init_vixen(); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + +private: + uint8_t status_r(); + void cmd_w(uint8_t data); + uint8_t ieee488_r(); + uint8_t port3_r(); + uint8_t i8155_pa_r(); + void i8155_pb_w(uint8_t data); + void i8155_pc_w(uint8_t data); + void io_i8155_pb_w(uint8_t data); + void io_i8155_pc_w(uint8_t data); + DECLARE_WRITE_LINE_MEMBER( io_i8155_to_w ); + DECLARE_WRITE_LINE_MEMBER( srq_w ); + DECLARE_WRITE_LINE_MEMBER( atn_w ); + DECLARE_WRITE_LINE_MEMBER( rxrdy_w ); + DECLARE_WRITE_LINE_MEMBER( txrdy_w ); + DECLARE_WRITE_LINE_MEMBER( fdc_intrq_w ); + TIMER_DEVICE_CALLBACK_MEMBER(vsync_tick); + IRQ_CALLBACK_MEMBER(vixen_int_ack); + uint8_t opram_r(offs_t offset); + uint8_t oprom_r(offs_t offset); + uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + + void bios_mem(address_map &map); + void vixen_io(address_map &map); + void vixen_mem(address_map &map); + + required_device<cpu_device> m_maincpu; + required_device<fd1797_device> m_fdc; + required_device<i8155_device> m_io_i8155; + required_device<i8251_device> m_usart; + required_device<discrete_sound_device> m_discrete; + required_device<ieee488_device> m_ieee488; + required_device<palette_device> m_palette; + required_device<ram_device> m_ram; + required_device<floppy_connector> m_floppy0; + required_device<floppy_connector> m_floppy1; + required_device<rs232_port_device> m_rs232; + required_region_ptr<uint8_t> m_rom; + required_region_ptr<uint8_t> m_sync_rom; + required_region_ptr<uint8_t> m_char_rom; + required_shared_ptr<uint8_t> m_video_ram; + required_ioport_array<8> m_key; + + address_space *m_program; + + void update_interrupt(); + + // keyboard state + uint8_t m_col; + + // interrupt state + int m_cmd_d0; + int m_cmd_d1; + + bool m_fdint; + int m_vsync; + + int m_srq; + int m_atn; + int m_enb_srq_int; + int m_enb_atn_int; + + int m_rxrdy; + int m_txrdy; + int m_int_clk; + int m_enb_xmt_int; + int m_enb_rcv_int; + int m_enb_ring_int; + + // video state + bool m_alt; + bool m_256; +}; + + + //************************************************************************** // INTERRUPTS //************************************************************************** @@ -708,7 +840,7 @@ void vixen_state::vixen(machine_config &config) // sound hardware SPEAKER(config, "mono").front_center(); - DISCRETE(config, DISCRETE_TAG, vixen_discrete).add_route(ALL_OUTPUTS, "mono", 0.20); + DISCRETE(config, m_discrete, vixen_discrete).add_route(ALL_OUTPUTS, "mono", 0.20); // devices i8155_device &i8155(I8155(config, P8155H_TAG, 23.9616_MHz_XTAL / 6)); @@ -716,11 +848,11 @@ void vixen_state::vixen(machine_config &config) i8155.out_pb_callback().set(FUNC(vixen_state::i8155_pb_w)); i8155.out_pc_callback().set(FUNC(vixen_state::i8155_pc_w)); - i8155_device &i8155_io(I8155(config, P8155H_IO_TAG, 23.9616_MHz_XTAL / 6)); - i8155_io.out_pa_callback().set(m_ieee488, FUNC(ieee488_device::host_dio_w)); - i8155_io.out_pb_callback().set(FUNC(vixen_state::io_i8155_pb_w)); - i8155_io.out_pc_callback().set(FUNC(vixen_state::io_i8155_pc_w)); - i8155_io.out_to_callback().set(FUNC(vixen_state::io_i8155_to_w)); + I8155(config, m_io_i8155, 23.9616_MHz_XTAL / 6); + m_io_i8155->out_pa_callback().set(m_ieee488, FUNC(ieee488_device::host_dio_w)); + m_io_i8155->out_pb_callback().set(FUNC(vixen_state::io_i8155_pb_w)); + m_io_i8155->out_pc_callback().set(FUNC(vixen_state::io_i8155_pc_w)); + m_io_i8155->out_to_callback().set(FUNC(vixen_state::io_i8155_to_w)); I8251(config, m_usart, 0); m_usart->txd_handler().set(m_rs232, FUNC(rs232_port_device::write_txd)); @@ -777,6 +909,9 @@ void vixen_state::init_vixen() } +} // anonymous namespace + + //************************************************************************** // SYSTEM DRIVERS |