(MESS) arcadia.c: Reduce tagmap lookups (nw)

This commit is contained in:
Wilbert Pol 2013-02-01 20:05:42 +00:00
parent 35e3b93a06
commit d17c890cda
2 changed files with 125 additions and 99 deletions

View File

@ -28,6 +28,17 @@ class arcadia_state : public driver_device
public: public:
arcadia_state(const machine_config &mconfig, device_type type, const char *tag) arcadia_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag) : driver_device(mconfig, type, tag)
, m_custom(*this, "custom")
, m_panel(*this, "panel")
, m_controller1_col1(*this, "controller1_col1")
, m_controller1_col2(*this, "controller1_col2")
, m_controller1_col3(*this, "controller1_col3")
, m_controller1_extra(*this, "controller1_extra")
, m_controller2_col1(*this, "controller2_col1")
, m_controller2_col2(*this, "controller2_col2")
, m_controller2_col3(*this, "controller2_col3")
, m_controller2_extra(*this, "controller2_extra")
, m_joysticks(*this, "joysticks")
{ } { }
DECLARE_READ8_MEMBER(arcadia_vsync_r); DECLARE_READ8_MEMBER(arcadia_vsync_r);
@ -82,5 +93,23 @@ public:
virtual void palette_init(); virtual void palette_init();
UINT32 screen_update_arcadia(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); UINT32 screen_update_arcadia(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
INTERRUPT_GEN_MEMBER(arcadia_video_line); INTERRUPT_GEN_MEMBER(arcadia_video_line);
protected:
required_device<arcadia_sound_device> m_custom;
required_ioport m_panel;
required_ioport m_controller1_col1;
required_ioport m_controller1_col2;
required_ioport m_controller1_col3;
required_ioport m_controller1_extra;
required_ioport m_controller2_col1;
required_ioport m_controller2_col2;
required_ioport m_controller2_col3;
required_ioport m_controller2_extra;
required_ioport m_joysticks;
void arcadia_draw_char(UINT8 *ch, int charcode, int y, int x);
void arcadia_vh_draw_line(int y, UINT8 chars1[16]);
int arcadia_sprite_collision(int n1, int n2);
void arcadia_draw_sprites();
}; };
#endif /* ARCADIA_H_ */ #endif /* ARCADIA_H_ */

View File

