|
|
| version 1.1, 2003/10/16 17:57:28 | version 1.7, 2004/08/03 10:11:37 |
|---|---|
| Line 1 | Line 1 |
| #include "compiler.h" | #include "compiler.h" |
| #include "nevent.h" | #include "cpucore.h" |
| #include "i286.h" | |
| #include "i286x.h" | #include "i286x.h" |
| #include "i286xadr.h" | #include "i286xadr.h" |
| #include "memory.h" | #include "i286xs.h" |
| #include "i286x.mcr" | #include "i286x.mcr" |
| #include "i286xea.mcr" | #include "i286xea.mcr" |
| Line 163 I286 cmp_ext8_i(void) { | Line 162 I286 cmp_ext8_i(void) { |
| // dest: I286_REG[eax] src: dl | // dest: I286_REG[eax] src: dl |
| void (*op8xreg8_xtable[])(void) = { | const I286TBL op8xreg8_xtable[8] = { |
| add_r8_i, or_r8_i, adc_r8_i, sbb_r8_i, | add_r8_i, or_r8_i, adc_r8_i, sbb_r8_i, |
| and_r8_i, sub_r8_i, xor_r8_i, cmp_r8_i}; | and_r8_i, sub_r8_i, xor_r8_i, cmp_r8_i}; |
| // dest: ecx src: dl | // dest: ecx src: dl |
| void (*op8xext8_xtable[])(void) = { | const I286TBL op8xext8_xtable[8] = { |
| add_ext8_i, or_ext8_i, adc_ext8_i, sbb_ext8_i, | add_ext8_i, or_ext8_i, adc_ext8_i, sbb_ext8_i, |
| and_ext8_i, sub_ext8_i, xor_ext8_i, cmp_ext8_i}; | and_ext8_i, sub_ext8_i, xor_ext8_i, cmp_ext8_i}; |
| Line 330 I286 cmp_ext16_i(void) { | Line 329 I286 cmp_ext16_i(void) { |
| // dest: ebp src: bx | // dest: ebp src: bx |
| void (*op8xreg16_xtable[])(void) = { | const I286TBL op8xreg16_xtable[8] = { |
| add_r16_i, or_r16_i, adc_r16_i, sbb_r16_i, | add_r16_i, or_r16_i, adc_r16_i, sbb_r16_i, |
| and_r16_i, sub_r16_i, xor_r16_i, cmp_r16_i}; | and_r16_i, sub_r16_i, xor_r16_i, cmp_r16_i}; |
| // dest: [ecx]=dx src: bx | // dest: [ecx]=dx src: bx |
| void (*op8xext16_xtable[])(void) = { | const I286TBL op8xext16_xtable[8] = { |
| add_ext16_i, or_ext16_i, adc_ext16_i, sbb_ext16_i, | add_ext16_i, or_ext16_i, adc_ext16_i, sbb_ext16_i, |
| and_ext16_i, sub_ext16_i, xor_ext16_i, cmp_ext16_i}; | and_ext16_i, sub_ext16_i, xor_ext16_i, cmp_ext16_i}; |
| Line 418 I286 cmp_ext16a_i(void) { | Line 417 I286 cmp_ext16a_i(void) { |
| } | } |
| // dest: [ecx]=dx src: ax | // dest: [ecx]=dx src: ax |
| void (*op8xext16_atable[])(void) = { | const I286TBL op8xext16_atable[8] = { |
| add_ext16a_i, or_ext16a_i, adc_ext16a_i, sbb_ext16a_i, | add_ext16a_i, or_ext16a_i, adc_ext16a_i, sbb_ext16a_i, |
| and_ext16a_i, sub_ext16a_i, xor_ext16a_i, cmp_ext16a_i}; | and_ext16a_i, sub_ext16a_i, xor_ext16a_i, cmp_ext16a_i}; |
| Line 663 I286 sar_ext8_1(void) { | Line 662 I286 sar_ext8_1(void) { |
| } | } |
| void (*sftreg8_xtable[])(void) = { | const I286TBL sftreg8_xtable[8] = { |
| rol_r8_1, ror_r8_1, rcl_r8_1, rcr_r8_1, | rol_r8_1, ror_r8_1, rcl_r8_1, rcr_r8_1, |
| shl_r8_1, shr_r8_1, shl_r8_1, sar_r8_1}; | shl_r8_1, shr_r8_1, shl_r8_1, sar_r8_1}; |
| void (*sftmem8_xtable[])(void) = { | const I286TBL sftmem8_xtable[8] = { |
| rol_mem8_1, ror_mem8_1, rcl_mem8_1, rcr_mem8_1, | rol_mem8_1, ror_mem8_1, rcl_mem8_1, rcr_mem8_1, |
| shl_mem8_1, shr_mem8_1, shl_mem8_1, sar_mem8_1}; | shl_mem8_1, shr_mem8_1, shl_mem8_1, sar_mem8_1}; |
| void (*sftext8_xtable[])(void) = { | const I286TBL sftext8_xtable[8] = { |
| rol_ext8_1, ror_ext8_1, rcl_ext8_1, rcr_ext8_1, | rol_ext8_1, ror_ext8_1, rcl_ext8_1, rcr_ext8_1, |
| shl_ext8_1, shr_ext8_1, shl_ext8_1, sar_ext8_1}; | shl_ext8_1, shr_ext8_1, shl_ext8_1, sar_ext8_1}; |
| Line 916 I286 sar_ext16_1(void) { | Line 915 I286 sar_ext16_1(void) { |
| } | } |
| void (*sftreg16_xtable[])(void) = { | const I286TBL sftreg16_xtable[8] = { |
| rol_r16_1, ror_r16_1, rcl_r16_1, rcr_r16_1, | rol_r16_1, ror_r16_1, rcl_r16_1, rcr_r16_1, |
| shl_r16_1, shr_r16_1, shl_r16_1, sar_r16_1}; | shl_r16_1, shr_r16_1, shl_r16_1, sar_r16_1}; |
| void (*sftmem16_xtable[])(void) = { | const I286TBL sftmem16_xtable[8] = { |
| rol_mem16_1, ror_mem16_1, rcl_mem16_1, rcr_mem16_1, | rol_mem16_1, ror_mem16_1, rcl_mem16_1, rcr_mem16_1, |
| shl_mem16_1, shr_mem16_1, shl_mem16_1, sar_mem16_1}; | shl_mem16_1, shr_mem16_1, shl_mem16_1, sar_mem16_1}; |
| void (*sftext16_xtable[])(void) = { | const I286TBL sftext16_xtable[8] = { |
| rol_ext16_1, ror_ext16_1, rcl_ext16_1, rcr_ext16_1, | rol_ext16_1, ror_ext16_1, rcl_ext16_1, rcr_ext16_1, |
| shl_ext16_1, shr_ext16_1, shl_ext16_1, sar_ext16_1}; | shl_ext16_1, shr_ext16_1, shl_ext16_1, sar_ext16_1}; |
| Line 1098 I286 sar_ext8_cl(void) { | Line 1097 I286 sar_ext8_cl(void) { |
| } | } |
| void (*sftreg8cl_xtable[])(void) = { | const I286TBL sftreg8cl_xtable[8] = { |
| rol_r8_cl, ror_r8_cl, rcl_r8_cl, rcr_r8_cl, | rol_r8_cl, ror_r8_cl, rcl_r8_cl, rcr_r8_cl, |
| shl_r8_cl, shr_r8_cl, shl_r8_cl, sar_r8_cl}; | shl_r8_cl, shr_r8_cl, shl_r8_cl, sar_r8_cl}; |
| void (*sftext8cl_xtable[])(void) = { | const I286TBL sftext8cl_xtable[8] = { |
| rol_ext8_cl, ror_ext8_cl, rcl_ext8_cl, rcr_ext8_cl, | rol_ext8_cl, ror_ext8_cl, rcl_ext8_cl, rcr_ext8_cl, |
| shl_ext8_cl, shr_ext8_cl, shl_ext8_cl, sar_ext8_cl}; | shl_ext8_cl, shr_ext8_cl, shl_ext8_cl, sar_ext8_cl}; |
| Line 1276 I286 sar_ext16_cl(void) { | Line 1275 I286 sar_ext16_cl(void) { |
| } | } |
| void (*sftreg16cl_xtable[])(void) = { | const I286TBL sftreg16cl_xtable[8] = { |
| rol_r16_cl, ror_r16_cl, rcl_r16_cl, rcr_r16_cl, | rol_r16_cl, ror_r16_cl, rcl_r16_cl, rcr_r16_cl, |
| shl_r16_cl, shr_r16_cl, shl_r16_cl, sar_r16_cl}; | shl_r16_cl, shr_r16_cl, shl_r16_cl, sar_r16_cl}; |
| void (*sftext16cl_xtable[])(void) = { | const I286TBL sftext16cl_xtable[8] = { |
| rol_ext16_cl, ror_ext16_cl, rcl_ext16_cl, rcr_ext16_cl, | rol_ext16_cl, ror_ext16_cl, rcl_ext16_cl, rcr_ext16_cl, |
| shl_ext16_cl, shr_ext16_cl, shl_ext16_cl, sar_ext16_cl}; | shl_ext16_cl, shr_ext16_cl, shl_ext16_cl, sar_ext16_cl}; |
| Line 1398 I286 imul_ea8(void) { | Line 1397 I286 imul_ea8(void) { |
| I286 div_ea8(void) { | I286 div_ea8(void) { |
| __asm { | __asm { |
| push esi | |
| PREPART_EA8(14) | PREPART_EA8(14) |
| movzx ebp, byte ptr I286_REG[eax] | movzx ebp, byte ptr I286_REG[eax] |
| GET_NEXTPRE2 | GET_NEXTPRE2 |
| jmp divcheck | jmp divcheck |
| MEMORY_EA8(22) | MEMORY_EA8(17) |
| movzx ebp, byte ptr I286_MEM[ecx] | movzx ebp, byte ptr I286_MEM[ecx] |
| jmp divcheck | jmp divcheck |
| EXTMEM_EA8 | EXTMEM_EA8 |
| movzx ebp, al | movzx ebp, al |
| align 4 | |
| divcheck: | align 4 |
| test ebp, ebp | divcheck: test ebp, ebp |
| je divovf | je divovf |
| mov ax, I286_AX | mov ax, I286_AX |
| xor dx, dx | xor dx, dx |
| div bp | div bp |
| mov I286_AL, al | mov I286_AL, al |
| mov I286_AH, dl | mov I286_AH, dl |
| mov dx, ax | mov dx, ax |
| FLAG_STORE_OF | FLAG_STORE_OF |
| test dh, dh | test dh, dh |
| jne divovf | jne divovf |
| ret | pop eax |
| align 4 | ret |
| divovf: | |
| INT_NUM(0) | align 4 |
| divovf: pop esi | |
| INT_NUM(0) | |
| } | } |
| } | } |
| I286 idiv_ea8(void) { | I286 idiv_ea8(void) { |
| __asm { | __asm { |
| push esi | |
| PREPART_EA8(17) | PREPART_EA8(17) |
| movsx ebp, byte ptr I286_REG[eax] | movsx ebp, byte ptr I286_REG[eax] |
| GET_NEXTPRE2 | GET_NEXTPRE2 |
| jmp idivcheck | jmp idivcheck |
| MEMORY_EA8(25) | MEMORY_EA8(20) |
| movsx ebp, byte ptr I286_MEM[ecx] | movsx ebp, byte ptr I286_MEM[ecx] |
| jmp idivcheck | jmp idivcheck |
| EXTMEM_EA8 | EXTMEM_EA8 |
| movsx ebp, al | movsx ebp, al |
| align 4 | |
| idivcheck: | align 4 |
| test ebp, ebp | idivcheck: test ebp, ebp |
| je idivovf | je idivovf |
| mov ax, I286_AX | mov ax, I286_AX |
| cwd | cwd |
| idiv bp | idiv bp |
| mov I286_AL, al | mov I286_AL, al |
| mov I286_AH, dl | mov I286_AH, dl |
| mov dx, ax | mov dx, ax |
| FLAG_STORE_OF | FLAG_STORE_OF |
| bt dx, 7 | bt dx, 7 |
| adc dh, 0 | adc dh, 0 |
| jne idivovf | jne idivovf |
| ret | pop eax |
| align 4 | ret |
| idivovf: | |
| INT_NUM(0) | align 4 |
| idivovf: pop esi | |
| INT_NUM(0) | |
| } | } |
| } | } |
| Line 1577 I286 imul_ea16(void) { | Line 1582 I286 imul_ea16(void) { |
| I286 div_ea16(void) { | I286 div_ea16(void) { |
| __asm { | __asm { |
| PREPART_EA16(17) | push esi |
| PREPART_EA16(22) | |
| movzx ebp, word ptr I286_REG[eax*2] | movzx ebp, word ptr I286_REG[eax*2] |
| GET_NEXTPRE2 | GET_NEXTPRE2 |
| jmp divcheck | jmp divcheck |
| Line 1586 I286 div_ea16(void) { | Line 1592 I286 div_ea16(void) { |
| jmp divcheck | jmp divcheck |
| EXTMEM_EA16 | EXTMEM_EA16 |
| movzx ebp, ax | movzx ebp, ax |
| align 4 | |
| divcheck: | align 4 |
| test ebp, ebp | divcheck: test ebp, ebp |
| je divovf | je divovf |
| movzx eax, I286_DX | movzx eax, I286_DX |
| shl eax, 16 | shl eax, 16 |
| mov ax, I286_AX | mov ax, I286_AX |
| xor edx, edx | xor edx, edx |
| div ebp | div ebp |
| mov I286_AX, ax | mov I286_AX, ax |
| mov I286_DX, dx | mov I286_DX, dx |
| FLAG_STORE_OF | FLAG_STORE_OF |
| cmp eax, 10000h | cmp eax, 10000h |
| jae divovf | jae divovf |
| ret | pop eax |
| align 4 | ret |
| divovf: | |
| INT_NUM(0) | align 4 |
| divovf: pop esi | |
| INT_NUM(0) | |
| } | } |
| } | } |
| I286 idiv_ea16(void) { | I286 idiv_ea16(void) { |
| __asm { | __asm { |
| PREPART_EA16(20) | push esi |
| PREPART_EA16(25) | |
| movsx ebp, word ptr I286_REG[eax*2] | movsx ebp, word ptr I286_REG[eax*2] |
| GET_NEXTPRE2 | GET_NEXTPRE2 |
| jmp idivcheck | jmp idivcheck |
| Line 1620 I286 idiv_ea16(void) { | Line 1629 I286 idiv_ea16(void) { |
| EXTMEM_EA16 | EXTMEM_EA16 |
| cwde | cwde |
| mov ebp, eax | mov ebp, eax |
| align 4 | |
| idivcheck: | align 4 |
| test ebp, ebp | idivcheck: test ebp, ebp |
| je idivovf | je idivovf |
| movzx eax, I286_DX | movzx eax, I286_DX |
| shl eax, 16 | shl eax, 16 |
| mov ax, I286_AX | mov ax, I286_AX |
| cdq | cdq |
| idiv ebp | idiv ebp |
| mov I286_AX, ax | mov I286_AX, ax |
| mov I286_DX, dx | mov I286_DX, dx |
| mov edx, eax | mov edx, eax |
| FLAG_STORE_OF | FLAG_STORE_OF |
| shr edx, 16 | shr edx, 16 |
| adc dx, 0 | adc dx, 0 |
| jne idivovf | jne idivovf |
| ret | pop eax |
| align 4 | ret |
| idivovf: | |
| INT_NUM(0) | align 4 |
| idivovf: pop esi | |
| INT_NUM(0) | |
| } | } |
| } | } |
| void (*ope0xf6_xtable[])(void) = { | const I286TBL ope0xf6_xtable[8] = { |
| test_ea8_data8, test_ea8_data8, | test_ea8_data8, test_ea8_data8, |
| not_ea8, neg_ea8, | not_ea8, neg_ea8, |
| mul_ea8, imul_ea8, | mul_ea8, imul_ea8, |
| div_ea8, idiv_ea8}; | div_ea8, idiv_ea8}; |
| void (*ope0xf7_xtable[])(void) = { | const I286TBL ope0xf7_xtable[8] = { |
| test_ea16_data16, test_ea16_data16, | test_ea16_data16, test_ea16_data16, |
| not_ea16, neg_ea16, | not_ea16, neg_ea16, |
| mul_ea16, imul_ea16, | mul_ea16, imul_ea16, |
| Line 1794 I286 call_far_ea16(void) { | Line 1805 I286 call_far_ea16(void) { |
| lea ecx, [edi + ebp] | lea ecx, [edi + ebp] |
| call i286_memoryread_w | call i286_memoryread_w |
| mov I286_CS, ax | mov I286_CS, ax |
| and eax, 0000ffffh | movzx eax, ax |
| test byte ptr (I286_MSW), MSW_PE | |
| jne short call_far_pe | |
| shl eax, 4 // make segreg | shl eax, 4 // make segreg |
| mov CS_BASE, eax | call_far_base: mov CS_BASE, eax |
| RESET_XPREFETCH | RESET_XPREFETCH |
| ret | ret |
| align 4 | |
| register_eareg16: | call_far_pe: push offset call_far_base |
| jmp i286x_selector | |
| register_eareg16: | |
| INT_NUM(6) | INT_NUM(6) |
| } | } |
| } | } |
| Line 1839 I286 jmp_far_ea16(void) { | Line 1855 I286 jmp_far_ea16(void) { |
| lea ecx, [edi + ebp] | lea ecx, [edi + ebp] |
| call i286_memoryread_w | call i286_memoryread_w |
| mov I286_CS, ax | mov I286_CS, ax |
| and eax, 0000ffffh | movzx eax, ax |
| test byte ptr (I286_MSW), MSW_PE | |
| jne short jmp_far_pe | |
| shl eax, 4 // make segreg | shl eax, 4 // make segreg |
| mov CS_BASE, eax | jmp_far_base: mov CS_BASE, eax |
| RESET_XPREFETCH | RESET_XPREFETCH |
| ret | ret |
| align 4 | |
| register_eareg16: | jmp_far_pe: push offset jmp_far_base |
| jmp i286x_selector | |
| register_eareg16: | |
| INT_NUM(6) | INT_NUM(6) |
| } | } |
| } | } |
| Line 1898 I286 pop_ea16(void) { | Line 1919 I286 pop_ea16(void) { |
| } | } |
| void (*ope0xfe_xtable[])(void) = { | const I286TBL ope0xfe_xtable[2] = { |
| inc_ea8, dec_ea8}; | inc_ea8, dec_ea8}; |
| void (*ope0xff_xtable[])(void) = { | const I286TBL ope0xff_xtable[8] = { |
| inc_ea16, dec_ea16, | inc_ea16, dec_ea16, |
| call_ea16, call_far_ea16, | call_ea16, call_far_ea16, |
| jmp_ea16, jmp_far_ea16, | jmp_ea16, jmp_far_ea16, |