summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/vixen.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/vixen.cpp')
-rw-r--r--src/mame/drivers/vixen.cpp149
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