diff options
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 |
commit | 826069c78da69dbb9e9320c61c08b2e6e432cd33 (patch) | |
tree | 5ad3b13c9ef015095d334074167989648de05395 | |
parent | a649377289476da3224d86c2928828cd75158d77 (diff) |
model2.cpp: mask polygon_rom / texture_rom checks towards bounds (nw)
-rw-r--r-- | src/devices/cpu/mb86233/mb86233.cpp | 6 | ||||
-rw-r--r-- | src/mame/includes/model2.h | 6 | ||||
-rw-r--r-- | src/mame/video/model2.cpp | 32 |
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; } |