summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/upd7810/upd7810_opcodes.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/upd7810/upd7810_opcodes.cpp')
-rw-r--r--src/devices/cpu/upd7810/upd7810_opcodes.cpp151
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);
}