diff options
Diffstat (limited to 'src/mame/drivers/kdt6.cpp')
-rw-r--r-- | src/mame/drivers/kdt6.cpp | 760 |
1 files changed, 0 insertions, 760 deletions
diff --git a/src/mame/drivers/kdt6.cpp b/src/mame/drivers/kdt6.cpp deleted file mode 100644 index 6b63f7fc764..00000000000 --- a/src/mame/drivers/kdt6.cpp +++ /dev/null @@ -1,760 +0,0 @@ -// license: GPL-2.0+ -// copyright-holders: Dirk Best -/*************************************************************************** - - Kontron KDT6 - - This is the base board for various machines, it needs to be combined - with an I/O board and a bus board. This gives us - - KDT6 + 9xx/IOC + 9xx/BUS: PSI908/PSI9C - - KDT6 + 98/IOC + 98/BUS: PSI98 - -***************************************************************************/ - -#include "emu.h" -#include "cpu/z80/z80.h" -#include "imagedev/floppy.h" -#include "machine/timer.h" -#include "machine/z80ctc.h" -#include "machine/z80dma.h" -#include "machine/z80pio.h" -#include "machine/z80sio.h" -#include "machine/upd765.h" -#include "machine/upd1990a.h" -#include "machine/clock.h" -#include "video/mc6845.h" -#include "sound/beep.h" -#include "sound/spkrdev.h" -#include "bus/centronics/ctronics.h" -#include "bus/psi_kbd/psi_kbd.h" -#include "bus/rs232/rs232.h" -#include "emupal.h" -#include "screen.h" -#include "speaker.h" -#include "softlist.h" -#include "kdt6.lh" - - -//************************************************************************** -// TYPE DEFINITIONS -//************************************************************************** - -class kdt6_state : public driver_device -{ -public: - kdt6_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_cpu(*this, "maincpu"), - m_dma(*this, "dma"), - m_sio(*this, "sio"), - m_crtc(*this, "crtc"), - m_page_r(*this, "page%x_r", 0), m_page_w(*this, "page%x_w", 0), - m_boot(*this, "boot"), - m_palette(*this, "palette"), - m_gfx(*this, "gfx"), - m_rtc(*this, "rtc"), - m_fdc(*this, "fdc"), - m_floppy0(*this, "fdc:0"), - m_floppy1(*this, "fdc:1"), - m_beeper(*this, "beeper"), - m_beep_timer(*this, "beep_timer"), - m_centronics(*this, "centronics"), - m_dip_s2(*this, "S2"), - m_keyboard(*this, "kbd"), - m_rs232b(*this, "rs232b"), - m_sasi_dma(false), - m_dma_map(0), - m_status0(0), m_status1(0), m_status2(0), - m_video_address(0) - { } - - void psi98(machine_config &config); - -private: - DECLARE_WRITE_LINE_MEMBER(busreq_w); - DECLARE_READ8_MEMBER(memory_r); - DECLARE_WRITE8_MEMBER(memory_w); - DECLARE_READ8_MEMBER(io_r); - DECLARE_WRITE8_MEMBER(io_w); - DECLARE_READ8_MEMBER(page0_r); - DECLARE_READ8_MEMBER(page1_r); - DECLARE_READ8_MEMBER(mapper_r); - DECLARE_WRITE8_MEMBER(mapper_w); - DECLARE_READ8_MEMBER(sasi_ctrl_r); - DECLARE_WRITE8_MEMBER(sasi_ctrl_w); - DECLARE_WRITE8_MEMBER(dma_map_w); - DECLARE_WRITE8_MEMBER(status0_w); - DECLARE_READ8_MEMBER(status1_r); - DECLARE_WRITE8_MEMBER(status1_w); - DECLARE_WRITE8_MEMBER(status2_w); - - DECLARE_READ8_MEMBER(video_data_r); - DECLARE_WRITE8_MEMBER(video_data_w); - DECLARE_WRITE8_MEMBER(video_data_inc_w); - DECLARE_WRITE8_MEMBER(video_data_dec_w); - DECLARE_WRITE8_MEMBER(video_address_latch_high_w); - DECLARE_WRITE8_MEMBER(video_address_latch_low_w); - - TIMER_DEVICE_CALLBACK_MEMBER(beeper_off); - - DECLARE_WRITE8_MEMBER(fdc_tc_w); - DECLARE_WRITE_LINE_MEMBER(fdc_drq_w); - void drive0_led_cb(floppy_image_device *floppy, int state); - void drive1_led_cb(floppy_image_device *floppy, int state); - - MC6845_UPDATE_ROW(crtc_update_row); - uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); - - DECLARE_WRITE8_MEMBER(pio_porta_w); - DECLARE_WRITE_LINE_MEMBER(keyboard_rx_w); - DECLARE_WRITE_LINE_MEMBER(rs232b_rx_w); - DECLARE_WRITE_LINE_MEMBER(siob_tx_w); - - void psi98_io(address_map &map); - void psi98_mem(address_map &map); - - virtual void machine_start() override; - virtual void machine_reset() override; - - required_device<z80_device> m_cpu; - required_device<z80dma_device> m_dma; - required_device<z80sio_device> m_sio; - required_device<mc6845_device> m_crtc; - required_memory_bank_array<16> m_page_r, m_page_w; - required_memory_region m_boot; - required_device<palette_device> m_palette; - required_region_ptr<u8> m_gfx; - required_device<upd1990a_device> m_rtc; - required_device<upd765a_device> m_fdc; - required_device<floppy_connector> m_floppy0; - required_device<floppy_connector> m_floppy1; - required_device<beep_device> m_beeper; - required_device<timer_device> m_beep_timer; - required_device<centronics_device> m_centronics; - required_ioport m_dip_s2; - required_device<psi_keyboard_bus_device> m_keyboard; - required_device<rs232_port_device> m_rs232b; - - std::unique_ptr<uint8_t[]> m_ram; - std::unique_ptr<uint16_t[]> m_vram; // 10-bit - std::unique_ptr<uint8_t[]> m_dummy_r, m_dummy_w; - - bool m_sasi_dma; - uint8_t m_dma_map; - uint8_t m_status0; - uint8_t m_status1; - uint8_t m_status2; - uint16_t m_mapper[16]; // 12-bit - uint16_t m_video_address; -}; - - -//************************************************************************** -// ADDRESS MAPS -//************************************************************************** - -void kdt6_state::psi98_mem(address_map &map) -{ - map(0x0000, 0x0fff).bankr("page0_r").bankw("page0_w"); - map(0x1000, 0x1fff).bankr("page1_r").bankw("page1_w"); - map(0x2000, 0x2fff).bankr("page2_r").bankw("page2_w"); - map(0x3000, 0x3fff).bankr("page3_r").bankw("page3_w"); - map(0x4000, 0x4fff).bankr("page4_r").bankw("page4_w"); - map(0x5000, 0x5fff).bankr("page5_r").bankw("page5_w"); - map(0x6000, 0x6fff).bankr("page6_r").bankw("page6_w"); - map(0x7000, 0x7fff).bankr("page7_r").bankw("page7_w"); - map(0x8000, 0x8fff).bankr("page8_r").bankw("page8_w"); - map(0x9000, 0x9fff).bankr("page9_r").bankw("page9_w"); - map(0xa000, 0xafff).bankr("pagea_r").bankw("pagea_w"); - map(0xb000, 0xbfff).bankr("pageb_r").bankw("pageb_w"); - map(0xc000, 0xcfff).bankr("pagec_r").bankw("pagec_w"); - map(0xd000, 0xdfff).bankr("paged_r").bankw("paged_w"); - map(0xe000, 0xefff).bankr("pagee_r").bankw("pagee_w"); - map(0xf000, 0xffff).bankr("pagef_r").bankw("pagef_w"); -} - -void kdt6_state::psi98_io(address_map &map) -{ - map.global_mask(0xff); - map(0x00, 0x00).rw(m_dma, FUNC(z80dma_device::bus_r), FUNC(z80dma_device::bus_w)); - map(0x04, 0x07).rw(m_sio, FUNC(z80sio_device::cd_ba_r), FUNC(z80sio_device::cd_ba_w)); - map(0x08, 0x0b).rw("ctc1", FUNC(z80ctc_device::read), FUNC(z80ctc_device::write)); - map(0x0c, 0x0f).rw("pio", FUNC(z80pio_device::read), FUNC(z80pio_device::write)); - map(0x10, 0x13).rw("ctc2", FUNC(z80ctc_device::read), FUNC(z80ctc_device::write)); - map(0x14, 0x14).r(m_fdc, FUNC(upd765a_device::msr_r)); - map(0x15, 0x15).rw(m_fdc, FUNC(upd765a_device::fifo_r), FUNC(upd765a_device::fifo_w)); - map(0x18, 0x18).w(m_crtc, FUNC(mc6845_device::address_w)); - map(0x19, 0x19).rw(m_crtc, FUNC(mc6845_device::register_r), FUNC(mc6845_device::register_w)); - map(0x1c, 0x1c).w(FUNC(kdt6_state::status0_w)); - map(0x1d, 0x1d).r(m_keyboard, FUNC(psi_keyboard_bus_device::key_data_r)); - map(0x1e, 0x1e).rw(m_fdc, FUNC(upd765a_device::dma_r), FUNC(upd765a_device::dma_w)); - map(0x1f, 0x1f).w(FUNC(kdt6_state::fdc_tc_w)); - map(0x20, 0x2f).rw(FUNC(kdt6_state::mapper_r), FUNC(kdt6_state::mapper_w)); - map(0x30, 0x30).rw(FUNC(kdt6_state::video_data_r), FUNC(kdt6_state::video_data_w)); - map(0x31, 0x31).w(FUNC(kdt6_state::video_data_inc_w)); - map(0x36, 0x36).w(FUNC(kdt6_state::video_data_dec_w)); - map(0x37, 0x37).w(FUNC(kdt6_state::video_data_inc_w)); - map(0x38, 0x38).w(FUNC(kdt6_state::status1_w)); - map(0x39, 0x39).r(FUNC(kdt6_state::status1_r)); - map(0x3a, 0x3a).w(FUNC(kdt6_state::status2_w)); - map(0x3b, 0x3b).rw(FUNC(kdt6_state::sasi_ctrl_r), FUNC(kdt6_state::sasi_ctrl_w)); - map(0x3c, 0x3c).w(FUNC(kdt6_state::dma_map_w)); -#if 0 - map(0x3d, 0x3d) WATCHDOG - map(0x3e, 0x3e) WATCHDOG TRIGGER - map(0x3f, 0x3f) SASI DATA -#endif - map(0x40, 0x40).w(FUNC(kdt6_state::video_address_latch_high_w)); - map(0x41, 0x41).w(FUNC(kdt6_state::video_address_latch_low_w)); -} - - -//************************************************************************** -// INPUTS -//************************************************************************** - -INPUT_PORTS_START( psi98 ) - PORT_START("S2") - PORT_DIPNAME(0x01, 0x01, "SIO B") PORT_DIPLOCATION("S2:1") - PORT_DIPSETTING(0x00, "RS232") - PORT_DIPSETTING(0x01, "Keyboard") -INPUT_PORTS_END - - -//************************************************************************** -// FLOPPY -//************************************************************************** - -static void kdt6_floppies(device_slot_interface &device) -{ - device.option_add("fd55f", TEAC_FD_55F); -} - -WRITE8_MEMBER( kdt6_state::fdc_tc_w ) -{ - m_fdc->tc_w(1); - m_fdc->tc_w(0); -} - -WRITE_LINE_MEMBER( kdt6_state::fdc_drq_w ) -{ - if (!m_sasi_dma && BIT(m_status0, 4) == 0) - m_dma->rdy_w(state); -} - -void kdt6_state::drive0_led_cb(floppy_image_device *floppy, int state) -{ - machine().output().set_value("drive0_led", state); -} - -void kdt6_state::drive1_led_cb(floppy_image_device *floppy, int state) -{ - machine().output().set_value("drive1_led", state); -} - - -//************************************************************************** -// VIDEO -//************************************************************************** - -WRITE8_MEMBER( kdt6_state::video_address_latch_high_w ) -{ - m_video_address &= 0x00ff; - m_video_address |= (data << 8); -} - -WRITE8_MEMBER( kdt6_state::video_address_latch_low_w ) -{ - m_video_address &= 0xff00; - m_video_address |= (data << 0); -} - -READ8_MEMBER( kdt6_state::video_data_r ) -{ - return m_vram[m_video_address]; -} - -WRITE8_MEMBER( kdt6_state::video_data_w ) -{ - m_vram[m_video_address] = ((m_status1 & 0x0c) << 6) | data; -} - -WRITE8_MEMBER( kdt6_state::video_data_inc_w ) -{ - m_vram[m_video_address++] = ((m_status1 & 0x0c) << 6) | data; -} - -WRITE8_MEMBER( kdt6_state::video_data_dec_w ) -{ - m_vram[m_video_address--] = ((m_status1 & 0x0c) << 6) | data; -} - -uint32_t kdt6_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) -{ - m_crtc->screen_update(screen, bitmap, cliprect); - return 0; -} - -MC6845_UPDATE_ROW( kdt6_state::crtc_update_row ) -{ - const pen_t *pen = m_palette->pens(); - - for (int i = 0; i < x_count; i++) - { - if (BIT(m_status1, 6)) - { - // text mode - uint16_t code = m_vram[((m_status1 & 0x03) << 14) | (ma + i)]; - uint8_t data = m_gfx[((code & 0xff) << 4) | ra]; - - int inverse = BIT(code, 8) | BIT(m_status1, 5) | ((i == cursor_x) ? 1 : 0); - int blink = BIT(code, 9) & m_crtc->cursor_r(); - - // draw 8 pixels of the character - for (int x = 0; x < 8; x++) - { - int color = BIT(data, 7 - x); - bitmap.pix32(y, x + i*8) = pen[blink ? 0 : (color ^ inverse)]; - } - } - else - { - // gfx mode - uint8_t data = m_vram[(ma << 4) | (ra << 6) | i]; - - // draw 8 pixels of the cell - for (int x = 0; x < 8; x++) - bitmap.pix32(y, x + i*8) = pen[BIT(data, 7 - x)]; - } - } -} - - -//************************************************************************** -// SOUND -//************************************************************************** - -TIMER_DEVICE_CALLBACK_MEMBER( kdt6_state::beeper_off ) -{ - m_beeper->set_state(0); -} - - -//************************************************************************** -// EXTERNAL I/O -//************************************************************************** - -WRITE8_MEMBER( kdt6_state::pio_porta_w ) -{ - m_centronics->write_strobe(BIT(data, 0)); - m_centronics->write_init(BIT(data, 1)); -} - -WRITE_LINE_MEMBER( kdt6_state::keyboard_rx_w ) -{ - if (machine().phase() >= machine_phase::RESET) - { - if ((m_dip_s2->read() & 0x01) == 0x01) - m_sio->rxb_w(state); - } -} - -WRITE_LINE_MEMBER( kdt6_state::rs232b_rx_w ) -{ - if (machine().phase() >= machine_phase::RESET) - { - if ((m_dip_s2->read() & 0x01) == 0x00) - m_sio->rxb_w(state); - } -} - -WRITE_LINE_MEMBER( kdt6_state::siob_tx_w ) -{ - if (machine().phase() >= machine_phase::RESET) - { - if ((m_dip_s2->read() & 0x01) == 0x01) - m_keyboard->tx_w(state); - else - m_rs232b->write_txd(state); - } -} - - -//************************************************************************** -// MACHINE -//************************************************************************** - -WRITE_LINE_MEMBER( kdt6_state::busreq_w ) -{ - m_cpu->set_input_line(Z80_INPUT_LINE_BUSRQ, state); - m_dma->bai_w(state); -} - -READ8_MEMBER( kdt6_state::memory_r ) -{ - return m_ram[m_dma_map << 16 | offset]; -} - -WRITE8_MEMBER( kdt6_state::memory_w ) -{ - m_ram[m_dma_map << 16 | offset] = data; -} - -READ8_MEMBER( kdt6_state::io_r ) -{ - return m_cpu->space(AS_IO).read_byte(offset); -} - -WRITE8_MEMBER( kdt6_state::io_w ) -{ - m_cpu->space(AS_IO).write_byte(offset, data); -} - -READ8_MEMBER( kdt6_state::page0_r ) -{ - if (BIT(m_status0, 5) == 0) - return m_boot->as_u8(offset); - - return reinterpret_cast<uint8_t *>(m_page_r[0]->base())[offset]; -} - -READ8_MEMBER( kdt6_state::page1_r ) -{ - if (BIT(m_status0, 5) == 0) - return m_boot->as_u8(0x1000 + offset); - - return reinterpret_cast<uint8_t *>(m_page_r[1]->base())[offset]; -} - -READ8_MEMBER( kdt6_state::sasi_ctrl_r ) -{ - uint8_t data = 0; - - // 7------- sasi select - // -6------ sasi reset - // --5----- sasi input/output - // ---4---- sasi control/data - // ----3--- sasi message - // -----2-- sasi request - // ------1- sasi busy - // -------0 data output upd1990 - - data |= m_rtc->data_out_r() << 0; - data |= 0xfe; - - return data; -} - -WRITE8_MEMBER( kdt6_state::sasi_ctrl_w ) -{ - logerror("sasi_ctrl_w: %02x\n", data); - m_sasi_dma = bool(BIT(data, 2) == 0); -} - -WRITE8_MEMBER( kdt6_state::dma_map_w ) -{ - m_dma_map = data; -} - -READ8_MEMBER( kdt6_state::mapper_r ) -{ - return m_mapper[offset]; -} - -WRITE8_MEMBER( kdt6_state::mapper_w ) -{ - m_mapper[offset] = ((m_status2 & 0x0f) << 8) | data; - - if (BIT(m_status1, 7) == 0) - { - offs_t addr = bitswap(m_mapper[offset], 8, 9, 10, 11, 7, 6, 5, 4, 0, 1, 2, 3) << 12; - - m_page_r[offset]->set_base(addr < 0x40000 ? &m_ram[addr] : &m_dummy_r[0]); - m_page_w[offset]->set_base(addr < 0x40000 ? &m_ram[addr] : &m_dummy_w[0]); - - if (0) - logerror("map_page: %x -> %06x\n", offset, addr); - } -} - -WRITE8_MEMBER( kdt6_state::status0_w ) -{ - logerror("status0_w: %02x\n", data); - - // 7------- floppy motor - // -6------ floppy drive type - // --5----- prom off - // ---4---- dma trigger (floppy/sio) - // ----3--- character generator a12 - // -----2-- sound - // ------1- system frequency (0 = half) - // -------0 watchdog enable - - m_cpu->set_unscaled_clock((XTAL(16'000'000) / 4) * (BIT(data, 1) ? 1 : 0.5)); - - if ((BIT(m_status0, 2) ^ BIT(data, 2)) && BIT(data, 2)) - { - m_beeper->set_state(1); - m_beep_timer->adjust(attotime::from_msec(250)); // timing unknown - } - - if (m_floppy0->get_device()) - m_floppy0->get_device()->mon_w(BIT(data, 7) ? 0 : 1); - if (m_floppy1->get_device()) - m_floppy1->get_device()->mon_w(BIT(data, 7) ? 0 : 1); - - m_status0 = data; -} - -READ8_MEMBER( kdt6_state::status1_r ) -{ - // 7------- disable memory mapper (1 = disable) - // -6------ display mode (1 = text, 0 = gfx) - // --5----- video invert - // ---4---- select 3 video memory bank - // ----3--- video bit 9 - // -----2-- video bit 8 - // ------1- video scroll address bit 15 - // -------0 video scroll address bit 14 - - return m_status1; -} - -WRITE8_MEMBER( kdt6_state::status1_w ) -{ - logerror("status1_w: %02x\n", data); - - // memory mapper disabled? - if (BIT(data, 7)) - { - for (unsigned i = 0; i < 16; i++) - { - m_page_r[i]->set_base(&m_ram[i * 0x1000]); - m_page_w[i]->set_base(&m_ram[i * 0x1000]); - } - } - - // note that enabling the memory mapper doesn't mean that the pages are automatically mapped in - // it still needs a write to the mapper register to activate - - m_status1 = data; -} - -WRITE8_MEMBER( kdt6_state::status2_w ) -{ - if (0) - logerror("status2_w: %02x\n", data); - - // 7------- rtc chip select - // -6------ rtc output enable - // --5----- rtc strobe - // ---4---- rtc clock - // ----321- rtc control 2-0 - // -------0 rtc data - // ----3210 memory mapper bit 0-3 - - m_rtc->cs_w(BIT(data, 7)); - m_rtc->oe_w(BIT(data, 6)); - m_rtc->stb_w(BIT(data, 5)); - m_rtc->clk_w(BIT(data, 4)); - m_rtc->c2_w(BIT(data, 3)); - m_rtc->c1_w(BIT(data, 2)); - m_rtc->c0_w(BIT(data, 1)); - m_rtc->data_in_w(BIT(data, 0)); - - m_status2 = data & 0x0f; -} - -void kdt6_state::machine_start() -{ - // 256 kb ram, 64 kb vram (and two dummy regions for invalid pages) - m_ram = std::make_unique<uint8_t[]>(0x40000); - m_vram = std::make_unique<uint16_t[]>(0x10000); - m_dummy_r = std::make_unique<uint8_t[]>(0x1000); - m_dummy_w = std::make_unique<uint8_t[]>(0x1000); - - // override the region 0x0000 to 0x1fff here to enable prom reading - m_cpu->space(AS_PROGRAM).install_read_handler(0x0000, 0x0fff, read8_delegate(*this, FUNC(kdt6_state::page0_r))); - m_cpu->space(AS_PROGRAM).install_read_handler(0x1000, 0x1fff, read8_delegate(*this, FUNC(kdt6_state::page1_r))); - - m_fdc->set_rate(250000); - - if (m_floppy0->get_device()) - m_floppy0->get_device()->setup_led_cb(floppy_image_device::led_cb(&kdt6_state::drive0_led_cb, this)); - if (m_floppy1->get_device()) - m_floppy1->get_device()->setup_led_cb(floppy_image_device::led_cb(&kdt6_state::drive1_led_cb, this)); - - // register for save states - save_pointer(NAME(m_ram), 0x40000); - save_pointer(NAME(m_vram), 0x10000); - save_item(NAME(m_sasi_dma)); - save_item(NAME(m_dma_map)); - save_item(NAME(m_status0)); - save_item(NAME(m_status1)); - save_item(NAME(m_status2)); - save_pointer(NAME(m_mapper), 16); - save_item(NAME(m_video_address)); -} - -void kdt6_state::machine_reset() -{ - // status0 is forced to 0 on reset - status0_w(m_cpu->space(AS_IO), 0, 0); -} - - -//************************************************************************** -// MACHINE DEFINITIONS -//************************************************************************** - -static const z80_daisy_config daisy_chain_intf[] = -{ - { "dma" }, - { "ctc1" }, - { "sio" }, - { "ctc2" }, - { "pio" }, - { nullptr } -}; - -void kdt6_state::psi98(machine_config &config) -{ - Z80(config, m_cpu, XTAL(16'000'000) / 4); - m_cpu->set_addrmap(AS_PROGRAM, &kdt6_state::psi98_mem); - m_cpu->set_addrmap(AS_IO, &kdt6_state::psi98_io); - m_cpu->set_daisy_config(daisy_chain_intf); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); - screen.set_color(rgb_t::green()); - screen.set_raw(XTAL(13'516'800), 824, 48, 688, 274, 0, 250); - screen.set_screen_update(FUNC(kdt6_state::screen_update)); - - PALETTE(config, m_palette, palette_device::MONOCHROME); - config.set_default_layout(layout_kdt6); - - MC6845(config, m_crtc, XTAL(13'516'800) / 8); - m_crtc->set_screen("screen"); - m_crtc->set_show_border_area(false); - m_crtc->set_char_width(8); - m_crtc->set_update_row_callback(FUNC(kdt6_state::crtc_update_row)); - m_crtc->out_vsync_callback().set("ctc2", FUNC(z80ctc_device::trg2)); - - // sound hardware - SPEAKER(config, "mono").front_center(); - BEEP(config, m_beeper, 1000); // frequency unknown - m_beeper->add_route(ALL_OUTPUTS, "mono", 0.50); - SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 0.50); - - TIMER(config, m_beep_timer).configure_generic(FUNC(kdt6_state::beeper_off)); - - Z80DMA(config, m_dma, 16_MHz_XTAL / 4); - m_dma->out_busreq_callback().set(FUNC(kdt6_state::busreq_w)); - m_dma->out_int_callback().set_inputline(m_cpu, INPUT_LINE_IRQ0); - m_dma->in_mreq_callback().set(FUNC(kdt6_state::memory_r)); - m_dma->out_mreq_callback().set(FUNC(kdt6_state::memory_w)); - m_dma->in_iorq_callback().set(FUNC(kdt6_state::io_r)); - m_dma->out_iorq_callback().set(FUNC(kdt6_state::io_w)); - - // jumper J3 allows selection of 16MHz / 8 instead - clock_device &uart_clk(CLOCK(config, "uart_clk", XTAL(9'830'400) / 8)); - uart_clk.signal_handler().set("ctc1", FUNC(z80ctc_device::trg1)); - uart_clk.signal_handler().append("ctc1", FUNC(z80ctc_device::trg2)); - - z80ctc_device &ctc1(Z80CTC(config, "ctc1", 16_MHz_XTAL / 4)); - ctc1.intr_callback().set_inputline(m_cpu, INPUT_LINE_IRQ0); - ctc1.zc_callback<1>().set(m_sio, FUNC(z80sio_device::rxtxcb_w)); - ctc1.zc_callback<2>().set(m_sio, FUNC(z80sio_device::rxca_w)); - ctc1.zc_callback<2>().append(m_sio, FUNC(z80sio_device::txca_w)); - - z80ctc_device &ctc2(Z80CTC(config, "ctc2", 16_MHz_XTAL / 4)); - ctc2.intr_callback().set_inputline(m_cpu, INPUT_LINE_IRQ0); - ctc2.zc_callback<0>().set("speaker", FUNC(speaker_sound_device::level_w)); - ctc2.zc_callback<2>().set("ctc2", FUNC(z80ctc_device::trg3)); - - Z80SIO(config, m_sio, 16_MHz_XTAL / 4); - m_sio->out_int_callback().set_inputline(m_cpu, INPUT_LINE_IRQ0); - m_sio->out_txda_callback().set("rs232a", FUNC(rs232_port_device::write_txd)); - m_sio->out_dtra_callback().set("rs232a", FUNC(rs232_port_device::write_dtr)); - m_sio->out_rtsa_callback().set("rs232a", FUNC(rs232_port_device::write_rts)); - m_sio->out_txdb_callback().set(FUNC(kdt6_state::siob_tx_w)); - m_sio->out_dtrb_callback().set(m_rs232b, FUNC(rs232_port_device::write_dtr)); - m_sio->out_rtsb_callback().set(m_rs232b, FUNC(rs232_port_device::write_rts)); - - rs232_port_device &rs232a(RS232_PORT(config, "rs232a", default_rs232_devices, nullptr)); - rs232a.rxd_handler().set(m_sio, FUNC(z80sio_device::rxa_w)); - rs232a.dcd_handler().set(m_sio, FUNC(z80sio_device::dcda_w)); - rs232a.dsr_handler().set(m_sio, FUNC(z80sio_device::synca_w)); - rs232a.cts_handler().set(m_sio, FUNC(z80sio_device::ctsa_w)).invert(); - - RS232_PORT(config, m_rs232b, default_rs232_devices, nullptr); - m_rs232b->rxd_handler().set(FUNC(kdt6_state::rs232b_rx_w)); - m_rs232b->dcd_handler().set(m_sio, FUNC(z80sio_device::dcdb_w)); - m_rs232b->dsr_handler().set(m_sio, FUNC(z80sio_device::syncb_w)); - m_rs232b->cts_handler().set(m_sio, FUNC(z80sio_device::ctsb_w)).invert(); - - z80pio_device &pio(Z80PIO(config, "pio", 16_MHz_XTAL / 4)); - pio.out_int_callback().set_inputline(m_cpu, INPUT_LINE_IRQ0); - pio.out_pa_callback().set(FUNC(kdt6_state::pio_porta_w)); - pio.in_pb_callback().set("cent_data_in", FUNC(input_buffer_device::bus_r)); - pio.out_pb_callback().set("cent_data_out", FUNC(output_latch_device::bus_w)); - - CENTRONICS(config, m_centronics, centronics_devices, "printer"); - m_centronics->set_data_input_buffer("cent_data_in"); - m_centronics->fault_handler().set("pio", FUNC(z80pio_device::pa2_w)); - m_centronics->perror_handler().set("pio", FUNC(z80pio_device::pa3_w)); - m_centronics->busy_handler().set("pio", FUNC(z80pio_device::pa4_w)); - m_centronics->select_handler().set("pio", FUNC(z80pio_device::pa5_w)); - - INPUT_BUFFER(config, "cent_data_in"); - output_latch_device &latch(OUTPUT_LATCH(config, "cent_data_out")); - m_centronics->set_output_latch(latch); - - UPD1990A(config, m_rtc); - - UPD765A(config, m_fdc, 8'000'000, true, true); - m_fdc->intrq_wr_callback().set("ctc1", FUNC(z80ctc_device::trg0)); - m_fdc->drq_wr_callback().set(FUNC(kdt6_state::fdc_drq_w)); - FLOPPY_CONNECTOR(config, "fdc:0", kdt6_floppies, "fd55f", floppy_image_device::default_floppy_formats); - FLOPPY_CONNECTOR(config, "fdc:1", kdt6_floppies, "fd55f", floppy_image_device::default_floppy_formats); - - SOFTWARE_LIST(config, "floppy_list").set_original("psi98"); - - PSI_KEYBOARD_INTERFACE(config, m_keyboard, "hle"); - m_keyboard->rx().set(FUNC(kdt6_state::keyboard_rx_w)); - m_keyboard->key_strobe().set("ctc2", FUNC(z80ctc_device::trg1)); - - // 6 ECB slots -} - - -//************************************************************************** -// ROM DEFINITIONS -//************************************************************************** - -ROM_START( psi98 ) - ROM_REGION(0x2000, "boot", 0) - ROM_LOAD("td_62b60_1.prom1", 0x0000, 0x1000, CRC(dbc01eeb) SHA1(3ecab997623836599a5e0b2a05d0f743d93edf00)) // SUM16: 0a84 (file: 29ca) - ROM_LOAD("boot_v61_a.prom2", 0x1000, 0x1000, CRC(6dd9a5e3) SHA1(b812947009d83e9c6119e731ba7d40fe3597d42c)) // SUM16: d4ec (file: b1fb) - - ROM_REGION(0x1000, "gfx", 0) - ROM_LOAD("ch6_d-e.bin", 0x0000, 0x1000, CRC(e7bca335) SHA1(454ca3b8b8ac66464870e4bd5497050038d771c8)) // SUM16: 39b1 (file: 5f55) - - // PALs - // 1-FF5B 12L6 memory address decoder - // 2-0F61 12L8 i/o address decoder - // 3-C7BF 10H8 interrupt priority controller - // 4-EC5E 16L8 bus controller - // 5-1126 16H2 fdc write precompensation - // 6-1BA7 10L8 video memory access controller - // 7-C1ED 16L8 video memory timing controller - // 8-CD9F 12H6 fdc timing generator -ROM_END - - -//************************************************************************** -// SYSTEM DRIVERS -//************************************************************************** - -// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1984, psi98, 0, 0, psi98, psi98, kdt6_state, empty_init, "Kontron", "PSI98", 0 ) |