trunk/src/emu/cpu/m6809/hd6309.c
| r31356 | r31357 | |
| 174 | 174 | } |
| 175 | 175 | |
| 176 | 176 | |
| 177 | //------------------------------------------------- |
| 178 | // device_pre_save - device-specific pre-save |
| 179 | //------------------------------------------------- |
| 177 | 180 | |
| 181 | void hd6309_device::device_pre_save() |
| 182 | { |
| 183 | if (m_reg8 == &m_d.b.h) m_reg = HD6309_A; |
| 184 | else if (m_reg8 == &m_d.b.l) m_reg = HD6309_B; |
| 185 | else if (m_reg8 == &m_w.b.h) m_reg = HD6309_E; |
| 186 | else if (m_reg8 == &m_w.b.l) m_reg = HD6309_F; |
| 187 | else if (m_reg8 == &m_cc) m_reg = HD6309_CC; |
| 188 | else if (m_reg8 == &m_dp) m_reg = HD6309_DP; |
| 189 | else if (m_reg8 == &m_md) m_reg = HD6309_MD; |
| 190 | else if (m_reg8 == &m_temp.b.l) m_reg = HD6309_ZERO_BYTE; |
| 191 | |
| 192 | else if (m_reg16 == &m_d) m_reg = HD6309_D; |
| 193 | else if (m_reg16 == &m_x) m_reg = HD6309_X; |
| 194 | else if (m_reg16 == &m_y) m_reg = HD6309_Y; |
| 195 | else if (m_reg16 == &m_u) m_reg = HD6309_U; |
| 196 | else if (m_reg16 == &m_s) m_reg = HD6309_S; |
| 197 | else if (m_reg16 == &m_pc) m_reg = HD6309_PC; |
| 198 | else if (m_reg16 == &m_w) m_reg = HD6309_W; |
| 199 | else if (m_reg16 == &m_v) m_reg = HD6309_V; |
| 200 | else if (m_reg16 == &m_temp) m_reg = HD6309_ZERO_WORD; |
| 201 | else |
| 202 | m_reg = 0; |
| 203 | } |
| 204 | |
| 205 | |
| 178 | 206 | //------------------------------------------------- |
| 207 | // device_post_load - device-specific post-load |
| 208 | //------------------------------------------------- |
| 209 | |
| 210 | void hd6309_device::device_post_load() |
| 211 | { |
| 212 | m_reg8 = NULL; |
| 213 | m_reg16 = NULL; |
| 214 | |
| 215 | switch(m_reg) |
| 216 | { |
| 217 | case HD6309_A: |
| 218 | set_regop8(m_d.b.h); |
| 219 | break; |
| 220 | case HD6309_B: |
| 221 | set_regop8(m_d.b.l); |
| 222 | break; |
| 223 | case HD6309_E: |
| 224 | set_regop8(m_w.b.h); |
| 225 | break; |
| 226 | case HD6309_F: |
| 227 | set_regop8(m_w.b.l); |
| 228 | break; |
| 229 | case HD6309_CC: |
| 230 | set_regop8(m_cc); |
| 231 | break; |
| 232 | case HD6309_DP: |
| 233 | set_regop8(m_dp); |
| 234 | break; |
| 235 | case HD6309_MD: |
| 236 | set_regop8(m_md); |
| 237 | break; |
| 238 | case HD6309_ZERO_BYTE: |
| 239 | set_regop8(m_temp.b.l); |
| 240 | break; |
| 241 | |
| 242 | case HD6309_D: |
| 243 | set_regop16(m_d); |
| 244 | break; |
| 245 | case HD6309_X: |
| 246 | set_regop16(m_x); |
| 247 | break; |
| 248 | case HD6309_Y: |
| 249 | set_regop16(m_y); |
| 250 | break; |
| 251 | case HD6309_U: |
| 252 | set_regop16(m_u); |
| 253 | break; |
| 254 | case HD6309_S: |
| 255 | set_regop16(m_s); |
| 256 | break; |
| 257 | case HD6309_PC: |
| 258 | set_regop16(m_pc); |
| 259 | break; |
| 260 | case HD6309_W: |
| 261 | set_regop16(m_w); |
| 262 | break; |
| 263 | case HD6309_V: |
| 264 | set_regop16(m_v); |
| 265 | break; |
| 266 | case HD6309_ZERO_WORD: |
| 267 | set_regop16(m_temp); |
| 268 | break; |
| 269 | } |
| 270 | } |
| 271 | |
| 272 | |
| 273 | //------------------------------------------------- |
| 179 | 274 | // disasm_min_opcode_bytes - return the length |
| 180 | 275 | // of the shortest instruction, in bytes |
| 181 | 276 | //------------------------------------------------- |
trunk/src/emu/cpu/m6809/m6809.c
| r31356 | r31357 | |
| 122 | 122 | |
| 123 | 123 | void m6809_base_device::device_start() |
| 124 | 124 | { |
| 125 | | m_program = &space(AS_PROGRAM); |
| 126 | | m_direct = &m_program->direct(); |
| 125 | m_direct = &m_addrspace[AS_PROGRAM]->direct(); |
| 127 | 126 | |
| 128 | 127 | m_lic_func.resolve_safe(); |
| 129 | 128 | |
| r31356 | r31357 | |
| 202 | 201 | m_cc |= CC_I; // IRQ disabled |
| 203 | 202 | m_cc |= CC_F; // FIRQ disabled |
| 204 | 203 | |
| 205 | | m_pc.b.h = m_program->read_byte(VECTOR_RESET_FFFE + 0); |
| 206 | | m_pc.b.l = m_program->read_byte(VECTOR_RESET_FFFE + 1); |
| 204 | m_pc.b.h = m_addrspace[AS_PROGRAM]->read_byte(VECTOR_RESET_FFFE + 0); |
| 205 | m_pc.b.l = m_addrspace[AS_PROGRAM]->read_byte(VECTOR_RESET_FFFE + 1); |
| 207 | 206 | |
| 208 | 207 | // reset sub-instruction state |
| 209 | 208 | reset_state(); |
trunk/src/emu/cpu/m6809/m6809.h
| r31356 | r31357 | |
| 129 | 129 | UINT8 m_opcode; |
| 130 | 130 | |
| 131 | 131 | // other internal state |
| 132 | UINT8 * m_reg8; |
| 133 | PAIR16 * m_reg16; |
| 134 | int m_reg; |
| 132 | 135 | bool m_nmi_line; |
| 133 | 136 | bool m_nmi_asserted; |
| 134 | 137 | bool m_firq_line; |
| r31356 | r31357 | |
| 146 | 149 | void eat_remaining(); |
| 147 | 150 | |
| 148 | 151 | // read a byte from given memory location |
| 149 | | ATTR_FORCE_INLINE UINT8 read_memory(UINT16 address) { eat(1); return m_program->read_byte(address); } |
| 152 | ATTR_FORCE_INLINE UINT8 read_memory(UINT16 address) { eat(1); return m_addrspace[AS_PROGRAM]->read_byte(address); } |
| 150 | 153 | |
| 151 | 154 | // write a byte to given memory location |
| 152 | | ATTR_FORCE_INLINE void write_memory(UINT16 address, UINT8 data) { eat(1); m_program->write_byte(address, data); } |
| 155 | ATTR_FORCE_INLINE void write_memory(UINT16 address, UINT8 data) { eat(1); m_addrspace[AS_PROGRAM]->write_byte(address, data); } |
| 153 | 156 | |
| 154 | 157 | // read_opcode() is like read_memory() except it is used for reading opcodes. In the case of a system |
| 155 | 158 | // with memory mapped I/O, this function can be used to greatly speed up emulation. |
| r31356 | r31357 | |
| 241 | 244 | private: |
| 242 | 245 | // address spaces |
| 243 | 246 | const address_space_config m_program_config; |
| 244 | | address_space * m_program; |
| 245 | 247 | direct_read_data * m_direct; |
| 246 | 248 | |
| 247 | 249 | // other state |
| 248 | 250 | UINT32 m_state; |
| 249 | | int m_reg; |
| 250 | | UINT8 * m_reg8; |
| 251 | | PAIR16 * m_reg16; |
| 252 | 251 | bool m_cond; |
| 253 | 252 | |
| 254 | 253 | // incidentals |