trunk/src/emu/cpu/amis2000/amis2000.c
| r243257 | r243258 | |
| 134 | 134 | // zerofill |
| 135 | 135 | memset(m_callstack, 0, sizeof(m_callstack)); |
| 136 | 136 | m_pc = 0; |
| 137 | m_ppr = 0; |
| 138 | m_pbr = 0; |
| 139 | m_pp_index = 0; |
| 137 | 140 | m_skip = false; |
| 138 | 141 | m_op = 0; |
| 139 | 142 | m_f = 0; |
| r243257 | r243258 | |
| 148 | 151 | // register for savestates |
| 149 | 152 | save_item(NAME(m_callstack)); |
| 150 | 153 | save_item(NAME(m_pc)); |
| 154 | save_item(NAME(m_ppr)); |
| 155 | save_item(NAME(m_pbr)); |
| 156 | save_item(NAME(m_pp_index)); |
| 151 | 157 | save_item(NAME(m_skip)); |
| 152 | 158 | save_item(NAME(m_op)); |
| 153 | 159 | save_item(NAME(m_f)); |
| r243257 | r243258 | |
| 182 | 188 | void amis2000_device::device_reset() |
| 183 | 189 | { |
| 184 | 190 | m_pc = 0; |
| 191 | m_skip = false; |
| 192 | m_op = 0; |
| 185 | 193 | } |
| 186 | 194 | |
| 187 | 195 | |
| r243257 | r243258 | |
| 197 | 205 | while (m_icount > 0) |
| 198 | 206 | { |
| 199 | 207 | m_icount--; |
| 208 | |
| 209 | // increase PP prefix count |
| 210 | if ((m_op & 0xf0) == 0x60) |
| 211 | { |
| 212 | if (m_pp_index < 2) |
| 213 | m_pp_index++; |
| 214 | } |
| 215 | else |
| 216 | m_pp_index = 0; |
| 200 | 217 | |
| 201 | 218 | debugger_instruction_hook(this, m_pc); |
| 202 | 219 | m_op = m_program->read_byte(m_pc); |
trunk/src/emu/cpu/amis2000/amis2000.h
| r243257 | r243258 | |
| 72 | 72 | |
| 73 | 73 | UINT8 m_bu_bits; |
| 74 | 74 | UINT16 m_bu_mask; |
| 75 | | UINT8 m_callstack_bits; |
| 75 | UINT8 m_callstack_bits; // number of program counter bits held in callstack |
| 76 | 76 | UINT16 m_callstack_mask; |
| 77 | 77 | UINT8 m_callstack_depth; // callstack levels: 3 on 2000/2150, 5 on 2200/2400 |
| 78 | 78 | UINT16 m_callstack[5]; // max 5 |
| 79 | 79 | |
| 80 | | UINT16 m_pc; |
| 81 | | bool m_skip; |
| 80 | UINT16 m_pc; // 13-bit program counter |
| 81 | UINT8 m_ppr; // prepared page register (PP 1) |
| 82 | UINT8 m_pbr; // prepared bank register (PP 2) |
| 83 | UINT8 m_pp_index; // number of handled PP prefixes |
| 84 | bool m_skip; // skip next opcode, including PP prefixes |
| 82 | 85 | UINT8 m_op; |
| 83 | 86 | UINT8 m_f; // generic flags: 2 on 2000/2150, 6 on 2200/2400 |
| 84 | 87 | UINT8 m_carry; // carry flag |
| r243257 | r243258 | |
| 99 | 102 | |
| 100 | 103 | UINT8 ram_r(); |
| 101 | 104 | void ram_w(UINT8 data); |
| 105 | void pop_callstack(); |
| 106 | void push_callstack(); |
| 102 | 107 | void op_illegal(); |
| 103 | 108 | |
| 104 | 109 | void op_lai(); |
trunk/src/emu/cpu/amis2000/amis2000op.inc
| r243257 | r243258 | |
| 14 | 14 | m_data->write_byte(address, data & 0xf); |
| 15 | 15 | } |
| 16 | 16 | |
| 17 | void amis2000_device::pop_callstack() |
| 18 | { |
| 19 | m_pc = (m_pc & ~m_callstack_mask) | (m_callstack[0] & m_callstack_mask); |
| 20 | for (int i = 0; i < m_callstack_depth-1; i++) |
| 21 | { |
| 22 | m_callstack[i] = m_callstack[i+1]; |
| 23 | m_callstack[i+1] = 0; |
| 24 | } |
| 25 | } |
| 26 | |
| 27 | void amis2000_device::push_callstack() |
| 28 | { |
| 29 | for (int i = m_callstack_depth-1; i >= 1; i--) |
| 30 | { |
| 31 | m_callstack[i] = m_callstack[i-1]; |
| 32 | } |
| 33 | m_callstack[0] = m_pc & m_callstack_mask; |
| 34 | } |
| 35 | |
| 17 | 36 | void amis2000_device::op_illegal() |
| 18 | 37 | { |
| 19 | 38 | logerror("%s unknown opcode $%02X at $%04X\n", tag(), m_op, m_pc); |
| r243257 | r243258 | |
| 207 | 226 | void amis2000_device::op_pp() |
| 208 | 227 | { |
| 209 | 228 | // PP _X: prepare page/bank with _X |
| 210 | | op_illegal(); |
| 229 | UINT8 param = ~m_op & 0x0f; |
| 230 | if (m_pp_index == 0) |
| 231 | m_ppr = param; |
| 232 | else |
| 233 | m_pbr = param & 7; |
| 211 | 234 | } |
| 212 | 235 | |
| 213 | 236 | void amis2000_device::op_jmp() |
| 214 | 237 | { |
| 215 | 238 | // JMP X: jump to X(+PP) |
| 216 | | op_illegal(); |
| 239 | UINT16 mask = 0x3f; |
| 240 | UINT16 param = m_op & mask; |
| 241 | if (m_pp_index > 0) |
| 242 | { |
| 243 | param |= m_ppr << 6; |
| 244 | mask |= 0x3c0; |
| 245 | } |
| 246 | if (m_pp_index > 1) |
| 247 | { |
| 248 | param |= m_pbr << 10; |
| 249 | mask |= 0x1c00; |
| 250 | } |
| 251 | m_pc = (m_pc & ~mask) | param; |
| 217 | 252 | } |
| 218 | 253 | |
| 219 | 254 | void amis2000_device::op_jms() |
| 220 | 255 | { |
| 221 | 256 | // JMS X: call to X(+PP) |
| 222 | | op_illegal(); |
| 257 | m_icount--; |
| 258 | push_callstack(); |
| 259 | if (m_pp_index == 0) |
| 260 | { |
| 261 | // subroutines default location is page 15 |
| 262 | m_ppr = 0xf; |
| 263 | m_pp_index++; |
| 264 | } |
| 265 | op_jmp(); |
| 223 | 266 | } |
| 224 | 267 | |
| 225 | 268 | void amis2000_device::op_rt() |
| 226 | 269 | { |
| 227 | 270 | // RT: return from subroutine |
| 228 | | op_illegal(); |
| 271 | pop_callstack(); |
| 229 | 272 | } |
| 230 | 273 | |
| 231 | 274 | void amis2000_device::op_rts() |
| 232 | 275 | { |
| 233 | 276 | // RTS: return from subroutine and skip next |
| 234 | | op_illegal(); |
| 277 | op_rt(); |
| 278 | m_skip = true; |
| 235 | 279 | } |
| 236 | 280 | |
| 237 | 281 | void amis2000_device::op_nop() |