diff options
Diffstat (limited to 'src/devices/cpu/upd7810/upd7810_opcodes.cpp')
-rw-r--r-- | src/devices/cpu/upd7810/upd7810_opcodes.cpp | 151 |
1 files changed, 72 insertions, 79 deletions
diff --git a/src/devices/cpu/upd7810/upd7810_opcodes.cpp b/src/devices/cpu/upd7810/upd7810_opcodes.cpp index 868856456f6..f9580278be5 100644 --- a/src/devices/cpu/upd7810/upd7810_opcodes.cpp +++ b/src/devices/cpu/upd7810/upd7810_opcodes.cpp @@ -309,7 +309,10 @@ void upd7810_device::DIV_A() A = remainder; } else - EA = 0xffff; /* guess */ + { + A = EAL; + EA = 0xffff; + } } /* 48 3e: 0100 1000 0011 1110 */ @@ -323,7 +326,10 @@ void upd7810_device::DIV_B() B = remainder; } else - EA = 0xffff; /* guess */ + { + B = EAL; + EA = 0xffff; + } } /* 48 3f: 0100 1000 0011 1111 */ @@ -337,15 +343,18 @@ void upd7810_device::DIV_C() C = remainder; } else - EA = 0xffff; /* guess */ + { + C = EAL; + EA = 0xffff; + } } /* 48 40: 0100 1000 0100 0000 */ void upd7810_device::SKIT_NMI() { - if (IRR & INTNMI) + if (m_nmi == CLEAR_LINE) // 1 pin level PSW |= SK; - IRR &= ~INTNMI; + // INTFNMI is not tested or changed } /* 48 41: 0100 1000 0100 0001 */ @@ -487,9 +496,9 @@ void upd7810_device::SKIT_SB() /* 48 60: 0100 1000 0110 0000 */ void upd7810_device::SKNIT_NMI() { - if (0 == (IRR & INTNMI)) + if (m_nmi == ASSERT_LINE) // 0 pin level PSW |= SK; - IRR &= ~INTNMI; + // INTFNMI is not tested or changed } /* 48 61: 0100 1000 0110 0001 */ @@ -931,25 +940,25 @@ void upd7810_device::MOV_A_RXB() /* 4c e0: 0100 1100 1110 0000 */ void upd7810_device::MOV_A_CR0() { - A = CR0; + A = CR[0]; } /* 4c e1: 0100 1100 1110 0001 */ void upd7810_device::MOV_A_CR1() { - A = CR1; + A = CR[1]; } /* 4c e2: 0100 1100 1110 0010 */ void upd7810_device::MOV_A_CR2() { - A = CR2; + A = CR[2]; } /* 4c e3: 0100 1100 1110 0011 */ void upd7810_device::MOV_A_CR3() { - A = CR3; + A = CR[3]; } /* prefix 4D */ @@ -1036,36 +1045,56 @@ void upd7810_device::MOV_TMM_A() void upd7810_device::MOV_MM_A() { MM = A; + + if (BIT(A, 3)) + m_ram_view.select(0); + else + m_ram_view.disable(); } /* 4d d1: 0100 1101 1101 0001 */ void upd7810_device::MOV_MCC_A() { + if (MCC == A) + return; MCC = A; + WP(UPD7810_PORTC, m_pc_out); } /* 4d d2: 0100 1101 1101 0010 */ void upd7810_device::MOV_MA_A() { + if (MA == A) + return; MA = A; + WP(UPD7810_PORTA, m_pa_out); } /* 4d d3: 0100 1101 1101 0011 */ void upd7810_device::MOV_MB_A() { + if (MB == A) + return; MB = A; + WP(UPD7810_PORTB, m_pb_out); } /* 4d d4: 0100 1101 1101 0100 */ void upd7810_device::MOV_MC_A() { + if (MC == A) + return; MC = A; + WP(UPD7810_PORTC, m_pc_out); } /* 4d d7: 0100 1101 1101 0111 */ void upd7810_device::MOV_MF_A() { + if (MF == A) + return; MF = A; + WP(UPD7810_PORTF, m_pf_out); } /* 4d d8: 0100 1101 1101 1000 */ @@ -8109,6 +8138,7 @@ void upd7810_device::INRW_wa() { PAIR ea = m_va; uint8_t tmp, m; + uint8_t old_cy = PSW & CY; RDOPARG( ea.b.l ); m = RM( ea.d ); @@ -8116,6 +8146,7 @@ void upd7810_device::INRW_wa() ZHC_ADD( tmp, m, 0 ); WM( ea.d, tmp ); SKIP_CY; + PSW = ( PSW & ~CY ) | old_cy; } /* 21: 0010 0001 */ @@ -8215,6 +8246,7 @@ void upd7810_device::DCRW_wa() { PAIR ea = m_va; uint8_t tmp, m; + uint8_t old_cy = PSW & CY; RDOPARG( ea.b.l ); m = RM( ea.d ); @@ -8222,6 +8254,7 @@ void upd7810_device::DCRW_wa() ZHC_SUB( tmp, m, 0 ); WM( ea.d, tmp ); SKIP_CY; + PSW = ( PSW & ~CY ) | old_cy; } /* 31: 0011 0001 */ @@ -8350,28 +8383,34 @@ void upd7810_device::CALL_w() /* 41: 0100 0001 */ void upd7810_device::INR_A() { + uint8_t old_cy = PSW & CY; uint8_t tmp = A + 1; ZHC_ADD( tmp, A, 0 ); A = tmp; SKIP_CY; + PSW = ( PSW & ~CY ) | old_cy; } /* 42: 0100 0010 */ void upd7810_device::INR_B() { + uint8_t old_cy = PSW & CY; uint8_t tmp = B + 1; ZHC_ADD( tmp, B, 0 ); B = tmp; SKIP_CY; + PSW = ( PSW & ~CY ) | old_cy; } /* 43: 0100 0011 */ void upd7810_device::INR_C() { + uint8_t old_cy = PSW & CY; uint8_t tmp = C + 1; ZHC_ADD( tmp, C, 0 ); C = tmp; SKIP_CY; + PSW = ( PSW & ~CY ) | old_cy; } /* 44: 0100 0100 llll llll hhhh hhhh */ @@ -8472,28 +8511,34 @@ void upd7810_device::EXH() /* 51: 0101 0001 */ void upd7810_device::DCR_A() { + uint8_t old_cy = PSW & CY; uint8_t tmp = A - 1; ZHC_SUB( tmp, A, 0 ); A = tmp; SKIP_CY; + PSW = ( PSW & ~CY ) | old_cy; } /* 52: 0101 0010 */ void upd7810_device::DCR_B() { + uint8_t old_cy = PSW & CY; uint8_t tmp = B - 1; ZHC_SUB( tmp, B, 0 ); B = tmp; SKIP_CY; + PSW = ( PSW & ~CY ) | old_cy; } /* 53: 0101 0011 */ void upd7810_device::DCR_C() { + uint8_t old_cy = PSW & CY; uint8_t tmp = C - 1; ZHC_SUB( tmp, C, 0 ); C = tmp; SKIP_CY; + PSW = ( PSW & ~CY ) | old_cy; } /* 54: 0101 0100 llll llll hhhh hhhh */ @@ -8833,7 +8878,10 @@ void upd7810_device::PRE_60() /* 61: 0110 0001 */ void upd7810_device::DAA() { - uint8_t l = A & 0x0f, h = A >> 4, tmp, adj = 0x00, old_cy = PSW & CY; + uint8_t l = A & 0x0f; + uint8_t h = A >> 4; + uint8_t adj = 0x00; + uint8_t old_cy = PSW & CY; if (0 == (PSW & HC)) { @@ -8850,15 +8898,15 @@ void upd7810_device::DAA() adj = 0x66; } } - else - if (l < 3) + else if (l < 3) { if (h < 10 && 0 == (PSW & CY)) adj = 0x06; else adj = 0x66; } - tmp = A + adj; + + uint8_t tmp = A + adj; ZHC_ADD( tmp, A, PSW & CY ); PSW |= old_cy; A = tmp; @@ -9147,7 +9195,7 @@ void upd7810_device::DCX_EA() /* aa: 1010 1010 */ void upd7810_device::EI() { - IFF = 1; + m_iff_pending = 1; } /* ab: 1010 1011 dddd dddd */ @@ -9277,7 +9325,7 @@ void upd7810_device::RETS() /* ba: 1011 1010 */ void upd7810_device::DI() { - IFF = 0; + IFF = m_iff_pending = 0; } /* bb: 1011 1011 dddd dddd */ @@ -9351,63 +9399,6 @@ void upd7810_device::CALT_7801() PCH=RM(w.w.l+1); } -/* DCR(W) and INR(W) instructions do not modify the CY register on at least 78c05 and 78c06 */ -void upd7810_device::DCR_A_7801() -{ - uint32_t old_CY = PSW & CY; - DCR_A(); - PSW = ( PSW & ~CY ) | old_CY; -} - -void upd7810_device::DCR_B_7801() -{ - uint32_t old_CY = PSW & CY; - DCR_B(); - PSW = ( PSW & ~CY ) | old_CY; -} - -void upd7810_device::DCR_C_7801() -{ - uint32_t old_CY = PSW & CY; - DCR_C(); - PSW = ( PSW & ~CY ) | old_CY; -} - -void upd7810_device::DCRW_wa_7801() -{ - uint32_t old_CY = PSW & CY; - DCRW_wa(); - PSW = ( PSW & ~CY ) | old_CY; -} - -void upd7810_device::INR_A_7801() -{ - uint32_t old_CY = PSW & CY; - INR_A(); - PSW = ( PSW & ~CY ) | old_CY; -} - -void upd7810_device::INR_B_7801() -{ - uint32_t old_CY = PSW & CY; - INR_B(); - PSW = ( PSW & ~CY ) | old_CY; -} - -void upd7810_device::INR_C_7801() -{ - uint32_t old_CY = PSW & CY; - INR_C(); - PSW = ( PSW & ~CY ) | old_CY; -} - -void upd7810_device::INRW_wa_7801() -{ - uint32_t old_CY = PSW & CY; - INRW_wa(); - PSW = ( PSW & ~CY ) | old_CY; -} - void upd7810_device::IN() { logerror("unimplemented instruction: IN\n"); @@ -9467,12 +9458,11 @@ void upd7810_device::STM() void upd7810_device::STM_7801() { - /* Set the timer flip/fliop */ - TO = 1; - m_to_func(TO); + /* Set the timer flip/flop */ + upd7810_to_output_change(1); /* Reload the timer */ - m_ovc0 = 16 * ( TM0 + ( ( TM1 & 0x0f ) << 8 ) ); + m_ovc0 = 8 * ( TM0 + ( ( TM1 & 0x0f ) << 8 ) ); } void upd7810_device::MOV_MC_A_7801() @@ -9487,5 +9477,8 @@ void upd7810_device::MOV_MC_A_7801() /* PC5 Output IO/-M Output */ /* PC6 Output HLDA Output */ /* PC7 Input HOLD Input */ - MC = 0x84 | ( ( A & 0x02 ) ? 0x02 : 0x00 ) | ( ( A & 0x01 ) ? 0x01 : 0x00 ); + if (MC == A) + return; + MC = A; + WP(UPD7810_PORTC, m_pc_out); } |