From e9db0518e74c44273c9ac592601c0d70f46364cf Mon Sep 17 00:00:00 2001 From: cracyc Date: Tue, 12 Oct 2021 21:56:24 -0500 Subject: konmedal020: add xga skeleton and few oak bits --- src/devices/video/pc_vga.cpp | 470 +++++++++++++++++++++++++++++++++++++++ src/devices/video/pc_vga.h | 76 +++++++ src/mame/drivers/konmedal020.cpp | 17 +- 3 files changed, 556 insertions(+), 7 deletions(-) diff --git a/src/devices/video/pc_vga.cpp b/src/devices/video/pc_vga.cpp index 2edaaca392a..eb8b9c58c37 100644 --- a/src/devices/video/pc_vga.cpp +++ b/src/devices/video/pc_vga.cpp @@ -129,6 +129,8 @@ DEFINE_DEVICE_TYPE(GAMTOR_VGA, gamtor_vga_device, "gamtor_vga", "GAMTOR VGA") DEFINE_DEVICE_TYPE(ATI_VGA, ati_vga_device, "ati_vga", "ATi VGA") DEFINE_DEVICE_TYPE(IBM8514A, ibm8514a_device, "ibm8514a", "IBM 8514/A Video") DEFINE_DEVICE_TYPE(MACH8, mach8_device, "mach8", "Mach8") +DEFINE_DEVICE_TYPE(XGA_COPRO, xga_copro_device, "xga_copro", "IBM XGA Coprocessor") +DEFINE_DEVICE_TYPE(OTI111, oak_oti111_vga_device, "oti111_vga", "Oak Technologies Spitfire 64111") vga_device::vga_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, type, tag, owner, clock) @@ -5836,3 +5838,471 @@ void mach8_device::mach8_ge_ext_config_w(uint16_t data) if(data & 0x8000) popmessage("EEPROM enabled via 7AEE"); } + +xga_copro_device::xga_copro_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, XGA_COPRO, tag, owner, clock) + , m_var(TYPE::XGA) + , m_mem_read_cb(*this) + , m_mem_write_cb(*this) +{ +} + +void xga_copro_device::start_command() +{ + switch((m_pelop >> 24) & 15) + { + case 11: + if(m_var == TYPE::OTI111) + { + logerror("oak specific textblt\n"); + break; + } + [[fallthrough]]; + case 12: + if(m_var == TYPE::OTI111) + { + logerror("oak specific fast pattern copy\n"); + break; + } + [[fallthrough]]; + default: + logerror("invalid pel op step func %d\n", (m_pelop >> 24) & 15); + break; + case 2: + logerror("draw and step read\n"); + break; + case 3: + logerror("line draw read\n"); + break; + case 4: + logerror("draw and step write\n"); + break; + case 5: + logerror("line draw write\n"); + break; + case 8: + logerror("pxblt\n"); + break; + case 9: + logerror("inverting pxblt\n"); + break; + case 10: + logerror("area fill pxblt\n"); + break; + } +} + +void do_pxblt() +{ + +} + +u8 xga_copro_device::xga_read(offs_t offset) +{ + switch(offset) + { + case 0x12: + return m_pelmap; + case 0x14: + return m_pelmap_base[m_pelmap]; + case 0x15: + return m_pelmap_base[m_pelmap] >> 8; + case 0x16: + return m_pelmap_base[m_pelmap] >> 16; + case 0x17: + return m_pelmap_base[m_pelmap] >> 24; + case 0x18: + return m_pelmap_width[m_pelmap]; + case 0x19: + return m_pelmap_width[m_pelmap] >> 8; + case 0x1a: + return m_pelmap_height[m_pelmap]; + case 0x1b: + return m_pelmap_height[m_pelmap] >> 8; + case 0x1c: + return m_pelmap_format[m_pelmap]; + case 0x20: + return m_bresh_err; + case 0x21: + return m_bresh_err >> 8; + case 0x24: + return m_bresh_k1; + case 0x25: + return m_bresh_k1 >> 8; + case 0x28: + return m_bresh_k2; + case 0x29: + return m_bresh_k2 >> 8; + case 0x2c: + return m_dir; + case 0x2d: + return m_dir >> 8; + case 0x2e: + return m_dir >> 16; + case 0x2f: + return m_dir >> 24; + case 0x48: + return m_fmix; + case 0x49: + return m_bmix; + case 0x4a: + return m_destccc; + case 0x4c: + return m_destccv; + case 0x4d: + return m_destccv >> 8; + case 0x4e: + return m_destccv >> 16; + case 0x4f: + return m_destccv >> 24; + case 0x50: + return m_pelbmask; + case 0x51: + return m_pelbmask >> 8; + case 0x52: + return m_pelbmask >> 16; + case 0x53: + return m_pelbmask >> 24; + case 0x54: + return m_carrychain; + case 0x55: + return m_carrychain >> 8; + case 0x56: + return m_carrychain >> 16; + case 0x57: + return m_carrychain >> 24; + case 0x58: + return m_fcolor; + case 0x59: + return m_fcolor >> 8; + case 0x5a: + return m_fcolor >> 16; + case 0x5b: + return m_fcolor >> 24; + case 0x5c: + return m_bcolor; + case 0x5d: + return m_bcolor >> 8; + case 0x5e: + return m_bcolor >> 16; + case 0x5f: + return m_bcolor >> 24; + case 0x60: + return m_opdim1; + case 0x61: + return m_opdim1 >> 8; + case 0x62: + return m_opdim2; + case 0x63: + return m_opdim2 >> 8; + case 0x6c: + return m_maskorigx; + case 0x6d: + return m_maskorigx >> 8; + case 0x6e: + return m_maskorigy; + case 0x6f: + return m_maskorigy >> 8; + case 0x70: + return m_srcxaddr; + case 0x71: + return m_srcxaddr >> 8; + case 0x72: + return m_srcyaddr; + case 0x73: + return m_srcyaddr >> 8; + case 0x74: + return m_patxaddr; + case 0x75: + return m_patxaddr >> 8; + case 0x76: + return m_patyaddr; + case 0x77: + return m_patyaddr >> 8; + case 0x78: + return m_dstxaddr; + case 0x79: + return m_dstxaddr >> 8; + case 0x7a: + return m_dstyaddr; + case 0x7b: + return m_dstyaddr >> 8; + case 0x7c: + return m_pelop; + case 0x7d: + return m_pelop >> 8; + case 0x7e: + return m_pelop >> 16; + case 0x7f: + return m_pelop >> 24; + } + return 0; +} + +void xga_copro_device::xga_write(offs_t offset, u8 data) +{ + switch(offset) + { + case 0x12: + m_pelmap = data & 3; + break; + case 0x14: + m_pelmap_base[m_pelmap] = (m_pelmap_base[m_pelmap] & ~0xff) | data; + break; + case 0x15: + m_pelmap_base[m_pelmap] = (m_pelmap_base[m_pelmap] & ~0xff00) | (data << 8); + break; + case 0x16: + m_pelmap_base[m_pelmap] = (m_pelmap_base[m_pelmap] & ~0xff0000) | (data << 16); + break; + case 0x17: + m_pelmap_base[m_pelmap] = (m_pelmap_base[m_pelmap] & ~0xff000000) | (data << 24); + break; + case 0x18: + m_pelmap_width[m_pelmap] = (m_pelmap_width[m_pelmap] & ~0xff) | data; + break; + case 0x19: + m_pelmap_width[m_pelmap] = (m_pelmap_width[m_pelmap] & ~0xff00) | (data << 8); + break; + case 0x1a: + m_pelmap_height[m_pelmap] = (m_pelmap_height[m_pelmap] & ~0xff) | data; + break; + case 0x1b: + m_pelmap_height[m_pelmap] = (m_pelmap_height[m_pelmap] & ~0xff00) | (data << 8); + break; + case 0x1c: + m_pelmap_format[m_pelmap] = data; + break; + case 0x20: + m_bresh_err = (m_bresh_err & ~0xff) | data; + break; + case 0x21: + m_bresh_err = (m_bresh_err & ~0xff00) | (data << 8); + break; + case 0x24: + m_bresh_k1 = (m_bresh_k1 & ~0xff) | data; + break; + case 0x25: + m_bresh_k1 = (m_bresh_k1 & ~0xff00) | (data << 8); + break; + case 0x28: + m_bresh_k2 = (m_bresh_k2 & ~0xff) | data; + break; + case 0x29: + m_bresh_k2 = (m_bresh_k2 & ~0xff00) | (data << 8); + break; + case 0x2c: + m_dir = (m_dir & ~0xff) | data; + break; + case 0x2d: + m_dir = (m_dir & ~0xff00) | (data << 8); + break; + case 0x2e: + m_dir = (m_dir & ~0xff0000) | (data << 16); + break; + case 0x2f: + m_dir = (m_dir & ~0xff000000) | (data << 24); + break; + case 0x48: + m_fmix = data; + break; + case 0x49: + m_bmix = data; + break; + case 0x4a: + m_destccc = data; + break; + case 0x4c: + m_destccv = (m_destccv & ~0xff) | data; + break; + case 0x4d: + m_destccv = (m_destccv & ~0xff00) | (data << 8); + break; + case 0x4e: + m_destccv = (m_destccv & ~0xff0000) | (data << 16); + break; + case 0x4f: + m_destccv = (m_destccv & ~0xff000000) | (data << 24); + break; + case 0x50: + m_pelbmask = (m_pelbmask & ~0xff) | data; + break; + case 0x51: + m_pelbmask = (m_pelbmask & ~0xff00) | (data << 8); + break; + case 0x52: + m_pelbmask = (m_pelbmask & ~0xff0000) | (data << 16); + break; + case 0x53: + m_pelbmask = (m_pelbmask & ~0xff000000) | (data << 24); + break; + case 0x54: + m_carrychain = (m_carrychain & ~0xff) | data; + break; + case 0x55: + m_carrychain = (m_carrychain & ~0xff00) | (data << 8); + break; + case 0x56: + m_carrychain = (m_carrychain & ~0xff0000) | (data << 16); + break; + case 0x57: + m_carrychain = (m_carrychain & ~0xff000000) | (data << 24); + break; + case 0x58: + m_fcolor = (m_fcolor & ~0xff) | data; + break; + case 0x59: + m_fcolor = (m_fcolor & ~0xff00) | (data << 8); + break; + case 0x5a: + m_fcolor = (m_fcolor & ~0xff0000) | (data << 16); + break; + case 0x5b: + m_fcolor = (m_fcolor & ~0xff000000) | (data << 24); + break; + case 0x5c: + m_bcolor = (m_bcolor & ~0xff) | data; + break; + case 0x5d: + m_bcolor = (m_bcolor & ~0xff00) | (data << 8); + break; + case 0x5e: + m_bcolor = (m_bcolor & ~0xff0000) | (data << 16); + break; + case 0x5f: + m_bcolor = (m_bcolor & ~0xff000000) | (data << 24); + break; + case 0x60: + m_opdim1 = (m_opdim1 & ~0xff) | data; + break; + case 0x61: + m_opdim1 = (m_opdim1 & ~0xff00) | (data << 8); + break; + case 0x62: + m_opdim2 = (m_opdim2 & ~0xff) | data; + break; + case 0x63: + m_opdim2 = (m_opdim2 & ~0xff00) | (data << 8); + break; + case 0x6c: + m_maskorigx = (m_maskorigx & ~0xff) | data; + break; + case 0x6d: + m_maskorigx = (m_maskorigx & ~0xff00) | (data << 8); + break; + case 0x6e: + m_maskorigy = (m_maskorigy & ~0xff) | data; + break; + case 0x6f: + m_maskorigy = (m_maskorigy & ~0xff00) | (data << 8); + break; + case 0x70: + m_srcxaddr = (m_srcxaddr & ~0xff) | data; + break; + case 0x71: + m_srcxaddr = (m_srcxaddr & ~0xff00) | (data << 8); + break; + case 0x72: + m_srcyaddr = (m_srcyaddr & ~0xff) | data; + break; + case 0x73: + m_srcyaddr = (m_srcyaddr & ~0xff00) | (data << 8); + break; + case 0x74: + m_patxaddr = (m_patxaddr & ~0xff) | data; + break; + case 0x75: + m_patxaddr = (m_patxaddr & ~0xff00) | (data << 8); + break; + case 0x76: + m_patyaddr = (m_patyaddr & ~0xff) | data; + break; + case 0x77: + m_patyaddr = (m_patyaddr & ~0xff00) | (data << 8); + break; + case 0x78: + m_dstxaddr = (m_dstxaddr & ~0xff) | data; + break; + case 0x79: + m_dstxaddr = (m_dstxaddr & ~0xff00) | (data << 8); + break; + case 0x7a: + m_dstyaddr = (m_dstyaddr & ~0xff) | data; + break; + case 0x7b: + m_dstyaddr = (m_dstyaddr & ~0xff00) | (data << 8); + break; + case 0x7c: + m_pelop = (m_pelop & ~0xff) | data; + break; + case 0x7d: + m_pelop = (m_pelop & ~0xff00) | (data << 8); + break; + case 0x7e: + m_pelop = (m_pelop & ~0xff0000) | (data << 16); + break; + case 0x7f: + m_pelop = (m_pelop & ~0xff000000) | (data << 24); + start_command(); + break; + } +} + +void xga_copro_device::device_start() +{ +} + +void xga_copro_device::device_reset() +{ + m_pelmap = 0; +} + +oak_oti111_vga_device::oak_oti111_vga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : svga_device(mconfig, OTI111, tag, owner, clock) + , m_xga(*this, "xga") +{ +} + +void oak_oti111_vga_device::device_add_mconfig(machine_config &config) +{ + XGA_COPRO(config, m_xga, 0); + m_xga->mem_read_callback().set(FUNC(oak_oti111_vga_device::mem_linear_r)); + m_xga->mem_write_callback().set(FUNC(oak_oti111_vga_device::mem_linear_w)); + m_xga->set_type(xga_copro_device::TYPE::OTI111); +} + +u8 oak_oti111_vga_device::xga_read(offs_t offset) +{ + switch(offset) + { + case 0x13: //fifo status + return 0xf; + default: + return m_xga->xga_read(offset); + } + return 0; +} + +void oak_oti111_vga_device::xga_write(offs_t offset, u8 data) +{ + m_xga->xga_write(offset, data); +} + +void oak_oti111_vga_device::device_start() +{ + svga_device::device_start(); + vga.svga_intf.vram_size = 0x100000; +} + +u8 oak_oti111_vga_device::dac_read(offs_t offset) +{ + if(offset >= 6) + return vga_device::port_03c0_r(offset); + return 0; +} + +void oak_oti111_vga_device::dac_write(offs_t offset, u8 data) +{ + if(offset >= 6) + vga_device::port_03c0_w(offset, data); +} diff --git a/src/devices/video/pc_vga.h b/src/devices/video/pc_vga.h index b7949a050df..25fdb1ce723 100644 --- a/src/devices/video/pc_vga.h +++ b/src/devices/video/pc_vga.h @@ -694,6 +694,82 @@ public: // device type definition DECLARE_DEVICE_TYPE(GAMTOR_VGA, gamtor_vga_device) +class xga_copro_device : public device_t +{ +public: + enum class TYPE { + XGA, + OTI111 + }; + + xga_copro_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + u8 xga_read(offs_t offset); + void xga_write(offs_t offset, u8 data); + + auto mem_read_callback() { return m_mem_read_cb.bind(); } + auto mem_write_callback() { return m_mem_write_cb.bind(); } + auto set_type(TYPE var) { m_var = var; } +protected: + virtual void device_start() override; + virtual void device_reset() override; +private: + void start_command(); + void do_pxblt(); + + u8 m_pelmap; + u32 m_pelmap_base[4]; + u16 m_pelmap_width[4]; + u16 m_pelmap_height[4]; + u8 m_pelmap_format[4]; + s16 m_bresh_err; + s16 m_bresh_k1; + s16 m_bresh_k2; + u32 m_dir; + u8 m_fmix; + u8 m_bmix; + u8 m_destccc; + u32 m_destccv; + u32 m_pelbmask; + u32 m_carrychain; + u32 m_fcolor; + u32 m_bcolor; + u16 m_opdim1; + u16 m_opdim2; + u16 m_maskorigx; + u16 m_maskorigy; + u16 m_srcxaddr; + u16 m_srcyaddr; + u16 m_patxaddr; + u16 m_patyaddr; + u16 m_dstxaddr; + u16 m_dstyaddr; + u32 m_pelop; + TYPE m_var; + devcb_read8 m_mem_read_cb; + devcb_write8 m_mem_write_cb; +}; + +DECLARE_DEVICE_TYPE(XGA_COPRO, xga_copro_device) + +class oak_oti111_vga_device : public svga_device +{ +public: + oak_oti111_vga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + u8 xga_read(offs_t offset); + void xga_write(offs_t offset, u8 data); + u8 dac_read(offs_t offset); + void dac_write(offs_t offset, u8 data); +protected: + virtual void device_add_mconfig(machine_config &config) override; + virtual void device_start() override; +private: + required_device m_xga; +}; + +DECLARE_DEVICE_TYPE(OTI111, oak_oti111_vga_device) + /* pega notes (paradise) build in amstrad pc1640 diff --git a/src/mame/drivers/konmedal020.cpp b/src/mame/drivers/konmedal020.cpp index d44dcddaa18..17da56fd078 100644 --- a/src/mame/drivers/konmedal020.cpp +++ b/src/mame/drivers/konmedal020.cpp @@ -37,7 +37,7 @@ public: konmedal020_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), - m_vga(*this, "vga"), + m_vga(*this, "oak"), m_ymz(*this, "ymz") { } @@ -49,7 +49,7 @@ protected: virtual void video_start() override; required_device m_maincpu; - required_device m_vga; + required_device m_vga; required_device m_ymz; private: @@ -66,10 +66,12 @@ void konmedal020_state::gs471_main(address_map &map) map(0x200000, 0x23ffff).ram(); // Watchdog and system control at 0x380000 map(0x3e0000, 0x3e1fff).ram(); // NVRAM? - map(0x800000, 0x8fffff).ram(); // VGA VRAM, probably - map(0xf003b0, 0xf003bf).rw(m_vga, FUNC(vga_device::port_03b0_r), FUNC(vga_device::port_03b0_w)); - map(0xf003c0, 0xf003cf).rw(m_vga, FUNC(vga_device::port_03c0_r), FUNC(vga_device::port_03c0_w)); - map(0xf003d0, 0xf003df).rw(m_vga, FUNC(vga_device::port_03d0_r), FUNC(vga_device::port_03d0_w)); + map(0x800000, 0x8fffff).rw(m_vga, FUNC(oak_oti111_vga_device::mem_linear_r), FUNC(oak_oti111_vga_device::mem_linear_w)); + map(0xe00000, 0xe0007f).rw(m_vga, FUNC(oak_oti111_vga_device::xga_read), FUNC(oak_oti111_vga_device::xga_write)); + map(0xf003b0, 0xf003bf).rw(m_vga, FUNC(oak_oti111_vga_device::port_03b0_r), FUNC(oak_oti111_vga_device::port_03b0_w)); + map(0xf003c0, 0xf003cf).rw(m_vga, FUNC(oak_oti111_vga_device::port_03c0_r), FUNC(oak_oti111_vga_device::port_03c0_w)); + map(0xf003d0, 0xf003df).rw(m_vga, FUNC(oak_oti111_vga_device::port_03d0_r), FUNC(oak_oti111_vga_device::port_03d0_w)); + map(0xf021e0, 0xf021e9).rw(m_vga, FUNC(oak_oti111_vga_device::dac_read), FUNC(oak_oti111_vga_device::dac_write)); } static INPUT_PORTS_START( gs471 ) @@ -95,8 +97,9 @@ void konmedal020_state::gs471(machine_config &config) screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); screen.set_raw(25.175_MHz_XTAL, 800, 0, 640, 524, 0, 480); screen.set_screen_update(m_vga, FUNC(vga_device::screen_update)); + screen.screen_vblank().set_inputline(m_maincpu, M68K_IRQ_3); - VGA(config, m_vga, 0).set_screen("screen"); + OTI111(config, m_vga, 0).set_screen("screen"); /* sound hardware */ SPEAKER(config, "lspeaker").front_left(); -- cgit v1.2.3