From b3bde8cb99e54016892f89c3783705f948f99569 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Thu, 15 Feb 2024 17:53:57 +0100 Subject: [PATCH] bud/idpartner/gdp.cpp: hook AVDC and added char rom --- src/devices/bus/idpartner/gdp.cpp | 153 ++++++++++++++++++++++++++---- src/devices/video/scn2674.h | 4 +- 2 files changed, 136 insertions(+), 21 deletions(-) diff --git a/src/devices/bus/idpartner/gdp.cpp b/src/devices/bus/idpartner/gdp.cpp index 3bccec26470..0b7f34dbf90 100644 --- a/src/devices/bus/idpartner/gdp.cpp +++ b/src/devices/bus/idpartner/gdp.cpp @@ -9,6 +9,7 @@ #include "emu.h" #include "gdp.h" +#include "machine/timer.h" #include "machine/z80pio.h" #include "video/ef9365.h" #include "video/scn2674.h" @@ -30,18 +31,37 @@ protected: virtual void device_start() override; virtual void device_reset() override; virtual void device_add_mconfig(machine_config &config) override; + virtual const tiny_rom_entry *device_rom_region() const override; private: - void char_w(u8 data); - void attr_w(u8 data); - void scroll_w(u8 data); + void char_w(u8 data) { m_avdc->buffer_w(data); } + void attr_w(u8 data) { m_avdc->attr_buffer_w(data); } + void scroll_w(u8 data) { m_scroll = data; } + u8 common_r() { m_common ^= 0x10; return m_common; } + void porta_w(u8 data); + void portb_w(u8 data); + void vram_w(offs_t offset, u8 data); + u8 vram_r(offs_t offset); + void msl_w(u8 data); void gdc_map(address_map &map); void int_w(int state) { m_bus->int_w(state); } void nmi_w(int state) { m_bus->nmi_w(state); } + SCN2674_DRAW_CHARACTER_MEMBER(draw_character); + TIMER_DEVICE_CALLBACK_MEMBER(scanline) { m_gdc->update_scanline(param); } + + void char_map(address_map &map); + void attr_map(address_map &map); + required_device m_gdc; - //required_device m_avdc; + memory_share_creator m_vram; + required_device m_avdc; required_device m_pio; + required_device m_palette; + required_region_ptr m_p_chargen; + + u8 m_scroll; + u8 m_common; }; @@ -49,8 +69,13 @@ idpartner_gdp_device::idpartner_gdp_device(const machine_config &mconfig, const : device_t(mconfig, IDPARTNER_GDP, tag, owner, clock) , bus::idpartner::device_exp_card_interface(mconfig, *this) , m_gdc(*this, "gdc") - //, m_avdc(*this, "avdc") + , m_vram(*this, "vram", 0x20000, ENDIANNESS_LITTLE) + , m_avdc(*this, "avdc") , m_pio(*this, "pio") + , m_palette(*this, "palette") + , m_p_chargen(*this, "chargen") + , m_scroll(0) + , m_common(0) { } @@ -60,6 +85,7 @@ idpartner_gdp_device::idpartner_gdp_device(const machine_config &mconfig, const void idpartner_gdp_device::device_start() { + save_item(NAME(m_scroll)); } void idpartner_gdp_device::device_reset() @@ -71,27 +97,99 @@ void idpartner_gdp_device::device_reset() m_bus->io().install_write_handler(0x34, 0x34, emu::rw_delegate(*this, FUNC(idpartner_gdp_device::char_w))); // char reg m_bus->io().install_write_handler(0x35, 0x35, emu::rw_delegate(*this, FUNC(idpartner_gdp_device::attr_w))); // attr reg m_bus->io().install_write_handler(0x36, 0x36, emu::rw_delegate(*this, FUNC(idpartner_gdp_device::scroll_w))); // scroll reg/common input - //map(0x38,0x3f).rw(m_avdc, FUNC(scn2674_device::read), FUNC(scn2674_device::write)); // AVDC SCN2674 + m_bus->io().install_read_handler (0x36, 0x36, emu::rw_delegate(*this, FUNC(idpartner_gdp_device::common_r))); // common input + m_bus->io().install_read_handler (0x38, 0x3f, emu::rw_delegate(m_avdc, FUNC(scn2674_device::read))); // AVDC SCN2674 + m_bus->io().install_write_handler(0x38, 0x3f, emu::rw_delegate(m_avdc, FUNC(scn2674_device::write))); // AVDC SCN2674 } -void idpartner_gdp_device::char_w(u8 data) +void idpartner_gdp_device::porta_w(u8 data) { - //printf("char:%02x\n",data); + //printf("porta_w:%02x\n",data); } -void idpartner_gdp_device::attr_w(u8 data) +void idpartner_gdp_device::portb_w(u8 data) { - //printf("attr:%02x\n",data); + //printf("portb_w:%02x\n",data); } -void idpartner_gdp_device::scroll_w(u8 data) +void idpartner_gdp_device::msl_w(u8 data) { - //printf("scroll:%02x\n",data); + //printf("msl_w:%02x\n",data); } +void idpartner_gdp_device::vram_w(offs_t offset, u8 data) +{ + u16 addr = (m_scroll << 7) - offset; + m_vram[addr] = data; +} + +u8 idpartner_gdp_device::vram_r(offs_t offset) +{ + u16 addr = (m_scroll << 7) - offset; + return m_vram[addr]; +} + +// 16 * 4164 DRAM void idpartner_gdp_device::gdc_map(address_map &map) { - map(0x0000, 0x1ffff).ram(); + map(0x0000, 0x1ffff).rw(FUNC(idpartner_gdp_device::vram_r), FUNC(idpartner_gdp_device::vram_w)); +} + + +// 2 * 6116 SRAM for chars +void idpartner_gdp_device::char_map(address_map &map) +{ + map(0x0000, 0x0fff).ram().share("charram"); + map(0x1000, 0x2fff).ram(); // TODO: Check in schematics +} + +// 2 * 6116 SRAM for attributes +void idpartner_gdp_device::attr_map(address_map &map) +{ + map(0x0000, 0x0fff).ram().share("attrmap"); + map(0x1000, 0x2fff).ram(); // TODO: Check in schematics +} + +/* F4 Character Displayer */ +static const gfx_layout gdp_charlayout = +{ + 8, 12, /* 8 x 12 characters */ + 256, /* 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 }, + 8*16 /* every char takes 16 bytes */ +}; + +static GFXDECODE_START( gfx_partner ) + GFXDECODE_ENTRY( "chargen", 0x0000, gdp_charlayout, 0, 1 ) +GFXDECODE_END + +// one 2732 EPROM for chargen +ROM_START(gdp_char_rom) + ROM_REGION( 0x1000, "chargen",0 ) + ROM_LOAD( "gdp_chgi.ic46", 0x0000, 0x1000, CRC(f4aaf0dd) SHA1(7c7c2d855fdfb90c86ed47c1b33c354c922ed4d0)) +ROM_END + +const tiny_rom_entry *idpartner_gdp_device::device_rom_region() const +{ + return ROM_NAME( gdp_char_rom ); +} + +SCN2674_DRAW_CHARACTER_MEMBER( idpartner_gdp_device::draw_character ) +{ + uint16_t data = m_p_chargen[charcode << 4 | linecount]; + const pen_t *const pen = m_palette->pens(); + + if (cursor) + data = ~data; + + // draw 9 pixels of the character + for (int i = 0; i < 9; i++) + bitmap.pix(y, x + i) = BIT(data, i) ? pen[0] : pen[1]; } void idpartner_gdp_device::device_add_mconfig(machine_config &config) @@ -100,25 +198,42 @@ void idpartner_gdp_device::device_add_mconfig(machine_config &config) screen.set_screen_update(m_gdc, FUNC(ef9365_device::screen_update)); screen.set_size(1024, 512); screen.set_visarea(0, 1024-1, 0, 512-1); - screen.set_refresh_hz(25); + screen.set_refresh_hz(50); PALETTE(config, "palette", palette_device::MONOCHROME_INVERTED); + + screen_device &screen2(SCREEN(config, "screen2", SCREEN_TYPE_RASTER, rgb_t::green())); + screen2.set_screen_update(m_avdc, FUNC(scn2674_device::screen_update)); + screen2.set_size(1024, 512); + screen2.set_visarea(0, 1024-1, 0, 512-1); + screen2.set_refresh_hz(50); + + GFXDECODE(config, "gfxdecode", "palette", gfx_partner); + EF9365(config, m_gdc, XTAL(24'000'000) / 16); // EF9367 1.5 MHz m_gdc->set_screen("screen"); m_gdc->set_addrmap(0, &idpartner_gdp_device::gdc_map); m_gdc->set_palette_tag("palette"); m_gdc->set_nb_bitplanes(1); m_gdc->set_display_mode(ef9365_device::DISPLAY_MODE_1024x512); + m_gdc->write_msl().set(FUNC(idpartner_gdp_device::msl_w)); - //SCN2674(config, m_avdc, XTAL(24'000'000) / 16); // SCN2674B - //m_avdc->set_screen("screen"); - //m_avdc->set_character_width(12); - //m_avdc->intr_callback().set(FUNC(idpartner_gdp_device::nmi_w)); + TIMER(config, "scanline").configure_scanline(FUNC(idpartner_gdp_device::scanline), "screen", 0, 1); + + SCN2674(config, m_avdc, XTAL(24'000'000) / 16); // SCN2674B + m_avdc->set_screen("screen2"); + m_avdc->set_character_width(12); + m_avdc->set_addrmap(0, &idpartner_gdp_device::char_map); + m_avdc->set_addrmap(1, &idpartner_gdp_device::attr_map); + m_avdc->set_display_callback(FUNC(idpartner_gdp_device::draw_character)); + //m_avdc->intr_callback().set(FUNC(idpartner_gdp_device::nmi_w)); Z80PIO(config, m_pio, XTAL(8'000'000) / 2); m_pio->out_int_callback().set(FUNC(idpartner_gdp_device::int_w)); + m_pio->out_pa_callback().set(FUNC(idpartner_gdp_device::porta_w)); + m_pio->out_pb_callback().set(FUNC(idpartner_gdp_device::portb_w)); } } // anonymous namespace -DEFINE_DEVICE_TYPE_PRIVATE(IDPARTNER_GDP, bus::idpartner::device_exp_card_interface, idpartner_gdp_device, "gdp", "Iskra Delta Partner GDP") +DEFINE_DEVICE_TYPE_PRIVATE(IDPARTNER_GDP, bus::idpartner::device_exp_card_interface, idpartner_gdp_device, "partner_gdp", "Iskra Delta Partner GDP") diff --git a/src/devices/video/scn2674.h b/src/devices/video/scn2674.h index ebcea6915b8..0304982bbc0 100644 --- a/src/devices/video/scn2674.h +++ b/src/devices/video/scn2674.h @@ -33,9 +33,9 @@ public: uint8_t read(offs_t offset); void write(offs_t offset, uint8_t data); uint8_t buffer_r() { return m_char_buffer; } - void buffer_w(offs_t offset, uint8_t data) { m_char_buffer = data; } + void buffer_w(uint8_t data) { m_char_buffer = data; } uint8_t attr_buffer_r() { return m_attr_buffer; } - void attr_buffer_w(offs_t offset, uint8_t data) { m_attr_buffer = data; } + void attr_buffer_w(uint8_t data) { m_attr_buffer = data; } uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);