|
|
| version 1.19, 2004/01/29 09:41:50 | version 1.24, 2005/02/12 12:13:58 |
|---|---|
| Line 11 | Line 11 |
| #include "i286xea.mcr" | #include "i286xea.mcr" |
| #include "v30patch.h" | #include "v30patch.h" |
| #include "bios.h" | #include "bios.h" |
| #include "dmap.h" | #include "dmax86.h" |
| I286CORE i286core; | 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, | 0x44, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, |
| 0x00, 0x04, 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, | 0x00, 0x04, 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, |
| 0x00, 0x04, 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, | 0x00, 0x04, 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, |
| Line 95 void i286x_setextsize(UINT32 size) { | Line 95 void i286x_setextsize(UINT32 size) { |
| CPU_EXTMEM = NULL; | CPU_EXTMEM = NULL; |
| } | } |
| if (size) { | if (size) { |
| CPU_EXTMEM = (BYTE *)_MALLOC(size + 16, "EXTMEM"); | CPU_EXTMEM = (UINT8 *)_MALLOC(size + 16, "EXTMEM"); |
| if (CPU_EXTMEM == NULL) { | if (CPU_EXTMEM == NULL) { |
| size = 0; | size = 0; |
| } | } |
| Line 110 void i286x_setextsize(UINT32 size) { | Line 110 void i286x_setextsize(UINT32 size) { |
| void i286x_setemm(UINT frame, UINT32 addr) { | void i286x_setemm(UINT frame, UINT32 addr) { |
| BYTE *ptr; | UINT8 *ptr; |
| frame &= 3; | frame &= 3; |
| if (addr < USE_HIMEM) { | if (addr < USE_HIMEM) { |
| Line 138 LABEL void i286x_resetprefetch(void) { | Line 138 LABEL void i286x_resetprefetch(void) { |
| } | } |
| } | } |
| LABEL void __fastcall i286x_interrupt(BYTE vect) { | LABEL void __fastcall i286x_interrupt(UINT8 vect) { |
| __asm { | __asm { |
| pushad | pushad |
| Line 276 i286_mnlp: movzx eax, bl | Line 276 i286_mnlp: movzx eax, bl |
| align 16 | align 16 |
| i286_dma_mnlp: movzx eax, bl | i286_dma_mnlp: movzx eax, bl |
| call i286op[eax*4] | call i286op[eax*4] |
| call dmap_i286 | call dmax86 |
| cmp I286_REMCLOCK, 0 | cmp I286_REMCLOCK, 0 |
| jg i286_dma_mnlp | jg i286_dma_mnlp |
| mov dword ptr (i286core.s.prefetchque), ebx | mov dword ptr (i286core.s.prefetchque), ebx |
| Line 318 nexts: | Line 318 nexts: |
| mov dword ptr (i286core.s.prefetchque), ebx | mov dword ptr (i286core.s.prefetchque), ebx |
| mov I286_IP, si | mov I286_IP, si |
| call dmap_i286 | call dmax86 |
| popad | popad |
| ret | ret |
| } | } |
| Line 343 LABEL void removeprefix(void) { | Line 343 LABEL void removeprefix(void) { |
| I286 _reserved(void) { | I286 _reserved(void) { |
| __asm { | __asm { |
| inc si // 01/08/31 | // inc si // 01/08/31 |
| INT_NUM(6) | INT_NUM(6) |
| } | } |
| } | } |
| Line 448 I286 pop_es(void) { // 07: pop es | Line 448 I286 pop_es(void) { // 07: pop es |
| I286CLOCK(5) | I286CLOCK(5) |
| REGPOP(I286_ES) | REGPOP(I286_ES) |
| movzx eax, ax | movzx eax, ax |
| test I286_MSW, MSW_PE | test byte ptr (I286_MSW), MSW_PE |
| jne short pop_es_pe | jne short pop_es_pe |
| shl eax, 4 // make segreg | shl eax, 4 // make segreg |
| pop_es_base: mov ES_BASE, eax | pop_es_base: mov ES_BASE, eax |
| Line 661 I286 pop_ss(void) { // 17: pop ss | Line 661 I286 pop_ss(void) { // 17: pop ss |
| I286CLOCK(5) | I286CLOCK(5) |
| REGPOP(I286_SS) | REGPOP(I286_SS) |
| movzx eax, ax | movzx eax, ax |
| test I286_MSW, MSW_PE | test byte ptr (I286_MSW), MSW_PE |
| jne short pop_ss_pe | jne short pop_ss_pe |
| shl eax, 4 // make segreg | shl eax, 4 // make segreg |
| pop_ss_base: mov SS_BASE, eax | pop_ss_base: mov SS_BASE, eax |
| Line 790 I286 pop_ds(void) { // 1F: pop ds | Line 790 I286 pop_ds(void) { // 1F: pop ds |
| I286CLOCK(5) | I286CLOCK(5) |
| REGPOP(I286_DS) | REGPOP(I286_DS) |
| movzx eax, ax | movzx eax, ax |
| test I286_MSW, MSW_PE | test byte ptr (I286_MSW), MSW_PE |
| jne short pop_ds_pe | jne short pop_ds_pe |
| shl eax, 4 // make segreg | shl eax, 4 // make segreg |
| pop_ds_base: mov DS_BASE, eax | pop_ds_base: mov DS_BASE, eax |
| Line 1695 I286 _arpl(void) { | Line 1695 I286 _arpl(void) { |
| xor eax, eax | xor eax, eax |
| cmp bh, 0c0h | cmp bh, 0c0h |
| setc al | setc al |
| add si, ax | // add si, ax |
| add eax, 10 | add eax, 10 |
| I286CLOCK(eax) | I286CLOCK(eax) |
| INT_NUM(6) | INT_NUM(6) |
| Line 2498 I286 mov_seg_ea(void) { // 8E: mov | Line 2498 I286 mov_seg_ea(void) { // 8E: mov |
| segset: | segset: |
| mov word ptr I286_SEGREG[ebp], ax | mov word ptr I286_SEGREG[ebp], ax |
| movzx eax, ax | movzx eax, ax |
| test I286_MSW, MSW_PE | test byte ptr (I286_MSW), MSW_PE |
| jne short mov_seg_pe | jne short mov_seg_pe |
| shl eax, 4 // make segreg | shl eax, 4 // make segreg |
| mov_seg_base: mov SEG_BASE[ebp*2], eax | mov_seg_base: mov SEG_BASE[ebp*2], eax |
| Line 2714 I286 call_far(void) { // 9A: call | Line 2714 I286 call_far(void) { // 9A: call |
| mov si, bx | mov si, bx |
| shr ebx, 16 | shr ebx, 16 |
| mov I286_CS, bx | mov I286_CS, bx |
| test byte ptr (I286_MSW), MSW_PE | |
| jne short call_far_pe | |
| shl ebx, 4 | shl ebx, 4 |
| mov CS_BASE, ebx | mov CS_BASE, ebx |
| RESET_XPREFETCH | call_far_base: RESET_XPREFETCH |
| ret | ret |
| call_far_pe: mov eax, ebx | |
| call i286x_selector | |
| mov CS_BASE, eax | |
| jmp short call_far_base | |
| } | } |
| } | } |
| Line 2867 I286 _movsb(void) { // A4: movsb | Line 2874 I286 _movsb(void) { // A4: movsb |
| add ecx, DS_FIX | add ecx, DS_FIX |
| call i286_memoryread | call i286_memoryread |
| mov dl, al | mov dl, al |
| movzx ecx, I286_ES | movzx ecx, I286_DI |
| shl ecx, 4 | add ecx, ES_BASE |
| movzx eax, I286_DI | |
| add ecx, eax | |
| STRING_DIR | STRING_DIR |
| add I286_SI, ax | add I286_SI, ax |
| add I286_DI, ax | add I286_DI, ax |
| Line 2887 I286 _movsw(void) { // A5: movsw | Line 2892 I286 _movsw(void) { // A5: movsw |
| add ecx, DS_FIX | add ecx, DS_FIX |
| call i286_memoryread_w | call i286_memoryread_w |
| mov dx, ax | mov dx, ax |
| movzx ecx, I286_ES | movzx ecx, I286_DI |
| shl ecx, 4 | add ecx, ES_BASE |
| movzx eax, I286_DI | |
| add ecx, eax | |
| STRING_DIRx2 | STRING_DIRx2 |
| add I286_SI, ax | add I286_SI, ax |
| add I286_DI, ax | add I286_DI, ax |
| Line 2907 I286 _cmpsb(void) { // A6: cmpsb | Line 2910 I286 _cmpsb(void) { // A6: cmpsb |
| add ecx, DS_FIX | add ecx, DS_FIX |
| call i286_memoryread | call i286_memoryread |
| mov dl, al | mov dl, al |
| movzx ecx, I286_ES | movzx ecx, I286_DI |
| shl ecx, 4 | add ecx, ES_BASE |
| movzx eax, I286_DI | |
| add ecx, eax | |
| call i286_memoryread | call i286_memoryread |
| cmp dl, al | cmp dl, al |
| FLAG_STORE_OF | FLAG_STORE_OF |
| Line 2930 I286 _cmpsw(void) { // A7: cmpsw | Line 2931 I286 _cmpsw(void) { // A7: cmpsw |
| add ecx, DS_FIX | add ecx, DS_FIX |
| call i286_memoryread_w | call i286_memoryread_w |
| mov edx, eax | mov edx, eax |
| movzx ecx, I286_ES | movzx ecx, I286_DI |
| shl ecx, 4 | add ecx, ES_BASE |
| movzx eax, I286_DI | |
| add ecx, eax | |
| call i286_memoryread_w | call i286_memoryread_w |
| cmp dx, ax | cmp dx, ax |
| FLAG_STORE_OF | FLAG_STORE_OF |
| Line 2972 I286 _stosb(void) { // AA: stosb | Line 2971 I286 _stosb(void) { // AA: stosb |
| __asm { | __asm { |
| GET_NEXTPRE1 | GET_NEXTPRE1 |
| I286CLOCK(3) | I286CLOCK(3) |
| movzx ecx, I286_ES | movzx ecx, I286_DI |
| shl ecx, 4 | add ecx, ES_BASE |
| movzx eax, I286_DI | |
| add ecx, eax | |
| STRING_DIR | STRING_DIR |
| add I286_DI, ax | add I286_DI, ax |
| mov dl, I286_AL | mov dl, I286_AL |
| Line 2988 I286 _stosw(void) { // AB: stosw | Line 2985 I286 _stosw(void) { // AB: stosw |
| __asm { | __asm { |
| GET_NEXTPRE1 | GET_NEXTPRE1 |
| I286CLOCK(3) | I286CLOCK(3) |
| movzx ecx, I286_ES | movzx ecx, I286_DI |
| shl ecx, 4 | add ecx, ES_BASE |
| movzx eax, I286_DI | |
| add ecx, eax | |
| STRING_DIRx2 | STRING_DIRx2 |
| add I286_DI, ax | add I286_DI, ax |
| mov dx, I286_AX | mov dx, I286_AX |
| Line 3034 I286 _scasb(void) { // AE: scasb | Line 3029 I286 _scasb(void) { // AE: scasb |
| __asm { | __asm { |
| GET_NEXTPRE1 | GET_NEXTPRE1 |
| I286CLOCK(7) | I286CLOCK(7) |
| movzx ecx, I286_ES | movzx ecx, I286_DI |
| shl ecx, 4 | add ecx, ES_BASE |
| movzx eax, I286_DI | |
| add ecx, eax | |
| call i286_memoryread | call i286_memoryread |
| cmp I286_AL, al | cmp I286_AL, al |
| FLAG_STORE_OF | FLAG_STORE_OF |
| Line 3052 I286 _scasw(void) { // AF: scasw | Line 3045 I286 _scasw(void) { // AF: scasw |
| __asm { | __asm { |
| GET_NEXTPRE1 | GET_NEXTPRE1 |
| I286CLOCK(7) | I286CLOCK(7) |
| movzx ecx, I286_ES | movzx ecx, I286_DI |
| shl ecx, 4 | add ecx, ES_BASE |
| movzx eax, I286_DI | |
| add ecx, eax | |
| call i286_memoryread_w | call i286_memoryread_w |
| cmp I286_AX, ax | cmp I286_AX, ax |
| FLAG_STORE_OF | FLAG_STORE_OF |
| Line 3379 I286 les_r16_ea(void) { // C4: les | Line 3370 I286 les_r16_ea(void) { // C4: les |
| lea ecx, [edi + ebp] | lea ecx, [edi + ebp] |
| call i286_memoryread_w | call i286_memoryread_w |
| mov I286_ES, ax | 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 | shl eax, 4 // make segreg |
| mov ES_BASE, eax | les_base: mov ES_BASE, eax |
| ret | ret |
| align 4 | |
| src_register: | les_pe: push offset les_base |
| INT_NUM(6) | jmp i286x_selector |
| src_register: INT_NUM(6) | |
| } | } |
| } | } |
| Line 3408 I286 lds_r16_ea(void) { // C5: lds | Line 3403 I286 lds_r16_ea(void) { // C5: lds |
| lea ecx, [edi + ebp] | lea ecx, [edi + ebp] |
| call i286_memoryread_w | call i286_memoryread_w |
| mov I286_DS, ax | 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 | shl eax, 4 // make segreg |
| mov DS_BASE, eax | lds_base: mov DS_BASE, eax |
| mov DS_FIX, eax | mov DS_FIX, eax |
| ret | ret |
| align 16 | |
| src_register: | lds_pe: push offset lds_base |
| INT_NUM(6) | jmp i286x_selector |
| src_register: INT_NUM(6) | |
| } | } |
| } | } |
| Line 3567 I286 ret_far_data16(void) { // CA: | Line 3567 I286 ret_far_data16(void) { // CA: |
| 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 ret_far16_pe | |
| shl eax, 4 // make segreg | shl eax, 4 // make segreg |
| mov CS_BASE, eax | ret_far16_base: mov CS_BASE, eax |
| add I286_SP, 4 | add I286_SP, 4 |
| RESET_XPREFETCH | RESET_XPREFETCH |
| ret | ret |
| ret_far16_pe: push offset ret_far16_base | |
| jmp i286x_selector | |
| } | } |
| } | } |
| Line 3590 I286 ret_far(void) { // CB: ret fa | Line 3595 I286 ret_far(void) { // CB: ret fa |
| add bx, 2 | add bx, 2 |
| 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 ret_far_pe | |
| shl eax, 4 // make segreg | shl eax, 4 // make segreg |
| mov CS_BASE, eax | ret_far_base: mov CS_BASE, eax |
| mov ebp, eax | mov ebp, eax |
| mov I286_SP, bx | mov I286_SP, bx |
| RESET_XPREFETCH | RESET_XPREFETCH |
| ret | ret |
| ret_far_pe: push offset ret_far_base | |
| jmp i286x_selector | |
| } | } |
| } | } |
| Line 3650 I286 _into(void) { // CE: into | Line 3660 I286 _into(void) { // CE: into |
| GET_NEXTPRE1 | GET_NEXTPRE1 |
| ret | ret |
| intovf: INT_NUM(4) | intovf: inc si // ver0.80 |
| INT_NUM(4) | |
| } | } |
| } | } |
| Line 4095 I286 jmp_far(void) { // EA: jmp fa | Line 4106 I286 jmp_far(void) { // EA: jmp fa |
| mov si, bx | mov si, bx |
| shr ebx, 16 | shr ebx, 16 |
| mov I286_CS, bx | mov I286_CS, bx |
| test byte ptr (I286_MSW), MSW_PE | |
| jne short jmp_far_pe | |
| shl ebx, 4 // make segreg | shl ebx, 4 // make segreg |
| mov CS_BASE, ebx | mov CS_BASE, ebx |
| RESET_XPREFETCH | jmp_far_base: RESET_XPREFETCH |
| ret | ret |
| jmp_far_pe: mov eax, ebx | |
| call i286x_selector | |
| mov CS_BASE, eax | |
| jmp short jmp_far_base | |
| } | } |
| } | } |
| Line 4331 I286 _ope0xff(void) { // FF: | Line 4349 I286 _ope0xff(void) { // FF: |
| // ------------------------------------------------------------------------- | // ------------------------------------------------------------------------- |
| void (*i286op[])(void) = { | const I286TBL i286op[256] = { |
| add_ea_r8, // 00: add EA, REG8 | add_ea_r8, // 00: add EA, REG8 |
| add_ea_r16, // 01: add EA, REG16 | add_ea_r16, // 01: add EA, REG16 |
| add_r8_ea, // 02: add REG8, EA | add_r8_ea, // 02: add REG8, EA |
| Line 4655 I286 repe_segprefix_ds(void) { | Line 4673 I286 repe_segprefix_ds(void) { |
| } | } |
| } | } |
| void (*i286op_repe[])(void) = { | const I286TBL i286op_repe[256] = { |
| add_ea_r8, // 00: add EA, REG8 | add_ea_r8, // 00: add EA, REG8 |
| add_ea_r16, // 01: add EA, REG16 | add_ea_r16, // 01: add EA, REG16 |
| add_r8_ea, // 02: add REG8, EA | add_r8_ea, // 02: add REG8, EA |
| Line 4979 I286 repne_segprefix_ds(void) { | Line 4997 I286 repne_segprefix_ds(void) { |
| } | } |
| } | } |
| void (*i286op_repne[])(void) = { | const I286TBL i286op_repne[256] = { |
| add_ea_r8, // 00: add EA, REG8 | add_ea_r8, // 00: add EA, REG8 |
| add_ea_r16, // 01: add EA, REG16 | add_ea_r16, // 01: add EA, REG16 |
| add_r8_ea, // 02: add REG8, EA | add_r8_ea, // 02: add REG8, EA |