From a48f854052bcc5e444b1da0d0a2fd1a8a62402ba Mon Sep 17 00:00:00 2001 From: David Haywood Date: Tue, 11 Jun 2019 14:38:31 +0100 Subject: emulate rad_hnt3 rowscroll mode (nw) (#5211) * emulate rad_hnt3 rowscroll mode (nw) * rad_gtg is awkward (nw) * refactor (nw) * oops (nw) * tidy (nw) --- src/mame/drivers/elan_eu3a14.cpp | 263 +++++++++++++++++++++++++-------------- 1 file changed, 168 insertions(+), 95 deletions(-) diff --git a/src/mame/drivers/elan_eu3a14.cpp b/src/mame/drivers/elan_eu3a14.cpp index a73a0b7a434..42da8ee97c3 100644 --- a/src/mame/drivers/elan_eu3a14.cpp +++ b/src/mame/drivers/elan_eu3a14.cpp @@ -53,10 +53,10 @@ It is not clear how to access Huntin'3 Test Mode (if possible) there do appear to be tiles for it tho - Huntin'3 appears to use the hardware much more extensively than other games and shows we need the following features - - Raster Interrupt (Rowscroll in most game modes) - - RAM based tiles (status bar in Shooting Range, text descriptions on menus etc.) - these aren't yet emulated. + Huntin'3 makes much more extensive use of the video hardware than the other titles, including + - Table based Rowscroll (most first person views) + - RAM based tiles (status bar in "Target Range", text descriptions on menus etc.) + - Windowing effects (to highlight menu items, timer in "Target Range") NOT YET EMULATED / PROPERLY UNDERSTOOD */ @@ -71,6 +71,8 @@ /* +TODO: fill these in for other games, this is for Golden Tee Home + ffb0 rti ffb4 rti ffb8 rti @@ -108,6 +110,9 @@ public: m_palram(*this, "palram"), m_scrollregs(*this, "scrollregs"), m_tilecfg(*this, "tilecfg"), + m_rowscrollregs(*this, "rowscrollregs"), + m_rowscrollsplit(*this, "rowscrollsplit"), + m_rowscrollcfg(*this, "rowscrollcfg"), m_ramtilecfg(*this, "ramtilecfg"), m_spriteaddr(*this, "spriteaddr"), m_spritebase(*this, "spritebase"), @@ -183,6 +188,9 @@ private: required_shared_ptr m_palram; required_shared_ptr m_scrollregs; required_shared_ptr m_tilecfg; + required_shared_ptr m_rowscrollregs; + required_shared_ptr m_rowscrollsplit; + required_shared_ptr m_rowscrollcfg; required_shared_ptr m_ramtilecfg; required_shared_ptr m_spriteaddr; required_shared_ptr m_spritebase; @@ -206,7 +214,7 @@ private: void handle_palette(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); void draw_background_ramlayer(screen_device& screen, bitmap_ind16& bitmap, const rectangle& cliprect); - + int get_xscroll_for_screenypos(int line); void draw_background_tile(bitmap_ind16 &bitmap, const rectangle &cliprect, int bpp, int tileno, int palette, int priority, int flipx, int flipy, int xpos, int ypos, int transpen, int size, int base, int drawfromram); void draw_background_page(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int ramstart, int ramend, int xbase, int ybase, int size, int bpp, int base, int pagewidth,int pageheight, int bytespertile, int palettepri, int drawfromram); void draw_background(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); @@ -270,49 +278,48 @@ void radica_eu3a14_state::handle_palette(screen_device &screen, bitmap_ind16 &bi } } -void radica_eu3a14_state::draw_background_tile(bitmap_ind16 &bitmap, const rectangle &cliprect, int bpp, int tileno, int palette, int priority, int flipx, int flipy, int xpos, int ypos, int transpen, int size, int base, int drawfromram) +void radica_eu3a14_state::draw_background_tile(bitmap_ind16& bitmap, const rectangle& cliprect, int bpp, int tileno, int palette, int priority, int flipx, int flipy, int xpos, int ypos, int transpen, int size, int base, int drawfromram) { - int bppdiv = 1; int baseaddr = base * 256; - - int backtiletype = 0; - if (bpp == 4) // 4bpp selection - { - backtiletype = 1; // 16x16 4bpp + int xstride = 8; + if (bpp == 8) // 8bpp selection + { if (size == 8) { - backtiletype = 3; // 8x8 4bpp + xstride = size / 1; baseaddr += tileno * 64; // 8x8 8bpp } + else + { + xstride = size / 1; baseaddr += tileno * 256; // 16x16 8bpp + } + + palette &= 0x100; // only top bit valid, as there are only 2 palettes? } - else if (bpp == 8) // 8bpp selection + else if (bpp == 4) // 4bpp selection { - backtiletype = 0; // 16x16 8bpp - if (size == 8) { - backtiletype = 2; // 8x8 8bpp + xstride = size / 2; baseaddr += tileno * 32; // 8x8 4bpp + } + else + { + xstride = size / 2; baseaddr += tileno * 128; // 16x16 4bpp } - - palette &= 0x100; // only top bit valid, as there are only 2 palettes? } - else // 2bpp? + else if (bpp == 2) // 2bpp? { - backtiletype = 4; + xstride = size / 4; baseaddr += tileno * 64; // 16x16 2bpp } - - switch (backtiletype) + else { - case 0x00: bppdiv = 1; baseaddr += tileno * 256; break; // 16x16 8bpp - case 0x01: bppdiv = 2; baseaddr += tileno * 128; break; // 16x16 4bpp - case 0x02: bppdiv = 1; baseaddr += tileno * 64; break; // 8x8 8bpp - case 0x03: bppdiv = 2; baseaddr += tileno * 32; break; // 8x8 4bpp - case 0x04: bppdiv = 4; baseaddr += tileno * 64; break; // 16x16 2bpp - - default: break; + popmessage("draw_background_tile unsupported bpp %d\n", bpp); + return; } - + + + uint8_t* gfxdata; if (drawfromram) @@ -324,12 +331,23 @@ void radica_eu3a14_state::draw_background_tile(bitmap_ind16 &bitmap, const recta gfxdata = &m_mainregion[baseaddr & 0x3fffff]; } - int xstride = size / bppdiv; int count = 0; for (int y = 0; y < size; y++) { int realy = ypos + y; + int xposwithscroll = 0; + + if (!drawfromram) + { + xposwithscroll = xpos - get_xscroll_for_screenypos(realy); + } + else + { + xposwithscroll = xpos; + // RAM tile layer has no scrolling? (or we've never seen it used / enabled) + } + uint16_t* dst = &bitmap.pix16(ypos + y); uint8_t* pridst = &m_prioritybitmap.pix8(ypos + y); @@ -339,9 +357,9 @@ void radica_eu3a14_state::draw_background_tile(bitmap_ind16 &bitmap, const recta if (realy >= cliprect.min_y && realy <= cliprect.max_y) { - if (bppdiv == 1) // 8bpp + if (bpp == 8) // 8bpp { - int realx = x + xpos; + int realx = x + xposwithscroll; if (realx >= cliprect.min_x && realx <= cliprect.max_x) { if (pix) @@ -355,9 +373,21 @@ void radica_eu3a14_state::draw_background_tile(bitmap_ind16 &bitmap, const recta } } } - else if (bppdiv == 2) // 4bpp + else if (bpp == 7) { - int realx = (x * 2) + xpos; + popmessage("draw_background_tile bpp == 7"); + } + else if (bpp == 6) + { + popmessage("draw_background_tile bpp == 6"); + } + else if (bpp == 5) + { + popmessage("draw_background_tile bpp == 5"); + } + else if (bpp == 4) // 4bpp + { + int realx = (x * 2) + xposwithscroll; if (realx >= cliprect.min_x && realx <= cliprect.max_x) { if (pix & 0xf0) @@ -384,9 +414,13 @@ void radica_eu3a14_state::draw_background_tile(bitmap_ind16 &bitmap, const recta } } } - else if (bppdiv == 4) // 2bpp (hnt3 ram text) + else if (bpp == 3) + { + popmessage("draw_background_tile bpp == 3"); + } + else if (bpp == 2) // 2bpp (hnt3 ram text) { - int realx = (x * 4) + xpos; + int realx = (x * 4) + xposwithscroll; if (realx >= cliprect.min_x && realx <= cliprect.max_x) { if (pix & 0xc0) @@ -412,7 +446,7 @@ void radica_eu3a14_state::draw_background_tile(bitmap_ind16 &bitmap, const recta } } } - + realx++; if (realx >= cliprect.min_x && realx <= cliprect.max_x) @@ -441,12 +475,62 @@ void radica_eu3a14_state::draw_background_tile(bitmap_ind16 &bitmap, const recta } } } + else if (bpp == 1) + { + popmessage("draw_background_tile bpp == 1"); + } } count++; } } } +int radica_eu3a14_state::get_xscroll_for_screenypos(int ydraw) +{ + if ((ydraw < 0) || (ydraw >= 224)) + return 0; + + int xscroll = m_scrollregs[0] | (m_scrollregs[1] << 8); + + if (m_rowscrollcfg[1] == 0x01) // GUESS! could be anything, but this bit is set in Huntin'3 + { + int split0 = m_rowscrollregs[0] | (m_rowscrollregs[1] << 8); + int split1 = m_rowscrollregs[2] | (m_rowscrollregs[3] << 8); + int split2 = m_rowscrollregs[4] | (m_rowscrollregs[5] << 8); + int split3 = m_rowscrollregs[6] | (m_rowscrollregs[7] << 8); + + if (ydraw < m_rowscrollsplit[0]) + { + return xscroll; + } + else if (ydraw < m_rowscrollsplit[1]) + { + return split0; + } + else if (ydraw < m_rowscrollsplit[2]) + { + return split1; + } + else if (ydraw < m_rowscrollsplit[3]) + { + return split2; + } + else if (ydraw < m_rowscrollsplit[4]) + { + return split3; + } + else + { + return 0; + } + } + else + { + return xscroll; + } +} + + void radica_eu3a14_state::draw_background_page(screen_device& screen, bitmap_ind16& bitmap, const rectangle& cliprect, int ramstart, int ramend, int xbase, int ybase, int size, int bpp, int base, int pagewidth, int pageheight, int bytespertile, int palettepri, int drawfromram) { @@ -454,8 +538,6 @@ void radica_eu3a14_state::draw_background_page(screen_device& screen, bitmap_ind palette = palette << 4; int priority = palettepri & 0x07; - - int xdraw = xbase; int ydraw = ybase; int count = 0; @@ -471,7 +553,7 @@ void radica_eu3a14_state::draw_background_page(screen_device& screen, bitmap_ind { tile = m_mainram[i + 0] | (m_mainram[i + 1] << 8); } - else if (bytespertile == 4) // rad_foot hidden test mode, rad_hnt3 shooting range (not yet correct) + else if (bytespertile == 4) // rad_foot hidden test mode, rad_hnt3 "Target Range" (not yet correct) { tile = m_mainram[i + 0] | (m_mainram[i + 1] << 8);// | (m_mainram[i + 2] << 16) | | (m_mainram[i + 3] << 24); @@ -488,6 +570,7 @@ void radica_eu3a14_state::draw_background_page(screen_device& screen, bitmap_ind } + draw_background_tile(bitmap, cliprect, realbpp, tile, realpalette, realpriority, 0, 0, xdraw, ydraw, 0, size, base, drawfromram); xdraw += size; @@ -509,31 +592,13 @@ void radica_eu3a14_state::draw_background_ramlayer(screen_device& screen, bitmap int rtm_size;; int rtm_pagewidth; int rtm_pageheight; - int rtm_xscroll;; int rtm_yscroll; int rtm_bpp; int rtm_bytespertile = 2; uint8_t palettepri = m_ramtilecfg[1]; - rtm_xscroll = 0; rtm_yscroll = 0; - // disable layer in shooting gallery for now until we understand it - //if (m_ramtilecfg[5] == 0x06) - // return; - - // force same mode as other tilemap? -#if 0 - if (m_tilecfg[0] & 0x80) - { - rtm_bytespertile = 4; - } - else - { - rtm_bytespertile = 2; - } -#endif - // this is the gfxbase in ram for all cases seen int rtm_base = (0x2000 - 0x200) / 256; @@ -559,7 +624,7 @@ void radica_eu3a14_state::draw_background_ramlayer(screen_device& screen, bitmap int ramstart = m_tilerambase + 0x700; int ramend = m_tilerambase + 0x700 + 0x700; - // hack for shooting gallery mode + // hack for "Target Range" mode if (m_ramtilecfg[5] == 0x06) { ramstart = 0x3980-0x200; @@ -567,20 +632,19 @@ void radica_eu3a14_state::draw_background_ramlayer(screen_device& screen, bitmap } // normal - draw_background_page(screen, bitmap, cliprect, ramstart, ramend, 0 - rtm_xscroll, 0 - rtm_yscroll, rtm_size, rtm_bpp, rtm_base, rtm_pagewidth, rtm_pageheight, rtm_bytespertile, palettepri, 1); + draw_background_page(screen, bitmap, cliprect, ramstart, ramend, 0, 0 - rtm_yscroll, rtm_size, rtm_bpp, rtm_base, rtm_pagewidth, rtm_pageheight, rtm_bytespertile, palettepri, 1); // wrap x - draw_background_page(screen, bitmap, cliprect, ramstart, ramend, (rtm_size * rtm_pagewidth) + 0 - rtm_xscroll, 0 - rtm_yscroll, rtm_size, rtm_bpp, rtm_base, rtm_pagewidth, rtm_pageheight, rtm_bytespertile, palettepri, 1); + draw_background_page(screen, bitmap, cliprect, ramstart, ramend, (rtm_size * rtm_pagewidth), 0 - rtm_yscroll, rtm_size, rtm_bpp, rtm_base, rtm_pagewidth, rtm_pageheight, rtm_bytespertile, palettepri, 1); // wrap y - draw_background_page(screen, bitmap, cliprect, ramstart, ramend, 0 - rtm_xscroll, (rtm_size * rtm_pageheight) + 0 - rtm_yscroll, rtm_size, rtm_bpp, rtm_base, rtm_pagewidth, rtm_pageheight, rtm_bytespertile, palettepri, 1); + draw_background_page(screen, bitmap, cliprect, ramstart, ramend, 0, (rtm_size * rtm_pageheight) + 0 - rtm_yscroll, rtm_size, rtm_bpp, rtm_base, rtm_pagewidth, rtm_pageheight, rtm_bytespertile, palettepri, 1); // wrap x+y - draw_background_page(screen, bitmap, cliprect, ramstart, ramend, (rtm_size * rtm_pagewidth) + 0 - rtm_xscroll, (rtm_size * rtm_pageheight) + 0 - rtm_yscroll, rtm_size, rtm_bpp, rtm_base, rtm_pagewidth, rtm_pageheight, rtm_bytespertile, palettepri, 1); + draw_background_page(screen, bitmap, cliprect, ramstart, ramend, (rtm_size * rtm_pagewidth), (rtm_size * rtm_pageheight) + 0 - rtm_yscroll, rtm_size, rtm_bpp, rtm_base, rtm_pagewidth, rtm_pageheight, rtm_bytespertile, palettepri, 1); } } void radica_eu3a14_state::draw_background(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - int xscroll = m_scrollregs[0] | (m_scrollregs[1] << 8); int yscroll = m_scrollregs[2] | (m_scrollregs[3] << 8); int base = (m_tilecfg[5] << 8) | m_tilecfg[4]; @@ -643,34 +707,34 @@ void radica_eu3a14_state::draw_background(screen_device &screen, bitmap_ind16 &b ramstart = m_tilerambase + pagesize * 0; ramend = m_tilerambase + pagesize * 1; - draw_background_page(screen, bitmap, cliprect, ramstart,ramend, 0 - xscroll, 0 - yscroll, size, bpp, base, pagewidth,pageheight, bytespertile, palettepri, 0); // normal - draw_background_page(screen, bitmap, cliprect, ramstart,ramend, (size * pagewidth * 2) + 0 - xscroll, 0 - yscroll, size, bpp, base, pagewidth,pageheight, bytespertile, palettepri, 0); // wrap x - draw_background_page(screen, bitmap, cliprect, ramstart,ramend, 0 - xscroll, (size * pageheight * 2) + 0 - yscroll, size, bpp, base, pagewidth,pageheight, bytespertile, palettepri, 0); // wrap y - draw_background_page(screen, bitmap, cliprect, ramstart,ramend, (size * pagewidth * 2) + 0 - xscroll, (size * pageheight * 2) + 0 - yscroll, size, bpp, base, pagewidth,pageheight, bytespertile, palettepri, 0); // wrap x+y + draw_background_page(screen, bitmap, cliprect, ramstart,ramend, 0, 0 - yscroll, size, bpp, base, pagewidth,pageheight, bytespertile, palettepri, 0); // normal + draw_background_page(screen, bitmap, cliprect, ramstart,ramend, (size * pagewidth * 2), 0 - yscroll, size, bpp, base, pagewidth,pageheight, bytespertile, palettepri, 0); // wrap x + draw_background_page(screen, bitmap, cliprect, ramstart,ramend, 0, (size * pageheight * 2) + 0 - yscroll, size, bpp, base, pagewidth,pageheight, bytespertile, palettepri, 0); // wrap y + draw_background_page(screen, bitmap, cliprect, ramstart,ramend, (size * pagewidth * 2), (size * pageheight * 2) + 0 - yscroll, size, bpp, base, pagewidth,pageheight, bytespertile, palettepri, 0); // wrap x+y ramstart = m_tilerambase + pagesize * 1; ramend = m_tilerambase + pagesize * 2; - draw_background_page(screen, bitmap, cliprect, ramstart,ramend, (size * pagewidth) - xscroll, 0 - yscroll, size, bpp, base, pagewidth,pageheight, bytespertile, palettepri, 0); // normal - draw_background_page(screen, bitmap, cliprect, ramstart,ramend, (size * pagewidth * 3) - xscroll, 0 - yscroll, size, bpp, base, pagewidth,pageheight, bytespertile, palettepri, 0); // wrap x - draw_background_page(screen, bitmap, cliprect, ramstart,ramend, (size * pagewidth) - xscroll, (size * pageheight * 2) + 0 - yscroll, size, bpp, base, pagewidth,pageheight, bytespertile, palettepri, 0); // wrap y - draw_background_page(screen, bitmap, cliprect, ramstart,ramend, (size * pagewidth * 3) - xscroll, (size * pageheight * 2) + 0 - yscroll, size, bpp, base, pagewidth,pageheight, bytespertile, palettepri, 0); // wrap x+y + draw_background_page(screen, bitmap, cliprect, ramstart,ramend, (size * pagewidth), 0 - yscroll, size, bpp, base, pagewidth,pageheight, bytespertile, palettepri, 0); // normal + draw_background_page(screen, bitmap, cliprect, ramstart,ramend, (size * pagewidth * 3), 0 - yscroll, size, bpp, base, pagewidth,pageheight, bytespertile, palettepri, 0); // wrap x + draw_background_page(screen, bitmap, cliprect, ramstart,ramend, (size * pagewidth), (size * pageheight * 2) + 0 - yscroll, size, bpp, base, pagewidth,pageheight, bytespertile, palettepri, 0); // wrap y + draw_background_page(screen, bitmap, cliprect, ramstart,ramend, (size * pagewidth * 3), (size * pageheight * 2) + 0 - yscroll, size, bpp, base, pagewidth,pageheight, bytespertile, palettepri, 0); // wrap x+y ramstart = m_tilerambase + pagesize * 2; ramend = m_tilerambase + pagesize * 3; - draw_background_page(screen, bitmap, cliprect, ramstart,ramend, 0 - xscroll, (size * pageheight) - yscroll, size, bpp, base, pagewidth,pageheight, bytespertile, palettepri, 0); // normal - draw_background_page(screen, bitmap, cliprect, ramstart,ramend, (size * pagewidth * 2) + 0 - xscroll, (size * pageheight) - yscroll, size, bpp, base, pagewidth,pageheight, bytespertile, palettepri, 0); // wrap x - draw_background_page(screen, bitmap, cliprect, ramstart,ramend, 0 - xscroll, (size * pageheight * 3) - yscroll, size, bpp, base, pagewidth,pageheight, bytespertile, palettepri, 0); // wrap y - draw_background_page(screen, bitmap, cliprect, ramstart,ramend, (size * pagewidth * 2) + 0 - xscroll, (size * pageheight * 3) - yscroll, size, bpp, base, pagewidth,pageheight, bytespertile, palettepri, 0); // wrap x+y + draw_background_page(screen, bitmap, cliprect, ramstart,ramend, 0, (size * pageheight) - yscroll, size, bpp, base, pagewidth,pageheight, bytespertile, palettepri, 0); // normal + draw_background_page(screen, bitmap, cliprect, ramstart,ramend, (size * pagewidth * 2), (size * pageheight) - yscroll, size, bpp, base, pagewidth,pageheight, bytespertile, palettepri, 0); // wrap x + draw_background_page(screen, bitmap, cliprect, ramstart,ramend, 0, (size * pageheight * 3) - yscroll, size, bpp, base, pagewidth,pageheight, bytespertile, palettepri, 0); // wrap y + draw_background_page(screen, bitmap, cliprect, ramstart,ramend, (size * pagewidth * 2), (size * pageheight * 3) - yscroll, size, bpp, base, pagewidth,pageheight, bytespertile, palettepri, 0); // wrap x+y ramstart = m_tilerambase + pagesize * 3; ramend = m_tilerambase + pagesize * 4; - draw_background_page(screen, bitmap, cliprect, ramstart,ramend, (size * pagewidth) - xscroll, (size * pageheight) - yscroll, size, bpp, base, pagewidth,pageheight, bytespertile, palettepri, 0); // normal - draw_background_page(screen, bitmap, cliprect, ramstart,ramend, (size * pagewidth * 3) - xscroll, (size * pageheight) - yscroll, size, bpp, base, pagewidth,pageheight, bytespertile, palettepri, 0); // wrap x - draw_background_page(screen, bitmap, cliprect, ramstart,ramend, (size * pagewidth) - xscroll, (size * pageheight * 3) - yscroll, size, bpp, base, pagewidth,pageheight, bytespertile, palettepri, 0);// wrap y - draw_background_page(screen, bitmap, cliprect, ramstart,ramend, (size * pagewidth * 3) - xscroll, (size * pageheight * 3) - yscroll, size, bpp, base, pagewidth,pageheight, bytespertile, palettepri, 0); // wrap x+y + draw_background_page(screen, bitmap, cliprect, ramstart,ramend, (size * pagewidth), (size * pageheight) - yscroll, size, bpp, base, pagewidth,pageheight, bytespertile, palettepri, 0); // normal + draw_background_page(screen, bitmap, cliprect, ramstart,ramend, (size * pagewidth * 3), (size * pageheight) - yscroll, size, bpp, base, pagewidth,pageheight, bytespertile, palettepri, 0); // wrap x + draw_background_page(screen, bitmap, cliprect, ramstart,ramend, (size * pagewidth), (size * pageheight * 3) - yscroll, size, bpp, base, pagewidth,pageheight, bytespertile, palettepri, 0);// wrap y + draw_background_page(screen, bitmap, cliprect, ramstart,ramend, (size * pagewidth * 3), (size * pageheight * 3) - yscroll, size, bpp, base, pagewidth,pageheight, bytespertile, palettepri, 0); // wrap x+y } else if ((m_tilecfg[0] & 0x03) == 0x03) // individual tilemaps? multiple layers? { @@ -679,13 +743,13 @@ void radica_eu3a14_state::draw_background(screen_device &screen, bitmap_ind16 &b ramend = m_tilerambase + pagesize * 1; // normal - draw_background_page(screen, bitmap, cliprect, ramstart, ramend, 0 - xscroll, 0 - yscroll, size, bpp, base, pagewidth,pageheight, bytespertile, palettepri, 0); + draw_background_page(screen, bitmap, cliprect, ramstart, ramend, 0, 0 - yscroll, size, bpp, base, pagewidth,pageheight, bytespertile, palettepri, 0); // wrap x - draw_background_page(screen, bitmap, cliprect, ramstart, ramend, (size * pagewidth) + 0 - xscroll, 0 - yscroll, size, bpp, base, pagewidth,pageheight, bytespertile, palettepri, 0); + draw_background_page(screen, bitmap, cliprect, ramstart, ramend, (size * pagewidth), 0 - yscroll, size, bpp, base, pagewidth,pageheight, bytespertile, palettepri, 0); // wrap y - draw_background_page(screen, bitmap, cliprect, ramstart, ramend, 0 - xscroll, (size * pageheight) + 0 - yscroll, size, bpp, base, pagewidth,pageheight, bytespertile, palettepri, 0); + draw_background_page(screen, bitmap, cliprect, ramstart, ramend, 0, (size * pageheight) + 0 - yscroll, size, bpp, base, pagewidth,pageheight, bytespertile, palettepri, 0); // wrap x+y - draw_background_page(screen, bitmap, cliprect, ramstart, ramend, (size * pagewidth) + 0 - xscroll, (size * pageheight) + 0 - yscroll, size, bpp, base, pagewidth,pageheight, bytespertile, palettepri, 0); + draw_background_page(screen, bitmap, cliprect, ramstart, ramend, (size * pagewidth), (size * pageheight) + 0 - yscroll, size, bpp, base, pagewidth,pageheight, bytespertile, palettepri, 0); // RAM based tile layer draw_background_ramlayer(screen, bitmap, cliprect); @@ -1091,14 +1155,14 @@ void radica_eu3a14_state::radica_eu3a14_map(address_map &map) // video regs are in the 51xx range - // huntin'3 seems to use some registers for a windowing / highlight effect on the trophy room names and gallery mode timer?? + // huntin'3 seems to use some registers for a windowing / highlight effect on the trophy room names and "Target Range" mode timer?? // 5100 - 0x0f when effect is enabled, 0x00 otherwise? // 5101 - 0x0e in both modes // 5102 - 0x86 in both modes - // 5103 - 0x0e in tropy room (left?) / 0x2a in gallery mode (left position?) - // 5104 - trophy room window / highlight top, move with cursor / 0xbf in gallery mode (top?) - // 5105 - 0x52 in trophy room (right?) / counts from 0xa1 to 0x2a (right position?) - // 5106 - trophy room window / highlight bottom, move with cursor / 0xcb in gallery mode (bottom?) + // 5103 - 0x0e in tropy room (left?) / 0x2a in "Target Range" mode (left position?) + // 5104 - trophy room window / highlight top, move with cursor / 0xbf in "Target Range" mode (top?) + // 5105 - 0x52 in trophy room (right?) / counts from 0xa1 to 0x2a in "Target Range" mode (right position?) + // 5106 - trophy room window / highlight bottom, move with cursor / 0xcb in "Target Range" mode (bottom?) // 5107 - 0x00 // 5108 - 0x04 in both modes // 5109 - 0xc2 in both modes @@ -1112,15 +1176,24 @@ void radica_eu3a14_state::radica_eu3a14_map(address_map &map) // layer specific regs? map(0x5110, 0x5115).ram().share("tilecfg"); - map(0x5116, 0x5117).ram(); - map(0x511a, 0x511e).ram(); // hnt3 + map(0x5116, 0x5117).ram().share("rowscrollcfg"); // 00 01 in hnt3 (could just be extra tile config bits, purpose guessed) set to 00 05 in rad_gtg overhead part (no rowscroll) + // 0x5118, 0x5119 not used + map(0x511a, 0x511e).ram().share("rowscrollsplit"); // hnt3 (60 68 78 90 b8 - rowscroll position list see note below + + // register value notes for 511a-511e and how they relate to screen + // 00-6f normal scroll reg + // 60-67 is where the first extra scroll reg (rowscrollregs) is onscreen + // 68-77 is the 2nd + // 78-8f is the 3rd + // 90-b7 is the 4th + // b8-ff no scroll? map(0x5121, 0x5124).ram().share("scrollregs"); - map(0x5125, 0x512c).ram(); // hnt3 + map(0x5125, 0x512c).ram().share("rowscrollregs"); // 4 extra x scroll regs // layer specific regs? map(0x5140, 0x5145).ram().share("ramtilecfg"); // hnt3 - map(0x5148, 0x514b).ram(); // hnt3 + map(0x5148, 0x514b).ram(); // hnt3 (always 0 tho?) // sprite specific regs? map(0x5150, 0x5150).ram().share("spriteaddr"); // startup 01 bb3,gtg,rsg, (na) foot 0c hnt3 -- cgit v1.2.3