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.
This commit is contained in:
AJR 2018-03-08 20:58:23 -05:00
parent b867aeded5
commit 98db2721c5
9 changed files with 29 additions and 30 deletions

View File

@ -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();

View File

@ -9,12 +9,9 @@
#define MCFG_SCN2674_INTR_CALLBACK(_intr) \
devcb = &downcast<scn2674_device &>(*device).set_intr_callback(DEVCB_##_intr);
#define MCFG_SCN2674_TEXT_CHARACTER_WIDTH(_value) \
#define MCFG_SCN2674_CHARACTER_WIDTH(_value) \
downcast<scn2674_device &>(*device).set_character_width(_value);
#define MCFG_SCN2674_GFX_CHARACTER_WIDTH(_value) \
downcast<scn2674_device &>(*device).set_gfx_character_width(_value);
#define MCFG_SCN2674_DRAW_CHARACTER_CALLBACK_OWNER(_class, _method) \
downcast<scn2674_device &>(*device).set_display_callback(scn2674_device::draw_character_delegate(&_class::_method, #_class "::" #_method, this));
@ -31,8 +28,7 @@ public:
// static configuration
template <class Object> devcb_base &set_intr_callback(Object &&cb) { return m_intr_cb.set_callback(std::forward<Object>(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 <typename Object> void set_display_callback(Object &&cb) { m_display_cb = std::forward<Object>(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;

View File

@ -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")

View File

@ -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")

View File

@ -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)

View File

@ -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")

View File

@ -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")

View File

@ -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")

View File

@ -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)