diff options
author | 2020-05-21 19:22:28 +0200 | |
---|---|---|
committer | 2020-05-21 20:07:37 +0200 | |
commit | d6f2dbd9156f883d3120d590139f12b54fec28d3 (patch) | |
tree | 48d8c7ba6b2f8cfa6204519205cad4d3db58c2fe | |
parent | 889e65792ed3eb0e90c1c6cf266b6f4a08b9a26b (diff) |
xbox_nv2a.cpp: move poly_manager dependency to new nv2a_rasterizer class (nw)
-rw-r--r-- | src/mame/includes/xbox_nv2a.h | 38 | ||||
-rw-r--r-- | src/mame/video/xbox_nv2a.cpp | 100 |
2 files changed, 76 insertions, 62 deletions
diff --git a/src/mame/includes/xbox_nv2a.h b/src/mame/includes/xbox_nv2a.h index e095a7d1a9d..c16e009ed7d 100644 --- a/src/mame/includes/xbox_nv2a.h +++ b/src/mame/includes/xbox_nv2a.h @@ -195,7 +195,16 @@ offset in ramht+4 contains in the lower 16 bits the offset in RAMIN divided by 1 objects have methods used to do drawing most methods set parameters, others actually draw */ -class nv2a_renderer : public poly_manager<double, nvidia_object_data, 13, 8192> + +class nv2a_rasterizer : public poly_manager<double, nvidia_object_data, 13, 8192> +{ +public: + nv2a_rasterizer(running_machine& machine) : poly_manager<double, nvidia_object_data, 13, 8192>(machine) + { + } +}; + +class nv2a_renderer { public: enum class VERTEX_PARAMETER { @@ -384,12 +393,14 @@ public: INVALID = -1 }; - struct nv2avertex_t : public vertex_t + struct nv2avertex_t : public nv2a_rasterizer::vertex_t { double w; }; - nv2a_renderer(running_machine &machine) : poly_manager<double, nvidia_object_data, 13, 8192>(machine) + nv2a_renderer(running_machine &machine) + : rasterizer(machine) + , mach(machine) { memset(channel, 0, sizeof(channel)); memset(pfifo, 0, sizeof(pfifo)); @@ -398,7 +409,7 @@ public: memset(pgraph, 0, sizeof(pgraph)); memset(ramin, 0, sizeof(ramin)); computedilated(); - objectdata = &(object_data_alloc()); + objectdata = &(rasterizer.object_data_alloc()); objectdata->data = this; combiner.used = 0; enabled_vertex_attributes = 0; @@ -464,6 +475,7 @@ public: for (int n = 0; n < 16; n++) persistvertexattr.attribute[n].fv[3] = 1; } + running_machine &machine() { return mach; } DECLARE_READ32_MEMBER(geforce_r); DECLARE_WRITE32_MEMBER(geforce_w); DECLARE_WRITE_LINE_MEMBER(vblank_callback); @@ -471,9 +483,9 @@ public: bool update_interrupts(); void set_irq_callbaclk(std::function<void(int state)> callback) { irq_callback = callback; } - void render_texture_simple(int32_t scanline, const extent_t &extent, const nvidia_object_data &extradata, int threadid); - void render_color(int32_t scanline, const extent_t &extent, const nvidia_object_data &extradata, int threadid); - void render_register_combiners(int32_t scanline, const extent_t &extent, const nvidia_object_data &objectdata, int threadid); + void render_texture_simple(int32_t scanline, const nv2a_rasterizer::extent_t &extent, const nvidia_object_data &extradata, int threadid); + void render_color(int32_t scanline, const nv2a_rasterizer::extent_t &extent, const nvidia_object_data &extradata, int threadid); + void render_register_combiners(int32_t scanline, const nv2a_rasterizer::extent_t &extent, const nvidia_object_data &objectdata, int threadid); COMMAND geforce_commandkind(uint32_t word); uint32_t geforce_object_offset(uint32_t handle); @@ -529,16 +541,18 @@ public: int read_vertices_0x180x(address_space & space, vertex_nv *destination, uint32_t address, int limit); int read_vertices_0x1810(address_space & space, vertex_nv *destination, int offset, int limit); int read_vertices_0x1818(address_space & space, vertex_nv *destination, uint32_t address, int limit); - void convert_vertices_poly(vertex_nv *source, nv2avertex_t *destination, int count); - void assemble_primitive(vertex_nv *source, int count, render_delegate &renderspans); + void convert_vertices(vertex_nv *source, nv2avertex_t *destination, int count); + void assemble_primitive(vertex_nv *source, int count); int clip_triangle_w(nv2avertex_t *vi[3], nv2avertex_t *vo); - uint32_t render_triangle_clipping(const rectangle &cliprect, render_delegate callback, int paramcount, nv2avertex_t &_v1, nv2avertex_t &_v2, nv2avertex_t &_v3); - uint32_t render_triangle_culling(const rectangle &cliprect, render_delegate callback, int paramcount, nv2avertex_t &_v1, nv2avertex_t &_v2, nv2avertex_t &_v3); + uint32_t render_triangle_clipping(const rectangle &cliprect, int paramcount, nv2avertex_t &_v1, nv2avertex_t &_v2, nv2avertex_t &_v3); + uint32_t render_triangle_culling(const rectangle &cliprect, int paramcount, nv2avertex_t &_v1, nv2avertex_t &_v2, nv2avertex_t &_v3); void clear_render_target(int what, uint32_t value); void clear_depth_buffer(int what, uint32_t value); inline uint8_t *direct_access_ptr(offs_t address); TIMER_CALLBACK_MEMBER(puller_timer_work); + nv2a_rasterizer rasterizer; + running_machine &mach; struct { uint32_t regs[0x80 / 4]; struct { @@ -619,7 +633,7 @@ public: vertex_nv vertex_software[1024+2]; // vertex attributes sent by the software to the 3d accelerator nv2avertex_t vertex_xy[1024+2]; // vertex attributes computed by the 3d accelerator vertex_nv persistvertexattr; // persistent vertex attributes - render_delegate render_spans_callback; + nv2a_rasterizer::render_delegate render_spans_callback; struct { float variable_A[4]; // 0=R 1=G 2=B 3=A diff --git a/src/mame/video/xbox_nv2a.cpp b/src/mame/video/xbox_nv2a.cpp index cdc75a5fa4b..d0b806f5d8c 100644 --- a/src/mame/video/xbox_nv2a.cpp +++ b/src/mame/video/xbox_nv2a.cpp @@ -1944,7 +1944,7 @@ void nv2a_renderer::write_pixel(int x, int y, uint32_t color, int depth) } } -void nv2a_renderer::render_color(int32_t scanline, const extent_t &extent, const nvidia_object_data &objectdata, int threadid) +void nv2a_renderer::render_color(int32_t scanline, const nv2a_rasterizer::extent_t &extent, const nvidia_object_data &objectdata, int threadid) { int x, lx; @@ -1974,7 +1974,7 @@ void nv2a_renderer::render_color(int32_t scanline, const extent_t &extent, const } } -void nv2a_renderer::render_texture_simple(int32_t scanline, const extent_t &extent, const nvidia_object_data &objectdata, int threadid) +void nv2a_renderer::render_texture_simple(int32_t scanline, const nv2a_rasterizer::extent_t &extent, const nvidia_object_data &objectdata, int threadid) { int x, lx; uint32_t a8r8g8b8; @@ -2011,7 +2011,7 @@ void nv2a_renderer::render_texture_simple(int32_t scanline, const extent_t &exte } } -void nv2a_renderer::render_register_combiners(int32_t scanline, const extent_t &extent, const nvidia_object_data &objectdata, int threadid) +void nv2a_renderer::render_register_combiners(int32_t scanline, const nv2a_rasterizer::extent_t &extent, const nvidia_object_data &objectdata, int threadid) { int x, lx, xp; int up, vp; @@ -2471,7 +2471,7 @@ void nv2a_renderer::compute_supersample_factors(float &horizontal, float &vertic vertical = my; } -void nv2a_renderer::convert_vertices_poly(vertex_nv *source, nv2avertex_t *destination, int count) +void nv2a_renderer::convert_vertices(vertex_nv *source, nv2avertex_t *destination, int count) { vertex_nv vert[4]; int m, u; @@ -2489,8 +2489,8 @@ void nv2a_renderer::convert_vertices_poly(vertex_nv *source, nv2avertex_t *desti v[i] += matrix.composite[i][j] * source[m].attribute[0].fv[j]; }; destination[m].w = v[3]; - destination[m].x = (v[0] / v[3])*supersample_factor_x; // source[m].attribute[0].fv[0]; - destination[m].y = (v[1] / v[3])*supersample_factor_y; // source[m].attribute[0].fv[1]; + destination[m].x = (v[0] / v[3]) * supersample_factor_x; // source[m].attribute[0].fv[0]; + destination[m].y = (v[1] / v[3]) * supersample_factor_y; // source[m].attribute[0].fv[1]; destination[m].p[(int)VERTEX_PARAMETER::PARAM_Z] = v[2] / v[3]; for (u = (int)VERTEX_PARAMETER::PARAM_COLOR_B; u <= (int)VERTEX_PARAMETER::PARAM_COLOR_A; u++) // 0=b 1=g 2=r 3=a destination[m].p[u] = source[m].attribute[3].fv[u]; @@ -2734,13 +2734,13 @@ void nv2a_renderer::clear_depth_buffer(int what, uint32_t value) } } -uint32_t nv2a_renderer::render_triangle_culling(const rectangle &cliprect, render_delegate callback, int paramcount, nv2avertex_t &_v1, nv2avertex_t &_v2, nv2avertex_t &_v3) +uint32_t nv2a_renderer::render_triangle_culling(const rectangle &cliprect, int paramcount, nv2avertex_t &_v1, nv2avertex_t &_v2, nv2avertex_t &_v3) { float areax2; NV2A_GL_CULL_FACE face = NV2A_GL_CULL_FACE::FRONT; if (backface_culling_enabled == false) - return render_triangle(cliprect, callback, paramcount, _v1, _v2, _v3); + return rasterizer.render_triangle(cliprect, render_spans_callback, paramcount, _v1, _v2, _v3); if (backface_culling_culled == NV2A_GL_CULL_FACE::FRONT_AND_BACK) { triangles_bfculled++; @@ -2762,10 +2762,10 @@ uint32_t nv2a_renderer::render_triangle_culling(const rectangle &cliprect, rende } if (face == NV2A_GL_CULL_FACE::FRONT) if (backface_culling_culled == NV2A_GL_CULL_FACE::BACK) - return render_triangle(cliprect, callback, paramcount, _v1, _v2, _v3); + return rasterizer.render_triangle(cliprect, render_spans_callback, paramcount, _v1, _v2, _v3); if (face == NV2A_GL_CULL_FACE::BACK) if (backface_culling_culled == NV2A_GL_CULL_FACE::FRONT) - return render_triangle(cliprect, callback, paramcount, _v1, _v2, _v3); + return rasterizer.render_triangle(cliprect, render_spans_callback, paramcount, _v1, _v2, _v3); triangles_bfculled++; return 0; } @@ -2812,14 +2812,14 @@ int nv2a_renderer::clip_triangle_w(nv2avertex_t *vi[3], nv2avertex_t *vo) return idx; } -uint32_t nv2a_renderer::render_triangle_clipping(const rectangle &cliprect, render_delegate callback, int paramcount, nv2avertex_t &_v1, nv2avertex_t &_v2, nv2avertex_t &_v3) +uint32_t nv2a_renderer::render_triangle_clipping(const rectangle &cliprect, int paramcount, nv2avertex_t &_v1, nv2avertex_t &_v2, nv2avertex_t &_v3) { nv2avertex_t *vi[3]; nv2avertex_t vo[8]; int nv; if ((_v1.w > 0) && (_v2.w > 0) && (_v3.w > 0)) - return render_triangle_culling(cliprect, callback, paramcount, _v1, _v2, _v3); + return render_triangle_culling(cliprect, paramcount, _v1, _v2, _v3); if (enable_clipping_w == false) return 0; if ((_v1.w <= 0) && (_v2.w <= 0) && (_v3.w <= 0)) @@ -2877,47 +2877,47 @@ uint32_t nv2a_renderer::render_triangle_clipping(const rectangle &cliprect, rend } } for (int n = 1; n <= (nv - 2); n++) - render_triangle_culling(cliprect, callback, paramcount, vo[0], vo[n], vo[n + 1]); + render_triangle_culling(cliprect, paramcount, vo[0], vo[n], vo[n + 1]); return 0; } -void nv2a_renderer::assemble_primitive(vertex_nv *source, int count, render_delegate &renderspans) +void nv2a_renderer::assemble_primitive(vertex_nv *source, int count) { uint32_t pc = primitives_count; for (; count > 0; count--) { if (primitive_type == NV2A_BEGIN_END::QUADS) { - convert_vertices_poly(source, vertex_xy + vertex_count + vertex_accumulated, 1); + convert_vertices(source, vertex_xy + vertex_count + vertex_accumulated, 1); vertex_accumulated++; if (vertex_accumulated == 4) { primitives_count++; vertex_accumulated = 0; - render_triangle_clipping(limits_rendertarget, renderspans, 5 + 4 * 2, vertex_xy[vertex_count], vertex_xy[vertex_count + 1], vertex_xy[vertex_count + 2]); - render_triangle_clipping(limits_rendertarget, renderspans, 5 + 4 * 2, vertex_xy[vertex_count], vertex_xy[vertex_count + 2], vertex_xy[vertex_count + 3]); + render_triangle_clipping(limits_rendertarget, 5 + 4 * 2, vertex_xy[vertex_count], vertex_xy[vertex_count + 1], vertex_xy[vertex_count + 2]); + render_triangle_clipping(limits_rendertarget, 5 + 4 * 2, vertex_xy[vertex_count], vertex_xy[vertex_count + 2], vertex_xy[vertex_count + 3]); vertex_count = (vertex_count + 4) & 1023; - wait(); + rasterizer.wait(); } } else if (primitive_type == NV2A_BEGIN_END::TRIANGLES) { - convert_vertices_poly(source, vertex_xy + vertex_count + vertex_accumulated, 1); + convert_vertices(source, vertex_xy + vertex_count + vertex_accumulated, 1); vertex_accumulated++; if (vertex_accumulated == 3) { primitives_count++; vertex_accumulated = 0; - render_triangle_clipping(limits_rendertarget, renderspans, 5 + 4 * 2, vertex_xy[vertex_count], vertex_xy[(vertex_count + 1) & 1023], vertex_xy[(vertex_count + 2) & 1023]); // 4 rgba, 4 texture units 2 uv + render_triangle_clipping(limits_rendertarget, 5 + 4 * 2, vertex_xy[vertex_count], vertex_xy[(vertex_count + 1) & 1023], vertex_xy[(vertex_count + 2) & 1023]); // 4 rgba, 4 texture units 2 uv vertex_count = (vertex_count + 3) & 1023; - wait(); + rasterizer.wait(); } } else if (primitive_type == NV2A_BEGIN_END::TRIANGLE_FAN) { if (vertex_accumulated == 0) { - convert_vertices_poly(source, vertex_xy + 1024, 1); + convert_vertices(source, vertex_xy + 1024, 1); vertex_accumulated = 1; } else if (vertex_accumulated == 1) { - convert_vertices_poly(source, vertex_xy, 1); + convert_vertices(source, vertex_xy, 1); vertex_accumulated = 2; vertex_count = 1; } @@ -2926,21 +2926,21 @@ void nv2a_renderer::assemble_primitive(vertex_nv *source, int count, render_dele primitives_count++; // if software sends the vertices 0 1 2 3 4 5 6 // hardware will draw triangles made by (0,1,2) (0,2,3) (0,3,4) (0,4,5) (0,5,6) - convert_vertices_poly(source, vertex_xy + vertex_count, 1); - render_triangle_clipping(limits_rendertarget, renderspans, 5 + 4 * 2, vertex_xy[1024], vertex_xy[(vertex_count - 1) & 1023], vertex_xy[vertex_count]); + convert_vertices(source, vertex_xy + vertex_count, 1); + render_triangle_clipping(limits_rendertarget, 5 + 4 * 2, vertex_xy[1024], vertex_xy[(vertex_count - 1) & 1023], vertex_xy[vertex_count]); vertex_count = (vertex_count + 1) & 1023; - wait(); + rasterizer.wait(); } } else if (primitive_type == NV2A_BEGIN_END::TRIANGLE_STRIP) { if (vertex_accumulated == 0) { - convert_vertices_poly(source, vertex_xy, 1); + convert_vertices(source, vertex_xy, 1); vertex_accumulated = 1; } else if (vertex_accumulated == 1) { - convert_vertices_poly(source, vertex_xy + 1, 1); + convert_vertices(source, vertex_xy + 1, 1); vertex_accumulated = 2; vertex_count = 2; } @@ -2949,40 +2949,40 @@ void nv2a_renderer::assemble_primitive(vertex_nv *source, int count, render_dele primitives_count++; // if software sends the vertices 0 1 2 3 4 5 6 // hardware will draw triangles made by (0,1,2) (1,3,2) (2,3,4) (3,5,4) (4,5,6) - convert_vertices_poly(source, vertex_xy + vertex_count, 1); + convert_vertices(source, vertex_xy + vertex_count, 1); if ((vertex_count & 1) == 0) - render_triangle_clipping(limits_rendertarget, renderspans, 5 + 4 * 2, vertex_xy[(vertex_count - 2) & 1023], vertex_xy[(vertex_count - 1) & 1023], vertex_xy[vertex_count]); + render_triangle_clipping(limits_rendertarget, 5 + 4 * 2, vertex_xy[(vertex_count - 2) & 1023], vertex_xy[(vertex_count - 1) & 1023], vertex_xy[vertex_count]); else - render_triangle_clipping(limits_rendertarget, renderspans, 5 + 4 * 2, vertex_xy[(vertex_count - 2) & 1023], vertex_xy[vertex_count], vertex_xy[(vertex_count - 1) & 1023]); + render_triangle_clipping(limits_rendertarget, 5 + 4 * 2, vertex_xy[(vertex_count - 2) & 1023], vertex_xy[vertex_count], vertex_xy[(vertex_count - 1) & 1023]); vertex_count = (vertex_count + 1) & 1023; - wait(); + rasterizer.wait(); } } else if (primitive_type == NV2A_BEGIN_END::QUAD_STRIP) { if (vertex_accumulated == 0) { - convert_vertices_poly(source, vertex_xy, 1); + convert_vertices(source, vertex_xy, 1); vertex_accumulated = 1; } else if (vertex_accumulated == 1) { - convert_vertices_poly(source, vertex_xy + 1, 1); + convert_vertices(source, vertex_xy + 1, 1); vertex_accumulated = 2; vertex_count = 0; } else { - convert_vertices_poly(source, vertex_xy + ((vertex_count + vertex_accumulated) & 1023), 1); + convert_vertices(source, vertex_xy + ((vertex_count + vertex_accumulated) & 1023), 1); vertex_accumulated++; if (vertex_accumulated == 4) { primitives_count++; // quad is made of vertices vertex count +0 +1 +3 +2 - render_triangle_clipping(limits_rendertarget, renderspans, 5 + 4 * 2, vertex_xy[vertex_count + 0], vertex_xy[vertex_count + 1], vertex_xy[(vertex_count + 3) & 1023]); - render_triangle_clipping(limits_rendertarget, renderspans, 5 + 4 * 2, vertex_xy[(vertex_count + 3) & 1023], vertex_xy[(vertex_count + 2) & 1023], vertex_xy[vertex_count + 0]); + render_triangle_clipping(limits_rendertarget, 5 + 4 * 2, vertex_xy[vertex_count + 0], vertex_xy[vertex_count + 1], vertex_xy[(vertex_count + 3) & 1023]); + render_triangle_clipping(limits_rendertarget, 5 + 4 * 2, vertex_xy[(vertex_count + 3) & 1023], vertex_xy[(vertex_count + 2) & 1023], vertex_xy[vertex_count + 0]); vertex_accumulated = 2; vertex_count = (vertex_count + 2) & 1023; - wait(); + rasterizer.wait(); } } } @@ -3072,11 +3072,11 @@ int nv2a_renderer::execute_method_3d(address_space& space, uint32_t chanel, uint primitive_type = (NV2A_BEGIN_END)data; if (data != 0) { if (((channel[chanel][subchannel].object.method[0x1e60 / 4] & 7) > 0) && (combiner.used != 0)) - render_spans_callback = render_delegate(&nv2a_renderer::render_register_combiners, this); + render_spans_callback = nv2a_rasterizer::render_delegate(&nv2a_renderer::render_register_combiners, this); else if (texture[0].enabled) - render_spans_callback = render_delegate(&nv2a_renderer::render_texture_simple, this); + render_spans_callback = nv2a_rasterizer::render_delegate(&nv2a_renderer::render_texture_simple, this); else - render_spans_callback = render_delegate(&nv2a_renderer::render_color, this); + render_spans_callback = nv2a_rasterizer::render_delegate(&nv2a_renderer::render_color, this); } countlen--; } @@ -3092,7 +3092,7 @@ int nv2a_renderer::execute_method_3d(address_space& space, uint32_t chanel, uint #endif for (n = 0; n <= count; n++) { read_vertices_0x1810(space, vertex_software + vertex_first, n + offset, 1); - assemble_primitive(vertex_software + vertex_first, 1, render_spans_callback); + assemble_primitive(vertex_software + vertex_first, 1); vertex_first = (vertex_first + 1) & 1023; } countlen--; @@ -3124,7 +3124,7 @@ int nv2a_renderer::execute_method_3d(address_space& space, uint32_t chanel, uint address += 4; countlen--; read_vertices_0x180x(space, vertex_software + vertex_first, address, mult); - assemble_primitive(vertex_software + vertex_first, mult, render_spans_callback); + assemble_primitive(vertex_software + vertex_first, mult); vertex_first = (vertex_first + mult) & 1023; } } @@ -3145,7 +3145,7 @@ int nv2a_renderer::execute_method_3d(address_space& space, uint32_t chanel, uint break; } address = address + c * 4; - assemble_primitive(vertex_software + vertex_first, 1, render_spans_callback); + assemble_primitive(vertex_software + vertex_first, 1); vertex_first = (vertex_first + 1) & 1023; } } @@ -3161,7 +3161,7 @@ int nv2a_renderer::execute_method_3d(address_space& space, uint32_t chanel, uint persistvertexattr.attribute[attr].fv[2] = 0; persistvertexattr.attribute[attr].fv[3] = 1; if (attr == 0) - assemble_primitive(&persistvertexattr, 1, render_spans_callback); + assemble_primitive(&persistvertexattr, 1); } } if ((maddress >= 0x1900) && (maddress < 0x1940)) @@ -3176,7 +3176,7 @@ int nv2a_renderer::execute_method_3d(address_space& space, uint32_t chanel, uint persistvertexattr.attribute[attr].fv[2] = 0; persistvertexattr.attribute[attr].fv[3] = 1; if (attr == 0) - assemble_primitive(&persistvertexattr, 1, render_spans_callback); + assemble_primitive(&persistvertexattr, 1); } if ((maddress >= 0x1940) && (maddress < 0x1980)) { @@ -3192,7 +3192,7 @@ int nv2a_renderer::execute_method_3d(address_space& space, uint32_t chanel, uint persistvertexattr.attribute[attr].fv[2] = (float)d3; persistvertexattr.attribute[attr].fv[3] = (float)d4; if (attr == 0) - assemble_primitive(&persistvertexattr, 1, render_spans_callback); + assemble_primitive(&persistvertexattr, 1); } if ((maddress >= 0x1980) && (maddress < 0x1a00)) { @@ -3206,7 +3206,7 @@ int nv2a_renderer::execute_method_3d(address_space& space, uint32_t chanel, uint persistvertexattr.attribute[attr].fv[comp+1] = (float)((int16_t)d2); if (comp == 2) if (attr == 0) - assemble_primitive(&persistvertexattr, 1, render_spans_callback); + assemble_primitive(&persistvertexattr, 1); } if ((maddress >= 0x1a00) && (maddress < 0x1b00)) { @@ -3217,7 +3217,7 @@ int nv2a_renderer::execute_method_3d(address_space& space, uint32_t chanel, uint persistvertexattr.attribute[attr].iv[comp] = data; if (comp == 3) if (attr == 0) - assemble_primitive(&persistvertexattr, 1, render_spans_callback); + assemble_primitive(&persistvertexattr, 1); } if ((maddress >= 0x1518) && (maddress < 0x1528)) { @@ -3226,7 +3226,7 @@ int nv2a_renderer::execute_method_3d(address_space& space, uint32_t chanel, uint persistvertexattr.attribute[(int)NV2A_VERTEX_ATTR::POS].iv[comp] = data; if (comp == 3) - assemble_primitive(&persistvertexattr, 1, render_spans_callback); + assemble_primitive(&persistvertexattr, 1); } if ((maddress >= 0x1720) && (maddress < 0x1760)) { int bit = maddress / 4 - 0x1720 / 4; |