trunk/src/emu/cpu/alph8201/alph8201.c
| r23802 | r23803 | |
| 151 | 151 | #include "debugger.h" |
| 152 | 152 | #include "alph8201.h" |
| 153 | 153 | |
| 154 | |
| 155 | const device_type ALPHA8201 = &device_creator<alpha8201_cpu_device>; |
| 156 | const device_type ALPHA8301 = &device_creator<alpha8301_cpu_device>; |
| 157 | |
| 158 | |
| 154 | 159 | /* instruction cycle count */ |
| 155 | 160 | #define C1 16 |
| 156 | 161 | #define C2 32 |
| r23802 | r23803 | |
| 162 | 167 | #define BREAK_ON_UNKNOWN_OPCODE 0 |
| 163 | 168 | #define BREAK_ON_UNCERTAIN_OPCODE 0 |
| 164 | 169 | |
| 165 | | /* MAME is unnecessary */ |
| 166 | | #define HANDLE_HALT_LINE 0 |
| 167 | 170 | |
| 168 | | #define M_RDMEM(A) cpustate->program->read_byte(A) |
| 169 | | #define M_WRMEM(A,V) cpustate->program->write_byte(A, V) |
| 170 | | #define M_RDOP(A) cpustate->direct->read_decrypted_byte(A) |
| 171 | | #define M_RDOP_ARG(A) cpustate->direct->read_raw_byte(A) |
| 171 | #define FN(x) &alpha8201_cpu_device::x |
| 172 | 172 | |
| 173 | | struct alpha8201_state |
| 173 | |
| 174 | alpha8201_cpu_device::alpha8201_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 175 | : cpu_device(mconfig, ALPHA8201, "ALPHA-8201", tag, owner, clock) |
| 176 | , m_program_config("program", ENDIANNESS_LITTLE, 8, 10, 0) |
| 177 | , m_io_config("io", ENDIANNESS_LITTLE, 8, 6, 0) |
| 178 | , m_opmap(opcode_8201) |
| 174 | 179 | { |
| 175 | | UINT8 RAM[8*8]; /* internal GP register 8 * 8bank */ |
| 176 | | unsigned PREVPC; |
| 177 | | PAIR retptr; /* for 8301, return address of CALL */ |
| 178 | | PAIR pc; /* 2bit+8bit program counter */ |
| 179 | | UINT8 regPtr; /* RB register base */ |
| 180 | | UINT8 mb; /* MB memory bank reg. latch after Branch */ |
| 181 | | UINT8 cf; /* C flag */ |
| 182 | | UINT8 zf; /* Z flag */ |
| 183 | | UINT8 savec; /* for 8301, save flags */ |
| 184 | | UINT8 savez; /* for 8301, save flags */ |
| 185 | | // |
| 186 | | PAIR ix0; /* 8bit memory read index reg. */ |
| 187 | | PAIR ix1; /* 8bitmemory read index reg. */ |
| 188 | | PAIR ix2; /* 8bitmemory write index reg. */ |
| 189 | | UINT8 lp0; /* 8bit loop reg. */ |
| 190 | | UINT8 lp1; /* 8bit loop reg. */ |
| 191 | | UINT8 lp2; /* 8bit loop reg. */ |
| 192 | | UINT8 A; /* 8bit accumerator */ |
| 193 | | UINT8 B; /* 8bit regiser */ |
| 194 | | // |
| 195 | | #if HANDLE_HALT_LINE |
| 196 | | UINT8 halt; /* halt input line */ |
| 197 | | #endif |
| 180 | } |
| 198 | 181 | |
| 199 | | legacy_cpu_device *device; |
| 200 | | address_space *program; |
| 201 | | direct_read_data *direct; |
| 202 | | int icount; |
| 203 | | int inst_cycles; |
| 204 | | }; |
| 205 | 182 | |
| 206 | | /* The opcode table now is a combination of cycle counts and function pointers */ |
| 207 | | struct s_opcode { |
| 208 | | unsigned cycles; |
| 209 | | void (*function) (alpha8201_state *cpustate); |
| 210 | | }; |
| 183 | alpha8201_cpu_device::alpha8201_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock) |
| 184 | : cpu_device(mconfig, type, name, tag, owner, clock) |
| 185 | , m_program_config("program", ENDIANNESS_LITTLE, 8, 10, 0) |
| 186 | , m_io_config("io", ENDIANNESS_LITTLE, 8, 6, 0) |
| 187 | , m_opmap(opcode_8201) |
| 188 | { |
| 189 | } |
| 211 | 190 | |
| 212 | | |
| 213 | | #define PC pc.w.l |
| 214 | | #define PCL pc.b.l |
| 215 | | #define RD_REG(x) cpustate->RAM[(cpustate->regPtr<<3)+(x)] |
| 216 | | #define WR_REG(x,d) cpustate->RAM[(cpustate->regPtr<<3)+(x)]=(d) |
| 217 | | #define IX0 ix0.b.l |
| 218 | | #define IX1 ix1.b.l |
| 219 | | #define IX2 ix2.b.l |
| 220 | | #define BIX0 ix0.w.l |
| 221 | | #define BIX1 ix1.w.l |
| 222 | | #define BIX2 ix2.w.l |
| 223 | | #define LP0 lp0 |
| 224 | | #define LP1 lp1 |
| 225 | | #define LP2 lp2 |
| 226 | | |
| 227 | | INLINE alpha8201_state *get_safe_token(device_t *device) |
| 191 | alpha8301_cpu_device::alpha8301_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 192 | : alpha8201_cpu_device(mconfig, ALPHA8301, "ALPHA-8301", tag, owner, clock) |
| 228 | 193 | { |
| 229 | | assert(device != NULL); |
| 230 | | assert(device->type() == ALPHA8201 || |
| 231 | | device->type() == ALPHA8301); |
| 232 | | return (alpha8201_state *)downcast<legacy_cpu_device *>(device)->token(); |
| 194 | m_opmap = opcode_8301; |
| 233 | 195 | } |
| 234 | 196 | |
| 197 | |
| 235 | 198 | /* Get next opcode argument and increment program counter */ |
| 236 | | INLINE unsigned M_RDMEM_OPCODE (alpha8201_state *cpustate) |
| 199 | unsigned alpha8201_cpu_device::M_RDMEM_OPCODE() |
| 237 | 200 | { |
| 238 | 201 | unsigned retval; |
| 239 | | retval=M_RDOP_ARG(cpustate->PC); |
| 240 | | cpustate->PCL++; |
| 202 | retval=M_RDOP_ARG(m_pc.w.l); |
| 203 | m_pc.b.l++; |
| 241 | 204 | return retval; |
| 242 | 205 | } |
| 243 | 206 | |
| 244 | | INLINE void M_ADD(alpha8201_state *cpustate, UINT8 dat) |
| 207 | void alpha8201_cpu_device::M_ADD(UINT8 dat) |
| 245 | 208 | { |
| 246 | | UINT16 temp = cpustate->A + dat; |
| 247 | | cpustate->A = temp & 0xff; |
| 248 | | cpustate->zf = (cpustate->A==0); |
| 249 | | cpustate->cf = temp>>8; |
| 209 | UINT16 temp = m_A + dat; |
| 210 | m_A = temp & 0xff; |
| 211 | m_zf = (m_A==0); |
| 212 | m_cf = temp>>8; |
| 250 | 213 | } |
| 251 | 214 | |
| 252 | | INLINE void M_ADDB(alpha8201_state *cpustate, UINT8 dat) |
| 215 | void alpha8201_cpu_device::M_ADDB(UINT8 dat) |
| 253 | 216 | { |
| 254 | | UINT16 temp = cpustate->B + dat; |
| 255 | | cpustate->B = temp & 0xff; |
| 256 | | cpustate->zf = (cpustate->B==0); |
| 257 | | cpustate->cf = temp>>8; |
| 217 | UINT16 temp = m_B + dat; |
| 218 | m_B = temp & 0xff; |
| 219 | m_zf = (m_B==0); |
| 220 | m_cf = temp>>8; |
| 258 | 221 | } |
| 259 | 222 | |
| 260 | | INLINE void M_SUB(alpha8201_state *cpustate, UINT8 dat) |
| 223 | void alpha8201_cpu_device::M_SUB(UINT8 dat) |
| 261 | 224 | { |
| 262 | | cpustate->cf = (cpustate->A>=dat); // cpustate->cf is No Borrow |
| 263 | | cpustate->A -= dat; |
| 264 | | cpustate->zf = (cpustate->A==0); |
| 225 | m_cf = (m_A>=dat); // m_cf is No Borrow |
| 226 | m_A -= dat; |
| 227 | m_zf = (m_A==0); |
| 265 | 228 | } |
| 266 | 229 | |
| 267 | | INLINE void M_AND(alpha8201_state *cpustate, UINT8 dat) |
| 230 | void alpha8201_cpu_device::M_AND(UINT8 dat) |
| 268 | 231 | { |
| 269 | | cpustate->A &= dat; |
| 270 | | cpustate->zf = (cpustate->A==0); |
| 232 | m_A &= dat; |
| 233 | m_zf = (m_A==0); |
| 271 | 234 | } |
| 272 | 235 | |
| 273 | | INLINE void M_OR(alpha8201_state *cpustate, UINT8 dat) |
| 236 | void alpha8201_cpu_device::M_OR(UINT8 dat) |
| 274 | 237 | { |
| 275 | | cpustate->A |= dat; |
| 276 | | cpustate->zf = (cpustate->A==0); |
| 238 | m_A |= dat; |
| 239 | m_zf = (m_A==0); |
| 277 | 240 | } |
| 278 | 241 | |
| 279 | | INLINE void M_XOR(alpha8201_state *cpustate, UINT8 dat) |
| 242 | void alpha8201_cpu_device::M_XOR(UINT8 dat) |
| 280 | 243 | { |
| 281 | | cpustate->A ^= dat; |
| 282 | | cpustate->zf = (cpustate->A==0); |
| 283 | | cpustate->cf = 0; |
| 244 | m_A ^= dat; |
| 245 | m_zf = (m_A==0); |
| 246 | m_cf = 0; |
| 284 | 247 | } |
| 285 | 248 | |
| 286 | | INLINE void M_JMP(alpha8201_state *cpustate, UINT8 dat) |
| 249 | void alpha8201_cpu_device::M_JMP(UINT8 dat) |
| 287 | 250 | { |
| 288 | | cpustate->PCL = dat; |
| 251 | m_pc.b.l = dat; |
| 289 | 252 | /* update pc page */ |
| 290 | | cpustate->pc.b.h = cpustate->ix0.b.h = cpustate->ix1.b.h = cpustate->ix2.b.h = cpustate->mb & 3; |
| 253 | m_pc.b.h = m_ix0.b.h = m_ix1.b.h = m_ix2.b.h = m_mb & 3; |
| 291 | 254 | } |
| 292 | 255 | |
| 293 | | INLINE void M_UNDEFINED(alpha8201_state *cpustate) |
| 256 | void alpha8201_cpu_device::M_UNDEFINED() |
| 294 | 257 | { |
| 295 | | logerror("alpha8201: cpustate->PC = %03x, Unimplemented opcode = %02x\n", cpustate->PC-1, M_RDMEM(cpustate->PC-1)); |
| 258 | logerror("alpha8201: PC = %03x, Unimplemented opcode = %02x\n", m_pc.w.l-1, M_RDMEM(m_pc.w.l-1)); |
| 296 | 259 | #if SHOW_MESSAGE_CONSOLE |
| 297 | | mame_printf_debug("alpha8201: cpustate->PC = %03x, Unimplemented opcode = %02x\n", cpustate->PC-1, M_RDMEM(cpustate->PC-1)); |
| 260 | mame_printf_debug("alpha8201: PC = %03x, Unimplemented opcode = %02x\n", m_pc.w.l-1, M_RDMEM(m_pc.w.l-1)); |
| 298 | 261 | #endif |
| 299 | 262 | #if BREAK_ON_UNKNOWN_OPCODE |
| 300 | | debugger_break(cpustate->device->machine()); |
| 263 | debugger_break(machine()); |
| 301 | 264 | #endif |
| 302 | 265 | } |
| 303 | 266 | |
| 304 | | INLINE void M_UNDEFINED2(alpha8201_state *cpustate) |
| 267 | void alpha8201_cpu_device::M_UNDEFINED2() |
| 305 | 268 | { |
| 306 | | UINT8 op = M_RDOP(cpustate->PC-1); |
| 307 | | UINT8 imm = M_RDMEM_OPCODE(cpustate); |
| 308 | | logerror("alpha8201: cpustate->PC = %03x, Unimplemented opcode = %02x,%02x\n", cpustate->PC-2, op,imm); |
| 269 | UINT8 op = M_RDOP(m_pc.w.l-1); |
| 270 | UINT8 imm = M_RDMEM_OPCODE(); |
| 271 | logerror("alpha8201: PC = %03x, Unimplemented opcode = %02x,%02x\n", m_pc.w.l-2, op,imm); |
| 309 | 272 | #if SHOW_MESSAGE_CONSOLE |
| 310 | | mame_printf_debug("alpha8201: cpustate->PC = %03x, Unimplemented opcode = %02x,%02x\n", cpustate->PC-2, op,imm); |
| 273 | mame_printf_debug("alpha8201: PC = %03x, Unimplemented opcode = %02x,%02x\n", m_pc.w.l-2, op,imm); |
| 311 | 274 | #endif |
| 312 | 275 | #if BREAK_ON_UNKNOWN_OPCODE |
| 313 | | debugger_break(cpustate->device->machine()); |
| 276 | debugger_break(machine()); |
| 314 | 277 | #endif |
| 315 | 278 | } |
| 316 | 279 | |
| 317 | | static void undefined(alpha8201_state *cpustate) { M_UNDEFINED(cpustate); } |
| 318 | | static void undefined2(alpha8201_state *cpustate) { M_UNDEFINED2(cpustate); } |
| 319 | 280 | |
| 320 | | static void nop(alpha8201_state *cpustate) { } |
| 321 | | static void rora(alpha8201_state *cpustate) { cpustate->cf = cpustate->A &1; cpustate->A = (cpustate->A>>1) | (cpustate->A<<7); } |
| 322 | | static void rola(alpha8201_state *cpustate) { cpustate->cf = (cpustate->A>>7)&1; cpustate->A = (cpustate->A<<1) | (cpustate->A>>7); } |
| 323 | | static void inc_b(alpha8201_state *cpustate) { M_ADDB(cpustate, 0x02); } |
| 324 | | static void dec_b(alpha8201_state *cpustate) { M_ADDB(cpustate, 0xfe); } |
| 325 | | static void inc_a(alpha8201_state *cpustate) { M_ADD(cpustate, 0x01); } |
| 326 | | static void dec_a(alpha8201_state *cpustate) { M_ADD(cpustate, 0xff); } |
| 327 | | static void cpl(alpha8201_state *cpustate) { cpustate->A ^= 0xff; }; |
| 281 | void alpha8201_cpu_device::stop() |
| 282 | { |
| 283 | UINT8 pcptr = M_RDMEM(0x001) & 0x1f; |
| 284 | M_WRMEM(pcptr,(M_RDMEM(pcptr)&0xf)+0x08); /* mark entry point ODD to HALT */ |
| 285 | m_mb |= 0x08; /* mark internal HALT state */ |
| 286 | } |
| 328 | 287 | |
| 329 | | static void ld_a_ix0_0(alpha8201_state *cpustate) { cpustate->A = M_RDMEM(cpustate->BIX0+0); } |
| 330 | | static void ld_a_ix0_1(alpha8201_state *cpustate) { cpustate->A = M_RDMEM(cpustate->BIX0+1); } |
| 331 | | static void ld_a_ix0_2(alpha8201_state *cpustate) { cpustate->A = M_RDMEM(cpustate->BIX0+2); } |
| 332 | | static void ld_a_ix0_3(alpha8201_state *cpustate) { cpustate->A = M_RDMEM(cpustate->BIX0+3); } |
| 333 | | static void ld_a_ix0_4(alpha8201_state *cpustate) { cpustate->A = M_RDMEM(cpustate->BIX0+4); } |
| 334 | | static void ld_a_ix0_5(alpha8201_state *cpustate) { cpustate->A = M_RDMEM(cpustate->BIX0+5); } |
| 335 | | static void ld_a_ix0_6(alpha8201_state *cpustate) { cpustate->A = M_RDMEM(cpustate->BIX0+6); } |
| 336 | | static void ld_a_ix0_7(alpha8201_state *cpustate) { cpustate->A = M_RDMEM(cpustate->BIX0+7); } |
| 337 | 288 | |
| 338 | | static void ld_a_ix1_0(alpha8201_state *cpustate) { cpustate->A = M_RDMEM(cpustate->BIX1+0); } |
| 339 | | static void ld_a_ix1_1(alpha8201_state *cpustate) { cpustate->A = M_RDMEM(cpustate->BIX1+1); } |
| 340 | | static void ld_a_ix1_2(alpha8201_state *cpustate) { cpustate->A = M_RDMEM(cpustate->BIX1+2); } |
| 341 | | static void ld_a_ix1_3(alpha8201_state *cpustate) { cpustate->A = M_RDMEM(cpustate->BIX1+3); } |
| 342 | | static void ld_a_ix1_4(alpha8201_state *cpustate) { cpustate->A = M_RDMEM(cpustate->BIX1+4); } |
| 343 | | static void ld_a_ix1_5(alpha8201_state *cpustate) { cpustate->A = M_RDMEM(cpustate->BIX1+5); } |
| 344 | | static void ld_a_ix1_6(alpha8201_state *cpustate) { cpustate->A = M_RDMEM(cpustate->BIX1+6); } |
| 345 | | static void ld_a_ix1_7(alpha8201_state *cpustate) { cpustate->A = M_RDMEM(cpustate->BIX1+7); } |
| 289 | const alpha8201_cpu_device::s_opcode alpha8201_cpu_device::opcode_8201[256]= |
| 290 | { |
| 291 | {C1, FN(nop) },{C1,FN(rora) },{C1, FN(rola) },{C1,FN(inc_b) },{C1,FN(dec_b) },{C1, FN(inc_a) },{C1, FN(dec_a) },{C1, FN(cpl) }, |
| 292 | {C2,FN(ld_a_ix0_0) },{C2,FN(ld_a_ix0_1)},{C2, FN(ld_a_ix0_2)},{C2,FN(ld_a_ix0_3)},{C2,FN(ld_a_ix0_4)},{C2,FN(ld_a_ix0_5)},{C2,FN(ld_a_ix0_6)},{C2,FN(ld_a_ix0_7)}, |
| 293 | {C2,FN(ld_a_ix1_0) },{C2,FN(ld_a_ix1_1)},{C2, FN(ld_a_ix1_2)},{C2,FN(ld_a_ix1_3)},{C2,FN(ld_a_ix1_4)},{C2,FN(ld_a_ix1_5)},{C2,FN(ld_a_ix1_6)},{C2,FN(ld_a_ix1_7)}, |
| 294 | {C2,FN(ld_ix2_0_a) },{C2,FN(ld_ix2_1_a)},{C2, FN(ld_ix2_2_a)},{C2,FN(ld_ix2_3_a)},{C2,FN(ld_ix2_4_a)},{C2,FN(ld_ix2_5_a)},{C2,FN(ld_ix2_6_a)},{C2,FN(ld_ix2_7_a)}, |
| 295 | /* 20 */ |
| 296 | {C2,FN(ld_ix0_0_b) },{C2,FN(ld_ix0_1_b)},{C2, FN(ld_ix0_2_b)},{C2,FN(ld_ix0_3_b)},{C2,FN(ld_ix0_4_b)},{C2,FN(ld_ix0_5_b)},{C2,FN(ld_ix0_6_b)},{C2,FN(ld_ix0_7_b)}, |
| 297 | {C2,FN(undefined) },{C2,FN(undefined) },{C2, FN(undefined) },{C2,FN(undefined) },{C2,FN(undefined) },{C2,FN(undefined) },{C2,FN(undefined) },{C2,FN(undefined) }, |
| 298 | {C2,FN(undefined) },{C2,FN(undefined) },{C2, FN(undefined) },{C2,FN(undefined) },{C2,FN(undefined) },{C2,FN(undefined) },{C2,FN(undefined) },{C2,FN(undefined) }, |
| 299 | {C2,FN(bit_r0_0) },{C2,FN(bit_r0_1) },{C2, FN(bit_r0_2) },{C2, FN(bit_r0_3) },{C2, FN(bit_r0_4) },{C2, FN(bit_r0_5) },{C2, FN(bit_r0_6) },{C2, FN(bit_r0_7) }, |
| 300 | /* 40 : 8201 */ |
| 301 | {C2, FN(ld_a_r0) },{C2, FN(ld_r0_a) },{C2, FN(ld_a_r1) },{C2, FN(ld_r1_a) },{C2, FN(ld_a_r2) },{C2, FN(ld_r2_a) },{C2, FN(ld_a_r3) },{C2, FN(ld_r3_a) }, |
| 302 | {C2, FN(ld_a_r4) },{C2, FN(ld_r4_a) },{C2, FN(ld_a_r5) },{C2, FN(ld_r5_a) },{C2, FN(ld_a_r6) },{C2, FN(ld_r6_a) },{C2, FN(ld_a_r7) },{C2, FN(ld_r7_a) }, |
| 303 | {C1, FN(add_a_r0) },{C1, FN(sub_a_r0) },{C1, FN(add_a_r1) },{C1, FN(sub_a_r1) },{C1, FN(add_a_r2) },{C1, FN(sub_a_r2) },{C1, FN(add_a_r3) },{C1, FN(sub_a_r3) }, |
| 304 | {C1, FN(add_a_r4) },{C1, FN(sub_a_r4) },{C1, FN(add_a_r5) },{C1, FN(sub_a_r5) },{C1, FN(add_a_r6) },{C1, FN(sub_a_r6) },{C1, FN(add_a_r7) },{C1, FN(sub_a_r7) }, |
| 305 | {C1, FN(and_a_r0) },{C1, FN(or_a_r0) },{C1, FN(and_a_r1) },{C1, FN(or_a_r1) },{C1, FN(and_a_r2) },{C1, FN(or_a_r2) },{C1, FN(and_a_r3) },{C1, FN(or_a_r3) }, |
| 306 | {C1, FN(and_a_r4) },{C1, FN(or_a_r4) },{C1, FN(and_a_r5) },{C1, FN(or_a_r5) },{C1, FN(and_a_r6) },{C1, FN(or_a_r6) },{C1, FN(and_a_r7) },{C1, FN(or_a_r7) }, |
| 307 | {C1, FN(add_ix0_0) },{C1, FN(add_ix0_1)},{C1, FN(add_ix0_2)},{C1, FN(add_ix0_3)},{C1, FN(add_ix0_4)},{C1, FN(add_ix0_5)},{C1, FN(add_ix0_6)},{C1, FN(add_ix0_7)}, |
| 308 | {C1, FN(add_ix0_8) },{C1, FN(add_ix0_9)},{C1, FN(add_ix0_a)},{C1, FN(add_ix0_b)},{C1, FN(add_ix0_c)},{C1, FN(add_ix0_d)},{C1, FN(add_ix0_e)},{C1, FN(add_ix0_f)}, |
| 309 | /* 80 : 8201 */ |
| 310 | {C1, FN(add_ix1_0) },{C1, FN(add_ix1_1)},{C1, FN(add_ix1_2)},{C1, FN(add_ix1_3)},{C1, FN(add_ix1_4)},{C1, FN(add_ix1_5)},{C1, FN(add_ix1_6)},{C1, FN(add_ix1_7)}, |
| 311 | {C1, FN(add_ix1_8) },{C1, FN(add_ix1_9)},{C1, FN(add_ix1_a)},{C1, FN(add_ix1_b)},{C1, FN(add_ix1_c)},{C1, FN(add_ix1_d)},{C1, FN(add_ix1_e)},{C1, FN(add_ix1_f)}, |
| 312 | {C1, FN(add_ix2_0) },{C1, FN(add_ix2_1)},{C1, FN(add_ix2_2)},{C1, FN(add_ix2_3)},{C1, FN(add_ix2_4)},{C1, FN(add_ix2_5)},{C1, FN(add_ix2_6)},{C1, FN(add_ix2_7)}, |
| 313 | {C1, FN(add_ix2_8) },{C1, FN(add_ix2_9)},{C1, FN(add_ix2_a)},{C1, FN(add_ix2_b)},{C1, FN(add_ix2_c)},{C1, FN(add_ix2_d)},{C1, FN(add_ix2_e)},{C1, FN(add_ix2_f)}, |
| 314 | {C1, FN(ld_base_0) },{C1, FN(ld_base_1)},{C1, FN(ld_base_2)},{C1, FN(ld_base_3)},{C1, FN(ld_base_4)},{C1, FN(ld_base_5)},{C1, FN(ld_base_6)},{C1, FN(ld_base_7)}, |
| 315 | {C1, FN(undefined) },{C1, FN(undefined)},{C1, FN(undefined)},{C1, FN(undefined)},{C1, FN(undefined)},{C1, FN(undefined)},{C1, FN(undefined)},{C1, FN(undefined)}, |
| 316 | {C1, FN(ld_bank_0) },{C1, FN(ld_bank_1)},{C1, FN(ld_bank_2)},{C1, FN(ld_bank_3)},{C2, FN(stop) },{C1, FN(undefined)},{C1, FN(undefined)},{C1, FN(undefined)}, |
| 317 | {C1, FN(undefined) },{C1, FN(undefined)},{C1, FN(undefined)},{C1, FN(undefined)},{C1, FN(undefined)},{C1, FN(undefined)},{C1, FN(undefined)},{C1, FN(undefined)}, |
| 318 | /* c0 : 8201 */ |
| 319 | {C2, FN(ld_ix0_n) },{C2, FN(ld_ix1_n) },{C2, FN(ld_ix2_n) },{C2, FN(ld_a_n) },{C2, FN(ld_lp0_n) },{C2, FN(ld_lp1_n) },{C2, FN(ld_lp2_n) },{C2, FN(ld_b_n) }, |
| 320 | {C2, FN(add_a_n) },{C2, FN(sub_a_n) },{C2, FN(and_a_n) },{C2, FN(or_a_n) },{C2, FN(djnz_lp0) },{C2, FN(djnz_lp1) },{C2, FN(djnz_lp2) },{C2, FN(jnz) }, |
| 321 | {C2, FN(jnc) },{C2, FN(jz) },{C2, FN(jmp) },{C2,FN(undefined2)},{C2,FN(undefined2)},{C2,FN(undefined2)},{C2,FN(undefined2)},{C2, FN(undefined2)}, |
| 322 | {C2, FN(undefined2) },{C2,FN(undefined2)},{C2,FN(undefined2)},{C2,FN(undefined2)},{C2,FN(undefined2)},{C2,FN(undefined2)},{C2,FN(undefined2)},{C2, FN(undefined2)}, |
| 323 | /* E0 : 8201*/ |
| 324 | {C1, FN(undefined) },{C1, FN(undefined)},{C1, FN(undefined)},{C1, FN(undefined)},{C1, FN(undefined)},{C1, FN(undefined)},{C1, FN(undefined)},{C1, FN(undefined)}, |
| 325 | {C1, FN(undefined) },{C1, FN(undefined)},{C1, FN(undefined)},{C1, FN(undefined)},{C1, FN(undefined)},{C1, FN(undefined)},{C1, FN(undefined)},{C1, FN(undefined)}, |
| 326 | {C1, FN(undefined) },{C1, FN(undefined)},{C1, FN(undefined)},{C1, FN(undefined)},{C1, FN(undefined)},{C1, FN(undefined)},{C1, FN(undefined)},{C1, FN(undefined)}, |
| 327 | {C1, FN(undefined) },{C1, FN(undefined)},{C1, FN(undefined)},{C1, FN(undefined)},{C1, FN(undefined)},{C1, FN(undefined)},{C1, FN(undefined)},{C1, FN(undefined) } |
| 328 | }; |
| 346 | 329 | |
| 347 | | static void ld_ix2_0_a(alpha8201_state *cpustate) { M_WRMEM(cpustate->BIX2+0,cpustate->A); } |
| 348 | | static void ld_ix2_1_a(alpha8201_state *cpustate) { M_WRMEM(cpustate->BIX2+1,cpustate->A); } |
| 349 | | static void ld_ix2_2_a(alpha8201_state *cpustate) { M_WRMEM(cpustate->BIX2+2,cpustate->A); } |
| 350 | | static void ld_ix2_3_a(alpha8201_state *cpustate) { M_WRMEM(cpustate->BIX2+3,cpustate->A); } |
| 351 | | static void ld_ix2_4_a(alpha8201_state *cpustate) { M_WRMEM(cpustate->BIX2+4,cpustate->A); } |
| 352 | | static void ld_ix2_5_a(alpha8201_state *cpustate) { M_WRMEM(cpustate->BIX2+5,cpustate->A); } |
| 353 | | static void ld_ix2_6_a(alpha8201_state *cpustate) { M_WRMEM(cpustate->BIX2+6,cpustate->A); } |
| 354 | | static void ld_ix2_7_a(alpha8201_state *cpustate) { M_WRMEM(cpustate->BIX2+7,cpustate->A); } |
| 355 | 330 | |
| 356 | | static void ld_ix0_0_b(alpha8201_state *cpustate) { cpustate->RAM[(cpustate->B>>1)&0x3f] = M_RDMEM(cpustate->BIX0+0); } |
| 357 | | static void ld_ix0_1_b(alpha8201_state *cpustate) { cpustate->RAM[(cpustate->B>>1)&0x3f] = M_RDMEM(cpustate->BIX0+1); } |
| 358 | | static void ld_ix0_2_b(alpha8201_state *cpustate) { cpustate->RAM[(cpustate->B>>1)&0x3f] = M_RDMEM(cpustate->BIX0+2); } |
| 359 | | static void ld_ix0_3_b(alpha8201_state *cpustate) { cpustate->RAM[(cpustate->B>>1)&0x3f] = M_RDMEM(cpustate->BIX0+3); } |
| 360 | | static void ld_ix0_4_b(alpha8201_state *cpustate) { cpustate->RAM[(cpustate->B>>1)&0x3f] = M_RDMEM(cpustate->BIX0+4); } |
| 361 | | static void ld_ix0_5_b(alpha8201_state *cpustate) { cpustate->RAM[(cpustate->B>>1)&0x3f] = M_RDMEM(cpustate->BIX0+5); } |
| 362 | | static void ld_ix0_6_b(alpha8201_state *cpustate) { cpustate->RAM[(cpustate->B>>1)&0x3f] = M_RDMEM(cpustate->BIX0+6); } |
| 363 | | static void ld_ix0_7_b(alpha8201_state *cpustate) { cpustate->RAM[(cpustate->B>>1)&0x3f] = M_RDMEM(cpustate->BIX0+7); } |
| 331 | const alpha8201_cpu_device::s_opcode alpha8201_cpu_device::opcode_8301[256]= |
| 332 | { |
| 333 | {C1, FN(nop) },{C1,FN(rora) },{C1, FN(rola) },{C1,FN(inc_b) },{C1,FN(dec_b) },{C1, FN(inc_a) },{C1, FN(dec_a) },{C1, FN(cpl) }, |
| 334 | {C2,FN(ld_a_ix0_0) },{C2,FN(ld_a_ix0_1)},{C2, FN(ld_a_ix0_2)},{C2,FN(ld_a_ix0_3)},{C2,FN(ld_a_ix0_4)},{C2,FN(ld_a_ix0_5)},{C2,FN(ld_a_ix0_6)},{C2,FN(ld_a_ix0_7)}, |
| 335 | {C2,FN(ld_a_ix1_0) },{C2,FN(ld_a_ix1_1)},{C2, FN(ld_a_ix1_2)},{C2,FN(ld_a_ix1_3)},{C2,FN(ld_a_ix1_4)},{C2,FN(ld_a_ix1_5)},{C2,FN(ld_a_ix1_6)},{C2,FN(ld_a_ix1_7)}, |
| 336 | {C2,FN(ld_ix2_0_a) },{C2,FN(ld_ix2_1_a)},{C2, FN(ld_ix2_2_a)},{C2,FN(ld_ix2_3_a)},{C2,FN(ld_ix2_4_a)},{C2,FN(ld_ix2_5_a)},{C2,FN(ld_ix2_6_a)},{C2,FN(ld_ix2_7_a)}, |
| 337 | /* 20 : 8301 */ |
| 338 | {C2,FN(ld_ix0_0_b) },{C2,FN(ld_ix0_1_b)},{C2, FN(ld_ix0_2_b)},{C2,FN(ld_ix0_3_b)},{C2,FN(ld_ix0_4_b)},{C2,FN(ld_ix0_5_b)},{C2,FN(ld_ix0_6_b)},{C2,FN(ld_ix0_7_b)}, |
| 339 | {C2,FN(undefined) },{C2,FN(undefined) },{C2, FN(undefined) },{C2,FN(undefined) },{C2,FN(undefined) },{C2,FN(undefined) },{C2,FN(undefined) },{C2,FN(undefined) }, |
| 340 | {C2,FN(undefined) },{C2,FN(undefined) },{C2, FN(undefined) },{C2,FN(undefined) },{C2,FN(undefined) },{C2,FN(undefined) },{C2,FN(undefined) },{C2,FN(undefined) }, |
| 341 | {C2,FN(bit_r0_0) },{C2,FN(bit_r0_1) },{C2, FN(bit_r0_2) },{C2, FN(bit_r0_3) },{C2, FN(bit_r0_4) },{C2, FN(bit_r0_5) },{C2, FN(bit_r0_6) },{C2, FN(bit_r0_7) }, |
| 342 | /* 40 : 8301 */ |
| 343 | {C2, FN(ld_a_r0) },{C2, FN(ld_r0_a) },{C2, FN(ld_a_r1) },{C2, FN(ld_r1_a) },{C2, FN(ld_a_r2) },{C2, FN(ld_r2_a) },{C2, FN(ld_a_r3) },{C2, FN(ld_r3_a) }, |
| 344 | {C2, FN(ld_a_r4) },{C2, FN(ld_r4_a) },{C2, FN(ld_a_r5) },{C2, FN(ld_r5_a) },{C2, FN(ld_a_r6) },{C2, FN(ld_r6_a) },{C2, FN(ld_a_r7) },{C2, FN(ld_r7_a) }, |
| 345 | {C1, FN(add_a_r0) },{C1, FN(sub_a_r0) },{C1, FN(add_a_r1) },{C1, FN(sub_a_r1) },{C1, FN(add_a_r2) },{C1, FN(sub_a_r2) },{C1, FN(add_a_r3) },{C1, FN(sub_a_r3) }, |
| 346 | {C1, FN(add_a_r4) },{C1, FN(sub_a_r4) },{C1, FN(add_a_r5) },{C1, FN(sub_a_r5) },{C1, FN(add_a_r6) },{C1, FN(sub_a_r6) },{C1, FN(add_a_r7) },{C1, FN(sub_a_r7) }, |
| 347 | /* 60 : 8301 */ |
| 348 | {C1, FN(and_a_r0) },{C1, FN(or_a_r0) },{C1, FN(and_a_r1) },{C1, FN(or_a_r1) },{C1, FN(and_a_r2) },{C1, FN(or_a_r2) },{C1, FN(and_a_r3) },{C1, FN(or_a_r3) }, |
| 349 | {C1, FN(and_a_r4) },{C1, FN(or_a_r4) },{C1, FN(and_a_r5) },{C1, FN(or_a_r5) },{C1, FN(and_a_r6) },{C1, FN(or_a_r6) },{C1, FN(and_a_r7) },{C1, FN(or_a_r7) }, |
| 350 | {C1, FN(add_ix0_0) },{C1, FN(add_ix0_1)},{C1, FN(add_ix0_2)},{C1, FN(add_ix0_3)},{C1, FN(add_ix0_4)},{C1, FN(add_ix0_5)},{C1, FN(add_ix0_6)},{C1, FN(add_ix0_7)}, |
| 351 | {C1, FN(add_ix0_8) },{C1, FN(add_ix0_9)},{C1, FN(add_ix0_a)},{C1, FN(add_ix0_b)},{C1, FN(add_ix0_c)},{C1, FN(add_ix0_d)},{C1, FN(add_ix0_e)},{C1, FN(add_ix0_f)}, |
| 352 | /* 80 : 8301 */ |
| 353 | {C1, FN(add_ix1_0) },{C1, FN(add_ix1_1)},{C1, FN(add_ix1_2)},{C1, FN(add_ix1_3)},{C1, FN(add_ix1_4)},{C1, FN(add_ix1_5)},{C1, FN(add_ix1_6)},{C1, FN(add_ix1_7)}, |
| 354 | {C1, FN(add_ix1_8) },{C1, FN(add_ix1_9)},{C1, FN(add_ix1_a)},{C1, FN(add_ix1_b)},{C1, FN(add_ix1_c)},{C1, FN(add_ix1_d)},{C1, FN(add_ix1_e)},{C1, FN(add_ix1_f)}, |
| 355 | {C1, FN(add_ix2_0) },{C1, FN(add_ix2_1)},{C1, FN(add_ix2_2)},{C1, FN(add_ix2_3)},{C1, FN(add_ix2_4)},{C1, FN(add_ix2_5)},{C1, FN(add_ix2_6)},{C1, FN(add_ix2_7)}, |
| 356 | {C1, FN(add_ix2_8) },{C1, FN(add_ix2_9)},{C1, FN(add_ix2_a)},{C1, FN(add_ix2_b)},{C1, FN(add_ix2_c)},{C1, FN(add_ix2_d)},{C1, FN(add_ix2_e)},{C1, FN(add_ix2_f)}, |
| 357 | /* A0 : 8301 */ |
| 358 | {C1, FN(ld_base_0) },{C1, FN(ld_base_1)},{C1, FN(ld_base_2)},{C1, FN(ld_base_3)},{C1, FN(ld_base_4)},{C1, FN(ld_base_5)},{C1, FN(ld_base_6)},{C1, FN(ld_base_7)}, |
| 359 | {C1, FN(undefined) },{C1, FN(undefined)},{C1, FN(undefined)},{C1, FN(undefined)},{C1, FN(undefined)},{C1, FN(undefined)},{C1, FN(undefined)},{C1, FN(undefined)}, |
| 360 | {C1, FN(ld_bank_0) },{C1, FN(ld_bank_1)},{C1, FN(ld_bank_2)},{C1, FN(ld_bank_3)},{C2, FN(stop) },{C1, FN(undefined)},{C1, FN(undefined)},{C1, FN(undefined)}, |
| 361 | {C1, FN(undefined) },{C1, FN(undefined)},{C1, FN(undefined)},{C1, FN(undefined)},{C1, FN(undefined)},{C1, FN(undefined)},{C1, FN(undefined)},{C1, FN(undefined)}, |
| 362 | /* c0 : 8301 */ |
| 363 | {C2, FN(ld_ix0_n) },{C2, FN(ld_ix1_n)},{C2, FN(ld_ix2_n) },{C2, FN(ld_a_n) },{C2, FN(ld_lp0_n) },{C2, FN(ld_lp1_n) },{C2, FN(ld_lp2_n) },{C2, FN(ld_b_n) }, |
| 364 | {C2, FN(add_a_n) },{C2, FN(sub_a_n) },{C2, FN(and_a_n) },{C2, FN(or_a_n) },{C2, FN(djnz_lp0) },{C2, FN(djnz_lp1) },{C2, FN(djnz_lp2) },{C2, FN(jnz) }, |
| 365 | {C2, FN(jnc) },{C2, FN(jz) },{C2, FN(jmp) },{C2,FN(undefined2)},{C2, FN(op_d4) },{C2, FN(op_d5) },{C2, FN(op_d6) },{C2, FN(op_d7) }, |
| 366 | {C2, FN(ld_a_abs) },{C2, FN(ld_abs_a)},{C2,FN(cmp_a_n) },{C2,FN(xor_a_n) },{C2, FN(ld_a_r) },{C2, FN(ld_r_a) },{C2, FN(jc) },{C2, FN(call)}, |
| 367 | /* E0 : 8301 */ |
| 368 | {C1, FN(exg_a_ix0) },{C1, FN(exg_a_ix1)},{C1, FN(exg_a_ix2)},{C1, FN(exg_a_lp1)},{C1, FN(exg_a_lp2)},{C1, FN(exg_a_b) },{C1, FN(exg_a_lp0)},{C1, FN(exg_a_rb) }, |
| 369 | {C1, FN(ld_ix0_a) },{C1, FN(ld_ix1_a) },{C1, FN(ld_ix2_a) },{C1, FN(ld_lp1_a) },{C1, FN(ld_lp2_a) },{C1, FN(ld_b_a) },{C1, FN(ld_lp0_a) },{C1, FN(ld_rb_a) }, |
| 370 | {C1,FN(exg_ix0_ix1)},{C1,FN(exg_ix0_ix2)},{C1,FN(op_rep_ld_ix2_b)},{C1, FN(op_rep_ld_b_ix0)},{C1, FN(save_zc)},{C1, FN(rest_zc)},{C1, FN(ld_rxb_a) },{C1, FN(ld_a_rxb) }, |
| 371 | {C1, FN(cmp_a_rxb) },{C1, FN(xor_a_rxb)},{C1, FN(add_a_cf) },{C1, FN(sub_a_cf) },{C1, FN(tst_a) },{C1, FN(clr_a) },{C1, FN(ld_a_ix0_a)},{C1, FN(ret) } |
| 372 | }; |
| 364 | 373 | |
| 365 | | static void bit_r0_0(alpha8201_state *cpustate) { cpustate->zf = RD_REG(0)&(1<<0)?0:1; } |
| 366 | | static void bit_r0_1(alpha8201_state *cpustate) { cpustate->zf = RD_REG(0)&(1<<1)?0:1; } |
| 367 | | static void bit_r0_2(alpha8201_state *cpustate) { cpustate->zf = RD_REG(0)&(1<<2)?0:1; } |
| 368 | | static void bit_r0_3(alpha8201_state *cpustate) { cpustate->zf = RD_REG(0)&(1<<3)?0:1; } |
| 369 | | static void bit_r0_4(alpha8201_state *cpustate) { cpustate->zf = RD_REG(0)&(1<<4)?0:1; } |
| 370 | | static void bit_r0_5(alpha8201_state *cpustate) { cpustate->zf = RD_REG(0)&(1<<5)?0:1; } |
| 371 | | static void bit_r0_6(alpha8201_state *cpustate) { cpustate->zf = RD_REG(0)&(1<<6)?0:1; } |
| 372 | | static void bit_r0_7(alpha8201_state *cpustate) { cpustate->zf = RD_REG(0)&(1<<7)?0:1; } |
| 373 | 374 | |
| 374 | | static void ld_a_n(alpha8201_state *cpustate) { cpustate->A = M_RDMEM_OPCODE(cpustate); } |
| 375 | /**************************************************************************** |
| 376 | * Initialize emulation |
| 377 | ****************************************************************************/ |
| 378 | void alpha8201_cpu_device::device_start() |
| 379 | { |
| 380 | m_program = &space(AS_PROGRAM); |
| 381 | m_direct = &m_program->direct(); |
| 375 | 382 | |
| 376 | | static void ld_a_r0(alpha8201_state *cpustate) { cpustate->A = RD_REG(0); cpustate->zf = (cpustate->A==0); } |
| 377 | | static void ld_a_r1(alpha8201_state *cpustate) { cpustate->A = RD_REG(1); cpustate->zf = (cpustate->A==0); } |
| 378 | | static void ld_a_r2(alpha8201_state *cpustate) { cpustate->A = RD_REG(2); cpustate->zf = (cpustate->A==0); } |
| 379 | | static void ld_a_r3(alpha8201_state *cpustate) { cpustate->A = RD_REG(3); cpustate->zf = (cpustate->A==0); } |
| 380 | | static void ld_a_r4(alpha8201_state *cpustate) { cpustate->A = RD_REG(4); cpustate->zf = (cpustate->A==0); } |
| 381 | | static void ld_a_r5(alpha8201_state *cpustate) { cpustate->A = RD_REG(5); cpustate->zf = (cpustate->A==0); } |
| 382 | | static void ld_a_r6(alpha8201_state *cpustate) { cpustate->A = RD_REG(6); cpustate->zf = (cpustate->A==0); } |
| 383 | | static void ld_a_r7(alpha8201_state *cpustate) { cpustate->A = RD_REG(7); cpustate->zf = (cpustate->A==0); } |
| 383 | state_add( ALPHA8201_PC, "PC", m_pc.w.l ).mask(0x3ff).formatstr("%03X"); |
| 384 | state_add( ALPHA8201_SP, "SP", m_sp ).callimport().callexport().formatstr("%02X"); |
| 385 | state_add( ALPHA8201_RB, "RB", m_regPtr ).mask(0x7); |
| 386 | state_add( ALPHA8201_MB, "MB", m_mb ).mask(0x3); |
| 387 | state_add( ALPHA8201_CF, "CF", m_cf ).mask(0x1); |
| 388 | state_add( ALPHA8201_ZF, "ZF", m_zf ).mask(0x1); |
| 389 | state_add( ALPHA8201_IX0, "IX0", m_ix0.b.l ); |
| 390 | state_add( ALPHA8201_IX1, "IX1", m_ix1.b.l ); |
| 391 | state_add( ALPHA8201_IX2, "IX2", m_ix2.b.l ); |
| 392 | state_add( ALPHA8201_LP0, "LP0", m_lp0 ); |
| 393 | state_add( ALPHA8201_LP1, "LP1", m_lp1 ); |
| 394 | state_add( ALPHA8201_LP2, "LP2", m_lp2 ); |
| 395 | state_add( ALPHA8201_A, "A", m_A ); |
| 396 | state_add( ALPHA8201_B, "B", m_B ); |
| 397 | state_add( ALPHA8201_R0, "R0", m_R[0] ).callimport().callexport().formatstr("%02X"); |
| 398 | state_add( ALPHA8201_R1, "R1", m_R[1] ).callimport().callexport().formatstr("%02X"); |
| 399 | state_add( ALPHA8201_R2, "R2", m_R[2] ).callimport().callexport().formatstr("%02X"); |
| 400 | state_add( ALPHA8201_R3, "R3", m_R[3] ).callimport().callexport().formatstr("%02X"); |
| 401 | state_add( ALPHA8201_R4, "R4", m_R[4] ).callimport().callexport().formatstr("%02X"); |
| 402 | state_add( ALPHA8201_R5, "R5", m_R[5] ).callimport().callexport().formatstr("%02X"); |
| 403 | state_add( ALPHA8201_R6, "R6", m_R[6] ).callimport().callexport().formatstr("%02X"); |
| 404 | state_add( ALPHA8201_R7, "R7", m_R[7] ).callimport().callexport().formatstr("%02X"); |
| 384 | 405 | |
| 385 | | static void ld_r0_a(alpha8201_state *cpustate) { WR_REG(0,cpustate->A); } |
| 386 | | static void ld_r1_a(alpha8201_state *cpustate) { WR_REG(1,cpustate->A); } |
| 387 | | static void ld_r2_a(alpha8201_state *cpustate) { WR_REG(2,cpustate->A); } |
| 388 | | static void ld_r3_a(alpha8201_state *cpustate) { WR_REG(3,cpustate->A); } |
| 389 | | static void ld_r4_a(alpha8201_state *cpustate) { WR_REG(4,cpustate->A); } |
| 390 | | static void ld_r5_a(alpha8201_state *cpustate) { WR_REG(5,cpustate->A); } |
| 391 | | static void ld_r6_a(alpha8201_state *cpustate) { WR_REG(6,cpustate->A); } |
| 392 | | static void ld_r7_a(alpha8201_state *cpustate) { WR_REG(7,cpustate->A); } |
| 406 | save_item(NAME(m_RAM)); |
| 407 | save_item(NAME(m_PREVPC)); |
| 408 | save_item(NAME(m_pc.w.l)); |
| 409 | save_item(NAME(m_regPtr)); |
| 410 | save_item(NAME(m_zf)); |
| 411 | save_item(NAME(m_cf)); |
| 412 | save_item(NAME(m_mb)); |
| 413 | save_item(NAME(m_halt)); |
| 414 | save_item(NAME(m_ix0.b.l)); |
| 415 | save_item(NAME(m_ix1.b.l)); |
| 416 | save_item(NAME(m_ix2.b.l)); |
| 417 | save_item(NAME(m_lp0)); |
| 418 | save_item(NAME(m_lp1)); |
| 419 | save_item(NAME(m_lp2)); |
| 420 | save_item(NAME(m_A)); |
| 421 | save_item(NAME(m_B)); |
| 422 | save_item(NAME(m_retptr)); |
| 423 | save_item(NAME(m_savec)); |
| 424 | save_item(NAME(m_savez)); |
| 393 | 425 | |
| 394 | | static void add_a_n(alpha8201_state *cpustate) { M_ADD(cpustate, M_RDMEM_OPCODE(cpustate)); } |
| 426 | m_icountptr = &m_icount; |
| 427 | } |
| 395 | 428 | |
| 396 | | static void add_a_r0(alpha8201_state *cpustate) { M_ADD(cpustate, RD_REG(0)); } |
| 397 | | static void add_a_r1(alpha8201_state *cpustate) { M_ADD(cpustate, RD_REG(1)); } |
| 398 | | static void add_a_r2(alpha8201_state *cpustate) { M_ADD(cpustate, RD_REG(2)); } |
| 399 | | static void add_a_r3(alpha8201_state *cpustate) { M_ADD(cpustate, RD_REG(3)); } |
| 400 | | static void add_a_r4(alpha8201_state *cpustate) { M_ADD(cpustate, RD_REG(4)); } |
| 401 | | static void add_a_r5(alpha8201_state *cpustate) { M_ADD(cpustate, RD_REG(5)); } |
| 402 | | static void add_a_r6(alpha8201_state *cpustate) { M_ADD(cpustate, RD_REG(6)); } |
| 403 | | static void add_a_r7(alpha8201_state *cpustate) { M_ADD(cpustate, RD_REG(7)); } |
| 404 | 429 | |
| 405 | | static void sub_a_n(alpha8201_state *cpustate) { M_SUB(cpustate, M_RDMEM_OPCODE(cpustate)); } |
| 430 | void alpha8201_cpu_device::state_import(const device_state_entry &entry) |
| 431 | { |
| 432 | switch (entry.index()) |
| 433 | { |
| 434 | case ALPHA8201_SP: |
| 435 | M_WRMEM(0x001, m_sp); |
| 436 | break; |
| 406 | 437 | |
| 407 | | static void sub_a_r0(alpha8201_state *cpustate) { M_SUB(cpustate, RD_REG(0)); } |
| 408 | | static void sub_a_r1(alpha8201_state *cpustate) { M_SUB(cpustate, RD_REG(1)); } |
| 409 | | static void sub_a_r2(alpha8201_state *cpustate) { M_SUB(cpustate, RD_REG(2)); } |
| 410 | | static void sub_a_r3(alpha8201_state *cpustate) { M_SUB(cpustate, RD_REG(3)); } |
| 411 | | static void sub_a_r4(alpha8201_state *cpustate) { M_SUB(cpustate, RD_REG(4)); } |
| 412 | | static void sub_a_r5(alpha8201_state *cpustate) { M_SUB(cpustate, RD_REG(5)); } |
| 413 | | static void sub_a_r6(alpha8201_state *cpustate) { M_SUB(cpustate, RD_REG(6)); } |
| 414 | | static void sub_a_r7(alpha8201_state *cpustate) { M_SUB(cpustate, RD_REG(7)); } |
| 438 | case ALPHA8201_R0: |
| 439 | WR_REG(0, m_R[0]); |
| 440 | break; |
| 415 | 441 | |
| 416 | | static void and_a_n(alpha8201_state *cpustate) { M_AND(cpustate, M_RDMEM_OPCODE(cpustate)); } |
| 442 | case ALPHA8201_R1: |
| 443 | WR_REG(1, m_R[1]); |
| 444 | break; |
| 417 | 445 | |
| 418 | | static void and_a_r0(alpha8201_state *cpustate) { M_AND(cpustate, RD_REG(0)); } |
| 419 | | static void and_a_r1(alpha8201_state *cpustate) { M_AND(cpustate, RD_REG(1)); } |
| 420 | | static void and_a_r2(alpha8201_state *cpustate) { M_AND(cpustate, RD_REG(2)); } |
| 421 | | static void and_a_r3(alpha8201_state *cpustate) { M_AND(cpustate, RD_REG(3)); } |
| 422 | | static void and_a_r4(alpha8201_state *cpustate) { M_AND(cpustate, RD_REG(4)); } |
| 423 | | static void and_a_r5(alpha8201_state *cpustate) { M_AND(cpustate, RD_REG(5)); } |
| 424 | | static void and_a_r6(alpha8201_state *cpustate) { M_AND(cpustate, RD_REG(6)); } |
| 425 | | static void and_a_r7(alpha8201_state *cpustate) { M_AND(cpustate, RD_REG(7)); } |
| 446 | case ALPHA8201_R2: |
| 447 | WR_REG(2, m_R[2]); |
| 448 | break; |
| 426 | 449 | |
| 427 | | static void or_a_n(alpha8201_state *cpustate) { M_OR(cpustate, M_RDMEM_OPCODE(cpustate)); } |
| 450 | case ALPHA8201_R3: |
| 451 | WR_REG(3, m_R[3]); |
| 452 | break; |
| 428 | 453 | |
| 429 | | static void or_a_r0(alpha8201_state *cpustate) { M_OR(cpustate, RD_REG(0)); } |
| 430 | | static void or_a_r1(alpha8201_state *cpustate) { M_OR(cpustate, RD_REG(1)); } |
| 431 | | static void or_a_r2(alpha8201_state *cpustate) { M_OR(cpustate, RD_REG(2)); } |
| 432 | | static void or_a_r3(alpha8201_state *cpustate) { M_OR(cpustate, RD_REG(3)); } |
| 433 | | static void or_a_r4(alpha8201_state *cpustate) { M_OR(cpustate, RD_REG(4)); } |
| 434 | | static void or_a_r5(alpha8201_state *cpustate) { M_OR(cpustate, RD_REG(5)); } |
| 435 | | static void or_a_r6(alpha8201_state *cpustate) { M_OR(cpustate, RD_REG(6)); } |
| 436 | | static void or_a_r7(alpha8201_state *cpustate) { M_OR(cpustate, RD_REG(7)); } |
| 454 | case ALPHA8201_R4: |
| 455 | WR_REG(4, m_R[4]); |
| 456 | break; |
| 437 | 457 | |
| 438 | | static void add_ix0_0(alpha8201_state *cpustate) { } |
| 439 | | static void add_ix0_1(alpha8201_state *cpustate) { cpustate->IX0 += 1; } |
| 440 | | static void add_ix0_2(alpha8201_state *cpustate) { cpustate->IX0 += 2; } |
| 441 | | static void add_ix0_3(alpha8201_state *cpustate) { cpustate->IX0 += 3; } |
| 442 | | static void add_ix0_4(alpha8201_state *cpustate) { cpustate->IX0 += 4; } |
| 443 | | static void add_ix0_5(alpha8201_state *cpustate) { cpustate->IX0 += 5; } |
| 444 | | static void add_ix0_6(alpha8201_state *cpustate) { cpustate->IX0 += 6; } |
| 445 | | static void add_ix0_7(alpha8201_state *cpustate) { cpustate->IX0 += 7; } |
| 446 | | static void add_ix0_8(alpha8201_state *cpustate) { cpustate->IX0 += 8; } |
| 447 | | static void add_ix0_9(alpha8201_state *cpustate) { cpustate->IX0 += 9; } |
| 448 | | static void add_ix0_a(alpha8201_state *cpustate) { cpustate->IX0 += 10; } |
| 449 | | static void add_ix0_b(alpha8201_state *cpustate) { cpustate->IX0 += 11; } |
| 450 | | static void add_ix0_c(alpha8201_state *cpustate) { cpustate->IX0 += 12; } |
| 451 | | static void add_ix0_d(alpha8201_state *cpustate) { cpustate->IX0 += 13; } |
| 452 | | static void add_ix0_e(alpha8201_state *cpustate) { cpustate->IX0 += 14; } |
| 453 | | static void add_ix0_f(alpha8201_state *cpustate) { cpustate->IX0 += 15; } |
| 458 | case ALPHA8201_R5: |
| 459 | WR_REG(5, m_R[5]); |
| 460 | break; |
| 454 | 461 | |
| 455 | | static void add_ix1_0(alpha8201_state *cpustate) { } |
| 456 | | static void add_ix1_1(alpha8201_state *cpustate) { cpustate->IX1 += 1; } |
| 457 | | static void add_ix1_2(alpha8201_state *cpustate) { cpustate->IX1 += 2; } |
| 458 | | static void add_ix1_3(alpha8201_state *cpustate) { cpustate->IX1 += 3; } |
| 459 | | static void add_ix1_4(alpha8201_state *cpustate) { cpustate->IX1 += 4; } |
| 460 | | static void add_ix1_5(alpha8201_state *cpustate) { cpustate->IX1 += 5; } |
| 461 | | static void add_ix1_6(alpha8201_state *cpustate) { cpustate->IX1 += 6; } |
| 462 | | static void add_ix1_7(alpha8201_state *cpustate) { cpustate->IX1 += 7; } |
| 463 | | static void add_ix1_8(alpha8201_state *cpustate) { cpustate->IX1 += 8; } |
| 464 | | static void add_ix1_9(alpha8201_state *cpustate) { cpustate->IX1 += 9; } |
| 465 | | static void add_ix1_a(alpha8201_state *cpustate) { cpustate->IX1 += 10; } |
| 466 | | static void add_ix1_b(alpha8201_state *cpustate) { cpustate->IX1 += 11; } |
| 467 | | static void add_ix1_c(alpha8201_state *cpustate) { cpustate->IX1 += 12; } |
| 468 | | static void add_ix1_d(alpha8201_state *cpustate) { cpustate->IX1 += 13; } |
| 469 | | static void add_ix1_e(alpha8201_state *cpustate) { cpustate->IX1 += 14; } |
| 470 | | static void add_ix1_f(alpha8201_state *cpustate) { cpustate->IX1 += 15; } |
| 462 | case ALPHA8201_R6: |
| 463 | WR_REG(6, m_R[6]); |
| 464 | break; |
| 471 | 465 | |
| 472 | | static void add_ix2_0(alpha8201_state *cpustate) { } |
| 473 | | static void add_ix2_1(alpha8201_state *cpustate) { cpustate->IX2 += 1; } |
| 474 | | static void add_ix2_2(alpha8201_state *cpustate) { cpustate->IX2 += 2; } |
| 475 | | static void add_ix2_3(alpha8201_state *cpustate) { cpustate->IX2 += 3; } |
| 476 | | static void add_ix2_4(alpha8201_state *cpustate) { cpustate->IX2 += 4; } |
| 477 | | static void add_ix2_5(alpha8201_state *cpustate) { cpustate->IX2 += 5; } |
| 478 | | static void add_ix2_6(alpha8201_state *cpustate) { cpustate->IX2 += 6; } |
| 479 | | static void add_ix2_7(alpha8201_state *cpustate) { cpustate->IX2 += 7; } |
| 480 | | static void add_ix2_8(alpha8201_state *cpustate) { cpustate->IX2 += 8; } |
| 481 | | static void add_ix2_9(alpha8201_state *cpustate) { cpustate->IX2 += 9; } |
| 482 | | static void add_ix2_a(alpha8201_state *cpustate) { cpustate->IX2 += 10; } |
| 483 | | static void add_ix2_b(alpha8201_state *cpustate) { cpustate->IX2 += 11; } |
| 484 | | static void add_ix2_c(alpha8201_state *cpustate) { cpustate->IX2 += 12; } |
| 485 | | static void add_ix2_d(alpha8201_state *cpustate) { cpustate->IX2 += 13; } |
| 486 | | static void add_ix2_e(alpha8201_state *cpustate) { cpustate->IX2 += 14; } |
| 487 | | static void add_ix2_f(alpha8201_state *cpustate) { cpustate->IX2 += 15; } |
| 488 | | |
| 489 | | static void ld_base_0(alpha8201_state *cpustate) { cpustate->regPtr = 0; } |
| 490 | | static void ld_base_1(alpha8201_state *cpustate) { cpustate->regPtr = 1; } |
| 491 | | static void ld_base_2(alpha8201_state *cpustate) { cpustate->regPtr = 2; } |
| 492 | | static void ld_base_3(alpha8201_state *cpustate) { cpustate->regPtr = 3; } |
| 493 | | static void ld_base_4(alpha8201_state *cpustate) { cpustate->regPtr = 4; } |
| 494 | | static void ld_base_5(alpha8201_state *cpustate) { cpustate->regPtr = 5; } |
| 495 | | static void ld_base_6(alpha8201_state *cpustate) { cpustate->regPtr = 6; } |
| 496 | | static void ld_base_7(alpha8201_state *cpustate) { cpustate->regPtr = 7; } |
| 497 | | |
| 498 | | static void ld_bank_0(alpha8201_state *cpustate) { cpustate->mb = 0; } |
| 499 | | static void ld_bank_1(alpha8201_state *cpustate) { cpustate->mb = 1; } |
| 500 | | static void ld_bank_2(alpha8201_state *cpustate) { cpustate->mb = 2; } |
| 501 | | static void ld_bank_3(alpha8201_state *cpustate) { cpustate->mb = 3; } |
| 502 | | |
| 503 | | static void stop(alpha8201_state *cpustate) |
| 504 | | { |
| 505 | | UINT8 pcptr = M_RDMEM(0x001) & 0x1f; |
| 506 | | M_WRMEM(pcptr,(M_RDMEM(pcptr)&0xf)+0x08); /* mark entry point ODD to HALT */ |
| 507 | | cpustate->mb |= 0x08; /* mark internal HALT state */ |
| 466 | case ALPHA8201_R7: |
| 467 | WR_REG(7, m_R[7]); |
| 468 | break; |
| 469 | } |
| 508 | 470 | } |
| 509 | 471 | |
| 510 | | static void ld_ix0_n(alpha8201_state *cpustate) { cpustate->IX0 = M_RDMEM_OPCODE(cpustate); } |
| 511 | | static void ld_ix1_n(alpha8201_state *cpustate) { cpustate->IX1 = M_RDMEM_OPCODE(cpustate); } |
| 512 | | static void ld_ix2_n(alpha8201_state *cpustate) { cpustate->IX2 = M_RDMEM_OPCODE(cpustate); } |
| 513 | | static void ld_lp0_n(alpha8201_state *cpustate) { cpustate->LP0 = M_RDMEM_OPCODE(cpustate); } |
| 514 | | static void ld_lp1_n(alpha8201_state *cpustate) { cpustate->LP1 = M_RDMEM_OPCODE(cpustate); } |
| 515 | | static void ld_lp2_n(alpha8201_state *cpustate) { cpustate->LP2 = M_RDMEM_OPCODE(cpustate); } |
| 516 | | static void ld_b_n(alpha8201_state *cpustate) { cpustate->B = M_RDMEM_OPCODE(cpustate); } |
| 517 | 472 | |
| 518 | | static void djnz_lp0(alpha8201_state *cpustate) { UINT8 i=M_RDMEM_OPCODE(cpustate); cpustate->LP0--; if (cpustate->LP0 != 0) M_JMP(cpustate, i); } |
| 519 | | static void djnz_lp1(alpha8201_state *cpustate) { UINT8 i=M_RDMEM_OPCODE(cpustate); cpustate->LP1--; if (cpustate->LP1 != 0) M_JMP(cpustate, i); } |
| 520 | | static void djnz_lp2(alpha8201_state *cpustate) { UINT8 i=M_RDMEM_OPCODE(cpustate); cpustate->LP2--; if (cpustate->LP2 != 0) M_JMP(cpustate, i); } |
| 521 | | static void jnz(alpha8201_state *cpustate) { UINT8 i=M_RDMEM_OPCODE(cpustate); if (!cpustate->zf) M_JMP(cpustate, i); } |
| 522 | | static void jnc(alpha8201_state *cpustate) { UINT8 i=M_RDMEM_OPCODE(cpustate); if (!cpustate->cf) M_JMP(cpustate, i);} |
| 523 | | static void jz(alpha8201_state *cpustate) { UINT8 i=M_RDMEM_OPCODE(cpustate); if ( cpustate->zf) M_JMP(cpustate, i); } |
| 524 | | static void jc(alpha8201_state *cpustate) { UINT8 i=M_RDMEM_OPCODE(cpustate); if ( cpustate->cf) M_JMP(cpustate, i);} |
| 525 | | static void jmp(alpha8201_state *cpustate) { M_JMP(cpustate, M_RDMEM_OPCODE(cpustate) ); } |
| 526 | | |
| 527 | | static const s_opcode opcode_8201[256]= |
| 473 | void alpha8201_cpu_device::state_export(const device_state_entry &entry) |
| 528 | 474 | { |
| 529 | | {C1, nop },{C1,rora },{C1, rola },{C1,inc_b },{C1,dec_b },{C1, inc_a },{C1, dec_a },{C1, cpl }, |
| 530 | | {C2,ld_a_ix0_0 },{C2,ld_a_ix0_1},{C2, ld_a_ix0_2},{C2,ld_a_ix0_3},{C2,ld_a_ix0_4},{C2,ld_a_ix0_5},{C2,ld_a_ix0_6},{C2,ld_a_ix0_7}, |
| 531 | | {C2,ld_a_ix1_0 },{C2,ld_a_ix1_1},{C2, ld_a_ix1_2},{C2,ld_a_ix1_3},{C2,ld_a_ix1_4},{C2,ld_a_ix1_5},{C2,ld_a_ix1_6},{C2,ld_a_ix1_7}, |
| 532 | | {C2,ld_ix2_0_a },{C2,ld_ix2_1_a},{C2, ld_ix2_2_a},{C2,ld_ix2_3_a},{C2,ld_ix2_4_a},{C2,ld_ix2_5_a},{C2,ld_ix2_6_a},{C2,ld_ix2_7_a}, |
| 533 | | /* 20 */ |
| 534 | | {C2,ld_ix0_0_b },{C2,ld_ix0_1_b},{C2, ld_ix0_2_b},{C2,ld_ix0_3_b},{C2,ld_ix0_4_b},{C2,ld_ix0_5_b},{C2,ld_ix0_6_b},{C2,ld_ix0_7_b}, |
| 535 | | {C2,undefined },{C2,undefined },{C2, undefined },{C2,undefined },{C2,undefined },{C2,undefined },{C2,undefined },{C2,undefined }, |
| 536 | | {C2,undefined },{C2,undefined },{C2, undefined },{C2,undefined },{C2,undefined },{C2,undefined },{C2,undefined },{C2,undefined }, |
| 537 | | {C2,bit_r0_0 },{C2,bit_r0_1 },{C2, bit_r0_2 },{C2, bit_r0_3 },{C2, bit_r0_4 },{C2, bit_r0_5 },{C2, bit_r0_6 },{C2, bit_r0_7 }, |
| 538 | | /* 40 : 8201 */ |
| 539 | | {C2, ld_a_r0 },{C2, ld_r0_a },{C2, ld_a_r1 },{C2, ld_r1_a },{C2, ld_a_r2 },{C2, ld_r2_a },{C2, ld_a_r3 },{C2, ld_r3_a }, |
| 540 | | {C2, ld_a_r4 },{C2, ld_r4_a },{C2, ld_a_r5 },{C2, ld_r5_a },{C2, ld_a_r6 },{C2, ld_r6_a },{C2, ld_a_r7 },{C2, ld_r7_a }, |
| 541 | | {C1, add_a_r0 },{C1, sub_a_r0 },{C1, add_a_r1 },{C1, sub_a_r1 },{C1, add_a_r2 },{C1, sub_a_r2 },{C1, add_a_r3 },{C1, sub_a_r3 }, |
| 542 | | {C1, add_a_r4 },{C1, sub_a_r4 },{C1, add_a_r5 },{C1, sub_a_r5 },{C1, add_a_r6 },{C1, sub_a_r6 },{C1, add_a_r7 },{C1, sub_a_r7 }, |
| 543 | | {C1, and_a_r0 },{C1, or_a_r0 },{C1, and_a_r1 },{C1, or_a_r1 },{C1, and_a_r2 },{C1, or_a_r2 },{C1, and_a_r3 },{C1, or_a_r3 }, |
| 544 | | {C1, and_a_r4 },{C1, or_a_r4 },{C1, and_a_r5 },{C1, or_a_r5 },{C1, and_a_r6 },{C1, or_a_r6 },{C1, and_a_r7 },{C1, or_a_r7 }, |
| 545 | | {C1, add_ix0_0 },{C1, add_ix0_1},{C1, add_ix0_2},{C1, add_ix0_3},{C1, add_ix0_4},{C1, add_ix0_5},{C1, add_ix0_6},{C1, add_ix0_7}, |
| 546 | | {C1, add_ix0_8 },{C1, add_ix0_9},{C1, add_ix0_a},{C1, add_ix0_b},{C1, add_ix0_c},{C1, add_ix0_d},{C1, add_ix0_e},{C1, add_ix0_f}, |
| 547 | | /* 80 : 8201 */ |
| 548 | | {C1, add_ix1_0 },{C1, add_ix1_1},{C1, add_ix1_2},{C1, add_ix1_3},{C1, add_ix1_4},{C1, add_ix1_5},{C1, add_ix1_6},{C1, add_ix1_7}, |
| 549 | | {C1, add_ix1_8 },{C1, add_ix1_9},{C1, add_ix1_a},{C1, add_ix1_b},{C1, add_ix1_c},{C1, add_ix1_d},{C1, add_ix1_e},{C1, add_ix1_f}, |
| 550 | | {C1, add_ix2_0 },{C1, add_ix2_1},{C1, add_ix2_2},{C1, add_ix2_3},{C1, add_ix2_4},{C1, add_ix2_5},{C1, add_ix2_6},{C1, add_ix2_7}, |
| 551 | | {C1, add_ix2_8 },{C1, add_ix2_9},{C1, add_ix2_a},{C1, add_ix2_b},{C1, add_ix2_c},{C1, add_ix2_d},{C1, add_ix2_e},{C1, add_ix2_f}, |
| 552 | | {C1, ld_base_0 },{C1, ld_base_1},{C1, ld_base_2},{C1, ld_base_3},{C1, ld_base_4},{C1, ld_base_5},{C1, ld_base_6},{C1, ld_base_7}, |
| 553 | | {C1, undefined },{C1, undefined},{C1, undefined},{C1, undefined},{C1, undefined},{C1, undefined},{C1, undefined},{C1, undefined}, |
| 554 | | {C1, ld_bank_0 },{C1, ld_bank_1},{C1, ld_bank_2},{C1, ld_bank_3},{C2, stop },{C1, undefined},{C1, undefined},{C1, undefined}, |
| 555 | | {C1, undefined },{C1, undefined},{C1, undefined},{C1, undefined},{C1, undefined},{C1, undefined},{C1, undefined},{C1, undefined}, |
| 556 | | /* c0 : 8201 */ |
| 557 | | {C2, ld_ix0_n },{C2, ld_ix1_n },{C2, ld_ix2_n },{C2, ld_a_n },{C2, ld_lp0_n },{C2, ld_lp1_n },{C2, ld_lp2_n },{C2, ld_b_n }, |
| 558 | | {C2, add_a_n },{C2, sub_a_n },{C2, and_a_n },{C2, or_a_n },{C2, djnz_lp0 },{C2, djnz_lp1 },{C2, djnz_lp2 },{C2, jnz }, |
| 559 | | {C2, jnc },{C2, jz },{C2, jmp },{C2,undefined2},{C2,undefined2},{C2,undefined2},{C2,undefined2},{C2, undefined2}, |
| 560 | | {C2, undefined2 },{C2,undefined2},{C2,undefined2},{C2,undefined2},{C2,undefined2},{C2,undefined2},{C2,undefined2},{C2, undefined2}, |
| 561 | | /* E0 : 8201*/ |
| 562 | | {C1, undefined },{C1, undefined},{C1, undefined},{C1, undefined},{C1, undefined},{C1, undefined},{C1, undefined},{C1, undefined}, |
| 563 | | {C1, undefined },{C1, undefined},{C1, undefined},{C1, undefined},{C1, undefined},{C1, undefined},{C1, undefined},{C1, undefined}, |
| 564 | | {C1, undefined },{C1, undefined},{C1, undefined},{C1, undefined},{C1, undefined},{C1, undefined},{C1, undefined},{C1, undefined}, |
| 565 | | {C1, undefined },{C1, undefined},{C1, undefined},{C1, undefined},{C1, undefined},{C1, undefined},{C1, undefined},{C1, undefined } |
| 566 | | }; |
| 475 | switch (entry.index()) |
| 476 | { |
| 477 | case ALPHA8201_SP: |
| 478 | m_sp = M_RDMEM(0x001); |
| 479 | break; |
| 567 | 480 | |
| 481 | case ALPHA8201_R0: |
| 482 | m_R[0] = RD_REG(0); |
| 483 | break; |
| 568 | 484 | |
| 569 | | /* ALPHA 8301 : added instruction */ |
| 570 | | static void exg_a_ix0(alpha8201_state *cpustate) { UINT8 t=cpustate->A; cpustate->A = cpustate->IX0; cpustate->IX0 = t; } |
| 571 | | static void exg_a_ix1(alpha8201_state *cpustate) { UINT8 t=cpustate->A; cpustate->A = cpustate->IX1; cpustate->IX1 = t; } |
| 572 | | static void exg_a_ix2(alpha8201_state *cpustate) { UINT8 t=cpustate->A; cpustate->A = cpustate->IX2; cpustate->IX2 = t; } |
| 573 | | static void exg_a_lp0(alpha8201_state *cpustate) { UINT8 t=cpustate->A; cpustate->A = cpustate->LP0; cpustate->LP0 = t; } |
| 574 | | static void exg_a_lp1(alpha8201_state *cpustate) { UINT8 t=cpustate->A; cpustate->A = cpustate->LP1; cpustate->LP1 = t; } |
| 575 | | static void exg_a_lp2(alpha8201_state *cpustate) { UINT8 t=cpustate->A; cpustate->A = cpustate->LP2; cpustate->LP2 = t; } |
| 576 | | static void exg_a_b(alpha8201_state *cpustate) { UINT8 t=cpustate->A; cpustate->A = cpustate->B; cpustate->B = t; } |
| 577 | | static void exg_a_rb(alpha8201_state *cpustate) { UINT8 t=cpustate->A; cpustate->A = cpustate->regPtr; cpustate->regPtr = t; } |
| 485 | case ALPHA8201_R1: |
| 486 | m_R[1] = RD_REG(1); |
| 487 | break; |
| 578 | 488 | |
| 579 | | static void ld_ix0_a(alpha8201_state *cpustate) { cpustate->IX0 = cpustate->A; } |
| 580 | | static void ld_ix1_a(alpha8201_state *cpustate) { cpustate->IX1 = cpustate->A; } |
| 581 | | static void ld_ix2_a(alpha8201_state *cpustate) { cpustate->IX2 = cpustate->A; } |
| 582 | | static void ld_lp0_a(alpha8201_state *cpustate) { cpustate->LP0 = cpustate->A; } |
| 583 | | static void ld_lp1_a(alpha8201_state *cpustate) { cpustate->LP1 = cpustate->A; } |
| 584 | | static void ld_lp2_a(alpha8201_state *cpustate) { cpustate->LP2 = cpustate->A; } |
| 585 | | static void ld_b_a(alpha8201_state *cpustate) { cpustate->B = cpustate->A; } |
| 586 | | static void ld_rb_a(alpha8201_state *cpustate) { cpustate->regPtr = cpustate->A; } |
| 489 | case ALPHA8201_R2: |
| 490 | m_R[2] = RD_REG(2); |
| 491 | break; |
| 587 | 492 | |
| 588 | | static void exg_ix0_ix1(alpha8201_state *cpustate) { UINT8 t=cpustate->IX1; cpustate->IX1 = cpustate->IX0; cpustate->IX0 = t; } |
| 589 | | static void exg_ix0_ix2(alpha8201_state *cpustate) { UINT8 t=cpustate->IX2; cpustate->IX2 = cpustate->IX0; cpustate->IX0 = t; } |
| 493 | case ALPHA8201_R3: |
| 494 | m_R[3] = RD_REG(3); |
| 495 | break; |
| 590 | 496 | |
| 591 | | static void op_d4(alpha8201_state *cpustate) { cpustate->A = M_RDMEM( ((cpustate->RAM[(7<<3)+7] & 3) << 8) | M_RDMEM_OPCODE(cpustate) ); } |
| 592 | | static void op_d5(alpha8201_state *cpustate) { M_WRMEM( ((cpustate->RAM[(7<<3)+7] & 3) << 8) | M_RDMEM_OPCODE(cpustate), cpustate->A ); } |
| 593 | | static void op_d6(alpha8201_state *cpustate) { cpustate->LP0 = M_RDMEM( ((cpustate->RAM[(7<<3)+7] & 3) << 8) | M_RDMEM_OPCODE(cpustate) ); } |
| 594 | | static void op_d7(alpha8201_state *cpustate) { M_WRMEM( ((cpustate->RAM[(7<<3)+7] & 3) << 8) | M_RDMEM_OPCODE(cpustate), cpustate->LP0 ); } |
| 497 | case ALPHA8201_R4: |
| 498 | m_R[4] = RD_REG(4); |
| 499 | break; |
| 595 | 500 | |
| 596 | | static void ld_a_abs(alpha8201_state *cpustate) { cpustate->A = M_RDMEM( ((cpustate->mb & 3) << 8) | M_RDMEM_OPCODE(cpustate) ); } |
| 597 | | static void ld_abs_a(alpha8201_state *cpustate) { M_WRMEM( ((cpustate->mb & 3) << 8) | M_RDMEM_OPCODE(cpustate), cpustate->A ); } |
| 501 | case ALPHA8201_R5: |
| 502 | m_R[5] = RD_REG(5); |
| 503 | break; |
| 598 | 504 | |
| 599 | | static void ld_a_r(alpha8201_state *cpustate) { cpustate->A = cpustate->RAM[(M_RDMEM_OPCODE(cpustate)>>1)&0x3f]; } |
| 600 | | static void ld_r_a(alpha8201_state *cpustate) { cpustate->RAM[(M_RDMEM_OPCODE(cpustate)>>1)&0x3f] = cpustate->A; } |
| 601 | | static void op_rep_ld_ix2_b(alpha8201_state *cpustate) { do { M_WRMEM(cpustate->BIX2, cpustate->RAM[(cpustate->B>>1)&0x3f]); cpustate->IX2++; cpustate->B+=2; cpustate->LP0--; } while (cpustate->LP0 != 0); } |
| 602 | | static void op_rep_ld_b_ix0(alpha8201_state *cpustate) { do { cpustate->RAM[(cpustate->B>>1)&0x3f] = M_RDMEM(cpustate->BIX0); cpustate->IX0++; cpustate->B+=2; cpustate->LP0--; } while (cpustate->LP0 != 0); } |
| 603 | | static void ld_rxb_a(alpha8201_state *cpustate) { cpustate->RAM[(cpustate->B>>1)&0x3f] = cpustate->A; } |
| 604 | | static void ld_a_rxb(alpha8201_state *cpustate) { cpustate->A = cpustate->RAM[(cpustate->B>>1)&0x3f]; } |
| 605 | | static void cmp_a_rxb(alpha8201_state *cpustate) { UINT8 i=cpustate->RAM[(cpustate->B>>1)&0x3f]; cpustate->zf = (cpustate->A==i); cpustate->cf = (cpustate->A>=i); } |
| 606 | | static void xor_a_rxb(alpha8201_state *cpustate) { M_XOR(cpustate, cpustate->RAM[(cpustate->B>>1)&0x3f] ); } |
| 505 | case ALPHA8201_R6: |
| 506 | m_R[6] = RD_REG(6); |
| 507 | break; |
| 607 | 508 | |
| 608 | | static void add_a_cf(alpha8201_state *cpustate) { if (cpustate->cf) inc_a(cpustate); } |
| 609 | | static void sub_a_cf(alpha8201_state *cpustate) { if (cpustate->cf) dec_a(cpustate); } |
| 610 | | static void tst_a(alpha8201_state *cpustate) { cpustate->zf = (cpustate->A==0); } |
| 611 | | static void clr_a(alpha8201_state *cpustate) { cpustate->A = 0; cpustate->zf = (cpustate->A==0); } |
| 612 | | static void cmp_a_n(alpha8201_state *cpustate) { UINT8 i=M_RDMEM_OPCODE(cpustate); cpustate->zf = (cpustate->A==i); cpustate->cf = (cpustate->A>=i); } |
| 613 | | static void xor_a_n(alpha8201_state *cpustate) { M_XOR(cpustate, M_RDMEM_OPCODE(cpustate) ); } |
| 614 | | static void call(alpha8201_state *cpustate) { UINT8 i=M_RDMEM_OPCODE(cpustate); cpustate->retptr.w.l = cpustate->PC; M_JMP(cpustate, i); }; |
| 615 | | static void ld_a_ix0_a(alpha8201_state *cpustate) { cpustate->A = M_RDMEM(cpustate->BIX0+cpustate->A); } |
| 616 | | static void ret(alpha8201_state *cpustate) { cpustate->mb = cpustate->retptr.b.h; M_JMP(cpustate, cpustate->retptr.b.l ); }; |
| 617 | | static void save_zc(alpha8201_state *cpustate) { cpustate->savez = cpustate->zf; cpustate->savec = cpustate->cf; }; |
| 618 | | static void rest_zc(alpha8201_state *cpustate) { cpustate->zf = cpustate->savez; cpustate->cf = cpustate->savec; }; |
| 509 | case ALPHA8201_R7: |
| 510 | m_R[7] = RD_REG(7); |
| 511 | break; |
| 512 | } |
| 513 | } |
| 619 | 514 | |
| 620 | | static const s_opcode opcode_8301[256]= |
| 621 | | { |
| 622 | | {C1, nop },{C1,rora },{C1, rola },{C1,inc_b },{C1,dec_b },{C1, inc_a },{C1, dec_a },{C1, cpl }, |
| 623 | | {C2,ld_a_ix0_0 },{C2,ld_a_ix0_1},{C2, ld_a_ix0_2},{C2,ld_a_ix0_3},{C2,ld_a_ix0_4},{C2,ld_a_ix0_5},{C2,ld_a_ix0_6},{C2,ld_a_ix0_7}, |
| 624 | | {C2,ld_a_ix1_0 },{C2,ld_a_ix1_1},{C2, ld_a_ix1_2},{C2,ld_a_ix1_3},{C2,ld_a_ix1_4},{C2,ld_a_ix1_5},{C2,ld_a_ix1_6},{C2,ld_a_ix1_7}, |
| 625 | | {C2,ld_ix2_0_a },{C2,ld_ix2_1_a},{C2, ld_ix2_2_a},{C2,ld_ix2_3_a},{C2,ld_ix2_4_a},{C2,ld_ix2_5_a},{C2,ld_ix2_6_a},{C2,ld_ix2_7_a}, |
| 626 | | /* 20 : 8301 */ |
| 627 | | {C2,ld_ix0_0_b },{C2,ld_ix0_1_b},{C2, ld_ix0_2_b},{C2,ld_ix0_3_b},{C2,ld_ix0_4_b},{C2,ld_ix0_5_b},{C2,ld_ix0_6_b},{C2,ld_ix0_7_b}, |
| 628 | | {C2,undefined },{C2,undefined },{C2, undefined },{C2,undefined },{C2,undefined },{C2,undefined },{C2,undefined },{C2,undefined }, |
| 629 | | {C2,undefined },{C2,undefined },{C2, undefined },{C2,undefined },{C2,undefined },{C2,undefined },{C2,undefined },{C2,undefined }, |
| 630 | | {C2,bit_r0_0 },{C2,bit_r0_1 },{C2, bit_r0_2 },{C2, bit_r0_3 },{C2, bit_r0_4 },{C2, bit_r0_5 },{C2, bit_r0_6 },{C2, bit_r0_7 }, |
| 631 | | /* 40 : 8301 */ |
| 632 | | {C2, ld_a_r0 },{C2, ld_r0_a },{C2, ld_a_r1 },{C2, ld_r1_a },{C2, ld_a_r2 },{C2, ld_r2_a },{C2, ld_a_r3 },{C2, ld_r3_a }, |
| 633 | | {C2, ld_a_r4 },{C2, ld_r4_a },{C2, ld_a_r5 },{C2, ld_r5_a },{C2, ld_a_r6 },{C2, ld_r6_a },{C2, ld_a_r7 },{C2, ld_r7_a }, |
| 634 | | {C1, add_a_r0 },{C1, sub_a_r0 },{C1, add_a_r1 },{C1, sub_a_r1 },{C1, add_a_r2 },{C1, sub_a_r2 },{C1, add_a_r3 },{C1, sub_a_r3 }, |
| 635 | | {C1, add_a_r4 },{C1, sub_a_r4 },{C1, add_a_r5 },{C1, sub_a_r5 },{C1, add_a_r6 },{C1, sub_a_r6 },{C1, add_a_r7 },{C1, sub_a_r7 }, |
| 636 | | /* 60 : 8301 */ |
| 637 | | {C1, and_a_r0 },{C1, or_a_r0 },{C1, and_a_r1 },{C1, or_a_r1 },{C1, and_a_r2 },{C1, or_a_r2 },{C1, and_a_r3 },{C1, or_a_r3 }, |
| 638 | | {C1, and_a_r4 },{C1, or_a_r4 },{C1, and_a_r5 },{C1, or_a_r5 },{C1, and_a_r6 },{C1, or_a_r6 },{C1, and_a_r7 },{C1, or_a_r7 }, |
| 639 | | {C1, add_ix0_0 },{C1, add_ix0_1},{C1, add_ix0_2},{C1, add_ix0_3},{C1, add_ix0_4},{C1, add_ix0_5},{C1, add_ix0_6},{C1, add_ix0_7}, |
| 640 | | {C1, add_ix0_8 },{C1, add_ix0_9},{C1, add_ix0_a},{C1, add_ix0_b},{C1, add_ix0_c},{C1, add_ix0_d},{C1, add_ix0_e},{C1, add_ix0_f}, |
| 641 | | /* 80 : 8301 */ |
| 642 | | {C1, add_ix1_0 },{C1, add_ix1_1},{C1, add_ix1_2},{C1, add_ix1_3},{C1, add_ix1_4},{C1, add_ix1_5},{C1, add_ix1_6},{C1, add_ix1_7}, |
| 643 | | {C1, add_ix1_8 },{C1, add_ix1_9},{C1, add_ix1_a},{C1, add_ix1_b},{C1, add_ix1_c},{C1, add_ix1_d},{C1, add_ix1_e},{C1, add_ix1_f}, |
| 644 | | {C1, add_ix2_0 },{C1, add_ix2_1},{C1, add_ix2_2},{C1, add_ix2_3},{C1, add_ix2_4},{C1, add_ix2_5},{C1, add_ix2_6},{C1, add_ix2_7}, |
| 645 | | {C1, add_ix2_8 },{C1, add_ix2_9},{C1, add_ix2_a},{C1, add_ix2_b},{C1, add_ix2_c},{C1, add_ix2_d},{C1, add_ix2_e},{C1, add_ix2_f}, |
| 646 | | /* A0 : 8301 */ |
| 647 | | {C1, ld_base_0 },{C1, ld_base_1},{C1, ld_base_2},{C1, ld_base_3},{C1, ld_base_4},{C1, ld_base_5},{C1, ld_base_6},{C1, ld_base_7}, |
| 648 | | {C1, undefined },{C1, undefined},{C1, undefined},{C1, undefined},{C1, undefined},{C1, undefined},{C1, undefined},{C1, undefined}, |
| 649 | | {C1, ld_bank_0 },{C1, ld_bank_1},{C1, ld_bank_2},{C1, ld_bank_3},{C2, stop },{C1, undefined},{C1, undefined},{C1, undefined}, |
| 650 | | {C1, undefined },{C1, undefined},{C1, undefined},{C1, undefined},{C1, undefined},{C1, undefined},{C1, undefined},{C1, undefined}, |
| 651 | | /* c0 : 8301 */ |
| 652 | | {C2, ld_ix0_n },{C2, ld_ix1_n},{C2, ld_ix2_n },{C2, ld_a_n },{C2, ld_lp0_n },{C2, ld_lp1_n },{C2, ld_lp2_n },{C2, ld_b_n }, |
| 653 | | {C2, add_a_n },{C2, sub_a_n },{C2, and_a_n },{C2, or_a_n },{C2, djnz_lp0 },{C2, djnz_lp1 },{C2, djnz_lp2 },{C2, jnz }, |
| 654 | | {C2, jnc },{C2, jz },{C2, jmp },{C2,undefined2},{C2, op_d4 },{C2, op_d5 },{C2, op_d6 },{C2, op_d7 }, |
| 655 | | {C2, ld_a_abs },{C2, ld_abs_a},{C2,cmp_a_n },{C2,xor_a_n },{C2, ld_a_r },{C2, ld_r_a },{C2, jc },{C2, call}, |
| 656 | | /* E0 : 8301 */ |
| 657 | | {C1, exg_a_ix0 },{C1, exg_a_ix1},{C1, exg_a_ix2},{C1, exg_a_lp1},{C1, exg_a_lp2},{C1, exg_a_b },{C1, exg_a_lp0},{C1, exg_a_rb }, |
| 658 | | {C1, ld_ix0_a },{C1, ld_ix1_a },{C1, ld_ix2_a },{C1, ld_lp1_a },{C1, ld_lp2_a },{C1, ld_b_a },{C1, ld_lp0_a },{C1, ld_rb_a }, |
| 659 | | {C1,exg_ix0_ix1},{C1,exg_ix0_ix2},{C1,op_rep_ld_ix2_b},{C1, op_rep_ld_b_ix0},{C1, save_zc},{C1, rest_zc},{C1, ld_rxb_a },{C1, ld_a_rxb }, |
| 660 | | {C1, cmp_a_rxb },{C1, xor_a_rxb},{C1, add_a_cf },{C1, sub_a_cf },{C1, tst_a },{C1, clr_a },{C1, ld_a_ix0_a},{C1, ret } |
| 661 | | }; |
| 662 | 515 | |
| 663 | | /**************************************************************************** |
| 664 | | * Initialize emulation |
| 665 | | ****************************************************************************/ |
| 666 | | static CPU_INIT( alpha8201 ) |
| 516 | void alpha8201_cpu_device::state_string_export(const device_state_entry &entry, astring &string) |
| 667 | 517 | { |
| 668 | | alpha8201_state *cpustate = get_safe_token(device); |
| 669 | | |
| 670 | | cpustate->device = device; |
| 671 | | cpustate->program = &device->space(AS_PROGRAM); |
| 672 | | cpustate->direct = &cpustate->program->direct(); |
| 673 | | |
| 674 | | device->save_item(NAME(cpustate->RAM)); |
| 675 | | device->save_item(NAME(cpustate->PREVPC)); |
| 676 | | device->save_item(NAME(cpustate->PC)); |
| 677 | | device->save_item(NAME(cpustate->regPtr)); |
| 678 | | device->save_item(NAME(cpustate->zf)); |
| 679 | | device->save_item(NAME(cpustate->cf)); |
| 680 | | device->save_item(NAME(cpustate->mb)); |
| 681 | | #if HANDLE_HALT_LINE |
| 682 | | device->save_item(NAME(cpustate->halt)); |
| 683 | | #endif |
| 684 | | device->save_item(NAME(cpustate->IX0)); |
| 685 | | device->save_item(NAME(cpustate->IX1)); |
| 686 | | device->save_item(NAME(cpustate->IX2)); |
| 687 | | device->save_item(NAME(cpustate->LP0)); |
| 688 | | device->save_item(NAME(cpustate->LP1)); |
| 689 | | device->save_item(NAME(cpustate->LP2)); |
| 690 | | device->save_item(NAME(cpustate->A)); |
| 691 | | device->save_item(NAME(cpustate->B)); |
| 692 | | device->save_item(NAME(cpustate->retptr)); |
| 693 | | device->save_item(NAME(cpustate->savec)); |
| 694 | | device->save_item(NAME(cpustate->savez)); |
| 518 | switch (entry.index()) |
| 519 | { |
| 520 | case STATE_GENFLAGS: |
| 521 | string.printf("%c%c", m_cf?'C':'.', m_zf?'Z':'.'); |
| 522 | break; |
| 523 | } |
| 695 | 524 | } |
| 525 | |
| 696 | 526 | /**************************************************************************** |
| 697 | 527 | * Reset registers to their initial values |
| 698 | 528 | ****************************************************************************/ |
| 699 | | static CPU_RESET( alpha8201 ) |
| 529 | void alpha8201_cpu_device::device_reset() |
| 700 | 530 | { |
| 701 | | alpha8201_state *cpustate = get_safe_token(device); |
| 702 | | cpustate->PC = 0; |
| 703 | | cpustate->regPtr = 0; |
| 704 | | cpustate->zf = 0; |
| 705 | | cpustate->cf = 0; |
| 706 | | cpustate->mb = 0; |
| 707 | | cpustate->BIX0 = 0; |
| 708 | | cpustate->BIX1 = 0; |
| 709 | | cpustate->BIX2 = 0; |
| 710 | | cpustate->LP0 = 0; |
| 711 | | cpustate->LP1 = 0; |
| 712 | | cpustate->LP2 = 0; |
| 713 | | cpustate->A = 0; |
| 714 | | cpustate->B = 0; |
| 715 | | #if HANDLE_HALT_LINE |
| 716 | | cpustate->halt = 0; |
| 717 | | #endif |
| 531 | m_pc.w.l = 0; |
| 532 | m_regPtr = 0; |
| 533 | m_zf = 0; |
| 534 | m_cf = 0; |
| 535 | m_mb = 0; |
| 536 | m_ix0.w.l = 0; |
| 537 | m_ix1.w.l = 0; |
| 538 | m_ix2.w.l = 0; |
| 539 | m_lp0 = 0; |
| 540 | m_lp1 = 0; |
| 541 | m_lp2 = 0; |
| 542 | m_A = 0; |
| 543 | m_B = 0; |
| 544 | m_halt = 0; |
| 718 | 545 | } |
| 719 | 546 | |
| 720 | | /**************************************************************************** |
| 721 | | * Shut down CPU emulation |
| 722 | | ****************************************************************************/ |
| 723 | | static CPU_EXIT( alpha8201 ) |
| 724 | | { |
| 725 | | /* nothing to do ? */ |
| 726 | | } |
| 727 | 547 | |
| 728 | 548 | /**************************************************************************** |
| 729 | 549 | * Execute cycles CPU cycles. Return number of cycles really executed |
| 730 | 550 | ****************************************************************************/ |
| 731 | 551 | |
| 732 | | static void alpha8xxx_execute(device_t *device,const s_opcode *op_map) |
| 552 | void alpha8201_cpu_device::execute_run() |
| 733 | 553 | { |
| 734 | | alpha8201_state *cpustate = get_safe_token(device); |
| 735 | 554 | unsigned opcode; |
| 736 | 555 | UINT8 pcptr; |
| 737 | 556 | |
| 738 | | #if HANDLE_HALT_LINE |
| 739 | | if(cpustate->halt) |
| 557 | if(m_halt) |
| 740 | 558 | { |
| 741 | | cpustate->icount = 0; |
| 559 | m_icount = 0; |
| 742 | 560 | return; |
| 743 | 561 | } |
| 744 | | #endif |
| 745 | 562 | |
| 746 | 563 | /* setup address bank & fall safe */ |
| 747 | | cpustate->ix0.b.h = |
| 748 | | cpustate->ix1.b.h = |
| 749 | | cpustate->ix2.b.h = (cpustate->pc.b.h &= 3); |
| 564 | m_ix0.b.h = |
| 565 | m_ix1.b.h = |
| 566 | m_ix2.b.h = (m_pc.b.h &= 3); |
| 750 | 567 | |
| 751 | 568 | /* reset start hack */ |
| 752 | | if(cpustate->PC<0x20) |
| 753 | | cpustate->mb |= 0x08; |
| 569 | if(m_pc.w.l<0x20) |
| 570 | m_mb |= 0x08; |
| 754 | 571 | |
| 755 | 572 | do |
| 756 | 573 | { |
| 757 | | if(cpustate->mb & 0x08) |
| 574 | if(m_mb & 0x08) |
| 758 | 575 | { |
| 759 | 576 | pcptr = M_RDMEM(0x001) & 0x1f; /* pointer of entry point */ |
| 760 | | cpustate->icount -= C1; |
| 577 | m_icount -= C1; |
| 761 | 578 | |
| 762 | 579 | /* entry point scan phase */ |
| 763 | 580 | if( (pcptr&1) == 0) |
| 764 | 581 | { |
| 765 | | /* EVEN , get cpustate->PC low */ |
| 766 | | cpustate->pc.b.l = M_RDMEM(pcptr); |
| 767 | | //mame_printf_debug("alpha8201 load PCL ENTRY=%02X PCL=%02X\n",pcptr, cpustate->pc.b.l); |
| 768 | | cpustate->icount -= C1; |
| 582 | /* EVEN , get PC low */ |
| 583 | m_pc.b.l = M_RDMEM(pcptr); |
| 584 | //mame_printf_debug("alpha8201 load PCL ENTRY=%02X PCL=%02X\n",pcptr, m_pc.b.l); |
| 585 | m_icount -= C1; |
| 769 | 586 | M_WRMEM(0x001,pcptr+1); |
| 770 | 587 | continue; |
| 771 | 588 | } |
| 772 | 589 | |
| 773 | 590 | /* ODD , check HALT flag */ |
| 774 | | cpustate->mb = M_RDMEM(pcptr) & (0x08|0x03); |
| 775 | | cpustate->icount -= C1; |
| 591 | m_mb = M_RDMEM(pcptr) & (0x08|0x03); |
| 592 | m_icount -= C1; |
| 776 | 593 | |
| 777 | 594 | /* not entryaddress 000,001 */ |
| 778 | | if(pcptr<2) cpustate->mb |= 0x08; |
| 595 | if(pcptr<2) m_mb |= 0x08; |
| 779 | 596 | |
| 780 | | if(cpustate->mb & 0x08) |
| 597 | if(m_mb & 0x08) |
| 781 | 598 | { |
| 782 | 599 | /* HALTED current entry point . next one */ |
| 783 | 600 | pcptr = (pcptr+1)&0x1f; |
| 784 | 601 | M_WRMEM(0x001,pcptr); |
| 785 | | cpustate->icount -= C1; |
| 602 | m_icount -= C1; |
| 786 | 603 | continue; |
| 787 | 604 | } |
| 788 | 605 | |
| 789 | 606 | /* goto run phase */ |
| 790 | | M_JMP(cpustate, cpustate->pc.b.l); |
| 607 | M_JMP(m_pc.b.l); |
| 791 | 608 | |
| 792 | 609 | #if SHOW_ENTRY_POINT |
| 793 | | logerror("alpha8201 START ENTRY=%02X cpustate->PC=%03X\n",pcptr,cpustate->PC); |
| 794 | | mame_printf_debug("alpha8201 START ENTRY=%02X cpustate->PC=%03X\n",pcptr,cpustate->PC); |
| 610 | logerror("alpha8201 START ENTRY=%02X PC=%03X\n",pcptr,m_pc.w.l); |
| 611 | mame_printf_debug("alpha8201 START ENTRY=%02X PC=%03X\n",pcptr,m_pc.w.l); |
| 795 | 612 | #endif |
| 796 | 613 | } |
| 797 | 614 | |
| 798 | 615 | /* run */ |
| 799 | | cpustate->PREVPC = cpustate->PC; |
| 800 | | debugger_instruction_hook(device, cpustate->PC); |
| 801 | | opcode =M_RDOP(cpustate->PC); |
| 616 | m_PREVPC = m_pc.w.l; |
| 617 | debugger_instruction_hook(this, m_pc.w.l); |
| 618 | opcode =M_RDOP(m_pc.w.l); |
| 802 | 619 | #if TRACE_PC |
| 803 | | mame_printf_debug("alpha8201: cpustate->PC = %03x, opcode = %02x\n", cpustate->PC, opcode); |
| 620 | mame_printf_debug("alpha8201: PC = %03x, opcode = %02x\n", m_pc.w.l, opcode); |
| 804 | 621 | #endif |
| 805 | | cpustate->PCL++; |
| 806 | | cpustate->inst_cycles = op_map[opcode].cycles; |
| 807 | | (*(op_map[opcode].function))(cpustate); |
| 808 | | cpustate->icount -= cpustate->inst_cycles; |
| 809 | | } while (cpustate->icount>0); |
| 622 | m_pc.b.l++; |
| 623 | m_inst_cycles = m_opmap[opcode].cycles; |
| 624 | (this->*m_opmap[opcode].opcode_func)(); |
| 625 | m_icount -= m_inst_cycles; |
| 626 | } while (m_icount>0); |
| 810 | 627 | } |
| 811 | 628 | |
| 812 | | static CPU_EXECUTE( alpha8201 ) { alpha8xxx_execute(device,opcode_8201); } |
| 813 | 629 | |
| 814 | | static CPU_EXECUTE( ALPHA8301 ) { alpha8xxx_execute(device,opcode_8301); } |
| 815 | | |
| 816 | 630 | /**************************************************************************** |
| 817 | 631 | * Set IRQ line state |
| 818 | 632 | ****************************************************************************/ |
| 819 | | #if HANDLE_HALT_LINE |
| 820 | | static void set_irq_line(alpha8201_state *cpustate, int irqline, int state) |
| 633 | void alpha8201_cpu_device::execute_set_input(int inputnum, int state) |
| 821 | 634 | { |
| 822 | | if(irqline == INPUT_LINE_HALT) |
| 635 | if(inputnum == INPUT_LINE_HALT) |
| 823 | 636 | { |
| 824 | | cpustate->halt = (state==ASSERT_LINE) ? 1 : 0; |
| 825 | | /* mame_printf_debug("alpha8201 HALT %d\n",cpustate->halt); */ |
| 637 | m_halt = (state==ASSERT_LINE) ? 1 : 0; |
| 638 | /* mame_printf_debug("alpha8201 HALT %d\n",m_halt); */ |
| 826 | 639 | } |
| 827 | 640 | } |
| 828 | | #endif |
| 829 | 641 | |
| 830 | | /************************************************************************** |
| 831 | | * Generic set_info |
| 832 | | **************************************************************************/ |
| 833 | 642 | |
| 834 | | static CPU_SET_INFO( alpha8201 ) |
| 643 | offs_t alpha8201_cpu_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options) |
| 835 | 644 | { |
| 836 | | alpha8201_state *cpustate = get_safe_token(device); |
| 837 | | switch (state) |
| 838 | | { |
| 839 | | #if HANDLE_HALT_LINE |
| 840 | | case CPUINFO_INT_INPUT_STATE + INPUT_LINE_HALT: set_irq_line(cpustate, INPUT_LINE_HALT, info->i); break; |
| 841 | | #endif |
| 842 | | case CPUINFO_INT_PC: |
| 843 | | case CPUINFO_INT_REGISTER + ALPHA8201_PC: cpustate->PC = info->i; break; |
| 844 | | case CPUINFO_INT_SP: |
| 845 | | case CPUINFO_INT_REGISTER + ALPHA8201_SP: M_WRMEM(0x001,info->i); break; |
| 846 | | case CPUINFO_INT_REGISTER + ALPHA8201_RB: cpustate->regPtr = info->i & 7; break; |
| 847 | | case CPUINFO_INT_REGISTER + ALPHA8201_MB: cpustate->mb = info->i & 0x03; break; |
| 848 | | #if 0 |
| 849 | | case CPUINFO_INT_REGISTER + ALPHA8201_ZF: cpustate->zf= info->i & 0x01; break; |
| 850 | | case CPUINFO_INT_REGISTER + ALPHA8201_CF: cpustate->cf= info->i & 0x01; break; |
| 851 | | #endif |
| 852 | | case CPUINFO_INT_REGISTER + ALPHA8201_IX0: cpustate->IX0 = info->i; break; |
| 853 | | case CPUINFO_INT_REGISTER + ALPHA8201_IX1: cpustate->IX1 = info->i; break; |
| 854 | | case CPUINFO_INT_REGISTER + ALPHA8201_IX2: cpustate->IX2 = info->i; break; |
| 855 | | case CPUINFO_INT_REGISTER + ALPHA8201_LP0: cpustate->LP0 = info->i; break; |
| 856 | | case CPUINFO_INT_REGISTER + ALPHA8201_LP1: cpustate->LP1 = info->i; break; |
| 857 | | case CPUINFO_INT_REGISTER + ALPHA8201_LP2: cpustate->LP2 = info->i; break; |
| 858 | | case CPUINFO_INT_REGISTER + ALPHA8201_A: cpustate->A = info->i; break; |
| 859 | | case CPUINFO_INT_REGISTER + ALPHA8201_B: cpustate->B = info->i; break; |
| 860 | | case CPUINFO_INT_REGISTER + ALPHA8201_R0: WR_REG(0,info->i); break; |
| 861 | | case CPUINFO_INT_REGISTER + ALPHA8201_R1: WR_REG(1,info->i); break; |
| 862 | | case CPUINFO_INT_REGISTER + ALPHA8201_R2: WR_REG(2,info->i); break; |
| 863 | | case CPUINFO_INT_REGISTER + ALPHA8201_R3: WR_REG(3,info->i); break; |
| 864 | | case CPUINFO_INT_REGISTER + ALPHA8201_R4: WR_REG(4,info->i); break; |
| 865 | | case CPUINFO_INT_REGISTER + ALPHA8201_R5: WR_REG(5,info->i); break; |
| 866 | | case CPUINFO_INT_REGISTER + ALPHA8201_R6: WR_REG(6,info->i); break; |
| 867 | | case CPUINFO_INT_REGISTER + ALPHA8201_R7: WR_REG(7,info->i); break; |
| 868 | | } |
| 645 | extern CPU_DISASSEMBLE( alpha8201 ); |
| 646 | return CPU_DISASSEMBLE_NAME(alpha8201)(this, buffer, pc, oprom, opram, options); |
| 869 | 647 | } |
| 870 | 648 | |
| 871 | | |
| 872 | | |
| 873 | | /************************************************************************** |
| 874 | | * Generic get_info |
| 875 | | **************************************************************************/ |
| 876 | | |
| 877 | | /* 8201 and 8301 */ |
| 878 | | static CPU_GET_INFO( alpha8xxx ) |
| 879 | | { |
| 880 | | alpha8201_state *cpustate = (device != NULL && device->token() != NULL) ? get_safe_token(device) : NULL; |
| 881 | | switch (state) |
| 882 | | { |
| 883 | | /* --- the following bits of info are returned as 64-bit signed integers --- */ |
| 884 | | case CPUINFO_INT_CONTEXT_SIZE: info->i = sizeof(alpha8201_state); break; |
| 885 | | case CPUINFO_INT_INPUT_LINES: info->i = 0; break; |
| 886 | | case CPUINFO_INT_DEFAULT_IRQ_VECTOR: info->i = 0; break; |
| 887 | | case CPUINFO_INT_ENDIANNESS: info->i = ENDIANNESS_LITTLE; break; |
| 888 | | case CPUINFO_INT_CLOCK_MULTIPLIER: info->i = 1; break; |
| 889 | | case CPUINFO_INT_CLOCK_DIVIDER: info->i = 1; break; |
| 890 | | case CPUINFO_INT_MIN_INSTRUCTION_BYTES: info->i = 1; break; |
| 891 | | case CPUINFO_INT_MAX_INSTRUCTION_BYTES: info->i = 2; break; |
| 892 | | case CPUINFO_INT_MIN_CYCLES: info->i = 1; break; |
| 893 | | case CPUINFO_INT_MAX_CYCLES: info->i = 16; break; |
| 894 | | |
| 895 | | case CPUINFO_INT_DATABUS_WIDTH + AS_PROGRAM: info->i = 8; break; |
| 896 | | case CPUINFO_INT_ADDRBUS_WIDTH + AS_PROGRAM: info->i = 10; break; |
| 897 | | case CPUINFO_INT_ADDRBUS_SHIFT + AS_PROGRAM: info->i = 0; break; |
| 898 | | case CPUINFO_INT_DATABUS_WIDTH + AS_DATA: info->i = 0; break; |
| 899 | | case CPUINFO_INT_ADDRBUS_WIDTH + AS_DATA: info->i = 0; break; |
| 900 | | case CPUINFO_INT_ADDRBUS_SHIFT + AS_DATA: info->i = 0; break; |
| 901 | | case CPUINFO_INT_DATABUS_WIDTH + AS_IO: info->i = 8; break; |
| 902 | | case CPUINFO_INT_ADDRBUS_WIDTH + AS_IO: info->i = 6; break; |
| 903 | | case CPUINFO_INT_ADDRBUS_SHIFT + AS_IO: info->i = 0; break; |
| 904 | | #if HANDLE_HALT_LINE |
| 905 | | case CPUINFO_INT_INPUT_STATE + INPUT_LINE_HALT: info->i = cpustate->halt ? ASSERT_LINE : CLEAR_LINE; break; |
| 906 | | #endif |
| 907 | | case CPUINFO_INT_PREVIOUSPC: info->i = cpustate->PREVPC; break; |
| 908 | | case CPUINFO_INT_PC: |
| 909 | | case CPUINFO_INT_REGISTER + ALPHA8201_PC: info->i = cpustate->PC & 0x3ff; break; |
| 910 | | case CPUINFO_INT_SP: |
| 911 | | case CPUINFO_INT_REGISTER + ALPHA8201_SP: info->i = M_RDMEM(0x001); break; |
| 912 | | case CPUINFO_INT_REGISTER + ALPHA8201_RB: info->i = cpustate->regPtr; break; |
| 913 | | case CPUINFO_INT_REGISTER + ALPHA8201_MB: info->i = cpustate->mb; break; |
| 914 | | case CPUINFO_INT_REGISTER + ALPHA8201_ZF: info->i = cpustate->zf; break; |
| 915 | | case CPUINFO_INT_REGISTER + ALPHA8201_CF: info->i = cpustate->cf; break; |
| 916 | | case CPUINFO_INT_REGISTER + ALPHA8201_IX0: info->i = cpustate->IX0; break; |
| 917 | | case CPUINFO_INT_REGISTER + ALPHA8201_IX1: info->i = cpustate->IX1; break; |
| 918 | | case CPUINFO_INT_REGISTER + ALPHA8201_IX2: info->i = cpustate->IX2; break; |
| 919 | | case CPUINFO_INT_REGISTER + ALPHA8201_LP0: info->i = cpustate->LP0; break; |
| 920 | | case CPUINFO_INT_REGISTER + ALPHA8201_LP1: info->i = cpustate->LP1; break; |
| 921 | | case CPUINFO_INT_REGISTER + ALPHA8201_LP2: info->i = cpustate->LP2; break; |
| 922 | | case CPUINFO_INT_REGISTER + ALPHA8201_A: info->i = cpustate->A; break; |
| 923 | | case CPUINFO_INT_REGISTER + ALPHA8201_B: info->i = cpustate->B; break; |
| 924 | | case CPUINFO_INT_REGISTER + ALPHA8201_R0: info->i = RD_REG(0); break; |
| 925 | | case CPUINFO_INT_REGISTER + ALPHA8201_R1: info->i = RD_REG(1); break; |
| 926 | | case CPUINFO_INT_REGISTER + ALPHA8201_R2: info->i = RD_REG(2); break; |
| 927 | | case CPUINFO_INT_REGISTER + ALPHA8201_R3: info->i = RD_REG(3); break; |
| 928 | | case CPUINFO_INT_REGISTER + ALPHA8201_R4: info->i = RD_REG(4); break; |
| 929 | | case CPUINFO_INT_REGISTER + ALPHA8201_R5: info->i = RD_REG(5); break; |
| 930 | | case CPUINFO_INT_REGISTER + ALPHA8201_R6: info->i = RD_REG(6); break; |
| 931 | | case CPUINFO_INT_REGISTER + ALPHA8201_R7: info->i = RD_REG(7); break; |
| 932 | | |
| 933 | | /* --- the following bits of info are returned as pointers to data or functions --- */ |
| 934 | | case CPUINFO_FCT_SET_INFO: info->setinfo = CPU_SET_INFO_NAME(alpha8201); break; |
| 935 | | case CPUINFO_FCT_INIT: info->init = CPU_INIT_NAME(alpha8201); break; |
| 936 | | case CPUINFO_FCT_RESET: info->reset = CPU_RESET_NAME(alpha8201); break; |
| 937 | | case CPUINFO_FCT_EXIT: info->exit = CPU_EXIT_NAME(alpha8201); break; |
| 938 | | case CPUINFO_FCT_BURN: info->burn = NULL; break; |
| 939 | | case CPUINFO_FCT_DISASSEMBLE: info->disassemble = CPU_DISASSEMBLE_NAME(alpha8201); break; |
| 940 | | case CPUINFO_PTR_INSTRUCTION_COUNTER: info->icount = &cpustate->icount; break; |
| 941 | | |
| 942 | | /* --- the following bits of info are returned as NULL-terminated strings --- */ |
| 943 | | case CPUINFO_STR_FAMILY: strcpy(info->s, "AlphaDenshi MCU"); break; |
| 944 | | case CPUINFO_STR_VERSION: strcpy(info->s, "0.1"); break; |
| 945 | | case CPUINFO_STR_SOURCE_FILE: strcpy(info->s, __FILE__); break; |
| 946 | | case CPUINFO_STR_CREDITS: strcpy(info->s, "Copyright Tatsuyuki Satoh"); break; |
| 947 | | case CPUINFO_STR_FLAGS: sprintf(info->s, "%c%c", cpustate->cf?'C':'.',cpustate->zf?'Z':'.'); break; |
| 948 | | case CPUINFO_STR_REGISTER + ALPHA8201_PC: sprintf(info->s, "cpustate->PC:%03X", cpustate->PC); break; |
| 949 | | case CPUINFO_STR_REGISTER + ALPHA8201_SP: sprintf(info->s, "SP:%02X", M_RDMEM(0x001) ); break; |
| 950 | | case CPUINFO_STR_REGISTER + ALPHA8201_RB: sprintf(info->s, "RB:%X", cpustate->regPtr); break; |
| 951 | | case CPUINFO_STR_REGISTER + ALPHA8201_MB: sprintf(info->s, "MB:%X", cpustate->mb); break; |
| 952 | | #if 0 |
| 953 | | case CPUINFO_STR_REGISTER + ALPHA8201_ZF: sprintf(info->s, "cpustate->zf:%X", cpustate->zf); break; |
| 954 | | case CPUINFO_STR_REGISTER + ALPHA8201_CF: sprintf(info->s, "cpustate->cf:%X", cpustate->cf); break; |
| 955 | | #endif |
| 956 | | case CPUINFO_STR_REGISTER + ALPHA8201_IX0: sprintf(info->s, "cpustate->IX0:%02X", cpustate->IX0); break; |
| 957 | | case CPUINFO_STR_REGISTER + ALPHA8201_IX1: sprintf(info->s, "cpustate->IX1:%02X", cpustate->IX1); break; |
| 958 | | case CPUINFO_STR_REGISTER + ALPHA8201_IX2: sprintf(info->s, "cpustate->IX2:%02X", cpustate->IX2); break; |
| 959 | | case CPUINFO_STR_REGISTER + ALPHA8201_LP0: sprintf(info->s, "cpustate->LP0:%02X", cpustate->LP0); break; |
| 960 | | case CPUINFO_STR_REGISTER + ALPHA8201_LP1: sprintf(info->s, "cpustate->LP1:%02X", cpustate->LP1); break; |
| 961 | | case CPUINFO_STR_REGISTER + ALPHA8201_LP2: sprintf(info->s, "cpustate->LP2:%02X", cpustate->LP2); break; |
| 962 | | case CPUINFO_STR_REGISTER + ALPHA8201_A: sprintf(info->s, "A:%02X", cpustate->A); break; |
| 963 | | case CPUINFO_STR_REGISTER + ALPHA8201_B: sprintf(info->s, "B:%02X", cpustate->B); break; |
| 964 | | case CPUINFO_STR_REGISTER + ALPHA8201_R0: sprintf(info->s, "R0:%02X", RD_REG(0)); break; |
| 965 | | case CPUINFO_STR_REGISTER + ALPHA8201_R1: sprintf(info->s, "R1:%02X", RD_REG(1)); break; |
| 966 | | case CPUINFO_STR_REGISTER + ALPHA8201_R2: sprintf(info->s, "R2:%02X", RD_REG(2)); break; |
| 967 | | case CPUINFO_STR_REGISTER + ALPHA8201_R3: sprintf(info->s, "R3:%02X", RD_REG(3)); break; |
| 968 | | case CPUINFO_STR_REGISTER + ALPHA8201_R4: sprintf(info->s, "R4:%02X", RD_REG(4)); break; |
| 969 | | case CPUINFO_STR_REGISTER + ALPHA8201_R5: sprintf(info->s, "R5:%02X", RD_REG(5)); break; |
| 970 | | case CPUINFO_STR_REGISTER + ALPHA8201_R6: sprintf(info->s, "R6:%02X", RD_REG(6)); break; |
| 971 | | case CPUINFO_STR_REGISTER + ALPHA8201_R7: sprintf(info->s, "R7:%02X", RD_REG(7)); break; |
| 972 | | } |
| 973 | | } |
| 974 | | CPU_GET_INFO( alpha8201 ) |
| 975 | | { |
| 976 | | switch (state) |
| 977 | | { |
| 978 | | case CPUINFO_STR_NAME: strcpy(info->s, "ALPHA-8201"); break; |
| 979 | | case CPUINFO_FCT_EXECUTE: info->execute = CPU_EXECUTE_NAME(alpha8201); break; |
| 980 | | default: |
| 981 | | /* 8201 / 8301 */ |
| 982 | | CPU_GET_INFO_CALL(alpha8xxx); |
| 983 | | } |
| 984 | | } |
| 985 | | |
| 986 | | CPU_GET_INFO( alpha8301 ) |
| 987 | | { |
| 988 | | switch (state) |
| 989 | | { |
| 990 | | case CPUINFO_STR_NAME: strcpy(info->s, "ALPHA-8301"); break; |
| 991 | | case CPUINFO_FCT_EXECUTE: info->execute = CPU_EXECUTE_NAME(ALPHA8301); break; |
| 992 | | default: |
| 993 | | /* 8201 / 8301 */ |
| 994 | | CPU_GET_INFO_CALL(alpha8xxx); |
| 995 | | } |
| 996 | | } |
| 997 | | |
| 998 | | DEFINE_LEGACY_CPU_DEVICE(ALPHA8201, alpha8201); |
| 999 | | DEFINE_LEGACY_CPU_DEVICE(ALPHA8301, alpha8301); |