From 98db2721c548d0a598904244403c356a40ff2ece Mon Sep 17 00:00:00 2001 From: AJR Date: Thu, 8 Mar 2018 20:58:23 -0500 Subject: [PATCH] scn2674: Use same character width for text and graphics modes (nw) This change has been made partly to bring the implementation in line with other character-based video devices. It is also consistent with the documented ability of the SCN2674 to combine text and graphics modes on the same screen, which rules out bitmap resolution changes. --- src/devices/video/scn2674.cpp | 6 +++--- src/devices/video/scn2674.h | 10 ++-------- src/mame/drivers/cit220.cpp | 3 +-- src/mame/drivers/microterm.cpp | 3 +-- src/mame/drivers/mpu4vid.cpp | 3 +-- src/mame/drivers/octopus.cpp | 3 +-- src/mame/drivers/tr175.cpp | 3 +-- src/mame/drivers/vp122.cpp | 3 +-- src/mame/video/pcd.cpp | 25 ++++++++++++++++++------- 9 files changed, 29 insertions(+), 30 deletions(-) diff --git a/src/devices/video/scn2674.cpp b/src/devices/video/scn2674.cpp index fe3e8ab5df2..dd673866893 100644 --- a/src/devices/video/scn2674.cpp +++ b/src/devices/video/scn2674.cpp @@ -34,7 +34,7 @@ scn2674_device::scn2674_device(const machine_config &mconfig, const char *tag, d , m_screen1_l(0), m_screen1_h(0), m_cursor_l(0), m_cursor_h(0), m_screen2_l(0), m_screen2_h(0) , m_irq_register(0), m_status_register(0), m_irq_mask(0) , m_gfx_enabled(0), m_display_enabled(0), m_display_enabled_field(0), m_display_enabled_scanline(0), m_cursor_enabled(0) - , m_hpixels_per_column(0), m_text_hpixels_per_column(0), m_gfx_hpixels_per_column(0) + , m_hpixels_per_column(0) , m_IR0_double_ht_wd(0), m_IR0_scanline_per_char_row(0), m_IR0_sync_select(0), m_IR0_buffer_mode_select(0) , m_IR1_interlace_enable(0), m_IR1_equalizing_constant(0) , m_IR2_row_table(0), m_IR2_horz_sync_width(0), m_IR2_horz_back_porch(0) @@ -139,7 +139,6 @@ void scn2674_device::device_reset() m_IR_pointer = 0; m_address = 0; m_start1change = 0; - m_hpixels_per_column = m_text_hpixels_per_column; } // 15 Initialization Registers (8-bit each) @@ -342,6 +341,8 @@ void scn2674_device::write_command(uint8_t data) /* Enable GFX */ LOGMASKED(LOG_COMMAND, "enable GFX %02x\n",data); m_gfx_enabled = 1; + + // FIXME: this takes effect at next character row recompute_parameters(); } @@ -640,7 +641,6 @@ WRITE8_MEMBER( scn2674_device::write ) void scn2674_device::recompute_parameters() { - m_hpixels_per_column = m_gfx_enabled ? m_gfx_hpixels_per_column : m_text_hpixels_per_column; int horiz_pix_total = ((m_IR1_equalizing_constant + (m_IR2_horz_sync_width << 1)) << 1) * m_hpixels_per_column; int vert_pix_total = m_IR4_rows_per_screen * m_IR0_scanline_per_char_row + m_IR3_vert_front_porch + m_IR3_vert_back_porch + m_IR7_vsync_width; attoseconds_t refresh = screen().frame_period().attoseconds(); diff --git a/src/devices/video/scn2674.h b/src/devices/video/scn2674.h index b2b7f6dfa55..9e48c85bd6f 100644 --- a/src/devices/video/scn2674.h +++ b/src/devices/video/scn2674.h @@ -9,12 +9,9 @@ #define MCFG_SCN2674_INTR_CALLBACK(_intr) \ devcb = &downcast(*device).set_intr_callback(DEVCB_##_intr); -#define MCFG_SCN2674_TEXT_CHARACTER_WIDTH(_value) \ +#define MCFG_SCN2674_CHARACTER_WIDTH(_value) \ downcast(*device).set_character_width(_value); -#define MCFG_SCN2674_GFX_CHARACTER_WIDTH(_value) \ - downcast(*device).set_gfx_character_width(_value); - #define MCFG_SCN2674_DRAW_CHARACTER_CALLBACK_OWNER(_class, _method) \ downcast(*device).set_display_callback(scn2674_device::draw_character_delegate(&_class::_method, #_class "::" #_method, this)); @@ -31,8 +28,7 @@ public: // static configuration template devcb_base &set_intr_callback(Object &&cb) { return m_intr_cb.set_callback(std::forward(cb)); } - void set_character_width(int value) { m_text_hpixels_per_column = value; } - void set_gfx_character_width(int value) { m_gfx_hpixels_per_column = value; } + void set_character_width(int value) { m_hpixels_per_column = value; } template void set_display_callback(Object &&cb) { m_display_cb = std::forward(cb); } DECLARE_READ8_MEMBER( read ); @@ -69,8 +65,6 @@ private: uint8_t m_display_enabled_scanline; uint8_t m_cursor_enabled; uint8_t m_hpixels_per_column; - uint8_t m_text_hpixels_per_column; - uint8_t m_gfx_hpixels_per_column; uint8_t m_IR0_double_ht_wd; uint8_t m_IR0_scanline_per_char_row; uint8_t m_IR0_sync_select; diff --git a/src/mame/drivers/cit220.cpp b/src/mame/drivers/cit220.cpp index 7873a949e37..21bb7e9bbad 100644 --- a/src/mame/drivers/cit220.cpp +++ b/src/mame/drivers/cit220.cpp @@ -88,8 +88,7 @@ MACHINE_CONFIG_START(cit220_state::cit220p) MCFG_DEVICE_ADD("avdc", SCN2674, 24553200 / 10) MCFG_SCN2674_INTR_CALLBACK(INPUTLINE("maincpu", I8085_RST65_LINE)) - MCFG_SCN2674_TEXT_CHARACTER_WIDTH(10) - MCFG_SCN2674_GFX_CHARACTER_WIDTH(10) + MCFG_SCN2674_CHARACTER_WIDTH(10) MCFG_SCN2674_DRAW_CHARACTER_CALLBACK_OWNER(cit220_state, draw_character) MCFG_DEVICE_ADDRESS_MAP(0, vram_map) MCFG_VIDEO_SET_SCREEN("screen") diff --git a/src/mame/drivers/microterm.cpp b/src/mame/drivers/microterm.cpp index 70a3d096028..497be7384d0 100644 --- a/src/mame/drivers/microterm.cpp +++ b/src/mame/drivers/microterm.cpp @@ -110,8 +110,7 @@ MACHINE_CONFIG_START(microterm_state::mt420) MCFG_DEVICE_ADD("avdc", SCN2674, XTAL(9'877'680) / 6) //MCFG_DEVICE_CLOCK(XTAL(15'300'720) / 6) - MCFG_SCN2674_TEXT_CHARACTER_WIDTH(6) - MCFG_SCN2674_GFX_CHARACTER_WIDTH(6) + MCFG_SCN2674_CHARACTER_WIDTH(6) MCFG_SCN2674_DRAW_CHARACTER_CALLBACK_OWNER(microterm_state, draw_character) MCFG_DEVICE_ADDRESS_MAP(0, mt420_vram_map) MCFG_VIDEO_SET_SCREEN("screen") diff --git a/src/mame/drivers/mpu4vid.cpp b/src/mame/drivers/mpu4vid.cpp index 7947a373142..5228b63492d 100644 --- a/src/mame/drivers/mpu4vid.cpp +++ b/src/mame/drivers/mpu4vid.cpp @@ -1288,8 +1288,7 @@ MACHINE_CONFIG_START(mpu4vid_state::mpu4_vid) MCFG_DEVICE_ADD("scn2674_vid", SCN2674, 0) MCFG_SCN2674_INTR_CALLBACK(INPUTLINE("video", M68K_IRQ_3)) - MCFG_SCN2674_TEXT_CHARACTER_WIDTH(8) - MCFG_SCN2674_GFX_CHARACTER_WIDTH(8) + MCFG_SCN2674_CHARACTER_WIDTH(8) MCFG_SCN2674_DRAW_CHARACTER_CALLBACK_OWNER(mpu4vid_state, display_pixels) MCFG_DEVICE_ADDRESS_MAP(0, mpu4_vram) diff --git a/src/mame/drivers/octopus.cpp b/src/mame/drivers/octopus.cpp index 93b55c0fdad..d434d8f6c6a 100644 --- a/src/mame/drivers/octopus.cpp +++ b/src/mame/drivers/octopus.cpp @@ -999,8 +999,7 @@ MACHINE_CONFIG_START(octopus_state::octopus) MCFG_DEVICE_ADD("crtc", SCN2674, 0) // character clock can be selectable, either 16MHz or 17.6MHz MCFG_SCN2674_INTR_CALLBACK(DEVWRITELINE("pic_slave", pic8259_device, ir0_w)) - MCFG_SCN2674_TEXT_CHARACTER_WIDTH(8) - MCFG_SCN2674_GFX_CHARACTER_WIDTH(8) + MCFG_SCN2674_CHARACTER_WIDTH(8) MCFG_SCN2674_DRAW_CHARACTER_CALLBACK_OWNER(octopus_state, display_pixels) MCFG_DEVICE_ADDRESS_MAP(0, octopus_vram) MCFG_VIDEO_SET_SCREEN("screen") diff --git a/src/mame/drivers/tr175.cpp b/src/mame/drivers/tr175.cpp index 30ea1046592..44ebbbbd2e9 100644 --- a/src/mame/drivers/tr175.cpp +++ b/src/mame/drivers/tr175.cpp @@ -91,8 +91,7 @@ MACHINE_CONFIG_START(tr175_state::tr175) MCFG_DEVICE_ADD("avdc", SCN2674, XTAL(28'322'000) / 18) // guess MCFG_SCN2674_INTR_CALLBACK(INPUTLINE("maincpu", M68K_IRQ_2)) - MCFG_SCN2674_TEXT_CHARACTER_WIDTH(18) // guess - MCFG_SCN2674_GFX_CHARACTER_WIDTH(18) // guess + MCFG_SCN2674_CHARACTER_WIDTH(18) // guess MCFG_SCN2674_DRAW_CHARACTER_CALLBACK_OWNER(tr175_state, draw_character) MCFG_DEVICE_ADDRESS_MAP(0, vram_map) MCFG_VIDEO_SET_SCREEN("screen") diff --git a/src/mame/drivers/vp122.cpp b/src/mame/drivers/vp122.cpp index b1dd2137b6a..620a64f492b 100644 --- a/src/mame/drivers/vp122.cpp +++ b/src/mame/drivers/vp122.cpp @@ -81,8 +81,7 @@ MACHINE_CONFIG_START(vp122_state::vp122) MCFG_DEVICE_ADD("avdc", SCN2674, XTAL(14'916'000) / 10) MCFG_SCN2674_INTR_CALLBACK(INPUTLINE("maincpu", I8085_RST65_LINE)) - MCFG_SCN2674_TEXT_CHARACTER_WIDTH(10) // 9 in 132-column modes - MCFG_SCN2674_GFX_CHARACTER_WIDTH(10) + MCFG_SCN2674_CHARACTER_WIDTH(10) // 9 in 132-column modes MCFG_SCN2674_DRAW_CHARACTER_CALLBACK_OWNER(vp122_state, draw_character) MCFG_DEVICE_ADDRESS_MAP(0, vram_map) MCFG_VIDEO_SET_SCREEN("screen") diff --git a/src/mame/video/pcd.cpp b/src/mame/video/pcd.cpp index 474ae8f9967..6a44b2d2798 100644 --- a/src/mame/video/pcd.cpp +++ b/src/mame/video/pcd.cpp @@ -116,8 +116,7 @@ MACHINE_CONFIG_START(pcd_video_device::device_add_mconfig) MCFG_PALETTE_INIT_OWNER(pcdx_video_device, pcdx) MCFG_DEVICE_ADD("crtc", SCN2674, 0) - MCFG_SCN2674_TEXT_CHARACTER_WIDTH(8) - MCFG_SCN2674_GFX_CHARACTER_WIDTH(16) + MCFG_SCN2674_CHARACTER_WIDTH(16) MCFG_SCN2674_DRAW_CHARACTER_CALLBACK_OWNER(pcd_video_device, display_pixels) MCFG_VIDEO_SET_SCREEN("screen") MCFG_TIMER_DRIVER_ADD_PERIODIC("mouse_timer", pcd_video_device, mouse_timer, attotime::from_hz(15000)) // guess @@ -158,8 +157,7 @@ MACHINE_CONFIG_START(pcx_video_device::device_add_mconfig) MCFG_DEVICE_ADD("crtc", SCN2674, 0) MCFG_SCN2674_INTR_CALLBACK(INPUTLINE("graphics", MCS51_INT0_LINE)) - MCFG_SCN2674_TEXT_CHARACTER_WIDTH(8) - MCFG_SCN2674_GFX_CHARACTER_WIDTH(16) + MCFG_SCN2674_CHARACTER_WIDTH(16) MCFG_SCN2674_DRAW_CHARACTER_CALLBACK_OWNER(pcx_video_device, display_pixels) MCFG_VIDEO_SET_SCREEN("screen") MCFG_DEVICE_ADDRESS_MAP(0, pcx_vram) @@ -175,7 +173,10 @@ SCN2674_DRAW_CHARACTER_MEMBER(pcd_video_device::display_pixels) if(m_p2 & 8) data = ~data; for(int i = 0; i < 16; i++) - bitmap.pix32(y, x + i) = palette().pen((data & (1 << (15 - i))) ? 1 : 0); + { + bitmap.pix32(y, x++) = palette().pen(BIT(data, 15) ? 1 : 0); + data <<= 1; + } } else { @@ -198,7 +199,12 @@ SCN2674_DRAW_CHARACTER_MEMBER(pcd_video_device::display_pixels) else if(attr & 8) bgnd = 2; for(int i = 0; i < 8; i++) - bitmap.pix32(y, x + i) = palette().pen((data & (1 << (7 - i))) ? fgnd : bgnd); + { + rgb_t pix = palette().pen(BIT(data, 7) ? fgnd : bgnd); + bitmap.pix32(y, x++) = pix; + bitmap.pix32(y, x++) = pix; + data <<= 1; + } } } @@ -212,7 +218,12 @@ SCN2674_DRAW_CHARACTER_MEMBER(pcx_video_device::display_pixels) if(m_p1 & 0x20) data = ~data; for(int i = 0; i < 8; i++) - bitmap.pix32(y, x + i) = palette().pen((data & (1 << (7 - i))) ? 1 : 0); + { + rgb_t pix = palette().pen(BIT(data, 7) ? 1 : 0); + bitmap.pix32(y, x++) = pix; + bitmap.pix32(y, x++) = pix; + data <<= 1; + } } PALETTE_INIT_MEMBER(pcdx_video_device, pcdx)