mirror of
https://github.com/holub/mame
synced 2025-04-23 00:39:36 +03:00
added sm510 lfsr pc
This commit is contained in:
parent
49471a2cf4
commit
857be8d170
@ -82,7 +82,7 @@ static const UINT32 s_flags[] =
|
||||
};
|
||||
|
||||
// next program counter in sequence (relative)
|
||||
static const INT16 s_next_pc[0x40] =
|
||||
static const INT8 s_next_pc[0x40] =
|
||||
{
|
||||
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
|
||||
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 32+0x40,
|
||||
|
@ -6,6 +6,9 @@
|
||||
|
||||
References:
|
||||
- 1990 Sharp Microcomputers Data Book
|
||||
|
||||
TODO:
|
||||
- proper support for LFSR program counter in debugger
|
||||
|
||||
*/
|
||||
|
||||
@ -130,6 +133,7 @@ void sm510_base_device::device_start()
|
||||
|
||||
void sm510_base_device::device_reset()
|
||||
{
|
||||
m_pc = 0x37 << 6;
|
||||
}
|
||||
|
||||
|
||||
@ -143,7 +147,10 @@ void sm510_base_device::device_reset()
|
||||
|
||||
inline void sm510_base_device::increment_pc()
|
||||
{
|
||||
m_pc = (m_pc + 1) & m_prgmask;
|
||||
// PL(program counter low 6 bits) is a simple LFSR: newbit = (bit0==bit1)
|
||||
// PU,PM(high bits) specify page, PL specifies steps within page
|
||||
int feed = ((m_pc >> 1 ^ m_pc) & 1) ? 0 : 0x20;
|
||||
m_pc = feed | (m_pc >> 1 & 0x1f) | (m_pc & ~0x3f);
|
||||
}
|
||||
|
||||
void sm510_base_device::get_opcode_param()
|
||||
|
@ -63,6 +63,16 @@ static const UINT32 s_flags[] =
|
||||
0, 0, 0, _OVER, 0
|
||||
};
|
||||
|
||||
// next program counter in sequence (relative)
|
||||
static const INT8 s_next_pc[0x40] =
|
||||
{
|
||||
32, -1 /* rollback */, -1, 30, 30, -3, -3, 28, 28, -5, -5, 26, 26, -7, -7, 24,
|
||||
24, -9, -9, 22, 22, -11, -11, 20, 20, -13, -13, 18, 18, -15, -15, 16,
|
||||
16, -17, -17, 14, 14, -19, -19, 12, 12, -21, -21, 10, 10, -23, -23, 8,
|
||||
8, -25, -25, 6, 6, -27, -27, 4, 4, -29, -29, 2, 2, -31, -31, 0 /* gets stuck here */
|
||||
};
|
||||
|
||||
|
||||
static const UINT8 sm510_mnemonic[0x100] =
|
||||
{
|
||||
/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
|
||||
@ -92,18 +102,19 @@ static const UINT8 sm510_mnemonic[0x100] =
|
||||
CPU_DISASSEMBLE(sm510)
|
||||
{
|
||||
// get raw opcode
|
||||
int pos = 0;
|
||||
UINT8 op = oprom[pos];
|
||||
pos++;
|
||||
UINT8 op = oprom[0];
|
||||
UINT8 instr = sm510_mnemonic[op];
|
||||
int len = 1;
|
||||
|
||||
int bits = s_bits[instr];
|
||||
UINT8 mask = op & ((1 << (bits & 7)) - 1);
|
||||
UINT16 param = mask;
|
||||
if (bits >= 8)
|
||||
{
|
||||
param = oprom[pos];
|
||||
pos++;
|
||||
// note: disasm view shows correct parameter, but raw view does not
|
||||
// note2: oprom array negative index access is intentional
|
||||
param = oprom[s_next_pc[pc & 0x3f]];
|
||||
len++;
|
||||
}
|
||||
|
||||
// disassemble it
|
||||
@ -133,5 +144,5 @@ CPU_DISASSEMBLE(sm510)
|
||||
}
|
||||
}
|
||||
|
||||
return (pos & DASMFLAG_LENGTHMASK) | s_flags[instr] | DASMFLAG_SUPPORTED;
|
||||
return len | s_flags[instr] | DASMFLAG_SUPPORTED;
|
||||
}
|
||||
|
@ -24,6 +24,7 @@
|
||||
@MP1221 TMS1100 1980, Entex Raise The Devil
|
||||
*MP1296 TMS1100? 1982, Entex Black Knight
|
||||
*MP1312 TMS1100 198?, Tandy/RadioShack Science Fair Microcomputer Trainer
|
||||
*MP1359 TMS1100? 1985, Capsela CRC2000
|
||||
@MP1525 TMS1170 1980, Coleco Head to Head Baseball
|
||||
*MP1604 ? 1981, Hanzawa Twinvader III/Tandy Cosmic Fire Away 3000 (? note: VFD-capable)
|
||||
@MP2105 TMS1370 1979, Gakken Poker
|
||||
|
Loading…
Reference in New Issue
Block a user