diff options
Diffstat (limited to 'src/mame/video/hng64.cpp')
-rw-r--r-- | src/mame/video/hng64.cpp | 1313 |
1 files changed, 0 insertions, 1313 deletions
diff --git a/src/mame/video/hng64.cpp b/src/mame/video/hng64.cpp deleted file mode 100644 index 942bac2c7b3..00000000000 --- a/src/mame/video/hng64.cpp +++ /dev/null @@ -1,1313 +0,0 @@ -// license:LGPL-2.1+ -// copyright-holders:David Haywood, Angelo Salese, ElSemi, Andrew Gardner -#include "emu.h" -#include "includes/hng64.h" - -#define BLEND_TEST 0 - -#define HNG64_VIDEO_DEBUG 0 - - -void hng64_state::hng64_mark_all_tiles_dirty( int tilemap ) -{ - m_tilemap[tilemap].m_tilemap_8x8->mark_all_dirty(); - m_tilemap[tilemap].m_tilemap_16x16->mark_all_dirty(); - m_tilemap[tilemap].m_tilemap_16x16_alt->mark_all_dirty(); -} - -void hng64_state::hng64_mark_tile_dirty( int tilemap, int tile_index ) -{ - m_tilemap[tilemap].m_tilemap_8x8->mark_tile_dirty(tile_index); - m_tilemap[tilemap].m_tilemap_16x16->mark_tile_dirty(tile_index); - m_tilemap[tilemap].m_tilemap_16x16_alt->mark_tile_dirty(tile_index); -} - - -// make this a function! -// pppppppp ffattttt tttttttt tttttttt -#define HNG64_GET_TILE_INFO \ -{ \ - uint16_t tilemapinfo = (m_videoregs[reg]>>shift)&0xffff; \ - int tileno,pal, flip; \ - \ - tileno = m_videoram[tile_index+(offset/4)]; \ - \ - pal = (tileno&0xff000000)>>24; \ - flip =(tileno&0x00c00000)>>22; \ - \ - if (tileno&0x200000) \ - { \ - tileno = (tileno & m_videoregs[0x0b]) | m_videoregs[0x0c]; \ - } \ - \ - tileno &= 0x1fffff; \ - \ - if (size==0) \ - { \ - if (tilemapinfo&0x400) \ - { \ - SET_TILE_INFO_MEMBER(1,tileno>>1,pal>>4,TILE_FLIPYX(flip)); \ - } \ - else \ - { \ - SET_TILE_INFO_MEMBER(0,tileno, pal,TILE_FLIPYX(flip)); \ - } \ - } \ - else \ - { \ - if (tilemapinfo&0x400) \ - { \ - SET_TILE_INFO_MEMBER(3,tileno>>3,pal>>4,TILE_FLIPYX(flip)); \ - } \ - else \ - { \ - SET_TILE_INFO_MEMBER(2,tileno>>2, pal,TILE_FLIPYX(flip)); \ - } \ - } \ -} - -TILE_GET_INFO_MEMBER(hng64_state::get_hng64_tile0_8x8_info) -{ - int offset = 0x00000; - int size = 0; - int reg = 0x02; - int shift = 16; - - HNG64_GET_TILE_INFO -} - -TILE_GET_INFO_MEMBER(hng64_state::get_hng64_tile0_16x16_info) -{ - int offset = 0x00000; - int size = 1; - int reg = 0x02; - int shift = 16; - - HNG64_GET_TILE_INFO -} - -TILE_GET_INFO_MEMBER(hng64_state::get_hng64_tile1_8x8_info) -{ - int offset = 0x10000; - int size = 0; - int reg = 0x02; - int shift = 0; - - HNG64_GET_TILE_INFO -} - -TILE_GET_INFO_MEMBER(hng64_state::get_hng64_tile1_16x16_info) -{ - int offset = 0x10000; - int size = 1; - int reg = 0x02; - int shift = 0; - - HNG64_GET_TILE_INFO -} - -TILE_GET_INFO_MEMBER(hng64_state::get_hng64_tile2_8x8_info) -{ - int offset = 0x20000; - int size = 0; - int reg = 0x03; - int shift = 16; - - HNG64_GET_TILE_INFO -} - -TILE_GET_INFO_MEMBER(hng64_state::get_hng64_tile2_16x16_info) -{ - int offset = 0x20000; - int size = 1; - int reg = 0x03; - int shift = 16; - - HNG64_GET_TILE_INFO -} - -TILE_GET_INFO_MEMBER(hng64_state::get_hng64_tile3_8x8_info) -{ - int offset = 0x30000; - int size = 0; - int reg = 0x03; - int shift = 0; - - HNG64_GET_TILE_INFO -} - -TILE_GET_INFO_MEMBER(hng64_state::get_hng64_tile3_16x16_info) -{ - int offset = 0x30000; - int size = 1; - int reg = 0x03; - int shift = 0; - - HNG64_GET_TILE_INFO -} - - -WRITE32_MEMBER(hng64_state::hng64_videoram_w) -{ - const int realoff = (offset * 4); - COMBINE_DATA(&m_videoram[offset]); - - if ((realoff>=0) && (realoff<0x10000)) - { - hng64_mark_tile_dirty(0, offset&0x3fff); - } - else if ((realoff>=0x10000) && (realoff<0x20000)) - { - hng64_mark_tile_dirty(1, offset&0x3fff); - } - else if ((realoff>=0x20000) && (realoff<0x30000)) - { - hng64_mark_tile_dirty(2, offset&0x3fff); - } - else if ((realoff>=0x30000) && (realoff<0x40000)) - { - hng64_mark_tile_dirty(3, offset&0x3fff); - } - // Offsets 0x40000 - 0x58000 are for "floor" scanline control - - /* 400000 - 7fffff is scroll regs etc. */ -} - -/* internal set of transparency states for rendering */ - - -static void hng64_configure_blit_parameters(blit_parameters *blit, tilemap_t *tmap, bitmap_rgb32 &dest, const rectangle &cliprect, uint32_t flags, uint8_t priority, uint8_t priority_mask, hng64trans_t drawformat) -{ - /* start with nothing */ - memset(blit, 0, sizeof(*blit)); - - /* set the target bitmap */ - blit->bitmap = &dest; - - /* if we have a cliprect, copy */ - blit->cliprect = cliprect; - - /* set the priority code and alpha */ - //blit->tilemap_priority_code = priority | (priority_mask << 8) | (tmap->palette_offset << 16); // fixit - blit->alpha = (flags & TILEMAP_DRAW_ALPHA_FLAG) ? (flags >> 24) : 0xff; - - blit->drawformat = drawformat; - - /* tile priority; unless otherwise specified, draw anything in layer 0 */ - blit->mask = TILEMAP_PIXEL_CATEGORY_MASK; - blit->value = flags & TILEMAP_PIXEL_CATEGORY_MASK; - - /* if no layers specified, draw layer 0 */ - if ((flags & (TILEMAP_DRAW_LAYER0 | TILEMAP_DRAW_LAYER1 | TILEMAP_DRAW_LAYER2)) == 0) - flags |= TILEMAP_DRAW_LAYER0; - - /* OR in the bits from the draw masks */ - blit->mask |= flags & (TILEMAP_DRAW_LAYER0 | TILEMAP_DRAW_LAYER1 | TILEMAP_DRAW_LAYER2); - blit->value |= flags & (TILEMAP_DRAW_LAYER0 | TILEMAP_DRAW_LAYER1 | TILEMAP_DRAW_LAYER2); - - /* for all-opaque rendering, don't check any of the layer bits */ - if (flags & TILEMAP_DRAW_OPAQUE) - { - blit->mask &= ~(TILEMAP_PIXEL_LAYER0 | TILEMAP_PIXEL_LAYER1 | TILEMAP_PIXEL_LAYER2); - blit->value &= ~(TILEMAP_PIXEL_LAYER0 | TILEMAP_PIXEL_LAYER1 | TILEMAP_PIXEL_LAYER2); - } - - /* don't check category if requested */ - if (flags & TILEMAP_DRAW_ALL_CATEGORIES) - { - blit->mask &= ~TILEMAP_PIXEL_CATEGORY_MASK; - blit->value &= ~TILEMAP_PIXEL_CATEGORY_MASK; - } -} - - -/*------------------------------------------------- - tilemap_draw_roz_core - render the tilemap's - pixmap to the destination with rotation - and zoom --------------------------------------------------*/ - -#define HNG64_ROZ_PLOT_PIXEL(INPUT_VAL) \ -do { \ - if (blit->drawformat == HNG64_TILEMAP_NORMAL) \ - *(uint32_t *)dest = clut[INPUT_VAL]; \ - else if (blit->drawformat == HNG64_TILEMAP_ADDITIVE) \ - *(uint32_t *)dest = add_blend_r32(*(uint32_t *)dest, clut[INPUT_VAL]); \ - else if (blit->drawformat == HNG64_TILEMAP_ALPHA) \ - *(uint32_t *)dest = alpha_blend_r32(*(uint32_t *)dest, clut[INPUT_VAL], alpha); \ -} while (0) - -void hng64_state::hng64_tilemap_draw_roz_core(screen_device &screen, tilemap_t *tmap, const blit_parameters *blit, - uint32_t startx, uint32_t starty, int incxx, int incxy, int incyx, int incyy, int wraparound) -{ - const pen_t *clut = &m_palette->pen(blit->tilemap_priority_code >> 16); - bitmap_ind8 &priority_bitmap = screen.priority(); - bitmap_rgb32 &destbitmap = *blit->bitmap; - bitmap_ind16 &srcbitmap = tmap->pixmap(); - bitmap_ind8 &flagsmap = tmap->flagsmap(); - const int xmask = srcbitmap.width()-1; - const int ymask = srcbitmap.height()-1; - const int widthshifted = srcbitmap.width() << 16; - const int heightshifted = srcbitmap.height() << 16; - uint32_t priority = blit->tilemap_priority_code; - uint8_t mask = blit->mask; - uint8_t value = blit->value; - uint8_t alpha = blit->alpha; - uint32_t cx; - uint32_t cy; - int x; - int sx; - int sy; - int ex; - int ey; - uint32_t *dest; - uint8_t *pri; - const uint16_t *src; - const uint8_t *maskptr; - - /* pre-advance based on the cliprect */ - startx += blit->cliprect.min_x * incxx + blit->cliprect.min_y * incyx; - starty += blit->cliprect.min_x * incxy + blit->cliprect.min_y * incyy; - - /* extract start/end points */ - sx = blit->cliprect.min_x; - sy = blit->cliprect.min_y; - ex = blit->cliprect.max_x; - ey = blit->cliprect.max_y; - - /* optimized loop for the not rotated case */ - if (incxy == 0 && incyx == 0 && !wraparound) - { - /* skip without drawing until we are within the bitmap */ - while (startx >= widthshifted && sx <= ex) - { - startx += incxx; - sx++; - } - - /* early exit if we're done already */ - if (sx > ex) - return; - - /* loop over rows */ - while (sy <= ey) - { - /* only draw if Y is within range */ - if (starty < heightshifted) - { - /* initialize X counters */ - x = sx; - cx = startx; - cy = starty >> 16; - - /* get source and priority pointers */ - pri = &priority_bitmap.pix8(sy, sx); - src = &srcbitmap.pix16(cy); - maskptr = &flagsmap.pix8(cy); - dest = &destbitmap.pix32(sy, sx); - - /* loop over columns */ - while (x <= ex && cx < widthshifted) - { - /* plot if we match the mask */ - if ((maskptr[cx >> 16] & mask) == value) - { - HNG64_ROZ_PLOT_PIXEL(src[cx >> 16]); - *pri = (*pri & (priority >> 8)) | priority; - } - - /* advance in X */ - cx += incxx; - x++; - dest++; - pri++; - } - } - - /* advance in Y */ - starty += incyy; - sy++; - } - } - - /* wraparound case */ - else if (wraparound) - { - /* loop over rows */ - while (sy <= ey) - { - /* initialize X counters */ - x = sx; - cx = startx; - cy = starty; - - /* get dest and priority pointers */ - dest = &destbitmap.pix32(sy, sx); - pri = &priority_bitmap.pix8(sy, sx); - - /* loop over columns */ - while (x <= ex) - { - /* plot if we match the mask */ - if ((flagsmap.pix8((cy >> 16) & ymask, (cx >> 16) & xmask) & mask) == value) - { - HNG64_ROZ_PLOT_PIXEL(srcbitmap.pix16((cy >> 16) & ymask, (cx >> 16) & xmask)); - *pri = (*pri & (priority >> 8)) | priority; - } - - /* advance in X */ - cx += incxx; - cy += incxy; - x++; - dest++; - pri++; - } - - /* advance in Y */ - startx += incyx; - starty += incyy; - sy++; - } - } - - /* non-wraparound case */ - else - { - /* loop over rows */ - while (sy <= ey) - { - /* initialize X counters */ - x = sx; - cx = startx; - cy = starty; - - /* get dest and priority pointers */ - dest = &destbitmap.pix32(sy, sx); - pri = &priority_bitmap.pix8(sy, sx); - - /* loop over columns */ - while (x <= ex) - { - /* plot if we're within the bitmap and we match the mask */ - if (cx < widthshifted && cy < heightshifted) - if ((flagsmap.pix8(cy >> 16, cx >> 16) & mask) == value) - { - HNG64_ROZ_PLOT_PIXEL(srcbitmap.pix16(cy >> 16, cx >> 16)); - *pri = (*pri & (priority >> 8)) | priority; - } - - /* advance in X */ - cx += incxx; - cy += incxy; - x++; - dest++; - pri++; - } - - /* advance in Y */ - startx += incyx; - starty += incyy; - sy++; - } - } -} - - - -void hng64_state::hng64_tilemap_draw_roz_primask(screen_device &screen, bitmap_rgb32 &dest, const rectangle &cliprect, tilemap_t *tmap, - uint32_t startx, uint32_t starty, int incxx, int incxy, int incyx, int incyy, - int wraparound, uint32_t flags, uint8_t priority, uint8_t priority_mask, hng64trans_t drawformat) -{ - blit_parameters blit; - - // notes: - // - startx and starty MUST be uint32_t for calculations to work correctly - // - srcbitmap->width and height are assumed to be a power of 2 to speed up wraparound - - // skip if disabled - //if (!tmap->enable) - // return; - -g_profiler.start(PROFILER_TILEMAP_DRAW_ROZ); - /* configure the blit parameters */ - hng64_configure_blit_parameters(&blit, tmap, dest, cliprect, flags, priority, priority_mask, drawformat); - - /* get the full pixmap for the tilemap */ - tmap->pixmap(); - - /* then do the roz copy */ - hng64_tilemap_draw_roz_core(screen, tmap, &blit, startx, starty, incxx, incxy, incyx, incyy, wraparound); -g_profiler.stop(); -} - - -inline void hng64_state::hng64_tilemap_draw_roz(screen_device &screen, bitmap_rgb32 &dest, const rectangle &cliprect, tilemap_t *tmap, - uint32_t startx, uint32_t starty, int incxx, int incxy, int incyx, int incyy, - int wraparound, uint32_t flags, uint8_t priority, hng64trans_t drawformat) -{ - hng64_tilemap_draw_roz_primask(screen, dest, cliprect, tmap, startx, starty, incxx, incxy, incyx, incyy, wraparound, flags, priority, 0xff, drawformat); -} - - - -/* - * Video Regs Format (appear to just be tilemap regs) - * -------------------------------------------------- - * - * uint32_t | Bits | Use - * | 3322 2222 2222 1111 1111 11 | - * -------+-1098-7654-3210-9876-5432-1098-7654-3210-+---------------- - * 0 | ---- -Cdd ---- -??Z ---- ---- ---- ---- | C = global complex zoom - | 0000 0011 - road edge alt 1 | dd = global tilemap dimension selector - | 0000 0111 - road edge alt 2 | ? = Always Set? - | | Z = Global Zoom Disable? - * 1 | oooo oooo oooo oooo ---- ---- ---- ---- | unknown - 0001 is a popular value. Explore. - * 1 | ---- ---- ---- ---- oooo oooo oooo oooo | unknown - untouched in sams64 games, initialized elsewhere - * 2 | xxxx xxxx xxxx xxxx ---- ---- ---- ---- | tilemap0 per layer flags - * 2 | ---- ---- ---- ---- xxxx xxxx xxxx xxxx | tilemap1 per layer flags - * 3 | xxxx xxxx xxxx xxxx ---- ---- ---- ---- | tilemap2 per layer flags - * 3 | ---- ---- ---- ---- xxxx xxxx xxxx xxxx | tilemap3 per layer flags - * 4 | xxxx xxxx xxxx xxxx ---- ---- ---- ---- | tilemap0 scrollbase when not floor, lineram offset when floor - * 4 | ---- ---- ---- ---- xxxx xxxx xxxx xxxx | tilemap1 scrollbase when not floor, lineram offset when floor - * 5 | xxxx xxxx xxxx xxxx ---- ---- ---- ---- | tilemap3 scrollbase when not floor, lineram offset when floor - * 5 | ---- ---- ---- ---- xxxx xxxx xxxx xxxx | tilemap4 scrollbase when not floor, lineram offset when floor - * 6 | oooo oooo oooo oooo oooo oooo oooo oooo | unknown - always seems to be 000001ff (fatfurwa) - * 7 | oooo oooo oooo oooo oooo oooo oooo oooo | unknown - always seems to be 000001ff (fatfurwa) - * 8 | oooo oooo oooo oooo oooo oooo oooo oooo | unknown - always seems to be 80008000 (fatfurwa) - * 9 | oooo oooo oooo oooo oooo oooo oooo oooo | unknown - always seems to be 00000000 (fatfurwa) - * a | oooo oooo oooo oooo oooo oooo oooo oooo | unknown - always seems to be 00000000 (fatfurwa) - * b | mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm | auto animation mask for tilemaps - * c | xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx | auto animation bits for tilemaps - * d | oooo oooo oooo oooo oooo oooo oooo oooo | not used ?? - * e | oooo oooo oooo oooo oooo oooo oooo oooo | not used ?? - - // tilemap0 per layer flags - // 0840 - startup tests, 8x8x4 layer - // 0cc0 - beast busters 2, 8x8x8 layer - // 0860 - fatal fury wa - // 08e0 - fatal fury wa during transitions - // 0940 - samurai shodown 64 - // 0880 - buriki - - // Individual tilemap regs format - // ------------------------------ - // mmmm dbr? ??ez zzzz - // m = Tilemap mosaic level [0-15] - confirmed in sams64 demo mode - // -- they seem to enable mosaic at the same time as rowscroll in several cases (floor in buriki / ff) - // and also on the rotating logo in buriki.. does it cause some kind of aliasing side-effect, or.. ? - // d = line (floor) mode - buriki, fatafurwa, some backgrounds in ss64_2 - // b = 4bpp/8bpp (seems correct) (beast busters, samsh64, sasm64 2, xrally switch it for some screens) - // r = tile size (seems correct) - // e = tilemap enable bit according to sams64_2 - // z = z depth/priority? tilemaps might also be affected by min / max clip values somewhere? - // (debug layer on buriki has priority 0x020, which would be highest) - */ - - -void hng64_state::hng64_drawtilemap(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int tm) -{ - // Useful bits from the global tilemap flags - const uint32_t& global_tileregs = m_videoregs[0x00]; - const int global_dimensions = (global_tileregs & 0x03000000) >> 24; - const int global_alt_scroll_register_format = global_tileregs & 0x04000000; - const int global_zoom_disable = global_tileregs & 0x00010000; - - // Debug blending on/off based on m_additive_tilemap_debug - int debug_blend_enabled = 0; - if ((m_additive_tilemap_debug&(1 << tm))) - debug_blend_enabled = 1; - -#if HNG64_VIDEO_DEBUG - if ((global_dimensions != 0) && (global_dimensions != 3)) - popmessage("unsupported global_dimensions on tilemaps"); -#endif - - // Determine which tilemap registers and scroll base this tilemap uses - uint16_t tileregs = 0; - uint16_t scrollbase = 0; - if (tm==0) - { - scrollbase = (m_videoregs[0x04]&0x3fff0000)>>16; - tileregs = (m_videoregs[0x02]&0xffff0000)>>16; - } - else if (tm==1) - { - scrollbase = (m_videoregs[0x04]&0x00003fff)>>0; - tileregs = (m_videoregs[0x02]&0x0000ffff)>>0; - } - else if (tm==2) - { - scrollbase = (m_videoregs[0x05]&0x3fff0000)>>16; - tileregs = (m_videoregs[0x03]&0xffff0000)>>16; - } - else if (tm==3) - { - scrollbase = (m_videoregs[0x05]&0x00003fff)>>0; - tileregs = (m_videoregs[0x03]&0x0000ffff)>>0; - } - - // Useful bits from the tilemap registers - const uint8_t mosaicValueBits = (tileregs & 0xf000) >> 12; (void)mosaicValueBits; - const uint8_t floorModeBit = (tileregs & 0x0800) >> 11; - const uint8_t bppBit = (tileregs & 0x0400) >> 10; - const uint8_t bigTilemapBit = (tileregs & 0x0200) >> 9; - const uint8_t tilemapEnableBit = (tileregs & 0x0040) >> 6; (void)tilemapEnableBit; - - // Tilemap drawing enable (sams64_2 demo mode says this is legit) - //if (!tilemapEnableBit) - //{ - // return; - //} - - // Select the proper tilemap size - tilemap_t* tilemap = nullptr; - if (global_dimensions==0) - { - if (bigTilemapBit) tilemap = m_tilemap[tm].m_tilemap_16x16; - else tilemap = m_tilemap[tm].m_tilemap_8x8; - } - else - { - if (bigTilemapBit) tilemap = m_tilemap[tm].m_tilemap_16x16_alt; - else tilemap = m_tilemap[tm].m_tilemap_8x8; // _alt - } - - // Set the transmask so our manual copy is correct - int transmask = 0x00; - if (bppBit) - transmask = 0xff; - else - transmask = 0xf; - - if (floorModeBit == 0x0000) - { - // floor mode - // life would be easier if the roz we're talking about for complex zoom wasn't setting this as well - - // fprintf(stderr, "Tilemap %d is a floor using :\n", tm); - // const uint32_t floorAddress = 0x40000 + (scrollbase << 4); - - // TODO: The row count is correct, but how is this layer clipped? m_tcram? - - // See how many lines we have in the data region - // DEBUG: Change this to a loop that goes over each line and draws them - it's just for visualization now - //int lineCount = 0; - //for (int ii = 0; ii < 0x2000/4; ii += 4) - //{ - // const int realAddress = floorAddress/4; - // if (m_videoram[realAddress+ii] == 0xffffff00 && m_videoram[realAddress+ii+1] == 0xffffff00) - // continue; - // if (m_videoram[realAddress+ii] == 0x00000000 && m_videoram[realAddress+ii+1] == 0x00000000) - // continue; - // - // lineCount++; - //} - //printf("lines %d\n", lineCount); - - // Buriki uses a 2x mosaic effect on its floor, so its line count is half - // (but so does fatfurwa - maybe it overdraws a bunch of pixels?) - //if (m_mcu_type == BURIKI_MCU) - // lineCount *= 2; - - // DEBUG - draw a horizontal green line where the uppermost line of the floor is drawn - const rectangle &visarea = screen.visible_area(); - //if (lineCount < visarea.height()) - //{ - // for (int ii = 0; ii < visarea.width(); ii++) - // bitmap.pix32((visarea.height()-lineCount), ii) = 0xff00ff00; - //} - - // HACK : Clear RAM - this is "needed" in fatfurwa since it doesn't clear its own ram (buriki does) - // Figure out what the difference between the two programs is. It's possible writing to - // the linescroll ram fills a buffer and it's cleared automatically between frames? - // for (int ii = 0; ii < 0x2000/4; ii++) - //{ - // const int realAddress = floorAddress/4; - // m_videoram[realAddress+ii] = 0x00000000; - // } - - - // 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) - rectangle clip = visarea; - - // this was wrong, see below -// if (global_alt_scroll_register_format) // globally selects alt scroll register layout??? -// { - // Logic would dictate that this should be the 'complex' scroll register layout, - // but per-line. That doesn't work however. - // - // You only have line data for the number of lines on the screen, not enough for - // the complex register layout - // - // HOWEVER, using the code below doesn't work either. This might be because - // they have mosaic turned on, and it adopts a new meaning in linescroll modes? - // - // The code below could also be wrong, and rowscroll simply acts the same in all - // modes, this is hard to know because ss64_2 barely uses it. - // - // buriki line data is at 20146000 (physical) - -//#if HNG64_VIDEO_DEBUG -// popmessage("Unhandled rowscroll %02x", tileregs>>12); -//#endif -// } -// 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) - { - int32_t xtopleft, xmiddle; - int32_t ytopleft, ymiddle; - - for (int line=0; line < 448; line++) - { - clip.min_y = clip.max_y = line; - - if (global_zoom_disable) // 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 - - xtopleft = 0; - xmiddle = 256<<16; - - ytopleft = 0; - ymiddle = 256<<16; - } - else - { - xtopleft = (m_videoram[(0x40000+(line*0x10)+(scrollbase<<4))/4]); - xmiddle = (m_videoram[(0x40004+(line*0x10)+(scrollbase<<4))/4]); // middle screen point - ytopleft = (m_videoram[(0x40008+(line*0x10)+(scrollbase<<4))/4]); - ymiddle = (m_videoram[(0x4000c+(line*0x10)+(scrollbase<<4))/4]); // middle screen point - } - - const int xinc = (xmiddle - xtopleft) / 512; - const int yinc = (ymiddle - ytopleft) / 512; - // TODO: if global_alt_scroll_register_format is enabled uses incxy / incyx into calculation somehow ... - - 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); - } - } - } - else - { - // 0x1000 is set up the buriki 2nd title screen with rotating logo and in fatal fury at various times? - - if (global_alt_scroll_register_format) // globally selects alt scroll register layout??? - { - /* complex zoom mode? */ - /* with this scroll register layout rotation effects are possible - the most obvious use of rotation is the Buriki One logo after - attract mode; the text around the outside of the logo is rotated - onto the screen - - see 1:32 in http://www.youtube.com/watch?v=PoYaHOILuGs - - Xtreme Rally seems to have an issue with this mode on the communication check - screen at startup, however during the period in which the values are invalid - it looks like the display shouldn't even be enabled (only gets enabled when - the value starts counting up) - - */ - - int32_t xtopleft,xmiddle, xalt; - int32_t ytopleft,ymiddle, yalt; - int xinc, xinc2, yinc, yinc2; - -#if HNG64_VIDEO_DEBUG - if (0) - if (tm==2) - popmessage("X %08x X %08x X %08x Y %08x Y %08x Y %08x", - m_videoram[(0x40000+(scrollbase<<4))/4], - m_videoram[(0x40004+(scrollbase<<4))/4], - m_videoram[(0x40010+(scrollbase<<4))/4], - /*m_videoram[(0x40014+(scrollbase<<4))/4],*/ // unused? (dupe value on fatfurwa, 00 on rest) - - m_videoram[(0x40008+(scrollbase<<4))/4], - m_videoram[(0x40018+(scrollbase<<4))/4], - m_videoram[(0x4000c+(scrollbase<<4))/4]); - /*m_videoram[(0x4001c+(scrollbase<<4))/4]);*/ // unused? (dupe value on fatfurwa, 00 on rest) -#endif - - - xtopleft = (m_videoram[(0x40000+(scrollbase<<4))/4]); - xalt = (m_videoram[(0x40004+(scrollbase<<4))/4]); // middle screen point - xmiddle = (m_videoram[(0x40010+(scrollbase<<4))/4]); - - ytopleft = (m_videoram[(0x40008+(scrollbase<<4))/4]); - yalt = (m_videoram[(0x40018+(scrollbase<<4))/4]); // middle screen point - ymiddle = (m_videoram[(0x4000c+(scrollbase<<4))/4]); - - xinc = (xmiddle - xtopleft) / 512; - yinc = (ymiddle - ytopleft) / 512; - xinc2 = (xalt-xtopleft) / 512; - yinc2 = (yalt-ytopleft) /512; - - - /* manual copy = slooow */ - if (BLEND_TEST) - { - bitmap_ind16 &bm = tilemap->pixmap(); - int bmheight = bm.height(); - int bmwidth = bm.width(); - const pen_t *paldata = m_palette->pens(); - uint32_t* dstptr; - uint16_t* srcptr; - int xx,yy; - - - int tmp = xtopleft; - int tmp2 = ytopleft; - //printf("start %08x end %08x start %08x end %08x\n", xtopleft, xmiddle, ytopleft, ymiddle); - - for (yy=0;yy<448;yy++) - { - dstptr = &bitmap.pix32(yy); - - tmp = xtopleft; - tmp2 = ytopleft; - - for (xx=0;xx<512;xx++) - { - int realsrcx = (xtopleft>>16)&(bmwidth-1); - int realsrcy = (ytopleft>>16)&(bmheight-1); - uint16_t pen; - - srcptr = &bm.pix16(realsrcy); - - pen = srcptr[realsrcx]; - - if (pen&transmask) - *dstptr = paldata[pen]; - - xtopleft+= xinc<<1; - ytopleft+= yinc2<<1; - ++dstptr; - } - - ytopleft = tmp2 + (yinc<<1); - xtopleft = tmp + (xinc2<<1); - } - } - else - { - hng64_tilemap_draw_roz(screen, bitmap,cliprect,tilemap,xtopleft,ytopleft, - xinc<<1,yinc2<<1,xinc2<<1,yinc<<1, - 1, - 0,0, debug_blend_enabled?HNG64_TILEMAP_ADDITIVE:HNG64_TILEMAP_NORMAL); - } - - } - else - { - /* simple zoom mode? - only 4 regs? */ - /* in this mode they can only specify the top left and middle screen points for each tilemap, - this allows simple zooming, but not rotation */ - - int32_t xtopleft,xmiddle; - int32_t ytopleft,ymiddle; - int xinc,yinc; - -#if HNG64_VIDEO_DEBUG - if (0) - if (tm==2) - popmessage("%08x %08x %08x %08x", - m_videoram[(0x40010+(scrollbase<<4))/4], - m_videoram[(0x40014+(scrollbase<<4))/4], - m_videoram[(0x40018+(scrollbase<<4))/4], - m_videoram[(0x4001c+(scrollbase<<4))/4]); -#endif - - if (global_zoom_disable) // 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 - */ - - xtopleft = 0; - xmiddle = 256<<16; - - ytopleft = 0; - ymiddle = 256<<16; - } - else - { - xtopleft = (m_videoram[(0x40000+(scrollbase<<4))/4]); - xmiddle = (m_videoram[(0x40004+(scrollbase<<4))/4]); // middle screen point - ytopleft = (m_videoram[(0x40008+(scrollbase<<4))/4]); - ymiddle = (m_videoram[(0x4000c+(scrollbase<<4))/4]); // middle screen point - } - - xinc = (xmiddle - xtopleft) / 512; - yinc = (ymiddle - ytopleft) / 512; - - /* manual copy = slooow */ - if (BLEND_TEST) - { - bitmap_ind16 &bm = tilemap->pixmap(); - int bmheight = bm.height(); - int bmwidth = bm.width(); - const pen_t *paldata = m_palette->pens(); - uint32_t* dstptr; - uint16_t* srcptr; - int xx,yy; - - int tmp = xtopleft; - - //printf("start %08x end %08x start %08x end %08x\n", xtopleft, xmiddle, ytopleft, ymiddle); - - for (yy=0;yy<448;yy++) - { - int realsrcy = (ytopleft>>16)&(bmheight-1); - - dstptr = &bitmap.pix32(yy); - srcptr = &bm.pix16(realsrcy); - - xtopleft = tmp; - - for (xx=0;xx<512;xx++) - { - int realsrcx = (xtopleft>>16)&(bmwidth-1); - - uint16_t pen; - - pen = srcptr[realsrcx]; - - if (pen&transmask) - *dstptr = paldata[pen]; - - xtopleft+= xinc<<1; - ++dstptr; - } - - ytopleft+= yinc<<1; - } - } - else - { - hng64_tilemap_draw_roz(screen, bitmap,cliprect,tilemap,xtopleft,ytopleft, - xinc<<1,0,0,yinc<<1, - 1, - 0,0, debug_blend_enabled?HNG64_TILEMAP_ADDITIVE:HNG64_TILEMAP_NORMAL); - } - } - } -} - - -uint32_t hng64_state::screen_update_hng64(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) -{ -#if 0 - // press in sams64_2 attract mode for a nice debug screen from the game - // not sure how functional it is, and it doesn't appear to test everything (rowscroll modes etc.) - // but it could be useful - if ( machine().input().code_pressed_once(KEYCODE_L) ) - { - address_space &space = m_maincpu->space(AS_PROGRAM); - - if (!strcmp(machine().system().name, "sams64_2")) - { - space.write_byte(0x2f27c8, 0x2); - } - } -#endif - - - // Initialize some buffers - bitmap.fill(m_tcram[0x50/4] & 0x10000 ? m_palette->black_pen() : m_palette->pen(0), cliprect); //FIXME: Is the register correct? check with HW tests - screen.priority().fill(0x00, cliprect); - - // If the screen is disabled, don't draw anything (m_screen_dis is a shady variable at best) - if (m_screen_dis) - return 0; - - // If the auto-animation mask or bits have changed search for tiles using them and mark as dirty - const uint32_t animmask = m_videoregs[0x0b]; - const uint32_t animbits = m_videoregs[0x0c]; - if ((m_old_animmask != animmask) || (m_old_animbits != animbits)) - { - int tile_index; - for (tile_index=0;tile_index<128*128;tile_index++) - { - if (m_videoram[tile_index+(0x00000/4)] & 0x200000) - { - hng64_mark_tile_dirty(0, tile_index); - } - if (m_videoram[tile_index+(0x10000/4)] & 0x200000) - { - hng64_mark_tile_dirty(1, tile_index); - } - if (m_videoram[tile_index+(0x20000/4)] & 0x200000) - { - hng64_mark_tile_dirty(2, tile_index); - } - if (m_videoram[tile_index+(0x30000/4)] & 0x200000) - { - hng64_mark_tile_dirty(3, tile_index); - } - } - - m_old_animmask = animmask; - m_old_animbits = animbits; - } - - // If any magic bits have been touched, mark every tilemap dirty - uint16_t tileflags[4]; - tileflags[0] = m_videoregs[0x02] >> 16; - tileflags[1] = m_videoregs[0x02] & 0xffff; - tileflags[2] = m_videoregs[0x03] >> 16; - tileflags[3] = m_videoregs[0x03] & 0xffff; - const uint16_t IMPORTANT_DIRTY_TILEFLAG_MASK = 0x0600; - for (int i = 0; i < 4; i++) - { - if ((m_old_tileflags[i] & IMPORTANT_DIRTY_TILEFLAG_MASK) != (tileflags[i] & IMPORTANT_DIRTY_TILEFLAG_MASK)) - { - hng64_mark_all_tiles_dirty(i); - m_old_tileflags[i] = tileflags[i]; - } - } - - // Draw the four tilemaps - hng64_drawtilemap(screen,bitmap,cliprect, 3); - hng64_drawtilemap(screen,bitmap,cliprect, 2); - hng64_drawtilemap(screen,bitmap,cliprect, 1); - hng64_drawtilemap(screen,bitmap,cliprect, 0); - - // 3d gets drawn next - if(!(m_fbcontrol[0] & 0x01)) - { - int x, y; - - // Blit the color buffer into the primary bitmap - for (y = cliprect.min_y; y <= cliprect.max_y; y++) - { - uint32_t *src = &m_poly_renderer->colorBuffer3d().pix32(y, cliprect.min_x); - uint32_t *dst = &bitmap.pix32(y, cliprect.min_x); - - for (x = cliprect.min_x; x <= cliprect.max_x; x++) - { - if(*src & 0xff000000) - *dst = *src; - - dst++; - src++; - } - } - } - - // Draw the sprites on top of everything - draw_sprites(screen, bitmap, cliprect); - - // Layer the global frame buffer operations on top of everything - // transition_control(bitmap, cliprect); - - -#if HNG64_VIDEO_DEBUG - if (0) - popmessage("%08x %08x %08x %08x %08x", m_spriteregs[0], m_spriteregs[1], m_spriteregs[2], m_spriteregs[3], m_spriteregs[4]); - - if (1) - popmessage("%08x %08x TR(%04x %04x %04x %04x) SB(%04x %04x %04x %04x) %08x %08x %08x %08x %08x AA(%08x %08x) %08x", - m_videoregs[0x00], - m_videoregs[0x01], - (m_videoregs[0x02]>>16)&0xffff, - (m_videoregs[0x02]>>0)&0xffff, // ss64_2 debug mode indicates that 0x0040 is enable! - (m_videoregs[0x03]>>16)&0xffff, // buriki agrees (debug data on text layer) xrally agress (pink layer) - (m_videoregs[0x03]>>0)&0xffff, // fatal fury doesn't (all backgrounds have it set) joy - (m_videoregs[0x04]>>16)&0xffff, - (m_videoregs[0x04]>>0)&0xffff, - (m_videoregs[0x05]>>16)&0xffff, - (m_videoregs[0x05]>>0)&0xffff, - m_videoregs[0x06], - m_videoregs[0x07], - m_videoregs[0x08], - m_videoregs[0x09], - m_videoregs[0x0a], - m_videoregs[0x0b], - m_videoregs[0x0c], - m_videoregs[0x0d]); - - if (0) - popmessage("TC: %08x %08x %08x %08x : %08x %08x %08x %08x : %08x %08x %08x %08x : %08x %08x %08x %08x : %08x %08x %08x %08x : %08x %08x %08x %08x", - m_tcram[0x00/4], - m_tcram[0x04/4], - m_tcram[0x08/4], // tilemaps 0/1 ? - m_tcram[0x0c/4], // ss64_2 debug 04000000 = 'half' on tm1 00000004 = 'half' on tm3 (used in transitions?) - m_tcram[0x10/4], - m_tcram[0x14/4], - m_tcram[0x18/4], - m_tcram[0x1c/4], - m_tcram[0x20/4], - m_tcram[0x24/4], - m_tcram[0x28/4], - m_tcram[0x2c/4], - m_tcram[0x30/4], - m_tcram[0x34/4], - m_tcram[0x38/4], - m_tcram[0x3c/4], - m_tcram[0x40/4], - m_tcram[0x44/4], - m_tcram[0x48/4], - m_tcram[0x4c/4], - m_tcram[0x50/4], - m_tcram[0x54/4], - m_tcram[0x58/4], - m_tcram[0x5c/4]); - - if ( machine().input().code_pressed_once(KEYCODE_T) ) - { - m_additive_tilemap_debug ^= 1; - popmessage("blend changed %02x", m_additive_tilemap_debug); - } - if ( machine().input().code_pressed_once(KEYCODE_Y) ) - { - m_additive_tilemap_debug ^= 2; - popmessage("blend changed %02x", m_additive_tilemap_debug); - } - if ( machine().input().code_pressed_once(KEYCODE_U) ) - { - m_additive_tilemap_debug ^= 4; - popmessage("blend changed %02x", m_additive_tilemap_debug); - } - if ( machine().input().code_pressed_once(KEYCODE_I) ) - { - m_additive_tilemap_debug ^= 8; - popmessage("blend changed %02x", m_additive_tilemap_debug); - } -#endif - - return 0; -} - -WRITE_LINE_MEMBER(hng64_state::screen_vblank_hng64) -{ - // rising edge - if (state) - clear3d(); -} - - -/* Transition Control Video Registers - * ---------------------------------- - * - * uint32_t | Bits | Use - * | 3322 2222 2222 1111 1111 11 | - * -------+-1098-7654-3210-9876-5432-1098-7654-3210-+---------------- - * 0 | | - * 1 | xxxx xxxx xxxx xxxx yyyy yyyy yyyy yyyy | Min X / Min Y visible area rectangle values - * 2 | xxxx xxxx xxxx xxxx yyyy yyyy yyyy yyyy | Max X / Max Y visible area rectangle values (added up with the Min X / Min Y) - * 3 | | - * 4 | | - * 5 | ---- ---- ---- ---? ---- --?? ???? ???? | Global Fade In/Fade Out control - * 6 | | - * 7 | ---- ---- xxxx xxxx xxxx xxxx xxxx xxxx | Port A of RGB fade (subtraction) - * 8 | | - * 9 | ---- ---- ---- ---? ---- ---- ---- ???? | Per-layer Fade In/Fade Out control - * 10 | ---- ---- xxxx xxxx xxxx xxxx xxxx xxxx | Port B of RGB fade (additive) - * 11 | xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx | Unknown - looks like an ARGB value - it seems to change when the scene changes - * 12 | | - * 13 | | - * 14 | | - * 15 | | - * 16 | | - * 17 | | - * 18 | xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx | V-Blank related stuff - * 19 | | - * 20 | ---- ---- ---- ---x ---- ---- ---- ---- | Back layer control register? - * 21 | | - * 22 | | - * 23 | | - * 24 | | - * - * Various bits change depending on what is happening in the scene. - * These bits may set which 'layer' is affected by the blending. - * Or maybe they adjust the scale of the lightening and darkening... - * Or maybe it switches from fading by scaling to fading using absolute addition and subtraction... - * Or maybe they set transition type (there seems to be a cute scaling-squares transition in there somewhere)... - */ - -// Transition Control memory. -WRITE32_MEMBER(hng64_state::tcram_w) -{ - uint32_t *hng64_tcram = m_tcram; - - COMBINE_DATA (&hng64_tcram[offset]); - - if(offset == 0x02) - { - uint16_t min_x, min_y, max_x, max_y; - rectangle visarea = m_screen->visible_area(); - - min_x = (hng64_tcram[1] & 0xffff0000) >> 16; - min_y = (hng64_tcram[1] & 0x0000ffff) >> 0; - max_x = (hng64_tcram[2] & 0xffff0000) >> 16; - max_y = (hng64_tcram[2] & 0x0000ffff) >> 0; - - if(max_x == 0 || max_y == 0) // bail out if values are invalid, Fatal Fury WA sets this to disable the screen. - { - m_screen_dis = 1; - return; - } - - m_screen_dis = 0; - - visarea.set(min_x, min_x + max_x - 1, min_y, min_y + max_y - 1); - m_screen->configure(HTOTAL, VTOTAL, visarea, m_screen->frame_period().attoseconds() ); - } -} - -READ32_MEMBER(hng64_state::tcram_r) -{ - /* is this really a port? this seems treated like RAM otherwise, check if there's code anywhere - to write the desired value here instead */ - if ((offset*4) == 0x48) - return ioport("VBLANK")->read(); - - return m_tcram[offset]; -} - -// Very much a work in progress - no hard testing has been done -void hng64_state::transition_control( bitmap_rgb32 &bitmap, const rectangle &cliprect) -{ - int i, j; - -// float colorScaleR, colorScaleG, colorScaleB; - int32_t finR, finG, finB; - - int32_t darkR, darkG, darkB; - int32_t brigR, brigG, brigB; - - // If either of the fading memory regions is non-zero... - if (m_tcram[0x00000007] != 0x00000000 || m_tcram[0x0000000a] != 0x00000000) - { - darkR = (int32_t)( m_tcram[0x00000007] & 0xff); - darkG = (int32_t)((m_tcram[0x00000007] >> 8) & 0xff); - darkB = (int32_t)((m_tcram[0x00000007] >> 16) & 0xff); - - brigR = (int32_t)( m_tcram[0x0000000a] & 0xff); - brigG = (int32_t)((m_tcram[0x0000000a] >> 8) & 0xff); - brigB = (int32_t)((m_tcram[0x0000000a] >> 16) & 0xff); - - for (i = cliprect.min_x; i < cliprect.max_x; i++) - { - for (j = cliprect.min_y; j < cliprect.max_y; j++) - { - rgb_t* thePixel = reinterpret_cast<rgb_t *>(&bitmap.pix32(j, i)); - - finR = (int32_t)thePixel->r(); - finG = (int32_t)thePixel->g(); - finB = (int32_t)thePixel->b(); - -#if 0 - // Apply the darkening pass (0x07)... - colorScaleR = 1.0f - (float)( m_tcram[0x00000007] & 0xff) / 255.0f; - colorScaleG = 1.0f - (float)((m_tcram[0x00000007] >> 8) & 0xff) / 255.0f; - colorScaleB = 1.0f - (float)((m_tcram[0x00000007] >> 16) & 0xff) / 255.0f; - - finR = ((float)thePixel->r() * colorScaleR); - finG = ((float)thePixel->g() * colorScaleG); - finB = ((float)thePixel->b() * colorScaleB); - - - // Apply the lightening pass (0x0a)... - colorScaleR = 1.0f + (float)( m_tcram[0x0000000a] & 0xff) / 255.0f; - colorScaleG = 1.0f + (float)((m_tcram[0x0000000a] >> 8) & 0xff) / 255.0f; - colorScaleB = 1.0f + (float)((m_tcram[0x0000000a] >> 16) & 0xff) / 255.0f; - - finR *= colorScaleR; - finG *= colorScaleG; - finB *= colorScaleB; - - - // Clamp - if (finR > 255.0f) finR = 255.0f; - if (finG > 255.0f) finG = 255.0f; - if (finB > 255.0f) finB = 255.0f; -#endif - - - // Subtractive fading - if (m_tcram[0x00000007] != 0x00000000) - { - finR -= darkR; - finG -= darkG; - finB -= darkB; - } - - // Additive fading - if (m_tcram[0x0000000a] != 0x00000000) - { - finR += brigR; - finG += brigG; - finB += brigB; - } - - // Clamp the high end - if (finR > 255) finR = 255; - if (finG > 255) finG = 255; - if (finB > 255) finB = 255; - - // Clamp the low end - if (finR < 0) finR = 0; - if (finG < 0) finG = 0; - if (finB < 0) finB = 0; - - *thePixel = rgb_t(255, (uint8_t)finR, (uint8_t)finG, (uint8_t)finB); - } - } - } -} - -void hng64_state::video_start() -{ - m_old_animmask = -1; - m_old_animbits = -1; - m_old_tileflags[0] = -1; - m_old_tileflags[1] = -1; - m_old_tileflags[2] = -1; - m_old_tileflags[3] = -1; - - m_tilemap[0].m_tilemap_8x8 = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(hng64_state::get_hng64_tile0_8x8_info),this), TILEMAP_SCAN_ROWS, 8, 8, 128, 128); /* 128x128x4 = 0x10000 */ - m_tilemap[0].m_tilemap_16x16 = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(hng64_state::get_hng64_tile0_16x16_info),this), TILEMAP_SCAN_ROWS, 16, 16, 128, 128); /* 128x128x4 = 0x10000 */ - m_tilemap[0].m_tilemap_16x16_alt = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(hng64_state::get_hng64_tile0_16x16_info),this), TILEMAP_SCAN_ROWS, 16, 16, 256, 64); /* 128x128x4 = 0x10000 */ - - m_tilemap[1].m_tilemap_8x8 = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(hng64_state::get_hng64_tile1_8x8_info),this), TILEMAP_SCAN_ROWS, 8, 8, 128, 128); /* 128x128x4 = 0x10000 */ - m_tilemap[1].m_tilemap_16x16 = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(hng64_state::get_hng64_tile1_16x16_info),this), TILEMAP_SCAN_ROWS, 16, 16, 128, 128); /* 128x128x4 = 0x10000 */ - m_tilemap[1].m_tilemap_16x16_alt = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(hng64_state::get_hng64_tile1_16x16_info),this), TILEMAP_SCAN_ROWS, 16, 16, 256, 64); /* 128x128x4 = 0x10000 */ - - m_tilemap[2].m_tilemap_8x8 = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(hng64_state::get_hng64_tile2_8x8_info),this), TILEMAP_SCAN_ROWS, 8, 8, 128, 128); /* 128x128x4 = 0x10000 */ - m_tilemap[2].m_tilemap_16x16 = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(hng64_state::get_hng64_tile2_16x16_info),this), TILEMAP_SCAN_ROWS, 16, 16, 128, 128); /* 128x128x4 = 0x10000 */ - m_tilemap[2].m_tilemap_16x16_alt = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(hng64_state::get_hng64_tile2_16x16_info),this), TILEMAP_SCAN_ROWS, 16, 16, 256, 64); /* 128x128x4 = 0x10000 */ - - m_tilemap[3].m_tilemap_8x8 = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(hng64_state::get_hng64_tile3_8x8_info),this), TILEMAP_SCAN_ROWS, 8, 8, 128, 128); /* 128x128x4 = 0x10000 */ - m_tilemap[3].m_tilemap_16x16 = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(hng64_state::get_hng64_tile3_16x16_info),this), TILEMAP_SCAN_ROWS, 16, 16, 128, 128); /* 128x128x4 = 0x10000 */ - m_tilemap[3].m_tilemap_16x16_alt = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(hng64_state::get_hng64_tile3_16x16_info),this), TILEMAP_SCAN_ROWS, 16, 16, 256, 64); /* 128x128x4 = 0x10000 */ - - for (auto & elem : m_tilemap) - { - elem.m_tilemap_8x8->set_transparent_pen(0); - elem.m_tilemap_16x16->set_transparent_pen(0); - elem.m_tilemap_16x16_alt->set_transparent_pen(0); - } - - // Debug switch, turn on / off additive blending on a per-tilemap basis - m_additive_tilemap_debug = 0; - - // Rasterizer creation - m_poly_renderer = std::make_unique<hng64_poly_renderer>(*this); - - // 3d information - m_dl = std::make_unique<uint16_t[]>(0x100); - m_polys.resize(HNG64_MAX_POLYGONS); - - m_texturerom = memregion("textures")->base(); - m_vertsrom = (uint16_t*)memregion("verts")->base(); - m_vertsrom_size = memregion("verts")->bytes(); -} - -#include "video/hng64_3d.hxx" -#include "video/hng64_sprite.hxx" |