diff options
Diffstat (limited to 'src/devices/cpu')
-rw-r--r-- | src/devices/cpu/alto2/a2ether.cpp | 2 | ||||
-rw-r--r-- | src/devices/cpu/alto2/a2ether.h | 78 | ||||
-rw-r--r-- | src/devices/cpu/sh/sh3comn.cpp | 8 | ||||
-rw-r--r-- | src/devices/cpu/upd7725/upd7725.cpp | 30 | ||||
-rw-r--r-- | src/devices/cpu/upd7725/upd7725.h | 10 | ||||
-rw-r--r-- | src/devices/cpu/z80/z80.cpp | 110 | ||||
-rw-r--r-- | src/devices/cpu/z80/z80.h | 6 | ||||
-rw-r--r-- | src/devices/cpu/z80/z80.lst | 30 |
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 |