mirror of
https://github.com/holub/mame
synced 2025-04-23 17:00:53 +03:00
(MESS) a7800 - [huygens]
* Changed default difficulty switch setting to 'A' so Tower Toppler loads the first level. * Added 7 cpu cycle delay between hsync and Maria DMA (based on atari docs). * Rewrite of video code to emulate Maria line ram buffers.
This commit is contained in:
parent
0440eebc7f
commit
0dbf1d9f86
@ -122,10 +122,10 @@ static INPUT_PORTS_START( a7800 )
|
||||
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME(DEF_STR(Pause)) PORT_CODE(KEYCODE_O)
|
||||
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED)
|
||||
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNUSED)
|
||||
PORT_DIPNAME(0x40, 0x00, "Left Difficulty Switch")
|
||||
PORT_DIPNAME(0x40, 0x40, "Left Difficulty Switch")
|
||||
PORT_DIPSETTING(0x40, "A" )
|
||||
PORT_DIPSETTING(0x00, "B" )
|
||||
PORT_DIPNAME(0x80, 0x00, "Right Difficulty Switch")
|
||||
PORT_DIPNAME(0x80, 0x80, "Right Difficulty Switch")
|
||||
PORT_DIPSETTING(0x80, "A" )
|
||||
PORT_DIPSETTING(0x00, "B" )
|
||||
INPUT_PORTS_END
|
||||
|
@ -49,7 +49,9 @@ public:
|
||||
UINT32 m_cart_size;
|
||||
unsigned char m_stick_type;
|
||||
UINT8 *m_ROM;
|
||||
int m_maria_palette[8][4];
|
||||
int m_maria_palette[32];
|
||||
int m_line_ram[2][160];
|
||||
int m_active_buffer;
|
||||
int m_maria_write_mode;
|
||||
unsigned int m_maria_dll;
|
||||
unsigned int m_maria_dl;
|
||||
@ -58,7 +60,7 @@ public:
|
||||
int m_maria_vblank;
|
||||
int m_maria_dli;
|
||||
int m_maria_dmaon;
|
||||
int m_maria_dodma;
|
||||
int m_maria_dpp;
|
||||
int m_maria_wsync;
|
||||
int m_maria_backcolor;
|
||||
int m_maria_color_kill;
|
||||
@ -86,6 +88,7 @@ public:
|
||||
DECLARE_PALETTE_INIT(a7800p);
|
||||
UINT32 screen_update_a7800(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(a7800_interrupt);
|
||||
TIMER_CALLBACK_MEMBER(a7800_maria_startdma);
|
||||
DECLARE_READ8_MEMBER(riot_joystick_r);
|
||||
DECLARE_READ8_MEMBER(riot_console_button_r);
|
||||
DECLARE_WRITE8_MEMBER(riot_button_pullup_w);
|
||||
@ -113,6 +116,8 @@ protected:
|
||||
memory_bank *m_bank11;
|
||||
|
||||
void maria_draw_scanline();
|
||||
int is_holey(unsigned int addr);
|
||||
int write_line_ram(int addr, UINT8 offset, int pal);
|
||||
int a7800_verify_cart(char header[128]);
|
||||
UINT16 a7800_get_pcb_id(const char *pcb);
|
||||
};
|
||||
|
@ -7,6 +7,9 @@
|
||||
TODO:
|
||||
precise DMA cycle stealing
|
||||
|
||||
2013-05-08 huygens rewrite to emulate line ram buffers (mostly fixes Kung-Fu Master
|
||||
Started DMA cycle stealing implementation
|
||||
|
||||
2003-06-23 ericball Kangaroo mode & 320 mode & other stuff
|
||||
|
||||
2002-05-14 kubecj vblank dma stop fix
|
||||
@ -34,14 +37,6 @@
|
||||
|
||||
#define DPPH 0x2c
|
||||
#define DPPL 0x30
|
||||
#define CTRL 0x3c
|
||||
|
||||
|
||||
|
||||
|
||||
// 20030621 ericball define using logical operations
|
||||
#define inc_hpos() { hpos = (hpos + 1) & 0x1FF; }
|
||||
#define inc_hpos_by_2() { hpos = (hpos + 2) & 0x1FF; }
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
@ -50,21 +45,24 @@
|
||||
***************************************************************************/
|
||||
void a7800_state::video_start()
|
||||
{
|
||||
int i;
|
||||
|
||||
for(i=0; i<8; i++)
|
||||
int i,j;
|
||||
for(i=0; i<32; i++)
|
||||
{
|
||||
m_maria_palette[i][0]=0;
|
||||
m_maria_palette[i][1]=0;
|
||||
m_maria_palette[i][2]=0;
|
||||
m_maria_palette[i][3]=0;
|
||||
m_maria_palette[i]=0;
|
||||
}
|
||||
|
||||
for(i=0; i<2; i++)
|
||||
{
|
||||
for(j=0; j<160; j++)
|
||||
m_line_ram[i][j] = 0;
|
||||
}
|
||||
|
||||
m_active_buffer = 0;
|
||||
|
||||
m_maria_write_mode=0;
|
||||
m_maria_dmaon=0;
|
||||
m_maria_vblank=0x80;
|
||||
m_maria_dll=0;
|
||||
m_maria_dodma=0;
|
||||
m_maria_wsync=0;
|
||||
|
||||
m_maria_color_kill = 0;
|
||||
@ -82,24 +80,67 @@ void a7800_state::video_start()
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
int a7800_state::is_holey(unsigned int addr)
|
||||
{
|
||||
if (((m_maria_holey & 0x02) && ((addr & 0x9000) == 0x9000)) || ( (m_maria_holey & 0x01) && ((addr & 0x8800) == 0x8800)))
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
int a7800_state::write_line_ram(int addr, UINT8 offset, int pal)
|
||||
{
|
||||
address_space& space = m_maincpu->space(AS_PROGRAM);
|
||||
int data, c;
|
||||
|
||||
data = READ_MEM(addr);
|
||||
pal = pal << 2;
|
||||
|
||||
if (m_maria_write_mode)
|
||||
{
|
||||
c = (pal & 0x10) | (data & 0x0C) | (data >> 6); // P2 D3 D2 D7 D6
|
||||
if (((c & 3) || m_maria_kangaroo) && (offset < 160))
|
||||
m_line_ram[m_active_buffer][offset] = c;
|
||||
offset++;
|
||||
c = (pal & 0x10) | ((data & 0x03) << 2) | ((data & 0x30) >> 4); // P2 D1 D0 D5 D4
|
||||
if (((c & 3) || m_maria_kangaroo) && (offset < 160))
|
||||
m_line_ram[m_active_buffer][offset] = c;
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i=0; i<4; i++, offset++)
|
||||
{
|
||||
c = pal | ((data >> (6 - 2*i)) & 0x03);
|
||||
if (((c & 3) || m_maria_kangaroo) && (offset < 160))
|
||||
m_line_ram[m_active_buffer][offset] = c;
|
||||
}
|
||||
}
|
||||
return m_maria_write_mode ? 2 : 4;
|
||||
}
|
||||
|
||||
|
||||
void a7800_state::maria_draw_scanline()
|
||||
{
|
||||
address_space& space = m_maincpu->space(AS_PROGRAM);
|
||||
unsigned int graph_adr,data_addr;
|
||||
int width,hpos,pal,mode,ind;
|
||||
int width,pal,ind;
|
||||
UINT8 hpos;
|
||||
int xpos;
|
||||
unsigned int dl;
|
||||
int x, d, c, i;
|
||||
int ind_bytes;
|
||||
UINT16 *scanline;
|
||||
int x, d, c, i, j, pixel_cell, cells;
|
||||
int maria_cycles;
|
||||
|
||||
/* set up scanline */
|
||||
scanline = &m_bitmap.pix16(m_screen->vpos());
|
||||
for (i = 0; i < 320; i++)
|
||||
scanline[i] = m_maria_backcolor;
|
||||
maria_cycles = 0;
|
||||
cells = 0;
|
||||
|
||||
/* clear active line ram buffer */
|
||||
for (i = 0; i < 160; i++)
|
||||
m_line_ram[m_active_buffer][i] = 0;
|
||||
|
||||
/* Process this DLL entry */
|
||||
dl = m_maria_dl;
|
||||
|
||||
/* DMA */
|
||||
/* Step through DL's */
|
||||
while ((READ_MEM(dl + 1) & 0x5F) != 0)
|
||||
{
|
||||
@ -108,287 +149,206 @@ void a7800_state::maria_draw_scanline()
|
||||
{
|
||||
graph_adr = (READ_MEM(dl+2) << 8) | READ_MEM(dl);
|
||||
width = ((READ_MEM(dl+3) ^ 0xff) & 0x1F) + 1;
|
||||
hpos = READ_MEM(dl+4)*2;
|
||||
hpos = READ_MEM(dl+4);
|
||||
pal = READ_MEM(dl+3) >> 5;
|
||||
m_maria_write_mode = (READ_MEM(dl+1) & 0x80) >> 5;
|
||||
ind = READ_MEM(dl+1) & 0x20;
|
||||
dl+=5;
|
||||
maria_cycles += 10;
|
||||
}
|
||||
/* Normal header */
|
||||
else
|
||||
{
|
||||
graph_adr = (READ_MEM(dl+2) << 8) | READ_MEM(dl);
|
||||
width = ((READ_MEM(dl+1) ^ 0xff) & 0x1F) + 1;
|
||||
hpos = READ_MEM(dl+3)*2;
|
||||
hpos = READ_MEM(dl+3);
|
||||
pal = READ_MEM(dl+1) >> 5;
|
||||
ind = 0x00;
|
||||
dl+=4;
|
||||
maria_cycles += 8;
|
||||
}
|
||||
|
||||
mode = m_maria_rm | m_maria_write_mode;
|
||||
|
||||
/*logerror("%x DL: ADR=%x width=%x hpos=%x pal=%x mode=%x ind=%x\n",m_screen->vpos(),graph_adr,width,hpos,pal,mode,ind );*/
|
||||
|
||||
for (x=0; x<width; x++) // 20030621 ericball get graphic data first, then switch (mode)
|
||||
for (x=0; x<width; x++)
|
||||
{
|
||||
ind_bytes = 1;
|
||||
|
||||
/* Do indirect mode */
|
||||
if (ind)
|
||||
{
|
||||
c = READ_MEM(graph_adr + x) & 0xFF;
|
||||
data_addr= (m_maria_charbase | c) + (m_maria_offset << 8);
|
||||
if( m_maria_cwidth )
|
||||
ind_bytes = 2;
|
||||
maria_cycles += 3; // 3 Maria cycles
|
||||
data_addr = (m_maria_charbase | c) + (m_maria_offset << 8);
|
||||
if (is_holey(data_addr))
|
||||
continue;
|
||||
if( m_maria_cwidth ) // two data bytes per map byte
|
||||
{
|
||||
cells = write_line_ram(data_addr, hpos, pal);
|
||||
hpos += cells;
|
||||
cells = write_line_ram(data_addr+1, hpos, pal);
|
||||
hpos += cells;
|
||||
}
|
||||
else
|
||||
{
|
||||
cells = write_line_ram(data_addr, hpos, pal);
|
||||
hpos += cells;
|
||||
}
|
||||
}
|
||||
else
|
||||
else // direct mode
|
||||
{
|
||||
data_addr = graph_adr + x + (m_maria_offset << 8);
|
||||
if (is_holey(data_addr))
|
||||
continue;
|
||||
cells = write_line_ram(data_addr, hpos, pal);
|
||||
hpos += cells;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( (m_maria_holey & 0x02) && ((data_addr & 0x9000) == 0x9000))
|
||||
continue;
|
||||
if ( (m_maria_holey & 0x01) && ((data_addr & 0x8800) == 0x8800))
|
||||
continue;
|
||||
/* render scanline */
|
||||
m_active_buffer = !m_active_buffer; // switch buffers
|
||||
UINT16 *scanline;
|
||||
scanline = &m_bitmap.pix16(m_screen->vpos());
|
||||
for (i = 0; i < 320; i++)
|
||||
scanline[i] = m_maria_palette[0];
|
||||
|
||||
while (ind_bytes > 0)
|
||||
{
|
||||
ind_bytes--;
|
||||
d = READ_MEM(data_addr++);
|
||||
xpos = 0;
|
||||
i=0;
|
||||
|
||||
switch (mode)
|
||||
while ( i<160 )
|
||||
|
||||
switch (m_maria_rm | m_maria_write_mode)
|
||||
{
|
||||
case 0x00: /* 160A (160x2) */
|
||||
case 0x01: /* 160A (160x2) */
|
||||
for (j = 0; j<4; j++, xpos+=2)
|
||||
{
|
||||
case 0x00: /* 160A (160x2) */
|
||||
case 0x01: /* 160A (160x2) */
|
||||
c = (d & 0xC0) >> 6;
|
||||
if (c || m_maria_kangaroo)
|
||||
{
|
||||
scanline[hpos + 0] = m_maria_palette[pal][c];
|
||||
scanline[hpos + 1] = m_maria_palette[pal][c];
|
||||
}
|
||||
inc_hpos_by_2();
|
||||
pixel_cell = m_line_ram[m_active_buffer][i+j];
|
||||
scanline[xpos] = m_maria_palette[pixel_cell];
|
||||
scanline[xpos+1] = m_maria_palette[pixel_cell];
|
||||
}
|
||||
i += 4;
|
||||
break;
|
||||
|
||||
c = (d & 0x30) >> 4;
|
||||
if (c || m_maria_kangaroo)
|
||||
{
|
||||
scanline[hpos + 0] = m_maria_palette[pal][c];
|
||||
scanline[hpos + 1] = m_maria_palette[pal][c];
|
||||
}
|
||||
inc_hpos_by_2();
|
||||
case 0x02: /* 320D used by Jinks! */
|
||||
for (j = 0; j<4; j++, xpos+=2)
|
||||
{
|
||||
pixel_cell = m_line_ram[m_active_buffer][i+j];
|
||||
d = (pixel_cell & 0x10) | (pixel_cell & 0x02) | ((pixel_cell >> 3) & 1);
|
||||
scanline[xpos] = m_maria_palette[d];
|
||||
|
||||
c = (d & 0x0C) >> 2;
|
||||
if (c || m_maria_kangaroo)
|
||||
{
|
||||
scanline[hpos + 0] = m_maria_palette[pal][c];
|
||||
scanline[hpos + 1] = m_maria_palette[pal][c];
|
||||
}
|
||||
inc_hpos_by_2();
|
||||
d = (pixel_cell & 0x10) | ((pixel_cell << 1) & 0x02) | ((pixel_cell >> 2) & 1);
|
||||
scanline[xpos+1] = m_maria_palette[d];
|
||||
}
|
||||
i += 4;
|
||||
break;
|
||||
|
||||
c = (d & 0x03);
|
||||
if (c || m_maria_kangaroo)
|
||||
{
|
||||
scanline[hpos + 0] = m_maria_palette[pal][c];
|
||||
scanline[hpos + 1] = m_maria_palette[pal][c];
|
||||
}
|
||||
inc_hpos_by_2();
|
||||
break;
|
||||
case 0x03: /* MODE 320A */
|
||||
for (j = 0; j<4; j++, xpos+=2)
|
||||
{
|
||||
pixel_cell = m_line_ram[m_active_buffer][i+j];
|
||||
d = (pixel_cell & 0x1C) | (pixel_cell & 0x02);
|
||||
scanline[xpos] = m_maria_palette[d];
|
||||
|
||||
case 0x02: /* 320D used by Jinks! */
|
||||
c = pal & 0x04;
|
||||
if ( d & 0xC0 || pal & 0x03 || m_maria_kangaroo )
|
||||
{
|
||||
scanline[hpos + 0] = m_maria_palette[c][((d & 0x80) >> 6) | ((pal & 2) >> 1)];
|
||||
scanline[hpos + 1] = m_maria_palette[c][((d & 0x40) >> 5) | ((pal & 1) >> 0)];
|
||||
}
|
||||
inc_hpos_by_2();
|
||||
d = (pixel_cell & 0x1C) | ((pixel_cell << 1) & 0x02);
|
||||
scanline[xpos+1] = m_maria_palette[d];
|
||||
}
|
||||
i += 4;
|
||||
break;
|
||||
|
||||
if ( d & 0x30 || pal & 0x03 || m_maria_kangaroo )
|
||||
{
|
||||
scanline[hpos + 0] = m_maria_palette[c][((d & 0x20) >> 4) | ((pal & 2) >> 1)];
|
||||
scanline[hpos + 1] = m_maria_palette[c][((d & 0x10) >> 3) | ((pal & 1) >> 0)];
|
||||
}
|
||||
inc_hpos_by_2();
|
||||
case 0x04: /* 160B (160x4) */
|
||||
case 0x05: /* 160B (160x4) */
|
||||
for (j = 0; j<2; j++, xpos+=2)
|
||||
{
|
||||
d = m_line_ram[m_active_buffer][i+j];
|
||||
scanline[xpos] = m_maria_palette[d];
|
||||
scanline[xpos+1] = m_maria_palette[d];
|
||||
}
|
||||
i += 2;
|
||||
break;
|
||||
|
||||
if ( d & 0x0C || pal & 0x03 || m_maria_kangaroo )
|
||||
{
|
||||
scanline[hpos + 0] = m_maria_palette[c][((d & 0x08) >> 2) | ((pal & 2) >> 1)];
|
||||
scanline[hpos + 1] = m_maria_palette[c][((d & 0x04) >> 1) | ((pal & 1) >> 0)];
|
||||
}
|
||||
inc_hpos_by_2();
|
||||
case 0x06: /* MODE 320B */
|
||||
for (j = 0; j<2; j++, xpos+=2)
|
||||
{
|
||||
pixel_cell = m_line_ram[m_active_buffer][i+j];
|
||||
|
||||
if ( d & 0x03 || pal & 0x03 || m_maria_kangaroo )
|
||||
{
|
||||
scanline[hpos + 0] = m_maria_palette[c][((d & 0x02) << 0) | ((pal & 2) >> 1)];
|
||||
scanline[hpos + 1] = m_maria_palette[c][((d & 0x01) << 1) | ((pal & 1) >> 0)];
|
||||
}
|
||||
inc_hpos_by_2();
|
||||
d = (pixel_cell & 0x10) | (pixel_cell & 0x02) | ((pixel_cell >> 3) & 1);
|
||||
scanline[xpos] = m_maria_palette[d];
|
||||
|
||||
break;
|
||||
d = (pixel_cell & 0x10) | ((pixel_cell << 1) & 0x02) | ((pixel_cell >> 2) & 1);
|
||||
scanline[xpos+1] = m_maria_palette[d];
|
||||
}
|
||||
i += 2;
|
||||
break;
|
||||
|
||||
case 0x03: /* MODE 320A */
|
||||
if (d & 0xC0 || m_maria_kangaroo)
|
||||
{
|
||||
scanline[hpos + 0] = m_maria_palette[pal][(d & 0x80) >> 6];
|
||||
scanline[hpos + 1] = m_maria_palette[pal][(d & 0x40) >> 5];
|
||||
}
|
||||
inc_hpos_by_2();
|
||||
case 0x07: /* MODE 320C */
|
||||
for (j = 0; j<2; j++, xpos+=2)
|
||||
{
|
||||
pixel_cell = m_line_ram[m_active_buffer][i+j];
|
||||
|
||||
if ( d & 0x30 || m_maria_kangaroo)
|
||||
{
|
||||
scanline[hpos + 0] = m_maria_palette[pal][(d & 0x20) >> 4];
|
||||
scanline[hpos + 1] = m_maria_palette[pal][(d & 0x10) >> 3];
|
||||
}
|
||||
inc_hpos_by_2();
|
||||
d = pixel_cell & 0x1E;
|
||||
scanline[xpos] = m_maria_palette[d];
|
||||
|
||||
if (d & 0x0C || m_maria_kangaroo)
|
||||
{
|
||||
scanline[hpos + 0] = m_maria_palette[pal][(d & 0x08) >> 2];
|
||||
scanline[hpos + 1] = m_maria_palette[pal][(d & 0x04) >> 1];
|
||||
}
|
||||
inc_hpos_by_2();
|
||||
d = (pixel_cell & 0x1C) | ((pixel_cell & 0x01) << 1);
|
||||
scanline[xpos+1] = m_maria_palette[d];
|
||||
}
|
||||
i += 2;
|
||||
break;
|
||||
|
||||
if (d & 0x03 || m_maria_kangaroo)
|
||||
{
|
||||
scanline[hpos + 0] = m_maria_palette[pal][(d & 0x02)];
|
||||
scanline[hpos + 1] = m_maria_palette[pal][(d & 0x01) << 1];
|
||||
}
|
||||
inc_hpos_by_2();
|
||||
break;
|
||||
} /* endswitch (mode) */
|
||||
|
||||
case 0x04: /* 160B (160x4) */
|
||||
case 0x05: /* 160B (160x4) */
|
||||
c = (d & 0xC0) >> 6;
|
||||
if (c || m_maria_kangaroo)
|
||||
{
|
||||
scanline[hpos + 0] = m_maria_palette[(pal & 0x04) | ((d & 0x0C) >> 2)][c];
|
||||
scanline[hpos + 1] = m_maria_palette[(pal & 0x04) | ((d & 0x0C) >> 2)][c];
|
||||
}
|
||||
inc_hpos_by_2();
|
||||
|
||||
c = (d & 0x30) >> 4;
|
||||
if (c || m_maria_kangaroo)
|
||||
{
|
||||
scanline[hpos + 0] = m_maria_palette[(pal & 0x04) | (d & 0x03)][c];
|
||||
scanline[hpos + 1] = m_maria_palette[(pal & 0x04) | (d & 0x03)][c];
|
||||
}
|
||||
inc_hpos_by_2();
|
||||
break;
|
||||
|
||||
case 0x06: /* MODE 320B */
|
||||
if (d & 0xCC || m_maria_kangaroo)
|
||||
{
|
||||
scanline[hpos + 0] = m_maria_palette[pal][((d & 0x80) >> 6) | ((d & 0x08) >> 3)];
|
||||
scanline[hpos + 1] = m_maria_palette[pal][((d & 0x40) >> 5) | ((d & 0x04) >> 2)];
|
||||
}
|
||||
inc_hpos_by_2();
|
||||
|
||||
if ( d & 0x33 || m_maria_kangaroo)
|
||||
{
|
||||
scanline[hpos + 0] = m_maria_palette[pal][((d & 0x20) >> 4) | ((d & 0x02) >> 1)];
|
||||
scanline[hpos + 1] = m_maria_palette[pal][((d & 0x10) >> 3) | (d & 0x01)];
|
||||
}
|
||||
inc_hpos_by_2();
|
||||
break;
|
||||
|
||||
case 0x07: /* (320C mode) */
|
||||
if (d & 0xC0 || m_maria_kangaroo)
|
||||
{
|
||||
scanline[hpos + 0] = m_maria_palette[(pal & 0x04) | ((d & 0x0C) >> 2)][(d & 0x80) >> 6];
|
||||
scanline[hpos + 1] = m_maria_palette[(pal & 0x04) | ((d & 0x0C) >> 2)][(d & 0x40) >> 5];
|
||||
}
|
||||
inc_hpos_by_2();
|
||||
|
||||
if ( d & 0x30 || m_maria_kangaroo)
|
||||
{
|
||||
scanline[hpos + 0] = m_maria_palette[(pal & 0x04) | (d & 0x03)][(d & 0x20) >> 4];
|
||||
scanline[hpos + 1] = m_maria_palette[(pal & 0x04) | (d & 0x03)][(d & 0x10) >> 3];
|
||||
}
|
||||
inc_hpos_by_2();
|
||||
break;
|
||||
|
||||
} /* endswitch (mode) */
|
||||
} /* endwhile (ind_bytes > 0)*/
|
||||
} /* endfor (x=0; x<width; x++) */
|
||||
} /* endwhile (READ_MEM(dl + 1) != 0) */
|
||||
m_maincpu->adjust_icount(-maria_cycles/4); // Maria clock rate is 4 times that of CPU
|
||||
}
|
||||
|
||||
|
||||
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(a7800_state::a7800_interrupt)
|
||||
{
|
||||
int frame_scanline;
|
||||
UINT8 *ROM = m_region_maincpu->base();
|
||||
address_space& space = m_maincpu->space(AS_PROGRAM);
|
||||
int maria_scanline = m_screen->vpos();
|
||||
|
||||
/* why + 1? */
|
||||
frame_scanline = maria_scanline % ( m_lines + 1 );
|
||||
|
||||
if( frame_scanline == 1 )
|
||||
{
|
||||
/*logerror( "frame beg\n" );*/
|
||||
}
|
||||
|
||||
machine().scheduler().timer_set(m_maincpu->cycles_to_attotime(7), timer_expired_delegate(FUNC(a7800_state::a7800_maria_startdma),this));
|
||||
if( m_maria_wsync )
|
||||
{
|
||||
machine().scheduler().trigger( TRIGGER_HSYNC );
|
||||
m_maria_wsync = 0;
|
||||
}
|
||||
|
||||
int frame_scanline = m_screen->vpos() % ( m_lines + 1 );
|
||||
if (frame_scanline == 16)
|
||||
m_maria_vblank = 0x00;
|
||||
|
||||
if( frame_scanline == 16 )
|
||||
if ( frame_scanline == ( m_lines - 4 ) )
|
||||
{
|
||||
m_maria_vblank = 0x80;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
TIMER_CALLBACK_MEMBER(a7800_state::a7800_maria_startdma)
|
||||
{
|
||||
int frame_scanline;
|
||||
address_space& space = m_maincpu->space(AS_PROGRAM);
|
||||
int maria_scanline = m_screen->vpos();
|
||||
|
||||
frame_scanline = maria_scanline % ( m_lines + 1 );
|
||||
|
||||
if( (frame_scanline == 16) && m_maria_dmaon )
|
||||
{
|
||||
/* end of vblank */
|
||||
|
||||
m_maria_vblank=0;
|
||||
if( m_maria_dmaon || m_maria_dodma )
|
||||
{
|
||||
m_maria_dodma = 1; /* if dma allowed, start it */
|
||||
|
||||
m_maria_dll = (ROM[DPPH] << 8) | ROM[DPPL];
|
||||
m_maria_dl = (READ_MEM(m_maria_dll+1) << 8) | READ_MEM(m_maria_dll+2);
|
||||
m_maria_offset = READ_MEM(m_maria_dll) & 0x0f;
|
||||
m_maria_holey = (READ_MEM(m_maria_dll) & 0x60) >> 5;
|
||||
m_maria_dli = READ_MEM(m_maria_dll) & 0x80;
|
||||
/* logerror("DLL=%x\n",m_maria_dll); */
|
||||
/* logerror("DLL: DL = %x dllctrl = %x\n",m_maria_dl,ROM[m_maria_dll]); */
|
||||
}
|
||||
|
||||
/*logerror( "vblank end on line %d\n", frame_scanline );*/
|
||||
}
|
||||
|
||||
/* moved start of vblank up (to prevent dma/dli happen on line -4)
|
||||
this fix made PR Baseball happy
|
||||
Kung-Fu Master looks worse
|
||||
don't know about others yet */
|
||||
if( frame_scanline == ( m_lines - 4 ) )
|
||||
{
|
||||
/* vblank starts 4 scanlines before end of screen */
|
||||
|
||||
m_maria_vblank = 0x80;
|
||||
|
||||
/* fixed 2002/05/14 kubecj
|
||||
when going vblank, dma must be stopped
|
||||
otherwise system tries to read past end of dll
|
||||
causing false dlis to occur, mainly causing wild
|
||||
screen flickering
|
||||
|
||||
games fixed:
|
||||
Ace of Aces
|
||||
Mean 18
|
||||
Ninja Golf (end of levels)
|
||||
Choplifter
|
||||
Impossible Mission
|
||||
Jinks
|
||||
*/
|
||||
|
||||
m_maria_dodma = 0;
|
||||
/*logerror( "vblank on line %d\n\n", frame_scanline );*/
|
||||
m_maria_dll = m_maria_dpp; // currently only handle changes to dll during vblank
|
||||
m_maria_dl = (READ_MEM(m_maria_dll+1) << 8) | READ_MEM(m_maria_dll+2);
|
||||
m_maria_offset = READ_MEM(m_maria_dll) & 0x0f;
|
||||
m_maria_holey = (READ_MEM(m_maria_dll) & 0x60) >> 5;
|
||||
logerror("holey %d", m_maria_holey);
|
||||
if ( READ_MEM(m_maria_dll) & 0x80 )
|
||||
m_maincpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
|
||||
m_maincpu->adjust_icount(-6); // 24 Maria cycles minimum (DMA startup + shutdown list-list fetch)
|
||||
/* logerror("DLL=%x\n",m_maria_dll); */
|
||||
/* logerror("DLL: DL = %x dllctrl = %x\n",m_maria_dl,ROM[m_maria_dll]); */
|
||||
}
|
||||
|
||||
|
||||
if( ( frame_scanline > 15 ) && m_maria_dodma )
|
||||
if( ( frame_scanline > 15 ) && (frame_scanline < (m_lines - 4)) && m_maria_dmaon )
|
||||
{
|
||||
if (maria_scanline < ( m_lines - 4 ) )
|
||||
maria_draw_scanline();
|
||||
maria_draw_scanline();
|
||||
|
||||
if( m_maria_offset == 0 )
|
||||
{
|
||||
@ -396,25 +356,16 @@ TIMER_DEVICE_CALLBACK_MEMBER(a7800_state::a7800_interrupt)
|
||||
m_maria_dl = (READ_MEM(m_maria_dll+1) << 8) | READ_MEM(m_maria_dll+2);
|
||||
m_maria_offset = READ_MEM(m_maria_dll) & 0x0f;
|
||||
m_maria_holey = (READ_MEM(m_maria_dll) & 0x60) >> 5;
|
||||
m_maria_dli = READ_MEM(m_maria_dll) & 0x80;
|
||||
logerror("holey %d", m_maria_holey);
|
||||
if ( READ_MEM(m_maria_dll) & 0x80 )
|
||||
m_maincpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
|
||||
m_maincpu->adjust_icount(-5); // 20 Maria cycles (DMA startup + shutdown)
|
||||
}
|
||||
else
|
||||
{
|
||||
m_maria_offset--;
|
||||
}
|
||||
}
|
||||
|
||||
if( m_maria_dli )
|
||||
{
|
||||
/*logerror( "dli on line %d [%02X] [%02X] [%02X]\n", frame_scanline, ROM[0x7E], ROM[0x7C], ROM[0x7D] );*/
|
||||
}
|
||||
|
||||
if( m_maria_dli )
|
||||
{
|
||||
m_maria_dli = 0;
|
||||
m_maincpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
@ -434,7 +385,6 @@ UINT32 a7800_state::screen_update_a7800(screen_device &screen, bitmap_ind16 &bit
|
||||
|
||||
READ8_MEMBER(a7800_state::a7800_MARIA_r)
|
||||
{
|
||||
UINT8 *ROM = m_region_maincpu->base();
|
||||
switch (offset)
|
||||
{
|
||||
case 0x08:
|
||||
@ -442,113 +392,54 @@ READ8_MEMBER(a7800_state::a7800_MARIA_r)
|
||||
|
||||
default:
|
||||
logerror("undefined MARIA read %x\n",offset);
|
||||
return ROM[0x20 + offset];
|
||||
return 0x00; // don't know if this should be 0x00 or 0xff
|
||||
}
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(a7800_state::a7800_MARIA_w)
|
||||
{
|
||||
UINT8 *ROM = m_region_maincpu->base();
|
||||
int i;
|
||||
|
||||
if ((offset & 3) != 0)
|
||||
m_maria_palette[offset] = data;
|
||||
|
||||
switch (offset)
|
||||
{
|
||||
case 0x00:
|
||||
m_maria_backcolor = data;
|
||||
// 20030621 ericball added m_maria_palette[pal][0] to make kanagroo mode easier
|
||||
m_maria_palette[0][0]=m_maria_backcolor;
|
||||
m_maria_palette[1][0]=m_maria_backcolor;
|
||||
m_maria_palette[2][0]=m_maria_backcolor;
|
||||
m_maria_palette[3][0]=m_maria_backcolor;
|
||||
m_maria_palette[4][0]=m_maria_backcolor;
|
||||
m_maria_palette[5][0]=m_maria_backcolor;
|
||||
m_maria_palette[6][0]=m_maria_backcolor;
|
||||
m_maria_palette[7][0]=m_maria_backcolor;
|
||||
break;
|
||||
case 0x01:
|
||||
m_maria_palette[0][1] = data;
|
||||
break;
|
||||
case 0x02:
|
||||
m_maria_palette[0][2] = data;
|
||||
break;
|
||||
case 0x03:
|
||||
m_maria_palette[0][3] = data;
|
||||
// 0x04 etc. necessary for 320 modes (pixels with color of 00 should display as background color)
|
||||
for (i = 0; i<8; i++)
|
||||
m_maria_palette[4*i] = data;
|
||||
break;
|
||||
case 0x04:
|
||||
m_maincpu->spin_until_trigger(TRIGGER_HSYNC);
|
||||
m_maria_wsync=1;
|
||||
break;
|
||||
|
||||
case 0x05:
|
||||
m_maria_palette[1][1] = data;
|
||||
case 0x0C: // DPPH
|
||||
m_maria_dpp = (m_maria_dpp & 0x00ff) | (data << 8);
|
||||
break;
|
||||
case 0x06:
|
||||
m_maria_palette[1][2] = data;
|
||||
break;
|
||||
case 0x07:
|
||||
m_maria_palette[1][3] = data;
|
||||
break;
|
||||
|
||||
case 0x09:
|
||||
m_maria_palette[2][1] = data;
|
||||
break;
|
||||
case 0x0A:
|
||||
m_maria_palette[2][2] = data;
|
||||
break;
|
||||
case 0x0B:
|
||||
m_maria_palette[2][3] = data;
|
||||
break;
|
||||
|
||||
case 0x0D:
|
||||
m_maria_palette[3][1] = data;
|
||||
break;
|
||||
case 0x0E:
|
||||
m_maria_palette[3][2] = data;
|
||||
break;
|
||||
case 0x0F:
|
||||
m_maria_palette[3][3] = data;
|
||||
break;
|
||||
|
||||
case 0x11:
|
||||
m_maria_palette[4][1] = data;
|
||||
break;
|
||||
case 0x12:
|
||||
m_maria_palette[4][2] = data;
|
||||
break;
|
||||
case 0x13:
|
||||
m_maria_palette[4][3] = data;
|
||||
case 0x10: // DPPL
|
||||
m_maria_dpp = (m_maria_dpp & 0xff00) | data;
|
||||
break;
|
||||
case 0x14:
|
||||
m_maria_charbase = (data << 8);
|
||||
break;
|
||||
case 0x15:
|
||||
m_maria_palette[5][1] = data;
|
||||
break;
|
||||
case 0x16:
|
||||
m_maria_palette[5][2] = data;
|
||||
break;
|
||||
case 0x17:
|
||||
m_maria_palette[5][3] = data;
|
||||
break;
|
||||
|
||||
case 0x19:
|
||||
m_maria_palette[6][1] = data;
|
||||
break;
|
||||
case 0x1A:
|
||||
m_maria_palette[6][2] = data;
|
||||
break;
|
||||
case 0x1B:
|
||||
m_maria_palette[6][3] = data;
|
||||
break;
|
||||
|
||||
case 0x1C:
|
||||
/*logerror("MARIA CTRL=%x\n",data);*/
|
||||
m_maria_color_kill = data & 0x80;
|
||||
if ((data & 0x60) == 0x40)
|
||||
switch ((data >> 5) & 3)
|
||||
{
|
||||
case 0x00: case 01:
|
||||
logerror("dma test mode, do not use.\n");
|
||||
break;
|
||||
case 0x02:
|
||||
m_maria_dmaon = 1;
|
||||
else
|
||||
m_maria_dmaon = m_maria_dodma = 0;
|
||||
|
||||
break;
|
||||
case 0x03:
|
||||
m_maria_dmaon = 0;
|
||||
break;
|
||||
}
|
||||
m_maria_cwidth = data & 0x10;
|
||||
m_maria_bcntl = data & 0x08;
|
||||
m_maria_bcntl = data & 0x08; // Currently unimplemented as we don't display the border
|
||||
m_maria_kangaroo = data & 0x04;
|
||||
m_maria_rm = data & 0x03;
|
||||
|
||||
@ -561,15 +452,5 @@ WRITE8_MEMBER(a7800_state::a7800_MARIA_w)
|
||||
m_maria_rm );*/
|
||||
|
||||
break;
|
||||
case 0x1D:
|
||||
m_maria_palette[7][1] = data;
|
||||
break;
|
||||
case 0x1E:
|
||||
m_maria_palette[7][2] = data;
|
||||
break;
|
||||
case 0x1F:
|
||||
m_maria_palette[7][3] = data;
|
||||
break;
|
||||
}
|
||||
ROM[ 0x20 + offset ] = data;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user