summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/pps4/pps4.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/pps4/pps4.cpp')
-rw-r--r--src/devices/cpu/pps4/pps4.cpp188
1 files changed, 86 insertions, 102 deletions
diff --git a/src/devices/cpu/pps4/pps4.cpp b/src/devices/cpu/pps4/pps4.cpp
index f17b420a004..fbf2f3a27ea 100644
--- a/src/devices/cpu/pps4/pps4.cpp
+++ b/src/devices/cpu/pps4/pps4.cpp
@@ -78,7 +78,6 @@
#include "emu.h"
#include "pps4.h"
#include "pps4dasm.h"
-#include "debugger.h"
#define VERBOSE 0 //!< set to 1 to log certain instruction conditions
@@ -92,9 +91,11 @@ pps4_device::pps4_device(const machine_config &mconfig, device_type type, const
, m_program_config("program", ENDIANNESS_LITTLE, 8, 12)
, m_data_config("data", ENDIANNESS_LITTLE, 8, 12) // 4bit RAM
, m_io_config("io", ENDIANNESS_LITTLE, 8, 8) // 4bit IO
- , m_dia_cb(*this)
- , m_dib_cb(*this)
+ , m_dia_cb(*this, 0)
+ , m_dib_cb(*this, 0)
, m_do_cb(*this)
+ , m_wasldi(0)
+ , m_waslbl(0)
{
}
@@ -123,9 +124,9 @@ device_memory_interface::space_config_vector pps4_device::memory_space_config()
*/
u8 pps4_device::M()
{
- u8 ret = m_data->read_byte(m_B & ~m_SAG);
+ u8 ret = m_data.read_byte(m_B & ~m_SAG);
m_SAG = 0;
- return ret;
+ return ret & 15;
}
@@ -135,7 +136,7 @@ u8 pps4_device::M()
*/
void pps4_device::W(u8 data)
{
- m_data->write_byte(m_B & ~m_SAG, data);
+ m_data.write_byte(m_B & ~m_SAG, data);
m_SAG = 0;
}
@@ -153,8 +154,7 @@ std::unique_ptr<util::disasm_interface> pps4_device::create_disassembler()
*/
inline u8 pps4_device::ROP()
{
- const u8 op = m_cache->read_byte(m_P & 0xFFF);
- m_Ip = m_I1; // save previous opcode
+ const u8 op = m_cache.read_byte(m_P & 0xFFF);
m_P = (m_P + 1) & 0xFFF;
m_icount -= 1;
return op;
@@ -169,7 +169,7 @@ inline u8 pps4_device::ROP()
*/
inline u8 pps4_device::ARG()
{
- const u8 arg = m_cache->read_byte(m_P & 0xFFF);
+ const u8 arg = m_cache.read_byte(m_P & 0xFFF);
m_P = (m_P + 1) & 0xFFF;
m_icount -= 1;
return arg;
@@ -211,9 +211,9 @@ inline u8 pps4_device::ARG()
*/
void pps4_device::iAD()
{
- m_A = m_A + M();
- m_C = (m_A >> 4) & 1;
- m_A = m_A & 15;
+ m_A += M();
+ m_C = (m_A > 15) ? 1 : 0;
+ m_A &= 15;
}
/**
@@ -232,8 +232,8 @@ void pps4_device::iAD()
void pps4_device::iADC()
{
m_A = m_A + M() + m_C;
- m_C = m_A >> 4;
- m_A = m_A & 15;
+ m_C = (m_A > 15) ? 1 : 0;
+ m_A &= 15;
}
/**
@@ -253,9 +253,10 @@ void pps4_device::iADC()
void pps4_device::iADSK()
{
m_A = m_A + M();
- m_C = m_A >> 4;
+ //m_A += M();
+ m_C = (m_A > 15) ? 1 : 0;
m_Skip = m_C;
- m_A = m_A & 15;
+ m_A &= 15;
}
/**
@@ -275,9 +276,9 @@ void pps4_device::iADSK()
void pps4_device::iADCSK()
{
m_A = m_A + M() + m_C;
- m_C = m_A >> 4;
+ m_C = (m_A > 15) ? 1 : 0;
m_Skip = m_C;
- m_A = m_A & 15;
+ m_A &= 15;
}
/**
@@ -304,9 +305,9 @@ void pps4_device::iADCSK()
void pps4_device::iADI()
{
const u8 imm = ~m_I1 & 15;
- m_A = m_A + imm;
- m_Skip = (m_A >> 4) & 1;
- m_A = m_A & 15;
+ m_A += imm;
+ m_Skip = (m_A > 15) ? 1 : 0;
+ m_A &= 15;
}
/**
@@ -326,7 +327,7 @@ void pps4_device::iADI()
*/
void pps4_device::iDC()
{
- m_A = m_A + 10;
+ m_A = (m_A + 10) & 15;
}
/**
@@ -345,7 +346,7 @@ void pps4_device::iDC()
*/
void pps4_device::iAND()
{
- m_A = m_A & M();
+ m_A &= M();
}
/**
@@ -364,7 +365,7 @@ void pps4_device::iAND()
*/
void pps4_device::iOR()
{
- m_A = m_A | M();
+ m_A |= M();
}
/**
@@ -384,7 +385,7 @@ void pps4_device::iOR()
*/
void pps4_device::iEOR()
{
- m_A = m_A ^ M();
+ m_A ^= M();
}
/**
@@ -402,7 +403,7 @@ void pps4_device::iEOR()
*/
void pps4_device::iCOMP()
{
- m_A = m_A ^ 15;
+ m_A ^= 15;
}
/**
@@ -522,7 +523,7 @@ void pps4_device::iRF2()
* by B register are placed in the accumulator.
* The RAM address in the B register is then
* modified by the result of an exclusive-OR of
- * the 3-b it immediate field I(3:1) and B(7:5)
+ * the 3-b immediate field I(3:1) and B(7:5)
*
* See %Note3
*/
@@ -530,7 +531,7 @@ void pps4_device::iLD()
{
const u16 i3c = ~m_I1 & 7;
m_A = M();
- m_B = m_B ^ (i3c << 4);
+ m_B ^= (i3c << 4);
}
/**
@@ -555,7 +556,7 @@ void pps4_device::iEX()
const u8 mem = M();
W(m_A);
m_A = mem;
- m_B = m_B ^ (i3c << 4);
+ m_B ^= (i3c << 4);
}
/**
@@ -585,14 +586,10 @@ void pps4_device::iEXD()
u8 bl = m_B & 15;
W(m_A);
m_A = mem;
- m_B = m_B ^ (i3c << 4);
+ m_B ^= (i3c << 4);
// if decrement BL wraps to 1111b
- if (0 == bl) {
- bl = 15;
- m_Skip = 1;
- } else {
- bl = bl - 1;
- }
+ bl = (bl - 1) & 15;
+ m_Skip = (bl == 15);
m_B = (m_B & ~15) | bl;
}
@@ -617,12 +614,10 @@ void pps4_device::iEXD()
*/
void pps4_device::iLDI()
{
- // previous LDI instruction?
- if (0x70 == (m_Ip & 0xf0)) {
- LOG("%s: skip prev:%02x op:%02x\n", __FUNCTION__, m_Ip, m_I1);
- return;
- }
- m_A = ~m_I1 & 15;
+ if (!m_wasldi)
+ m_A = ~m_I1 & 15;
+
+ m_wasldi = 2;
}
/**
@@ -640,7 +635,7 @@ void pps4_device::iLDI()
*/
void pps4_device::iLAX()
{
- m_A = m_X;
+ m_A = m_X & 15;
}
/**
@@ -654,11 +649,11 @@ void pps4_device::iLAX()
* X <- A
*
* The contents of the accumulator are
- * tansferred to the X register.
+ * transferred to the X register.
*/
void pps4_device::iLXA()
{
- m_X = m_A;
+ m_X = m_A & 15;
}
/**
@@ -672,7 +667,7 @@ void pps4_device::iLXA()
* A <- BL
*
* The contents of BL register are
- * tansferred to the accumulator.
+ * transferred to the accumulator.
*/
void pps4_device::iLABL()
{
@@ -690,7 +685,7 @@ void pps4_device::iLABL()
* BM <- X
*
* The contents of X register are
- * tansferred to BM register.
+ * transferred to the BM register.
*/
void pps4_device::iLBMX()
{
@@ -708,7 +703,7 @@ void pps4_device::iLBMX()
* BU <- A
* A <- M
*
- * The contents of accumulator are tansferred to
+ * The contents of accumulator are transferred to
* BU register. Also, the contents of the currently
* addressed RAM are transferred to accumulator.
*/
@@ -776,9 +771,7 @@ void pps4_device::iXBMX()
void pps4_device::iXAX()
{
// swap A and X
- m_A ^= m_X;
- m_X ^= m_A;
- m_A ^= m_X;
+ std::swap(m_A, m_X);
}
/**
@@ -797,9 +790,7 @@ void pps4_device::iXAX()
void pps4_device::iXS()
{
// swap SA and SB
- m_SA ^= m_SB;
- m_SB ^= m_SA;
- m_SA ^= m_SB;
+ std::swap(m_SA, m_SB);
}
/**
@@ -824,8 +815,8 @@ void pps4_device::iXS()
*/
void pps4_device::iCYS()
{
- const u16 sa = (m_SA >> 4) | (m_A << 8);
- m_A = m_SA & 15;
+ const u16 sa = (m_SA >> 4) | ((m_A^15) << 8);
+ m_A = ~m_SA & 15;
m_SA = sa;
}
@@ -864,20 +855,17 @@ void pps4_device::iCYS()
*/
void pps4_device::iLB()
{
- // previous LB or LBL instruction?
- if (0xc0 == (m_Ip & 0xf0) || 0x00 == m_Ip) {
- LOG("%s: skip prev:%02x op:%02x\n", __FUNCTION__, m_Ip, m_I1);
- return;
+ if (!m_waslbl)
+ {
+ m_SB = m_SA;
+ m_SA = (m_P + 1) & 0xFFF;
+ m_P = (3 << 6) | (m_I1 & 15);
+ m_B = ~ARG() & 255;
+ m_P = m_SA;
+ // swap SA and SB
+ std::swap(m_SA, m_SB);
}
- m_SB = m_SA;
- m_SA = (m_P + 1) & 0xFFF;
- m_P = (3 << 6) | (m_I1 & 15);
- m_B = ~ARG() & 255;
- m_P = m_SA;
- // swap SA and SB
- m_SA ^= m_SB;
- m_SB ^= m_SA;
- m_SA ^= m_SB;
+ m_waslbl = 2;
}
/**
@@ -906,12 +894,10 @@ void pps4_device::iLB()
void pps4_device::iLBL()
{
m_I2 = ARG();
- // previous LB or LBL instruction?
- if (0xc0 == (m_Ip & 0xf0) || 0x00 == m_Ip) {
- LOG("%s: skip prev:%02x op:%02x\n", __FUNCTION__, m_Ip, m_I1);
- return;
- }
- m_B = ~m_I2 & 255; // Note: immediate is 1's complement
+ if (!m_waslbl)
+ m_B = ~m_I2 & 255; // Note: immediate is 1's complement
+
+ m_waslbl = 2;
}
/**
@@ -992,7 +978,7 @@ void pps4_device::iT()
* @brief pps4_device::iTM Transfer and mark indirect
* HEX BINARY CYCLES MNEMONIC
* ----------------------------------
- * 0xc0+ 11xx xxxx 2 TM x
+ * 0xd0+ 11x1 xxxx 2 TM x
* yyyy yyyy from page 3
*
* Symbolic equation
@@ -1103,7 +1089,7 @@ void pps4_device::iSKC()
*/
void pps4_device::iSKZ()
{
- m_Skip = (0 == m_A) ? 1 : 0;
+ m_Skip = m_A ? 0 : 1;
}
/**
@@ -1175,9 +1161,7 @@ void pps4_device::iRTN()
{
m_P = m_SA & 0xFFF;
// swap SA and SB
- m_SA ^= m_SB;
- m_SB ^= m_SA;
- m_SA ^= m_SB;
+ std::swap(m_SA, m_SB);
}
/**
@@ -1198,9 +1182,7 @@ void pps4_device::iRTNSK()
{
m_P = m_SA & 0xFFF;
// swap SA and SB
- m_SA ^= m_SB;
- m_SB ^= m_SA;
- m_SA ^= m_SB;
+ std::swap(m_SA, m_SB);
m_Skip = 1; // next opcode is ignored
}
@@ -1235,11 +1217,11 @@ void pps4_device::iRTNSK()
*/
void pps4_device::iIOL()
{
- u8 ac = (~m_A & 15);
+ u8 ac = ~m_A & 15;
m_I2 = ARG();
- m_io->write_byte(m_I2, ac);
+ m_io.write_byte(m_I2, ac);
LOG("%s: port:%02x <- %x\n", __FUNCTION__, m_I2, ac);
- ac = m_io->read_byte(m_I2) & 15;
+ ac = m_io.read_byte(m_I2) & 15;
LOG("%s: port:%02x -> %x\n", __FUNCTION__, m_I2, ac);
m_A = ~ac & 15;
}
@@ -1283,7 +1265,7 @@ void pps4_device::iDIB()
void pps4_2_device::iDIB()
{
// PPS-4/2 can write zeros onto bidirectional DIO pins to mask open-drain inputs
- m_A = m_dib_cb() & m_DIO;
+ m_A = m_dib_cb() & m_DIO & 15;
}
/**
@@ -1307,7 +1289,7 @@ void pps4_device::iDOA()
void pps4_2_device::iDOA()
{
// DOA also transfers contents of X to DIO on PPS-4/2
- m_DIO = m_X;
+ m_DIO = m_X & 15;
m_do_cb(m_A | (m_X << 4));
}
@@ -1340,6 +1322,10 @@ void pps4_device::iSAG()
void pps4_device::execute_one()
{
m_I1 = ROP();
+ if (m_wasldi)
+ m_wasldi--;
+ if (m_waslbl)
+ m_waslbl--;
if (m_Skip) {
m_Skip = 0;
LOG("%s: skip op:%02x\n", __FUNCTION__, m_I1);
@@ -1568,10 +1554,10 @@ void pps4_device::execute_run()
void pps4_device::device_start()
{
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<0, 0, ENDIANNESS_LITTLE>();
- m_data = &space(AS_DATA);
- m_io = &space(AS_IO);
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
+ space(AS_DATA).specific(m_data);
+ space(AS_IO).specific(m_io);
save_item(NAME(m_A));
save_item(NAME(m_X));
@@ -1586,7 +1572,8 @@ void pps4_device::device_start()
save_item(NAME(m_FF2));
save_item(NAME(m_I1));
save_item(NAME(m_I2));
- save_item(NAME(m_Ip));
+ save_item(NAME(m_wasldi));
+ save_item(NAME(m_waslbl));
state_add( PPS4_PC, "PC", m_P ).mask(0xFFF).formatstr("%03X");
state_add( PPS4_A, "A", m_A ).formatstr("%01X");
@@ -1598,16 +1585,11 @@ void pps4_device::device_start()
state_add( PPS4_B, "B", m_B ).formatstr("%03X");
state_add( PPS4_I1, "I1", m_I1 ).formatstr("%02X").noshow();
state_add( PPS4_I2, "I2", m_I2 ).formatstr("%02X").noshow();
- state_add( PPS4_Ip, "Ip", m_Ip ).formatstr("%02X").noshow();
state_add( STATE_GENPC, "GENPC", m_P ).noshow();
state_add( STATE_GENPCBASE,"CURPC", m_P ).noshow();
state_add( STATE_GENFLAGS, "GENFLAGS", m_C).formatstr("%3s").noshow();
set_icountptr(m_icount);
-
- m_dia_cb.resolve_safe(0);
- m_dib_cb.resolve_safe(0);
- m_do_cb.resolve_safe();
}
void pps4_2_device::device_start()
@@ -1647,7 +1629,8 @@ void pps4_device::device_reset()
m_FF2 = 0; // Flip-flop 2
m_I1 = 0; // Most recent instruction I(8:1)
m_I2 = 0; // Most recent parameter I2(8:1)
- m_Ip = 0; // Previous instruction I(8:1)
+ m_wasldi = 0; // was last instruction LDI?
+ m_waslbl = 0; // was last instruction LB/LBL?
}
void pps4_2_device::device_reset()
@@ -1656,11 +1639,12 @@ void pps4_2_device::device_reset()
m_DIO = 15; // DIO clamp
}
-READ16_MEMBER(pps4_device::address_bus_r)
+u16 pps4_device::address_bus_r(address_space &space)
{
- if (&space == m_io || &space == m_data)
+ int id = space.spacenum();
+ if (id == AS_IO || id == AS_DATA)
return m_B;
- else if (&space == m_program)
+ else if (id == AS_PROGRAM)
return m_P;
else
return 0;