| version 1.1.1.1, 2003/10/16 17:57:25 | version 1.15, 2004/01/10 17:24:01 | 
| Line 1 | Line 1 | 
 | #include        "compiler.h" | #include        "compiler.h" | 
| #include        "i286.h" | #include        "cpucore.h" | 
 | #include        "i286x.h" | #include        "i286x.h" | 
 | #include        "i286xadr.h" | #include        "i286xadr.h" | 
 | #include        "i286xs.h" | #include        "i286xs.h" | 
 | #include        "i286xrep.h" | #include        "i286xrep.h" | 
 | #include        "i286xcts.h" | #include        "i286xcts.h" | 
 | #include        "memory.h" |  | 
 | #include        "pccore.h" | #include        "pccore.h" | 
 | #include        "iocore.h" | #include        "iocore.h" | 
 | #include        "i286x.mcr" | #include        "i286x.mcr" | 
| Line 15 | Line 14 | 
 | #include        "dmap.h" | #include        "dmap.h" | 
 |  |  | 
 |  |  | 
| I286REGS        i286r; | I286CORE        i286core; | 
| I286STAT        i286s; |  | 
| I286DTR         GDTR; |  | 
| I286DTR         IDTR; |  | 
| UINT16          MSW; |  | 
 |  |  | 
 | const BYTE iflags[256] = {                                      // Z_FLAG, S_FLAG, P_FLAG | const BYTE iflags[256] = {                                      // Z_FLAG, S_FLAG, P_FLAG | 
 | 0x44, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, | 0x44, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, | 
| Line 56  const BYTE iflags[256] = {     // Z_FLAG | Line 51  const BYTE iflags[256] = {     // Z_FLAG | 
 | 0x80, 0x84, 0x84, 0x80, 0x84, 0x80, 0x80, 0x84}; | 0x80, 0x84, 0x84, 0x80, 0x84, 0x80, 0x80, 0x84}; | 
 |  |  | 
 |  |  | 
| void i286_reset(void) { | void i286x_initialize(void) { | 
 |  |  | 
| i286xadr_init();                                                        // 毎回通すのはどうか… | i286xadr_init(); | 
| v30init();                                                                      // 毎回通すのはどうか… | v30xinit(); | 
| ZeroMemory(&i286r, sizeof(i286r)); |  | 
| ZeroMemory(&i286s, sizeof(i286s)); |  | 
| I286_CS = 0x1fc0; |  | 
| CS_BASE = 0x1fc00; |  | 
| ZeroMemory(&GDTR, sizeof(GDTR)); |  | 
| ZeroMemory(&IDTR, sizeof(IDTR)); |  | 
| MSW = 0; |  | 
 | } | } | 
 |  |  | 
 |  | static void i286x_initreg(void) { | 
 |  |  | 
| LABEL void i286_resetprefetch(void) { | I286_CS = 0xf000; | 
|  | CS_BASE = 0xf0000; | 
|  | I286_IP = 0xfff0; | 
|  | i286core.s.adrsmask = 0xfffff; | 
|  | i286x_resetprefetch(); | 
|  | } | 
|  |  | 
|  | void i286x_reset(void) { | 
|  |  | 
|  | ZeroMemory(&i286core.s, sizeof(i286core.s)); | 
|  | i286x_initreg(); | 
|  | } | 
|  |  | 
|  | void i286x_shut(void) { | 
|  |  | 
|  | ZeroMemory(&i286core.s, offsetof(I286STAT, cpu_type)); | 
|  | i286x_initreg(); | 
|  | } | 
|  |  | 
|  |  | 
|  | LABEL void i286x_resetprefetch(void) { | 
 |  |  | 
 | __asm { | __asm { | 
 | pushad | pushad | 
 | movzx   esi, I286_IP | movzx   esi, I286_IP | 
 | RESET_XPREFETCH | RESET_XPREFETCH | 
| mov             dword ptr (i286s.prefetchque), ebx | mov             dword ptr (i286core.s.prefetchque), ebx | 
 | popad | popad | 
 | ret | ret | 
 | } | } | 
 | } | } | 
 |  |  | 
