trunk/src/emu/cpu/m6809/m6809inl.h
| r21726 | r21727 | |
| 124 | 124 | |
| 125 | 125 | |
| 126 | 126 | //------------------------------------------------- |
| 127 | // match_target_bytes |
| 128 | //------------------------------------------------- |
| 129 | |
| 130 | inline ATTR_FORCE_INLINE bool m6809_base_device::match_target_bytes(UINT16 address, const UINT8 *bytes, int length) |
| 131 | { |
| 132 | UINT8 *start_raw = (UINT8 *) m_direct->read_raw_ptr(address); |
| 133 | UINT8 *start_decrypted = (UINT8 *) m_direct->read_decrypted_ptr(address); |
| 134 | UINT8 *end_raw = (UINT8 *) m_direct->read_raw_ptr(address + length - 1); |
| 135 | UINT8 *end_decrypted = (UINT8 *) m_direct->read_decrypted_ptr(address + length - 1); |
| 136 | |
| 137 | return (start_raw != NULL) |
| 138 | && (end_raw != NULL) |
| 139 | && (start_raw == start_decrypted) |
| 140 | && (end_raw == end_decrypted) |
| 141 | && (start_raw + length - 1 == end_raw) |
| 142 | && !memcmp(start_raw, bytes, length); |
| 143 | } |
| 144 | |
| 145 | |
| 146 | //------------------------------------------------- |
| 127 | 147 | // burn_any_delay_loops - optimization for delay |
| 128 | 148 | // loops |
| 129 | 149 | //------------------------------------------------- |
| 130 | 150 | |
| 131 | 151 | inline ATTR_FORCE_INLINE void m6809_base_device::burn_any_delay_loops() |
| 132 | 152 | { |
| 153 | static const UINT8 target_bytes[] = { 0x30, 0x1F, 0x26, 0xFC }; |
| 154 | |
| 133 | 155 | if ((m_opcode == 0x26) |
| 134 | 156 | && !(m_cc & CC_Z) |
| 135 | 157 | && !(machine().debug_flags & DEBUG_FLAG_CALL_HOOK) |
| 136 | | && (read_opcode_arg(m_pc.w) == 0xFC) |
| 137 | | && (read_opcode(m_pc.w - 3) == 0x30) |
| 138 | | && (read_opcode_arg(m_pc.w - 2) == 0x1F)) |
| 158 | && match_target_bytes(m_pc.w - 3, target_bytes, ARRAY_LENGTH(target_bytes))) |
| 139 | 159 | { |
| 140 | 160 | // LEAX -1,X ; BNE * |
| 141 | 161 | UINT16 burned_loops = MIN((int) m_x.w - 1, m_icount / 8); |