(nw) gamecom

- henry: fixed display of score in practice mode.
- added some dasm of unk5A and unk5B
This commit is contained in:
Robbbert 2018-10-25 17:45:08 +11:00
parent e023716ff2
commit 8e64fafd97
3 changed files with 70 additions and 23 deletions

View File

@ -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 ) {

View File

@ -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

View File

@ -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: -------- */