--- np2/i286x/i286x.cpp 2004/02/18 18:29:29 1.20 +++ np2/i286x/i286x.cpp 2005/03/25 14:57:56 1.27 @@ -11,12 +11,16 @@ #include "i286xea.mcr" #include "v30patch.h" #include "bios.h" -#include "dmap.h" +#include "dmax86.h" +#if defined(ENABLE_TRAP) +#include "steptrap.h" +#include "inttrap.h" +#endif I286CORE i286core; -const BYTE iflags[256] = { // Z_FLAG, S_FLAG, P_FLAG +const UINT8 iflags[256] = { // Z_FLAG, S_FLAG, P_FLAG 0x44, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, @@ -95,7 +99,7 @@ void i286x_setextsize(UINT32 size) { CPU_EXTMEM = NULL; } if (size) { - CPU_EXTMEM = (BYTE *)_MALLOC(size + 16, "EXTMEM"); + CPU_EXTMEM = (UINT8 *)_MALLOC(size + 16, "EXTMEM"); if (CPU_EXTMEM == NULL) { size = 0; } @@ -110,7 +114,7 @@ void i286x_setextsize(UINT32 size) { void i286x_setemm(UINT frame, UINT32 addr) { - BYTE *ptr; + UINT8 *ptr; frame &= 3; if (addr < USE_HIMEM) { @@ -138,7 +142,7 @@ LABEL void i286x_resetprefetch(void) { } } -LABEL void __fastcall i286x_interrupt(BYTE vect) { +LABEL void __fastcall i286x_interrupt(UINT8 vect) { __asm { pushad @@ -264,7 +268,13 @@ LABEL void i286x(void) { cmp dmac.working, 0 jne short i286_dma_mnlp -i286_mnlp: movzx eax, bl +i286_mnlp: +#if defined(ENABLE_TRAP) + mov edx, esi + movzx ecx, I286_CS + call steptrap +#endif + movzx eax, bl call i286op[eax*4] cmp I286_REMCLOCK, 0 jg i286_mnlp @@ -274,9 +284,15 @@ i286_mnlp: movzx eax, bl ret align 16 -i286_dma_mnlp: movzx eax, bl +i286_dma_mnlp: +#if defined(ENABLE_TRAP) + mov edx, esi + movzx ecx, I286_CS + call steptrap +#endif + movzx eax, bl call i286op[eax*4] - call dmap_i286 + call dmax86 cmp I286_REMCLOCK, 0 jg i286_dma_mnlp mov dword ptr (i286core.s.prefetchque), ebx @@ -285,7 +301,13 @@ i286_dma_mnlp: movzx eax, bl ret align 16 -i286_trapping: movzx eax, bl +i286_trapping: +#if defined(ENABLE_TRAP) + mov edx, esi + movzx ecx, I286_CS + call steptrap +#endif + movzx eax, bl call i286op[eax*4] cmp I286_TRAP, 0 je i286notrap @@ -318,7 +340,7 @@ nexts: mov dword ptr (i286core.s.prefetchque), ebx mov I286_IP, si - call dmap_i286 + call dmax86 popad ret } @@ -343,7 +365,7 @@ LABEL void removeprefix(void) { I286 _reserved(void) { __asm { - inc si // 01/08/31 +// inc si // 01/08/31 INT_NUM(6) } } @@ -448,7 +470,7 @@ I286 pop_es(void) { // 07: pop es I286CLOCK(5) REGPOP(I286_ES) movzx eax, ax - test I286_MSW, MSW_PE + test byte ptr (I286_MSW), MSW_PE jne short pop_es_pe shl eax, 4 // make segreg pop_es_base: mov ES_BASE, eax @@ -661,7 +683,7 @@ I286 pop_ss(void) { // 17: pop ss I286CLOCK(5) REGPOP(I286_SS) movzx eax, ax - test I286_MSW, MSW_PE + test byte ptr (I286_MSW), MSW_PE jne short pop_ss_pe shl eax, 4 // make segreg pop_ss_base: mov SS_BASE, eax @@ -790,7 +812,7 @@ I286 pop_ds(void) { // 1F: pop ds I286CLOCK(5) REGPOP(I286_DS) movzx eax, ax - test I286_MSW, MSW_PE + test byte ptr (I286_MSW), MSW_PE jne short pop_ds_pe shl eax, 4 // make segreg pop_ds_base: mov DS_BASE, eax @@ -1695,7 +1717,7 @@ I286 _arpl(void) { xor eax, eax cmp bh, 0c0h setc al - add si, ax + // add si, ax add eax, 10 I286CLOCK(eax) INT_NUM(6) @@ -2498,7 +2520,7 @@ I286 mov_seg_ea(void) { // 8E: mov segset: mov word ptr I286_SEGREG[ebp], ax movzx eax, ax - test I286_MSW, MSW_PE + test byte ptr (I286_MSW), MSW_PE jne short mov_seg_pe shl eax, 4 // make segreg mov_seg_base: mov SEG_BASE[ebp*2], eax @@ -2714,7 +2736,7 @@ I286 call_far(void) { // 9A: call mov si, bx shr ebx, 16 mov I286_CS, bx - test I286_MSW, MSW_PE + test byte ptr (I286_MSW), MSW_PE jne short call_far_pe shl ebx, 4 mov CS_BASE, ebx @@ -3370,13 +3392,17 @@ I286 les_r16_ea(void) { // C4: les lea ecx, [edi + ebp] call i286_memoryread_w mov I286_ES, ax - and eax, 0000ffffh + movzx eax, ax + test byte ptr (I286_MSW), MSW_PE + jne short les_pe shl eax, 4 // make segreg - mov ES_BASE, eax +les_base: mov ES_BASE, eax ret - align 4 - src_register: - INT_NUM(6) + +les_pe: push offset les_base + jmp i286x_selector + +src_register: INT_NUM(6) } } @@ -3399,14 +3425,19 @@ I286 lds_r16_ea(void) { // C5: lds lea ecx, [edi + ebp] call i286_memoryread_w mov I286_DS, ax - and eax, 0000ffffh + movzx eax, ax + test byte ptr (I286_MSW), MSW_PE + jne short lds_pe shl eax, 4 // make segreg - mov DS_BASE, eax +lds_base: mov DS_BASE, eax mov DS_FIX, eax ret - align 16 - src_register: - INT_NUM(6) + +lds_pe: push offset lds_base + jmp i286x_selector + +src_register: INT_NUM(6) + } } @@ -3422,7 +3453,7 @@ I286 mov_ea8_data8(void) { // C6: m bt bp, 2 rcl ebp, 1 and ebp, 7 - GET_NEXTPRE2 + GET_NEXTPRE3 mov byte ptr I286_REG[ebp], dh ret align 16 @@ -3478,7 +3509,7 @@ I286 _enter(void) { // C8: enter je enter0 dec eax je enter1 - lea ecx, [eax*4 + 12] + lea ecx, [eax*4 + 12 + 4] I286CLOCK(ecx) push ebx movzx ebx, I286_BP @@ -3559,7 +3590,7 @@ I286 ret_far_data16(void) { // CA: call i286_memoryread_w mov I286_CS, ax movzx eax, ax - test I286_MSW, MSW_PE + test byte ptr (I286_MSW), MSW_PE jne short ret_far16_pe shl eax, 4 // make segreg ret_far16_base: mov CS_BASE, eax @@ -3587,7 +3618,7 @@ I286 ret_far(void) { // CB: ret fa call i286_memoryread_w mov I286_CS, ax movzx eax, ax - test I286_MSW, MSW_PE + test byte ptr (I286_MSW), MSW_PE jne short ret_far_pe shl eax, 4 // make segreg ret_far_base: mov CS_BASE, eax @@ -3626,6 +3657,13 @@ I286 int_data8(void) { // CD: int lea ecx, [edi + ebp] mov dx, I286_CS call i286_memorywrite_w +#if defined(ENABLE_TRAP) + movzx eax, bh + push eax + lea edx, [esi - 1] + movzx ecx, I286_CS + call softinttrap +#endif movzx eax, bh sub bp, 2 mov I286_SP, bp @@ -3651,7 +3689,8 @@ I286 _into(void) { // CE: into GET_NEXTPRE1 ret - intovf: INT_NUM(4) + intovf: inc si // ver0.80 + INT_NUM(4) } } @@ -4096,7 +4135,7 @@ I286 jmp_far(void) { // EA: jmp fa mov si, bx shr ebx, 16 mov I286_CS, bx - test I286_MSW, MSW_PE + test byte ptr (I286_MSW), MSW_PE jne short jmp_far_pe shl ebx, 4 // make segreg mov CS_BASE, ebx @@ -4339,7 +4378,7 @@ I286 _ope0xff(void) { // FF: // ------------------------------------------------------------------------- -void (*i286op[])(void) = { +const I286TBL i286op[256] = { add_ea_r8, // 00: add EA, REG8 add_ea_r16, // 01: add EA, REG16 add_r8_ea, // 02: add REG8, EA @@ -4663,7 +4702,7 @@ I286 repe_segprefix_ds(void) { } } -void (*i286op_repe[])(void) = { +const I286TBL i286op_repe[256] = { add_ea_r8, // 00: add EA, REG8 add_ea_r16, // 01: add EA, REG16 add_r8_ea, // 02: add REG8, EA @@ -4987,7 +5026,7 @@ I286 repne_segprefix_ds(void) { } } -void (*i286op_repne[])(void) = { +const I286TBL i286op_repne[256] = { add_ea_r8, // 00: add EA, REG8 add_ea_r16, // 01: add EA, REG16 add_r8_ea, // 02: add REG8, EA