diff --git a/src/mame/video/hng64.c b/src/mame/video/hng64.c index 268942ca577..96554224dea 100644 --- a/src/mame/video/hng64.c +++ b/src/mame/video/hng64.c @@ -288,11 +288,9 @@ TILE_GET_INFO_MEMBER(hng64_state::get_hng64_tile3_16x16_info) WRITE32_MEMBER(hng64_state::hng64_videoram_w) { - int realoff; + const int realoff = (offset * 4); COMBINE_DATA(&m_videoram[offset]); - realoff = offset*4; - if ((realoff>=0) && (realoff<0x10000)) { hng64_mark_tile_dirty(0, offset&0x3fff); @@ -309,9 +307,9 @@ WRITE32_MEMBER(hng64_state::hng64_videoram_w) { hng64_mark_tile_dirty(3, offset&0x3fff); } - -// if ((realoff>=0x40000)) osd_printf_debug("offsw %08x %08x\n",realoff,data); - + + // Offsets 0x40000 - 0x58000 are for "floor" scanline control + /* 400000 - 7fffff is scroll regs etc. */ } @@ -662,10 +660,6 @@ void hng64_state::hng64_drawtilemap(screen_device &screen, bitmap_rgb32 &bitmap, else tilemap = m_tilemap[tm].m_tilemap_8x8; // _alt } - // xrally's pink tilemaps make me think this is a tilemap enable bit. - // fatfurwa makes me think otherwise. -// if (!(tileregs & 0x0040)) return; - // set the transmask so our manual copy is correct if (tileregs & 0x0400) transmask = 0xff; @@ -675,42 +669,92 @@ void hng64_state::hng64_drawtilemap(screen_device &screen, bitmap_rgb32 &bitmap, // buriki tm1 = roz // my life would be easier if the roz we're talking about for complex zoom wasn't setting this as well - if ((tileregs & 0x0800)==0x0000) // floor mode + if ((tileregs & 0x0800)==0x0000) // floor mode -- could actually be related to ((tileregs & 0xf000) == 0x1000). { - /* Floor mode - per pixel simple / complex modes? -- every other line? - (there doesn't seem to be enough data in Buriki for every line at least) - */ - //if ((tileregs&0xf000) == 0x1000) + // fprintf(stderr, "Tilemap %d is a floor using :\n", tm); + + // Floor buffer enables + // TODO: the upper bit(s) in here are probably useful to check as well + const int floorInner0 = (hng64_videoregs[0x04] & 0x00000600) >> 9; + const int floorInner1 = (hng64_videoregs[0x05] & 0x06000000) >> 25; (void)floorInner1; + const int floorInner2 = (hng64_videoregs[0x05] & 0x00000600) >> 9; + const int floorOuter0 = (hng64_videoregs[0x04] & 0x00001800) >> 11; + const int floorOuter1 = (hng64_videoregs[0x05] & 0x18000000) >> 27; (void)floorOuter1; + const int floorOuter2 = (hng64_videoregs[0x05] & 0x00001800) >> 11; + // fprintf(stderr, "Buffers %d-%d %d-%d %d-%d\n", floorOuter2, floorInner2, floorOuter1, floorInner1, floorOuter0, floorInner0); + + // TODO: This can likely be simplified with some &s and some <>12); @@ -718,16 +762,18 @@ void hng64_state::hng64_drawtilemap(screen_device &screen, bitmap_rgb32 &bitmap, } else // 'simple' mode with linescroll, used in some ss64_2 levels (assumed to be correct, but doesn't do much with it.. so could be wrong) { - for (line=0;line<448;line++) + INT32 xtopleft, xmiddle; + INT32 ytopleft, ymiddle; + + for (int line=0; line < 448; line++) { clip.min_y = clip.max_y = line; if (hng64_videoregs[0x00]&0x00010000) // disable all scrolling / zoom (test screen) (maybe) { - /* If this bit is active the scroll registers don't seem valid at all? - It either disables zooming, or disables use of the scroll registers completely - - used at startup - */ + // If this bit is active the scroll registers don't seem valid at all? + // It either disables zooming, or disables use of the scroll registers completely + // - used at startup xtopleft = 0; xmiddle = 256<<16; @@ -738,20 +784,18 @@ void hng64_state::hng64_drawtilemap(screen_device &screen, bitmap_rgb32 &bitmap, else { xtopleft = (hng64_videoram[(0x40000+(line*0x10)+(scrollbase<<4))/4]); - xmiddle = (hng64_videoram[(0x40004+(line*0x10)+(scrollbase<<4))/4]); // middle screen point + xmiddle = (hng64_videoram[(0x40004+(line*0x10)+(scrollbase<<4))/4]); // middle screen point ytopleft = (hng64_videoram[(0x40008+(line*0x10)+(scrollbase<<4))/4]); - ymiddle = (hng64_videoram[(0x4000c+(line*0x10)+(scrollbase<<4))/4]); // middle screen point + ymiddle = (hng64_videoram[(0x4000c+(line*0x10)+(scrollbase<<4))/4]); // middle screen point } - xinc = (xmiddle - xtopleft) / 512; - yinc = (ymiddle - ytopleft) / 512; + const int xinc = (xmiddle - xtopleft) / 512; + const int yinc = (ymiddle - ytopleft) / 512; hng64_tilemap_draw_roz(screen, bitmap,clip,tilemap,xtopleft,ytopleft, xinc<<1,0,0,yinc<<1, 1, 0,0, debug_blend_enabled?HNG64_TILEMAP_ADDITIVE:HNG64_TILEMAP_NORMAL); - - } } }