summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/cpu/i86
diff options
context:
space:
mode:
author Miodrag Milanovic <mmicko@gmail.com>2011-05-18 12:17:17 +0000
committer Miodrag Milanovic <mmicko@gmail.com>2011-05-18 12:17:17 +0000
commit8f7dba221cc1666ca3c18653191ce900f592fa06 (patch)
tree6e7520c1085c276de6e40ac69a6f71ab24f38594 /src/emu/cpu/i86
parentdf5254338f7c8b4692d8a72afb04bf1287136fac (diff)
i86 - Implemented POP CS and MOV CS,reg instructions that are 8086 specific [Miodrag Milanovic]
Diffstat (limited to 'src/emu/cpu/i86')
-rw-r--r--src/emu/cpu/i86/instr86.c21
-rw-r--r--src/emu/cpu/i86/instr86.h3
-rw-r--r--src/emu/cpu/i86/table86.h2
3 files changed, 23 insertions, 3 deletions
diff --git a/src/emu/cpu/i86/instr86.c b/src/emu/cpu/i86/instr86.c
index ae73f8e9e87..5fee9ef6f1e 100644
--- a/src/emu/cpu/i86/instr86.c
+++ b/src/emu/cpu/i86/instr86.c
@@ -772,7 +772,17 @@ static void PREFIX86(_push_cs)(i8086_state *cpustate) /* Opcode 0x0e */
PUSH(cpustate->sregs[CS]);
}
-/* Opcode 0x0f invalid */
+#ifndef I80286
+static void PREFIX86(_pop_cs)(i8086_state *cpustate) /* Opcode 0x0f */
+{
+ int ip = cpustate->pc - cpustate->base[CS];
+ ICOUNT -= timing.push_seg;
+ POP(cpustate->sregs[CS]);
+ cpustate->base[CS] = SegBase(CS);
+ cpustate->pc = (ip + cpustate->base[CS]) & AMASK;
+ CHANGE_PC(cpustate->pc);
+}
+#endif
static void PREFIX86(_adc_br8)(i8086_state *cpustate) /* Opcode 0x10 */
{
@@ -2714,7 +2724,14 @@ static void PREFIX(_mov_sregw)(i8086_state *cpustate) /* Opcode 0x8e */
PREFIX(_instruction)[FETCHOP](cpustate);
break;
case 0x08: /* mov cs,ew */
- break; /* doesn't do a jump far */
+#ifndef I80186
+ int ip = cpustate->pc - cpustate->base[CS];
+ cpustate->sregs[CS] = src;
+ cpustate->base[CS] = SegBase(CS);
+ cpustate->pc = (ip + cpustate->base[CS]) & AMASK;
+ CHANGE_PC(cpustate->pc);
+#endif
+ break;
}
#endif
}
diff --git a/src/emu/cpu/i86/instr86.h b/src/emu/cpu/i86/instr86.h
index 368038cefc5..620bc32620d 100644
--- a/src/emu/cpu/i86/instr86.h
+++ b/src/emu/cpu/i86/instr86.h
@@ -28,6 +28,9 @@ static void PREFIX86(_or_r16w)(i8086_state *cpustate);
static void PREFIX86(_or_ald8)(i8086_state *cpustate);
static void PREFIX86(_or_axd16)(i8086_state *cpustate);
static void PREFIX86(_push_cs)(i8086_state *cpustate);
+#ifndef I80286
+static void PREFIX86(_pop_cs)(i8086_state *cpustate);
+#endif
static void PREFIX86(_adc_br8)(i8086_state *cpustate);
static void PREFIX86(_adc_wr16)(i8086_state *cpustate);
static void PREFIX86(_adc_r8b)(i8086_state *cpustate);
diff --git a/src/emu/cpu/i86/table86.h b/src/emu/cpu/i86/table86.h
index 93f8bd000a7..b5b9be110a2 100644
--- a/src/emu/cpu/i86/table86.h
+++ b/src/emu/cpu/i86/table86.h
@@ -15,7 +15,7 @@ static void (*const PREFIX86(_instruction)[256])(i8086_state *cpustate) =
PREFIX86(_or_ald8), /* 0x0c */
PREFIX86(_or_axd16), /* 0x0d */
PREFIX86(_push_cs), /* 0x0e */
- PREFIX86(_invalid),
+ PREFIX86(_pop_cs), /* 0x0f */
PREFIX86(_adc_br8), /* 0x10 */
PREFIX86(_adc_wr16), /* 0x11 */
PREFIX86(_adc_r8b), /* 0x12 */