diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/mame/drivers/deco_mlc.c | 40 | ||||
| -rw-r--r-- | src/mame/includes/deco_mlc.h | 17 | ||||
| -rw-r--r-- | src/mame/video/deco_mlc.c | 54 |
3 files changed, 77 insertions, 34 deletions
diff --git a/src/mame/drivers/deco_mlc.c b/src/mame/drivers/deco_mlc.c index 25d6730b09d..dea13671388 100644 --- a/src/mame/drivers/deco_mlc.c +++ b/src/mame/drivers/deco_mlc.c @@ -196,10 +196,7 @@ WRITE32_MEMBER(deco_mlc_state::mlc_irq_w) // logerror("irqw %04x %04x (%d)\n", offset * 4, data&0xffff, scanline); } -READ32_MEMBER(deco_mlc_state::mlc_spriteram_r) -{ - return m_spriteram[offset]&0xffff; -} + READ32_MEMBER(deco_mlc_state::mlc_vram_r) { @@ -238,6 +235,37 @@ WRITE32_MEMBER(deco_mlc_state::stadhr96_prot_146_w) printf("%08x: Write prot %04x %08x\n", space.device().safe_pc(), offset, data); } +READ32_MEMBER( deco_mlc_state::mlc_spriteram_r ) +{ + UINT32 retdata = 0; + + if (mem_mask & 0xffff0000) + { + retdata |= 0xffff0000; + } + + if (mem_mask & 0x0000ffff) + { + retdata |= m_mlc_spriteram[offset]; + } + + return retdata; +} + + +WRITE32_MEMBER( deco_mlc_state::mlc_spriteram_w ) +{ + if (mem_mask & 0xffff0000) + { + + } + + if (mem_mask & 0x0000ffff) + { + data &=0x0000ffff; + COMBINE_DATA(&m_mlc_spriteram[offset]); + } +} /******************************************************************************/ static ADDRESS_MAP_START( decomlc_map, AS_PROGRAM, 32, deco_mlc_state ) @@ -249,8 +277,8 @@ static ADDRESS_MAP_START( decomlc_map, AS_PROGRAM, 32, deco_mlc_state ) AM_RANGE(0x0200078, 0x020007f) AM_READ(test2_r) AM_MIRROR(0xff000000) AM_RANGE(0x0200000, 0x020007f) AM_WRITE(mlc_irq_w) AM_SHARE("irq_ram") AM_MIRROR(0xff000000) AM_RANGE(0x0200080, 0x02000ff) AM_RAM AM_SHARE("mlc_clip_ram") AM_MIRROR(0xff000000) - AM_RANGE(0x0204000, 0x0206fff) AM_RAM_READ(mlc_spriteram_r) AM_SHARE("spriteram") AM_MIRROR(0xff000000) - AM_RANGE(0x0280000, 0x029ffff) AM_RAM_READ(mlc_vram_r) AM_SHARE("mlc_vram") AM_MIRROR(0xff000000) + AM_RANGE(0x0204000, 0x0206fff) AM_READWRITE( mlc_spriteram_r, mlc_spriteram_w ) AM_MIRROR(0xff000000) + AM_RANGE(0x0280000, 0x029ffff) AM_RAM AM_SHARE("mlc_vram") AM_MIRROR(0xff000000) AM_RANGE(0x0300000, 0x0307fff) AM_RAM_WRITE(avengrs_palette_w) AM_SHARE("paletteram") AM_MIRROR(0xff000000) AM_RANGE(0x0400000, 0x0400003) AM_READ_PORT("INPUTS") AM_MIRROR(0xff000000) AM_RANGE(0x0440000, 0x044001f) AM_READ(test3_r) AM_MIRROR(0xff000000) diff --git a/src/mame/includes/deco_mlc.h b/src/mame/includes/deco_mlc.h index a5bed422940..883881c6420 100644 --- a/src/mame/includes/deco_mlc.h +++ b/src/mame/includes/deco_mlc.h @@ -6,13 +6,13 @@ public: m_mlc_ram(*this, "mlc_ram"), m_irq_ram(*this, "irq_ram"), m_mlc_clip_ram(*this, "mlc_clip_ram"), - m_spriteram(*this, "spriteram"), - m_mlc_vram(*this, "mlc_vram"){ } + m_mlc_vram(*this, "mlc_vram") + + { } required_shared_ptr<UINT32> m_mlc_ram; required_shared_ptr<UINT32> m_irq_ram; required_shared_ptr<UINT32> m_mlc_clip_ram; - required_shared_ptr<UINT32> m_spriteram; required_shared_ptr<UINT32> m_mlc_vram; timer_device *m_raster_irq_timer; int m_mainCpuIsArm; @@ -22,19 +22,26 @@ public: UINT32 m_vbl_i; int m_lastScanline[9]; UINT32 m_colour_mask; - UINT32 *m_mlc_buffered_spriteram; + + UINT16 *m_mlc_spriteram; + UINT16 *m_mlc_spriteram_spare; + UINT16 *m_mlc_buffered_spriteram; DECLARE_READ32_MEMBER(test2_r); DECLARE_READ32_MEMBER(test3_r); DECLARE_WRITE32_MEMBER(avengrs_palette_w); DECLARE_READ32_MEMBER(decomlc_vbl_r); DECLARE_READ32_MEMBER(mlc_scanline_r); DECLARE_WRITE32_MEMBER(mlc_irq_w); - 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_READ32_MEMBER(mlc_spriteram_r); + DECLARE_WRITE32_MEMBER(mlc_spriteram_w); + + + DECLARE_DRIVER_INIT(mlc); DECLARE_DRIVER_INIT(avengrgs); DECLARE_MACHINE_RESET(mlc); diff --git a/src/mame/video/deco_mlc.c b/src/mame/video/deco_mlc.c index 28476b3d9c4..8b36272df71 100644 --- a/src/mame/video/deco_mlc.c +++ b/src/mame/video/deco_mlc.c @@ -23,7 +23,15 @@ VIDEO_START_MEMBER(deco_mlc_state,mlc) m_colour_mask=0x1f; // temp_bitmap = auto_bitmap_rgb32_alloc( machine(), 512, 512 ); - m_mlc_buffered_spriteram = auto_alloc_array(machine(), UINT32, 0x3000/4); + m_mlc_buffered_spriteram = auto_alloc_array(machine(), UINT16, 0x3000/2); + m_mlc_spriteram_spare = auto_alloc_array(machine(), UINT16, 0x3000/2); + m_mlc_spriteram = auto_alloc_array(machine(), UINT16, 0x3000/2); + + + save_pointer(NAME(m_mlc_spriteram), 0x3000/2); + save_pointer(NAME(m_mlc_spriteram_spare), 0x3000/2); + save_pointer(NAME(m_mlc_buffered_spriteram), 0x3000/2); + } @@ -144,7 +152,7 @@ void deco_mlc_state::draw_sprites( const rectangle &cliprect, int scanline, UINT int clipper=0; rectangle user_clip; - UINT32* mlc_spriteram=m_mlc_buffered_spriteram; // spriteram32 + UINT16* mlc_spriteram=m_mlc_buffered_spriteram; // spriteram32 //printf("%d - (%08x %08x %08x) (%08x %08x %08x) (%08x %08x %08x)\n", scanline, m_irq_ram[6], m_irq_ram[7], m_irq_ram[8], m_irq_ram[9], m_irq_ram[10], m_irq_ram[11] , m_irq_ram[12] , m_irq_ram[13] , m_irq_ram[14]); @@ -167,8 +175,9 @@ void deco_mlc_state::draw_sprites( const rectangle &cliprect, int scanline, UINT 0x1000 - If set combine this 4bpp sprite & next one, into 8bpp sprite 0x0800 - This is set ingame on Stadium Hero 96, on graphics which otherwise obscure the playfield? 0x0400 - Use raster IRQ lookup table when drawing object - 0x0300 - Selects clipping window to use - 0x00ff - Colour/alpha shadow enable + 0x0300 - Selects clipping window to use - and upper bits of raster select (stadhr96) + 0x0080 - seems to be both the lower bit of the raster select (stadhr96) AND the upper bit of colour / alpha (avngrgs?) - might depend on other bits? + 0x007f - Colour/alpha shadow enable Word 2: 0x07ff - Y position Word 3: 0x07ff - X position Word 4: 0x03ff - X scale @@ -203,6 +212,9 @@ void deco_mlc_state::draw_sprites( const rectangle &cliprect, int scanline, UINT fy = mlc_spriteram[offs+1]&0x4000; color = mlc_spriteram[offs+1]&0xff; + int raster_select = (mlc_spriteram[offs+1]&0x0180)>>7; + + // there are 3 different sets of raster values, must be a way to selects // between them? furthermore avengrgs doesn't even enable this // although it doesn't seem to set the scroll values very often either @@ -289,8 +301,8 @@ void deco_mlc_state::draw_sprites( const rectangle &cliprect, int scanline, UINT yoffs=index_ptr8[0]&0xff; xoffs=index_ptr8[2]&0xff; - fy1=(index_ptr8[1]&0xf0)>>4; - fx1=(index_ptr8[3]&0xf0)>>4; + fy1=(index_ptr8[1]&0x10)>>4; + fx1=(index_ptr8[3]&0x10)>>4; tileFormat=index_ptr8[4]&0x80; @@ -329,12 +341,12 @@ void deco_mlc_state::draw_sprites( const rectangle &cliprect, int scanline, UINT yoffs=index_ptr[0]&0xff; xoffs=index_ptr[1]&0xff; - fy1=(index_ptr[0]&0xf000)>>12; - fx1=(index_ptr[1]&0xf000)>>12; + fy1=(index_ptr[0]&0x1000)>>12; + fx1=(index_ptr[1]&0x1000)>>12; } - if(fx1&1) fx^=0x8000; - if(fy1&1) fy^=0x4000; + if(fx1) fx^=0x8000; + if(fy1) fy^=0x4000; int extra_x_scale = 0x100; @@ -344,23 +356,23 @@ void deco_mlc_state::draw_sprites( const rectangle &cliprect, int scanline, UINT // (although as previously noted, it isn't writing valid per-scanline values either) if (rasterMode) { - // use of these is a bit weird. - // -ZZZ -YYY ---- -xxx -yyy -zzz + // use of these is a bit weird. (it's probably just 16-bit .. like spriteram so the upper dupes are ignored?) + // -ZZZ -yyy ---- -xxx -YYY -zzz // xxx = x offset? // yyy = y offset? // zzz = xzoom (confirmed? stadium hero) // 0x100 = no zoom // - // XXX = duplicate bits of xxx? + // YYY = duplicate bits of yyy? // ZZZ = (sometimes) duplicate bits of zzz - if ((clipper==0x0) || (clipper==0x2)) + if (raster_select==1 || raster_select==2 || raster_select==3) { 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 + if (raster_select== 1) irq_base_reg = 6; // OK upper screen.. left? + else if (raster_select== 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; @@ -374,13 +386,9 @@ void deco_mlc_state::draw_sprites( const rectangle &cliprect, int scanline, UINT x += extra_x_off; y += extra_y_off; } - else if (clipper==0x1) - { - // right? - } - else if (clipper==0x3) + else if (raster_select==0x0) { - // bottom? + // possibly disabled? } } @@ -537,7 +545,7 @@ void deco_mlc_state::screen_eof_mlc(screen_device &screen, bool state) lookup table. Without buffering incorrect one frame glitches are seen in several places, especially in Hoops. */ - memcpy(m_mlc_buffered_spriteram, m_spriteram, 0x3000); + memcpy(m_mlc_buffered_spriteram, m_mlc_spriteram, 0x3000/2); } } |
