(MESS) Apollo: fix out-of-bounds framebuffer access crash on OS X [Hans Ostermeyer]

This commit is contained in:
R. Belmont 2013-06-30 17:12:29 +00:00
parent 264bb9021e
commit a46daa5a15

View File

@ -113,19 +113,23 @@ public:
void device_reset();
void device_reset_mono19i();
// monochrome
// monochrome control
READ8_DEVICE_HANDLER( apollo_mcr_r );
WRITE8_DEVICE_HANDLER( apollo_mcr_w );
READ16_DEVICE_HANDLER( apollo_mgm_r );
WRITE16_DEVICE_HANDLER( apollo_mgm_w );
// color
// monochrome and color memory
READ16_DEVICE_HANDLER( apollo_mem_r );
WRITE16_DEVICE_HANDLER( apollo_mem_w );
// color control
READ8_DEVICE_HANDLER( apollo_ccr_r );
WRITE8_DEVICE_HANDLER( apollo_ccr_w );
UINT32 screen_update(bitmap_rgb32 &bitmap, const rectangle &cliprect);
void vblank_state_changed(device_t *device, screen_device &screen, bool vblank_state);
int is_mono() { return m_n_planes == 1; }
private:
class lut_fifo;
class bt458;
@ -1368,7 +1372,7 @@ void apollo_graphics::blt(UINT32 dest_addr, UINT16 mem_mask)
Color graphics memory space at A0000 - BFFFF
***************************************************************************/
READ16_DEVICE_HANDLER( apollo_graphics::apollo_mgm_r )
READ16_DEVICE_HANDLER( apollo_graphics::apollo_mem_r )
{
UINT16 data;
UINT32 src_addr;
@ -1407,7 +1411,7 @@ READ16_DEVICE_HANDLER( apollo_graphics::apollo_mgm_r )
return data;
}
WRITE16_DEVICE_HANDLER( apollo_graphics::apollo_mgm_w )
WRITE16_DEVICE_HANDLER( apollo_graphics::apollo_mem_w )
{
UINT32 dest_addr;
UINT32 src_addr;
@ -1892,9 +1896,10 @@ WRITE8_DEVICE_HANDLER( apollo_graphics::apollo_ccr_w )
READ16_DEVICE_HANDLER( apollo_cgm_r )
{
if (!apollo_config(APOLLO_CONF_MONO_15I))
apollo_graphics *apollo_graphics = get_safe_token(device);
if (!apollo_graphics->is_mono())
{
return apollo_mgm_r(device, space, offset, mem_mask);
return apollo_graphics->apollo_mem_r(device, space, offset, mem_mask);
}
else
{
@ -1904,9 +1909,10 @@ READ16_DEVICE_HANDLER( apollo_cgm_r )
WRITE16_DEVICE_HANDLER( apollo_cgm_w )
{
if (!apollo_config(APOLLO_CONF_MONO_15I))
apollo_graphics *apollo_graphics = get_safe_token(device);
if (!apollo_graphics->is_mono())
{
apollo_mgm_w(device, space, offset, data, mem_mask);
apollo_graphics->apollo_mem_w(device, space, offset, data, mem_mask);
}
}
@ -2261,11 +2267,21 @@ WRITE8_DEVICE_HANDLER( apollo_mcr_w )
READ16_DEVICE_HANDLER( apollo_mgm_r )
{
apollo_graphics *apollo_graphics = get_safe_token(device);
return apollo_graphics->apollo_mgm_r(device, space, offset, mem_mask);
if (apollo_graphics->is_mono())
{
return apollo_graphics->apollo_mem_r(device, space, offset, mem_mask);
}
else
{
return 0xffff;
}
}
WRITE16_DEVICE_HANDLER( apollo_mgm_w )
{
apollo_graphics *apollo_graphics = get_safe_token(device);
apollo_graphics->apollo_mgm_w(device, space, offset, data, mem_mask);
if (apollo_graphics->is_mono())
{
apollo_graphics->apollo_mem_w(device, space, offset, data, mem_mask);
}
}