diff options
author | 2011-05-18 12:17:17 +0000 | |
---|---|---|
committer | 2011-05-18 12:17:17 +0000 | |
commit | 8f7dba221cc1666ca3c18653191ce900f592fa06 (patch) | |
tree | 6e7520c1085c276de6e40ac69a6f71ab24f38594 /src/emu/cpu/i86 | |
parent | df5254338f7c8b4692d8a72afb04bf1287136fac (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.c | 21 | ||||
-rw-r--r-- | src/emu/cpu/i86/instr86.h | 3 | ||||
-rw-r--r-- | src/emu/cpu/i86/table86.h | 2 |
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 */ |