@ -314,16 +314,16 @@ READ8_MEMBER( arcadia_state::arcadia_video_r )
UINT8 data=0; UINT8 data=0;
switch (offset) switch (offset)
{ {
case 0xff: data=m_charline|0xf0;break; case 0xff: data = m_charline|0xf0;break;
case 0x100: data=ioport("controller1_col1")->read();break; case 0x100: data = m_controller1_col1->read();break;
case 0x101: data=ioport("controller1_col2")->read();break; case 0x101: data = m_controller1_col2->read();break;
case 0x102: data=ioport("controller1_col3")->read();break; case 0x102: data = m_controller1_col3->read();break;
case 0x103: data=ioport("controller1_extra")->read();break; case 0x103: data = m_controller1_extra->read();break;
case 0x104: data=ioport("controller2_col1")->read();break; case 0x104: data = m_controller2_col1->read();break;
case 0x105: data=ioport("controller2_col2")->read();break; case 0x105: data = m_controller2_col2->read();break;
case 0x106: data=ioport("controller2_col3")->read();break; case 0x106: data = m_controller2_col3->read();break;
case 0x107: data=ioport("controller2_extra")->read();break; case 0x107: data = m_controller2_extra->read();break;
case 0x108: data=ioport("panel")->read();break; case 0x108: data = m_panel->read();break;
#if 0 #if 0
case 0x1fe: case 0x1fe:
if (m_ad_select) if (m_ad_select)
@ -342,26 +342,26 @@ READ8_MEMBER( arcadia_state::arcadia_video_r )
data = 0x80; data = 0x80;
if (m_ad_select) if (m_ad_select)
{ {
if (ioport("joysticks")->read()&0x10) data=0; if (m_joysticks->read()&0x10) data=0;
if (ioport("joysticks")->read()&0x20) data=0xff; if (m_joysticks->read()&0x20) data=0xff;
} }
else else
{ {
if (ioport("joysticks")->read()&0x40) data=0xff; if (m_joysticks->read()&0x40) data=0xff;
if (ioport("joysticks")->read()&0x80) data=0; if (m_joysticks->read()&0x80) data=0;
} }
break; break;
case 0x1ff: case 0x1ff:
data = 0x6f; // 0x7f too big for alien invaders (move right) data = 0x6f; // 0x7f too big for alien invaders (move right)
if (m_ad_select) if (m_ad_select)
{ {
if (ioport("joysticks")->read()&0x1) data=0; if (m_joysticks->read()&0x1) data=0;
if (ioport("joysticks")->read()&0x2) data=0xff; if (m_joysticks->read()&0x2) data=0xff;
} }
else else
{ {
if (ioport("joysticks")->read()&0x4) data=0xff; if (m_joysticks->read()&0x4) data=0xff;
if (ioport("joysticks")->read()&0x8) data=0; if (m_joysticks->read()&0x8) data=0;
} }
break; break;
#endif #endif
@ -373,7 +373,6 @@ READ8_MEMBER( arcadia_state::arcadia_video_r )
WRITE8_MEMBER( arcadia_state::arcadia_video_w ) WRITE8_MEMBER( arcadia_state::arcadia_video_w )
{ {
arcadia_sound_device *sound = machine().device<arcadia_sound_device>("custom");
m_reg.data[offset]=data; m_reg.data[offset]=data;
switch (offset) switch (offset)
{ {
@ -381,11 +380,11 @@ WRITE8_MEMBER( arcadia_state::arcadia_video_w )
m_ypos=255-data+YPOS; m_ypos=255-data+YPOS;
break; break;
case 0xfd: case 0xfd:
sound->write(space, offset&3, data); m_custom->write(space, offset&3, data);
m_multicolor = data & 0x80; m_multicolor = data & 0x80;
break; break;
case 0xfe: case 0xfe:
sound->write(space, offset&3, data); m_custom->write(space, offset&3, data);
m_shift = (data>>5); m_shift = (data>>5);
break; break;
case 0xf0: case 0xf0:
@ -421,73 +420,72 @@ WRITE8_MEMBER( arcadia_state::arcadia_video_w )
} }
} }
INLINE void arcadia_draw_char(running_machine &machine, bitmap_ind16 &bitmap, UINT8 *ch, int charcode, int y, int x) void arcadia_state::arcadia_draw_char(UINT8 *ch, int charcode, int y, int x)
{ {
arcadia_state *state = machine.driver_data<arcadia_state>();
int k,b,cc,sc, colour; int k,b,cc,sc, colour;
if (state->m_multicolor) if (m_multicolor)
{ {
if (charcode&0x40) if (charcode&0x40)
cc=((state->m_reg.d.pal[1]>>3)&7); cc=((m_reg.d.pal[1]>>3)&7);
else else
cc=((state->m_reg.d.pal[0]>>3)&7); cc=((m_reg.d.pal[0]>>3)&7);
if (charcode&0x80) if (charcode&0x80)
sc=(state->m_reg.d.pal[1]&7); sc=(m_reg.d.pal[1]&7);
else else
sc=(state->m_reg.d.pal[0]&7); sc=(m_reg.d.pal[0]&7);
} }
else else
{ {
cc=((state->m_reg.d.pal[1]>>3)&1)|((charcode>>5)&6); cc=((m_reg.d.pal[1]>>3)&1)|((charcode>>5)&6);
sc=(state->m_reg.d.pal[1]&7); sc=(m_reg.d.pal[1]&7);
} }
colour = (((sc << 3) | cc) + 4); colour = (((sc << 3) | cc) + 4);
if (state->m_doublescan) if (m_doublescan)
{ {
for (k=0; (k<8)&&(y<bitmap.height()); k++, y+=2) for (k=0; (k<8)&&(y<m_bitmap->height()); k++, y+=2)
{ {
b=ch[k]; b=ch[k];
state->m_bg[y][x>>3]|=b>>(x&7); m_bg[y][x>>3]|=b>>(x&7);
state->m_bg[y][(x>>3)+1]|=b<<(8-(x&7)); m_bg[y][(x>>3)+1]|=b<<(8-(x&7));
if (y+1<bitmap.height()) if (y+1<m_bitmap->height())
{ {
state->m_bg[y+1][x>>3]|=b>>(x&7); m_bg[y+1][x>>3]|=b>>(x&7);
state->m_bg[y+1][(x>>3)+1]|=b<<(8-(x&7)); m_bg[y+1][(x>>3)+1]|=b<<(8-(x&7));
drawgfx_opaque(bitmap, bitmap.cliprect(), machine.gfx[0], b,colour, 0,0,x,y); drawgfx_opaque(*m_bitmap, m_bitmap->cliprect(), machine().gfx[0], b,colour, 0,0,x,y);
drawgfx_opaque(bitmap, bitmap.cliprect(), machine.gfx[0], b,colour, 0,0,x,y+1); drawgfx_opaque(*m_bitmap, m_bitmap->cliprect(), machine().gfx[0], b,colour, 0,0,x,y+1);
} }
} }
} }
else else
{ {
for (k=0; (k<8)&&(y<bitmap.height()); k++, y++) for (k=0; (k<8)&&(y<m_bitmap->height()); k++, y++)
{ {
b=ch[k]; b=ch[k];
state->m_bg[y][x>>3]|=b>>(x&7); m_bg[y][x>>3]|=b>>(x&7);
state->m_bg[y][(x>>3)+1]|=b<<(8-(x&7)); m_bg[y][(x>>3)+1]|=b<<(8-(x&7));
drawgfx_opaque(bitmap, bitmap.cliprect(), machine.gfx[0], b,colour, 0,0,x,y); drawgfx_opaque(*m_bitmap, m_bitmap->cliprect(), machine().gfx[0], b,colour, 0,0,x,y);
} }
} }
} }
INLINE void arcadia_vh_draw_line(running_machine &machine, bitmap_ind16 &bitmap, int y, UINT8 chars1[16])
void arcadia_state::arcadia_vh_draw_line(int y, UINT8 chars1[16])
{ {
arcadia_state *state = machine.driver_data<arcadia_state>();
int x, ch, j, h; int x, ch, j, h;
int graphics=state->m_graphics; int graphics = m_graphics;
h=state->m_doublescan ? 16 : 8 ; h = m_doublescan ? 16 : 8 ;
if (bitmap.height()-state->m_line<h) if (m_bitmap->height() - m_line < h)
h=bitmap.height()-state->m_line; h = m_bitmap->height() - m_line;
bitmap.plot_box(0, y, bitmap.width(), h, (state->m_reg.d.pal[1]&7)); m_bitmap->plot_box(0, y, m_bitmap->width(), h, (m_reg.d.pal[1]&7));
memset(state->m_bg[y], 0, sizeof(state->m_bg[0])*h); memset(m_bg[y], 0, sizeof(m_bg[0])*h);
for (x=XPOS+state->m_shift, j=0; j<16;j++,x+=8) for (x=XPOS+m_shift, j=0; j<16;j++,x+=8)
{ {
ch=chars1[j]; ch=chars1[j];
// hangman switches with 0x40 // hangman switches with 0x40
@ -504,29 +502,30 @@ INLINE void arcadia_vh_draw_line(running_machine &machine, bitmap_ind16 &bitmap,
} }
} }
if (graphics) if (graphics)
arcadia_draw_char(machine, bitmap, state->m_rectangle[ch&0x3f], ch, y, x); arcadia_draw_char(m_rectangle[ch&0x3f], ch, y, x);
else else
arcadia_draw_char(machine, bitmap, state->m_chars[ch&0x3f], ch, y, x); arcadia_draw_char(m_chars[ch&0x3f], ch, y, x);
} }
} }
static int arcadia_sprite_collision(arcadia_state *state, int n1, int n2)
int arcadia_state::arcadia_sprite_collision(int n1, int n2)
{ {
int k, b1, b2, x; int k, b1, b2, x;
if (state->m_pos[n1].x+8<=state->m_pos[n2].x) if (m_pos[n1].x+8<=m_pos[n2].x)
return FALSE; return FALSE;
if (state->m_pos[n1].x>=state->m_pos[n2].x+8) if (m_pos[n1].x>=m_pos[n2].x+8)
return FALSE; return FALSE;
for (k=0; k<8; k++) for (k=0; k<8; k++)
{ {
if (state->m_pos[n1].y+k<state->m_pos[n2].y) if (m_pos[n1].y+k<m_pos[n2].y)
continue; continue;
if (state->m_pos[n1].y+k>=state->m_pos[n2].y+8) if (m_pos[n1].y+k>=m_pos[n2].y+8)
break; break;
x=state->m_pos[n1].x-state->m_pos[n2].x; x=m_pos[n1].x-m_pos[n2].x;
b1=state->m_reg.d.chars[n1][k]; b1=m_reg.d.chars[n1][k];
b2=state->m_reg.d.chars[n2][state->m_pos[n1].y+k-state->m_pos[n2].y]; b2=m_reg.d.chars[n2][m_pos[n1].y+k-m_pos[n2].y];
if (x<0) if (x<0)
b2>>=-x; b2>>=-x;
if (x>0) if (x>0)
@ -537,80 +536,80 @@ static int arcadia_sprite_collision(arcadia_state *state, int n1, int n2)
return FALSE; return FALSE;
} }
static void arcadia_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap)
void arcadia_state::arcadia_draw_sprites()
{ {
arcadia_state *state = machine.driver_data<arcadia_state>();
int i, k, x, y, color=0; int i, k, x, y, color=0;
UINT8 b; UINT8 b;
state->m_reg.d.collision_bg|=0xf; m_reg.d.collision_bg|=0xf;
state->m_reg.d.collision_sprite|=0x3f; m_reg.d.collision_sprite|=0x3f;
for (i=0; i<4; i++) for (i=0; i<4; i++)
{ {
int doublescan = FALSE; int doublescan = FALSE;
if (state->m_pos[i].y<=-YPOS) continue; if (m_pos[i].y<=-YPOS) continue;
if (state->m_pos[i].y>=bitmap.height()-YPOS-8) continue; if (m_pos[i].y>=m_bitmap->height()-YPOS-8) continue;
if (state->m_pos[i].x<=-XPOS) continue; if (m_pos[i].x<=-XPOS) continue;
if (state->m_pos[i].x>=128+XPOS-8) continue; if (m_pos[i].x>=128+XPOS-8) continue;
switch (i) switch (i)
{ {
case 0: case 0:
color=(state->m_reg.d.pal[3]>>3)&7; color=(m_reg.d.pal[3]>>3)&7;
doublescan=state->m_reg.d.pal[3]&0x80?FALSE:TRUE; doublescan=m_reg.d.pal[3]&0x80?FALSE:TRUE;
break; break;
case 1: case 1:
color=state->m_reg.d.pal[3]&7; color=m_reg.d.pal[3]&7;
doublescan=state->m_reg.d.pal[3]&0x40?FALSE:TRUE; doublescan=m_reg.d.pal[3]&0x40?FALSE:TRUE;
break; break;
case 2: case 2:
color=(state->m_reg.d.pal[2]>>3)&7; color=(m_reg.d.pal[2]>>3)&7;
doublescan=state->m_reg.d.pal[2]&0x80?FALSE:TRUE; doublescan=m_reg.d.pal[2]&0x80?FALSE:TRUE;
break; break;
case 3: case 3:
color=state->m_reg.d.pal[2]&7; color=m_reg.d.pal[2]&7;
doublescan=state->m_reg.d.pal[2]&0x40?FALSE:TRUE; doublescan=m_reg.d.pal[2]&0x40?FALSE:TRUE;
break; break;
} }
for (k=0; k<8; k++) for (k=0; k<8; k++)
{ {
int j, m; int j, m;
b=state->m_reg.d.chars[i][k]; b=m_reg.d.chars[i][k];
x=state->m_pos[i].x+XPOS; x=m_pos[i].x+XPOS;
if (!doublescan) if (!doublescan)
{ {
y=state->m_pos[i].y+YPOS+k; y=m_pos[i].y+YPOS+k;
for (j=0,m=0x80; j<8; j++, m>>=1) for (j=0,m=0x80; j<8; j++, m>>=1)
{ {
if (b & m) if (b & m)
bitmap.pix16(y, x + j) = color; m_bitmap->pix16(y, x + j) = color;
} }
} }
else else
{ {
y=state->m_pos[i].y+YPOS+k*2; y=m_pos[i].y+YPOS+k*2;
for (j=0,m=0x80; j<8; j++, m>>=1) for (j=0,m=0x80; j<8; j++, m>>=1)
{ {
if (b & m) if (b & m)
{ {
bitmap.pix16(y, x + j) = color; m_bitmap->pix16(y, x + j) = color;
bitmap.pix16(y+1, x + j) = color; m_bitmap->pix16(y+1, x + j) = color;
} }
} }
} }
if (state->m_reg.d.collision_bg&(1<<i)) if (m_reg.d.collision_bg&(1<<i))
{ {
if ( (b<<(8-(x&7))) & ((state->m_bg[y][x>>3]<<8) | state->m_bg[y][(x>>3)+1]) ) if ( (b<<(8-(x&7))) & ((m_bg[y][x>>3]<<8) | m_bg[y][(x>>3)+1]) )
state->m_reg.d.collision_bg&=~(1<<i); m_reg.d.collision_bg&=~(1<<i);
} }
} }
} }
if (arcadia_sprite_collision(state,0,1)) state->m_reg.d.collision_sprite&=~1; if (arcadia_sprite_collision(0,1)) m_reg.d.collision_sprite&=~1;
if (arcadia_sprite_collision(state,0,2)) state->m_reg.d.collision_sprite&=~2; if (arcadia_sprite_collision(0,2)) m_reg.d.collision_sprite&=~2;
if (arcadia_sprite_collision(state,0,3)) state->m_reg.d.collision_sprite&=~4; if (arcadia_sprite_collision(0,3)) m_reg.d.collision_sprite&=~4;
if (arcadia_sprite_collision(state,1,2)) state->m_reg.d.collision_sprite&=~8; if (arcadia_sprite_collision(1,2)) m_reg.d.collision_sprite&=~8;
if (arcadia_sprite_collision(state,1,3)) state->m_reg.d.collision_sprite&=~0x10; //guess if (arcadia_sprite_collision(1,3)) m_reg.d.collision_sprite&=~0x10; //guess
if (arcadia_sprite_collision(state,2,3)) state->m_reg.d.collision_sprite&=~0x20; //guess if (arcadia_sprite_collision(2,3)) m_reg.d.collision_sprite&=~0x20; //guess
} }
INTERRUPT_GEN_MEMBER(arcadia_state::arcadia_video_line) INTERRUPT_GEN_MEMBER(arcadia_state::arcadia_video_line)
@ -642,8 +641,7 @@ INTERRUPT_GEN_MEMBER(arcadia_state::arcadia_video_line)
{ {
if (((m_line-m_ypos)&(h-1))==0) if (((m_line-m_ypos)&(h-1))==0)
{ {
arcadia_vh_draw_line(machine(), *m_bitmap, m_charline*h+m_ypos, arcadia_vh_draw_line(m_charline*h+m_ypos, m_reg.d.chars1[m_charline]);
m_reg.d.chars1[m_charline]);
} }
} }
else else
@ -651,8 +649,7 @@ INTERRUPT_GEN_MEMBER(arcadia_state::arcadia_video_line)
{ {
if (((m_line-m_ypos)&(h-1))==0) if (((m_line-m_ypos)&(h-1))==0)
{ {
arcadia_vh_draw_line(machine(), *m_bitmap, m_charline*h+m_ypos, arcadia_vh_draw_line(m_charline*h+m_ypos, m_reg.d.chars2[m_charline-13]);
m_reg.d.chars2[m_charline-13]);
} }
m_charline-=13; m_charline-=13;
} }
@ -664,7 +661,7 @@ INTERRUPT_GEN_MEMBER(arcadia_state::arcadia_video_line)
} }
} }
if (m_line==261) if (m_line==261)
arcadia_draw_sprites(machine(), *m_bitmap); arcadia_draw_sprites();
} }
READ8_MEMBER( arcadia_state::arcadia_vsync_r ) READ8_MEMBER( arcadia_state::arcadia_vsync_r )