mirror of
https://github.com/holub/mame
synced 2025-04-20 23:42:22 +03:00
(nw) gamecom
- henry: fixed display of score in practice mode. - added some dasm of unk5A and unk5B
This commit is contained in:
parent
e023716ff2
commit
8e64fafd97
@ -80,7 +80,7 @@ const sm8500_disassembler::sm8500dasm sm8500_disassembler::mnemonic[256] = {
|
||||
/* 50 - 5F */
|
||||
{zCMP,AM_iR}, {zADD,AM_iR}, {zSUB,AM_iR}, {zADC,AM_iR},
|
||||
{zSBC,AM_iR}, {zAND,AM_iR}, {zOR,AM_iR}, {zXOR,AM_iR},
|
||||
{zMOV, AM_iR}, {zINVLD,0}, {z5A,AM_ii}, {z5B,AM_ii},
|
||||
{zMOV, AM_iR}, {zINVLD,0}, {z5A,AM_5A}, {z5B,AM_5B},
|
||||
{zDIV,AM_SS}, {zDIV,AM_iS}, {zMOVM,AM_RiR}, {zMOVM,AM_Rii},
|
||||
/* 60 - 6F */
|
||||
{zCMPW,AM_SS}, {zADDW,AM_SS}, {zSUBW,AM_SS}, {zADCW,AM_SS},
|
||||
@ -147,6 +147,7 @@ offs_t sm8500_disassembler::disassemble(std::ostream &stream, offs_t pc, const d
|
||||
int8_t offset;
|
||||
uint16_t ea;
|
||||
uint16_t ea2;
|
||||
uint16_t ea3;
|
||||
offs_t pos = pc;
|
||||
|
||||
op = opcodes.r8(pos++);
|
||||
@ -371,6 +372,32 @@ offs_t sm8500_disassembler::disassemble(std::ostream &stream, offs_t pc, const d
|
||||
ea += opcodes.r8(pos++);
|
||||
util::stream_format(stream, "$%04X", ea);
|
||||
break;
|
||||
case AM_5A:
|
||||
ea = opcodes.r8(pos++);
|
||||
ea2 = opcodes.r8(pos++);
|
||||
switch( ea & 0xC0 ) {
|
||||
case 0x00:
|
||||
util::stream_format(stream, "CMP (rr%02Xh),$%02Xh", ea & 7, ea2); break;
|
||||
case 0x40:
|
||||
util::stream_format(stream, "undef $%04X", ea); break;
|
||||
case 0x80:
|
||||
ea3 = opcodes.r8(pos++);
|
||||
util::stream_format(stream, "CMP (rr%02Xh+%02Xh),$%02Xh", ea & 7, ea2, ea3); break;
|
||||
case 0xC0:
|
||||
util::stream_format(stream, "undef $%04X", ea); break;
|
||||
}
|
||||
break;
|
||||
case AM_5B:
|
||||
ea = opcodes.r8(pos++);
|
||||
ea2 = opcodes.r8(pos++);
|
||||
ea3 = (ea << 8) | ea2;
|
||||
switch( ea & 0xC0 ) {
|
||||
case 0x40:
|
||||
util::stream_format(stream, "MOV (rr%02Xh)+,$%02Xh", ea & 7, ea2); break; // could be AND instead of MOV
|
||||
default:
|
||||
util::stream_format(stream, "undef $%04X", ea3); break;
|
||||
}
|
||||
break;
|
||||
case AM_ss:
|
||||
ea = opcodes.r8(pos++);
|
||||
switch( ea & 0xC0 ) {
|
||||
|
@ -49,7 +49,7 @@ private:
|
||||
AM_R=1, AM_rr, AM_r1, AM_S, AM_rmb, AM_mbr, AM_Ri, AM_rmw, AM_mwr, AM_smw, AM_mws,
|
||||
AM_Sw, AM_iR, AM_rbr, AM_riw, AM_cjp, AM_rib, AM_pi, AM_cbr, AM_i, AM_ii,
|
||||
AM_ss, AM_RR, AM_2, AM_SS, AM_bR, AM_Rbr, AM_Rb, AM_rR, AM_Rr, AM_Rii, AM_RiR,
|
||||
AM_riB, AM_iS, AM_CALS, AM_bid, AM_1A, AM_1B, AM_4F
|
||||
AM_riB, AM_iS, AM_CALS, AM_bid, AM_1A, AM_1B, AM_4F, AM_5A, AM_5B
|
||||
};
|
||||
|
||||
struct sm8500dasm
|
||||
|
@ -903,7 +903,7 @@ case 0x2C: /* EXTS Rr - 6 cycles - Flags affected: -------- */
|
||||
mycycles += 6;
|
||||
break;
|
||||
case 0x2D: /* unk2D - 4 cycles */
|
||||
logerror( "%04X: unk%02x\n", m_PC-1,op );
|
||||
logerror( "%04X: unk%02x, unhandled\n", m_PC-1,op );
|
||||
mycycles += 4;
|
||||
break;
|
||||
case 0x2E: /* MOV PS0,#00 - 4 cycles - Flags affected: -------- */
|
||||
@ -1054,7 +1054,7 @@ case 0x3C: /* MOVW RRr,RRs - 7 cycles - Flags affected: -------- */
|
||||
mycycles += 7;
|
||||
break;
|
||||
case 0x3D: /* unk3D DM??? 3D 0E -> DM R0Eh ?? - 4,4 cycles */
|
||||
logerror( "%04X: unk%02x\n", m_PC-1,op );
|
||||
logerror( "%04X: unk%02x, unhandled\n", m_PC-1,op );
|
||||
mycycles += 4;
|
||||
break;
|
||||
case 0x3E: /* JMP RRr/@ww/ww(RRr) - 7/15/19 cycles - Flags affected: -------- */
|
||||
@ -1151,9 +1151,11 @@ case 0x4C: /* MULT Rrr,Rs - 24 cycles - Flags affected: -Z-0---- */
|
||||
ARG_RR;
|
||||
if (r1 & 1) logerror( "%04X: %02x odd register used\n", m_PC-1,op );
|
||||
res = mem_readbyte( r1 | 1 ) * mem_readbyte( r2 );
|
||||
mem_writeword( r1 & 0xfe, res & 0xFFFF );
|
||||
//res = mem_readword( r1 ) * mem_readbyte( r2 );
|
||||
res &= 0xFFFF;
|
||||
mem_writeword( r1, res );
|
||||
m_PS1 = m_PS1 & ~ ( FLAG_Z | FLAG_V );
|
||||
m_PS1 |= ( ( res & 0xFFFF ) == 0x00 ? FLAG_Z : 0 );
|
||||
m_PS1 |= ( ( res == 0x00 ) ? FLAG_Z : 0 );
|
||||
mycycles += 24;
|
||||
break;
|
||||
case 0x4D: /* MULT RRr,i - 24 cycles - Flags affected: -Z-0---- */
|
||||
@ -1161,9 +1163,11 @@ case 0x4D: /* MULT RRr,i - 24 cycles - Flags affected: -Z-0---- */
|
||||
ARG_iR;
|
||||
if (r1 & 1) logerror( "%04X: %02x odd register used\n", m_PC-1,op );
|
||||
res = mem_readbyte( r1 | 1 ) * r2;
|
||||
mem_writeword( r1 & 0xfe, res & 0xFFFF );
|
||||
//res = mem_readword( r1 ) * r2;
|
||||
res &= 0xFFFF;
|
||||
mem_writeword( r1, res );
|
||||
m_PS1 = m_PS1 & ~ ( FLAG_Z | FLAG_V );
|
||||
m_PS1 |= ( ( res & 0xFFFF ) == 0x00 ? FLAG_Z : 0 );
|
||||
m_PS1 |= ( ( res == 0x00 ) ? FLAG_Z : 0 );
|
||||
mycycles += 24;
|
||||
break;
|
||||
case 0x4E: /* BMOV Rr,#b,BF/BF,Rr,#b - 6 cycles - Flags affected: --------/-Z-0--B- */
|
||||
@ -1275,22 +1279,37 @@ case 0x58: /* MOV Rr,i - 6 cycles - Flags affected: -------- */
|
||||
mycycles += 6;
|
||||
break;
|
||||
case 0x59: /* Invalid - 2? cycles - Flags affected: --------? */
|
||||
logerror( "%04X: unk%02x\n", m_PC-1,op );
|
||||
logerror( "%04X: unk%02x, unhandled\n", m_PC-1,op );
|
||||
mycycles += 2;
|
||||
break;
|
||||
case 0x5A: /* unk5A - 7,8,12,9,8 cycles */
|
||||
/* NOTE: This unknown command is used in the game.com calculator, and in a number of carts.
|
||||
It appears to compare the contents of the register number contained in the first
|
||||
parameter, against a literal in the second parameter.
|
||||
Example:
|
||||
mov r02, 88
|
||||
unk 5a 02 06 (compare contents of memory 88, to literal 06)
|
||||
The calculator uses this instruction at 0x493A and 0x4941. Defender II (in Williams
|
||||
Arcade Classics) uses it at 6DC9. */
|
||||
/* NOTE: This unknown command is used in the calculator, and in a number of carts.
|
||||
It appears to be a compare, and the number of opcode bytes varies depending
|
||||
on the 2nd byte. */
|
||||
ARG_iR;
|
||||
s2 = mem_readbyte(r2);
|
||||
logerror( "%04X: unk%02x (cmp r%02X->(%02X)->%02X to %02X)\n", m_PC-3,op,r2,s2,mem_readbyte(s2),r1 );
|
||||
OP_CMP8( mem_readbyte(s2), r1 );
|
||||
switch (r2 & 0xc0)
|
||||
{
|
||||
case 0x00:
|
||||
// 5A 02 09 (used in calculator @ 493A and 4941. Used in Defender II @ 6DC9).
|
||||
// Assuming it to be a compare of the literal last number against contents of (contents of r02).
|
||||
logerror( "%04X: unk%02X %02X %02X\n", m_PC-3,op,r2,r1 );
|
||||
s1 = mem_readbyte(r2 & 7);
|
||||
OP_CMP8( mem_readbyte(s1), r1 );
|
||||
break;
|
||||
case 0x80:
|
||||
// 5A 86 C6 00 (used in Henry @ 495B, when you guess wrongly in practice mode).
|
||||
// 5A 87 C6 00 (used in Henry @ 7073, when you guess wrongly in competition mode).
|
||||
// Assuming it to be a compare of the literal last number against contents of (contents r06 + offset C6).
|
||||
s1 = r1;
|
||||
ARG_R;
|
||||
logerror( "%04X: unk%02X %02X %02X %02X\n", m_PC-4,op,r2,s1,r1 );
|
||||
s1 += mem_readbyte(r2 & 7);
|
||||
OP_CMP8( mem_readbyte(s1), r1 );
|
||||
break;
|
||||
default:
|
||||
logerror( "%04X: unk%02X %02X %02X, unhandled\n", m_PC-3,op,r2,r1 );
|
||||
break;
|
||||
}
|
||||
mycycles += 7;
|
||||
break;
|
||||
case 0x5B: /* unk5B - 6,7,11,8,7 cycles */
|
||||
@ -1304,13 +1323,14 @@ case 0x5B: /* unk5B - 6,7,11,8,7 cycles */
|
||||
ARG_iR;
|
||||
if (r2 == 0x42) // only code used is 5B 42 00. This code allows those games to boot.
|
||||
{ // MOV (Rr)+,i -- or maybe -- AND (Rr)+,i
|
||||
logerror( "%04X: unk%02X %02X %02X\n", m_PC-3,op,r2,r1 );
|
||||
s1 = r2 & 7;
|
||||
res = mem_readbyte( s1 );
|
||||
mem_writebyte( res, r1 );
|
||||
mem_writebyte( s1, res + 1 );
|
||||
}
|
||||
else
|
||||
logerror( "%04X: unk%02X %02X %02X\n", m_PC-1,op,r2,r1 );
|
||||
logerror( "%04X: unk%02X %02X %02X, unhandled\n", m_PC-3,op,r2,r1 );
|
||||
|
||||
mycycles += 6;
|
||||
break;
|
||||
@ -1661,7 +1681,7 @@ case 0xF0: /* STOP - 2 cycles - Flags affected: -------- */
|
||||
/* TODO: Add a bunch of additional cycles */
|
||||
m_clock_changed = 0;
|
||||
}
|
||||
logerror( "%04X: unk%02x\n", m_PC-1,op );
|
||||
logerror( "%04X: %02x, cpu-clock-change, unhandled\n", m_PC-1,op );
|
||||
break;
|
||||
case 0xF1: /* HALT - 2 cycles - Flags affected: -------- */
|
||||
m_halted = 1;
|
||||
@ -1673,7 +1693,7 @@ case 0xF4:
|
||||
case 0xF5:
|
||||
case 0xF6:
|
||||
case 0xF7:
|
||||
logerror( "%04X: unk%02x\n", m_PC-1,op );
|
||||
logerror( "%04X: unk%02x, unhandled\n", m_PC-1,op );
|
||||
mycycles += 2;
|
||||
break;
|
||||
case 0xF8: /* RET - 10,8 cycles - Flags affected: -------- */
|
||||
|
Loading…
Reference in New Issue
Block a user