From b4bf55f37e978433ff56becd27e5434f2af9a088 Mon Sep 17 00:00:00 2001 From: Nathan Woods Date: Wed, 14 Jun 2017 18:53:15 -0400 Subject: [CoCo 3] Cleanups to the GIME implementation 1. Moved specific implementations to anonymous namespace 2. gime_base_device ==> gime_device 3. Changed a pointer to a reference --- src/mame/drivers/coco3.cpp | 2 +- src/mame/includes/coco3.h | 2 +- src/mame/video/gime.cpp | 279 ++++++++++++++++++++++----------------------- src/mame/video/gime.h | 52 ++++----- 4 files changed, 161 insertions(+), 174 deletions(-) diff --git a/src/mame/drivers/coco3.cpp b/src/mame/drivers/coco3.cpp index 25c36149853..20e3e4fca25 100644 --- a/src/mame/drivers/coco3.cpp +++ b/src/mame/drivers/coco3.cpp @@ -44,7 +44,7 @@ static ADDRESS_MAP_START( coco3_mem, AS_PROGRAM, 8, coco3_state ) AM_RANGE(0xFF20, 0xFF3F) AM_READWRITE(ff20_read, ff20_write) AM_RANGE(0xFF40, 0xFF5F) AM_READWRITE(ff40_read, ff40_write) AM_RANGE(0xFF60, 0xFF8F) AM_READWRITE(ff60_read, ff60_write) - AM_RANGE(0xFF90, 0xFFDF) AM_DEVREADWRITE(GIME_TAG, gime_base_device, read, write) + AM_RANGE(0xFF90, 0xFFDF) AM_DEVREADWRITE(GIME_TAG, gime_device, read, write) // While Tepolt and other sources say that the interrupt vectors are mapped to // the same memory accessed at $BFFx, William Astle offered evidence that this diff --git a/src/mame/includes/coco3.h b/src/mame/includes/coco3.h index 60c50fcae1b..1f642546940 100644 --- a/src/mame/includes/coco3.h +++ b/src/mame/includes/coco3.h @@ -61,7 +61,7 @@ protected: virtual void cart_w(bool line) override; private: - required_device m_gime; + required_device m_gime; }; #endif // MAME_INCLUDES_COCO3_H diff --git a/src/mame/video/gime.cpp b/src/mame/video/gime.cpp index 0009b950ea8..9f81491f556 100644 --- a/src/mame/video/gime.cpp +++ b/src/mame/video/gime.cpp @@ -2,7 +2,7 @@ // copyright-holders:Nathan Woods /********************************************************************* - gime.c + gime.cpp Implementation of CoCo GIME (Graphics Interrupt Memory Enhancement) video chip. @@ -108,14 +108,14 @@ // ctor //------------------------------------------------- -gime_base_device::gime_base_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, const uint8_t *fontdata) - : mc6847_friend_device(mconfig, type, tag, owner, clock, fontdata, true, 263, 25+192+26+3, false), - m_write_irq(*this), - m_write_firq(*this), - m_read_floating_bus(*this), - m_maincpu_tag(nullptr), - m_ram_tag(nullptr), - m_ext_tag(nullptr) +gime_device::gime_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, const uint8_t *fontdata) + : mc6847_friend_device(mconfig, type, tag, owner, clock, fontdata, true, 263, 25+192+26+3, false) + , m_write_irq(*this) + , m_write_firq(*this) + , m_read_floating_bus(*this) + , m_maincpu_tag(nullptr) + , m_ram_tag(nullptr) + , m_ext_tag(nullptr) { } @@ -125,7 +125,7 @@ gime_base_device::gime_base_device(const machine_config &mconfig, device_type ty // device_start - device-specific startup //------------------------------------------------- -void gime_base_device::device_start(void) +void gime_device::device_start(void) { // find the RAM device - make sure that it is started m_ram = machine().device(m_ram_tag); @@ -198,7 +198,7 @@ void gime_base_device::device_start(void) // update_rgb_palette //------------------------------------------------- -void gime_base_device::update_rgb_palette(void) +void gime_device::update_rgb_palette(void) { for (int color = 0; color < 64; color++) { @@ -212,7 +212,7 @@ void gime_base_device::update_rgb_palette(void) // update_composite_palette //------------------------------------------------- -void gime_base_device::update_composite_palette(void) +void gime_device::update_composite_palette(void) { for (int color = 0; color < 64; color++) { @@ -227,7 +227,7 @@ void gime_base_device::update_composite_palette(void) // get_composite_color //------------------------------------------------- -inline gime_base_device::pixel_t gime_base_device::get_composite_color(int color) +inline gime_device::pixel_t gime_device::get_composite_color(int color) { static pixel_t composite_palette[64] = { 0x000000, 0x004c00, 0x004300, 0x0a3100, 0x2f1b00, 0x550100, 0x6c0000, 0x770006, @@ -261,7 +261,7 @@ inline gime_base_device::pixel_t gime_base_device::get_composite_color(int color // get_rgb_color //------------------------------------------------- -inline gime_base_device::pixel_t gime_base_device::get_rgb_color(int color) +inline gime_device::pixel_t gime_device::get_rgb_color(int color) { return (((color >> 4) & 2) | ((color >> 2) & 1)) * 0x550000 | (((color >> 3) & 2) | ((color >> 1) & 1)) * 0x005500 @@ -274,7 +274,7 @@ inline gime_base_device::pixel_t gime_base_device::get_rgb_color(int color) // device_reset - device-specific reset //------------------------------------------------- -void gime_base_device::device_reset(void) +void gime_device::device_reset(void) { /* Tepolt verifies that the GIME registers are all cleared on initialization */ memset(m_gime_registers, 0, sizeof(m_gime_registers)); @@ -311,7 +311,7 @@ void gime_base_device::device_reset(void) // device_timer - handle timer callbacks //------------------------------------------------- -void gime_base_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +void gime_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { switch(id) { @@ -331,7 +331,7 @@ void gime_base_device::device_timer(emu_timer &timer, device_timer_id id, int pa // device_pre_save - device-specific pre save //------------------------------------------------- -void gime_base_device::device_pre_save() +void gime_device::device_pre_save() { super::device_pre_save(); @@ -345,7 +345,7 @@ void gime_base_device::device_pre_save() // device_post_load - device-specific post load //------------------------------------------------- -void gime_base_device::device_post_load() +void gime_device::device_post_load() { super::device_post_load(); update_memory(); @@ -362,7 +362,7 @@ void gime_base_device::device_post_load() // device_input_ports //------------------------------------------------- -ioport_constructor gime_base_device::device_input_ports() const +ioport_constructor gime_device::device_input_ports() const { return INPUT_PORTS_NAME(mc6847_artifacting); } @@ -394,7 +394,7 @@ ioport_constructor gime_base_device::device_input_ports() const // timer_type //------------------------------------------------- -gime_base_device::timer_type_t gime_base_device::timer_type(void) +gime_device::timer_type_t gime_device::timer_type(void) { // wraps the GIME register access and returns an enumeration return (m_gime_registers[0x01] & 0x20) ? GIME_TIMER_CLOCK : GIME_TIMER_HBORD; @@ -406,7 +406,7 @@ gime_base_device::timer_type_t gime_base_device::timer_type(void) // timer_type_string //------------------------------------------------- -const char *gime_base_device::timer_type_string(void) +const char *gime_device::timer_type_string(void) { const char *result; switch(timer_type()) @@ -429,7 +429,7 @@ const char *gime_base_device::timer_type_string(void) // timer_elapsed //------------------------------------------------- -void gime_base_device::timer_elapsed(void) +void gime_device::timer_elapsed(void) { /* reset the timer; give her another run! */ reset_timer(); @@ -448,7 +448,7 @@ void gime_base_device::timer_elapsed(void) // reset_timer //------------------------------------------------- -void gime_base_device::reset_timer(void) +void gime_device::reset_timer(void) { /* value is from 0-4095 */ m_timer_value = ((m_gime_registers[0x04] & 0x0F) * 0x100) | m_gime_registers[0x05]; @@ -491,7 +491,7 @@ void gime_base_device::reset_timer(void) // update_memory //------------------------------------------------- -inline void gime_base_device::update_memory(void) +inline void gime_device::update_memory(void) { for (int bank = 0; bank <= 8; bank++) { @@ -505,7 +505,7 @@ inline void gime_base_device::update_memory(void) // update_memory //------------------------------------------------- -void gime_base_device::update_memory(int bank) +void gime_device::update_memory(int bank) { // choose bank assert((bank >= 0) && (bank < ARRAY_LENGTH(m_read_banks)) && (bank < ARRAY_LENGTH(m_write_banks))); @@ -594,7 +594,7 @@ void gime_base_device::update_memory(int bank) // memory_pointer //------------------------------------------------- -uint8_t *gime_base_device::memory_pointer(uint32_t address) +uint8_t *gime_device::memory_pointer(uint32_t address) { return &m_ram->pointer()[address % m_ram->size()]; } @@ -605,7 +605,7 @@ uint8_t *gime_base_device::memory_pointer(uint32_t address) // update_cart_rom //------------------------------------------------- -void gime_base_device::update_cart_rom(void) +void gime_device::update_cart_rom(void) { m_cart_rom = m_cart_device->get_cart_base(); update_memory(); @@ -617,7 +617,7 @@ void gime_base_device::update_cart_rom(void) // read //------------------------------------------------- -uint8_t gime_base_device::read(offs_t offset) +uint8_t gime_device::read(offs_t offset) { uint8_t data = 0x00; @@ -649,7 +649,7 @@ uint8_t gime_base_device::read(offs_t offset) // read_gime_register //------------------------------------------------- -inline uint8_t gime_base_device::read_gime_register(offs_t offset) +inline uint8_t gime_device::read_gime_register(offs_t offset) { offset &= 0x0F; @@ -688,7 +688,7 @@ inline uint8_t gime_base_device::read_gime_register(offs_t offset) // read_mmu_register //------------------------------------------------- -inline uint8_t gime_base_device::read_mmu_register(offs_t offset) +inline uint8_t gime_device::read_mmu_register(offs_t offset) { return (m_mmu[offset & 0x0F] & 0x3F) | (read_floating_bus() & 0xC0); } @@ -699,7 +699,7 @@ inline uint8_t gime_base_device::read_mmu_register(offs_t offset) // read_palette_register //------------------------------------------------- -inline uint8_t gime_base_device::read_palette_register(offs_t offset) +inline uint8_t gime_device::read_palette_register(offs_t offset) { // Bits 7/6 are floating, and behave oddly. On a real CoCo 3 // @@ -717,7 +717,7 @@ inline uint8_t gime_base_device::read_palette_register(offs_t offset) // read_floating_bus //------------------------------------------------- -inline uint8_t gime_base_device::read_floating_bus(void) +inline uint8_t gime_device::read_floating_bus(void) { return m_read_floating_bus(0); } @@ -728,7 +728,7 @@ inline uint8_t gime_base_device::read_floating_bus(void) // write //------------------------------------------------- -void gime_base_device::write(offs_t offset, uint8_t data) +void gime_device::write(offs_t offset, uint8_t data) { switch(offset & 0xF0) { @@ -757,7 +757,7 @@ void gime_base_device::write(offs_t offset, uint8_t data) // write_gime_register //------------------------------------------------- -inline void gime_base_device::write_gime_register(offs_t offset, uint8_t data) +inline void gime_device::write_gime_register(offs_t offset, uint8_t data) { // this is needed for writes to FF95 bool timer_was_off = (m_gime_registers[0x04] == 0x00) && (m_gime_registers[0x05] == 0x00); @@ -980,7 +980,7 @@ inline void gime_base_device::write_gime_register(offs_t offset, uint8_t data) // write_mmu_register //------------------------------------------------- -inline void gime_base_device::write_mmu_register(offs_t offset, uint8_t data) +inline void gime_device::write_mmu_register(offs_t offset, uint8_t data) { offset &= 0x0F; @@ -1000,7 +1000,7 @@ inline void gime_base_device::write_mmu_register(offs_t offset, uint8_t data) // write_palette_register //------------------------------------------------- -inline void gime_base_device::write_palette_register(offs_t offset, uint8_t data) +inline void gime_device::write_palette_register(offs_t offset, uint8_t data) { offset &= 0x0F; @@ -1033,7 +1033,7 @@ inline void gime_base_device::write_palette_register(offs_t offset, uint8_t data // write_sam_register //------------------------------------------------- -inline void gime_base_device::write_sam_register(offs_t offset) +inline void gime_device::write_sam_register(offs_t offset) { /* change the SAM state */ uint16_t xorval = alter_sam_state(offset); @@ -1051,7 +1051,7 @@ inline void gime_base_device::write_sam_register(offs_t offset) // interrupt_rising_edge //------------------------------------------------- -void gime_base_device::interrupt_rising_edge(uint8_t interrupt) +void gime_device::interrupt_rising_edge(uint8_t interrupt) { // evaluate IRQ if ((m_gime_registers[0x00] & 0x20) && (m_gime_registers[0x02] & interrupt)) @@ -1067,7 +1067,7 @@ void gime_base_device::interrupt_rising_edge(uint8_t interrupt) // change_gime_irq //------------------------------------------------- -void gime_base_device::change_gime_irq(uint8_t data) +void gime_device::change_gime_irq(uint8_t data) { // did the value actually change? if (m_irq != data) @@ -1082,7 +1082,7 @@ void gime_base_device::change_gime_irq(uint8_t data) // change_gime_firq //------------------------------------------------- -void gime_base_device::change_gime_firq(uint8_t data) +void gime_device::change_gime_firq(uint8_t data) { // did the value actually change? if (m_firq != data) @@ -1107,7 +1107,7 @@ void gime_base_device::change_gime_firq(uint8_t data) // John Kowalski confirms this behavior //------------------------------------------------- -inline offs_t gime_base_device::get_video_base(void) +inline offs_t gime_device::get_video_base(void) { offs_t result; uint8_t ff9d_mask, ff9e_mask; @@ -1139,7 +1139,7 @@ inline offs_t gime_base_device::get_video_base(void) // new_frame //------------------------------------------------- -void gime_base_device::new_frame(void) +void gime_device::new_frame(void) { /* call inherited function */ super::new_frame(); @@ -1162,7 +1162,7 @@ void gime_base_device::new_frame(void) // horizontal_sync_changed //------------------------------------------------- -void gime_base_device::horizontal_sync_changed(bool line) +void gime_device::horizontal_sync_changed(bool line) { set_interrupt_value(INTERRUPT_HBORD, line); @@ -1181,7 +1181,7 @@ void gime_base_device::horizontal_sync_changed(bool line) // enter_bottom_border //------------------------------------------------- -void gime_base_device::enter_bottom_border(void) +void gime_device::enter_bottom_border(void) { set_interrupt_value(INTERRUPT_VBORD, true); set_interrupt_value(INTERRUPT_VBORD, false); @@ -1193,7 +1193,7 @@ void gime_base_device::enter_bottom_border(void) // update_border //------------------------------------------------- -void gime_base_device::update_border(uint16_t physical_scanline) +void gime_device::update_border(uint16_t physical_scanline) { uint8_t border; if (m_legacy_video) @@ -1231,7 +1231,7 @@ void gime_base_device::update_border(uint16_t physical_scanline) // record_border_scanline //------------------------------------------------- -void gime_base_device::record_border_scanline(uint16_t physical_scanline) +void gime_device::record_border_scanline(uint16_t physical_scanline) { m_line_in_row = 0; update_border(physical_scanline); @@ -1244,7 +1244,7 @@ void gime_base_device::record_border_scanline(uint16_t physical_scanline) // get_lines_per_row //------------------------------------------------- -inline uint16_t gime_base_device::get_lines_per_row(void) +inline uint16_t gime_device::get_lines_per_row(void) { uint16_t lines_per_row; if (m_legacy_video) @@ -1332,8 +1332,8 @@ inline uint16_t gime_base_device::get_lines_per_row(void) // record_scanline_res //------------------------------------------------- -template -inline uint32_t gime_base_device::record_scanline_res(int scanline) +template +inline uint32_t gime_device::record_scanline_res(int scanline) { int column; uint32_t base_offset = m_legacy_video ? 0 : (m_gime_registers[0x0F] & 0x7F) * 2; @@ -1363,7 +1363,7 @@ inline uint32_t gime_base_device::record_scanline_res(int scanline) // in legacy video modes //------------------------------------------------- -uint32_t gime_base_device::get_data_mc6847(uint32_t video_position, uint8_t *data, uint8_t *mode) +uint32_t gime_device::get_data_mc6847(uint32_t video_position, uint8_t *data, uint8_t *mode) { *data = *memory_pointer(video_position); *mode = (m_ff22_value & (MODE_AG|MODE_GM2|MODE_GM1|MODE_GM0|MODE_CSS)) @@ -1383,7 +1383,7 @@ uint32_t gime_base_device::get_data_mc6847(uint32_t video_position, uint8_t *dat // text modes without attributes //------------------------------------------------- -uint32_t gime_base_device::get_data_without_attributes(uint32_t video_position, uint8_t *data, uint8_t *mode) +uint32_t gime_device::get_data_without_attributes(uint32_t video_position, uint8_t *data, uint8_t *mode) { *data = *memory_pointer(video_position); *mode = NO_ATTRIBUTE; @@ -1397,7 +1397,7 @@ uint32_t gime_base_device::get_data_without_attributes(uint32_t video_position, // data/mode in GIME text modes with attributes //------------------------------------------------- -uint32_t gime_base_device::get_data_with_attributes(uint32_t video_position, uint8_t *data, uint8_t *mode) +uint32_t gime_device::get_data_with_attributes(uint32_t video_position, uint8_t *data, uint8_t *mode) { *data = *memory_pointer(video_position + 0); *mode = *memory_pointer(video_position + 1); @@ -1424,7 +1424,7 @@ uint32_t gime_base_device::get_data_with_attributes(uint32_t video_position, uin // record_body_scanline //------------------------------------------------- -void gime_base_device::record_body_scanline(uint16_t physical_scanline, uint16_t logical_scanline) +void gime_device::record_body_scanline(uint16_t physical_scanline, uint16_t logical_scanline) { /* update the border first */ update_border(physical_scanline); @@ -1447,7 +1447,7 @@ void gime_base_device::record_body_scanline(uint16_t physical_scanline, uint16_t case MODE_AG|MODE_GM0: case MODE_AG|MODE_GM1|MODE_GM0: case MODE_AG|MODE_GM2|MODE_GM0: - pitch = record_scanline_res<16, &gime_base_device::get_data_mc6847, true>(physical_scanline); + pitch = record_scanline_res<16, &gime_device::get_data_mc6847, true>(physical_scanline); break; case 0: @@ -1462,7 +1462,7 @@ void gime_base_device::record_body_scanline(uint16_t physical_scanline, uint16_t case MODE_AG|MODE_GM2: case MODE_AG|MODE_GM2|MODE_GM1: case MODE_AG|MODE_GM2|MODE_GM1|MODE_GM0: - pitch = record_scanline_res<32, &gime_base_device::get_data_mc6847, true>(physical_scanline); + pitch = record_scanline_res<32, &gime_device::get_data_mc6847, true>(physical_scanline); break; default: @@ -1482,14 +1482,14 @@ void gime_base_device::record_body_scanline(uint16_t physical_scanline, uint16_t /* graphics */ switch(m_gime_registers[0x09] & 0x1C) { - case 0x00: pitch = record_scanline_res< 16, &gime_base_device::get_data_without_attributes, false>(physical_scanline); break; - case 0x04: pitch = record_scanline_res< 20, &gime_base_device::get_data_without_attributes, false>(physical_scanline); break; - case 0x08: pitch = record_scanline_res< 32, &gime_base_device::get_data_without_attributes, false>(physical_scanline); break; - case 0x0C: pitch = record_scanline_res< 40, &gime_base_device::get_data_without_attributes, false>(physical_scanline); break; - case 0x10: pitch = record_scanline_res< 64, &gime_base_device::get_data_without_attributes, false>(physical_scanline); break; - case 0x14: pitch = record_scanline_res< 80, &gime_base_device::get_data_without_attributes, false>(physical_scanline); break; - case 0x18: pitch = record_scanline_res<128, &gime_base_device::get_data_without_attributes, false>(physical_scanline); break; - case 0x1C: pitch = record_scanline_res<160, &gime_base_device::get_data_without_attributes, false>(physical_scanline); break; + case 0x00: pitch = record_scanline_res< 16, &gime_device::get_data_without_attributes, false>(physical_scanline); break; + case 0x04: pitch = record_scanline_res< 20, &gime_device::get_data_without_attributes, false>(physical_scanline); break; + case 0x08: pitch = record_scanline_res< 32, &gime_device::get_data_without_attributes, false>(physical_scanline); break; + case 0x0C: pitch = record_scanline_res< 40, &gime_device::get_data_without_attributes, false>(physical_scanline); break; + case 0x10: pitch = record_scanline_res< 64, &gime_device::get_data_without_attributes, false>(physical_scanline); break; + case 0x14: pitch = record_scanline_res< 80, &gime_device::get_data_without_attributes, false>(physical_scanline); break; + case 0x18: pitch = record_scanline_res<128, &gime_device::get_data_without_attributes, false>(physical_scanline); break; + case 0x1C: pitch = record_scanline_res<160, &gime_device::get_data_without_attributes, false>(physical_scanline); break; default: fatalerror("Should not get here\n"); } @@ -1499,14 +1499,14 @@ void gime_base_device::record_body_scanline(uint16_t physical_scanline, uint16_t /* text */ switch(m_gime_registers[0x09] & 0x15) { - case 0x00: pitch = record_scanline_res< 32, &gime_base_device::get_data_without_attributes, true>(physical_scanline); break; - case 0x01: pitch = record_scanline_res< 32, &gime_base_device::get_data_with_attributes, true>(physical_scanline); break; - case 0x04: pitch = record_scanline_res< 40, &gime_base_device::get_data_without_attributes, true>(physical_scanline); break; - case 0x05: pitch = record_scanline_res< 40, &gime_base_device::get_data_with_attributes, true>(physical_scanline); break; - case 0x10: pitch = record_scanline_res< 64, &gime_base_device::get_data_without_attributes, true>(physical_scanline); break; - case 0x11: pitch = record_scanline_res< 64, &gime_base_device::get_data_with_attributes, true>(physical_scanline); break; - case 0x14: pitch = record_scanline_res< 80, &gime_base_device::get_data_without_attributes, true>(physical_scanline); break; - case 0x15: pitch = record_scanline_res< 80, &gime_base_device::get_data_with_attributes, true>(physical_scanline); break; + case 0x00: pitch = record_scanline_res< 32, &gime_device::get_data_without_attributes, true>(physical_scanline); break; + case 0x01: pitch = record_scanline_res< 32, &gime_device::get_data_with_attributes, true>(physical_scanline); break; + case 0x04: pitch = record_scanline_res< 40, &gime_device::get_data_without_attributes, true>(physical_scanline); break; + case 0x05: pitch = record_scanline_res< 40, &gime_device::get_data_with_attributes, true>(physical_scanline); break; + case 0x10: pitch = record_scanline_res< 64, &gime_device::get_data_without_attributes, true>(physical_scanline); break; + case 0x11: pitch = record_scanline_res< 64, &gime_device::get_data_with_attributes, true>(physical_scanline); break; + case 0x14: pitch = record_scanline_res< 80, &gime_device::get_data_without_attributes, true>(physical_scanline); break; + case 0x15: pitch = record_scanline_res< 80, &gime_device::get_data_with_attributes, true>(physical_scanline); break; default: fatalerror("Should not get here\n"); } @@ -1537,7 +1537,7 @@ void gime_base_device::record_body_scanline(uint16_t physical_scanline, uint16_t // record_partial_body_scanline //------------------------------------------------- -void gime_base_device::record_partial_body_scanline(uint16_t physical_scanline, uint16_t logical_scanline, int32_t start_clock, int32_t end_clock) +void gime_device::record_partial_body_scanline(uint16_t physical_scanline, uint16_t logical_scanline, int32_t start_clock, int32_t end_clock) { fatalerror("NYI"); } @@ -1548,7 +1548,7 @@ void gime_base_device::record_partial_body_scanline(uint16_t physical_scanline, // update_geometry //------------------------------------------------- -void gime_base_device::update_geometry(void) +void gime_device::update_geometry(void) { uint16_t top_border_scanlines, body_scanlines; @@ -1602,7 +1602,7 @@ void gime_base_device::update_geometry(void) // emit_dummy_samples //------------------------------------------------- -uint32_t gime_base_device::emit_dummy_samples(const scanline_record *scanline, int sample_start, int sample_count, pixel_t *pixels, const pixel_t *palette) +uint32_t gime_device::emit_dummy_samples(const scanline_record *scanline, int sample_start, int sample_count, pixel_t *pixels, const pixel_t *palette) { fatalerror("Should not get here\n"); } @@ -1611,7 +1611,7 @@ uint32_t gime_base_device::emit_dummy_samples(const scanline_record *scanline, i // emit_mc6847_samples //------------------------------------------------- -inline uint32_t gime_base_device::emit_mc6847_samples(const scanline_record *scanline, int sample_start, int sample_count, pixel_t *pixels, const pixel_t *palette) +inline uint32_t gime_device::emit_mc6847_samples(const scanline_record *scanline, int sample_start, int sample_count, pixel_t *pixels, const pixel_t *palette) { return super::emit_mc6847_samples<2>( scanline->m_mode[sample_start], @@ -1631,7 +1631,7 @@ inline uint32_t gime_base_device::emit_mc6847_samples(const scanline_record *sca //------------------------------------------------- template -inline uint32_t gime_base_device::emit_gime_graphics_samples(const scanline_record *scanline, int sample_start, int sample_count, pixel_t *pixels, const pixel_t *palette) +inline uint32_t gime_device::emit_gime_graphics_samples(const scanline_record *scanline, int sample_start, int sample_count, pixel_t *pixels, const pixel_t *palette) { const uint8_t *data = &scanline->m_data[sample_start]; mc6847_friend_device::emit_graphics(data, sample_count, pixels, 0, palette); @@ -1645,7 +1645,7 @@ inline uint32_t gime_base_device::emit_gime_graphics_samples(const scanline_reco //------------------------------------------------- template -inline uint32_t gime_base_device::emit_gime_text_samples(const scanline_record *scanline, int sample_start, int sample_count, pixel_t *pixels, const pixel_t *palette) +inline uint32_t gime_device::emit_gime_text_samples(const scanline_record *scanline, int sample_start, int sample_count, pixel_t *pixels, const pixel_t *palette) { uint8_t attribute = scanline->m_mode[sample_start]; const uint8_t *data = &scanline->m_data[sample_start]; @@ -1704,8 +1704,8 @@ inline uint32_t gime_base_device::emit_gime_text_samples(const scanline_record * // render_scanline //------------------------------------------------- -template -inline void gime_base_device::render_scanline(const scanline_record *scanline, pixel_t *pixels, int min_x, int max_x, palette_resolver *resolver) +template +inline void gime_device::render_scanline(const scanline_record *scanline, pixel_t *pixels, int min_x, int max_x, palette_resolver *resolver) { int left_border, right_border; int x, x2, pixel_position; @@ -1774,14 +1774,14 @@ inline void gime_base_device::render_scanline(const scanline_record *scanline, p // update_screen //------------------------------------------------- -bool gime_base_device::update_screen(bitmap_rgb32 &bitmap, const rectangle &cliprect, const pixel_t *RESTRICT palette) +bool gime_device::update_screen(bitmap_rgb32 &bitmap, const rectangle &cliprect, const pixel_t *RESTRICT palette) { int base_x = 64; int min_x = USE_HORIZONTAL_CLIP ? cliprect.min_x : 0; int max_x = USE_HORIZONTAL_CLIP ? cliprect.max_x : (base_x * 2 + 512 - 1); int min_y = cliprect.min_y; int max_y = cliprect.max_y; - palette_resolver resolver(this, palette); + palette_resolver resolver(*this, palette); /* if the video didn't change, indicate as much */ if (!has_video_changed()) @@ -1796,7 +1796,7 @@ bool gime_base_device::update_screen(bitmap_rgb32 &bitmap, const rectangle &clip if (m_scanlines[y].m_line_in_row == (uint8_t) ~0) { /* this is a border scanline */ - render_scanline<0, &gime_base_device::emit_dummy_samples>(scanline, pixels, min_x, max_x, &resolver); + render_scanline<0, &gime_device::emit_dummy_samples>(scanline, pixels, min_x, max_x, &resolver); } else if (m_legacy_video) { @@ -1807,11 +1807,11 @@ bool gime_base_device::update_screen(bitmap_rgb32 &bitmap, const rectangle &clip case MODE_AG|MODE_GM0: case MODE_AG|MODE_GM1|MODE_GM0: case MODE_AG|MODE_GM2|MODE_GM0: - render_scanline<16, &gime_base_device::emit_mc6847_samples>(scanline, pixels, min_x, max_x, &resolver); + render_scanline<16, &gime_device::emit_mc6847_samples>(scanline, pixels, min_x, max_x, &resolver); break; default: - render_scanline<32, &gime_base_device::emit_mc6847_samples>(scanline, pixels, min_x, max_x, &resolver); + render_scanline<32, &gime_device::emit_mc6847_samples>(scanline, pixels, min_x, max_x, &resolver); break; } } @@ -1820,38 +1820,38 @@ bool gime_base_device::update_screen(bitmap_rgb32 &bitmap, const rectangle &clip /* GIME graphics */ switch(scanline->m_ff99_value & 0x1F) { - case 0x00: render_scanline< 16, &gime_base_device::emit_gime_graphics_samples< 4, 1> >(scanline, pixels, min_x, max_x, &resolver); break; - case 0x01: render_scanline< 16, &gime_base_device::emit_gime_graphics_samples< 8, 2> >(scanline, pixels, min_x, max_x, &resolver); break; + case 0x00: render_scanline< 16, &gime_device::emit_gime_graphics_samples< 4, 1> >(scanline, pixels, min_x, max_x, &resolver); break; + case 0x01: render_scanline< 16, &gime_device::emit_gime_graphics_samples< 8, 2> >(scanline, pixels, min_x, max_x, &resolver); break; case 0x02: - case 0x03: render_scanline< 16, &gime_base_device::emit_gime_graphics_samples<16, 4> >(scanline, pixels, min_x, max_x, &resolver); break; - case 0x04: render_scanline< 20, &gime_base_device::emit_gime_graphics_samples< 4, 1> >(scanline, pixels, min_x, max_x, &resolver); break; - case 0x05: render_scanline< 20, &gime_base_device::emit_gime_graphics_samples< 8, 2> >(scanline, pixels, min_x, max_x, &resolver); break; + case 0x03: render_scanline< 16, &gime_device::emit_gime_graphics_samples<16, 4> >(scanline, pixels, min_x, max_x, &resolver); break; + case 0x04: render_scanline< 20, &gime_device::emit_gime_graphics_samples< 4, 1> >(scanline, pixels, min_x, max_x, &resolver); break; + case 0x05: render_scanline< 20, &gime_device::emit_gime_graphics_samples< 8, 2> >(scanline, pixels, min_x, max_x, &resolver); break; case 0x06: - case 0x07: render_scanline< 20, &gime_base_device::emit_gime_graphics_samples<16, 4> >(scanline, pixels, min_x, max_x, &resolver); break; - case 0x08: render_scanline< 32, &gime_base_device::emit_gime_graphics_samples< 2, 1> >(scanline, pixels, min_x, max_x, &resolver); break; - case 0x09: render_scanline< 32, &gime_base_device::emit_gime_graphics_samples< 4, 2> >(scanline, pixels, min_x, max_x, &resolver); break; + case 0x07: render_scanline< 20, &gime_device::emit_gime_graphics_samples<16, 4> >(scanline, pixels, min_x, max_x, &resolver); break; + case 0x08: render_scanline< 32, &gime_device::emit_gime_graphics_samples< 2, 1> >(scanline, pixels, min_x, max_x, &resolver); break; + case 0x09: render_scanline< 32, &gime_device::emit_gime_graphics_samples< 4, 2> >(scanline, pixels, min_x, max_x, &resolver); break; case 0x0A: - case 0x0B: render_scanline< 32, &gime_base_device::emit_gime_graphics_samples< 8, 4> >(scanline, pixels, min_x, max_x, &resolver); break; - case 0x0C: render_scanline< 40, &gime_base_device::emit_gime_graphics_samples< 2, 1> >(scanline, pixels, min_x, max_x, &resolver); break; - case 0x0D: render_scanline< 40, &gime_base_device::emit_gime_graphics_samples< 4, 2> >(scanline, pixels, min_x, max_x, &resolver); break; + case 0x0B: render_scanline< 32, &gime_device::emit_gime_graphics_samples< 8, 4> >(scanline, pixels, min_x, max_x, &resolver); break; + case 0x0C: render_scanline< 40, &gime_device::emit_gime_graphics_samples< 2, 1> >(scanline, pixels, min_x, max_x, &resolver); break; + case 0x0D: render_scanline< 40, &gime_device::emit_gime_graphics_samples< 4, 2> >(scanline, pixels, min_x, max_x, &resolver); break; case 0x0E: - case 0x0F: render_scanline< 40, &gime_base_device::emit_gime_graphics_samples< 8, 4> >(scanline, pixels, min_x, max_x, &resolver); break; - case 0x10: render_scanline< 64, &gime_base_device::emit_gime_graphics_samples< 1, 1> >(scanline, pixels, min_x, max_x, &resolver); break; - case 0x11: render_scanline< 64, &gime_base_device::emit_gime_graphics_samples< 2, 2> >(scanline, pixels, min_x, max_x, &resolver); break; + case 0x0F: render_scanline< 40, &gime_device::emit_gime_graphics_samples< 8, 4> >(scanline, pixels, min_x, max_x, &resolver); break; + case 0x10: render_scanline< 64, &gime_device::emit_gime_graphics_samples< 1, 1> >(scanline, pixels, min_x, max_x, &resolver); break; + case 0x11: render_scanline< 64, &gime_device::emit_gime_graphics_samples< 2, 2> >(scanline, pixels, min_x, max_x, &resolver); break; case 0x12: - case 0x13: render_scanline< 64, &gime_base_device::emit_gime_graphics_samples< 4, 4> >(scanline, pixels, min_x, max_x, &resolver); break; - case 0x14: render_scanline< 80, &gime_base_device::emit_gime_graphics_samples< 1, 1> >(scanline, pixels, min_x, max_x, &resolver); break; - case 0x15: render_scanline< 80, &gime_base_device::emit_gime_graphics_samples< 2, 2> >(scanline, pixels, min_x, max_x, &resolver); break; + case 0x13: render_scanline< 64, &gime_device::emit_gime_graphics_samples< 4, 4> >(scanline, pixels, min_x, max_x, &resolver); break; + case 0x14: render_scanline< 80, &gime_device::emit_gime_graphics_samples< 1, 1> >(scanline, pixels, min_x, max_x, &resolver); break; + case 0x15: render_scanline< 80, &gime_device::emit_gime_graphics_samples< 2, 2> >(scanline, pixels, min_x, max_x, &resolver); break; case 0x16: - case 0x17: render_scanline< 80, &gime_base_device::emit_gime_graphics_samples< 4, 4> >(scanline, pixels, min_x, max_x, &resolver); break; + case 0x17: render_scanline< 80, &gime_device::emit_gime_graphics_samples< 4, 4> >(scanline, pixels, min_x, max_x, &resolver); break; case 0x18: - case 0x19: render_scanline<128, &gime_base_device::emit_gime_graphics_samples< 1, 2> >(scanline, pixels, min_x, max_x, &resolver); break; + case 0x19: render_scanline<128, &gime_device::emit_gime_graphics_samples< 1, 2> >(scanline, pixels, min_x, max_x, &resolver); break; case 0x1A: - case 0x1B: render_scanline<128, &gime_base_device::emit_gime_graphics_samples< 2, 4> >(scanline, pixels, min_x, max_x, &resolver); break; + case 0x1B: render_scanline<128, &gime_device::emit_gime_graphics_samples< 2, 4> >(scanline, pixels, min_x, max_x, &resolver); break; case 0x1C: - case 0x1D: render_scanline<160, &gime_base_device::emit_gime_graphics_samples< 1, 2> >(scanline, pixels, min_x, max_x, &resolver); break; + case 0x1D: render_scanline<160, &gime_device::emit_gime_graphics_samples< 1, 2> >(scanline, pixels, min_x, max_x, &resolver); break; case 0x1E: - case 0x1F: render_scanline<160, &gime_base_device::emit_gime_graphics_samples< 2, 4> >(scanline, pixels, min_x, max_x, &resolver); break; + case 0x1F: render_scanline<160, &gime_device::emit_gime_graphics_samples< 2, 4> >(scanline, pixels, min_x, max_x, &resolver); break; } } else @@ -1859,10 +1859,10 @@ bool gime_base_device::update_screen(bitmap_rgb32 &bitmap, const rectangle &clip /* GIME text */ switch(scanline->m_ff99_value & 0x14) { - case 0x00: render_scanline<32, &gime_base_device::emit_gime_text_samples<2> >(scanline, pixels, min_x, max_x, &resolver); break; - case 0x04: render_scanline<40, &gime_base_device::emit_gime_text_samples<2> >(scanline, pixels, min_x, max_x, &resolver); break; - case 0x10: render_scanline<64, &gime_base_device::emit_gime_text_samples<1> >(scanline, pixels, min_x, max_x, &resolver); break; - case 0x14: render_scanline<80, &gime_base_device::emit_gime_text_samples<1> >(scanline, pixels, min_x, max_x, &resolver); break; + case 0x00: render_scanline<32, &gime_device::emit_gime_text_samples<2> >(scanline, pixels, min_x, max_x, &resolver); break; + case 0x04: render_scanline<40, &gime_device::emit_gime_text_samples<2> >(scanline, pixels, min_x, max_x, &resolver); break; + case 0x10: render_scanline<64, &gime_device::emit_gime_text_samples<1> >(scanline, pixels, min_x, max_x, &resolver); break; + case 0x14: render_scanline<80, &gime_device::emit_gime_text_samples<1> >(scanline, pixels, min_x, max_x, &resolver); break; } } } @@ -1875,7 +1875,7 @@ bool gime_base_device::update_screen(bitmap_rgb32 &bitmap, const rectangle &clip // update_composite //------------------------------------------------- -bool gime_base_device::update_composite(bitmap_rgb32 &bitmap, const rectangle &cliprect) +bool gime_device::update_composite(bitmap_rgb32 &bitmap, const rectangle &cliprect) { update_value(&m_displayed_rgb, false); const pixel_t *palette = (m_gime_registers[0x08] & 0x10) @@ -1890,7 +1890,7 @@ bool gime_base_device::update_composite(bitmap_rgb32 &bitmap, const rectangle &c // update_rgb //------------------------------------------------- -bool gime_base_device::update_rgb(bitmap_rgb32 &bitmap, const rectangle &cliprect) +bool gime_device::update_rgb(bitmap_rgb32 &bitmap, const rectangle &cliprect) { update_value(&m_displayed_rgb, true); return update_screen(bitmap, cliprect, m_rgb_palette); @@ -1906,10 +1906,10 @@ bool gime_base_device::update_rgb(bitmap_rgb32 &bitmap, const rectangle &cliprec // palette_resolver::palette_resolver //------------------------------------------------- -inline gime_base_device::palette_resolver::palette_resolver(gime_base_device *gime, const pixel_t *palette) +inline gime_device::palette_resolver::palette_resolver(gime_device &gime, const pixel_t *palette) + : m_gime(gime) + , m_palette(palette) { - m_gime = gime; - m_palette = palette; memset(m_resolved_palette, 0, sizeof(m_resolved_palette)); m_current_resolved_palette = -1; } @@ -1920,12 +1920,12 @@ inline gime_base_device::palette_resolver::palette_resolver(gime_base_device *gi // palette_resolver::get_palette //------------------------------------------------- -inline const gime_base_device::pixel_t *gime_base_device::palette_resolver::get_palette(uint16_t palette_rotation) +inline const gime_device::pixel_t *gime_device::palette_resolver::get_palette(uint16_t palette_rotation) { if (UNEXPECTED(m_current_resolved_palette != palette_rotation)) { for (int i = 0; i < 16; i++) - m_resolved_palette[i] = lookup(m_gime->m_palette_rotated[palette_rotation][i]); + m_resolved_palette[i] = lookup(m_gime.m_palette_rotated[palette_rotation][i]); m_current_resolved_palette = palette_rotation; } return m_resolved_palette; @@ -1937,7 +1937,7 @@ inline const gime_base_device::pixel_t *gime_base_device::palette_resolver::get_ // palette_resolver::lookup //------------------------------------------------- -inline gime_base_device::pixel_t gime_base_device::palette_resolver::lookup(uint8_t color) +inline gime_device::pixel_t gime_device::palette_resolver::lookup(uint8_t color) { assert(color <= 63); return m_palette[color]; @@ -1949,7 +1949,7 @@ inline gime_base_device::pixel_t gime_base_device::palette_resolver::lookup(uint // hires_font //------------------------------------------------- -const uint8_t gime_base_device::hires_font[128][12] = +const uint8_t gime_device::hires_font[128][12] = { { 0x38, 0x44, 0x40, 0x40, 0x40, 0x44, 0x38, 0x10}, { 0x44, 0x00, 0x44, 0x44, 0x44, 0x4C, 0x34, 0x00}, { 0x08, 0x10, 0x38, 0x44, 0x7C, 0x40, 0x38, 0x00}, { 0x10, 0x28, 0x38, 0x04, 0x3C, 0x44, 0x3C, 0x00}, @@ -2023,27 +2023,26 @@ const uint8_t gime_base_device::hires_font[128][12] = // VARIATIONS //************************************************************************** -DEFINE_DEVICE_TYPE(GIME_NTSC, gime_ntsc_device, "gime_ntsc", "CoCo GIME (NTSC)") -DEFINE_DEVICE_TYPE(GIME_PAL, gime_pal_device, "gime_pal", "CoCo GIME (PAL)") - - - -//------------------------------------------------- -// gime_ntsc_device -//------------------------------------------------- - -gime_ntsc_device::gime_ntsc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : gime_base_device(mconfig, GIME_NTSC, tag, owner, clock, ntsc_round_fontdata8x12) +namespace { -} - - + class gime_ntsc_device : public gime_device + { + public: + gime_ntsc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : gime_device(mconfig, GIME_NTSC, tag, owner, clock, ntsc_round_fontdata8x12) + { + } + }; -//------------------------------------------------- -// gime_pal_device -//------------------------------------------------- + class gime_pal_device : public gime_device + { + public: + gime_pal_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : gime_device(mconfig, GIME_PAL, tag, owner, clock, pal_round_fontdata8x12) + { + } + }; +}; -gime_pal_device::gime_pal_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : gime_base_device(mconfig, GIME_PAL, tag, owner, clock, pal_round_fontdata8x12) -{ -} +DEFINE_DEVICE_TYPE(GIME_NTSC, gime_ntsc_device, "gime_ntsc", "CoCo GIME (NTSC)") +DEFINE_DEVICE_TYPE(GIME_PAL, gime_pal_device, "gime_pal", "CoCo GIME (PAL)") diff --git a/src/mame/video/gime.h b/src/mame/video/gime.h index e2b3ec96354..a771cdf4671 100644 --- a/src/mame/video/gime.h +++ b/src/mame/video/gime.h @@ -28,22 +28,22 @@ #define MCFG_GIME_FSYNC_CALLBACK MCFG_MC6847_FSYNC_CALLBACK #define MCFG_GIME_IRQ_CALLBACK(_write) \ - devcb = &gime_base_device::set_irq_wr_callback(*device, DEVCB_##_write); + devcb = &gime_device::set_irq_wr_callback(*device, DEVCB_##_write); #define MCFG_GIME_FIRQ_CALLBACK(_write) \ - devcb = &gime_base_device::set_firq_wr_callback(*device, DEVCB_##_write); + devcb = &gime_device::set_firq_wr_callback(*device, DEVCB_##_write); #define MCFG_GIME_FLOATING_BUS_CALLBACK(_read) \ - devcb = &gime_base_device::set_floating_bus_rd_callback(*device, DEVCB_##_read); + devcb = &gime_device::set_floating_bus_rd_callback(*device, DEVCB_##_read); #define MCFG_GIME_MAINCPU(_tag) \ - gime_base_device::set_maincpu_tag(*device, _tag); + gime_device::set_maincpu_tag(*device, _tag); #define MCFG_GIME_RAM(_tag) \ - gime_base_device::set_ram_tag(*device, _tag); + gime_device::set_ram_tag(*device, _tag); #define MCFG_GIME_EXT(_tag) \ - gime_base_device::set_ext_tag(*device, _tag); + gime_device::set_ext_tag(*device, _tag); //************************************************************************** @@ -52,15 +52,15 @@ class cococart_slot_device; -class gime_base_device : public mc6847_friend_device, public sam6883_friend_device +class gime_device : public mc6847_friend_device, public sam6883_friend_device { public: - template static devcb_base &set_irq_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_irq.set_callback(std::forward(cb)); } - template static devcb_base &set_firq_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_firq.set_callback(std::forward(cb)); } - template static devcb_base &set_floating_bus_rd_callback(device_t &device, Object &&cb) { return downcast(device).m_read_floating_bus.set_callback(std::forward(cb)); } - static void set_maincpu_tag(device_t &device, const char *tag) { downcast(device).m_maincpu_tag = tag; } - static void set_ram_tag(device_t &device, const char *tag) { downcast(device).m_ram_tag = tag; } - static void set_ext_tag(device_t &device, const char *tag) { downcast(device).m_ext_tag = tag; } + template static devcb_base &set_irq_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_irq.set_callback(std::forward(cb)); } + template static devcb_base &set_firq_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_firq.set_callback(std::forward(cb)); } + template static devcb_base &set_floating_bus_rd_callback(device_t &device, Object &&cb) { return downcast(device).m_read_floating_bus.set_callback(std::forward(cb)); } + static void set_maincpu_tag(device_t &device, const char *tag) { downcast(device).m_maincpu_tag = tag; } + static void set_ram_tag(device_t &device, const char *tag) { downcast(device).m_ram_tag = tag; } + static void set_ext_tag(device_t &device, const char *tag) { downcast(device).m_ext_tag = tag; } // read/write DECLARE_READ8_MEMBER( read ) { return read(offset); } @@ -91,7 +91,7 @@ public: void set_il2(bool value) { set_interrupt_value(INTERRUPT_EI2, value); } protected: - gime_base_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, const uint8_t *fontdata); + gime_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, const uint8_t *fontdata); // device-level overrides virtual void device_start(void) override; @@ -124,17 +124,17 @@ private: uint16_t m_palette[160]; }; - typedef uint32_t (gime_base_device::*get_data_func)(uint32_t, uint8_t *, uint8_t *); + typedef uint32_t (gime_device::*get_data_func)(uint32_t, uint8_t *, uint8_t *); class palette_resolver { public: - palette_resolver(gime_base_device *gime, const pixel_t *palette); + palette_resolver(gime_device &gime, const pixel_t *palette); const pixel_t *get_palette(uint16_t palette_rotation); pixel_t lookup(uint8_t color); private: - gime_base_device *m_gime; + gime_device &m_gime; const pixel_t *m_palette; pixel_t m_resolved_palette[16]; int m_current_resolved_palette; @@ -279,7 +279,7 @@ private: uint32_t record_scanline_res(int scanline); // rendering sampled graphics - typedef uint32_t (gime_base_device::*emit_samples_proc)(const scanline_record *scanline, int sample_start, int sample_count, pixel_t *pixels, const pixel_t *palette); + typedef uint32_t (gime_device::*emit_samples_proc)(const scanline_record *scanline, int sample_start, int sample_count, pixel_t *pixels, const pixel_t *palette); uint32_t emit_dummy_samples(const scanline_record *scanline, int sample_start, int sample_count, pixel_t *pixels, const pixel_t *palette); uint32_t emit_mc6847_samples(const scanline_record *scanline, int sample_start, int sample_count, pixel_t *pixels, const pixel_t *palette); template @@ -295,19 +295,7 @@ private: // VARIATIONS //************************************************************************** -class gime_ntsc_device : public gime_base_device -{ -public: - gime_ntsc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); -}; - -class gime_pal_device : public gime_base_device -{ -public: - gime_pal_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); -}; - -DECLARE_DEVICE_TYPE(GIME_NTSC, gime_ntsc_device) -DECLARE_DEVICE_TYPE(GIME_PAL, gime_pal_device) +extern const device_type GIME_NTSC; +extern const device_type GIME_PAL; #endif //MAME_VIDEO_GIME_H -- cgit v1.2.3