mirror of
https://github.com/holub/mame
synced 2025-10-04 16:34:53 +03:00
Added video banking, fixes Great Guns ranking screen
This commit is contained in:
parent
fe5ac3c0fd
commit
e05327df99
@ -19,7 +19,7 @@ Device for Mazer Blazer/Great Guns custom Video Controller Unit
|
||||
const device_type MB_VCU = &device_creator<mb_vcu_device>;
|
||||
|
||||
static ADDRESS_MAP_START( mb_vcu_vram, AS_0, 8, mb_vcu_device )
|
||||
AM_RANGE(0x00000,0x1ffff) AM_RAM // enough for a 256x256x4 x 2 pages of framebuffer (TODO: doubled for simplicity)
|
||||
AM_RANGE(0x00000,0x7ffff) AM_RAM // enough for a 256x256x4 x 2 pages of framebuffer with 4 layers (TODO: doubled for simplicity)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
//-------------------------------------------------
|
||||
@ -66,7 +66,7 @@ mb_vcu_device::mb_vcu_device(const machine_config &mconfig, const char *tag, dev
|
||||
: device_t(mconfig, MB_VCU, "Mazer Blazer custom VCU", tag, owner, clock, "mb_vcu", __FILE__),
|
||||
device_memory_interface(mconfig, *this),
|
||||
device_video_interface(mconfig, *this),
|
||||
m_space_config("videoram", ENDIANNESS_LITTLE, 8, 17, 0, NULL, *ADDRESS_MAP_NAME(mb_vcu_vram))
|
||||
m_space_config("videoram", ENDIANNESS_LITTLE, 8, 19, 0, NULL, *ADDRESS_MAP_NAME(mb_vcu_vram))
|
||||
{
|
||||
}
|
||||
|
||||
@ -133,6 +133,11 @@ void mb_vcu_device::device_start()
|
||||
void mb_vcu_device::device_reset()
|
||||
{
|
||||
m_status = 1;
|
||||
|
||||
for(int i=0;i<0x80000;i++)
|
||||
{
|
||||
write_byte(i,0x0f);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -191,6 +196,10 @@ READ8_MEMBER( mb_vcu_device::load_gfx )
|
||||
int dstx,dsty;
|
||||
UINT8 dot;
|
||||
int bits = 0;
|
||||
UINT8 pen;
|
||||
UINT8 cur_layer;
|
||||
|
||||
cur_layer = 0;//(m_mode & 0x3) << 16;
|
||||
|
||||
switch(m_mode >> 2)
|
||||
{
|
||||
@ -207,8 +216,8 @@ READ8_MEMBER( mb_vcu_device::load_gfx )
|
||||
dot = m_cpu->space(AS_PROGRAM).read_byte(((offset + (bits >> 3)) & 0x1fff) + 0x4000) >> (4-(bits & 7));
|
||||
dot&= 0xf;
|
||||
|
||||
write_byte(dstx|dsty<<8, dot);
|
||||
|
||||
//if(dot != 0xf)
|
||||
write_byte(dstx|dsty<<8|cur_layer<<16|m_vbank<<18, dot);
|
||||
}
|
||||
bits += 4;
|
||||
}
|
||||
@ -228,7 +237,9 @@ READ8_MEMBER( mb_vcu_device::load_gfx )
|
||||
dot = m_cpu->space(AS_PROGRAM).read_byte(((offset + (bits >> 3)) & 0x1fff) + 0x4000) >> (7-(bits & 7));
|
||||
dot&= 1;
|
||||
|
||||
write_byte(dstx|dsty<<8, dot ? (m_color1 >> 4) : (m_color1 & 0xf));
|
||||
pen = dot ? (m_color1 >> 4) : (m_color1 & 0xf);
|
||||
//if(pen != 0xf)
|
||||
write_byte(dstx|dsty<<8|cur_layer|m_vbank<<18, pen);
|
||||
}
|
||||
bits++;
|
||||
}
|
||||
@ -250,18 +261,22 @@ READ8_MEMBER( mb_vcu_device::load_gfx )
|
||||
switch(dot)
|
||||
{
|
||||
case 0:
|
||||
write_byte(dstx|dsty<<8, m_color1 & 0xf);
|
||||
pen = m_color1 & 0xf;
|
||||
break;
|
||||
case 1:
|
||||
write_byte(dstx|dsty<<8, m_color1 >> 4);
|
||||
pen = m_color1 >> 4;
|
||||
break;
|
||||
case 2:
|
||||
write_byte(dstx|dsty<<8, m_color2 & 0xf);
|
||||
pen = m_color2 & 0xf;
|
||||
break;
|
||||
case 3:
|
||||
write_byte(dstx|dsty<<8, m_color2 >> 4);
|
||||
pen = m_color2 >> 4;
|
||||
break;
|
||||
}
|
||||
|
||||
//if(pen != 0xf)
|
||||
write_byte(dstx|dsty<<8|cur_layer|m_vbank<<18, pen);
|
||||
|
||||
}
|
||||
|
||||
bits+=2;
|
||||
@ -279,7 +294,11 @@ READ8_MEMBER( mb_vcu_device::load_gfx )
|
||||
|
||||
READ8_MEMBER( mb_vcu_device::load_set_clr )
|
||||
{
|
||||
if(0)
|
||||
int xi,yi;
|
||||
int dstx,dsty;
|
||||
// UINT8 dot;
|
||||
int bits = 0;
|
||||
if(m_mode == 0x13 || m_mode == 0x03)
|
||||
{
|
||||
printf("[0] %02x ",m_ram[m_param_offset_latch]);
|
||||
printf("X: %04x ",m_xpos);
|
||||
@ -289,11 +308,52 @@ READ8_MEMBER( mb_vcu_device::load_set_clr )
|
||||
printf("M :%02x ",m_mode);
|
||||
printf("XS:%02x ",m_pix_xsize);
|
||||
printf("YS:%02x ",m_pix_ysize);
|
||||
printf("VB:%02x ",m_vbank);
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
switch(m_mode)
|
||||
{
|
||||
case 0x13:
|
||||
case 0x03:
|
||||
for (yi = 0; yi < m_pix_ysize; yi++)
|
||||
{
|
||||
for (xi = 0; xi < m_pix_xsize; xi++)
|
||||
{
|
||||
dstx = (m_xpos + xi);
|
||||
dsty = (m_ypos + yi);
|
||||
|
||||
if(dstx < 256 && dsty < 256)
|
||||
{
|
||||
#if 0
|
||||
dot = m_cpu->space(AS_PROGRAM).read_byte(((offset + (bits >> 3)) & 0x1fff) + 0x4000) >> (6-(bits & 7));
|
||||
dot&= 3;
|
||||
|
||||
switch(dot)
|
||||
{
|
||||
case 0:
|
||||
write_byte(dstx|dsty<<8, m_color1 & 0xf);
|
||||
break;
|
||||
case 1:
|
||||
write_byte(dstx|dsty<<8, m_color1 >> 4);
|
||||
break;
|
||||
case 2:
|
||||
write_byte(dstx|dsty<<8, m_color2 & 0xf);
|
||||
break;
|
||||
case 3:
|
||||
write_byte(dstx|dsty<<8, m_color2 >> 4);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
//write_byte(dstx|dsty<<8, m_mode >> 4);
|
||||
}
|
||||
|
||||
bits+=2;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x07:
|
||||
switch(m_ypos)
|
||||
{
|
||||
@ -366,6 +426,7 @@ READ8_MEMBER( mb_vcu_device::status_r )
|
||||
|
||||
WRITE8_MEMBER( mb_vcu_device::vbank_w )
|
||||
{
|
||||
m_vbank = (data & 0x40) >> 6;
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
@ -383,7 +444,7 @@ UINT32 mb_vcu_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap,
|
||||
{
|
||||
for(x=0;x<256;x++)
|
||||
{
|
||||
dot = read_byte((x >> 0)|(y<<8));
|
||||
dot = read_byte((x >> 0)|(y<<8)|0<<16|(m_vbank ^ 1)<<18);
|
||||
//if(dot != 0xf)
|
||||
{
|
||||
dot|= m_vregs[1] << 4;
|
||||
@ -393,5 +454,62 @@ UINT32 mb_vcu_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap,
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
for(y=0;y<256;y++)
|
||||
{
|
||||
for(x=0;x<256;x++)
|
||||
{
|
||||
dot = read_byte((x >> 0)|(y<<8)|3<<16);
|
||||
|
||||
if(dot != 0xf)
|
||||
{
|
||||
dot|= m_vregs[1] << 4;
|
||||
|
||||
bitmap.pix32(y,x) = machine().pens[dot];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for(y=0;y<256;y++)
|
||||
{
|
||||
for(x=0;x<256;x++)
|
||||
{
|
||||
dot = read_byte((x >> 0)|(y<<8)|0<<16);
|
||||
|
||||
if(dot != 0xf)
|
||||
{
|
||||
dot|= m_vregs[1] << 4;
|
||||
|
||||
bitmap.pix32(y,x) = machine().pens[dot];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for(y=0;y<256;y++)
|
||||
{
|
||||
for(x=0;x<256;x++)
|
||||
{
|
||||
dot = read_byte((x >> 0)|(y<<8)|1<<16);
|
||||
|
||||
if(dot != 0xf)
|
||||
{
|
||||
dot|= m_vregs[1] << 4;
|
||||
|
||||
bitmap.pix32(y,x) = machine().pens[dot];
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void mb_vcu_device::screen_eof(void)
|
||||
{
|
||||
for(int i=0;i<0x10000;i++)
|
||||
{
|
||||
//write_byte(i|0x00000|m_vbank<<18,0x0f);
|
||||
//write_byte(i|0x10000|m_vbank<<18,0x0f);
|
||||
//write_byte(i|0x30000|m_vbank<<18,0x0f);
|
||||
}
|
||||
}
|
||||
|
@ -55,6 +55,7 @@ public:
|
||||
DECLARE_WRITE8_MEMBER( vbank_w );
|
||||
|
||||
UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||
void screen_eof(void);
|
||||
|
||||
protected:
|
||||
// device-level overrides
|
||||
@ -79,6 +80,7 @@ private:
|
||||
UINT16 m_pix_xsize, m_pix_ysize;
|
||||
UINT8 m_vregs[4];
|
||||
UINT8 m_bk_color;
|
||||
UINT8 m_vbank;
|
||||
|
||||
double m_weights_r[2];
|
||||
double m_weights_g[3];
|
||||
|
@ -223,6 +223,7 @@ public:
|
||||
virtual void video_start();
|
||||
virtual void palette_init();
|
||||
UINT32 screen_update_mazerbla(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||
void screen_eof(screen_device &screen, bool state);
|
||||
INTERRUPT_GEN_MEMBER(sound_interrupt);
|
||||
TIMER_CALLBACK_MEMBER(deferred_ls670_0_w);
|
||||
TIMER_CALLBACK_MEMBER(deferred_ls670_1_w);
|
||||
@ -291,6 +292,15 @@ UINT32 mazerbla_state::screen_update_mazerbla(screen_device &screen, bitmap_rgb3
|
||||
return 0;
|
||||
}
|
||||
|
||||
void mazerbla_state::screen_eof(screen_device &screen, bool state)
|
||||
{
|
||||
if (state)
|
||||
{
|
||||
m_vcu->screen_eof();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* reference */
|
||||
#if 0
|
||||
WRITE8_MEMBER(mazerbla_state::cfb_backgnd_color_w)
|
||||
@ -1154,8 +1164,8 @@ static INPUT_PORTS_START( mazerbla )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
|
||||
PORT_START("BUTTONS") /* Strobe 5: coin1&2, start1&2, fire */
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN2 )
|
||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN1 )
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
|
||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
|
||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START1 )
|
||||
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START2 )
|
||||
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 )
|
||||
@ -1527,6 +1537,7 @@ static MACHINE_CONFIG_START( greatgun, mazerbla_state )
|
||||
MCFG_SCREEN_SIZE(40*8, 32*8)
|
||||
MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 28*8-1)
|
||||
MCFG_SCREEN_UPDATE_DRIVER(mazerbla_state, screen_update_mazerbla)
|
||||
MCFG_SCREEN_VBLANK_DRIVER(mazerbla_state, screen_eof)
|
||||
|
||||
MCFG_PALETTE_LENGTH(256+1)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user