more changes
This commit is contained in:
parent
f964fd0d18
commit
fdb877c4d1
404
cpux86-ta.js
404
cpux86-ta.js
|
@ -82,26 +82,26 @@ function CPU_X86() {
|
||||||
this.df = 1;
|
this.df = 1;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
0. CF : Carry Flag. Set if the last arithmetic operation carried (addition) or borrowed (subtraction) a
|
0. CF : Carry Flag. Set if the last arithmetic operation carried (addition) or borrowed (subtraction) a
|
||||||
bit beyond the size of the register. This is then checked when the operation is followed with
|
bit beyond the size of the register. This is then checked when the operation is followed with
|
||||||
an add-with-carry or subtract-with-borrow to deal with values too large for just one register to contain.
|
an add-with-carry or subtract-with-borrow to deal with values too large for just one register to contain.
|
||||||
2. PF : Parity Flag. Set if the number of set bits in the least significant byte is a multiple of 2.
|
2. PF : Parity Flag. Set if the number of set bits in the least significant byte is a multiple of 2.
|
||||||
4. AF : Adjust Flag. Carry of Binary Code Decimal (BCD) numbers arithmetic operations.
|
4. AF : Adjust Flag. Carry of Binary Code Decimal (BCD) numbers arithmetic operations.
|
||||||
6. ZF : Zero Flag. Set if the result of an operation is Zero (0).
|
6. ZF : Zero Flag. Set if the result of an operation is Zero (0).
|
||||||
7. SF : Sign Flag. Set if the result of an operation is negative.
|
7. SF : Sign Flag. Set if the result of an operation is negative.
|
||||||
8. TF : Trap Flag. Set if step by step debugging.
|
8. TF : Trap Flag. Set if step by step debugging.
|
||||||
9. IF : Interruption Flag. Set if interrupts are enabled.
|
9. IF : Interruption Flag. Set if interrupts are enabled.
|
||||||
10. DF : Direction Flag. Stream direction. If set, string operations will decrement their pointer rather
|
10. DF : Direction Flag. Stream direction. If set, string operations will decrement their pointer rather
|
||||||
than incrementing it, reading memory backwards.
|
than incrementing it, reading memory backwards.
|
||||||
11. OF : Overflow Flag. Set if signed arithmetic operations result in a value too large for the register to contain.
|
11. OF : Overflow Flag. Set if signed arithmetic operations result in a value too large for the register to contain.
|
||||||
12-13. IOPL : I/O Privilege Level field (2 bits). I/O Privilege Level of the current process.
|
12-13. IOPL : I/O Privilege Level field (2 bits). I/O Privilege Level of the current process.
|
||||||
14. NT : Nested Task flag. Controls chaining of interrupts. Set if the current process is linked to the next process.
|
14. NT : Nested Task flag. Controls chaining of interrupts. Set if the current process is linked to the next process.
|
||||||
16. RF : Resume Flag. Response to debug exceptions.
|
16. RF : Resume Flag. Response to debug exceptions.
|
||||||
17. VM : Virtual-8086 Mode. Set if in 8086 compatibility mode.
|
17. VM : Virtual-8086 Mode. Set if in 8086 compatibility mode.
|
||||||
18. AC : Alignment Check. Set if alignment checking of memory references is done.
|
18. AC : Alignment Check. Set if alignment checking of memory references is done.
|
||||||
19. VIF : Virtual Interrupt Flag. Virtual image of IF.
|
19. VIF : Virtual Interrupt Flag. Virtual image of IF.
|
||||||
20. VIP : Virtual Interrupt Pending flag. Set if an interrupt is pending.
|
20. VIP : Virtual Interrupt Pending flag. Set if an interrupt is pending.
|
||||||
21. ID : Identification Flag. Support for CPUID instruction if can be set.
|
21. ID : Identification Flag. Support for CPUID instruction if can be set.
|
||||||
*/
|
*/
|
||||||
this.eflags = 0x2; // EFLAG register
|
this.eflags = 0x2; // EFLAG register
|
||||||
|
|
||||||
|
@ -115,7 +115,7 @@ function CPU_X86() {
|
||||||
==========================================================================================
|
==========================================================================================
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
31 PG Paging If 1, enable paging and use the CR3 register, else disable paging
|
31 PG Paging If 1, enable paging and use the CR3 register, else disable paging
|
||||||
30 CD Cache disable Globally enables/disable the memory cache
|
30 CD Cache disable Globally enables/disable the memory cache
|
||||||
29 NW Not-write through Globally enables/disable write-back caching
|
29 NW Not-write through Globally enables/disable write-back caching
|
||||||
18 AM Alignment mask Alignment check enabled if AM set, AC flag (in EFLAGS register) set, and privilege level is 3
|
18 AM Alignment mask Alignment check enabled if AM set, AC flag (in EFLAGS register) set, and privilege level is 3
|
||||||
|
@ -148,25 +148,25 @@ function CPU_X86() {
|
||||||
/* CR4
|
/* CR4
|
||||||
Used in protected mode to control operations such as virtual-8086 support, enabling I/O breakpoints,
|
Used in protected mode to control operations such as virtual-8086 support, enabling I/O breakpoints,
|
||||||
page size extension and machine check exceptions.
|
page size extension and machine check exceptions.
|
||||||
Bit Name Full Name Description
|
Bit Name Full Name Description
|
||||||
18 OSXSAVE XSAVE and Processor Extended States Enable
|
18 OSXSAVE XSAVE and Processor Extended States Enable
|
||||||
17 PCIDE PCID Enable If set, enables process-context identifiers (PCIDs).
|
17 PCIDE PCID Enable If set, enables process-context identifiers (PCIDs).
|
||||||
14 SMXE SMX Enable
|
14 SMXE SMX Enable
|
||||||
13 VMXE VMX Enable
|
13 VMXE VMX Enable
|
||||||
10 OSXMMEXCPT Operating System Support for Unmasked SIMD Floating-Point Exceptions If set, enables unmasked SSE exceptions.
|
10 OSXMMEXCPT Operating System Support for Unmasked SIMD Floating-Point Exceptions If set, enables unmasked SSE exceptions.
|
||||||
9 OSFXSR Operating system support for FXSAVE and FXSTOR instructions If set, enables SSE instructions and fast FPU save & restore
|
9 OSFXSR Operating system support for FXSAVE and FXSTOR instructions If set, enables SSE instructions and fast FPU save & restore
|
||||||
8 PCE Performance-Monitoring Counter enable
|
8 PCE Performance-Monitoring Counter enable
|
||||||
If set, RDPMC can be executed at any privilege level, else RDPMC can only be used in ring 0.
|
If set, RDPMC can be executed at any privilege level, else RDPMC can only be used in ring 0.
|
||||||
7 PGE Page Global Enabled If set, address translations (PDE or PTE records) may be shared between address spaces.
|
7 PGE Page Global Enabled If set, address translations (PDE or PTE records) may be shared between address spaces.
|
||||||
6 MCE Machine Check Exception If set, enables machine check interrupts to occur.
|
6 MCE Machine Check Exception If set, enables machine check interrupts to occur.
|
||||||
5 PAE Physical Address Extension
|
5 PAE Physical Address Extension
|
||||||
If set, changes page table layout to translate 32-bit virtual addresses into extended 36-bit physical addresses.
|
If set, changes page table layout to translate 32-bit virtual addresses into extended 36-bit physical addresses.
|
||||||
4 PSE Page Size Extensions If unset, page size is 4 KB, else page size is increased to 4 MB (ignored with PAE set).
|
4 PSE Page Size Extensions If unset, page size is 4 KB, else page size is increased to 4 MB (ignored with PAE set).
|
||||||
3 DE Debugging Extensions
|
3 DE Debugging Extensions
|
||||||
2 TSD Time Stamp Disable
|
2 TSD Time Stamp Disable
|
||||||
If set, RDTSC instruction can only be executed when in ring 0, otherwise RDTSC can be used at any privilege level.
|
If set, RDTSC instruction can only be executed when in ring 0, otherwise RDTSC can be used at any privilege level.
|
||||||
1 PVI Protected-mode Virtual Interrupts If set, enables support for the virtual interrupt flag (VIF) in protected mode.
|
1 PVI Protected-mode Virtual Interrupts If set, enables support for the virtual interrupt flag (VIF) in protected mode.
|
||||||
0 VME Virtual 8086 Mode Extensions If set, enables support for the virtual interrupt flag (VIF) in virtual-8086 mode.
|
0 VME Virtual 8086 Mode Extensions If set, enables support for the virtual interrupt flag (VIF) in virtual-8086 mode.
|
||||||
*/
|
*/
|
||||||
this.cr4 = 0; // control register 4
|
this.cr4 = 0; // control register 4
|
||||||
|
|
||||||
|
@ -2042,7 +2042,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
}
|
}
|
||||||
return qc;
|
return qc;
|
||||||
}
|
}
|
||||||
function fd(gd) {
|
function check_status_bits_for_jump(gd) {
|
||||||
var qc;
|
var qc;
|
||||||
switch (gd >> 1) {
|
switch (gd >> 1) {
|
||||||
case 0:
|
case 0:
|
||||||
|
@ -2134,7 +2134,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
blow_up(intno, 0);
|
blow_up(intno, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
function rd(sd) {
|
function change_permission_level(sd) {
|
||||||
cpu.cpl = sd;
|
cpu.cpl = sd;
|
||||||
if (cpu.cpl == 3) {
|
if (cpu.cpl == 3) {
|
||||||
_tlb_read_ = tlb_read_user;
|
_tlb_read_ = tlb_read_user;
|
||||||
|
@ -3655,7 +3655,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
regs[4] = (regs[4] & ~Pa) | ((le) & Pa);
|
regs[4] = (regs[4] & ~Pa) | ((le) & Pa);
|
||||||
selector = (selector & ~3) | he;
|
selector = (selector & ~3) | he;
|
||||||
set_segment_vars(1, selector, ae(Yd, Wd), Zd(Yd, Wd), Wd);
|
set_segment_vars(1, selector, ae(Yd, Wd), Zd(Yd, Wd), Wd);
|
||||||
rd(he);
|
change_permission_level(he);
|
||||||
eip = ve, Kb = Mb = 0;
|
eip = ve, Kb = Mb = 0;
|
||||||
if ((ie & 1) == 0) {
|
if ((ie & 1) == 0) {
|
||||||
cpu.eflags &= ~0x00000200;
|
cpu.eflags &= ~0x00000200;
|
||||||
|
@ -4139,7 +4139,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
}
|
}
|
||||||
selector = (selector & ~3) | he;
|
selector = (selector & ~3) | he;
|
||||||
set_segment_vars(1, selector, ae(Yd, Wd), Zd(Yd, Wd), Wd);
|
set_segment_vars(1, selector, ae(Yd, Wd), Zd(Yd, Wd), Wd);
|
||||||
rd(he);
|
change_permission_level(he);
|
||||||
regs[4] = (regs[4] & ~Pa) | ((Te) & Pa);
|
regs[4] = (regs[4] & ~Pa) | ((Te) & Pa);
|
||||||
eip = ve, Kb = Mb = 0;
|
eip = ve, Kb = Mb = 0;
|
||||||
}
|
}
|
||||||
|
@ -4266,7 +4266,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
}
|
}
|
||||||
kd(df, 0x00000100 | 0x00040000 | 0x00200000 | 0x00000200 | 0x00003000 | 0x00020000 | 0x00004000 | 0x00080000 | 0x00100000);
|
kd(df, 0x00000100 | 0x00040000 | 0x00200000 | 0x00000200 | 0x00003000 | 0x00020000 | 0x00004000 | 0x00080000 | 0x00100000);
|
||||||
fe(1, Ke & 0xffff);
|
fe(1, Ke & 0xffff);
|
||||||
rd(3);
|
change_permission_level(3);
|
||||||
fe(2, gf & 0xffff);
|
fe(2, gf & 0xffff);
|
||||||
fe(0, hf & 0xffff);
|
fe(0, hf & 0xffff);
|
||||||
fe(3, jf & 0xffff);
|
fe(3, jf & 0xffff);
|
||||||
|
@ -4365,7 +4365,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
set_segment_vars(2, gf, ae(we, xe), Zd(we, xe), xe);
|
set_segment_vars(2, gf, ae(we, xe), Zd(we, xe), xe);
|
||||||
}
|
}
|
||||||
set_segment_vars(1, Ke, ae(Yd, Wd), Zd(Yd, Wd), Wd);
|
set_segment_vars(1, Ke, ae(Yd, Wd), Zd(Yd, Wd), Wd);
|
||||||
rd(He);
|
change_permission_level(He);
|
||||||
Te = wd;
|
Te = wd;
|
||||||
Pa = Vd(xe);
|
Pa = Vd(xe);
|
||||||
Pe(0, He);
|
Pe(0, He);
|
||||||
|
@ -5668,7 +5668,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
OPbyte |= (Da = Ra) & 0x0100;
|
OPbyte |= (Da = Ra) & 0x0100;
|
||||||
Fd: for (; ; ) {
|
Fd: for (; ; ) {
|
||||||
switch (OPbyte) {
|
switch (OPbyte) {
|
||||||
case 0x66:
|
case 0x66://Operand-size override prefix
|
||||||
if (Da == Ra)
|
if (Da == Ra)
|
||||||
Cd(Nb, OPbyte);
|
Cd(Nb, OPbyte);
|
||||||
if (Ra & 0x0100)
|
if (Ra & 0x0100)
|
||||||
|
@ -5678,7 +5678,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
OPbyte = phys_mem8[Kb++];
|
OPbyte = phys_mem8[Kb++];
|
||||||
OPbyte |= (Da & 0x0100);
|
OPbyte |= (Da & 0x0100);
|
||||||
break;
|
break;
|
||||||
case 0x67:
|
case 0x67://Address-size override prefix
|
||||||
if (Da == Ra)
|
if (Da == Ra)
|
||||||
Cd(Nb, OPbyte);
|
Cd(Nb, OPbyte);
|
||||||
if (Ra & 0x0080)
|
if (Ra & 0x0080)
|
||||||
|
@ -5688,21 +5688,21 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
OPbyte = phys_mem8[Kb++];
|
OPbyte = phys_mem8[Kb++];
|
||||||
OPbyte |= (Da & 0x0100);
|
OPbyte |= (Da & 0x0100);
|
||||||
break;
|
break;
|
||||||
case 0xf0:
|
case 0xf0://LOCK Assert LOCK# Signal Prefix
|
||||||
if (Da == Ra)
|
if (Da == Ra)
|
||||||
Cd(Nb, OPbyte);
|
Cd(Nb, OPbyte);
|
||||||
Da |= 0x0040;
|
Da |= 0x0040;
|
||||||
OPbyte = phys_mem8[Kb++];
|
OPbyte = phys_mem8[Kb++];
|
||||||
OPbyte |= (Da & 0x0100);
|
OPbyte |= (Da & 0x0100);
|
||||||
break;
|
break;
|
||||||
case 0xf2:
|
case 0xf2://REPNZ Repeat String Operation Prefix
|
||||||
if (Da == Ra)
|
if (Da == Ra)
|
||||||
Cd(Nb, OPbyte);
|
Cd(Nb, OPbyte);
|
||||||
Da |= 0x0020;
|
Da |= 0x0020;
|
||||||
OPbyte = phys_mem8[Kb++];
|
OPbyte = phys_mem8[Kb++];
|
||||||
OPbyte |= (Da & 0x0100);
|
OPbyte |= (Da & 0x0100);
|
||||||
break;
|
break;
|
||||||
case 0xf3:
|
case 0xf3://REPZ Repeat String Operation Prefix
|
||||||
if (Da == Ra)
|
if (Da == Ra)
|
||||||
Cd(Nb, OPbyte);
|
Cd(Nb, OPbyte);
|
||||||
Da |= 0x0010;
|
Da |= 0x0010;
|
||||||
|
@ -5727,7 +5727,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
OPbyte = phys_mem8[Kb++];
|
OPbyte = phys_mem8[Kb++];
|
||||||
OPbyte |= (Da & 0x0100);
|
OPbyte |= (Da & 0x0100);
|
||||||
break;
|
break;
|
||||||
case 0xb0://op = B0+r MOV r8 imm8
|
case 0xb0://B0+r MOV r8 imm8
|
||||||
case 0xb1:
|
case 0xb1:
|
||||||
case 0xb2:
|
case 0xb2:
|
||||||
case 0xb3:
|
case 0xb3:
|
||||||
|
@ -5740,7 +5740,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
Ua = (OPbyte & 4) << 1;
|
Ua = (OPbyte & 4) << 1;
|
||||||
regs[OPbyte & 3] = (regs[OPbyte & 3] & ~(0xff << Ua)) | (((ga) & 0xff) << Ua);
|
regs[OPbyte & 3] = (regs[OPbyte & 3] & ~(0xff << Ua)) | (((ga) & 0xff) << Ua);
|
||||||
break Fd;
|
break Fd;
|
||||||
case 0xb8://op = B8+r MOV r16/32 imm16/32
|
case 0xb8://B8+r MOV r16/32 imm16/32
|
||||||
case 0xb9:
|
case 0xb9:
|
||||||
case 0xba:
|
case 0xba:
|
||||||
case 0xbb:
|
case 0xbb:
|
||||||
|
@ -5774,7 +5774,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break Fd;
|
break Fd;
|
||||||
case 0x89://MOV r/m16/32 r16/32
|
case 0x89://MOV r/m16/32 r16/32
|
||||||
mem8 = phys_mem8[Kb++];
|
mem8 = phys_mem8[Kb++];
|
||||||
ga = regs[(mem8 >> 3) & 7];
|
ga = regs[(mem8 >> 3) & 7];
|
||||||
if ((mem8 >> 6) == 3) {
|
if ((mem8 >> 6) == 3) {
|
||||||
|
@ -5791,7 +5791,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break Fd;
|
break Fd;
|
||||||
case 0x8a://MOV r8 r/m8
|
case 0x8a://MOV r8 r/m8
|
||||||
mem8 = phys_mem8[Kb++];
|
mem8 = phys_mem8[Kb++];
|
||||||
if ((mem8 >> 6) == 3) {
|
if ((mem8 >> 6) == 3) {
|
||||||
Fa = mem8 & 7;
|
Fa = mem8 & 7;
|
||||||
|
@ -5804,7 +5804,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
Ua = (Ga & 4) << 1;
|
Ua = (Ga & 4) << 1;
|
||||||
regs[Ga & 3] = (regs[Ga & 3] & ~(0xff << Ua)) | (((ga) & 0xff) << Ua);
|
regs[Ga & 3] = (regs[Ga & 3] & ~(0xff << Ua)) | (((ga) & 0xff) << Ua);
|
||||||
break Fd;
|
break Fd;
|
||||||
case 0x8b://MOV r16/32 r/m16/32
|
case 0x8b://MOV r16/32 r/m16/32
|
||||||
mem8 = phys_mem8[Kb++];
|
mem8 = phys_mem8[Kb++];
|
||||||
if ((mem8 >> 6) == 3) {
|
if ((mem8 >> 6) == 3) {
|
||||||
ga = regs[mem8 & 7];
|
ga = regs[mem8 & 7];
|
||||||
|
@ -5814,25 +5814,25 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
}
|
}
|
||||||
regs[(mem8 >> 3) & 7] = ga;
|
regs[(mem8 >> 3) & 7] = ga;
|
||||||
break Fd;
|
break Fd;
|
||||||
case 0xa0://MOV AL moffs8
|
case 0xa0://MOV AL moffs8
|
||||||
mem8_loc = Ub();
|
mem8_loc = Ub();
|
||||||
ga = ld_8bits_mem8_read();
|
ga = ld_8bits_mem8_read();
|
||||||
regs[0] = (regs[0] & -256) | ga;
|
regs[0] = (regs[0] & -256) | ga;
|
||||||
break Fd;
|
break Fd;
|
||||||
case 0xa1://MOV eAX moffs16/32
|
case 0xa1://MOV eAX moffs16/32
|
||||||
mem8_loc = Ub();
|
mem8_loc = Ub();
|
||||||
ga = ld_32bits_mem8_read();
|
ga = ld_32bits_mem8_read();
|
||||||
regs[0] = ga;
|
regs[0] = ga;
|
||||||
break Fd;
|
break Fd;
|
||||||
case 0xa2://MOV moffs8 AL
|
case 0xa2://MOV moffs8 AL
|
||||||
mem8_loc = Ub();
|
mem8_loc = Ub();
|
||||||
sb(regs[0]);
|
sb(regs[0]);
|
||||||
break Fd;
|
break Fd;
|
||||||
case 0xa3://MOV moffs16/32 eAX
|
case 0xa3://MOV moffs16/32 eAX
|
||||||
mem8_loc = Ub();
|
mem8_loc = Ub();
|
||||||
wb(regs[0]);
|
wb(regs[0]);
|
||||||
break Fd;
|
break Fd;
|
||||||
case 0xd7://XLAT AL m8 Table Look-up Translation
|
case 0xd7://XLAT AL m8 Table Look-up Translation
|
||||||
mem8_loc = (regs[3] + (regs[0] & 0xff)) >> 0;
|
mem8_loc = (regs[3] + (regs[0] & 0xff)) >> 0;
|
||||||
if (Da & 0x0080)
|
if (Da & 0x0080)
|
||||||
mem8_loc &= 0xffff;
|
mem8_loc &= 0xffff;
|
||||||
|
@ -5845,7 +5845,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
ga = ld_8bits_mem8_read();
|
ga = ld_8bits_mem8_read();
|
||||||
set_either_two_bytes_of_reg_ABCD(0, ga);
|
set_either_two_bytes_of_reg_ABCD(0, ga);
|
||||||
break Fd;
|
break Fd;
|
||||||
case 0xc6://MOV r/m8 imm8
|
case 0xc6://MOV r/m8 imm8
|
||||||
mem8 = phys_mem8[Kb++];
|
mem8 = phys_mem8[Kb++];
|
||||||
if ((mem8 >> 6) == 3) {
|
if ((mem8 >> 6) == 3) {
|
||||||
ga = phys_mem8[Kb++];
|
ga = phys_mem8[Kb++];
|
||||||
|
@ -5856,7 +5856,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
sb(ga);
|
sb(ga);
|
||||||
}
|
}
|
||||||
break Fd;
|
break Fd;
|
||||||
case 0xc7://MOV r/m16/32 imm16/32
|
case 0xc7://MOV r/m16/32 imm16/32
|
||||||
mem8 = phys_mem8[Kb++];
|
mem8 = phys_mem8[Kb++];
|
||||||
if ((mem8 >> 6) == 3) {
|
if ((mem8 >> 6) == 3) {
|
||||||
{
|
{
|
||||||
|
@ -5885,7 +5885,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
regs[0] = regs[Ga];
|
regs[0] = regs[Ga];
|
||||||
regs[Ga] = ga;
|
regs[Ga] = ga;
|
||||||
break Fd;
|
break Fd;
|
||||||
case 0x86://XCHG r8 r/m8 Exchange Register/Memory with Register
|
case 0x86://XCHG r8 r/m8 Exchange Register/Memory with Register
|
||||||
mem8 = phys_mem8[Kb++];
|
mem8 = phys_mem8[Kb++];
|
||||||
Ga = (mem8 >> 3) & 7;
|
Ga = (mem8 >> 3) & 7;
|
||||||
if ((mem8 >> 6) == 3) {
|
if ((mem8 >> 6) == 3) {
|
||||||
|
@ -5899,7 +5899,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
}
|
}
|
||||||
set_either_two_bytes_of_reg_ABCD(Ga, ga);
|
set_either_two_bytes_of_reg_ABCD(Ga, ga);
|
||||||
break Fd;
|
break Fd;
|
||||||
case 0x87://XCHG r16/32 r/m16/32 Exchange Register/Memory with Register
|
case 0x87://XCHG r16/32 r/m16/32 Exchange Register/Memory with Register
|
||||||
mem8 = phys_mem8[Kb++];
|
mem8 = phys_mem8[Kb++];
|
||||||
Ga = (mem8 >> 3) & 7;
|
Ga = (mem8 >> 3) & 7;
|
||||||
if ((mem8 >> 6) == 3) {
|
if ((mem8 >> 6) == 3) {
|
||||||
|
@ -5913,7 +5913,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
}
|
}
|
||||||
regs[Ga] = ga;
|
regs[Ga] = ga;
|
||||||
break Fd;
|
break Fd;
|
||||||
case 0x8e://MOV Sreg r/m16 Move
|
case 0x8e://MOV Sreg r/m16 Move
|
||||||
mem8 = phys_mem8[Kb++];
|
mem8 = phys_mem8[Kb++];
|
||||||
Ga = (mem8 >> 3) & 7;
|
Ga = (mem8 >> 3) & 7;
|
||||||
if (Ga >= 6 || Ga == 1)
|
if (Ga >= 6 || Ga == 1)
|
||||||
|
@ -5926,7 +5926,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
}
|
}
|
||||||
Ie(Ga, ga);
|
Ie(Ga, ga);
|
||||||
break Fd;
|
break Fd;
|
||||||
case 0x8c://MOV m16 Sreg OR MOV r16/32 Sreg Move
|
case 0x8c://MOV m16 Sreg OR MOV r16/32 Sreg Move
|
||||||
mem8 = phys_mem8[Kb++];
|
mem8 = phys_mem8[Kb++];
|
||||||
Ga = (mem8 >> 3) & 7;
|
Ga = (mem8 >> 3) & 7;
|
||||||
if (Ga >= 6)
|
if (Ga >= 6)
|
||||||
|
@ -5943,29 +5943,20 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
ub(ga);
|
ub(ga);
|
||||||
}
|
}
|
||||||
break Fd;
|
break Fd;
|
||||||
case 0xc4:// LES ES r16/32 m16:16/32 Load Far Pointer
|
case 0xc4://LES ES r16/32 m16:16/32 Load Far Pointer
|
||||||
Uf(0);
|
Uf(0);
|
||||||
break Fd;
|
break Fd;
|
||||||
// C5 r LDS DS r16/32 m16:16/32 Load Far Pointer
|
case 0xc5://LDS DS r16/32 m16:16/32 Load Far Pointer
|
||||||
case 0xc5:
|
|
||||||
Uf(3);
|
Uf(3);
|
||||||
break Fd;
|
break Fd;
|
||||||
// 00 r L ADD r/m8 r8 o..szapc o..szapc Add
|
case 0x00://ADD r/m8 r8 Add
|
||||||
// 08 r L OR r/m8 r8 o..szapc o..sz.pc .....a.. o......c Logical Inclusive OR
|
case 0x08://OR r/m8 r8 Logical Inclusive OR
|
||||||
// 10 r L ADC r/m8 r8 .......c o..szapc o..szapc Add with Carry
|
case 0x10://ADC r/m8 r8 Add with Carry
|
||||||
// 18 r L SBB r/m8 r8 .......c o..szapc o..szapc Integer Subtraction with Borrow
|
case 0x18://SBB r/m8 r8 Integer Subtraction with Borrow
|
||||||
// 20 r L AND r/m8 r8 o..szapc o..sz.pc .....a.. o......c Logical AND
|
case 0x20://AND r/m8 r8 Logical AND
|
||||||
// 28 r L SUB r/m8 r8 o..szapc o..szapc Subtract
|
case 0x28://SUB r/m8 r8 Subtract
|
||||||
// 30 r L XOR r/m8 r8 o..szapc o..sz.pc .....a.. o......c Logical Exclusive OR
|
case 0x30://XOR r/m8 r8 Logical Exclusive OR
|
||||||
// 38 r CMP r/m8 r8 o..szapc o..szapc Compare Two Operands
|
case 0x38://CMP r/m8 r8 Compare Two Operands
|
||||||
case 0x00:
|
|
||||||
case 0x08:
|
|
||||||
case 0x10:
|
|
||||||
case 0x18:
|
|
||||||
case 0x20:
|
|
||||||
case 0x28:
|
|
||||||
case 0x30:
|
|
||||||
case 0x38:
|
|
||||||
mem8 = phys_mem8[Kb++];
|
mem8 = phys_mem8[Kb++];
|
||||||
Ja = OPbyte >> 3;
|
Ja = OPbyte >> 3;
|
||||||
Ga = (mem8 >> 3) & 7;
|
Ga = (mem8 >> 3) & 7;
|
||||||
|
@ -5985,7 +5976,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break Fd;
|
break Fd;
|
||||||
case 0x01:
|
case 0x01://ADD r/m16/32 r16/32 Add
|
||||||
mem8 = phys_mem8[Kb++];
|
mem8 = phys_mem8[Kb++];
|
||||||
Ha = regs[(mem8 >> 3) & 7];
|
Ha = regs[(mem8 >> 3) & 7];
|
||||||
if ((mem8 >> 6) == 3) {
|
if ((mem8 >> 6) == 3) {
|
||||||
|
@ -6006,12 +5997,12 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
wb(ga);
|
wb(ga);
|
||||||
}
|
}
|
||||||
break Fd;
|
break Fd;
|
||||||
case 0x09:
|
case 0x09://OR r/m16/32 r16/32 Logical Inclusive OR
|
||||||
case 0x11:
|
case 0x11://ADC r/m16/32 r16/32 Add with Carry
|
||||||
case 0x19:
|
case 0x19://SBB r/m16/32 r16/32 Integer Subtraction with Borrow
|
||||||
case 0x21:
|
case 0x21://AND r/m16/32 r16/32 Logical AND
|
||||||
case 0x29:
|
case 0x29://SUB r/m16/32 r16/32 Subtract
|
||||||
case 0x31:
|
case 0x31://XOR r/m16/32 r16/32 Logical Exclusive OR
|
||||||
mem8 = phys_mem8[Kb++];
|
mem8 = phys_mem8[Kb++];
|
||||||
Ja = OPbyte >> 3;
|
Ja = OPbyte >> 3;
|
||||||
Ha = regs[(mem8 >> 3) & 7];
|
Ha = regs[(mem8 >> 3) & 7];
|
||||||
|
@ -6025,7 +6016,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
wb(ga);
|
wb(ga);
|
||||||
}
|
}
|
||||||
break Fd;
|
break Fd;
|
||||||
case 0x39:
|
case 0x39://CMP r/m16/32 r16/32 Compare Two Operands
|
||||||
mem8 = phys_mem8[Kb++];
|
mem8 = phys_mem8[Kb++];
|
||||||
Ja = OPbyte >> 3;
|
Ja = OPbyte >> 3;
|
||||||
Ha = regs[(mem8 >> 3) & 7];
|
Ha = regs[(mem8 >> 3) & 7];
|
||||||
|
@ -6046,14 +6037,14 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break Fd;
|
break Fd;
|
||||||
case 0x02:
|
case 0x02://ADD r8 r/m8 Add
|
||||||
case 0x0a:
|
case 0x0a://OR r8 r/m8 Logical Inclusive OR
|
||||||
case 0x12:
|
case 0x12://ADC r8 r/m8 Add with Carry
|
||||||
case 0x1a:
|
case 0x1a://SBB r8 r/m8 Integer Subtraction with Borrow
|
||||||
case 0x22:
|
case 0x22://AND r8 r/m8 Logical AND
|
||||||
case 0x2a:
|
case 0x2a://SUB r8 r/m8 Subtract
|
||||||
case 0x32:
|
case 0x32://XOR r8 r/m8 Logical Exclusive OR
|
||||||
case 0x3a:
|
case 0x3a://CMP r8 r/m8 Compare Two Operands
|
||||||
mem8 = phys_mem8[Kb++];
|
mem8 = phys_mem8[Kb++];
|
||||||
Ja = OPbyte >> 3;
|
Ja = OPbyte >> 3;
|
||||||
Ga = (mem8 >> 3) & 7;
|
Ga = (mem8 >> 3) & 7;
|
||||||
|
@ -6542,16 +6533,16 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
break Fd;
|
break Fd;
|
||||||
//Rotate and Shift ops
|
//Rotate and Shift ops
|
||||||
/*
|
/*
|
||||||
C0 0 01+ ROL r/m8 imm8 o..szapc o..szapc o....... Rotate
|
C0 0 01+ ROL r/m8 imm8 o..szapc o..szapc o....... Rotate
|
||||||
C0 1 01+ ROR r/m8 imm8 o..szapc o..szapc o....... Rotate
|
C0 1 01+ ROR r/m8 imm8 o..szapc o..szapc o....... Rotate
|
||||||
C0 2 01+ RCL r/m8 imm8 .......c o..szapc o..szapc o....... Rotate
|
C0 2 01+ RCL r/m8 imm8 .......c o..szapc o..szapc o....... Rotate
|
||||||
C0 3 01+ RCR r/m8 imm8 .......c o..szapc o..szapc o....... Rotate
|
C0 3 01+ RCR r/m8 imm8 .......c o..szapc o..szapc o....... Rotate
|
||||||
C0 4 01+ SHL r/m8 imm8 o..szapc o..sz.pc o....a.c Shift
|
C0 4 01+ SHL r/m8 imm8 o..szapc o..sz.pc o....a.c Shift
|
||||||
SAL r/m8 imm8
|
SAL r/m8 imm8
|
||||||
C0 5 01+ SHR r/m8 imm8 o..szapc o..sz.pc o....a.c Shift
|
C0 5 01+ SHR r/m8 imm8 o..szapc o..sz.pc o....a.c Shift
|
||||||
C0 6 01+ U2 SAL r/m8 imm8 o..szapc o..sz.pc o....a.c Shift
|
C0 6 01+ U2 SAL r/m8 imm8 o..szapc o..sz.pc o....a.c Shift
|
||||||
SHL r/m8 imm8
|
SHL r/m8 imm8
|
||||||
C0 7 01+ SAR r/m8 imm8 o..szapc o..sz.pc o....a.. Shift
|
C0 7 01+ SAR r/m8 imm8 o..szapc o..sz.pc o....a.. Shift
|
||||||
*/
|
*/
|
||||||
case 0xc0:
|
case 0xc0:
|
||||||
mem8 = phys_mem8[Kb++];
|
mem8 = phys_mem8[Kb++];
|
||||||
|
@ -6569,16 +6560,16 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
}
|
}
|
||||||
break Fd;
|
break Fd;
|
||||||
/*
|
/*
|
||||||
C1 0 01+ ROL r/m16/32 imm8 o..szapc o..szapc o....... Rotate
|
C1 0 01+ ROL r/m16/32 imm8 o..szapc o..szapc o....... Rotate
|
||||||
C1 1 01+ ROR r/m16/32 imm8 o..szapc o..szapc o....... Rotate
|
C1 1 01+ ROR r/m16/32 imm8 o..szapc o..szapc o....... Rotate
|
||||||
C1 2 01+ RCL r/m16/32 imm8 .......c o..szapc o..szapc o....... Rotate
|
C1 2 01+ RCL r/m16/32 imm8 .......c o..szapc o..szapc o....... Rotate
|
||||||
C1 3 01+ RCR r/m16/32 imm8 .......c o..szapc o..szapc o....... Rotate
|
C1 3 01+ RCR r/m16/32 imm8 .......c o..szapc o..szapc o....... Rotate
|
||||||
C1 4 01+ SHL r/m16/32 imm8 o..szapc o..sz.pc o....a.c Shift
|
C1 4 01+ SHL r/m16/32 imm8 o..szapc o..sz.pc o....a.c Shift
|
||||||
SAL r/m16/32 imm8
|
SAL r/m16/32 imm8
|
||||||
C1 5 01+ SHR r/m16/32 imm8 o..szapc o..sz.pc o....a.c Shift
|
C1 5 01+ SHR r/m16/32 imm8 o..szapc o..sz.pc o....a.c Shift
|
||||||
C1 6 01+ U2 SAL r/m16/32 imm8 o..szapc o..sz.pc o....a.c Shift
|
C1 6 01+ U2 SAL r/m16/32 imm8 o..szapc o..sz.pc o....a.c Shift
|
||||||
SHL r/m16/32 imm8
|
SHL r/m16/32 imm8
|
||||||
C1 7 01+ SAR r/m16/32 imm8 o..szapc o..sz.pc o....a.. Shift
|
C1 7 01+ SAR r/m16/32 imm8 o..szapc o..sz.pc o....a.. Shift
|
||||||
*/
|
*/
|
||||||
case 0xc1:
|
case 0xc1:
|
||||||
mem8 = phys_mem8[Kb++];
|
mem8 = phys_mem8[Kb++];
|
||||||
|
@ -6596,16 +6587,16 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
}
|
}
|
||||||
break Fd;
|
break Fd;
|
||||||
/*
|
/*
|
||||||
D0 0 ROL r/m8 1 o..szapc o..szapc Rotate
|
D0 0 ROL r/m8 1 o..szapc o..szapc Rotate
|
||||||
D0 1 ROR r/m8 1 o..szapc o..szapc Rotate
|
D0 1 ROR r/m8 1 o..szapc o..szapc Rotate
|
||||||
D0 2 RCL r/m8 1 .......c o..szapc o..szapc Rotate
|
D0 2 RCL r/m8 1 .......c o..szapc o..szapc Rotate
|
||||||
D0 3 RCR r/m8 1 .......c o..szapc o..szapc Rotate
|
D0 3 RCR r/m8 1 .......c o..szapc o..szapc Rotate
|
||||||
D0 4 SHL r/m8 1 o..szapc o..sz.pc .....a.. Shift
|
D0 4 SHL r/m8 1 o..szapc o..sz.pc .....a.. Shift
|
||||||
SAL r/m8 1
|
SAL r/m8 1
|
||||||
D0 5 SHR r/m8 1 o..szapc o..sz.pc .....a.. Shift
|
D0 5 SHR r/m8 1 o..szapc o..sz.pc .....a.. Shift
|
||||||
D0 6 U2 SAL r/m8 1 o..szapc o..sz.pc .....a.. Shift
|
D0 6 U2 SAL r/m8 1 o..szapc o..sz.pc .....a.. Shift
|
||||||
SHL r/m8 1
|
SHL r/m8 1
|
||||||
D0 7 SAR r/m8 1 o..szapc o..sz.pc .....a.. Shift
|
D0 7 SAR r/m8 1 o..szapc o..sz.pc .....a.. Shift
|
||||||
*/
|
*/
|
||||||
case 0xd0:
|
case 0xd0:
|
||||||
mem8 = phys_mem8[Kb++];
|
mem8 = phys_mem8[Kb++];
|
||||||
|
@ -6621,16 +6612,16 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
}
|
}
|
||||||
break Fd;
|
break Fd;
|
||||||
/*
|
/*
|
||||||
D1 0 ROL r/m16/32 1 o..szapc o..szapc Rotate
|
D1 0 ROL r/m16/32 1 o..szapc o..szapc Rotate
|
||||||
D1 1 ROR r/m16/32 1 o..szapc o..szapc Rotate
|
D1 1 ROR r/m16/32 1 o..szapc o..szapc Rotate
|
||||||
D1 2 RCL r/m16/32 1 .......c o..szapc o..szapc Rotate
|
D1 2 RCL r/m16/32 1 .......c o..szapc o..szapc Rotate
|
||||||
D1 3 RCR r/m16/32 1 .......c o..szapc o..szapc Rotate
|
D1 3 RCR r/m16/32 1 .......c o..szapc o..szapc Rotate
|
||||||
D1 4 SHL r/m16/32 1 o..szapc o..sz.pc .....a.. Shift
|
D1 4 SHL r/m16/32 1 o..szapc o..sz.pc .....a.. Shift
|
||||||
SAL r/m16/32 1
|
SAL r/m16/32 1
|
||||||
D1 5 SHR r/m16/32 1 o..szapc o..sz.pc .....a.. Shift
|
D1 5 SHR r/m16/32 1 o..szapc o..sz.pc .....a.. Shift
|
||||||
D1 6 U2 SAL r/m16/32 1 o..szapc o..sz.pc .....a.. Shift
|
D1 6 U2 SAL r/m16/32 1 o..szapc o..sz.pc .....a.. Shift
|
||||||
SHL r/m16/32 1
|
SHL r/m16/32 1
|
||||||
D1 7 SAR r/m16/32 1 o..szapc o..sz.pc .....a.. Shift
|
D1 7 SAR r/m16/32 1 o..szapc o..sz.pc .....a.. Shift
|
||||||
*/
|
*/
|
||||||
case 0xd1:
|
case 0xd1:
|
||||||
mem8 = phys_mem8[Kb++];
|
mem8 = phys_mem8[Kb++];
|
||||||
|
@ -6646,16 +6637,16 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
}
|
}
|
||||||
break Fd;
|
break Fd;
|
||||||
/*
|
/*
|
||||||
D2 0 ROL r/m8 CL o..szapc o..szapc o....... Rotate
|
D2 0 ROL r/m8 CL o..szapc o..szapc o....... Rotate
|
||||||
D2 1 ROR r/m8 CL o..szapc o..szapc o....... Rotate
|
D2 1 ROR r/m8 CL o..szapc o..szapc o....... Rotate
|
||||||
D2 2 RCL r/m8 CL .......c o..szapc o..szapc o....... Rotate
|
D2 2 RCL r/m8 CL .......c o..szapc o..szapc o....... Rotate
|
||||||
D2 3 RCR r/m8 CL .......c o..szapc o..szapc o....... Rotate
|
D2 3 RCR r/m8 CL .......c o..szapc o..szapc o....... Rotate
|
||||||
D2 4 SHL r/m8 CL o..szapc o..sz.pc o....a.c Shift
|
D2 4 SHL r/m8 CL o..szapc o..sz.pc o....a.c Shift
|
||||||
SAL r/m8 CL
|
SAL r/m8 CL
|
||||||
D2 5 SHR r/m8 CL o..szapc o..sz.pc o....a.c Shift
|
D2 5 SHR r/m8 CL o..szapc o..sz.pc o....a.c Shift
|
||||||
D2 6 U2 SAL r/m8 CL o..szapc o..sz.pc o....a.c Shift
|
D2 6 U2 SAL r/m8 CL o..szapc o..sz.pc o....a.c Shift
|
||||||
SHL r/m8 CL
|
SHL r/m8 CL
|
||||||
D2 7 SAR r/m8 CL o..szapc o..sz.pc o....a.. Shift
|
D2 7 SAR r/m8 CL o..szapc o..sz.pc o....a.. Shift
|
||||||
*/
|
*/
|
||||||
case 0xd2:
|
case 0xd2:
|
||||||
mem8 = phys_mem8[Kb++];
|
mem8 = phys_mem8[Kb++];
|
||||||
|
@ -6672,16 +6663,16 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
}
|
}
|
||||||
break Fd;
|
break Fd;
|
||||||
/*
|
/*
|
||||||
D3 0 ROL r/m16/32 CL o..szapc o..szapc o....... Rotate
|
D3 0 ROL r/m16/32 CL o..szapc o..szapc o....... Rotate
|
||||||
D3 1 ROR r/m16/32 CL o..szapc o..szapc o....... Rotate
|
D3 1 ROR r/m16/32 CL o..szapc o..szapc o....... Rotate
|
||||||
D3 2 RCL r/m16/32 CL .......c o..szapc o..szapc o....... Rotate
|
D3 2 RCL r/m16/32 CL .......c o..szapc o..szapc o....... Rotate
|
||||||
D3 3 RCR r/m16/32 CL .......c o..szapc o..szapc o....... Rotate
|
D3 3 RCR r/m16/32 CL .......c o..szapc o..szapc o....... Rotate
|
||||||
D3 4 SHL r/m16/32 CL o..szapc o..sz.pc o....a.c Shift
|
D3 4 SHL r/m16/32 CL o..szapc o..sz.pc o....a.c Shift
|
||||||
SAL r/m16/32 CL
|
SAL r/m16/32 CL
|
||||||
D3 5 SHR r/m16/32 CL o..szapc o..sz.pc o....a.c Shift
|
D3 5 SHR r/m16/32 CL o..szapc o..sz.pc o....a.c Shift
|
||||||
D3 6 U2 SAL r/m16/32 CL o..szapc o..sz.pc o....a.c Shift
|
D3 6 U2 SAL r/m16/32 CL o..szapc o..sz.pc o....a.c Shift
|
||||||
SHL r/m16/32 CL
|
SHL r/m16/32 CL
|
||||||
D3 7 SAR r/m16/32 CL o..szapc o..sz.pc .....a.. Shift
|
D3 7 SAR r/m16/32 CL o..szapc o..sz.pc .....a.. Shift
|
||||||
*/
|
*/
|
||||||
case 0xd3:
|
case 0xd3:
|
||||||
mem8 = phys_mem8[Kb++];
|
mem8 = phys_mem8[Kb++];
|
||||||
|
@ -6697,15 +6688,15 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
wb(ga);
|
wb(ga);
|
||||||
}
|
}
|
||||||
break Fd;
|
break Fd;
|
||||||
//98 CBW AX AL Convert Byte to Word
|
//98 CBW AX AL Convert Byte to Word
|
||||||
case 0x98:
|
case 0x98:
|
||||||
regs[0] = (regs[0] << 16) >> 16;
|
regs[0] = (regs[0] << 16) >> 16;
|
||||||
break Fd;
|
break Fd;
|
||||||
//99 CWD DX AX Convert Word to Doubleword
|
//99 CWD DX AX Convert Word to Doubleword
|
||||||
case 0x99:
|
case 0x99:
|
||||||
regs[2] = regs[0] >> 31;
|
regs[2] = regs[0] >> 31;
|
||||||
break Fd;
|
break Fd;
|
||||||
//50+r PUSH r16/32 Push Word, Doubleword or Quadword Onto the Stack
|
//50+r PUSH r16/32 Push Word, Doubleword or Quadword Onto the Stack
|
||||||
case 0x50:
|
case 0x50:
|
||||||
case 0x51:
|
case 0x51:
|
||||||
case 0x52:
|
case 0x52:
|
||||||
|
@ -6730,7 +6721,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
xd(ga);
|
xd(ga);
|
||||||
}
|
}
|
||||||
break Fd;
|
break Fd;
|
||||||
//58+r POP r16/32 Pop a Value from the Stack
|
//58+r POP r16/32 Pop a Value from the Stack
|
||||||
case 0x58:
|
case 0x58:
|
||||||
case 0x59:
|
case 0x59:
|
||||||
case 0x5a:
|
case 0x5a:
|
||||||
|
@ -6749,15 +6740,15 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
}
|
}
|
||||||
regs[OPbyte & 7] = ga;
|
regs[OPbyte & 7] = ga;
|
||||||
break Fd;
|
break Fd;
|
||||||
//60 01+ PUSHA AX CX DX ... Push All General-Purpose Registers
|
//60 01+ PUSHA AX CX DX ... Push All General-Purpose Registers
|
||||||
case 0x60:
|
case 0x60:
|
||||||
Kf();
|
Kf();
|
||||||
break Fd;
|
break Fd;
|
||||||
//61 01+ POPA DI SI BP ... Pop All General-Purpose Registers
|
//61 01+ POPA DI SI BP ... Pop All General-Purpose Registers
|
||||||
case 0x61:
|
case 0x61:
|
||||||
Mf();
|
Mf();
|
||||||
break Fd;
|
break Fd;
|
||||||
//8F 0 POP r/m16/32 Pop a Value from the Stack
|
//8F 0 POP r/m16/32 Pop a Value from the Stack
|
||||||
case 0x8f:
|
case 0x8f:
|
||||||
mem8 = phys_mem8[Kb++];
|
mem8 = phys_mem8[Kb++];
|
||||||
if ((mem8 >> 6) == 3) {
|
if ((mem8 >> 6) == 3) {
|
||||||
|
@ -6775,7 +6766,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
regs[4] = Ia;
|
regs[4] = Ia;
|
||||||
}
|
}
|
||||||
break Fd;
|
break Fd;
|
||||||
//68 01+ PUSH imm16/32 Push Word, Doubleword or Quadword Onto the Stack
|
//68 01+ PUSH imm16/32 Push Word, Doubleword or Quadword Onto the Stack
|
||||||
case 0x68:
|
case 0x68:
|
||||||
{
|
{
|
||||||
ga = phys_mem8[Kb] | (phys_mem8[Kb + 1] << 8) | (phys_mem8[Kb + 2] << 16) | (phys_mem8[Kb + 3] << 24);
|
ga = phys_mem8[Kb] | (phys_mem8[Kb + 1] << 8) | (phys_mem8[Kb + 2] << 16) | (phys_mem8[Kb + 3] << 24);
|
||||||
|
@ -6789,7 +6780,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
xd(ga);
|
xd(ga);
|
||||||
}
|
}
|
||||||
break Fd;
|
break Fd;
|
||||||
//6A 01+ PUSH imm8 Push Word, Doubleword or Quadword Onto the Stack
|
//6A 01+ PUSH imm8 Push Word, Doubleword or Quadword Onto the Stack
|
||||||
case 0x6a:
|
case 0x6a:
|
||||||
ga = ((phys_mem8[Kb++] << 24) >> 24);
|
ga = ((phys_mem8[Kb++] << 24) >> 24);
|
||||||
if (Qa) {
|
if (Qa) {
|
||||||
|
@ -6800,11 +6791,11 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
xd(ga);
|
xd(ga);
|
||||||
}
|
}
|
||||||
break Fd;
|
break Fd;
|
||||||
//C8 01+ ENTER eBP imm16 imm8 Make Stack Frame for Procedure Parameters
|
//C8 01+ ENTER eBP imm16 imm8 Make Stack Frame for Procedure Parameters
|
||||||
case 0xc8:
|
case 0xc8:
|
||||||
Tf();
|
Tf();
|
||||||
break Fd;
|
break Fd;
|
||||||
//C9 01+ LEAVE eBP High Level Procedure Exit
|
//C9 01+ LEAVE eBP High Level Procedure Exit
|
||||||
case 0xc9:
|
case 0xc9:
|
||||||
if (Qa) {
|
if (Qa) {
|
||||||
mem8_loc = regs[5];
|
mem8_loc = regs[5];
|
||||||
|
@ -6816,8 +6807,8 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
}
|
}
|
||||||
break Fd;
|
break Fd;
|
||||||
/*
|
/*
|
||||||
9C PUSHF Flags Push FLAGS Register onto the Stack
|
9C PUSHF Flags Push FLAGS Register onto the Stack
|
||||||
9C 03+ PUSHFD EFlags Push eFLAGS Register onto the Stack
|
9C 03+ PUSHFD EFlags Push eFLAGS Register onto the Stack
|
||||||
*/
|
*/
|
||||||
case 0x9c:
|
case 0x9c:
|
||||||
Sa = (cpu.eflags >> 12) & 3;
|
Sa = (cpu.eflags >> 12) & 3;
|
||||||
|
@ -6831,8 +6822,8 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
}
|
}
|
||||||
break Fd;
|
break Fd;
|
||||||
/*
|
/*
|
||||||
9D POPF Flags Pop Stack into FLAGS Register
|
9D POPF Flags Pop Stack into FLAGS Register
|
||||||
9D 03+ POPFD EFlags Pop Stack into eFLAGS Register
|
9D 03+ POPFD EFlags Pop Stack into eFLAGS Register
|
||||||
*/
|
*/
|
||||||
case 0x9d:
|
case 0x9d:
|
||||||
Sa = (cpu.eflags >> 12) & 3;
|
Sa = (cpu.eflags >> 12) & 3;
|
||||||
|
@ -7301,33 +7292,33 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
Ae(4, 1, 0, Ha, 0);
|
Ae(4, 1, 0, Ha, 0);
|
||||||
}
|
}
|
||||||
break Fd;
|
break Fd;
|
||||||
//62 r 01+ f BOUND r16/32 m16/32&16/32 eFlags ..i..... ..i..... ..i..... Check Array Index Against Bounds
|
//62 r 01+ f BOUND r16/32 m16/32&16/32 eFlags ..i..... ..i..... ..i..... Check Array Index Against Bounds
|
||||||
case 0x62:
|
case 0x62:
|
||||||
Hf();
|
Hf();
|
||||||
break Fd;
|
break Fd;
|
||||||
// F5 CMC .......c .......c .......c Complement Carry Flag
|
// F5 CMC .......c .......c .......c Complement Carry Flag
|
||||||
case 0xf5:
|
case 0xf5:
|
||||||
_src = hd() ^ 0x0001;
|
_src = hd() ^ 0x0001;
|
||||||
_dst = ((_src >> 6) & 1) ^ 1;
|
_dst = ((_src >> 6) & 1) ^ 1;
|
||||||
_op = 24;
|
_op = 24;
|
||||||
break Fd;
|
break Fd;
|
||||||
//F8 CLC .......c .......c .......c Clear Carry Flag
|
//F8 CLC .......c .......c .......c Clear Carry Flag
|
||||||
case 0xf8:
|
case 0xf8:
|
||||||
_src = hd() & ~0x0001;
|
_src = hd() & ~0x0001;
|
||||||
_dst = ((_src >> 6) & 1) ^ 1;
|
_dst = ((_src >> 6) & 1) ^ 1;
|
||||||
_op = 24;
|
_op = 24;
|
||||||
break Fd;
|
break Fd;
|
||||||
//F9 STC .......c .......c .......C Set Carry Flag
|
//F9 STC .......c .......c .......C Set Carry Flag
|
||||||
case 0xf9:
|
case 0xf9:
|
||||||
_src = hd() | 0x0001;
|
_src = hd() | 0x0001;
|
||||||
_dst = ((_src >> 6) & 1) ^ 1;
|
_dst = ((_src >> 6) & 1) ^ 1;
|
||||||
_op = 24;
|
_op = 24;
|
||||||
break Fd;
|
break Fd;
|
||||||
//FC CLD .d...... .d...... .d...... Clear Direction Flag
|
//FC CLD .d...... .d...... .d...... Clear Direction Flag
|
||||||
case 0xfc:
|
case 0xfc:
|
||||||
cpu.df = 1;
|
cpu.df = 1;
|
||||||
break Fd;
|
break Fd;
|
||||||
//FD STD .d...... .d...... .D...... Set Direction Flag
|
//FD STD .d...... .d...... .D...... Set Direction Flag
|
||||||
case 0xfd:
|
case 0xfd:
|
||||||
cpu.df = -1;
|
cpu.df = -1;
|
||||||
break Fd;
|
break Fd;
|
||||||
|
@ -7362,18 +7353,18 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
cpu.halted = 1;
|
cpu.halted = 1;
|
||||||
La = 257;
|
La = 257;
|
||||||
break Bg;
|
break Bg;
|
||||||
//A4 MOVS m8 m8 .d...... Move Data from String to String
|
//A4 MOVS m8 m8 .d...... Move Data from String to String
|
||||||
//MOVSB m8 m8
|
//MOVSB m8 m8
|
||||||
case 0xa4:
|
case 0xa4:
|
||||||
dg();
|
dg();
|
||||||
break Fd;
|
break Fd;
|
||||||
//A5 MOVS m16 m16 .d...... Move Data from String to String
|
//A5 MOVS m16 m16 .d...... Move Data from String to String
|
||||||
//MOVSW m16 m16
|
//MOVSW m16 m16
|
||||||
case 0xa5:
|
case 0xa5:
|
||||||
sg();
|
sg();
|
||||||
break Fd;
|
break Fd;
|
||||||
//AA STOS m8 AL .d...... Store String
|
//AA STOS m8 AL .d...... Store String
|
||||||
//STOSB m8 AL
|
//STOSB m8 AL
|
||||||
case 0xaa:
|
case 0xaa:
|
||||||
fg();
|
fg();
|
||||||
break Fd;
|
break Fd;
|
||||||
|
@ -7568,6 +7559,37 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
case 0x0f:
|
case 0x0f:
|
||||||
OPbyte = phys_mem8[Kb++];
|
OPbyte = phys_mem8[Kb++];
|
||||||
switch (OPbyte) {
|
switch (OPbyte) {
|
||||||
|
/*
|
||||||
|
0F 80 03+ JO rel16/32 o....... Jump short if overflow (OF=1)
|
||||||
|
0F 81 03+ JNO rel16/32 o....... Jump short if not overflow (OF=0)
|
||||||
|
0F 82 03+ JB rel16/32 .......c Jump short if below/not above or equal/carry (CF=1)
|
||||||
|
JNAE rel16/32
|
||||||
|
JC rel16/32
|
||||||
|
0F 83 03+ JNB rel16/32 .......c Jump short if not below/above or equal/not carry (CF=0)
|
||||||
|
JAE rel16/32
|
||||||
|
JNC rel16/32
|
||||||
|
0F 84 03+ JZ rel16/32 ....z... Jump short if zero/equal (ZF=0)
|
||||||
|
JE rel16/32
|
||||||
|
0F 85 03+ JNZ rel16/32 ....z... Jump short if not zero/not equal (ZF=1)
|
||||||
|
JNE rel16/32
|
||||||
|
0F 86 03+ JBE rel16/32 ....z..c Jump short if below or equal/not above (CF=1 AND ZF=1)
|
||||||
|
JNA rel16/32
|
||||||
|
0F 87 03+ JNBE rel16/32 ....z..c Jump short if not below or equal/above (CF=0 AND ZF=0)
|
||||||
|
JA rel16/32
|
||||||
|
0F 88 03+ JS rel16/32 ...s.... Jump short if sign (SF=1)
|
||||||
|
0F 89 03+ JNS rel16/32 ...s.... Jump short if not sign (SF=0)
|
||||||
|
0F 8A 03+ JP rel16/32 ......p. Jump short if parity/parity even (PF=1)
|
||||||
|
JPE rel16/32
|
||||||
|
0F 8B 03+ JNP rel16/32 ......p. Jump short if not parity/parity odd
|
||||||
|
JPO rel16/32
|
||||||
|
0F 8C 03+ JL rel16/32 o..s.... Jump short if less/not greater (SF!=OF)
|
||||||
|
JNGE rel16/32
|
||||||
|
0F 8D 03+ JNL rel16/32 o..s.... Jump short if not less/greater or equal (SF=OF)
|
||||||
|
JGE rel16/32
|
||||||
|
0F 8E 03+ JLE rel16/32 o..sz... Jump short if less or equal/not greater ((ZF=1) OR (SF!=OF))
|
||||||
|
JNG rel16/32
|
||||||
|
0F 8F 03+ JNLE rel16/32 o..sz... Jump short if not less nor equal/greater ((ZF=0) AND (SF=OF))
|
||||||
|
*/
|
||||||
case 0x80:
|
case 0x80:
|
||||||
case 0x81:
|
case 0x81:
|
||||||
case 0x82:
|
case 0x82:
|
||||||
|
@ -7588,7 +7610,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
ga = phys_mem8[Kb] | (phys_mem8[Kb + 1] << 8) | (phys_mem8[Kb + 2] << 16) | (phys_mem8[Kb + 3] << 24);
|
ga = phys_mem8[Kb] | (phys_mem8[Kb + 1] << 8) | (phys_mem8[Kb + 2] << 16) | (phys_mem8[Kb + 3] << 24);
|
||||||
Kb += 4;
|
Kb += 4;
|
||||||
}
|
}
|
||||||
if (fd(OPbyte & 0xf))
|
if (check_status_bits_for_jump(OPbyte & 0xf))
|
||||||
Kb = (Kb + ga) >> 0;
|
Kb = (Kb + ga) >> 0;
|
||||||
break Fd;
|
break Fd;
|
||||||
case 0x90:
|
case 0x90:
|
||||||
|
@ -7608,7 +7630,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
case 0x9e:
|
case 0x9e:
|
||||||
case 0x9f:
|
case 0x9f:
|
||||||
mem8 = phys_mem8[Kb++];
|
mem8 = phys_mem8[Kb++];
|
||||||
ga = fd(OPbyte & 0xf);
|
ga = check_status_bits_for_jump(OPbyte & 0xf);
|
||||||
if ((mem8 >> 6) == 3) {
|
if ((mem8 >> 6) == 3) {
|
||||||
set_either_two_bytes_of_reg_ABCD(mem8 & 7, ga);
|
set_either_two_bytes_of_reg_ABCD(mem8 & 7, ga);
|
||||||
} else {
|
} else {
|
||||||
|
@ -7639,7 +7661,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
mem8_loc = Pb(mem8);
|
mem8_loc = Pb(mem8);
|
||||||
ga = ld_32bits_mem8_read();
|
ga = ld_32bits_mem8_read();
|
||||||
}
|
}
|
||||||
if (fd(OPbyte & 0xf))
|
if (check_status_bits_for_jump(OPbyte & 0xf))
|
||||||
regs[(mem8 >> 3) & 7] = ga;
|
regs[(mem8 >> 3) & 7] = ga;
|
||||||
break Fd;
|
break Fd;
|
||||||
case 0xb6:
|
case 0xb6:
|
||||||
|
@ -7799,7 +7821,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
}
|
}
|
||||||
regs[mem8 & 7] = ga;
|
regs[mem8 & 7] = ga;
|
||||||
break Fd;
|
break Fd;
|
||||||
// 0F 22 r 03+ 0 MOV CRn r32 o..szapc o..szapc Move to/from Control Registers
|
// 0F 22 r 03+ 0 MOV CRn r32 o..szapc o..szapc Move to/from Control Registers
|
||||||
case 0x22:
|
case 0x22:
|
||||||
if (cpu.cpl != 0)
|
if (cpu.cpl != 0)
|
||||||
blow_up_errcode0(13);
|
blow_up_errcode0(13);
|
||||||
|
@ -7825,7 +7847,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
blow_up_errcode0(6);
|
blow_up_errcode0(6);
|
||||||
}
|
}
|
||||||
break Fd;
|
break Fd;
|
||||||
// 0F 06 02+ 0 CLTS CR0 Clear Task-Switched Flag in CR0
|
// 0F 06 02+ 0 CLTS CR0 Clear Task-Switched Flag in CR0
|
||||||
case 0x06:
|
case 0x06:
|
||||||
if (cpu.cpl != 0)
|
if (cpu.cpl != 0)
|
||||||
blow_up_errcode0(13);
|
blow_up_errcode0(13);
|
||||||
|
@ -8828,7 +8850,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
case 0x17e:
|
case 0x17e:
|
||||||
case 0x17f:
|
case 0x17f:
|
||||||
ga = ((phys_mem8[Kb++] << 24) >> 24);
|
ga = ((phys_mem8[Kb++] << 24) >> 24);
|
||||||
Ha = fd(OPbyte & 0xf);
|
Ha = check_status_bits_for_jump(OPbyte & 0xf);
|
||||||
if (Ha)
|
if (Ha)
|
||||||
eip = (eip + Kb - Mb + ga) & 0xffff, Kb = Mb = 0;
|
eip = (eip + Kb - Mb + ga) & 0xffff, Kb = Mb = 0;
|
||||||
break Fd;
|
break Fd;
|
||||||
|
@ -9061,7 +9083,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
case 0x18e:
|
case 0x18e:
|
||||||
case 0x18f:
|
case 0x18f:
|
||||||
ga = Ob();
|
ga = Ob();
|
||||||
if (fd(OPbyte & 0xf))
|
if (check_status_bits_for_jump(OPbyte & 0xf))
|
||||||
eip = (eip + Kb - Mb + ga) & 0xffff, Kb = Mb = 0;
|
eip = (eip + Kb - Mb + ga) & 0xffff, Kb = Mb = 0;
|
||||||
break Fd;
|
break Fd;
|
||||||
case 0x140:
|
case 0x140:
|
||||||
|
@ -9087,7 +9109,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) {
|
||||||
mem8_loc = Pb(mem8);
|
mem8_loc = Pb(mem8);
|
||||||
ga = ld_16bits_mem8_read();
|
ga = ld_16bits_mem8_read();
|
||||||
}
|
}
|
||||||
if (fd(OPbyte & 0xf))
|
if (check_status_bits_for_jump(OPbyte & 0xf))
|
||||||
set_lower_two_bytes_of_register((mem8 >> 3) & 7, ga);
|
set_lower_two_bytes_of_register((mem8 >> 3) & 7, ga);
|
||||||
break Fd;
|
break Fd;
|
||||||
case 0x1b6:
|
case 0x1b6:
|
||||||
|
@ -10482,6 +10504,8 @@ PCEmulator.prototype.reset = function() { this.request_request = 1; };
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue