From 1046e109e0485bb84bdc5139fb7f8f311480ea9c Mon Sep 17 00:00:00 2001 From: David Haywood Date: Sun, 17 Mar 2013 22:23:05 +0000 Subject: [PATCH] deco_mlc - some improvement to stadhr96 --- src/mame/drivers/deco_mlc.c | 12 +++++-- src/mame/includes/deco_mlc.h | 5 ++- src/mame/video/deco_mlc.c | 64 ++++++++++++++++++++++++++---------- 3 files changed, 59 insertions(+), 22 deletions(-) diff --git a/src/mame/drivers/deco_mlc.c b/src/mame/drivers/deco_mlc.c index a3814fbe449..25d6730b09d 100644 --- a/src/mame/drivers/deco_mlc.c +++ b/src/mame/drivers/deco_mlc.c @@ -206,6 +206,7 @@ READ32_MEMBER(deco_mlc_state::mlc_vram_r) return m_mlc_vram[offset]&0xffff; } +// there is more to this, it controls the runner on the attract screen before the title should appear at least READ32_MEMBER(deco_mlc_state::stadhr96_prot_146_r) { /* @@ -217,7 +218,6 @@ READ32_MEMBER(deco_mlc_state::stadhr96_prot_146_r) */ offset<<=1; - logerror("%08x: Read prot %04x\n", space.device().safe_pc(), offset); if (offset==0x5c4) return 0xaa55 << 16; @@ -228,9 +228,16 @@ READ32_MEMBER(deco_mlc_state::stadhr96_prot_146_r) if (offset==0x304) return 0x0001 << 16; // Unknown, is either 0,1,2,3 + printf("%08x: Read prot %08x\n", space.device().safe_pc(), offset); + return 0; } +WRITE32_MEMBER(deco_mlc_state::stadhr96_prot_146_w) +{ + printf("%08x: Write prot %04x %08x\n", space.device().safe_pc(), offset, data); +} + /******************************************************************************/ static ADDRESS_MAP_START( decomlc_map, AS_PROGRAM, 32, deco_mlc_state ) @@ -250,8 +257,7 @@ static ADDRESS_MAP_START( decomlc_map, AS_PROGRAM, 32, deco_mlc_state ) AM_RANGE(0x044001c, 0x044001f) AM_WRITENOP AM_MIRROR(0xff000000) AM_RANGE(0x0500000, 0x0500003) AM_WRITE(avengrs_eprom_w) AM_MIRROR(0xff000000) AM_RANGE(0x0600000, 0x0600007) AM_DEVREADWRITE8_LEGACY("ymz", ymz280b_r, ymz280b_w, 0xff000000) AM_MIRROR(0xff000000) - AM_RANGE(0x070f000, 0x070ffff) AM_READ(stadhr96_prot_146_r) AM_MIRROR(0xff000000) -// AM_RANGE(0x070f000, 0x070ffff) AM_READ_LEGACY(stadhr96_prot_146_w) AM_SHARE("prot32ram") + AM_RANGE(0x070f000, 0x070ffff) AM_READWRITE(stadhr96_prot_146_r, stadhr96_prot_146_w) AM_MIRROR(0xff000000) ADDRESS_MAP_END /******************************************************************************/ diff --git a/src/mame/includes/deco_mlc.h b/src/mame/includes/deco_mlc.h index e8bded7db58..a5bed422940 100644 --- a/src/mame/includes/deco_mlc.h +++ b/src/mame/includes/deco_mlc.h @@ -16,7 +16,9 @@ public: required_shared_ptr m_mlc_vram; timer_device *m_raster_irq_timer; int m_mainCpuIsArm; - int m_mlc_raster_table[9][256]; + UINT32 m_mlc_raster_table_1[4*256]; + UINT32 m_mlc_raster_table_2[4*256]; + UINT32 m_mlc_raster_table_3[4*256]; UINT32 m_vbl_i; int m_lastScanline[9]; UINT32 m_colour_mask; @@ -30,6 +32,7 @@ public: DECLARE_READ32_MEMBER(mlc_spriteram_r); DECLARE_READ32_MEMBER(mlc_vram_r); DECLARE_READ32_MEMBER(stadhr96_prot_146_r); + DECLARE_WRITE32_MEMBER(stadhr96_prot_146_w); DECLARE_READ32_MEMBER(avengrgs_speedup_r); DECLARE_WRITE32_MEMBER(avengrs_eprom_w); DECLARE_DRIVER_INIT(mlc); diff --git a/src/mame/video/deco_mlc.c b/src/mame/video/deco_mlc.c index 05c9c209fff..75734b02ca2 100644 --- a/src/mame/video/deco_mlc.c +++ b/src/mame/video/deco_mlc.c @@ -336,29 +336,57 @@ void deco_mlc_state::draw_sprites( const rectangle &cliprect, int scanline, UINT if(fx1&1) fx^=0x8000; if(fy1&1) fy^=0x4000; + int extra_x_scale = 0x100; + + // I think we need some hardware tests.. + // see notes about how this can't be our enable register (avengrgs doesn't touch it + // and relies on something else, probably just the bits we use to select the window) + // (although as previously noted, it isn't writing valid per-scanline values either) if (rasterMode) { - int irq_base_reg = 12 /* 6, 9, 12 */; + // use of these is a bit weird. + // -ZZZ -xxx ---- -yyy -XXX -zzz - int extra_y_off = m_irq_ram[irq_base_reg+0] & 0x7ff; - int extra_x_off = m_irq_ram[irq_base_reg+1] & 0x7ff; - int extra_y_scale = (m_irq_ram[irq_base_reg+2]>>16) & 0x7ff; - int extra_x_scale = (m_irq_ram[irq_base_reg+2]>>0) & 0x7ff; + // xxx = x offset? + // yyy = y offset? + // zzz = xzoom (confirmed? stadium hero) + // 0x100 = no zoom + // + // XXX = duplicate bits of xxx? + // ZZZ = (sometimes) duplicate bits of zzz - if (extra_x_off & 0x400) extra_x_off -= 0x800; - if (extra_y_off & 0x400) extra_y_off -= 0x800; + if ((clipper==0x0) || (clipper==0x2)) + { + + int irq_base_reg; /* 6, 9, 12 are possible */ + if (clipper== 0) irq_base_reg = 6; // OK upper screen.. left? + else if (clipper== 2) irq_base_reg = 9; // OK upper screen.. main / center + else irq_base_reg = 12; + + int extra_y_off = m_irq_ram[irq_base_reg+0] & 0x7ff; + int extra_x_off = m_irq_ram[irq_base_reg+1] & 0x7ff; + extra_x_scale = (m_irq_ram[irq_base_reg+2]>>0) & 0x3ff; + + if (extra_x_off & 0x400) { extra_x_off = (-extra_x_off & 0x3ff); } else { extra_x_off = (extra_x_off & 0x3ff); } + if (extra_y_off & 0x400) { extra_x_off = (-extra_y_off & 0x3ff); } else { extra_y_off = (extra_y_off & 0x3ff); } - if (extra_y_scale & 0x400) extra_y_scale -= 0x800; - if (extra_x_scale & 0x400) extra_x_scale -= 0x800; - x += extra_x_off; - y += extra_y_off; - - xscale += extra_x_scale; - yscale += extra_y_scale; + x += extra_x_off; + y += extra_y_off; + } + else if (clipper==0x1) + { + // right? + } + else if (clipper==0x3) + { + // bottom? + } } + xscale *= extra_x_scale; + int ybase=y<<16; int yinc=(yscale<<8)*16; @@ -368,12 +396,12 @@ void deco_mlc_state::draw_sprites( const rectangle &cliprect, int scanline, UINT ybase-=yoffs * (yscale<<8); int xbase=x<<16; - int xinc=(xscale<<8)*16; + int xinc=(xscale)*16; if (fx) - xbase+=(xoffs-15) * (xscale<<8) - ((w-1)*xinc); + xbase+=(xoffs-15) * (xscale) - ((w-1)*xinc); else - xbase-=xoffs * (xscale<<8); + xbase-=xoffs * (xscale); int full_realybase = ybase; @@ -490,7 +518,7 @@ void deco_mlc_state::draw_sprites( const rectangle &cliprect, int scanline, UINT tile,tile2, color + colorOffset,fx,realxbase, 0, - use8bppMode,(xscale<<8),alpha, srcline); + use8bppMode,(xscale),alpha, srcline); }