summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author Ville Linde <villelin@mamedev.org>2012-07-27 20:28:59 +0000
committer Ville Linde <villelin@mamedev.org>2012-07-27 20:28:59 +0000
commit8f10a9db3bb19fe4d2ce23d6111b5a9c2538120d (patch)
tree0e9773dd09bea06222f1898de1466291236530c4 /src
parentc7fb3818c701bcb35f194fb23664f9391dac480c (diff)
cobra.c: Fixed hard disk access. General cleanup.
Diffstat (limited to 'src')
-rw-r--r--src/mame/drivers/cobra.c281
1 files changed, 167 insertions, 114 deletions
diff --git a/src/mame/drivers/cobra.c b/src/mame/drivers/cobra.c
index 6d94f4030c2..39186b8219a 100644
--- a/src/mame/drivers/cobra.c
+++ b/src/mame/drivers/cobra.c
@@ -60,8 +60,10 @@ public:
DECLARE_WRITE32_MEMBER(sub_config_w);
DECLARE_READ32_MEMBER(sub_mainbd_r);
DECLARE_WRITE32_MEMBER(sub_mainbd_w);
- DECLARE_READ32_MEMBER(sub_ata_r);
- DECLARE_WRITE32_MEMBER(sub_ata_w);
+ DECLARE_READ32_MEMBER(sub_ata0_r);
+ DECLARE_WRITE32_MEMBER(sub_ata0_w);
+ DECLARE_READ32_MEMBER(sub_ata1_r);
+ DECLARE_WRITE32_MEMBER(sub_ata1_w);
DECLARE_READ32_MEMBER(sub_psac2_r);
DECLARE_WRITE64_MEMBER(gfx_fifo0_w);
@@ -73,6 +75,10 @@ public:
DECLARE_READ64_MEMBER(gfx_fifo_r);
DECLARE_WRITE64_MEMBER(gfx_buf_w);
+ int m2sfifo_unk_flag;
+ int s2mfifo_unk_flag;
+
+
UINT32 *m_comram[2];
int m_comram_page;
@@ -94,6 +100,22 @@ public:
UINT32 m_sub_psac_reg;
int m_sub_psac_count;
+ UINT32 m_sub_interrupt;
+
+ UINT8 m_gfx_unk_flag;
+ UINT8 *m_gfx_gram;
+ UINT32 m_gfx_re_command_word1;
+ UINT32 m_gfx_re_command_word2;
+ int m_gfx_re_word_count;
+ int m_gfx_re_status;
+
+ int m_gfx_register_select;
+ UINT64 m_gfx_register[0x3000];
+ UINT64 m_gfx_fifo_mem[4];
+ int m_gfx_fifo_cache_addr;
+ int m_gfx_fifo_loopback;
+ int m_gfx_unknown_v1;
+ int m_gfx_status_byte;
};
#if 0
@@ -243,8 +265,6 @@ SCREEN_UPDATE_RGB32( cobra )
/*****************************************************************************/
-static UINT8 gfx_unk_flag;
-
static int decode_debug_state_value(int v)
{
switch (v)
@@ -525,9 +545,6 @@ static void fifo_flush(int id)
#if ENABLE_MAIN_CPU
-static int m2sfifo_unk_flag = 0;
-static int s2mfifo_unk_flag = 0;
-
static UINT32 mpc106_regs[256/4];
static UINT32 mpc106_pci_r(device_t *busdevice, device_t *device, int function, int reg, UINT32 mem_mask)
{
@@ -648,7 +665,7 @@ READ64_MEMBER(cobra_state::main_fifo_r)
value |= m2sfifo_unk_flag ? 0x8 : 0x0;
- value |= (gfx_unk_flag & 0x80) ? 0x00 : 0x04;
+ value |= (m_gfx_unk_flag & 0x80) ? 0x00 : 0x04;
r |= (UINT64)(value) << 32;
}
@@ -776,8 +793,6 @@ ADDRESS_MAP_END
#if ENABLE_SUB_CPU
-static UINT8 sub_interrupt = 0xff;
-
//static int ucount = 0;
READ32_MEMBER(cobra_state::sub_unk1_r)
@@ -957,7 +972,7 @@ READ32_MEMBER(cobra_state::sub_config_r)
}
if (ACCESSING_BITS_0_7)
{
- r |= sub_interrupt;
+ r |= m_sub_interrupt;
}
return r;
@@ -968,7 +983,7 @@ WRITE32_MEMBER(cobra_state::sub_config_w)
}
-READ32_MEMBER(cobra_state::sub_ata_r)
+READ32_MEMBER(cobra_state::sub_ata0_r)
{
device_t *device = machine().device("ide");
UINT32 r = 0;
@@ -987,16 +1002,54 @@ READ32_MEMBER(cobra_state::sub_ata_r)
return r;
}
-WRITE32_MEMBER(cobra_state::sub_ata_w)
+WRITE32_MEMBER(cobra_state::sub_ata0_w)
{
device_t *device = machine().device("ide");
+
if (ACCESSING_BITS_16_31)
{
- ide_bus_w(device, 0, (offset << 1) + 0, (UINT16)(data >> 24));
+ UINT16 d = ((data >> 24) & 0xff) | ((data >> 8) & 0xff00);
+ ide_bus_w(device, 0, (offset << 1) + 0, d);
}
if (ACCESSING_BITS_0_15)
{
- ide_bus_w(device, 0, (offset << 1) + 1, (UINT16)(data >> 8));
+ UINT16 d = ((data >> 8) & 0xff) | ((data << 8) & 0xff00);
+ ide_bus_w(device, 0, (offset << 1) + 1, d);
+ }
+}
+
+READ32_MEMBER(cobra_state::sub_ata1_r)
+{
+ device_t *device = machine().device("ide");
+ UINT32 r = 0;
+
+ if (ACCESSING_BITS_16_31)
+ {
+ UINT16 v = ide_bus_r(device, 1, (offset << 1) + 0);
+ r |= ((v << 8) | (v >> 8)) << 16;
+ }
+ if (ACCESSING_BITS_0_15)
+ {
+ UINT16 v = ide_bus_r(device, 1, (offset << 1) + 1);
+ r |= ((v << 8) | (v >> 8)) << 0;
+ }
+
+ return r;
+}
+
+WRITE32_MEMBER(cobra_state::sub_ata1_w)
+{
+ device_t *device = machine().device("ide");
+
+ if (ACCESSING_BITS_16_31)
+ {
+ UINT16 d = ((data >> 24) & 0xff) | ((data >> 8) & 0xff00);
+ ide_bus_w(device, 0, (offset << 1) + 0, d);
+ }
+ if (ACCESSING_BITS_0_15)
+ {
+ UINT16 d = ((data >> 8) & 0xff) | ((data << 8) & 0xff00);
+ ide_bus_w(device, 0, (offset << 1) + 1, d);
}
}
@@ -1061,7 +1114,8 @@ static ADDRESS_MAP_START( cobra_sub_map, AS_PROGRAM, 32, cobra_state )
AM_RANGE(0x00000000, 0x003fffff) AM_MIRROR(0x80000000) AM_RAM
AM_RANGE(0x70000000, 0x7003ffff) AM_MIRROR(0x80000000) AM_READWRITE(sub_comram_r, sub_comram_w)
AM_RANGE(0x78040000, 0x7804ffff) AM_MIRROR(0x80000000) AM_READWRITE(sub_sound_r, sub_sound_w)
- AM_RANGE(0x78080000, 0x7808000f) AM_MIRROR(0x80000000) AM_READWRITE(sub_ata_r, sub_ata_w)
+ AM_RANGE(0x78080000, 0x7808000f) AM_MIRROR(0x80000000) AM_READWRITE(sub_ata0_r, sub_ata0_w)
+ AM_RANGE(0x780c0010, 0x780c001f) AM_MIRROR(0x80000000) AM_READWRITE(sub_ata1_r, sub_ata1_w)
AM_RANGE(0x78300000, 0x7830000f) AM_MIRROR(0x80000000) AM_READ(sub_psac2_r) // PSAC
AM_RANGE(0x7e000000, 0x7e000003) AM_MIRROR(0x80000000) AM_WRITE(sub_debug_w)
AM_RANGE(0x7e180000, 0x7e180003) AM_MIRROR(0x80000000) AM_READWRITE(sub_unk1_r, sub_unk1_w)
@@ -1106,26 +1160,9 @@ ADDRESS_MAP_END
#if ENABLE_GFX_CPU
-static int gfx_fifo_loopback = 0;
-//static UINT32 gfx_unk_reg[512];
-
-static UINT8 *gfx_gram;
-
-static UINT64 gfx_fifo_mem[4];
-static int gfx_fifo_cache_addr = 0;
-
-static int gfx_register_select = 0;
-static UINT64 gfx_register[0x3000];
-
-
#define RE_STATUS_IDLE 0
#define RE_STATUS_COMMAND 1
-static int gfx_re_status = RE_STATUS_IDLE;
-static int gfx_re_command_word1;
-static int gfx_re_command_word2;
-static int gfx_re_word_count;
-
static void push_poly(cobra_state *cobra, poly_vertex *v1, poly_vertex *v2, poly_vertex *v3)
{
memcpy(&cobra->polybuffer[cobra->polybuffer_ptr].v[0], v1, sizeof(poly_vertex));
@@ -1153,15 +1190,20 @@ static void push_line(cobra_state *cobra, poly_vertex *v1, poly_vertex *v2)
}
}
-static void cobra_gfx_init(running_machine *machine)
+static void cobra_gfx_init(cobra_state *cobra)
{
//gfx_gram = auto_malloc(0x100000);
- gfx_gram = auto_alloc_array(*machine, UINT8, 0x100000);
+ cobra->m_gfx_gram = auto_alloc_array(cobra->machine(), UINT8, 0x100000);
+}
+
+static void cobra_gfx_reset(cobra_state *cobra)
+{
+ cobra->m_gfx_re_status = RE_STATUS_IDLE;
}
static void gfx_fifo_exec(cobra_state *cobra)
{
- if (gfx_fifo_loopback != 0)
+ if (cobra->m_gfx_fifo_loopback != 0)
return;
while (fifo_current_num(GFXFIFO_IN) >= 2)
@@ -1169,23 +1211,23 @@ static void gfx_fifo_exec(cobra_state *cobra)
UINT64 in1, in2 = 0;
UINT32 w1, w2;
- if (gfx_re_status == RE_STATUS_IDLE)
+ if (cobra->m_gfx_re_status == RE_STATUS_IDLE)
{
fifo_pop(NULL, GFXFIFO_IN, &in1);
fifo_pop(NULL, GFXFIFO_IN, &in2);
w1 = (UINT32)(in1);
w2 = (UINT32)(in2);
- gfx_re_command_word1 = w1;
- gfx_re_command_word2 = w2;
- gfx_re_word_count = 0;
+ cobra->m_gfx_re_command_word1 = w1;
+ cobra->m_gfx_re_command_word2 = w2;
+ cobra->m_gfx_re_word_count = 0;
- gfx_re_status = RE_STATUS_COMMAND;
+ cobra->m_gfx_re_status = RE_STATUS_COMMAND;
}
else
{
- w1 = gfx_re_command_word1;
- w2 = gfx_re_command_word2;
+ w1 = cobra->m_gfx_re_command_word1;
+ w2 = cobra->m_gfx_re_command_word2;
}
// fifo_pop(GFXFIFO_IN, &in1);
@@ -1228,17 +1270,17 @@ static void gfx_fifo_exec(cobra_state *cobra)
if (w2 == 0x10500010)
{
// GFX register select?
- gfx_register_select = w[3]; // word 3 is the only non-zero so far...
+ cobra->m_gfx_register_select = w[3]; // word 3 is the only non-zero so far...
- printf("GFX: register select %04X\n", gfx_register_select);
+ printf("GFX: register select %04X\n", cobra->m_gfx_register_select);
}
else if (w2 == 0x10500018)
{
// register write to the register selected above?
// 64-bit registers, top 32-bits in word 2, low 32-bit in word 3
- printf("GFX: register write %04X: %08X %08X\n", gfx_register_select, w[2], w[3]);
+ printf("GFX: register write %04X: %08X %08X\n", cobra->m_gfx_register_select, w[2], w[3]);
- gfx_register[gfx_register_select] = ((UINT64)(w[2]) << 32) | w[3];
+ cobra->m_gfx_register[cobra->m_gfx_register_select] = ((UINT64)(w[2]) << 32) | w[3];
}
else if (w2 == 0x10521000)
{
@@ -1250,7 +1292,7 @@ static void gfx_fifo_exec(cobra_state *cobra)
logerror("gfxfifo_exec: unknown %08X %08X\n", w1, w2);
}
- gfx_re_status = RE_STATUS_IDLE;
+ cobra->m_gfx_re_status = RE_STATUS_IDLE;
break;
}
case 0x0f:
@@ -1288,7 +1330,7 @@ static void gfx_fifo_exec(cobra_state *cobra)
fifo_push(NULL, GFXFIFO_OUT, in4);
}
- gfx_re_status = RE_STATUS_IDLE;
+ cobra->m_gfx_re_status = RE_STATUS_IDLE;
break;
}
case 0x80:
@@ -1303,17 +1345,17 @@ static void gfx_fifo_exec(cobra_state *cobra)
int reg = (w1 >> 8) & 0xfffff;
- gfx_gram[reg + 0] = (w2 >> 24) & 0xff;
- gfx_gram[reg + 1] = (w2 >> 16) & 0xff;
- gfx_gram[reg + 2] = (w2 >> 8) & 0xff;
- gfx_gram[reg + 3] = (w2 >> 0) & 0xff;
+ cobra->m_gfx_gram[reg + 0] = (w2 >> 24) & 0xff;
+ cobra->m_gfx_gram[reg + 1] = (w2 >> 16) & 0xff;
+ cobra->m_gfx_gram[reg + 2] = (w2 >> 8) & 0xff;
+ cobra->m_gfx_gram[reg + 3] = (w2 >> 0) & 0xff;
if (reg != 0x118 && reg != 0x114 && reg != 0x11c)
{
printf("gfxfifo_exec: ram write %05X: %08X\n", reg, w2);
}
- gfx_re_status = RE_STATUS_IDLE;
+ cobra->m_gfx_re_status = RE_STATUS_IDLE;
break;
}
@@ -1322,7 +1364,7 @@ static void gfx_fifo_exec(cobra_state *cobra)
{
printf("gfxfifo_exec: unhandled %08X %08X\n", w1, w2);
- gfx_re_status = RE_STATUS_IDLE;
+ cobra->m_gfx_re_status = RE_STATUS_IDLE;
break;
}
@@ -1518,7 +1560,7 @@ static void gfx_fifo_exec(cobra_state *cobra)
}
}
- gfx_re_status = RE_STATUS_IDLE;
+ cobra->m_gfx_re_status = RE_STATUS_IDLE;
break;
}
@@ -1565,7 +1607,7 @@ static void gfx_fifo_exec(cobra_state *cobra)
}
//printf("\n");
- gfx_re_status = RE_STATUS_IDLE;
+ cobra->m_gfx_re_status = RE_STATUS_IDLE;
break;
}
@@ -1584,7 +1626,7 @@ static void gfx_fifo_exec(cobra_state *cobra)
fifo_push(NULL, GFXFIFO_OUT, 0);
fifo_push(NULL, GFXFIFO_OUT, 0);
- gfx_re_status = RE_STATUS_IDLE;
+ cobra->m_gfx_re_status = RE_STATUS_IDLE;
break;
}
@@ -1597,7 +1639,7 @@ static void gfx_fifo_exec(cobra_state *cobra)
logerror("gfxfifo_exec: buf_flush: %08X %08X\n", w1, w2);
}
- gfx_re_status = RE_STATUS_IDLE;
+ cobra->m_gfx_re_status = RE_STATUS_IDLE;
break;
}
case 0xb0:
@@ -1638,13 +1680,13 @@ static void gfx_fifo_exec(cobra_state *cobra)
UINT64 value = 0;
fifo_pop(NULL, GFXFIFO_IN, &value);
- gfx_gram[reg + (i*4) + 0] = (value >> 24) & 0xff;
- gfx_gram[reg + (i*4) + 1] = (value >> 16) & 0xff;
- gfx_gram[reg + (i*4) + 2] = (value >> 8) & 0xff;
- gfx_gram[reg + (i*4) + 3] = (value >> 0) & 0xff;
+ cobra->m_gfx_gram[reg + (i*4) + 0] = (value >> 24) & 0xff;
+ cobra->m_gfx_gram[reg + (i*4) + 1] = (value >> 16) & 0xff;
+ cobra->m_gfx_gram[reg + (i*4) + 2] = (value >> 8) & 0xff;
+ cobra->m_gfx_gram[reg + (i*4) + 3] = (value >> 0) & 0xff;
}
- gfx_re_status = RE_STATUS_IDLE;
+ cobra->m_gfx_re_status = RE_STATUS_IDLE;
break;
}
case 0xc0:
@@ -1677,14 +1719,14 @@ static void gfx_fifo_exec(cobra_state *cobra)
int reg = (w1 >> 8) & 0xfffff;
UINT32 ret = 0;
- ret |= gfx_gram[reg + 0] << 24;
- ret |= gfx_gram[reg + 1] << 16;
- ret |= gfx_gram[reg + 2] << 8;
- ret |= gfx_gram[reg + 3] << 0;
+ ret |= cobra->m_gfx_gram[reg + 0] << 24;
+ ret |= cobra->m_gfx_gram[reg + 1] << 16;
+ ret |= cobra->m_gfx_gram[reg + 2] << 8;
+ ret |= cobra->m_gfx_gram[reg + 3] << 0;
fifo_push(NULL, GFXFIFO_OUT, ret);
- gfx_re_status = RE_STATUS_IDLE;
+ cobra->m_gfx_re_status = RE_STATUS_IDLE;
break;
}
case 0xd0:
@@ -1721,15 +1763,15 @@ static void gfx_fifo_exec(cobra_state *cobra)
{
UINT32 value = 0;
- value |= gfx_gram[reg + (i*4) + 0] << 24;
- value |= gfx_gram[reg + (i*4) + 1] << 16;
- value |= gfx_gram[reg + (i*4) + 2] << 8;
- value |= gfx_gram[reg + (i*4) + 3] << 0;
+ value |= cobra->m_gfx_gram[reg + (i*4) + 0] << 24;
+ value |= cobra->m_gfx_gram[reg + (i*4) + 1] << 16;
+ value |= cobra->m_gfx_gram[reg + (i*4) + 2] << 8;
+ value |= cobra->m_gfx_gram[reg + (i*4) + 3] << 0;
fifo_push(NULL, GFXFIFO_OUT, value);
}
- gfx_re_status = RE_STATUS_IDLE;
+ cobra->m_gfx_re_status = RE_STATUS_IDLE;
break;
}
case 0xed:
@@ -1742,8 +1784,8 @@ static void gfx_fifo_exec(cobra_state *cobra)
int c = 0;
int i;
- int num_left = num - gfx_re_word_count;
- int start = gfx_re_word_count;
+ int num_left = num - cobra->m_gfx_re_word_count;
+ int start = cobra->m_gfx_re_word_count;
if (fifo_current_num(GFXFIFO_IN) < num_left)
{
@@ -1753,12 +1795,12 @@ static void gfx_fifo_exec(cobra_state *cobra)
if (num >= 0x100000)
{
- printf("gfxfifo_exec: tex_ints %d words left\n", num-gfx_re_word_count);
+ printf("gfxfifo_exec: tex_ints %d words left\n", num-cobra->m_gfx_re_word_count);
for (i=0; i < num_left; i++)
{
UINT64 param;
fifo_pop(NULL, GFXFIFO_IN, &param);
- gfx_re_word_count++;
+ cobra->m_gfx_re_word_count++;
}
}
else
@@ -1769,7 +1811,7 @@ static void gfx_fifo_exec(cobra_state *cobra)
{
UINT64 param = 0;
fifo_pop(NULL, GFXFIFO_IN, &param);
- gfx_re_word_count++;
+ cobra->m_gfx_re_word_count++;
gfx_texture[start+i] = (UINT32)(param);
@@ -1788,9 +1830,9 @@ static void gfx_fifo_exec(cobra_state *cobra)
printf("\n");
}
- if (gfx_re_word_count >= num)
+ if (cobra->m_gfx_re_word_count >= num)
{
- gfx_re_status = RE_STATUS_IDLE;
+ cobra->m_gfx_re_status = RE_STATUS_IDLE;
}
break;
}
@@ -1862,25 +1904,22 @@ READ64_MEMBER(cobra_state::gfx_fifo_r)
WRITE64_MEMBER(cobra_state::gfx_fifo0_w)
{
- gfx_fifo_cache_addr = 2;
- COMBINE_DATA(gfx_fifo_mem + offset);
+ m_gfx_fifo_cache_addr = 2;
+ COMBINE_DATA(m_gfx_fifo_mem + offset);
}
WRITE64_MEMBER(cobra_state::gfx_fifo1_w)
{
- gfx_fifo_cache_addr = 0;
- COMBINE_DATA(gfx_fifo_mem + offset);
+ m_gfx_fifo_cache_addr = 0;
+ COMBINE_DATA(m_gfx_fifo_mem + offset);
}
WRITE64_MEMBER(cobra_state::gfx_fifo2_w)
{
- gfx_fifo_cache_addr = 1;
- COMBINE_DATA(gfx_fifo_mem + offset);
+ m_gfx_fifo_cache_addr = 1;
+ COMBINE_DATA(m_gfx_fifo_mem + offset);
}
-static int gfx_unknown_v1 = 0;
-static int gfx_status_byte = 0;
-
READ64_MEMBER(cobra_state::gfx_unk1_r)
{
UINT64 r = 0;
@@ -1895,8 +1934,8 @@ READ64_MEMBER(cobra_state::gfx_unk1_r)
// the low 2 bits are vblank flags
// bit 3 (0x8) may be graphics engine idle flag
- v |= gfx_status_byte;
- gfx_status_byte ^= 1;
+ v |= m_gfx_status_byte;
+ m_gfx_status_byte ^= 1;
r |= v << 56;
}
@@ -1908,7 +1947,7 @@ READ64_MEMBER(cobra_state::gfx_unk1_r)
}
if (ACCESSING_BITS_24_31) // this register returns FIFO number during check_fifo (see below)
{
- r |= (gfx_unknown_v1 & 3) << 24;
+ r |= (m_gfx_unknown_v1 & 3) << 24;
}
return r;
@@ -1922,7 +1961,7 @@ WRITE64_MEMBER(cobra_state::gfx_unk1_w)
{
if ((data >> 63) & 1)
{
- gfx_fifo_loopback = 0;
+ m_gfx_fifo_loopback = 0;
}
}
@@ -1935,8 +1974,8 @@ WRITE64_MEMBER(cobra_state::gfx_unk1_w)
if (value == 0xc0)
{
fifo_pop(&space.device(), GFXFIFO_IN, &in1);
- fifo_pop(&space.device(), GFXFIFO_IN, &in2);
- gfx_unknown_v1 = (UINT32)(in1 >> 32); // FIFO number is read back from this same register
+ fifo_pop(&space.device(), GFXFIFO_IN, &in2);
+ m_gfx_unknown_v1 = (UINT32)(in1 >> 32); // FIFO number is read back from this same register
fifo_push(&space.device(), GFXFIFO_OUT, in1 & 0xffffffff);
fifo_push(&space.device(), GFXFIFO_OUT, in2 & 0xffffffff);
@@ -1944,7 +1983,7 @@ WRITE64_MEMBER(cobra_state::gfx_unk1_w)
else if (value == 0x80)
{
// used in check_fifo() before the fifo test...
- gfx_fifo_loopback = 1;
+ m_gfx_fifo_loopback = 1;
}
else
{
@@ -1972,8 +2011,8 @@ WRITE64_MEMBER(cobra_state::gfx_buf_w)
// reads back the register selected by gfx register select
- fifo_push(&space.device(), GFXFIFO_OUT, (UINT32)((gfx_register[gfx_register_select] >> 32)));
- fifo_push(&space.device(), GFXFIFO_OUT, (UINT32)(gfx_register[gfx_register_select]));
+ fifo_push(&space.device(), GFXFIFO_OUT, (UINT32)((m_gfx_register[m_gfx_register_select] >> 32)));
+ fifo_push(&space.device(), GFXFIFO_OUT, (UINT32)(m_gfx_register[m_gfx_register_select]));
}
else if (data == U64(0x00a0000110520800))
{
@@ -1998,16 +2037,16 @@ static void gfx_cpu_dc_store(device_t *device, UINT32 address)
if (address == 0x10000000 || address == 0x18000000 || address == 0x1e000000)
{
- UINT64 i = (UINT64)(gfx_fifo_cache_addr) << 32;
+ UINT64 i = (UINT64)(cobra->m_gfx_fifo_cache_addr) << 32;
- fifo_push(device, GFXFIFO_IN, (UINT32)(gfx_fifo_mem[0] >> 32) | i);
- fifo_push(device, GFXFIFO_IN, (UINT32)(gfx_fifo_mem[0] >> 0) | i);
- fifo_push(device, GFXFIFO_IN, (UINT32)(gfx_fifo_mem[1] >> 32) | i);
- fifo_push(device, GFXFIFO_IN, (UINT32)(gfx_fifo_mem[1] >> 0) | i);
- fifo_push(device, GFXFIFO_IN, (UINT32)(gfx_fifo_mem[2] >> 32) | i);
- fifo_push(device, GFXFIFO_IN, (UINT32)(gfx_fifo_mem[2] >> 0) | i);
- fifo_push(device, GFXFIFO_IN, (UINT32)(gfx_fifo_mem[3] >> 32) | i);
- fifo_push(device, GFXFIFO_IN, (UINT32)(gfx_fifo_mem[3] >> 0) | i);
+ fifo_push(device, GFXFIFO_IN, (UINT32)(cobra->m_gfx_fifo_mem[0] >> 32) | i);
+ fifo_push(device, GFXFIFO_IN, (UINT32)(cobra->m_gfx_fifo_mem[0] >> 0) | i);
+ fifo_push(device, GFXFIFO_IN, (UINT32)(cobra->m_gfx_fifo_mem[1] >> 32) | i);
+ fifo_push(device, GFXFIFO_IN, (UINT32)(cobra->m_gfx_fifo_mem[1] >> 0) | i);
+ fifo_push(device, GFXFIFO_IN, (UINT32)(cobra->m_gfx_fifo_mem[2] >> 32) | i);
+ fifo_push(device, GFXFIFO_IN, (UINT32)(cobra->m_gfx_fifo_mem[2] >> 0) | i);
+ fifo_push(device, GFXFIFO_IN, (UINT32)(cobra->m_gfx_fifo_mem[3] >> 32) | i);
+ fifo_push(device, GFXFIFO_IN, (UINT32)(cobra->m_gfx_fifo_mem[3] >> 0) | i);
gfx_fifo_exec(cobra);
}
@@ -2021,7 +2060,7 @@ WRITE64_MEMBER(cobra_state::gfx_debug_state_w)
{
if (ACCESSING_BITS_40_47)
{
- gfx_unk_flag = (UINT8)(data >> 40);
+ m_gfx_unk_flag = (UINT8)(data >> 40);
}
if (ACCESSING_BITS_56_63)
@@ -2102,15 +2141,17 @@ static powerpc_config gfx_ppc_cfg =
#endif
-static void ide_interrupt(int state)
+static void ide_interrupt(device_t *device, int state)
{
- if (state)
+ cobra_state *cobra = device->machine().driver_data<cobra_state>();
+
+ if (state == CLEAR_LINE)
{
- sub_interrupt &= ~0x80;
+ cobra->m_sub_interrupt |= 0x80;
}
else
{
- sub_interrupt |= 0x80;
+ cobra->m_sub_interrupt &= ~0x80;
}
}
@@ -2126,6 +2167,18 @@ static MACHINE_RESET( cobra )
cobra_state *cobra = machine.driver_data<cobra_state>();
cobra->polybuffer_ptr = 0;
+
+ cobra->m_sub_interrupt = 0xff;
+
+ UINT8 *ide_features = ide_get_features(machine.device("ide"), 0);
+
+ // Cobra expects these settings or the BIOS fails
+ ide_features[51*2+0] = 0; /* 51: PIO data transfer cycle timing mode */
+ ide_features[51*2+1] = 2;
+ ide_features[67*2+0] = 0xe0; /* 67: minimum PIO transfer cycle time without flow control */
+ ide_features[67*2+1] = 0x01;
+
+ cobra_gfx_reset(cobra);
}
static MACHINE_CONFIG_START( cobra, cobra_state )
@@ -2193,7 +2246,7 @@ static DRIVER_INIT(cobra)
#if ENABLE_GFX_CPU
ppc_set_dcstore_callback(cobra->m_gfxcpu, gfx_cpu_dc_store);
- cobra_gfx_init(&machine);
+ cobra_gfx_init(cobra);
#endif
cobra->m_comram[0] = auto_alloc_array(machine, UINT32, 0x40000/4);