summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/qx10.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/qx10.cpp')
-rw-r--r--src/mame/drivers/qx10.cpp905
1 files changed, 0 insertions, 905 deletions
diff --git a/src/mame/drivers/qx10.cpp b/src/mame/drivers/qx10.cpp
deleted file mode 100644
index b2e413679ad..00000000000
--- a/src/mame/drivers/qx10.cpp
+++ /dev/null
@@ -1,905 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Mariusz Wojcieszek, Angelo Salese
-/***************************************************************************
-
- QX-10
-
- Preliminary driver by Mariusz Wojcieszek
-
- Status:
- Driver boots and load CP/M from floppy image. Needs upd7220 for gfx
-
- Done:
- - preliminary memory map
- - sound
- - floppy (upd765)
- - DMA
- - Interrupts (pic8295)
-
- banking:
- - 0x1c = 0
- map(0x0000,0x1fff).rom()
- map(0x2000,0xdfff).noprw()
- map(0xe000,0xffff).ram()
- - 0x1c = 1 0x20 = 1
- map(0x0000,0x7fff).ram() (0x18 selects bank)
- map(0x8000,0x87ff) CMOS
- map(0x8800,0xdfff).noprw() or previous bank?
- map(0xe000,0xffff).ram()
- - 0x1c = 1 0x20 = 0
- map(0x0000,0xdfff).ram() (0x18 selects bank)
- map(0xe000,0xffff).ram()
-****************************************************************************/
-
-
-#include "emu.h"
-
-#include "bus/rs232/rs232.h"
-#include "cpu/z80/z80.h"
-#include "imagedev/floppy.h"
-#include "machine/am9517a.h"
-#include "machine/i8255.h"
-#include "machine/mc146818.h"
-#include "machine/pic8259.h"
-#include "machine/pit8253.h"
-#include "machine/qx10kbd.h"
-#include "machine/ram.h"
-#include "machine/upd765.h"
-#include "machine/z80sio.h"
-#include "sound/spkrdev.h"
-#include "speaker.h"
-#include "video/upd7220.h"
-#include "emupal.h"
-
-#include "screen.h"
-#include "softlist.h"
-#include "imagedev/snapquik.h"
-
-
-#define MAIN_CLK 15974400
-
-#define RS232_TAG "rs232"
-
-/*
- Driver data
-*/
-
-class qx10_state : public driver_device
-{
-public:
- qx10_state(const machine_config &mconfig, device_type type, const char *tag) :
- driver_device(mconfig, type, tag),
- m_pit_1(*this, "pit8253_1"),
- m_pit_2(*this, "pit8253_2"),
- m_pic_m(*this, "pic8259_master"),
- m_pic_s(*this, "pic8259_slave"),
- m_scc(*this, "upd7201"),
- m_ppi(*this, "i8255"),
- m_dma_1(*this, "8237dma_1"),
- m_dma_2(*this, "8237dma_2"),
- m_fdc(*this, "upd765"),
- m_floppy(*this, "upd765:%u", 0U),
- m_hgdc(*this, "upd7220"),
- m_rtc(*this, "rtc"),
- m_kbd(*this, "kbd"),
- m_speaker(*this, "speaker"),
- m_vram_bank(0),
- m_char_rom(*this, "chargen"),
- m_maincpu(*this, "maincpu"),
- m_screen(*this, "screen"),
- m_ram(*this, RAM_TAG),
- m_palette(*this, "palette")
- {
- }
-
- void qx10(machine_config &config);
-
-private:
- uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
-
- virtual void machine_start() override;
- virtual void machine_reset() override;
-
- virtual void video_start() override;
-
- void update_memory_mapping();
-
- void update_speaker();
-
- void qx10_18_w(uint8_t data);
- void prom_sel_w(uint8_t data);
- void cmos_sel_w(uint8_t data);
- DECLARE_WRITE_LINE_MEMBER( qx10_upd765_interrupt );
- void fdd_motor_w(uint8_t data);
- uint8_t qx10_30_r();
- uint8_t gdc_dack_r();
- void gdc_dack_w(uint8_t data);
- DECLARE_WRITE_LINE_MEMBER( tc_w );
- uint8_t mc146818_r(offs_t offset);
- void mc146818_w(offs_t offset, uint8_t data);
- IRQ_CALLBACK_MEMBER( inta_call );
- uint8_t get_slave_ack(offs_t offset);
- uint8_t vram_bank_r();
- void vram_bank_w(uint8_t data);
- uint16_t vram_r(offs_t offset);
- void vram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
- uint8_t memory_read_byte(offs_t offset);
- void memory_write_byte(offs_t offset, uint8_t data);
- DECLARE_WRITE_LINE_MEMBER(keyboard_clk);
- DECLARE_WRITE_LINE_MEMBER(keyboard_irq);
- DECLARE_WRITE_LINE_MEMBER(speaker_freq);
- DECLARE_WRITE_LINE_MEMBER(speaker_duration);
-
- DECLARE_QUICKLOAD_LOAD_MEMBER(quickload_cb);
-
- void qx10_palette(palette_device &palette) const;
- DECLARE_WRITE_LINE_MEMBER(dma_hrq_changed);
-
- UPD7220_DISPLAY_PIXELS_MEMBER( hgdc_display_pixels );
- UPD7220_DRAW_TEXT_LINE_MEMBER( hgdc_draw_text );
-
- void qx10_io(address_map &map);
- void qx10_mem(address_map &map);
- void upd7220_map(address_map &map);
-
- required_device<pit8253_device> m_pit_1;
- required_device<pit8253_device> m_pit_2;
- required_device<pic8259_device> m_pic_m;
- required_device<pic8259_device> m_pic_s;
- required_device<upd7201_device> m_scc;
- required_device<i8255_device> m_ppi;
- required_device<am9517a_device> m_dma_1;
- required_device<am9517a_device> m_dma_2;
- required_device<upd765a_device> m_fdc;
- required_device_array<floppy_connector, 2> m_floppy;
- required_device<upd7220_device> m_hgdc;
- required_device<mc146818_device> m_rtc;
- required_device<rs232_port_device> m_kbd;
- required_device<speaker_sound_device> m_speaker;
- uint8_t m_vram_bank;
- //required_shared_ptr<uint8_t> m_video_ram;
- std::unique_ptr<uint16_t[]> m_video_ram;
- required_region_ptr<uint8_t> m_char_rom;
-
- required_device<cpu_device> m_maincpu;
- required_device<screen_device> m_screen;
- required_device<ram_device> m_ram;
- required_device<palette_device> m_palette;
-
- /* FDD */
- int m_fdcint;
- int m_fdcmotor;
- //int m_fdcready;
-
- int m_spkr_enable;
- int m_spkr_freq;
- int m_pit1_out0;
-
- /* memory */
- int m_membank;
- int m_memprom;
- int m_memcmos;
- uint8_t m_cmosram[0x800];
-
- uint8_t m_color_mode;
-};
-
-UPD7220_DISPLAY_PIXELS_MEMBER( qx10_state::hgdc_display_pixels )
-{
- rgb_t const *const palette = m_palette->palette()->entry_list_raw();
- int gfx[3];
-
- if(m_color_mode)
- {
- gfx[0] = m_video_ram[((address) + 0x00000) >> 1];
- gfx[1] = m_video_ram[((address) + 0x20000) >> 1];
- gfx[2] = m_video_ram[((address) + 0x40000) >> 1];
- }
- else
- {
- gfx[0] = m_video_ram[(address) >> 1];
- gfx[1] = 0;
- gfx[2] = 0;
- }
-
- for(int xi=0;xi<16;xi++)
- {
- uint8_t pen;
- pen = ((gfx[0] >> xi) & 1) ? 1 : 0;
- pen|= ((gfx[1] >> xi) & 1) ? 2 : 0;
- pen|= ((gfx[2] >> xi) & 1) ? 4 : 0;
-
- bitmap.pix(y, x + xi) = palette[pen];
- }
-}
-
-UPD7220_DRAW_TEXT_LINE_MEMBER( qx10_state::hgdc_draw_text )
-{
- const rgb_t *palette = m_palette->palette()->entry_list_raw();
-
- for (int x = 0; x < pitch; x++)
- {
- int tile = m_video_ram[((addr+x)*2) >> 1] & 0xff;
- int attr = m_video_ram[((addr+x)*2) >> 1] >> 8;
-
- uint8_t color = (m_color_mode) ? 1 : (attr & 4) ? 2 : 1; /* TODO: color mode */
-
- for (int yi = 0; yi < lr; yi++)
- {
- uint8_t tile_data = (m_char_rom[tile*16+yi]);
-
- if(attr & 8)
- tile_data^=0xff;
-
- if(cursor_on && cursor_addr == addr+x) //TODO
- tile_data^=0xff;
-
- if(attr & 0x80 && m_screen->frame_number() & 0x10) //TODO: check for blinking interval
- tile_data=0;
-
- for (int xi = 0; xi < 8; xi++)
- {
- int res_x = x * 8 + xi;
- int res_y = y + yi;
-
- if(!m_screen->visible_area().contains(res_x, res_y))
- continue;
-
- uint8_t pen;
- if(yi >= 16)
- pen = 0;
- else
- pen = ((tile_data >> xi) & 1) ? color : 0;
-
- if(pen)
- bitmap.pix(res_y, res_x) = palette[pen];
- }
- }
- }
-}
-
-uint32_t qx10_state::screen_update( screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect )
-{
- bitmap.fill(m_palette->black_pen(), cliprect);
-
- m_hgdc->screen_update(screen, bitmap, cliprect);
-
- return 0;
-}
-
-/*
- Sound
-*/
-void qx10_state::update_speaker()
-{
-
- /*
- * freq -----
- * pit1_out0 ----- NAND ---- level
- * NAND -----
- * !enable -----
- */
-
- uint8_t level = ((!m_spkr_enable && m_pit1_out0) || !m_spkr_freq) ? 1 : 0;
- m_speaker->level_w(level);
-}
-
-/*
- Memory
-*/
-void qx10_state::update_memory_mapping()
-{
- int drambank = 0;
-
- if (m_membank & 1)
- {
- drambank = 0;
- }
- else if (m_membank & 2)
- {
- drambank = 1;
- }
- else if (m_membank & 4)
- {
- drambank = 2;
- }
- else if (m_membank & 8)
- {
- drambank = 3;
- }
-
- if (!m_memprom)
- {
- membank("bank1")->set_base(memregion("maincpu")->base());
- }
- else
- {
- membank("bank1")->set_base(m_ram->pointer() + drambank*64*1024);
- }
- if (m_memcmos)
- {
- membank("bank2")->set_base(m_cmosram);
- }
- else
- {
- membank("bank2")->set_base(m_ram->pointer() + drambank*64*1024 + 32*1024);
- }
-}
-
-void qx10_state::qx10_18_w(uint8_t data)
-{
- m_membank = (data >> 4) & 0x0f;
- m_spkr_enable = (data >> 2) & 0x01;
- m_pit_1->write_gate0(data & 1);
- update_speaker();
- update_memory_mapping();
-}
-
-void qx10_state::prom_sel_w(uint8_t data)
-{
- m_memprom = data & 1;
- update_memory_mapping();
-}
-
-void qx10_state::cmos_sel_w(uint8_t data)
-{
- m_memcmos = data & 1;
- update_memory_mapping();
-}
-
-/***********************************************************
-
- Quickload
-
- This loads a .COM file to address 0x100 then jumps
- there. Sometimes .COM has been renamed to .CPM to
- prevent windows going ballistic. These can be loaded
- as well.
-
-************************************************************/
-
-QUICKLOAD_LOAD_MEMBER(qx10_state::quickload_cb)
-{
- address_space& prog_space = m_maincpu->space(AS_PROGRAM);
-
- if (image.length() >= 0xfd00)
- return image_init_result::FAIL;
-
- /* The right RAM bank must be active */
- m_membank = 0;
- update_memory_mapping();
-
- /* Avoid loading a program if CP/M-80 is not in memory */
- if ((prog_space.read_byte(0) != 0xc3) || (prog_space.read_byte(5) != 0xc3))
- {
- machine_reset();
- return image_init_result::FAIL;
- }
-
- /* Load image to the TPA (Transient Program Area) */
- uint16_t quickload_size = image.length();
- for (uint16_t i = 0; i < quickload_size; i++)
- {
- uint8_t data;
- if (image.fread( &data, 1) != 1)
- return image_init_result::FAIL;
- prog_space.write_byte(i+0x100, data);
- }
-
- /* clear out command tail */
- prog_space.write_byte(0x80, 0); prog_space.write_byte(0x81, 0);
-
- /* Roughly set SP basing on the BDOS position */
- m_maincpu->set_state_int(Z80_SP, 256 * prog_space.read_byte(7) - 300);
- m_maincpu->set_pc(0x100); // start program
-
- return image_init_result::PASS;
-}
-
-/*
- FDD
-*/
-
-static void qx10_floppies(device_slot_interface &device)
-{
- device.option_add("525dd", FLOPPY_525_DD);
-}
-
-WRITE_LINE_MEMBER( qx10_state::qx10_upd765_interrupt )
-{
- m_fdcint = state;
-
- //logerror("Interrupt from upd765: %d\n", state);
- // signal interrupt
- m_pic_m->ir6_w(state);
-}
-
-void qx10_state::fdd_motor_w(uint8_t data)
-{
- m_fdcmotor = 1;
-
- m_floppy[0]->get_device()->mon_w(false);
- m_floppy[1]->get_device()->mon_w(false);
- // motor off controlled by clock
-}
-
-uint8_t qx10_state::qx10_30_r()
-{
- floppy_image_device *floppy1,*floppy2;
-
- floppy1 = m_floppy[0]->get_device();
- floppy2 = m_floppy[1]->get_device();
-
- return m_fdcint |
- /*m_fdcmotor*/ 0 << 1 |
- ((floppy1 != nullptr) || (floppy2 != nullptr) ? 1 : 0) << 3 |
- m_membank << 4;
-}
-
-/*
- DMA8237
-*/
-WRITE_LINE_MEMBER(qx10_state::dma_hrq_changed)
-{
- /* Assert HLDA */
- m_dma_1->hack_w(state);
-}
-
-uint8_t qx10_state::gdc_dack_r()
-{
- logerror("GDC DACK read\n");
- return 0;
-}
-
-void qx10_state::gdc_dack_w(uint8_t data)
-{
- logerror("GDC DACK write %02x\n", data);
-}
-
-WRITE_LINE_MEMBER( qx10_state::tc_w )
-{
- /* floppy terminal count */
- m_fdc->tc_w(!state);
-}
-
-/*
- 8237 DMA (Master)
- Channel 1: Floppy disk
- Channel 2: GDC
- Channel 3: Option slots
-*/
-uint8_t qx10_state::memory_read_byte(offs_t offset)
-{
- address_space& prog_space = m_maincpu->space(AS_PROGRAM);
- return prog_space.read_byte(offset);
-}
-
-void qx10_state::memory_write_byte(offs_t offset, uint8_t data)
-{
- address_space& prog_space = m_maincpu->space(AS_PROGRAM);
- return prog_space.write_byte(offset, data);
-}
-
-/*
- 8237 DMA (Slave)
- Channel 1: Option slots #1
- Channel 2: Option slots #2
- Channel 3: Option slots #3
- Channel 4: Option slots #4
-*/
-
-/*
- MC146818
-*/
-
-void qx10_state::mc146818_w(offs_t offset, uint8_t data)
-{
- m_rtc->write(!offset, data);
-}
-
-uint8_t qx10_state::mc146818_r(offs_t offset)
-{
- return m_rtc->read(!offset);
-}
-
-WRITE_LINE_MEMBER(qx10_state::keyboard_irq)
-{
- m_scc->m1_r(); // always set
- m_pic_m->ir4_w(state);
-}
-
-WRITE_LINE_MEMBER(qx10_state::keyboard_clk)
-{
- // clock keyboard too
- m_scc->rxca_w(state);
- m_scc->txca_w(state);
-}
-
-WRITE_LINE_MEMBER(qx10_state::speaker_duration)
-{
- m_pit1_out0 = state;
- update_speaker();
-}
-
-WRITE_LINE_MEMBER(qx10_state::speaker_freq)
-{
- m_spkr_freq = state;
- update_speaker();
-}
-
-/*
- Master PIC8259
- IR0 Power down detection interrupt
- IR1 Software timer #1 interrupt
- IR2 External interrupt INTF1
- IR3 External interrupt INTF2
- IR4 Keyboard/RS232 interrupt
- IR5 CRT/lightpen interrupt
- IR6 Floppy controller interrupt
- IR7 Slave cascade
-*/
-
-IRQ_CALLBACK_MEMBER(qx10_state::inta_call)
-{
- uint32_t vector = m_pic_m->acknowledge() << 16;
- vector |= m_pic_m->acknowledge();
- vector |= m_pic_m->acknowledge() << 8;
- return vector;
-}
-
-uint8_t qx10_state::get_slave_ack(offs_t offset)
-{
- if (offset==7) { // IRQ = 7
- return m_pic_s->acknowledge();
- }
- return 0x00;
-}
-
-
-/*
- Slave PIC8259
- IR0 Printer interrupt
- IR1 External interrupt #1
- IR2 Calendar clock interrupt
- IR3 External interrupt #2
- IR4 External interrupt #3
- IR5 Software timer #2 interrupt
- IR6 External interrupt #4
- IR7 External interrupt #5
-
-*/
-
-uint8_t qx10_state::vram_bank_r()
-{
- return m_vram_bank;
-}
-
-void qx10_state::vram_bank_w(uint8_t data)
-{
- if(m_color_mode)
- {
- m_vram_bank = data & 7;
- if(data != 1 && data != 2 && data != 4)
- printf("%02x\n",data);
- }
-}
-
-void qx10_state::qx10_mem(address_map &map)
-{
- map.unmap_value_high();
- map(0x0000, 0x7fff).bankrw("bank1");
- map(0x8000, 0xdfff).bankrw("bank2");
- map(0xe000, 0xffff).ram();
-}
-
-void qx10_state::qx10_io(address_map &map)
-{
- map.global_mask(0xff);
- map(0x00, 0x03).rw(m_pit_1, FUNC(pit8253_device::read), FUNC(pit8253_device::write));
- map(0x04, 0x07).rw(m_pit_2, FUNC(pit8253_device::read), FUNC(pit8253_device::write));
- map(0x08, 0x09).rw(m_pic_m, FUNC(pic8259_device::read), FUNC(pic8259_device::write));
- map(0x0c, 0x0d).rw(m_pic_s, FUNC(pic8259_device::read), FUNC(pic8259_device::write));
- map(0x10, 0x13).rw(m_scc, FUNC(upd7201_device::cd_ba_r), FUNC(upd7201_device::cd_ba_w));
- map(0x14, 0x17).rw(m_ppi, FUNC(i8255_device::read), FUNC(i8255_device::write));
- map(0x18, 0x1b).portr("DSW").w(FUNC(qx10_state::qx10_18_w));
- map(0x1c, 0x1f).w(FUNC(qx10_state::prom_sel_w));
- map(0x20, 0x23).w(FUNC(qx10_state::cmos_sel_w));
- map(0x2c, 0x2c).portr("CONFIG");
- map(0x2d, 0x2d).rw(FUNC(qx10_state::vram_bank_r), FUNC(qx10_state::vram_bank_w));
- map(0x30, 0x33).rw(FUNC(qx10_state::qx10_30_r), FUNC(qx10_state::fdd_motor_w));
- map(0x34, 0x35).m(m_fdc, FUNC(upd765a_device::map));
- map(0x38, 0x39).rw(m_hgdc, FUNC(upd7220_device::read), FUNC(upd7220_device::write));
-// map(0x3a, 0x3a) GDC zoom
-// map(0x3b, 0x3b) GDC light pen req
- map(0x3c, 0x3d).rw(FUNC(qx10_state::mc146818_r), FUNC(qx10_state::mc146818_w));
- map(0x40, 0x4f).rw(m_dma_1, FUNC(am9517a_device::read), FUNC(am9517a_device::write));
- map(0x50, 0x5f).rw(m_dma_2, FUNC(am9517a_device::read), FUNC(am9517a_device::write));
-// map(0xfc, 0xfd) Multi-Font comms
-}
-
-/* Input ports */
-/* TODO: shift break */
-/*INPUT_CHANGED_MEMBER(qx10_state::key_stroke)
-{
- if(newval && !oldval)
- {
- m_keyb.rx = uint8_t(param & 0x7f);
- m_pic_m->ir4_w(1);
- }
-
- if(oldval && !newval)
- m_keyb.rx = 0;
-}*/
-
-static INPUT_PORTS_START( qx10 )
- /* TODO: All of those have unknown meaning */
- PORT_START("DSW")
- PORT_DIPNAME( 0x01, 0x00, "DSW" )
- PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x02, 0x00, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x04, 0x00, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) ) //CMOS related
- PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
-
- PORT_START("CONFIG")
- PORT_CONFNAME( 0x03, 0x02, "Video Board" )
- PORT_CONFSETTING( 0x02, "Monochrome" )
- PORT_CONFSETTING( 0x01, "Color" )
- PORT_BIT(0xfc, IP_ACTIVE_LOW, IPT_UNUSED)
-INPUT_PORTS_END
-
-
-void qx10_state::machine_start()
-{
-}
-
-void qx10_state::machine_reset()
-{
- m_dma_1->dreq0_w(1);
-
- m_spkr_enable = 0;
- m_pit1_out0 = 1;
-
- m_memprom = 0;
- m_memcmos = 0;
- m_membank = 0;
- update_memory_mapping();
-
- {
- int i;
-
- /* TODO: is there a bit that sets this up? */
- m_color_mode = ioport("CONFIG")->read() & 1;
-
- if(m_color_mode) //color
- {
- for ( i = 0; i < 8; i++ )
- m_palette->set_pen_color(i, pal1bit((i >> 2) & 1), pal1bit((i >> 1) & 1), pal1bit((i >> 0) & 1));
- }
- else //monochrome
- {
- for ( i = 0; i < 8; i++ )
- m_palette->set_pen_color(i, pal1bit(0), pal1bit(0), pal1bit(0));
-
- m_palette->set_pen_color(1, 0x00, 0x9f, 0x00);
- m_palette->set_pen_color(2, 0x00, 0xff, 0x00);
- m_vram_bank = 0;
- }
- }
-}
-
-/* F4 Character Displayer */
-static const gfx_layout qx10_charlayout =
-{
- 8, 16, /* 8 x 16 characters */
- RGN_FRAC(1,1), /* 128 characters */
- 1, /* 1 bits per pixel */
- { 0 }, /* no bitplanes */
- /* x offsets */
- { 7, 6, 5, 4, 3, 2, 1, 0 },
- /* y offsets */
- { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, 8*8, 9*8, 10*8, 11*8, 12*8, 13*8, 14*8, 15*8 },
- 8*16 /* every char takes 16 bytes */
-};
-
-static GFXDECODE_START( gfx_qx10 )
- GFXDECODE_ENTRY( "chargen", 0x0000, qx10_charlayout, 1, 1 )
-GFXDECODE_END
-
-void qx10_state::video_start()
-{
- // allocate memory
- m_video_ram = make_unique_clear<uint16_t[]>(0x30000);
-}
-
-void qx10_state::qx10_palette(palette_device &palette) const
-{
- // ...
-}
-
-uint16_t qx10_state::vram_r(offs_t offset)
-{
- int bank = 0;
-
- if (m_vram_bank & 1) { bank = 0; } // B
- else if(m_vram_bank & 2) { bank = 1; } // G
- else if(m_vram_bank & 4) { bank = 2; } // R
-
- return m_video_ram[offset + (0x20000 * bank)];
-}
-
-void qx10_state::vram_w(offs_t offset, uint16_t data, uint16_t mem_mask)
-{
- int bank = 0;
-
- if (m_vram_bank & 1) { bank = 0; } // B
- else if(m_vram_bank & 2) { bank = 1; } // G
- else if(m_vram_bank & 4) { bank = 2; } // R
-
- COMBINE_DATA(&m_video_ram[offset + (0x20000 * bank)]);
-}
-
-void qx10_state::upd7220_map(address_map &map)
-{
- map(0x00000, 0x3ffff).rw(FUNC(qx10_state::vram_r), FUNC(qx10_state::vram_w));
-}
-
-static void keyboard(device_slot_interface &device)
-{
- device.option_add("qx10", QX10_KEYBOARD);
-}
-
-void qx10_state::qx10(machine_config &config)
-{
- /* basic machine hardware */
- Z80(config, m_maincpu, MAIN_CLK / 4);
- m_maincpu->set_addrmap(AS_PROGRAM, &qx10_state::qx10_mem);
- m_maincpu->set_addrmap(AS_IO, &qx10_state::qx10_io);
- m_maincpu->set_irq_acknowledge_callback(FUNC(qx10_state::inta_call));
-
- /* video hardware */
- SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
- m_screen->set_screen_update(FUNC(qx10_state::screen_update));
- m_screen->set_raw(16.67_MHz_XTAL, 872, 152, 792, 421, 4, 404);
- GFXDECODE(config, "gfxdecode", m_palette, gfx_qx10);
- PALETTE(config, m_palette, FUNC(qx10_state::qx10_palette), 8);
-
- /* Devices */
-
-/*
- Timer 0
- Counter CLK Gate OUT Operation
- 0 Keyboard clock (1200bps) Memory register D0 Speaker timer Speaker timer (100ms)
- 1 Keyboard clock (1200bps) +5V 8259A (10E) IR5 Software timer
- 2 Clock 1,9668MHz Memory register D7 8259 (12E) IR1 Software timer
-*/
- PIT8253(config, m_pit_1, 0);
- m_pit_1->set_clk<0>(1200);
- m_pit_1->out_handler<0>().set(FUNC(qx10_state::speaker_duration));
- m_pit_1->set_clk<1>(1200);
- m_pit_1->set_clk<2>(MAIN_CLK / 8);
-
-/*
- Timer 1
- Counter CLK Gate OUT Operation
- 0 Clock 1,9668MHz +5V Speaker frequency 1kHz
- 1 Clock 1,9668MHz +5V Keyboard clock 1200bps (Clock / 1664)
- 2 Clock 1,9668MHz +5V RS-232C baud rate 9600bps (Clock / 208)
-*/
- PIT8253(config, m_pit_2, 0);
- m_pit_2->set_clk<0>(MAIN_CLK / 8);
- m_pit_2->out_handler<0>().set(FUNC(qx10_state::speaker_freq));
- m_pit_2->set_clk<1>(MAIN_CLK / 8);
- m_pit_2->out_handler<1>().set(FUNC(qx10_state::keyboard_clk));
- m_pit_2->set_clk<2>(MAIN_CLK / 8);
- m_pit_2->out_handler<2>().set(m_scc, FUNC(upd7201_device::rxtxcb_w));
-
- PIC8259(config, m_pic_m, 0);
- m_pic_m->out_int_callback().set_inputline(m_maincpu, 0);
- m_pic_m->in_sp_callback().set_constant(1);
- m_pic_m->read_slave_ack_callback().set(FUNC(qx10_state::get_slave_ack));
-
- PIC8259(config, m_pic_s, 0);
- m_pic_s->out_int_callback().set(m_pic_m, FUNC(pic8259_device::ir7_w));
- m_pic_s->in_sp_callback().set_constant(0);
-
- UPD7201(config, m_scc, MAIN_CLK/4); // channel b clock set by pit2 channel 2
- // Channel A: Keyboard
- m_scc->out_txda_callback().set(m_kbd, FUNC(rs232_port_device::write_txd));
- // Channel B: RS232
- m_scc->out_txdb_callback().set(RS232_TAG, FUNC(rs232_port_device::write_txd));
- m_scc->out_dtrb_callback().set(RS232_TAG, FUNC(rs232_port_device::write_dtr));
- m_scc->out_rtsb_callback().set(RS232_TAG, FUNC(rs232_port_device::write_rts));
- m_scc->out_int_callback().set(FUNC(qx10_state::keyboard_irq));
-
- AM9517A(config, m_dma_1, MAIN_CLK/4);
- m_dma_1->out_hreq_callback().set(FUNC(qx10_state::dma_hrq_changed));
- m_dma_1->out_eop_callback().set(FUNC(qx10_state::tc_w));
- m_dma_1->in_memr_callback().set(FUNC(qx10_state::memory_read_byte));
- m_dma_1->out_memw_callback().set(FUNC(qx10_state::memory_write_byte));
- m_dma_1->in_ior_callback<0>().set(m_fdc, FUNC(upd765a_device::dma_r));
- m_dma_1->in_ior_callback<1>().set(FUNC(qx10_state::gdc_dack_r));
- //m_dma_1->in_ior_callback<2>().set(m_hgdc, FUNC(upd7220_device::dack_r));
- m_dma_1->out_iow_callback<0>().set(m_fdc, FUNC(upd765a_device::dma_w));
- m_dma_1->out_iow_callback<1>().set(FUNC(qx10_state::gdc_dack_w));
- //m_dma_1->out_iow_callback<2>().set(m_hgdc, FUNC(upd7220_device::dack_w));
- AM9517A(config, m_dma_2, MAIN_CLK/4);
-
- I8255(config, m_ppi, 0);
-
- UPD7220(config, m_hgdc, 16.67_MHz_XTAL/4/2);
- m_hgdc->set_addrmap(0, &qx10_state::upd7220_map);
- m_hgdc->set_display_pixels(FUNC(qx10_state::hgdc_display_pixels));
- m_hgdc->set_draw_text(FUNC(qx10_state::hgdc_draw_text));
- m_hgdc->set_screen("screen");
-
- MC146818(config, m_rtc, 32.768_kHz_XTAL);
- m_rtc->irq().set(m_pic_s, FUNC(pic8259_device::ir2_w));
-
- UPD765A(config, m_fdc, 8'000'000, true, true);
- m_fdc->intrq_wr_callback().set(FUNC(qx10_state::qx10_upd765_interrupt));
- m_fdc->drq_wr_callback().set(m_dma_1, FUNC(am9517a_device::dreq0_w)).invert();
- FLOPPY_CONNECTOR(config, m_floppy[0], qx10_floppies, "525dd", floppy_image_device::default_mfm_floppy_formats);
- FLOPPY_CONNECTOR(config, m_floppy[1], qx10_floppies, "525dd", floppy_image_device::default_mfm_floppy_formats);
-
- rs232_port_device &rs232(RS232_PORT(config, RS232_TAG, default_rs232_devices, nullptr));
- rs232.rxd_handler().set(m_scc, FUNC(upd7201_device::rxb_w));
-
- RS232_PORT(config, m_kbd, keyboard, "qx10");
- m_kbd->rxd_handler().set(m_scc, FUNC(upd7201_device::rxa_w));
-
- /* sound hardware */
- SPEAKER(config, "mono").front_center();
- SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 1.00);
-
- /* internal ram */
- RAM(config, RAM_TAG).set_default_size("256K");
-
- // software lists
- SOFTWARE_LIST(config, "flop_list").set_original("qx10_flop");
-
- QUICKLOAD(config, "quickload", "com,cpm", attotime::from_seconds(3)).set_load_callback(FUNC(qx10_state::quickload_cb));
-}
-
-/* ROM definition */
-ROM_START( qx10 )
- ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
- ROM_SYSTEM_BIOS(0, "v006", "v0.06")
- ROMX_LOAD( "ipl006.bin", 0x0000, 0x0800, CRC(3155056a) SHA1(67cc0ae5055d472aa42eb40cddff6da69ffc6553), ROM_BIOS(0))
- ROM_SYSTEM_BIOS(1, "v003", "v0.03")
- ROMX_LOAD( "ipl003.bin", 0x0000, 0x0800, CRC(3cbc4008) SHA1(cc8c7d1aa0cca8f9753d40698b2dc6802fd5f890), ROM_BIOS(1))
-
- /* This is probably the i8039 program ROM for the Q10MF Multifont card, and the actual font ROMs are missing (6 * HM43128) */
- /* The first part of this rom looks like code for an embedded controller?
- From 0300 on, is a keyboard lookup table */
- ROM_REGION( 0x0800, "i8039", 0 )
- ROM_LOAD( "m12020a.3e", 0x0000, 0x0800, CRC(fa27f333) SHA1(73d27084ca7b002d5f370220d8da6623a6e82132))
-
- ROM_REGION( 0x1000, "chargen", 0 )
-// ROM_LOAD( "qge.2e", 0x0000, 0x0800, BAD_DUMP CRC(ed93cb81) SHA1(579e68bde3f4184ded7d89b72c6936824f48d10b)) //this one contains special characters only
-// ROM_LOAD( "qge.2e", 0x0000, 0x1000, BAD_DUMP CRC(eb31a2d5) SHA1(6dc581bf2854a07ae93b23b6dfc9c7abd3c0569e))
- ROM_LOAD( "qga.2e", 0x0000, 0x1000, CRC(4120b128) SHA1(9b96f6d78cfd402f8aec7c063ffb70a21b78eff0))
-ROM_END
-
-/* Driver */
-
-/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
-COMP( 1983, qx10, 0, 0, qx10, qx10, qx10_state, empty_init, "Epson", "QX-10", MACHINE_NOT_WORKING )