mirror of
https://github.com/holub/mame
synced 2025-10-06 09:00:04 +03:00
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:
parent
b867aeded5
commit
98db2721c5
@ -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();
|
||||
|
@ -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;
|
||||
|
@ -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")
|
||||
|
@ -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")
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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")
|
||||
|
@ -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")
|
||||
|
@ -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")
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user