summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu')
-rw-r--r--src/devices/cpu/alto2/a2ether.cpp2
-rw-r--r--src/devices/cpu/alto2/a2ether.h78
-rw-r--r--src/devices/cpu/sh/sh3comn.cpp8
-rw-r--r--src/devices/cpu/upd7725/upd7725.cpp30
-rw-r--r--src/devices/cpu/upd7725/upd7725.h10
-rw-r--r--src/devices/cpu/z80/z80.cpp110
-rw-r--r--src/devices/cpu/z80/z80.h6
-rw-r--r--src/devices/cpu/z80/z80.lst30
8 files changed, 129 insertions, 145 deletions
diff --git a/src/devices/cpu/alto2/a2ether.cpp b/src/devices/cpu/alto2/a2ether.cpp
index 87ee4268370..4bdd9b649a5 100644
--- a/src/devices/cpu/alto2/a2ether.cpp
+++ b/src/devices/cpu/alto2/a2ether.cpp
@@ -1307,7 +1307,7 @@ void alto2_cpu_device::update_tclk(int tclk)
void alto2_cpu_device::init_ether(int task)
{
// intialize all ethernet variables
- memset(&m_eth, 0, sizeof(m_eth));
+ m_eth = decltype(m_eth)();
save_item(NAME(m_eth.fifo));
save_item(NAME(m_eth.fifo_rd));
save_item(NAME(m_eth.fifo_wr));
diff --git a/src/devices/cpu/alto2/a2ether.h b/src/devices/cpu/alto2/a2ether.h
index 7d0ab567215..7ec4320c226 100644
--- a/src/devices/cpu/alto2/a2ether.h
+++ b/src/devices/cpu/alto2/a2ether.h
@@ -48,45 +48,45 @@ enum {
};
struct {
- uint32_t serin; //!< serial input shift registers 74164 #37 and #33
- uint16_t fifo[ALTO2_ETHER_FIFO_SIZE]; //!< FIFO buffer
- uint16_t fifo_rd; //!< FIFO input pointer
- uint16_t fifo_wr; //!< FIFO output pointer
- uint16_t status; //!< status word
- uint16_t rx_crc; //!< receiver CRC
- uint16_t tx_crc; //!< transmitter CRC
- uint32_t rx_count; //!< received words count
- uint32_t tx_count; //!< transmitted words count
- std::unique_ptr<uint16_t[]> rx_packet; //!< buffer to collect received words
- std::unique_ptr<uint16_t[]> tx_packet; //!< buffer to collect transmitted words
- emu_timer* rx_timer; //!< receiver timer
- emu_timer* tx_timer; //!< transmitter timer
- jkff_t ff_10a; //!< JK flip-flop 10a IBUSY (Sheet 13)
- jkff_t ff_10b; //!< JK flip-flop 10b OBUSY (Sheet 13)
- jkff_t ff_21a; //!< JK flip-flop 21a OUTON (Sheet 19)
- jkff_t ff_21b; //!< JK flip-flop 21b COLL (Sheet 19)
- jkff_t ff_31a; //!< JK flip-flop 31a OUTGONE (Sheet 19)
- jkff_t ff_31b; //!< JK flip-flop 31b OEOT (Sheet 19)
- jkff_t ff_35a; //!< JK flip-flop 35a OCMD (Sheet 7)
- jkff_t ff_35b; //!< JK flip-flop 35b ICMD (Sheet 7)
- jkff_t ff_47a; //!< JK flip-flop 47a ISR14 (Sheet 15)
- jkff_t ff_47b; //!< JK flip-flop 47b ISR15 (Sheet 15)
- jkff_t ff_51a; //!< JK flip-flop 51a EWFCT latch (Sheet 19)
- jkff_t ff_51b; //!< JK flip-flop 51b OCDW (Sheet 19)
- jkff_t ff_52b; //!< JK flip-flop 52b OSLOAD (Sheet 17)
- jkff_t ff_61a; //!< JK flip-flop 61a CRCGO (Sheet 21)
- jkff_t ff_61b; //!< JK flip-flop 61b OUTRGO (Sheet 21)
- jkff_t ff_62a; //!< JK flip-flop 62a OUTON (Sheet 21)
- jkff_t ff_62b; //!< JK flip-flop 62b OUTGO (Sheet 21)
- jkff_t ff_65a; //!< JK flip-flop 65a IDL (Sheet 10)
- jkff_t ff_65b; //!< JK flip-flop 65b IO (Sheet 10)
- jkff_t ff_69a; //!< JK flip-flop 69a IT (Sheet 14)
- jkff_t ff_69b; //!< JK flip-flop 69b INON (Sheet 14)
- jkff_t ff_70a; //!< JK flip-flop 70a IMID (Sheet 14)
- jkff_t ff_70b; //!< JK flip-flop 70b ILOC (Sheet 14)
- jkff_t ff_77a; //!< JK flip-flop 77a WR (Sheet 10)
- jkff_t ff_77b; //!< JK flip-flop 77b WLF (Sheet 10)
- int breath_of_life; //!< if non-zero, interval in seconds at which to broadcast the breath-of-life
+ uint32_t serin = 0; //!< serial input shift registers 74164 #37 and #33
+ uint16_t fifo[ALTO2_ETHER_FIFO_SIZE] = { }; //!< FIFO buffer
+ uint16_t fifo_rd = 0; //!< FIFO input pointer
+ uint16_t fifo_wr = 0; //!< FIFO output pointer
+ uint16_t status = 0; //!< status word
+ uint16_t rx_crc = 0; //!< receiver CRC
+ uint16_t tx_crc = 0; //!< transmitter CRC
+ uint32_t rx_count = 0; //!< received words count
+ uint32_t tx_count = 0; //!< transmitted words count
+ std::unique_ptr<uint16_t []> rx_packet; //!< buffer to collect received words
+ std::unique_ptr<uint16_t []> tx_packet; //!< buffer to collect transmitted words
+ emu_timer *rx_timer = nullptr; //!< receiver timer
+ emu_timer *tx_timer = nullptr; //!< transmitter timer
+ jkff_t ff_10a = JKFF_0; //!< JK flip-flop 10a IBUSY (Sheet 13)
+ jkff_t ff_10b = JKFF_0; //!< JK flip-flop 10b OBUSY (Sheet 13)
+ jkff_t ff_21a = JKFF_0; //!< JK flip-flop 21a OUTON (Sheet 19)
+ jkff_t ff_21b = JKFF_0; //!< JK flip-flop 21b COLL (Sheet 19)
+ jkff_t ff_31a = JKFF_0; //!< JK flip-flop 31a OUTGONE (Sheet 19)
+ jkff_t ff_31b = JKFF_0; //!< JK flip-flop 31b OEOT (Sheet 19)
+ jkff_t ff_35a = JKFF_0; //!< JK flip-flop 35a OCMD (Sheet 7)
+ jkff_t ff_35b = JKFF_0; //!< JK flip-flop 35b ICMD (Sheet 7)
+ jkff_t ff_47a = JKFF_0; //!< JK flip-flop 47a ISR14 (Sheet 15)
+ jkff_t ff_47b = JKFF_0; //!< JK flip-flop 47b ISR15 (Sheet 15)
+ jkff_t ff_51a = JKFF_0; //!< JK flip-flop 51a EWFCT latch (Sheet 19)
+ jkff_t ff_51b = JKFF_0; //!< JK flip-flop 51b OCDW (Sheet 19)
+ jkff_t ff_52b = JKFF_0; //!< JK flip-flop 52b OSLOAD (Sheet 17)
+ jkff_t ff_61a = JKFF_0; //!< JK flip-flop 61a CRCGO (Sheet 21)
+ jkff_t ff_61b = JKFF_0; //!< JK flip-flop 61b OUTRGO (Sheet 21)
+ jkff_t ff_62a = JKFF_0; //!< JK flip-flop 62a OUTON (Sheet 21)
+ jkff_t ff_62b = JKFF_0; //!< JK flip-flop 62b OUTGO (Sheet 21)
+ jkff_t ff_65a = JKFF_0; //!< JK flip-flop 65a IDL (Sheet 10)
+ jkff_t ff_65b = JKFF_0; //!< JK flip-flop 65b IO (Sheet 10)
+ jkff_t ff_69a = JKFF_0; //!< JK flip-flop 69a IT (Sheet 14)
+ jkff_t ff_69b = JKFF_0; //!< JK flip-flop 69b INON (Sheet 14)
+ jkff_t ff_70a = JKFF_0; //!< JK flip-flop 70a IMID (Sheet 14)
+ jkff_t ff_70b = JKFF_0; //!< JK flip-flop 70b ILOC (Sheet 14)
+ jkff_t ff_77a = JKFF_0; //!< JK flip-flop 77a WR (Sheet 10)
+ jkff_t ff_77b = JKFF_0; //!< JK flip-flop 77b WLF (Sheet 10)
+ int breath_of_life = 0; //!< if non-zero, interval in seconds at which to broadcast the breath-of-life
} m_eth;
TIMER_CALLBACK_MEMBER( rx_breath_of_life ); //!< HACK: pull the next word from the breath-of-life in the fifo
diff --git a/src/devices/cpu/sh/sh3comn.cpp b/src/devices/cpu/sh/sh3comn.cpp
index 63b270cbb72..8b0f149cf6d 100644
--- a/src/devices/cpu/sh/sh3comn.cpp
+++ b/src/devices/cpu/sh/sh3comn.cpp
@@ -881,10 +881,10 @@ void sh3_base_device::irr0_w(offs_t offset, uint8_t data, uint8_t mem_mask)
COMBINE_DATA(&m_irr0);
logerror("'%s' (%08x): INTC unmapped internal write %02x & %02x (IRR0)\n", tag(), m_sh2_state->pc, data, mem_mask);
// not sure if this is how we should clear lines in this core...
- if (!(data & 0x01000000)) execute_set_input(0, CLEAR_LINE);
- if (!(data & 0x02000000)) execute_set_input(1, CLEAR_LINE);
- if (!(data & 0x04000000)) execute_set_input(2, CLEAR_LINE);
- if (!(data & 0x08000000)) execute_set_input(3, CLEAR_LINE);
+ if (!(data & 0x01)) execute_set_input(0, CLEAR_LINE);
+ if (!(data & 0x02)) execute_set_input(1, CLEAR_LINE);
+ if (!(data & 0x04)) execute_set_input(2, CLEAR_LINE);
+ if (!(data & 0x08)) execute_set_input(3, CLEAR_LINE);
}
uint8_t sh3_base_device::irr1_r(offs_t offset, uint8_t mem_mask)
diff --git a/src/devices/cpu/upd7725/upd7725.cpp b/src/devices/cpu/upd7725/upd7725.cpp
index 5f20a7b8c3a..a7d43f50e68 100644
--- a/src/devices/cpu/upd7725/upd7725.cpp
+++ b/src/devices/cpu/upd7725/upd7725.cpp
@@ -569,38 +569,44 @@ void necdsp_device::exec_ld(uint32_t opcode) {
}
}
-uint8_t necdsp_device::snesdsp_read(bool mode) {
- if (!mode)
- {
- return regs.sr >> 8;
- }
+uint8_t necdsp_device::status_r()
+{
+ return regs.sr >> 8;
+}
+
+uint8_t necdsp_device::data_r()
+{
if (regs.sr.drc == 0)
{
//16-bit
if(regs.sr.drs == 0)
{
- regs.sr.drs = 1;
+ if (!machine().side_effects_disabled())
+ regs.sr.drs = 1;
return regs.dr >> 0;
}
else
{
- regs.sr.rqm = 0;
- regs.sr.drs = 0;
+ if (!machine().side_effects_disabled())
+ {
+ regs.sr.rqm = 0;
+ regs.sr.drs = 0;
+ }
return regs.dr >> 8;
}
}
else
{
//8-bit
- regs.sr.rqm = 0;
+ if (!machine().side_effects_disabled())
+ regs.sr.rqm = 0;
return regs.dr >> 0;
}
}
-void necdsp_device::snesdsp_write(bool mode, uint8_t data) {
- if (!mode) return;
-
+void necdsp_device::data_w(uint8_t data)
+{
if (regs.sr.drc == 0)
{
//16-bit
diff --git a/src/devices/cpu/upd7725/upd7725.h b/src/devices/cpu/upd7725/upd7725.h
index 7e70e5642c5..d77e3620dcf 100644
--- a/src/devices/cpu/upd7725/upd7725.h
+++ b/src/devices/cpu/upd7725/upd7725.h
@@ -36,8 +36,9 @@ public:
auto p0() { return m_out_p0_cb.bind(); }
auto p1() { return m_out_p1_cb.bind(); }
- uint8_t snesdsp_read(bool mode);
- void snesdsp_write(bool mode, uint8_t data);
+ uint8_t status_r();
+ uint8_t data_r();
+ void data_w(uint8_t data);
protected:
// construction/destruction
@@ -175,7 +176,10 @@ public:
upd96050_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
uint16_t dataram_r(uint16_t addr) { return dataRAM[addr & 0x07ff]; }
- void dataram_w(uint16_t addr, uint16_t data) { dataRAM[addr & 0x07ff] = data; }
+ void dataram_w(uint16_t addr, uint16_t data, uint16_t mem_mask = uint16_t(~0))
+ {
+ COMBINE_DATA(&dataRAM[addr & 0x07ff]);
+ }
};
// device type definition
diff --git a/src/devices/cpu/z80/z80.cpp b/src/devices/cpu/z80/z80.cpp
index 9b85d3cfee4..ab4d79d5120 100644
--- a/src/devices/cpu/z80/z80.cpp
+++ b/src/devices/cpu/z80/z80.cpp
@@ -40,8 +40,6 @@ u8 z80_device::SZ_BIT[] = {}; // zero, sign and parity/overflow (=zero) flags
u8 z80_device::SZP[] = {}; // zero, sign and parity flags
u8 z80_device::SZHV_inc[] = {}; // zero, sign, half carry and overflow flags INC r8
u8 z80_device::SZHV_dec[] = {}; // zero, sign, half carry and overflow flags DEC r8
-u8 z80_device::SZHVC_add[] = {};
-u8 z80_device::SZHVC_sub[] = {};
/***************************************************************
@@ -170,9 +168,11 @@ void z80_device::rra()
***************************************************************/
void z80_device::add_a(u8 value)
{
- u32 ah = AF & 0xff00;
- u32 res = (u8)((ah >> 8) + value);
- set_f(SZHVC_add[ah | res]);
+ const u16 res = A + value;
+ u8 f = (((A ^ res) & (value ^ res)) >> 5) & VF;
+ f |= flags_szyxc(res);
+ f |= ((A & 0x0f) + (value & 0x0f)) & HF;
+ set_f(f);
A = res;
}
@@ -181,20 +181,27 @@ void z80_device::add_a(u8 value)
***************************************************************/
void z80_device::adc_a(u8 value)
{
- u32 ah = AF & 0xff00, c = AF & 1;
- u32 res = (u8)((ah >> 8) + value + c);
- set_f(SZHVC_add[(c << 16) | ah | res]);
+ const int c = F & CF;
+ const u16 res = A + value + c;
+ u8 f = (((A ^ res) & (value ^ res)) >> 5) & VF;
+ f |= flags_szyxc(res);
+ f |= ((A & 0x0f) + (value & 0x0f) + c) & HF;
+
+ set_f(f);
A = res;
}
/***************************************************************
- * SUB n
+ * SUB A,n
***************************************************************/
-void z80_device::sub(u8 value)
+void z80_device::sub_a(u8 value)
{
- u32 ah = AF & 0xff00;
- u32 res = (u8)((ah >> 8) - value);
- set_f(SZHVC_sub[ah | res]);
+ const u16 res = A - value;
+ u8 f = (((A ^ value) & (A ^ res)) >> 5) & VF;
+ f |= NF | flags_szyxc(res);
+ f |= ((A & 0x0f) - (value & 0x0f)) & HF;
+
+ set_f(f);
A = res;
}
@@ -203,9 +210,13 @@ void z80_device::sub(u8 value)
***************************************************************/
void z80_device::sbc_a(u8 value)
{
- u32 ah = AF & 0xff00, c = AF & 1;
- u32 res = (u8)((ah >> 8) - value - c);
- set_f(SZHVC_sub[(c << 16) | ah | res]);
+ const int c = F & CF;
+ const u16 res = A - value - c;
+ u8 f = (((A ^ value) & (A ^ res)) >> 5) & VF;
+ f |= NF | flags_szyxc(res);
+ f |= ((A & 0x0f) - (value & 0x0f) - c) & HF;
+
+ set_f(f);
A = res;
}
@@ -216,7 +227,7 @@ void z80_device::neg()
{
u8 value = A;
A = 0;
- sub(value);
+ sub_a(value);
}
/***************************************************************
@@ -272,10 +283,12 @@ void z80_device::xor_a(u8 value)
***************************************************************/
void z80_device::cp(u8 value)
{
- unsigned val = value;
- u32 ah = AF & 0xff00;
- u32 res = (u8)((ah >> 8) - val);
- set_f((SZHVC_sub[ah | res] & ~(YF | XF)) | (val & (YF | XF)));
+ const u16 res = A - value;
+ u8 f = (((A ^ value) & (A ^ res)) >> 5) & VF;
+ f |= NF | flags_szyxc(res);
+ f |= ((A & 0x0f) - (value & 0x0f)) & HF;
+
+ set_f((f & ~(YF | XF)) | (value & (YF | XF)));
}
/***************************************************************
@@ -476,6 +489,15 @@ void z80_device::illegal_2()
m_opcodes.read_byte((PC - 1) & 0xffff));
}
+u8 z80_device::flags_szyxc(u16 value)
+{
+ u8 f = value & (SF | YF | XF); // SF + undocumented flag bits 5+3
+ f |= u8(value) ? 0 : ZF;
+ f |= (value >> 8) & CF;
+ return f;
+}
+
+
/****************************************************************************
* Processor initialization
****************************************************************************/
@@ -495,52 +517,6 @@ void z80_device::device_start()
{
if (!tables_initialised)
{
- u8 *padd = &SZHVC_add[ 0*256];
- u8 *padc = &SZHVC_add[256*256];
- u8 *psub = &SZHVC_sub[ 0*256];
- u8 *psbc = &SZHVC_sub[256*256];
- for (int oldval = 0; oldval < 256; oldval++)
- {
- for (int newval = 0; newval < 256; newval++)
- {
- // add or adc w/o carry set
- int val = newval - oldval;
- *padd = (newval) ? ((newval & 0x80) ? SF : 0) : ZF;
- *padd |= (newval & (YF | XF)); // undocumented flag bits 5+3
- if ((newval & 0x0f) < (oldval & 0x0f)) *padd |= HF;
- if (newval < oldval) *padd |= CF;
- if ((val^oldval^0x80) & (val^newval) & 0x80) *padd |= VF;
- padd++;
-
- // adc with carry set
- val = newval - oldval - 1;
- *padc = (newval) ? ((newval & 0x80) ? SF : 0) : ZF;
- *padc |= (newval & (YF | XF)); // undocumented flag bits 5+3
- if ((newval & 0x0f) <= (oldval & 0x0f)) *padc |= HF;
- if (newval <= oldval) *padc |= CF;
- if ((val^oldval^0x80) & (val^newval) & 0x80) *padc |= VF;
- padc++;
-
- // cp, sub or sbc w/o carry set
- val = oldval - newval;
- *psub = NF | ((newval) ? ((newval & 0x80) ? SF : 0) : ZF);
- *psub |= (newval & (YF | XF)); // undocumented flag bits 5+3
- if ((newval & 0x0f) > (oldval & 0x0f)) *psub |= HF;
- if (newval > oldval) *psub |= CF;
- if ((val^oldval) & (oldval^newval) & 0x80) *psub |= VF;
- psub++;
-
- // sbc with carry set
- val = oldval - newval - 1;
- *psbc = NF | ((newval) ? ((newval & 0x80) ? SF : 0) : ZF);
- *psbc |= (newval & (YF | XF)); // undocumented flag bits 5+3
- if ((newval & 0x0f) >= (oldval & 0x0f)) *psbc |= HF;
- if (newval >= oldval) *psbc |= CF;
- if ((val^oldval) & (oldval^newval) & 0x80) *psbc |= VF;
- psbc++;
- }
- }
-
for (int i = 0; i < 256; i++)
{
int p = 0;
diff --git a/src/devices/cpu/z80/z80.h b/src/devices/cpu/z80/z80.h
index 0978b03cbbe..ec111c3cd32 100644
--- a/src/devices/cpu/z80/z80.h
+++ b/src/devices/cpu/z80/z80.h
@@ -77,6 +77,7 @@ protected:
void illegal_1();
void illegal_2();
+ u8 flags_szyxc(u16 value);
void halt();
void leave_halt();
@@ -88,7 +89,7 @@ protected:
void rra();
void add_a(u8 value);
void adc_a(u8 value);
- void sub(u8 value);
+ void sub_a(u8 value);
void sbc_a(u8 value);
void neg();
void daa();
@@ -187,9 +188,6 @@ protected:
static u8 SZP[0x100]; // zero, sign and parity flags
static u8 SZHV_inc[0x100]; // zero, sign, half carry and overflow flags INC r8
static u8 SZHV_dec[0x100]; // zero, sign, half carry and overflow flags DEC r8
-
- static u8 SZHVC_add[2 * 0x100 * 0x100];
- static u8 SZHVC_sub[2 * 0x100 * 0x100];
};
DECLARE_DEVICE_TYPE(Z80, z80_device)
diff --git a/src/devices/cpu/z80/z80.lst b/src/devices/cpu/z80/z80.lst
index 202776169f6..e666dc6444a 100644
--- a/src/devices/cpu/z80/z80.lst
+++ b/src/devices/cpu/z80/z80.lst
@@ -3605,10 +3605,10 @@ dd93 # DB DD
call jump 0093
dd94 # SUB HX
- sub(HX);
+ sub_a(HX);
dd95 # SUB LX
- sub(LX);
+ sub_a(LX);
dd96 # SUB (IX+o)
call eax
@@ -3616,7 +3616,7 @@ dd96 # SUB (IX+o)
5 * call nomreq_addr
TADR = m_ea;
call rm
- sub(TDAT8);
+ sub_a(TDAT8);
dd97 # DB DD
illegal_1();
@@ -4693,10 +4693,10 @@ fd93 # DB FD
call jump 0093
fd94 # SUB HY
- sub(HY);
+ sub_a(HY);
fd95 # SUB LY
- sub(LY);
+ sub_a(LY);
fd96 # SUB (IY+o)
call eay
@@ -4704,7 +4704,7 @@ fd96 # SUB (IY+o)
5 * call nomreq_addr
TADR = m_ea;
call rm
- sub(TDAT8);
+ sub_a(TDAT8);
fd97 # DB FD
illegal_1();
@@ -6490,30 +6490,30 @@ edff # DB ED
adc_a(A);
0090 # SUB B
- sub(B);
+ sub_a(B);
0091 # SUB C
- sub(C);
+ sub_a(C);
0092 # SUB D
- sub(D);
+ sub_a(D);
0093 # SUB E
- sub(E);
+ sub_a(E);
0094 # SUB H
- sub(H);
+ sub_a(H);
0095 # SUB L
- sub(L);
+ sub_a(L);
0096 # SUB (HL)
TADR = HL;
call rm
- sub(TDAT8);
+ sub_a(TDAT8);
0097 # SUB A
- sub(A);
+ sub_a(A);
0098 # SBC A,B
sbc_a(B);
@@ -6733,7 +6733,7 @@ edff # DB ED
00d6 # SUB n
call arg
- sub(TDAT8);
+ sub_a(TDAT8);
00d7 # RST 2
call rst 0x10