| LABEL void __fastcall i286_interrupt(BYTE vect) { | LABEL void __fastcall i286x_interrupt(BYTE vect) { | 
 |  |  | 
 | __asm { | __asm { | 
 | pushad | pushad | 
| Line 92  LABEL void __fastcall i286_interrupt(BYT | Line 101  LABEL void __fastcall i286_interrupt(BYT | 
 | sub             bx, 2 | sub             bx, 2 | 
 |  |  | 
 | // hlt.. | // hlt.. | 
| cmp             byte ptr (i286s.prefetchque), 0f4h              // hlt | cmp             byte ptr (i286core.s.prefetchque), 0f4h         // hlt | 
 | jne             short nonhlt | jne             short nonhlt | 
 | inc             I286_IP | inc             I286_IP | 
 | nonhlt:                 mov             edi, SS_BASE | nonhlt:                 mov             edi, SS_BASE | 
| Line 124  nonhlt:   mov  edi, SS_BASE | Line 133  nonhlt:   mov  edi, SS_BASE | 
 | shl             eax, 4                                  // make segreg | shl             eax, 4                                  // make segreg | 
 | mov             CS_BASE, eax | mov             CS_BASE, eax | 
 | RESET_XPREFETCH | RESET_XPREFETCH | 
| mov             dword ptr (i286s.prefetchque), ebx | mov             dword ptr (i286core.s.prefetchque), ebx | 
 |  |  | 
 | popad | popad | 
 | ret | ret | 
| Line 171  LABEL void __fastcall i286x_localint(voi | Line 180  LABEL void __fastcall i286x_localint(voi | 
 | } | } | 
 |  |  | 
 |  |  | 
 |  | // プロテクトモードのセレクタ(in ax / ret eax) | 
 |  | LABEL void __fastcall i286x_selector(void) { | 
 |  |  | 
 |  | __asm { | 
 |  | mov             ecx, dword ptr (I286_GDTR.base) | 
 |  | test    eax, 4 | 
 |  | je              short ixsl_1 | 
 |  | mov             ecx, dword ptr (I286_LDTRC.base) | 
 |  | ixsl_1:                 and             eax, not 7 | 
 |  | and             ecx, 0ffffffh | 
 |  | lea             ecx, [ecx + eax + 2] | 
 |  | call    i286_memoryread_w | 
 |  | push    eax | 
 |  | add             ecx, 2 | 
 |  | call    i286_memoryread | 
 |  | pop             ecx | 
 |  | and             eax, 0ffh | 
 |  | movzx   ecx, cx | 
 |  | shl             eax, 16 | 
 |  | add             eax, ecx | 
 |  | ret | 
 |  | } | 
 |  | } | 
 |  |  | 
 |  |  | 
| LABEL void i286(void) { | LABEL void i286x(void) { | 
 |  |  | 
 | __asm { | __asm { | 
 | pushad | pushad | 
| mov             ebx, dword ptr (i286s.prefetchque) | mov             ebx, dword ptr (i286core.s.prefetchque) | 
 | movzx   esi, I286_IP | movzx   esi, I286_IP | 
 |  |  | 
 | cmp             I286_TRAP, 0 | cmp             I286_TRAP, 0 | 
| Line 186  LABEL void i286(void) { | Line 219  LABEL void i286(void) { | 
 |  |  | 
 | i286_mnlp:              movzx   eax, bl | i286_mnlp:              movzx   eax, bl | 
 | call    i286op[eax*4] | call    i286op[eax*4] | 
| cmp             nevent.remainclock, 0 | cmp             I286_REMCLOCK, 0 | 
 | jg              i286_mnlp | jg              i286_mnlp | 
| mov             dword ptr (i286s.prefetchque), ebx | mov             dword ptr (i286core.s.prefetchque), ebx | 
 | mov             I286_IP, si | mov             I286_IP, si | 
 | popad | popad | 
 | ret | ret | 
| Line 197  i286_mnlp:  movzx eax, bl | Line 230  i286_mnlp:  movzx eax, bl | 
 | i286_dma_mnlp:  movzx   eax, bl | i286_dma_mnlp:  movzx   eax, bl | 
 | call    i286op[eax*4] | call    i286op[eax*4] | 
 | call    dmap_i286 | call    dmap_i286 | 
| cmp             nevent.remainclock, 0 | cmp             I286_REMCLOCK, 0 | 
 | jg              i286_dma_mnlp | jg              i286_dma_mnlp | 
| mov             dword ptr (i286s.prefetchque), ebx | mov             dword ptr (i286core.s.prefetchque), ebx | 
 | mov             I286_IP, si | mov             I286_IP, si | 
 | popad | popad | 
 | ret | ret | 
| Line 211  i286_trapping: movzx eax, bl | Line 244  i286_trapping: movzx eax, bl | 
 | je              i286notrap | je              i286notrap | 
 | mov             ecx, 1 | mov             ecx, 1 | 
 | call    i286x_localint | call    i286x_localint | 
| i286notrap:             mov             dword ptr (i286s.prefetchque), ebx | i286notrap:             mov             dword ptr (i286core.s.prefetchque), ebx | 
 | mov             I286_IP, si | mov             I286_IP, si | 
 | popad | popad | 
 | ret | ret | 
| Line 220  i286notrap:  mov  dword ptr (i286s.prefe | Line 253  i286notrap:  mov  dword ptr (i286s.prefe | 
 |  |  | 
 |  |  | 
 |  |  | 
| LABEL void i286_step(void) { | LABEL void i286x_step(void) { | 
 |  |  | 
 | __asm { | __asm { | 
 | pushad | pushad | 
| mov             ebx, dword ptr (i286s.prefetchque) | mov             ebx, dword ptr (i286core.s.prefetchque) | 
 | movzx   esi, I286_IP | movzx   esi, I286_IP | 
 |  |  | 
 | movzx   eax, bl | movzx   eax, bl | 
| Line 235  LABEL void i286_step(void) { | Line 268  LABEL void i286_step(void) { | 
 | mov             ecx, 1 | mov             ecx, 1 | 
 | call    i286x_localint | call    i286x_localint | 
 | nexts: | nexts: | 
| mov             dword ptr (i286s.prefetchque), ebx | mov             dword ptr (i286core.s.prefetchque), ebx | 
 | mov             I286_IP, si | mov             I286_IP, si | 
 |  |  | 
 | call    dmap_i286 | call    dmap_i286 | 
| Line 250  nexts: | Line 283  nexts: | 
 | LABEL void removeprefix(void) { | LABEL void removeprefix(void) { | 
 |  |  | 
 | __asm { | __asm { | 
| mov             i286s.prefix, 0 | mov             i286core.s.prefix, 0 | 
 | mov             eax, DS_BASE | mov             eax, DS_BASE | 
 | mov             DS_FIX, eax | mov             DS_FIX, eax | 
 | mov             eax, SS_BASE | mov             eax, SS_BASE | 
| Line 367  I286 pop_es(void) {        // 07: pop es | Line 400  I286 pop_es(void) {        // 07: pop es | 
 | __asm { | __asm { | 
 | I286CLOCK(5) | I286CLOCK(5) | 
 | REGPOP(I286_ES) | REGPOP(I286_ES) | 
| and             eax, 00ffffh | movzx   eax, ax | 
|  | test    I286_MSW, MSW_PE | 
|  | jne             short pop_es_pe | 
 | shl             eax, 4                                  // make segreg | shl             eax, 4                                  // make segreg | 
| mov             ES_BASE, eax | pop_es_base:    mov             ES_BASE, eax | 
 | GET_NEXTPRE1 | GET_NEXTPRE1 | 
 | ret | ret | 
 |  |  | 
 |  | pop_es_pe:              push    offset pop_es_base | 
 |  | jmp             i286x_selector | 
 | } | } | 
 | } | } | 
 |  |  | 
| Line 575  I286 pop_ss(void) {        // 17: pop ss | Line 613  I286 pop_ss(void) {        // 17: pop ss | 
 | __asm { | __asm { | 
 | I286CLOCK(5) | I286CLOCK(5) | 
 | REGPOP(I286_SS) | REGPOP(I286_SS) | 
| and             eax, 00ffffh | movzx   eax, ax | 
|  | test    I286_MSW, MSW_PE | 
|  | jne             short pop_ss_pe | 
 | shl             eax, 4                                  // make segreg | shl             eax, 4                                  // make segreg | 
| mov             SS_BASE, eax | pop_ss_base:    mov             SS_BASE, eax | 
 | mov             SS_FIX, eax | mov             SS_FIX, eax | 
| cmp             i286s.prefix, 0                 // 00/06/24 | cmp             i286core.s.prefix, 0            // 00/06/24 | 
| je              noprefix | jne             prefix_exist | 
| call    removeprefix |  | 
| pop             eax |  | 
 | noprefix: | noprefix: | 
 | movzx   ebp, bh | movzx   ebp, bh | 
 | GET_NEXTPRE1 | GET_NEXTPRE1 | 
 | jmp             i286op[ebp*4] | jmp             i286op[ebp*4] | 
 |  |  | 
 |  | pop_ss_pe:              push    offset pop_ss_base | 
 |  | jmp             i286x_selector | 
 |  |  | 
 |  | prefix_exist:   pop             eax                                             // eax<-offset removeprefix | 
 |  | call    eax | 
 |  | jmp             noprefix | 
 | } | } | 
 | } | } | 
 |  |  | 
| Line 697  I286 pop_ds(void) {        // 1F: pop ds | Line 742  I286 pop_ds(void) {        // 1F: pop ds | 
 | __asm { | __asm { | 
 | I286CLOCK(5) | I286CLOCK(5) | 
 | REGPOP(I286_DS) | REGPOP(I286_DS) | 
| and             eax, 00ffffh | movzx   eax, ax | 
|  | test    I286_MSW, MSW_PE | 
|  | jne             short pop_ds_pe | 
 | shl             eax, 4                                  // make segreg | shl             eax, 4                                  // make segreg | 
| mov             DS_BASE, eax | pop_ds_base:    mov             DS_BASE, eax | 
 | mov             DS_FIX, eax | mov             DS_FIX, eax | 
 | GET_NEXTPRE1 | GET_NEXTPRE1 | 
 | ret | ret | 
 |  |  | 
 |  | pop_ds_pe:              push    offset pop_ds_base | 
 |  | jmp             i286x_selector | 
 | } | } | 
 | } | } | 
 |  |  | 
| Line 1679  I286 _insb(void) {        // 6C: insb | Line 1729  I286 _insb(void) {        // 6C: insb | 
 | __asm { | __asm { | 
 | GET_NEXTPRE1 | GET_NEXTPRE1 | 
 | I286CLOCK(5) | I286CLOCK(5) | 
 | #if 1 |  | 
 | movzx   ecx, I286_DX | movzx   ecx, I286_DX | 
 | call    iocore_inp8 | call    iocore_inp8 | 
 | #else |  | 
 | mov             cx, I286_DX |  | 
 | call    i286_in |  | 
 | #endif |  | 
 | mov             dl, al | mov             dl, al | 
 | movzx   ecx, I286_ES | movzx   ecx, I286_ES | 
 | shl             ecx, 4 | shl             ecx, 4 | 
| Line 1726  I286 _outsb(void) {        // 6E: outsb | Line 1771  I286 _outsb(void) {        // 6E: outsb | 
 | mov             dl, al | mov             dl, al | 
 | STRING_DIR | STRING_DIR | 
 | add             I286_SI, ax | add             I286_SI, ax | 
 | #if 1 |  | 
 | movzx   ecx, I286_DX | movzx   ecx, I286_DX | 
 | jmp             iocore_out8 | jmp             iocore_out8 | 
 | #else |  | 
 | mov             cx, I286_DX |  | 
 | jmp             i286_out |  | 
 | #endif |  | 
 | } | } | 
 | } | } | 
 |  |  | 
| Line 2403  I286 mov_seg_ea(void) {       // 8E: mov | Line 2443  I286 mov_seg_ea(void) {       // 8E: mov | 
 | GET_NEXTPRE2 | GET_NEXTPRE2 | 
 | mov             ax, word ptr I286_REG[edi*2] | mov             ax, word ptr I286_REG[edi*2] | 
 | jmp             segset | jmp             segset | 
| align   16 | align   4 | 
 | src_memory: | src_memory: | 
 | I286CLOCK(5) | I286CLOCK(5) | 
 | call    p_ea_dst[eax*4] | call    p_ea_dst[eax*4] | 
 | call    i286_memoryread_w | call    i286_memoryread_w | 
 | segset: | segset: | 
 | mov             word ptr I286_SEGREG[ebp], ax | mov             word ptr I286_SEGREG[ebp], ax | 
| and             eax, 0000ffffh | movzx   eax, ax | 
|  | test    I286_MSW, MSW_PE | 
|  | jne             short mov_seg_pe | 
 | shl             eax, 4                                  // make segreg | shl             eax, 4                                  // make segreg | 
| mov             SEG_BASE[ebp*2], eax | mov_seg_base:   mov             SEG_BASE[ebp*2], eax | 
 | sub             ebp, 2*2 | sub             ebp, 2*2 | 
| jc              segsetr | jc              short segsetr | 
 | mov             SS_FIX[ebp*2], eax | mov             SS_FIX[ebp*2], eax | 
| je              setss | je              short setss | 
 | segsetr:ret | segsetr:ret | 
 |  |  | 
| align   16 | setss:  cmp             i286core.s.prefix, 0    // 00/05/13 | 
| setss:  cmp             i286s.prefix, 0                 // 00/05/13 |  | 
 | je              noprefix | je              noprefix | 
 | pop             eax | pop             eax | 
 | call    eax                                             // eax<-offset removeprefix | call    eax                                             // eax<-offset removeprefix | 
| Line 2428  I286 mov_seg_ea(void) {       // 8E: mov | Line 2469  I286 mov_seg_ea(void) {       // 8E: mov | 
 | movzx   eax, bl | movzx   eax, bl | 
 | jmp             i286op[eax*4] | jmp             i286op[eax*4] | 
 |  |  | 
| align   16 | mov_seg_pe:             push    offset mov_seg_base | 
| fixcs: | jmp             i286x_selector | 
| INT_NUM(6) |  | 
|  | fixcs:  INT_NUM(6) | 
 | } | } | 
 | } | } | 
 |  |  | 
| Line 2668  I286 _popf(void) {        // 9D: popf | Line 2710  I286 _popf(void) {        // 9D: popf | 
 | and             ah, 3 | and             ah, 3 | 
 | cmp             ah, 3 | cmp             ah, 3 | 
 | sete    I286_TRAP | sete    I286_TRAP | 
| I286IRQCHECKTERM |  | 
|  | 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 | 
|  | not             ax | 
|  | test    al, pic.pi[0].irr | 
|  | jne             irqcheck | 
|  | test    ah, pic.pi[1].irr | 
|  | jne             irqcheck | 
|  | nextop:                 ret | 
|  |  | 
|  | irqcheck:               I286IRQCHECKTERM | 
 | } | } | 
 | } | } | 
 |  |  | 
| Line 3281  I286 les_r16_ea(void) {       // C4: les | Line 3338  I286 les_r16_ea(void) {       // C4: les | 
 | shl             eax, 4                                  // make segreg | shl             eax, 4                                  // make segreg | 
 | mov             ES_BASE, eax | mov             ES_BASE, eax | 
 | ret | ret | 
| align   16 | align   4 | 
 | src_register: | src_register: | 
 | INT_NUM(6) | INT_NUM(6) | 
 | } | } | 
| Line 3542  I286 int_data8(void) {       // CD: int | Line 3599  I286 int_data8(void) {       // CD: int | 
 | I286 _into(void) {                                                              // CE: into | I286 _into(void) {                                                              // CE: into | 
 |  |  | 
 | __asm { | __asm { | 
 |  | I286CLOCK(4) | 
 | test    I286_FLAG, O_FLAG | test    I286_FLAG, O_FLAG | 
 | jne             intovf | jne             intovf | 
 | I286CLOCK(4) |  | 
 | GET_NEXTPRE1 | GET_NEXTPRE1 | 
 | ret | ret | 
| align   16 |  | 
| intovf: | intovf: INT_NUM(4) | 
| I286CLOCK(24) |  | 
| INT_NUM(4) |  | 
 | } | } | 
 | } | } | 
 |  |  | 
| Line 3582  I286 _iret(void) {        // CF: iret | Line 3637  I286 _iret(void) {        // CF: iret | 
 | cmp             ah, 3 | cmp             ah, 3 | 
 | sete    I286_TRAP | sete    I286_TRAP | 
 | RESET_XPREFETCH | RESET_XPREFETCH | 
| I286IRQCHECKTERM |  | 
|  | cmp             I286_TRAP, 0                    // fast_intr | 
|  | 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 | 
|  | not             ax | 
|  | test    al, pic.pi[0].irr | 
|  | jne             irqcheck | 
|  | test    ah, pic.pi[1].irr | 
|  | jne             irqcheck | 
|  | nextop:                 ret | 
|  |  | 
|  | irqcheck:               I286IRQCHECKTERM | 
 | } | } | 
 | } | } | 
 |  |  | 
| Line 3751  nzflagsed:  xor  al, ah | Line 3822  nzflagsed:  xor  al, ah | 
 | or              I286_FLAGL, al | or              I286_FLAGL, al | 
 | GET_NEXTPRE2 | GET_NEXTPRE2 | 
 | ret | ret | 
| align   16 |  | 
| div0: | div0:   INT_NUM(0) | 
| INT_NUM(0) |  | 
 | } | } | 
 | } | } | 
 |  |  | 
| Line 3897  I286 in_al_data8(void) {      // E4: in | Line 3967  I286 in_al_data8(void) {      // E4: in | 
 | I286CLOCK(5) | I286CLOCK(5) | 
 | lea             eax, [esi + 2] | lea             eax, [esi + 2] | 
 | add             eax, CS_BASE | add             eax, CS_BASE | 
| mov             i286s.inport, eax | mov             I286_INPADRS, eax | 
 | movzx   ecx, bh | movzx   ecx, bh | 
 | #if 1 |  | 
 | call    iocore_inp8 | call    iocore_inp8 | 
 | #else |  | 
 | call    i286_in |  | 
 | #endif |  | 
 | mov             I286_AL, al | mov             I286_AL, al | 
| mov             i286s.inport, 0 | mov             I286_INPADRS, 0 | 
 | GET_NEXTPRE2 | GET_NEXTPRE2 | 
 | ret | ret | 
 | } | } | 
| Line 3917  I286 in_ax_data8(void) {      // E5: in | Line 3983  I286 in_ax_data8(void) {      // E5: in | 
 | I286CLOCK(5) | I286CLOCK(5) | 
 | lea             eax, [esi + 2] | lea             eax, [esi + 2] | 
 | add             eax, CS_BASE | add             eax, CS_BASE | 
 | mov             i286s.inport, eax |  | 
 | movzx   ecx, bh | movzx   ecx, bh | 
 | call    iocore_inp16 | call    iocore_inp16 | 
 | mov             I286_AX, ax | mov             I286_AX, ax | 
| Line 3935  I286 out_data8_al(void) {      // E6: ou | Line 4000  I286 out_data8_al(void) {      // E6: ou | 
 | GET_NEXTPRE2 | GET_NEXTPRE2 | 
 | pop             ecx | pop             ecx | 
 | mov             dl, I286_AL | mov             dl, I286_AL | 
 | #if 1 |  | 
 | jmp             iocore_out8 | jmp             iocore_out8 | 
| #else | } | 
| jmp             i286_out |  | 
| #endif |  | 
| } |  | 
 | } | } | 
 |  |  | 
 | I286 out_data8_ax(void) {                                               // E7: out DATA8, ax | I286 out_data8_ax(void) {                                               // E7: out DATA8, ax | 
| Line 4015  I286 in_al_dx(void) {       // EC: in al | Line 4076  I286 in_al_dx(void) {       // EC: in al | 
 |  |  | 
 | __asm { | __asm { | 
 | I286CLOCK(5) | I286CLOCK(5) | 
 | #if 1 |  | 
 | movzx   ecx, I286_DX | movzx   ecx, I286_DX | 
 | call    iocore_inp8 | call    iocore_inp8 | 
 | #else |  | 
 | mov             cx, I286_DX |  | 
 | call    i286_in |  | 
 | #endif |  | 
 | mov             I286_AL, al | mov             I286_AL, al | 
 | GET_NEXTPRE1 | GET_NEXTPRE1 | 
 | ret | ret | 
| Line 4045  I286 out_dx_al(void) {       // EE: out | Line 4101  I286 out_dx_al(void) {       // EE: out | 
 | __asm { | __asm { | 
 | GET_NEXTPRE1 | GET_NEXTPRE1 | 
 | I286CLOCK(3) | I286CLOCK(3) | 
 | #if 1 |  | 
 | movzx   ecx, I286_DX | movzx   ecx, I286_DX | 
 | mov             dl, I286_AL | mov             dl, I286_AL | 
 | jmp             iocore_out8 | jmp             iocore_out8 | 
 | #else |  | 
 | mov             cx, I286_DX |  | 
 | mov             dl, I286_AL |  | 
 | jmp             i286_out |  | 
 | #endif |  | 
 | } | } | 
 | } | } | 
 |  |  | 
| Line 4093  I286 _repe(void) {        // F3: repe | Line 4143  I286 _repe(void) {        // F3: repe | 
 | I286 _hlt(void) {                                                               // F4: hlt | I286 _hlt(void) {                                                               // F4: hlt | 
 |  |  | 
 | __asm { | __asm { | 
| mov             nevent.remainclock, -1 | mov             I286_REMCLOCK, -1 | 
 | ret | ret | 
 | } | } | 
 | } | } | 
| Line 4166  I286 _sti(void) {        // FB: sti | Line 4216  I286 _sti(void) {        // FB: sti | 
 | __asm { | __asm { | 
 | GET_NEXTPRE1 | GET_NEXTPRE1 | 
 | I286CLOCK(2) | I286CLOCK(2) | 
| or              I286_FLAG, I_FLAG | cmp             i286core.s.prefix, 0    // ver0.26 00/10/08 | 
|  | jne             prefix_exist                    // 前方分岐ジャンプなので。 | 
|  | noprefix: | 
|  | movzx   ebp, bl | 
|  | bts             I286_FLAG, 9 | 
|  | jne             jmp_nextop | 
 | test    I286_FLAG, T_FLAG | test    I286_FLAG, T_FLAG | 
 | setne   I286_TRAP | setne   I286_TRAP | 
 |  |  | 
| cmp             i286s.prefix, 0                 // ver0.26 00/10/08 | jne             nextopandexit                   // fast_intr | 
| jne             prefix_exist                    // 前方分岐ジャンプなので。 | cmp             pic.ext_irq, 0 | 
| noprefix:               movzx   eax, bl | jne             jmp_nextop | 
| call    i286op[eax*4] | mov             al, pic.pi[0].imr | 
|  | mov             ah, pic.pi[1].imr | 
|  | not             ax | 
|  | test    al, pic.pi[0].irr | 
|  | jne             nextopandexit | 
|  | test    ah, pic.pi[1].irr | 
|  | jne             nextopandexit | 
|  | jmp_nextop:             jmp             i286op[ebp*4] | 
|  |  | 
|  | nextopandexit:  call    i286op[ebp*4] | 
 | I286IRQCHECKTERM | I286IRQCHECKTERM | 
 |  |  | 
 | prefix_exist:   pop             eax                                             // eax<-offset removeprefix | prefix_exist:   pop             eax                                             // eax<-offset removeprefix |