Fixed COP420 instructions JSRP, LBI, LQID, and SKT. Draco now has sound.

This commit is contained in:
Curt Coder 2008-05-22 15:16:06 +00:00
parent 8452d1d622
commit 9962c0f826
4 changed files with 27 additions and 29 deletions

View File

@ -403,7 +403,7 @@ INSTRUCTION(jp)
{
// JSRP
UINT8 a = opcode & 0x3f;
PUSH(PC + 1);
PUSH(PC);
PC = 0x80 | a;
}
}
@ -530,7 +530,7 @@ INSTRUCTION(ld)
INSTRUCTION(lqid)
{
PUSH(PC + 1);
PUSH(PC);
PC = (PC & 0x300) | (A << 4) | RAM_R(B);
WRITE_Q(ROM(PC));
POP();

View File

@ -13,8 +13,11 @@
TODO:
- fix XAS
- run interrupt test suite
- run production test suite
- fix INIL
- remove LBIops
- INIL
*/
@ -118,12 +121,12 @@ static void cop420_op23(UINT8 opcode)
static const s_opcode opcode_33_map[256]=
{
{1, inil },{1, skgbz0 },{1, illegal },{1, skgbz2 },{1, illegal },{1, illegal },{1, illegal },{1, illegal },
{1, illegal },{1, skgbz0 },{1, illegal },{1, skgbz2 },{1, illegal },{1, illegal },{1, illegal },{1, illegal },
{1, illegal },{1, illegal },{1, illegal },{1, illegal },{1, illegal },{1, illegal },{1, illegal },{1, illegal },
{1, illegal },{1, skgbz1 },{1, illegal },{1, skgbz3 },{1, illegal },{1, illegal },{1, illegal },{1, illegal },
{1, illegal },{1, illegal },{1, illegal },{1, illegal },{1, illegal },{1, illegal },{1, illegal },{1, illegal },
{1, illegal },{1, skgz },{1, illegal },{1, illegal },{1, illegal },{1, illegal },{1, illegal },{1, illegal },
{1, inin },{1, illegal },{1, ing },{1, illegal },{1, cqma },{1, illegal },{1, inl },{1, illegal },
{1, inin },{1, inil },{1, ing },{1, illegal },{1, cqma },{1, illegal },{1, inl },{1, illegal },
{1, illegal },{1, illegal },{1, illegal },{1, illegal },{1, illegal },{1, illegal },{1, illegal },{1, illegal },
{1, illegal },{1, illegal },{1, omg },{1, illegal },{1, camq },{1, illegal },{1, obd },{1, illegal },
@ -136,14 +139,14 @@ static const s_opcode opcode_33_map[256]=
{1, illegal },{1, illegal },{1, illegal },{1, illegal },{1, illegal },{1, illegal },{1, illegal },{1, illegal },
{1, illegal },{1, illegal },{1, illegal },{1, illegal },{1, illegal },{1, illegal },{1, illegal },{1, illegal },
{1, illegal },{1, lbi },{1, lbi },{1, lbi },{1, lbi },{1, lbi },{1, lbi },{1, lbi },
{1, lbi },{1, illegal },{1, illegal },{1, illegal },{1, illegal },{1, illegal },{1, illegal },{1, illegal },
{1, illegal },{1, lbi },{1, lbi },{1, lbi },{1, lbi },{1, lbi },{1, lbi },{1, lbi },
{1, lbi },{1, illegal },{1, illegal },{1, illegal },{1, illegal },{1, illegal },{1, illegal },{1, illegal },
{1, illegal },{1, lbi },{1, lbi },{1, lbi },{1, lbi },{1, lbi },{1, lbi },{1, lbi },
{1, lbi },{1, illegal },{1, illegal },{1, illegal },{1, illegal },{1, illegal },{1, illegal },{1, illegal },
{1, illegal },{1, lbi },{1, lbi },{1, lbi },{1, lbi },{1, lbi },{1, lbi },{1, lbi },
{1, lbi },{1, illegal },{1, illegal },{1, illegal },{1, illegal },{1, illegal },{1, illegal },{1, illegal },
{1, lbi },{1, lbi },{1, lbi },{1, lbi },{1, lbi },{1, lbi },{1, lbi },{1, lbi },
{1, lbi },{1, lbi },{1, lbi },{1, lbi },{1, lbi },{1, lbi },{1, lbi },{1, lbi },
{1, lbi },{1, lbi },{1, lbi },{1, lbi },{1, lbi },{1, lbi },{1, lbi },{1, lbi },
{1, lbi },{1, lbi },{1, lbi },{1, lbi },{1, lbi },{1, lbi },{1, lbi },{1, lbi },
{1, lbi },{1, lbi },{1, lbi },{1, lbi },{1, lbi },{1, lbi },{1, lbi },{1, lbi },
{1, lbi },{1, lbi },{1, lbi },{1, lbi },{1, lbi },{1, lbi },{1, lbi },{1, lbi },
{1, lbi },{1, lbi },{1, lbi },{1, lbi },{1, lbi },{1, lbi },{1, lbi },{1, lbi },
{1, lbi },{1, lbi },{1, lbi },{1, lbi },{1, lbi },{1, lbi },{1, lbi },{1, lbi },
{1, illegal },{1, illegal },{1, illegal },{1, illegal },{1, illegal },{1, illegal },{1, illegal },{1, illegal },
{1, illegal },{1, illegal },{1, illegal },{1, illegal },{1, illegal },{1, illegal },{1, illegal },{1, illegal },
@ -247,7 +250,7 @@ static void cop420_init(int index, int clock, const void *config, int (*irqcallb
timer_adjust_periodic(cop420_serial_timer, attotime_zero, index, ATTOTIME_IN_HZ(clock));
cop420_counter_timer = timer_alloc(cop420_counter_tick, NULL);
timer_adjust_periodic(cop420_counter_timer, attotime_zero, index, ATTOTIME_IN_HZ(clock / 1024));
timer_adjust_periodic(cop420_counter_timer, attotime_zero, index, ATTOTIME_IN_HZ(clock));
for (i=0; i<256; i++) InstLen[i]=1;
@ -262,10 +265,7 @@ static void cop420_init(int index, int clock, const void *config, int (*irqcallb
for (i=0x38; i<0x40; i++) LBIops[i] = 1;
for (i=0; i<256; i++) LBIops33[i] = 0;
for (i=0x81; i<0x89; i++) LBIops33[i] = 1;
for (i=0x91; i<0x99; i++) LBIops33[i] = 1;
for (i=0xa1; i<0xa9; i++) LBIops33[i] = 1;
for (i=0xb1; i<0xb9; i++) LBIops33[i] = 1;
for (i=0x80; i<0xc0; i++) LBIops33[i] = 1;
state_save_register_item("cop420", index, PC);
state_save_register_item("cop420", index, R.PREVPC);

View File

@ -216,19 +216,19 @@ offs_t cop420_dasm(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opr
{
sprintf(buffer, "LEI %u", next_opcode & 0xF);
}
else if (next_opcode >= 0x81 && next_opcode <= 0x88)
else if (next_opcode >= 0x80 && next_opcode <= 0x8F)
{
sprintf(buffer, "LBI 0,%u", next_opcode & 0xF);
}
else if (next_opcode >= 0x91 && next_opcode <= 0x98)
else if (next_opcode >= 0x90 && next_opcode <= 0x9F)
{
sprintf(buffer, "LBI 1,%u", next_opcode & 0xF);
}
else if (next_opcode >= 0xA1 && next_opcode <= 0xA8)
else if (next_opcode >= 0xA0 && next_opcode <= 0xAF)
{
sprintf(buffer, "LBI 2,%u", next_opcode & 0xF);
}
else if (next_opcode >= 0xB1 && next_opcode <= 0xB8)
else if (next_opcode >= 0xB0 && next_opcode <= 0xBF)
{
sprintf(buffer, "LBI 3,%u", next_opcode & 0xF);
}
@ -236,10 +236,6 @@ offs_t cop420_dasm(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opr
{
switch (next_opcode)
{
case 0x00:
sprintf(buffer, "INIL");
break;
case 0x01:
sprintf(buffer, "SKGBZ 0");
break;
@ -264,6 +260,10 @@ offs_t cop420_dasm(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opr
sprintf(buffer, "ININ");
break;
case 0x29:
sprintf(buffer, "INIL");
break;
case 0x2A:
sprintf(buffer, "ING");
break;

View File

@ -12,7 +12,6 @@
TODO:
- move set_cpu_mode timer call to MDRV
- fix COP420 core to get sound in Draco
*/
@ -708,7 +707,6 @@ static MACHINE_DRIVER_START( draco )
MDRV_SPEAKER_STANDARD_MONO("mono")
MDRV_SOUND_ADD(CDP1869, DRACO_CHR2)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
MDRV_SOUND_ADD(AY8910, DRACO_SND_CHR1)
MDRV_SOUND_CONFIG(ay8910_interface)
@ -764,4 +762,4 @@ ROM_END
GAME( 1980, destryer, 0, destryer, destryer, 0, ROT90, "Cidelsa", "Destroyer (Cidelsa) (set 1)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )
GAME( 1980, destryea, destryer, destryea, destryer, 0, ROT90, "Cidelsa", "Destroyer (Cidelsa) (set 2)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )
GAME( 1981, altair, 0, altair, altair, 0, ROT90, "Cidelsa", "Altair", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )
GAME( 1981, draco, 0, draco, draco, 0, ROT90, "Cidelsa", "Draco", GAME_IMPERFECT_COLORS | GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )
GAME( 1981, draco, 0, draco, draco, 0, ROT90, "Cidelsa", "Draco", GAME_IMPERFECT_COLORS | GAME_SUPPORTS_SAVE )