summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author angelosa <salese_corp_ltd@email.it>2018-02-19 18:49:00 +0100
committer angelosa <salese_corp_ltd@email.it>2018-02-20 00:32:47 +0100
commit826069c78da69dbb9e9320c61c08b2e6e432cd33 (patch)
tree5ad3b13c9ef015095d334074167989648de05395
parenta649377289476da3224d86c2928828cd75158d77 (diff)
model2.cpp: mask polygon_rom / texture_rom checks towards bounds (nw)
-rw-r--r--src/devices/cpu/mb86233/mb86233.cpp6
-rw-r--r--src/mame/includes/model2.h6
-rw-r--r--src/mame/video/model2.cpp32
3 files changed, 24 insertions, 20 deletions
diff --git a/src/devices/cpu/mb86233/mb86233.cpp b/src/devices/cpu/mb86233/mb86233.cpp
index 32bdd8f2ea7..6184159eeb5 100644
--- a/src/devices/cpu/mb86233/mb86233.cpp
+++ b/src/devices/cpu/mb86233/mb86233.cpp
@@ -375,9 +375,9 @@ void mb86233_cpu_device::ALU( uint32_t alu)
case 0x0F: /* D = int(D) */
switch((m_fpucontrol>>1)&3)
{
- //case 0: GETD().i = floor(GETD().f+0.5f); break;
- //case 1: GETD().i = ceil(GETD().f); break;
- case 2: GETD().i = floor(GETD().f); break; // Manx TT
+ //case 0: GETD().i = floorf(GETD().f+0.5f); break;
+ //case 1: GETD().i = ceilf(GETD().f); break;
+ case 2: GETD().i = floorf(GETD().f); break; // Manx TT
case 3: GETD().i = (int32_t)GETD().f; break;
default: popmessage("TGP uses D = int(D) with FPU control = %02x, contact MAMEdev",m_fpucontrol>>1); break;
}
diff --git a/src/mame/includes/model2.h b/src/mame/includes/model2.h
index 84887e734b5..67539d10636 100644
--- a/src/mame/includes/model2.h
+++ b/src/mame/includes/model2.h
@@ -187,8 +187,8 @@ public:
DECLARE_WRITE32_MEMBER(model2_5881prot_w);
int first_read;
- void model2_3d_init(uint16_t *texture_rom);
- void geo_init(uint32_t *polygon_rom);
+ void raster_init(memory_region *texture_rom);
+ void geo_init(memory_region *polygon_rom);
DECLARE_READ32_MEMBER(maxx_r);
DECLARE_WRITE32_MEMBER(mode_w);
DECLARE_WRITE32_MEMBER(model2o_tex_w0);
@@ -348,7 +348,7 @@ public:
model2_renderer(model2_state& state)
: poly_manager<float, m2_poly_extra_data, 4, 32768>(state.machine())
, m_state(state)
- , m_destmap(state.m_screen->width(), state.m_screen->height())
+ , m_destmap(512, 512)
{
m_renderfuncs[0] = &model2_renderer::model2_3d_render_0;
m_renderfuncs[1] = &model2_renderer::model2_3d_render_1;
diff --git a/src/mame/video/model2.cpp b/src/mame/video/model2.cpp
index c294d74b499..740d0f036ab 100644
--- a/src/mame/video/model2.cpp
+++ b/src/mame/video/model2.cpp
@@ -249,6 +249,7 @@ struct raster_state
{
uint32_t mode; /* bit 0 = Test Mode, bit 2 = Switch 60Hz(1)/30Hz(0) operation */
uint16_t * texture_rom; /* Texture ROM pointer */
+ uint32_t texture_rom_mask; /* Texture ROM mask */
int16_t viewport[4]; /* View port (startx,starty,endx,endy) */
int16_t center[4][2]; /* Centers (eye 0[x,y],1[x,y],2[x,y],3[x,y]) */
uint16_t center_sel; /* Selected center */
@@ -275,11 +276,12 @@ struct raster_state
*
*******************************************/
-void model2_state::model2_3d_init( uint16_t *texture_rom )
+void model2_state::raster_init( memory_region *texture_rom )
{
m_raster = auto_alloc_clear(machine(), <raster_state>());
- m_raster->texture_rom = texture_rom;
+ m_raster->texture_rom = (uint16_t *)texture_rom->base();
+ m_raster->texture_rom_mask = (texture_rom->bytes() / 2) - 1;
}
/*******************************************
@@ -353,7 +355,7 @@ static void model2_3d_process_quad( raster_state *raster, uint32_t attr )
if ( raster->command_buffer[0] & 0x800000 )
tp = &raster->texture_ram[raster->command_buffer[0] & 0xFFFF];
else
- tp = &raster->texture_rom[raster->command_buffer[0] & 0x7FFFFF];
+ tp = &raster->texture_rom[raster->command_buffer[0] & raster->texture_rom_mask];
object.v[0].pv = *tp++;
object.v[0].pu = *tp++;
@@ -371,7 +373,7 @@ static void model2_3d_process_quad( raster_state *raster, uint32_t attr )
if ( raster->command_buffer[1] & 0x800000 )
th = &raster->texture_ram[raster->command_buffer[1] & 0xFFFF];
else
- th = &raster->texture_rom[raster->command_buffer[1] & 0x7FFFFF];
+ th = &raster->texture_rom[raster->command_buffer[1] & raster->texture_rom_mask];
object.texheader[0] = *th++;
object.texheader[1] = *th++;
@@ -591,7 +593,7 @@ static void model2_3d_process_triangle( raster_state *raster, uint32_t attr )
if ( raster->command_buffer[0] & 0x800000 )
tp = &raster->texture_ram[raster->command_buffer[0] & 0xFFFF];
else
- tp = &raster->texture_rom[raster->command_buffer[0] & 0x7FFFFF];
+ tp = &raster->texture_rom[raster->command_buffer[0] & raster->texture_rom_mask];
object.v[0].pv = *tp++;
object.v[0].pu = *tp++;
@@ -607,7 +609,7 @@ static void model2_3d_process_triangle( raster_state *raster, uint32_t attr )
if ( raster->command_buffer[1] & 0x800000 )
th = &raster->texture_ram[raster->command_buffer[1] & 0xFFFF];
else
- th = &raster->texture_rom[raster->command_buffer[1] & 0x7FFFFF];
+ th = &raster->texture_rom[raster->command_buffer[1] & raster->texture_rom_mask];
object.texheader[0] = *th++;
object.texheader[1] = *th++;
@@ -1182,7 +1184,8 @@ struct geo_state
{
raster_state * raster;
uint32_t mode; /* bit 0 = Enable Specular, bit 1 = Calculate Normals */
- uint32_t * polygon_rom; /* Polygon ROM pointer */
+ uint32_t * polygon_rom; /* Polygon ROM pointer */
+ uint32_t polygon_rom_mask; /* Polygon ROM mask */
float matrix[12]; /* Current Transformation Matrix */
poly_vertex focus; /* Focus (x,y) */
poly_vertex light; /* Light Vector */
@@ -1201,13 +1204,14 @@ struct geo_state
*
*******************************************/
-void model2_state::geo_init( uint32_t *polygon_rom )
+void model2_state::geo_init(memory_region *polygon_rom)
{
m_geo = auto_alloc_clear(machine(), <geo_state>());
m_geo->state = this;
m_geo->raster = m_raster;
- m_geo->polygon_rom = polygon_rom;
+ m_geo->polygon_rom = (uint32_t *)polygon_rom->base();
+ m_geo->polygon_rom_mask = (polygon_rom->bytes() / 4) - 1;
}
/*******************************************
@@ -1970,7 +1974,7 @@ static uint32_t * geo_object_data( geo_state *geo, uint32_t opcode, uint32_t *in
else if ( oba & 0x00800000 )
{
/* Polygon ROM */
- obp = &geo->polygon_rom[oba & 0x7FFFFF];
+ obp = &geo->polygon_rom[oba & geo->polygon_rom_mask];
}
else
{
@@ -2347,7 +2351,7 @@ static uint32_t * geo_test( geo_state *geo, uint32_t opcode, uint32_t *input )
{
data = geo->polygon_rom[address++];
- address &= 0x7FFFFF;
+ address &= geo->polygon_rom_mask;
sum_even += data >> 16;
sum_even &= 0xFFFF;
@@ -2602,10 +2606,10 @@ void model2_state::video_start()
m_poly = auto_alloc(machine(), model2_renderer(*this));
/* initialize the hardware rasterizer */
- model2_3d_init( (uint16_t*)memregion("user3")->base() );
+ raster_init( memregion("user3") );
/* initialize the geometry engine */
- geo_init( (uint32_t*)memregion("user2")->base() );
+ geo_init( memregion("user2") );
/* init various video-related pointers */
m_palram = make_unique_clear<uint16_t[]>(0x4000/2);
@@ -2653,6 +2657,6 @@ uint32_t model2_state::screen_update_model2(screen_device &screen, bitmap_rgb32
tile->draw(screen, m_sys24_bitmap, cliprect, (layer<<1) | 1, 0, 0);
copybitmap_trans(bitmap, m_sys24_bitmap, 0, 0, 0, 0, cliprect, 0);
-
+
return 0;
}