From 968dab48d8259a26fc602f85319dd7b819406f62 Mon Sep 17 00:00:00 2001 From: cracyc Date: Thu, 14 Feb 2019 22:15:46 -0600 Subject: [PATCH] tandy2k: add graphics adapter [Carl] --- src/mame/drivers/tandy2k.cpp | 113 ++++++++++++++++++++--------------- src/mame/includes/tandy2k.h | 15 +++-- 2 files changed, 77 insertions(+), 51 deletions(-) diff --git a/src/mame/drivers/tandy2k.cpp b/src/mame/drivers/tandy2k.cpp index ce2a717e810..77546de9ab5 100644 --- a/src/mame/drivers/tandy2k.cpp +++ b/src/mame/drivers/tandy2k.cpp @@ -219,30 +219,6 @@ READ8_MEMBER( tandy2k_state::kbint_clr_r ) return 0xff; } -READ16_MEMBER( tandy2k_state::vpac_r ) -{ - if (ACCESSING_BITS_0_7) - { - return m_vpac->read(space, offset); - } - else - { - return 0xff00; - } -} - -WRITE16_MEMBER( tandy2k_state::vpac_w ) -{ - if (ACCESSING_BITS_0_7) - { - m_vpac->write(space, offset, data & 0xff); - } - else - { - addr_ctrl_w(space, offset, data >> 8); - } -} - READ8_MEMBER( tandy2k_state::fldtc_r ) { if (LOG) logerror("FLDTC\n"); @@ -306,11 +282,16 @@ WRITE8_MEMBER( tandy2k_state::addr_ctrl_w ) // Memory Maps +void tandy2k_state::vrambank_mem(address_map &map) +{ + map(0x00000, 0x17fff).ram().share("hires_ram"); + map(0x18000, 0x1ffff).noprw(); +} + void tandy2k_state::tandy2k_mem(address_map &map) { map.unmap_value_high(); -// AM_RANGE(0x00000, 0xdffff) AM_RAM - map(0xe0000, 0xf7fff).ram().share("hires_ram"); + map(0xe0000, 0xe7fff).rw(m_vrambank, FUNC(address_map_bank_device::read16), FUNC(address_map_bank_device::write16)); map(0xf8000, 0xfbfff).rw(FUNC(tandy2k_state::char_ram_r), FUNC(tandy2k_state::char_ram_w)).umask16(0x00ff); map(0xfc000, 0xfdfff).mirror(0x2000).rom().region(I80186_TAG, 0); } @@ -329,12 +310,11 @@ void tandy2k_state::tandy2k_io(address_map &map) map(0x00060, 0x00063).mirror(0xc).rw(m_pic0, FUNC(pic8259_device::read), FUNC(pic8259_device::write)).umask16(0x00ff); map(0x00070, 0x00073).mirror(0xc).rw(m_pic1, FUNC(pic8259_device::read), FUNC(pic8259_device::write)).umask16(0x00ff); map(0x00080, 0x00080).mirror(0xe).rw(m_fdc, FUNC(i8272a_device::mdma_r), FUNC(i8272a_device::mdma_w)); -// AM_RANGE(0x00100, 0x0017f) AM_DEVREADWRITE8(CRT9007_TAG, crt9007_t, read, write, 0x00ff) AM_WRITE8(addr_ctrl_w, 0xff00) - map(0x00100, 0x0017f).rw(FUNC(tandy2k_state::vpac_r), FUNC(tandy2k_state::vpac_w)); -// AM_RANGE(0x00180, 0x00180) AM_READ8(hires_status_r, 0x00ff) -// AM_RANGE(0x00180, 0x001bf) AM_WRITE(hires_palette_w) -// AM_RANGE(0x001a0, 0x001a0) AM_READ8(hires_plane_w, 0x00ff) -// AM_RANGE(0x0ff00, 0x0ffff) AM_READWRITE(i186_internal_port_r, i186_internal_port_w) + map(0x00100, 0x0017f).rw(m_vpac, FUNC(crt9007_device::read), FUNC(crt9007_device::write)).umask16(0x00ff); + map(0x00100, 0x0017f).w(FUNC(tandy2k_state::addr_ctrl_w)).umask16(0xff00); + map(0x00180, 0x00180).r(FUNC(tandy2k_state::hires_status_r)).umask16(0x00ff); + map(0x00190, 0x0019f).w(m_colpal, FUNC(palette_device::write8)).umask16(0x00ff).share("colpal"); + map(0x001a0, 0x001a0).w(FUNC(tandy2k_state::hires_plane_w)).umask16(0x00ff); } void tandy2k_state::tandy2k_hd_io(address_map &map) @@ -361,7 +341,7 @@ INPUT_PORTS_END uint32_t tandy2k_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { - const pen_t *pen = m_palette->pens(); + const pen_t *cpen = m_colpal->pens(); address_space &program = m_maincpu->space(AS_PROGRAM); for (int y = 0; y < 400; y++) @@ -370,18 +350,32 @@ uint32_t tandy2k_state::screen_update(screen_device &screen, bitmap_rgb32 &bitma for (int sx = 0; sx < 80; sx++) { - offs_t addr = m_ram->size() - 0x1400 + (((y / 16) * 80) + sx) * 2; - uint16_t vidla = program.read_word(addr); - uint8_t attr = vidla >> 8; - uint8_t data = m_char_ram[((vidla & 0xff) << 4) | cgra]; - if(attr & 0x80) - data = ~data; - - for (int x = 0; x < 8; x++) + if (m_hires_en & 2) { - int color = BIT(data, 7); - bitmap.pix32(y, (sx * 8) + x) = pen[color]; - data <<= 1; + uint8_t a = ((uint8_t *)m_hires_ram.target())[(y * 80) + sx]; + uint8_t b = ((uint8_t *)m_hires_ram.target())[(y * 80) + sx + 0x8000]; + uint8_t c = ((uint8_t *)m_hires_ram.target())[(y * 80) + sx + 0x8000 * 2]; + for (int x = 0; x < 8; x++) + { + int color = BIT(a, x) | (BIT(b, x) << 1) | (BIT(c, x) << 2); + bitmap.pix32(y, (sx * 8) + (7 - x)) = cpen[color]; + } + } + else + { + offs_t addr = m_ram->size() - 0x1400 + (((y / 16) * 80) + sx) * 2; + uint16_t vidla = program.read_word(addr); + uint8_t attr = vidla >> 8; + uint8_t data = m_char_ram[((vidla & 0xff) << 4) | cgra]; + if(attr & 0x80) + data = ~data; + + for (int x = 0; x < 8; x++) + { + int color = 4 | (BIT(attr, 6) << 1) | BIT(data, 7); + bitmap.pix32(y, (sx * 8) + x) = cpen[color]; + data <<= 1; + } } } } @@ -429,6 +423,23 @@ WRITE_LINE_MEMBER( tandy2k_state::vpac_sld_w ) m_vac->sld_w(state); } +WRITE8_MEMBER( tandy2k_state::hires_plane_w ) +{ + int bank = 3; + if (((data & 1) + ((data >> 1) & 1) + ((data >> 2) & 1)) == 1) + bank = (data & 1) ? 0 : (data & 2) ? 1 : (data & 4) ? 2 : 0; + m_vrambank->set_bank(bank); + m_hires_en = (data >> 4) & 3; +} + +// bit 0 - 0 = hires board installed +// bit 1 - 0 = 1 plane, 1 = 3 planes +// bit 2-4 - board rev +READ8_MEMBER( tandy2k_state::hires_status_r ) +{ + return 2; +} + WRITE8_MEMBER( tandy2k_state::vidla_w ) { m_vidla = data; @@ -463,7 +474,7 @@ WRITE8_MEMBER( tandy2k_state::drb_attr_w ) CRT9021_DRAW_CHARACTER_MEMBER( tandy2k_state::vac_draw_character ) { - const pen_t *pen = m_palette->pens(); + const pen_t *pen = m_colpal->pens(); for (int i = 0; i < 8; i++) { @@ -744,6 +755,7 @@ void tandy2k_state::machine_start() program.install_ram(0x00000, ram_size - 1, ram); m_char_ram.allocate(0x1000); + m_hires_en = 0; // register for state saving save_item(NAME(m_dma_mux)); @@ -766,6 +778,12 @@ void tandy2k_state::device_reset_after_children() m_pc_keyboard->enable(0); } +rgb_t tandy2k_state::IRGB(uint32_t raw) +{ + uint8_t i = (raw >> 3) & 1; + return rgb_t(pal2bit(((raw & 4) >> 1) | i), pal2bit((raw & 2) | i), pal2bit(((raw & 1) << 1) | i)); +} + // Machine Driver void tandy2k_state::tandy2k(machine_config &config) @@ -778,7 +796,6 @@ void tandy2k_state::tandy2k(machine_config &config) // video hardware screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER)); - screen.set_color(rgb_t::green()); screen.set_refresh_hz(50); screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); // not accurate screen.set_size(640, 400); @@ -786,7 +803,7 @@ void tandy2k_state::tandy2k(machine_config &config) //screen.set_screen_update(CRT9021B_TAG, FUNC(crt9021_device::screen_update)); screen.set_screen_update(FUNC(tandy2k_state::screen_update)); - PALETTE(config, m_palette, palette_device::MONOCHROME); + PALETTE(config, m_colpal).set_format(1, &tandy2k_state::IRGB, 8); crt9007_device &vpac(CRT9007(config, CRT9007_TAG, 16_MHz_XTAL * 28 / 20 / 8)); vpac.set_addrmap(0, &tandy2k_state::vpac_mem); @@ -813,6 +830,8 @@ void tandy2k_state::tandy2k(machine_config &config) CRT9021(config, m_vac, 16_MHz_XTAL * 28 / 20); m_vac->set_screen(SCREEN_TAG); + ADDRESS_MAP_BANK(config, m_vrambank).set_map(&tandy2k_state::vrambank_mem).set_options(ENDIANNESS_LITTLE, 16, 17, 0x8000); + TIMER(config, "vidldsh").configure_generic(FUNC(tandy2k_state::vidldsh_tick)); // sound hardware diff --git a/src/mame/includes/tandy2k.h b/src/mame/includes/tandy2k.h index 3029976842c..22fe23caa02 100644 --- a/src/mame/includes/tandy2k.h +++ b/src/mame/includes/tandy2k.h @@ -19,6 +19,7 @@ #include "machine/tandy2kb.h" #include "machine/timer.h" #include "machine/upd765.h" +#include "machine/bankdev.h" #include "sound/spkrdev.h" #include "video/crt9007.h" #include "video/crt9021.h" @@ -58,7 +59,8 @@ public: m_drb0(*this, CRT9212_0_TAG), m_drb1(*this, CRT9212_1_TAG), m_vac(*this, CRT9021B_TAG), - m_palette(*this, "palette"), + m_colpal(*this, "colpal"), + m_vrambank(*this, "vrambank"), m_timer_vidldsh(*this, "vidldsh"), m_centronics(*this, CENTRONICS_TAG), m_speaker(*this, "speaker"), @@ -121,7 +123,8 @@ private: required_device m_drb0; required_device m_drb1; required_device m_vac; - required_device m_palette; + required_device m_colpal; + required_device m_vrambank; required_device m_timer_vidldsh; required_device m_centronics; required_device m_speaker; @@ -150,8 +153,6 @@ private: DECLARE_WRITE8_MEMBER( enable_w ); DECLARE_WRITE8_MEMBER( dma_mux_w ); DECLARE_READ8_MEMBER( kbint_clr_r ); - DECLARE_READ16_MEMBER( vpac_r ); - DECLARE_WRITE16_MEMBER( vpac_w ); DECLARE_READ8_MEMBER( fldtc_r ); DECLARE_WRITE8_MEMBER( fldtc_w ); DECLARE_WRITE8_MEMBER( addr_ctrl_w ); @@ -168,6 +169,9 @@ private: DECLARE_WRITE_LINE_MEMBER( vpac_cblank_w ); DECLARE_WRITE_LINE_MEMBER( vpac_slg_w ); DECLARE_WRITE_LINE_MEMBER( vpac_sld_w ); + DECLARE_READ8_MEMBER( hires_status_r ); + DECLARE_WRITE8_MEMBER( hires_plane_w ); + DECLARE_WRITE8_MEMBER( hires_palette_w ); DECLARE_WRITE8_MEMBER( vidla_w ); DECLARE_WRITE8_MEMBER( drb_attr_w ); DECLARE_WRITE_LINE_MEMBER( kbdclk_w ); @@ -183,6 +187,7 @@ private: CRT9021_DRAW_CHARACTER_MEMBER( vac_draw_character ); TIMER_DEVICE_CALLBACK_MEMBER( vidldsh_tick ); DECLARE_FLOPPY_FORMATS( floppy_formats ); + static rgb_t IRGB(uint32_t raw); enum { @@ -223,6 +228,7 @@ private: int m_sld; uint8_t m_cgra; uint8_t m_vidla; + uint8_t m_hires_en; /* sound state */ int m_outspkr; @@ -238,6 +244,7 @@ private: void tandy2k_io(address_map &map); void tandy2k_mem(address_map &map); void vpac_mem(address_map &map); + void vrambank_mem(address_map &map); }; #endif // MAME_INCLUDES_TANDY2K_H