trunk/src/emu/cpu/hmcs40/hmcs40.c
r244976 | r244977 | |
459 | 459 | { |
460 | 460 | m_icount--; |
461 | 461 | push_stack(); |
| 462 | m_ie = 0; |
462 | 463 | |
463 | 464 | // line 0/1 for external interrupt, let's use 2 for t/c interrupt |
464 | 465 | int line = (m_iri) ? m_eint_line : 2; |
r244976 | r244977 | |
466 | 467 | // vector $3f, on page 0(timer/counter), or page 1(external) |
467 | 468 | // external interrupt has priority over t/c interrupt |
468 | 469 | m_pc = 0x3f | (m_iri ? 0x40 : 0); |
469 | | m_iri = m_irt = 0; |
470 | | m_ie = 0; |
| 470 | if (m_iri) |
| 471 | m_iri = 0; |
| 472 | else |
| 473 | m_irt = 0; |
471 | 474 | |
472 | 475 | standard_irq_callback(line); |
473 | 476 | } |
r244976 | r244977 | |
554 | 557 | |
555 | 558 | // LPU is handled 1 cycle later |
556 | 559 | if ((m_prev_op & 0x3e0) == 0x340) |
| 560 | { |
| 561 | if ((m_op & 0x1c0) != 0x1c0) |
| 562 | logerror("%s LPU without BR/CAL at $%04X\n", tag(), m_prev_pc); |
| 563 | |
557 | 564 | m_pc = ((m_page << 6) | (m_pc & 0x3f)) & m_pcmask; |
| 565 | } |
558 | 566 | |
559 | 567 | // check/handle interrupt, but not in the middle of a long jump |
560 | 568 | if (m_ie && (m_iri || m_irt) && (m_op & 0x3e0) != 0x340) |
r244976 | r244977 | |
567 | 575 | // fetch next opcode |
568 | 576 | debugger_instruction_hook(this, m_pc); |
569 | 577 | m_op = m_program->read_word(m_pc << 1) & 0x3ff; |
570 | | m_i = BITSWAP8(m_op,7,6,5,4,0,1,2,3) & 0xf; // reversed bit-order for immediate param |
| 578 | m_i = BITSWAP8(m_op,7,6,5,4,0,1,2,3) & 0xf; // reversed bit-order for immediate param (except for XAMR?) |
571 | 579 | increment_pc(); |
572 | 580 | |
573 | 581 | // handle opcode |
r244976 | r244977 | |
633 | 641 | break; |
634 | 642 | case 0x034: |
635 | 643 | //op_illegal(); |
636 | | op_amc(); // mirror? |
| 644 | //op_amc(); // mirror? |
| 645 | op_am(); |
637 | 646 | break; |
638 | 647 | |
639 | 648 | case 0x230: |
r244976 | r244977 | |
641 | 650 | break; |
642 | 651 | case 0x234: |
643 | 652 | //op_illegal(); |
644 | | op_smc(); // mirror? |
| 653 | //op_smc(); // mirror? |
| 654 | op_nega(); |
645 | 655 | break; |
646 | 656 | |
647 | 657 | |