From 0d3d5c42cf7a60dac7738971ada84626d3c1ded2 Mon Sep 17 00:00:00 2001 From: David Haywood Date: Tue, 20 Aug 2013 21:13:34 +0000 Subject: [PATCH] start looking at the macrossp line regs (nw) --- src/mame/drivers/macrossp.c | 39 +++++++++------------------ src/mame/includes/macrossp.h | 19 ++++++++++++-- src/mame/video/macrossp.c | 51 ++++++++++++++++++++++++++++++------ 3 files changed, 73 insertions(+), 36 deletions(-) diff --git a/src/mame/drivers/macrossp.c b/src/mame/drivers/macrossp.c index 953a1c85d9c..bf43dec4a5f 100644 --- a/src/mame/drivers/macrossp.c +++ b/src/mame/drivers/macrossp.c @@ -6,24 +6,11 @@ Quiz Bisyoujo Senshi Sailor Moon (c)1997 Banpresto Driver by David Haywood TODO: -- macrossp: tilemap zoom is wrong, see title screen (misplaced) and level 2 boss - (background scrolls faster than sprites) -- should use VIDEO_RGB_DIRECT for alpha blending to work, but tilemap_draw_roz() - doesn't support it. -- Sprite Zoom on quizmoon title screen isn't right -- Tilemap zoom effect on macrossp title screen and probably other places -- Priorities (Sprites & Backgrounds) - see quizmoon attract mode -- sprite/tilemap priorities might not be 100% correct -- Sound -- optimize palette fading in macrossp.quizmoon doesn't use that register. -- All Other Unused Reads / Writes -- Correct unknown ports if/as needed -- Clean Up -- Flip Screen support (both games have a dipswitch for it's selection) - - Notes: - - Whats the BIOS rom? should it be in the 68020 map, its different between games. + - what is the 'bios' rom for? it appears to be data tables and is very different between games but we don't map it anywhere + - priorities + - zooming is wrong + - is alpha REALLY alpha or sprite flicker? + - convert tilemaps to devices? 68020 interrupts lev 1 : 0x64 : 0000 084c - unknown.. @@ -397,20 +384,20 @@ static ADDRESS_MAP_START( macrossp_map, AS_PROGRAM, 32, macrossp_state ) AM_RANGE(0x800000, 0x802fff) AM_RAM AM_SHARE("spriteram") /* SCR A Layer */ AM_RANGE(0x900000, 0x903fff) AM_RAM_WRITE(macrossp_scra_videoram_w) AM_SHARE("scra_videoram") - AM_RANGE(0x904200, 0x9043ff) AM_WRITEONLY /* W/O? */ - AM_RANGE(0x905000, 0x90500b) AM_WRITEONLY AM_SHARE("scra_videoregs") /* W/O? */ + AM_RANGE(0x904200, 0x9043ff) AM_RAM AM_SHARE("scra_linezoom") /* W/O? */ + AM_RANGE(0x905000, 0x90500b) AM_RAM AM_SHARE("scra_videoregs") /* W/O? */ /* SCR B Layer */ AM_RANGE(0x908000, 0x90bfff) AM_RAM_WRITE(macrossp_scrb_videoram_w) AM_SHARE("scrb_videoram") - AM_RANGE(0x90c200, 0x90c3ff) AM_WRITEONLY /* W/O? */ - AM_RANGE(0x90d000, 0x90d00b) AM_WRITEONLY AM_SHARE("scrb_videoregs") /* W/O? */ + AM_RANGE(0x90c200, 0x90c3ff) AM_RAM AM_SHARE("scrb_linezoom") /* W/O? */ + AM_RANGE(0x90d000, 0x90d00b) AM_RAM AM_SHARE("scrb_videoregs") /* W/O? */ /* SCR C Layer */ AM_RANGE(0x910000, 0x913fff) AM_RAM_WRITE(macrossp_scrc_videoram_w) AM_SHARE("scrc_videoram") - AM_RANGE(0x914200, 0x9143ff) AM_WRITEONLY /* W/O? */ - AM_RANGE(0x915000, 0x91500b) AM_WRITEONLY AM_SHARE("scrc_videoregs") /* W/O? */ + AM_RANGE(0x914200, 0x9143ff) AM_RAM AM_SHARE("scrc_linezoom")/* W/O? */ + AM_RANGE(0x915000, 0x91500b) AM_RAM AM_SHARE("scrc_videoregs") /* W/O? */ /* Text Layer */ AM_RANGE(0x918000, 0x91bfff) AM_RAM_WRITE(macrossp_text_videoram_w) AM_SHARE("text_videoram") - AM_RANGE(0x91c200, 0x91c3ff) AM_WRITEONLY /* W/O? */ - AM_RANGE(0x91d000, 0x91d00b) AM_WRITEONLY AM_SHARE("text_videoregs") /* W/O? */ + AM_RANGE(0x91c200, 0x91c3ff) AM_RAM AM_SHARE("text_linezoom") /* W/O? */ + AM_RANGE(0x91d000, 0x91d00b) AM_RAM AM_SHARE("text_videoregs") /* W/O? */ AM_RANGE(0xa00000, 0xa03fff) AM_RAM_WRITE(paletteram32_macrossp_w) AM_SHARE("paletteram") diff --git a/src/mame/includes/macrossp.h b/src/mame/includes/macrossp.h index 6126d2ebdfd..1514a1f85e3 100644 --- a/src/mame/includes/macrossp.h +++ b/src/mame/includes/macrossp.h @@ -11,27 +11,42 @@ public: : driver_device(mconfig, type, tag), m_spriteram(*this, "spriteram"), m_scra_videoram(*this, "scra_videoram"), + m_scra_linezoom(*this, "scra_linezoom"), m_scra_videoregs(*this, "scra_videoregs"), + m_scrb_videoram(*this, "scrb_videoram"), + m_scrb_linezoom(*this, "scrb_linezoom"), m_scrb_videoregs(*this, "scrb_videoregs"), + m_scrc_videoram(*this, "scrc_videoram"), + m_scrc_linezoom(*this, "scrc_linezoom"), m_scrc_videoregs(*this, "scrc_videoregs"), + m_text_videoram(*this, "text_videoram"), + m_text_linezoom(*this, "text_linezoom"), m_text_videoregs(*this, "text_videoregs"), + m_paletteram(*this, "paletteram"), m_mainram(*this, "mainram"), m_maincpu(*this, "maincpu"), - m_audiocpu(*this, "audiocpu"){ } + m_audiocpu(*this, "audiocpu") + { + + } /* memory pointers */ required_shared_ptr m_spriteram; required_shared_ptr m_scra_videoram; + required_shared_ptr m_scra_linezoom; required_shared_ptr m_scra_videoregs; required_shared_ptr m_scrb_videoram; + required_shared_ptr m_scrb_linezoom; required_shared_ptr m_scrb_videoregs; required_shared_ptr m_scrc_videoram; + required_shared_ptr m_scrc_linezoom; required_shared_ptr m_scrc_videoregs; required_shared_ptr m_text_videoram; + required_shared_ptr m_text_linezoom; required_shared_ptr m_text_videoregs; required_shared_ptr m_paletteram; required_shared_ptr m_mainram; @@ -76,7 +91,7 @@ public: UINT32 screen_update_macrossp(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); void screen_eof_macrossp(screen_device &screen, bool state); void draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprect, int priority ); - void draw_layer( screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int layer ); + void draw_layer( screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int layer, int line ); void sortlayers(int *layer,int *pri); void update_colors( ); DECLARE_WRITE_LINE_MEMBER(irqhandler); diff --git a/src/mame/video/macrossp.c b/src/mame/video/macrossp.c index 22364493569..3394f581f40 100644 --- a/src/mame/video/macrossp.c +++ b/src/mame/video/macrossp.c @@ -304,10 +304,11 @@ void macrossp_state::draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprec } -void macrossp_state::draw_layer( screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int layer ) +void macrossp_state::draw_layer( screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int layer, int line ) { tilemap_t *tm; UINT32 *vr; + UINT32 *lr; switch (layer) { @@ -315,34 +316,45 @@ void macrossp_state::draw_layer( screen_device &screen, bitmap_rgb32 &bitmap, co default: tm = m_scra_tilemap; vr = m_scra_videoregs; + lr = m_scra_linezoom; break; case 1: tm = m_scrb_tilemap; vr = m_scrb_videoregs; + lr = m_scrb_linezoom; break; case 2: tm = m_scrc_tilemap; vr = m_scrc_videoregs; + lr = m_scrc_linezoom; break; } if ((vr[2] & 0xf0000000) == 0xe0000000) /* zoom enable (guess, surely wrong) */ { - int startx, starty, inc; + int startx, starty, inc, linc; startx = (vr[1] & 0x0000ffff) << 16; starty = (vr[1] & 0xffff0000) >> 0; - inc = (vr[2] & 0x00ff0000) >> 6, + inc = (vr[2] & 0x00ff0000) >> 6; + + if (line&1) + linc = (lr[line/2] & 0x0000ffff)>>0; + else + linc = (lr[line/2] & 0xffff0000)>>16; + + + linc <<= 10; /* WRONG! */ /* scroll register contain position relative to the center of the screen, so adjust */ - startx -= (368/2) * inc; + startx -= (368/2) * linc; starty -= (240/2) * inc; tm->draw_roz(screen, bitmap, cliprect, - startx,starty,inc,0,0,inc, + startx,starty,linc,0,0,inc, 1, /* wraparound */ 0,0); } @@ -385,11 +397,34 @@ UINT32 macrossp_state::screen_update_macrossp(screen_device &screen, bitmap_rgb3 sortlayers(layers, layerpri); - draw_layer(screen, bitmap, cliprect, layers[0]); + rectangle clip; + const rectangle &visarea = screen.visible_area(); + clip = visarea; + + for (int y=0;y<240;y++) + { + clip.min_y = clip.max_y = y; + draw_layer(screen, bitmap, clip, layers[0], y); + } + draw_sprites(bitmap, cliprect, 0); - draw_layer(screen, bitmap, cliprect, layers[1]); + + for (int y=0;y<240;y++) + { + clip.min_y = clip.max_y = y; + draw_layer(screen, bitmap, clip, layers[1], y); + } + + draw_sprites(bitmap, cliprect, 1); - draw_layer(screen, bitmap, cliprect, layers[2]); + + for (int y=0;y<240;y++) + { + clip.min_y = clip.max_y = y; + draw_layer(screen, bitmap, clip, layers[2], y); + } + + draw_sprites(bitmap, cliprect, 2); draw_sprites(bitmap, cliprect, 3); m_text_tilemap->draw(screen, bitmap, cliprect, 0, 0);