--- np2/i286x/i286x.cpp 2004/01/25 05:41:29 1.16 +++ np2/i286x/i286x.cpp 2004/02/18 20:11:36 1.21 @@ -90,7 +90,10 @@ void i286x_shut(void) { void i286x_setextsize(UINT32 size) { if (CPU_EXTMEMSIZE != size) { - _MFREE(CPU_EXTMEM); + if (CPU_EXTMEM) { + _MFREE(CPU_EXTMEM); + CPU_EXTMEM = NULL; + } if (size) { CPU_EXTMEM = (BYTE *)_MALLOC(size + 16, "EXTMEM"); if (CPU_EXTMEM == NULL) { @@ -445,7 +448,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 @@ -658,7 +661,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 @@ -787,7 +790,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 @@ -2495,7 +2498,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 @@ -2711,10 +2714,17 @@ I286 call_far(void) { // 9A: call mov si, bx shr ebx, 16 mov I286_CS, bx + test byte ptr (I286_MSW), MSW_PE + jne short call_far_pe shl ebx, 4 mov CS_BASE, ebx - RESET_XPREFETCH +call_far_base: RESET_XPREFETCH ret + +call_far_pe: mov eax, ebx + call i286x_selector + mov CS_BASE, eax + jmp short call_far_base } } @@ -2758,14 +2768,12 @@ I286 _popf(void) { // 9D: popf je irqcheck // fast_intr test ah, 2 je nextop - cmp pic.ext_irq, 0 - jne nextop - mov al, pic.pi[0].imr - mov ah, pic.pi[1].imr + mov al, pic.pi[0 * (type _PICITEM)].imr + mov ah, pic.pi[1 * (type _PICITEM)].imr not ax - test al, pic.pi[0].irr + test al, pic.pi[0 * (type _PICITEM)].irr jne irqcheck - test ah, pic.pi[1].irr + test ah, pic.pi[1 * (type _PICITEM)].irr jne irqcheck nextop: ret @@ -2866,10 +2874,8 @@ I286 _movsb(void) { // A4: movsb add ecx, DS_FIX call i286_memoryread mov dl, al - movzx ecx, I286_ES - shl ecx, 4 - movzx eax, I286_DI - add ecx, eax + movzx ecx, I286_DI + add ecx, ES_BASE STRING_DIR add I286_SI, ax add I286_DI, ax @@ -2886,10 +2892,8 @@ I286 _movsw(void) { // A5: movsw add ecx, DS_FIX call i286_memoryread_w mov dx, ax - movzx ecx, I286_ES - shl ecx, 4 - movzx eax, I286_DI - add ecx, eax + movzx ecx, I286_DI + add ecx, ES_BASE STRING_DIRx2 add I286_SI, ax add I286_DI, ax @@ -2906,10 +2910,8 @@ I286 _cmpsb(void) { // A6: cmpsb add ecx, DS_FIX call i286_memoryread mov dl, al - movzx ecx, I286_ES - shl ecx, 4 - movzx eax, I286_DI - add ecx, eax + movzx ecx, I286_DI + add ecx, ES_BASE call i286_memoryread cmp dl, al FLAG_STORE_OF @@ -2929,10 +2931,8 @@ I286 _cmpsw(void) { // A7: cmpsw add ecx, DS_FIX call i286_memoryread_w mov edx, eax - movzx ecx, I286_ES - shl ecx, 4 - movzx eax, I286_DI - add ecx, eax + movzx ecx, I286_DI + add ecx, ES_BASE call i286_memoryread_w cmp dx, ax FLAG_STORE_OF @@ -2971,10 +2971,8 @@ I286 _stosb(void) { // AA: stosb __asm { GET_NEXTPRE1 I286CLOCK(3) - movzx ecx, I286_ES - shl ecx, 4 - movzx eax, I286_DI - add ecx, eax + movzx ecx, I286_DI + add ecx, ES_BASE STRING_DIR add I286_DI, ax mov dl, I286_AL @@ -2987,10 +2985,8 @@ I286 _stosw(void) { // AB: stosw __asm { GET_NEXTPRE1 I286CLOCK(3) - movzx ecx, I286_ES - shl ecx, 4 - movzx eax, I286_DI - add ecx, eax + movzx ecx, I286_DI + add ecx, ES_BASE STRING_DIRx2 add I286_DI, ax mov dx, I286_AX @@ -3033,10 +3029,8 @@ I286 _scasb(void) { // AE: scasb __asm { GET_NEXTPRE1 I286CLOCK(7) - movzx ecx, I286_ES - shl ecx, 4 - movzx eax, I286_DI - add ecx, eax + movzx ecx, I286_DI + add ecx, ES_BASE call i286_memoryread cmp I286_AL, al FLAG_STORE_OF @@ -3051,10 +3045,8 @@ I286 _scasw(void) { // AF: scasw __asm { GET_NEXTPRE1 I286CLOCK(7) - movzx ecx, I286_ES - shl ecx, 4 - movzx eax, I286_DI - add ecx, eax + movzx ecx, I286_DI + add ecx, ES_BASE call i286_memoryread_w cmp I286_AX, ax FLAG_STORE_OF @@ -3378,13 +3370,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) } } @@ -3407,14 +3403,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) + } } @@ -3566,12 +3567,17 @@ I286 ret_far_data16(void) { // CA: lea ecx, [edi + ebp] call i286_memoryread_w mov I286_CS, ax - and eax, 0000ffffh + movzx eax, ax + test byte ptr (I286_MSW), MSW_PE + jne short ret_far16_pe shl eax, 4 // make segreg - mov CS_BASE, eax +ret_far16_base: mov CS_BASE, eax add I286_SP, 4 RESET_XPREFETCH ret + +ret_far16_pe: push offset ret_far16_base + jmp i286x_selector } } @@ -3589,13 +3595,18 @@ I286 ret_far(void) { // CB: ret fa add bx, 2 call i286_memoryread_w mov I286_CS, ax - and eax, 0000ffffh + movzx eax, ax + test byte ptr (I286_MSW), MSW_PE + jne short ret_far_pe shl eax, 4 // make segreg - mov CS_BASE, eax +ret_far_base: mov CS_BASE, eax mov ebp, eax mov I286_SP, bx RESET_XPREFETCH ret + +ret_far_pe: push offset ret_far_base + jmp i286x_selector } } @@ -3656,7 +3667,6 @@ I286 _into(void) { // CE: into I286 _iret(void) { // CF: iret __asm { - call extirq_pop I286CLOCK(31) mov edi, SS_BASE movzx ebx, I286_SP @@ -3686,14 +3696,12 @@ I286 _iret(void) { // CF: iret jne irqcheck test I286_FLAG, I_FLAG je nextop - cmp pic.ext_irq, 0 - jne nextop - mov al, pic.pi[0].imr - mov ah, pic.pi[1].imr + mov al, pic.pi[0 * (type _PICITEM)].imr + mov ah, pic.pi[1 * (type _PICITEM)].imr not ax - test al, pic.pi[0].irr + test al, pic.pi[0 * (type _PICITEM)].irr jne irqcheck - test ah, pic.pi[1].irr + test ah, pic.pi[1 * (type _PICITEM)].irr jne irqcheck nextop: ret @@ -4097,10 +4105,17 @@ I286 jmp_far(void) { // EA: jmp fa mov si, bx shr ebx, 16 mov I286_CS, bx + test byte ptr (I286_MSW), MSW_PE + jne short jmp_far_pe shl ebx, 4 // make segreg mov CS_BASE, ebx - RESET_XPREFETCH +jmp_far_base: RESET_XPREFETCH ret + +jmp_far_pe: mov eax, ebx + call i286x_selector + mov CS_BASE, eax + jmp short jmp_far_base } } @@ -4270,14 +4285,12 @@ I286 _sti(void) { // FB: sti setne I286_TRAP jne nextopandexit // fast_intr - cmp pic.ext_irq, 0 - jne jmp_nextop - mov al, pic.pi[0].imr - mov ah, pic.pi[1].imr + mov al, pic.pi[0 * (type _PICITEM)].imr + mov ah, pic.pi[1 * (type _PICITEM)].imr not ax - test al, pic.pi[0].irr + test al, pic.pi[0 * (type _PICITEM)].irr jne nextopandexit - test ah, pic.pi[1].irr + test ah, pic.pi[1 * (type _PICITEM)].irr jne nextopandexit jmp_nextop: jmp i286op[ebp*4]