diff options
| author | 2019-09-20 10:51:01 -0400 | |
|---|---|---|
| committer | 2019-09-20 10:51:01 -0400 | |
| commit | 4fb774ffcc152869e112b283eee3193c4e482eaf (patch) | |
| tree | b73cc7cefba65e800e257e2dc61aa36353f33035 | |
| parent | 0917a7295fc020a3ea41948e5e3e90c84d8ed485 (diff) | |
acorn_vidc: Internalize palette; externalize screen (nw)
| -rw-r--r-- | src/devices/video/acorn_vidc.cpp | 61 | ||||
| -rw-r--r-- | src/devices/video/acorn_vidc.h | 8 | ||||
| -rw-r--r-- | src/mame/drivers/aa310.cpp | 9 | ||||
| -rw-r--r-- | src/mame/drivers/aristmk5.cpp | 5 | ||||
| -rw-r--r-- | src/mame/drivers/ertictac.cpp | 10 |
5 files changed, 61 insertions, 32 deletions
diff --git a/src/devices/video/acorn_vidc.cpp b/src/devices/video/acorn_vidc.cpp index 261ac48fd96..7347688fa53 100644 --- a/src/devices/video/acorn_vidc.cpp +++ b/src/devices/video/acorn_vidc.cpp @@ -20,6 +20,7 @@ #include "emu.h" #include "acorn_vidc.h" +#include "screen.h" //************************************************************************** @@ -53,10 +54,9 @@ void acorn_vidc10_device::regs_map(address_map &map) acorn_vidc10_device::acorn_vidc10_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, type, tag, owner, clock) , device_memory_interface(mconfig, *this) + , device_palette_interface(mconfig, *this) , device_video_interface(mconfig, *this) - , m_screen(*this, "screen") , m_space_config("regs_space", ENDIANNESS_LITTLE, 32, 8, 0, address_map_constructor(FUNC(acorn_vidc10_device::regs_map), this)) - , m_palette(*this, "palette") , m_lspeaker(*this, "lspeaker") , m_rspeaker(*this, "rspeaker") , m_dac(*this, "dac%u", 0) @@ -91,14 +91,6 @@ device_memory_interface::space_config_vector acorn_vidc10_device::memory_space_c void acorn_vidc10_device::device_add_mconfig(machine_config &config) { - SCREEN(config, m_screen, SCREEN_TYPE_RASTER); - m_screen->set_raw(XTAL(16'000'000), 1024,0,735, 624/2,0,292); // RiscOS 3 default screen settings - m_screen->set_screen_update(FUNC(acorn_vidc10_device::screen_update)); -// m_screen->screen_vblank().set(FUNC(acorn_vidc10_device::screen_vblank)); - - // 8bpp + 1/2/4bpp + 2bpp for cursor - PALETTE(config, m_palette, palette_device::BLACK).set_entries(0x100+0x10+4); - SPEAKER(config, m_lspeaker).front_left(); SPEAKER(config, m_rspeaker).front_right(); voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0)); @@ -113,10 +105,32 @@ void acorn_vidc10_device::device_add_mconfig(machine_config &config) void acorn_vidc10_lcd_device::device_add_mconfig(machine_config &config) { acorn_vidc10_device::device_add_mconfig(config); - m_screen->set_type(SCREEN_TYPE_LCD); // TODO: verify !Configure with automatic type detection, there must be an ID telling this is a LCD machine. } +uint32_t acorn_vidc10_device::palette_entries() const +{ + return 0x100+0x10+4; // 8bpp + 1/2/4bpp + 2bpp for cursor +} + +//------------------------------------------------- +// device_config_complete - perform any +// operations now that the configuration is +// complete +//------------------------------------------------- + +void acorn_vidc10_device::device_config_complete() +{ + if (!has_screen()) + return; + + if (!screen().refresh_attoseconds()) + screen().set_raw(clock() * 2 / 3, 1024,0,735, 624/2,0,292); // RiscOS 3 default screen settings + + if (!screen().has_screen_update()) + screen().set_screen_update(screen_update_rgb32_delegate(FUNC(acorn_vidc10_device::screen_update), this)); +} + //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- @@ -125,7 +139,10 @@ void acorn_vidc10_device::device_start() { m_vblank_cb.resolve_safe(); m_sound_drq_cb.resolve_safe(); - + + for (int i = 0; i < entries(); i++) + set_pen_color(i, rgb_t::black()); + save_item(NAME(m_bpp_mode)); save_item(NAME(m_crtc_interlace)); save_item(NAME(m_pixel_clock)); @@ -185,7 +202,7 @@ void acorn_vidc10_device::device_timer(emu_timer &timer, device_timer_id id, int inline void acorn_vidc10_device::screen_vblank_line_update() { int vline = (m_crtc_regs[CRTC_VDER]) * (m_crtc_interlace + 1); - m_video_timer->adjust((vline > 2) ? m_screen->time_until_pos(vline) : attotime::never); + m_video_timer->adjust((vline > 2) ? screen().time_until_pos(vline) : attotime::never); } void acorn_vidc10_device::screen_dynamic_res_change() @@ -225,7 +242,7 @@ void acorn_vidc10_device::screen_dynamic_res_change() attoseconds_t const refresh = HZ_TO_ATTOSECONDS(pixel_rate[m_pixel_clock]) * m_crtc_regs[CRTC_HCR] * m_crtc_regs[CRTC_VCR]; - m_screen->configure(m_crtc_regs[CRTC_HCR], m_crtc_regs[CRTC_VCR] * (m_crtc_interlace+1), visarea, refresh); + screen().configure(m_crtc_regs[CRTC_HCR], m_crtc_regs[CRTC_VCR] * (m_crtc_interlace+1), visarea, refresh); } //************************************************************************** @@ -251,14 +268,14 @@ inline void acorn_vidc10_device::update_4bpp_palette(uint16_t index, uint32_t pa g = (paldata & 0x00f0) >> 4; r = (paldata & 0x000f) >> 0; - m_palette->set_pen_color(index, pal4bit(r), pal4bit(g), pal4bit(b) ); - m_screen->update_partial(m_screen->vpos()); + set_pen_color(index, pal4bit(r), pal4bit(g), pal4bit(b) ); + screen().update_partial(screen().vpos()); } WRITE32_MEMBER( acorn_vidc10_device::pal_data_display_w ) { update_4bpp_palette(offset+0x100, data); - //printf("%02x: %01x %01x %01x [%d]\n",offset,r,g,b,m_screen->vpos()); + //printf("%02x: %01x %01x %01x [%d]\n",offset,r,g,b,screen().vpos()); // 8bpp for(int idx=0;idx<0x100;idx+=0x10) @@ -267,7 +284,7 @@ WRITE32_MEMBER( acorn_vidc10_device::pal_data_display_w ) int g = ((data & 0x030) >> 4) | ((idx & 0x60) >> 3); int r = ((data & 0x007) >> 0) | ((idx & 0x10) >> 1); - m_palette->set_pen_color(offset + idx, pal4bit(r), pal4bit(g), pal4bit(b) ); + set_pen_color(offset + idx, pal4bit(r), pal4bit(g), pal4bit(b) ); } } @@ -458,9 +475,9 @@ void acorn_vidc10_device::draw(bitmap_rgb32 &bitmap, const rectangle &cliprect, if (is_cursor == true && dot == 0) continue; dot += pen_base; - bitmap.pix32(dsty, dstx+xi) = m_palette->pen(dot); + bitmap.pix32(dsty, dstx+xi) = this->pen(dot); if (m_crtc_interlace) - bitmap.pix32(dsty+1, dstx+xi) = m_palette->pen(dot); + bitmap.pix32(dsty+1, dstx+xi) = this->pen(dot); } } } @@ -474,7 +491,7 @@ u32 acorn_vidc10_device::screen_update(screen_device &screen, bitmap_rgb32 &bitm const uint8_t x_step[4] = { 19, 11, 7, 5 }; /* border color */ - bitmap.fill(m_palette->pen(0x110), cliprect); + bitmap.fill(pen(0x110), cliprect); /* define X display area through BPP mode register */ calc_dxs = (m_crtc_regs[CRTC_HDSR]*2)+x_step[m_bpp_mode & 3]; @@ -512,7 +529,7 @@ u32 acorn_vidc10_device::screen_update(screen_device &screen, bitmap_rgb32 &bitm READ_LINE_MEMBER(acorn_vidc10_device::flyback_r ) { - int vert_pos = m_screen->vpos(); + int vert_pos = screen().vpos(); bool flyback = (vert_pos <= m_crtc_regs[CRTC_VDSR] || vert_pos >= m_crtc_regs[CRTC_VDER]); return flyback; } diff --git a/src/devices/video/acorn_vidc.h b/src/devices/video/acorn_vidc.h index ca4f4d07bcc..08bf93dd571 100644 --- a/src/devices/video/acorn_vidc.h +++ b/src/devices/video/acorn_vidc.h @@ -11,9 +11,7 @@ #pragma once -#include "screen.h" #include "speaker.h" -#include "emupal.h" #include "sound/dac.h" #include "sound/volt_reg.h" @@ -31,6 +29,7 @@ class acorn_vidc10_device : public device_t, public device_memory_interface, + public device_palette_interface, public device_video_interface { public: @@ -57,20 +56,19 @@ protected: // device-level overrides //virtual void device_validity_check(validity_checker &valid) const override; virtual void device_add_mconfig(machine_config &config) override; + virtual uint32_t palette_entries() const override; + virtual void device_config_complete() override; virtual void device_start() override; virtual void device_reset() override; virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; virtual space_config_vector memory_space_config() const override; u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); - required_device<screen_device> m_screen; - private: const address_space_config m_space_config; void regs_map(address_map &map); - required_device<palette_device> m_palette; required_device<speaker_device> m_lspeaker; required_device<speaker_device> m_rspeaker; required_device_array<dac_16bit_r2r_twos_complement_device, 8> m_dac; diff --git a/src/mame/drivers/aa310.cpp b/src/mame/drivers/aa310.cpp index 22e52c76b56..497a79347ed 100644 --- a/src/mame/drivers/aa310.cpp +++ b/src/mame/drivers/aa310.cpp @@ -95,6 +95,7 @@ #include "machine/ram.h" #include "machine/wd_fdc.h" #include "sound/volt_reg.h" +#include "screen.h" #include "softlist.h" #include "speaker.h" @@ -428,7 +429,10 @@ void aa310_state::aa310(machine_config &config) I2CMEM(config, "i2cmem", 0).set_data_size(0x100); - ACORN_VIDC10(config, m_vidc, 0); + SCREEN(config, "screen", SCREEN_TYPE_RASTER); + + ACORN_VIDC10(config, m_vidc, 24_MHz_XTAL); + m_vidc->set_screen("screen"); m_vidc->vblank().set(FUNC(aa310_state::vblank_irq)); m_vidc->sound_drq().set(FUNC(aa310_state::sound_drq)); @@ -528,7 +532,10 @@ void aa310_state::aa4(machine_config &config) m_maincpu->set_clock(24_MHz_XTAL); // ARM3 /* video hardware */ + SCREEN(config.replace(), "screen", SCREEN_TYPE_LCD); + ACORN_VIDC10_LCD(config.replace(), m_vidc, 0); + m_vidc->set_screen("screen"); m_vidc->vblank().set(FUNC(aa310_state::vblank_irq)); m_vidc->sound_drq().set(FUNC(aa310_state::sound_drq)); diff --git a/src/mame/drivers/aristmk5.cpp b/src/mame/drivers/aristmk5.cpp index 1c1b03173b4..92aa610addd 100644 --- a/src/mame/drivers/aristmk5.cpp +++ b/src/mame/drivers/aristmk5.cpp @@ -2292,7 +2292,10 @@ void aristmk5_state::aristmk5(machine_config &config) /* TODO: this isn't supposed to access a keyboard ... */ AAKART(config, m_kart, 12000000/128); // TODO: frequency - ACORN_VIDC10(config, m_vidc, 0); + SCREEN(config, "screen", SCREEN_TYPE_RASTER); + + ACORN_VIDC10(config, m_vidc, MASTER_CLOCK/3); + m_vidc->set_screen("screen"); m_vidc->vblank().set(FUNC(aristmk5_state::vblank_irq)); m_vidc->sound_drq().set(FUNC(aristmk5_state::sound_drq)); diff --git a/src/mame/drivers/ertictac.cpp b/src/mame/drivers/ertictac.cpp index d9be8882e3a..6b2ec938466 100644 --- a/src/mame/drivers/ertictac.cpp +++ b/src/mame/drivers/ertictac.cpp @@ -27,6 +27,7 @@ PCB has a single OSC at 24MHz #include "cpu/arm/arm.h" #include "machine/aakart.h" #include "machine/i2cmem.h" +#include "screen.h" class ertictac_state : public archimedes_state @@ -224,15 +225,18 @@ INTERRUPT_GEN_MEMBER(ertictac_state::ertictac_podule_irq) void ertictac_state::ertictac(machine_config &config) { - ARM(config, m_maincpu, XTAL(24'000'000)/3); /* guess, 12MHz 8MHz or 6MHz, what's the correct divider 2, 3 or 4? */ + ARM(config, m_maincpu, 24_MHz_XTAL/3); /* guess, 12MHz 8MHz or 6MHz, what's the correct divider 2, 3 or 4? */ m_maincpu->set_addrmap(AS_PROGRAM, &ertictac_state::ertictac_map); m_maincpu->set_periodic_int(FUNC(ertictac_state::ertictac_podule_irq), attotime::from_hz(60)); // FIXME: timing of this I2CMEM(config, "i2cmem", 0).set_page_size(NVRAM_PAGE_SIZE).set_data_size(NVRAM_SIZE); -// AAKART(config, m_kart, XTAL(24'000'000)/3); // TODO: frequency +// AAKART(config, m_kart, 24_MHz_XTAL/3); // TODO: frequency - ACORN_VIDC10(config, m_vidc, 0); + SCREEN(config, "screen", SCREEN_TYPE_RASTER); + + ACORN_VIDC10(config, m_vidc, 24_MHz_XTAL); + m_vidc->set_screen("screen"); m_vidc->vblank().set(FUNC(ertictac_state::vblank_irq)); m_vidc->sound_drq().set(FUNC(ertictac_state::sound_drq)); } |
