
                                                    z{z{
i  O@Ҧ² j                     }|}|}
==========================================================================
eG
    UOiJO@ҦBiJ V86 ²d ,eнTw CPU OBbu
 ,{X]Ψ 386 O ,Х TASM 3.1 ӽsĶC
--------------------------------------------------------------------------
zwwwwww{
xiJO@Ҧx
|wwwwww}

    iJO@Ҧ{d ,ئaOiJO@Ҧ ,æbO@ҦUεO
Ūg覡 ,N 'Protection Mode !' rgJ Video Ram (B800:0000) ,
{H̺²覡g ,S~Bz ,]нTwq{bBbuҦ
U~i楻{C(T EMM tO@Ҧn)

    {y{pUG(UҫO}Ҭ 32bit })

        1. ]w GDTtab ҦbO}J GDTadds

        2. ]w Selector 0008 O_l}NO{b CS O}
           ]w Selector 0010 O_l}NO{b CS O}
                Selector 0018 O_l}NO 000B8000 = (B800:0000)

        3.  LGDT FWORD PTR CS:GDTadds iD CPU @iJO@Ҧ ,U
                ϬqO_l}B

        4. ]w CR0  Bit0 = '1' ,ózL JMP OiJO@Ҧ
              iJO@Ҧ ,DS.ES.SS.CS.GS.FS Ȧsw}覡A
                O Segment ,ܦ Selector

        5. qr N 0010:MSG_1 h 0018:0000
                NYN 'Protection Mode !' rh Video Ram h

        6. ]w CR0  Bit0 = '0' ,ózL JMP O^uҦ
              ^uҦ ,DS.ES.SS.CS.GS.FS Ȧsw}覡A
                O Selector ,ܦ Segment

        5. qr N CS:MSG_2 h B800:00A0
                NYN 'Return Real Mode !' rh Video Ram h

        6. {

-----------------------------  P.ASM  ------------------------------------
code    segment
        assume  cs:code,ds:code
.386p
start   proc    near
        jmp     next
gdtadds dw      001fh,0000h,0000h
gdttab  db      000h,000h,00h,00h,00h,00h,00h,00h ;00 Null
        db      0ffh,0ffh,00h,00h,00h,9bh,00h,00h ;08 PRG Seg
        db      0ffh,0ffh,00h,00h,00h,93h,00h,00h ;10 PRG Seg
        db      0ffh,0ffh,00h,80h,0bh,93h,00h,00h ;18 B8000
msg_1   db      'Protection Mode !'
msg_2   db      'Return Real Mode !'

next :
        xor     eax,eax                 ;
        xor     ebx,ebx                 ;
        mov     ax,cs                   ;]w GDTadds
        shl     eax,04h                 ;
        mov     bx,offset gdttab        ;
        add     eax,ebx                 ;
        mov     di,offset gdtadds+02h   ;
        mov     cs:[di],eax             ;
        NOP
        xor     eax,eax                 ;
        xor     ebx,ebx                 ;
        mov     ax,cs                   ;
        shl     eax,04h                 ;
        mov     di,offset gdttab+08h    ;]w GDTtab 
        mov     si,offset gdttab+10h    ;Selector 0008  0010
        mov     cs:[di+02h],ax          ;ӬqO_l}
        mov     cs:[si+02h],ax          ;
        shr     eax,10h                 ;
        mov     cs:[di+04h],al          ;
        mov     cs:[si+04h],al          ;
        mov     cs:[di+07h],ah          ;
        mov     cs:[si+07h],ah          ;
        NOP
        cli
        lgdt    fword ptr cs:gdtadds    ;J GDT 
        mov     eax,cr0             ;
        or      al,01h              ;
        mov     cr0,eax             ;
        jmp     protection_mode     ;iJO@Ҧ
protection_mode :                   ;
        mov     ax,0010h                ;
        mov     ds,ax                   ;
        mov     si,offset msg_1         ;
        mov     ax,0018h                ;N 0010:MSG_1 h 0018:0000
        mov     es,ax                   ;
        mov     di,0000h                ;
        mov     ah,70h                  ;
        mov     cx,0011h                ;
        cld                             ;
L1 :                                    ;
        lodsb                           ;
        stosw                           ;
        loop    L1                      ;
        NOP
        mov     eax,cr0             ;
        and     al,0feh             ;
        mov     cr0,eax             ;^uҦ
        jmp     return_real_mode    ;
return_real_mode :                  ;
        sti
        mov     ax,cs                   ;
        mov     ds,ax                   ;
        mov     si,offset msg_2         ;
        mov     ax,0b800h               ;
        mov     es,ax                   ;N CS:MSG_2 h B800:00A0
        mov     di,00a0h                ;
        mov     ah,70h                  ;
        mov     cx,0012h                ;
        cld                             ;
L2 :                                    ;
        lodsb                           ;
        stosw                           ;
        loop    L2                      ;
        mov     ax,4cffh
        int     21h
start   endp
code    ends
        end     start
--------------------------------------------------------------------------
    ]O@ҦUIsuҦU_ ,ҥH̥HgܥdO
覡qrCoO@²B|ϥΤ_VqdҡC

: ҿפ@seG ,pGwJ䥦O@Ҧ{ ,{N|P[ ,
    yqC










zwwwwwwww{
xiJ 86 Ҧx            D² ,{@L~BzO
|wwwwwwww}
------------------------  V86.ASM  ---------------------------------------
code    segment
        assume  cs:code,ds:code
.386p
start   proc    near
        jmp     next
gdtadds dw      002fh,0000h,0000h
gdttab  db      000h,000h,000h,000h,000h,000h,000h,000h ;00 Null
        db      0ffh,0ffh,000h,000h,000h,09bh,000h,000h ;08 PRG Seg
        db      0ffh,0ffh,000h,000h,000h,093h,08fh,000h ;10 Dos=Page
        db      0ffh,0ffh,000h,000h,000h,089h,000h,000h ;18 TSSltr
        db      0ffh,0ffh,000h,000h,000h,089h,000h,000h ;20 TSSjmp
        db      0ffh,003h,000h,000h,000h,093h,000h,000h ;28 Stack (1K)

tssltr  dd      00000000h
        dd      000003ffh       ;ESP
        dw      0028h,0000h     ;SS.0
        dd      0,0,0,0,0
        dw      offset enter_v86,0000h      ;EIP
        dd      00000200h       ;EFlag
        dd      0,0,0,0
        dd      000003ffh       ;ESP
        dd      0,0,0
        dw      0010h,0000h     ;ES.0
        dw      0008h,0000h     ;CS.0
        dw      0028h,0000h     ;SS.0
        dw      0010h,0000h     ;DS,0
        dw      0010h,0000h     ;FS.0
        dw      0010h,0000h     ;GS.0
        dw      0000h,0000h     ;LDT.0
        dw      0000h,0068h     ;0.IOMAP
        dw      0ffffh

tssjmp  dd      00000000h
        dd      000003ffh       ;ESP
        dw      0028h,0000h     ;SS.0
        dd      0,0,0,0,0
        dw      offset enter_v86,0000h      ;EIP
        dd      00000000h       ;EFlag
        dd      0,0,0,0
        dd      000003ffh       ;ESP
        dd      0,0,0
        dw      0010h,0000h     ;ES.0
        dw      0008h,0000h     ;CS.0
        dw      0028h,0000h     ;SS.0
        dw      0010h,0000h     ;DS,0
        dw      0010h,0000h     ;FS.0
        dw      0010h,0000h     ;GS.0
        dw      0000h,0000h     ;LDT.0
        dw      0000h,0068h     ;0.IOMAP
iomap   db      1000h dup (0)
        dw      0ffffh

buffer1 db      0400h dup (0)           ;Stack

idtadds dw      07ffh,0000h,0000h
idttab  dw      offset new_00,0008h,0ee00h,0000h,offset new_01,0008h,0ee00h,0000h
        dw      offset new_02,0008h,0ee00h,0000h,offset new_03,0008h,0ee00h,0000h
        dw      offset new_04,0008h,0ee00h,0000h,offset new_05,0008h,0ee00h,0000h
        dw      offset new_06,0008h,0ee00h,0000h,offset new_07,0008h,0ee00h,0000h
        dw      offset new_08,0008h,0ee00h,0000h,offset new_09,0008h,0ee00h,0000h
        dw      offset new_0a,0008h,0ee00h,0000h,offset new_0b,0008h,0ee00h,0000h
        dw      offset new_0c,0008h,0ee00h,0000h,offset new_0d,0008h,0ee00h,0000h
        dw      offset new_0e,0008h,0ee00h,0000h,offset new_0f,0008h,0ee00h,0000h
        dw      offset new_10,0008h,0ee00h,0000h,offset new_11,0008h,0ee00h,0000h
        dw      offset new_12,0008h,0ee00h,0000h,offset new_13,0008h,0ee00h,0000h
        dw      offset new_14,0008h,0ee00h,0000h,offset new_15,0008h,0ee00h,0000h
        dw      offset new_16,0008h,0ee00h,0000h,offset new_17,0008h,0ee00h,0000h
        dw      offset new_18,0008h,0ee00h,0000h,offset new_19,0008h,0ee00h,0000h
        dw      offset new_1a,0008h,0ee00h,0000h,offset new_1b,0008h,0ee00h,0000h
        dw      offset new_1c,0008h,0ee00h,0000h,offset new_1d,0008h,0ee00h,0000h
        dw      offset new_1e,0008h,0ee00h,0000h,offset new_1f,0008h,0ee00h,0000h
        dw      offset new_20,0008h,0ee00h,0000h,offset new_21,0008h,0ee00h,0000h
        dw      offset new_22,0008h,0ee00h,0000h,offset new_23,0008h,0ee00h,0000h
        dw      offset new_24,0008h,0ee00h,0000h,offset new_25,0008h,0ee00h,0000h
        dw      offset new_26,0008h,0ee00h,0000h,offset new_27,0008h,0ee00h,0000h
        dw      offset new_28,0008h,0ee00h,0000h,offset new_29,0008h,0ee00h,0000h
        dw      offset new_2a,0008h,0ee00h,0000h,offset new_2b,0008h,0ee00h,0000h
        dw      offset new_2c,0008h,0ee00h,0000h,offset new_2d,0008h,0ee00h,0000h
        dw      offset new_2e,0008h,0ee00h,0000h,offset new_2f,0008h,0ee00h,0000h
        dw      offset new_30,0008h,0ee00h,0000h,offset new_31,0008h,0ee00h,0000h
        dw      offset new_32,0008h,0ee00h,0000h,offset new_33,0008h,0ee00h,0000h
        dw      offset new_34,0008h,0ee00h,0000h,offset new_35,0008h,0ee00h,0000h
        dw      offset new_36,0008h,0ee00h,0000h,offset new_37,0008h,0ee00h,0000h
        dw      offset new_38,0008h,0ee00h,0000h,offset new_39,0008h,0ee00h,0000h
        dw      offset new_3a,0008h,0ee00h,0000h,offset new_3b,0008h,0ee00h,0000h
        dw      offset new_3c,0008h,0ee00h,0000h,offset new_3d,0008h,0ee00h,0000h
        dw      offset new_3e,0008h,0ee00h,0000h,offset new_3f,0008h,0ee00h,0000h
        dw      offset new_40,0008h,0ee00h,0000h,offset new_41,0008h,0ee00h,0000h
        dw      offset new_42,0008h,0ee00h,0000h,offset new_43,0008h,0ee00h,0000h
        dw      offset new_44,0008h,0ee00h,0000h,offset new_45,0008h,0ee00h,0000h
        dw      offset new_46,0008h,0ee00h,0000h,offset new_47,0008h,0ee00h,0000h
        dw      offset new_48,0008h,0ee00h,0000h,offset new_49,0008h,0ee00h,0000h
        dw      offset new_4a,0008h,0ee00h,0000h,offset new_4b,0008h,0ee00h,0000h
        dw      offset new_4c,0008h,0ee00h,0000h,offset new_4d,0008h,0ee00h,0000h
        dw      offset new_4e,0008h,0ee00h,0000h,offset new_4f,0008h,0ee00h,0000h
        dw      offset new_50,0008h,0ee00h,0000h,offset new_51,0008h,0ee00h,0000h
        dw      offset new_52,0008h,0ee00h,0000h,offset new_53,0008h,0ee00h,0000h
        dw      offset new_54,0008h,0ee00h,0000h,offset new_55,0008h,0ee00h,0000h
        dw      offset new_56,0008h,0ee00h,0000h,offset new_57,0008h,0ee00h,0000h
        dw      offset new_58,0008h,0ee00h,0000h,offset new_59,0008h,0ee00h,0000h
        dw      offset new_5a,0008h,0ee00h,0000h,offset new_5b,0008h,0ee00h,0000h
        dw      offset new_5c,0008h,0ee00h,0000h,offset new_5d,0008h,0ee00h,0000h
        dw      offset new_5e,0008h,0ee00h,0000h,offset new_5f,0008h,0ee00h,0000h
        dw      offset new_60,0008h,0ee00h,0000h,offset new_61,0008h,0ee00h,0000h
        dw      offset new_62,0008h,0ee00h,0000h,offset new_63,0008h,0ee00h,0000h
        dw      offset new_64,0008h,0ee00h,0000h,offset new_65,0008h,0ee00h,0000h
        dw      offset new_66,0008h,0ee00h,0000h,offset new_67,0008h,0ee00h,0000h
        dw      offset new_68,0008h,0ee00h,0000h,offset new_69,0008h,0ee00h,0000h
        dw      offset new_6a,0008h,0ee00h,0000h,offset new_6b,0008h,0ee00h,0000h
        dw      offset new_6c,0008h,0ee00h,0000h,offset new_6d,0008h,0ee00h,0000h
        dw      offset new_6e,0008h,0ee00h,0000h,offset new_6f,0008h,0ee00h,0000h
        dw      offset new_70,0008h,0ee00h,0000h,offset new_71,0008h,0ee00h,0000h
        dw      offset new_72,0008h,0ee00h,0000h,offset new_73,0008h,0ee00h,0000h
        dw      offset new_74,0008h,0ee00h,0000h,offset new_75,0008h,0ee00h,0000h
        dw      offset new_76,0008h,0ee00h,0000h,offset new_77,0008h,0ee00h,0000h
        dw      offset new_78,0008h,0ee00h,0000h,offset new_79,0008h,0ee00h,0000h
        dw      offset new_7a,0008h,0ee00h,0000h,offset new_7b,0008h,0ee00h,0000h
        dw      offset new_7c,0008h,0ee00h,0000h,offset new_7d,0008h,0ee00h,0000h
        dw      offset new_7e,0008h,0ee00h,0000h,offset new_7f,0008h,0ee00h,0000h
        dw      offset new_80,0008h,0ee00h,0000h,offset new_81,0008h,0ee00h,0000h
        dw      offset new_82,0008h,0ee00h,0000h,offset new_83,0008h,0ee00h,0000h
        dw      offset new_84,0008h,0ee00h,0000h,offset new_85,0008h,0ee00h,0000h
        dw      offset new_86,0008h,0ee00h,0000h,offset new_87,0008h,0ee00h,0000h
        dw      offset new_88,0008h,0ee00h,0000h,offset new_89,0008h,0ee00h,0000h
        dw      offset new_8a,0008h,0ee00h,0000h,offset new_8b,0008h,0ee00h,0000h
        dw      offset new_8c,0008h,0ee00h,0000h,offset new_8d,0008h,0ee00h,0000h
        dw      offset new_8e,0008h,0ee00h,0000h,offset new_8f,0008h,0ee00h,0000h
        dw      offset new_90,0008h,0ee00h,0000h,offset new_91,0008h,0ee00h,0000h
        dw      offset new_92,0008h,0ee00h,0000h,offset new_93,0008h,0ee00h,0000h
        dw      offset new_94,0008h,0ee00h,0000h,offset new_95,0008h,0ee00h,0000h
        dw      offset new_96,0008h,0ee00h,0000h,offset new_97,0008h,0ee00h,0000h
        dw      offset new_98,0008h,0ee00h,0000h,offset new_99,0008h,0ee00h,0000h
        dw      offset new_9a,0008h,0ee00h,0000h,offset new_9b,0008h,0ee00h,0000h
        dw      offset new_9c,0008h,0ee00h,0000h,offset new_9d,0008h,0ee00h,0000h
        dw      offset new_9e,0008h,0ee00h,0000h,offset new_9f,0008h,0ee00h,0000h
        dw      offset new_a0,0008h,0ee00h,0000h,offset new_a1,0008h,0ee00h,0000h
        dw      offset new_a2,0008h,0ee00h,0000h,offset new_a3,0008h,0ee00h,0000h
        dw      offset new_a4,0008h,0ee00h,0000h,offset new_a5,0008h,0ee00h,0000h
        dw      offset new_a6,0008h,0ee00h,0000h,offset new_a7,0008h,0ee00h,0000h
        dw      offset new_a8,0008h,0ee00h,0000h,offset new_a9,0008h,0ee00h,0000h
        dw      offset new_aa,0008h,0ee00h,0000h,offset new_ab,0008h,0ee00h,0000h
        dw      offset new_ac,0008h,0ee00h,0000h,offset new_ad,0008h,0ee00h,0000h
        dw      offset new_ae,0008h,0ee00h,0000h,offset new_af,0008h,0ee00h,0000h
        dw      offset new_b0,0008h,0ee00h,0000h,offset new_b1,0008h,0ee00h,0000h
        dw      offset new_b2,0008h,0ee00h,0000h,offset new_b3,0008h,0ee00h,0000h
        dw      offset new_b4,0008h,0ee00h,0000h,offset new_b5,0008h,0ee00h,0000h
        dw      offset new_b6,0008h,0ee00h,0000h,offset new_b7,0008h,0ee00h,0000h
        dw      offset new_b8,0008h,0ee00h,0000h,offset new_b9,0008h,0ee00h,0000h
        dw      offset new_ba,0008h,0ee00h,0000h,offset new_bb,0008h,0ee00h,0000h
        dw      offset new_bc,0008h,0ee00h,0000h,offset new_bd,0008h,0ee00h,0000h
        dw      offset new_be,0008h,0ee00h,0000h,offset new_bf,0008h,0ee00h,0000h
        dw      offset new_c0,0008h,0ee00h,0000h,offset new_c1,0008h,0ee00h,0000h
        dw      offset new_c2,0008h,0ee00h,0000h,offset new_c3,0008h,0ee00h,0000h
        dw      offset new_c4,0008h,0ee00h,0000h,offset new_c5,0008h,0ee00h,0000h
        dw      offset new_c6,0008h,0ee00h,0000h,offset new_c7,0008h,0ee00h,0000h
        dw      offset new_c8,0008h,0ee00h,0000h,offset new_c9,0008h,0ee00h,0000h
        dw      offset new_ca,0008h,0ee00h,0000h,offset new_cb,0008h,0ee00h,0000h
        dw      offset new_cc,0008h,0ee00h,0000h,offset new_cd,0008h,0ee00h,0000h
        dw      offset new_ce,0008h,0ee00h,0000h,offset new_cf,0008h,0ee00h,0000h
        dw      offset new_d0,0008h,0ee00h,0000h,offset new_d1,0008h,0ee00h,0000h
        dw      offset new_d2,0008h,0ee00h,0000h,offset new_d3,0008h,0ee00h,0000h
        dw      offset new_d4,0008h,0ee00h,0000h,offset new_d5,0008h,0ee00h,0000h
        dw      offset new_d6,0008h,0ee00h,0000h,offset new_d7,0008h,0ee00h,0000h
        dw      offset new_d8,0008h,0ee00h,0000h,offset new_d9,0008h,0ee00h,0000h
        dw      offset new_da,0008h,0ee00h,0000h,offset new_db,0008h,0ee00h,0000h
        dw      offset new_dc,0008h,0ee00h,0000h,offset new_dd,0008h,0ee00h,0000h
        dw      offset new_de,0008h,0ee00h,0000h,offset new_df,0008h,0ee00h,0000h
        dw      offset new_e0,0008h,0ee00h,0000h,offset new_e1,0008h,0ee00h,0000h
        dw      offset new_e2,0008h,0ee00h,0000h,offset new_e3,0008h,0ee00h,0000h
        dw      offset new_e4,0008h,0ee00h,0000h,offset new_e5,0008h,0ee00h,0000h
        dw      offset new_e6,0008h,0ee00h,0000h,offset new_e7,0008h,0ee00h,0000h
        dw      offset new_e8,0008h,0ee00h,0000h,offset new_e9,0008h,0ee00h,0000h
        dw      offset new_ea,0008h,0ee00h,0000h,offset new_eb,0008h,0ee00h,0000h
        dw      offset new_ec,0008h,0ee00h,0000h,offset new_ed,0008h,0ee00h,0000h
        dw      offset new_ee,0008h,0ee00h,0000h,offset new_ef,0008h,0ee00h,0000h
        dw      offset new_f0,0008h,0ee00h,0000h,offset new_f1,0008h,0ee00h,0000h
        dw      offset new_f2,0008h,0ee00h,0000h,offset new_f3,0008h,0ee00h,0000h
        dw      offset new_f4,0008h,0ee00h,0000h,offset new_f5,0008h,0ee00h,0000h
        dw      offset new_f6,0008h,0ee00h,0000h,offset new_f7,0008h,0ee00h,0000h
        dw      offset new_f8,0008h,0ee00h,0000h,offset new_f9,0008h,0ee00h,0000h
        dw      offset new_fa,0008h,0ee00h,0000h,offset new_fb,0008h,0ee00h,0000h
        dw      offset new_fc,0008h,0ee00h,0000h,offset new_fd,0008h,0ee00h,0000h
        dw      offset new_fe,0008h,0ee00h,0000h,offset new_ff,0008h,0ee00h,0000h

new_00 :
        push    0000h
        jmp     int_emu
new_01 :
        push    0001h
        jmp     int_emu
new_02 :
        push    0002h
        jmp     int_emu
new_03 :
        push    0003h
        jmp     int_emu
new_04 :
        push    0004h
        jmp     int_emu
new_05 :
        push    0005h
        jmp     int_emu
new_06 :
        push    0006h
        jmp     int_emu
new_07 :
        push    0007h
        jmp     int_emu
new_08 :
        push    0008h
        jmp     int_emu
new_09 :
        push    0009h
        jmp     int_emu
new_0a :
        push    000ah
        jmp     int_emu
new_0b :
        push    000bh
        jmp     int_emu
new_0c :
        push    000ch
        jmp     int_emu
new_0d :
        push    000dh
        jmp     int_emu
new_0e :
        push    000eh
        jmp     int_emu
new_0f :
        push    000fh
        jmp     int_emu
new_10 :
        push    0010h
        jmp     int_emu
new_11 :
        push    0011h
        jmp     int_emu
new_12 :
        push    0012h
        jmp     int_emu
new_13 :
        push    0013h
        jmp     int_emu
new_14 :
        push    0014h
        jmp     int_emu
new_15 :
        cmp     ah,87h
        jnz     L3
        push    bp
        mov     bp,sp
        add     bp,02h
        push    eax
        push    ebx
        push    ecx
        push    edx
        push    edi
        push    esi
        mov     ebx,ss:[bp+14h]
        shl     ebx,04h
        and     esi,0000ffffh
        add     ebx,esi
        mov     ax,0010h
        mov     ds,ax
        mov     es,ax
        mov     esi,ds:[ebx+12h]
        mov     edi,ds:[ebx+1ah]
        and     esi,00ffffffh
        and     edi,00ffffffh
        or      cx,cx
        jz      L2
L1 :
        mov     ax,ds:[esi]
        mov     es:[edi],ax
        add     esi,02h
        add     edi,02h
        loop    L1
L2 :
        pop     esi
        pop     edi
        pop     edx
        pop     ecx
        pop     ebx
        pop     eax
        pop     bp
        iretd
L3 :
        push    0015h
        jmp     int_emu
new_16 :
        push    0016h
        jmp     int_emu
new_17 :
        push    0017h
        jmp     int_emu
new_18 :
        push    0018h
        jmp     int_emu
new_19 :
        push    0019h
        jmp     int_emu
new_1a :
        push    001ah
        jmp     int_emu
new_1b :
        push    001bh
        jmp     int_emu
new_1c :
        push    001ch
        jmp     int_emu
new_1d :
        push    001dh
        jmp     int_emu
new_1e :
        push    001eh
        jmp     int_emu
new_1f :
        push    001fh
        jmp     int_emu
new_20 :
        push    0020h
        jmp     int_emu
new_21 :
        push    0021h
        jmp     int_emu
new_22 :
        push    0022h
        jmp     int_emu
new_23 :
        push    0023h
        jmp     int_emu
new_24 :
        push    0024h
        jmp     int_emu
new_25 :
        push    0025h
        jmp     int_emu
new_26 :
        push    0026h
        jmp     int_emu
new_27 :
        push    0027h
        jmp     int_emu
new_28 :
        push    0028h
        jmp     int_emu
new_29 :
        push    0029h
        jmp     int_emu
new_2a :
        push    002ah
        jmp     int_emu
new_2b :
        push    002bh
        jmp     int_emu
new_2c :
        push    002ch
        jmp     int_emu
new_2d :
        push    002dh
        jmp     int_emu
new_2e :
        push    002eh
        jmp     int_emu
new_2f :
        push    002fh
        jmp     int_emu
new_30 :
        push    0030h
        jmp     int_emu
new_31 :
        push    0031h
        jmp     int_emu
new_32 :
        push    0032h
        jmp     int_emu
new_33 :
        push    0033h
        jmp     int_emu
new_34 :
        push    0034h
        jmp     int_emu
new_35 :
        push    0035h
        jmp     int_emu
new_36 :
        push    0036h
        jmp     int_emu
new_37 :
        push    0037h
        jmp     int_emu
new_38 :
        push    0038h
        jmp     int_emu
new_39 :
        push    0039h
        jmp     int_emu
new_3a :
        push    003ah
        jmp     int_emu
new_3b :
        push    003bh
        jmp     int_emu
new_3c :
        push    003ch
        jmp     int_emu
new_3d :
        push    003dh
        jmp     int_emu
new_3e :
        push    003eh
        jmp     int_emu
new_3f :
        push    003fh
        jmp     int_emu
new_40 :
        push    0040h
        jmp     int_emu
new_41 :
        push    0041h
        jmp     int_emu
new_42 :
        push    0042h
        jmp     int_emu
new_43 :
        push    0043h
        jmp     int_emu
new_44 :
        push    0044h
        jmp     int_emu
new_45 :
        push    0045h
        jmp     int_emu
new_46 :
        push    0046h
        jmp     int_emu
new_47 :
        push    0047h
        jmp     int_emu
new_48 :
        push    0048h
        jmp     int_emu
new_49 :
        push    0049h
        jmp     int_emu
new_4a :
        push    004ah
        jmp     int_emu
new_4b :
        push    004bh
        jmp     int_emu
new_4c :
        push    004ch
        jmp     int_emu
new_4d :
        push    004dh
        jmp     int_emu
new_4e :
        push    004eh
        jmp     int_emu
new_4f :
        push    004fh
        jmp     int_emu
new_50 :
        push    0050h
        jmp     int_emu
new_51 :
        push    0051h
        jmp     int_emu
new_52 :
        push    0052h
        jmp     int_emu
new_53 :
        push    0053h
        jmp     int_emu
new_54 :
        push    0054h
        jmp     int_emu
new_55 :
        push    0055h
        jmp     int_emu
new_56 :
        push    0056h
        jmp     int_emu
new_57 :
        push    0057h
        jmp     int_emu
new_58 :
        push    0058h
        jmp     int_emu
new_59 :
        push    0059h
        jmp     int_emu
new_5a :
        push    005ah
        jmp     int_emu
new_5b :
        push    005bh
        jmp     int_emu
new_5c :
        push    005ch
        jmp     int_emu
new_5d :
        push    005dh
        jmp     int_emu
new_5e :
        push    005eh
        jmp     int_emu
new_5f :
        push    005fh
        jmp     int_emu
new_60 :
        push    0060h
        jmp     int_emu
new_61 :
        push    0061h
        jmp     int_emu
new_62 :
        push    0062h
        jmp     int_emu
new_63 :
        push    0063h
        jmp     int_emu
new_64 :
        push    0064h
        jmp     int_emu
new_65 :
        push    0065h
        jmp     int_emu
new_66 :
        push    0066h
        jmp     int_emu
new_67 :
        push    0067h
        jmp     int_emu
new_68 :
        push    0068h
        jmp     int_emu
new_69 :
        push    0069h
        jmp     int_emu
new_6a :
        push    006ah
        jmp     int_emu
new_6b :
        push    006bh
        jmp     int_emu
new_6c :
        push    006ch
        jmp     int_emu
new_6d :
        push    006dh
        jmp     int_emu
new_6e :
        push    006eh
        jmp     int_emu
new_6f :
        push    006fh
        jmp     int_emu
new_70 :
        push    0070h
        jmp     int_emu
new_71 :
        push    0071h
        jmp     int_emu
new_72 :
        push    0072h
        jmp     int_emu
new_73 :
        push    0073h
        jmp     int_emu
new_74 :
        push    0074h
        jmp     int_emu
new_75 :
        push    0075h
        jmp     int_emu
new_76 :
        push    0076h
        jmp     int_emu
new_77 :
        push    0077h
        jmp     int_emu
new_78 :
        push    0078h
        jmp     int_emu
new_79 :
        push    0079h
        jmp     int_emu
new_7a :
        push    007ah
        jmp     int_emu
new_7b :
        push    007bh
        jmp     int_emu
new_7c :
        push    007ch
        jmp     int_emu
new_7d :
        push    007dh
        jmp     int_emu
new_7e :
        push    007eh
        jmp     int_emu
new_7f :
        push    007fh
        jmp     int_emu
new_80 :
        push    0080h
        jmp     int_emu
new_81 :
        push    0081h
        jmp     int_emu
new_82 :
        push    0082h
        jmp     int_emu
new_83 :
        push    0083h
        jmp     int_emu
new_84 :
        push    0084h
        jmp     int_emu
new_85 :
        push    0085h
        jmp     int_emu
new_86 :
        push    0086h
        jmp     int_emu
new_87 :
        push    0087h
        jmp     int_emu
new_88 :
        push    0088h
        jmp     int_emu
new_89 :
        push    0089h
        jmp     int_emu
new_8a :
        push    008ah
        jmp     int_emu
new_8b :
        push    008bh
        jmp     int_emu
new_8c :
        push    008ch
        jmp     int_emu
new_8d :
        push    008dh
        jmp     int_emu
new_8e :
        push    008eh
        jmp     int_emu
new_8f :
        push    008fh
        jmp     int_emu
new_90 :
        push    0090h
        jmp     int_emu
new_91 :
        push    0091h
        jmp     int_emu
new_92 :
        push    0092h
        jmp     int_emu
new_93 :
        push    0093h
        jmp     int_emu
new_94 :
        push    0094h
        jmp     int_emu
new_95 :
        push    0095h
        jmp     int_emu
new_96 :
        push    0096h
        jmp     int_emu
new_97 :
        push    0097h
        jmp     int_emu
new_98 :
        push    0098h
        jmp     int_emu
new_99 :
        push    0099h
        jmp     int_emu
new_9a :
        push    009ah
        jmp     int_emu
new_9b :
        push    009bh
        jmp     int_emu
new_9c :
        push    009ch
        jmp     int_emu
new_9d :
        push    009dh
        jmp     int_emu
new_9e :
        push    009eh
        jmp     int_emu
new_9f :
        push    009fh
        jmp     int_emu
new_a0 :
        push    00a0h
        jmp     int_emu
new_a1 :
        push    00a1h
        jmp     int_emu
new_a2 :
        push    00a2h
        jmp     int_emu
new_a3 :
        push    00a3h
        jmp     int_emu
new_a4 :
        push    00a4h
        jmp     int_emu
new_a5 :
        push    00a5h
        jmp     int_emu
new_a6 :
        push    00a6h
        jmp     int_emu
new_a7 :
        push    00a7h
        jmp     int_emu
new_a8 :
        push    00a8h
        jmp     int_emu
new_a9 :
        push    00a9h
        jmp     int_emu
new_aa :
        push    00aah
        jmp     int_emu
new_ab :
        push    00abh
        jmp     int_emu
new_ac :
        push    00ach
        jmp     int_emu
new_ad :
        push    00adh
        jmp     int_emu
new_ae :
        push    00aeh
        jmp     int_emu
new_af :
        push    00afh
        jmp     int_emu
new_b0 :
        push    00b0h
        jmp     int_emu
new_b1 :
        push    00b1h
        jmp     int_emu
new_b2 :
        push    00b2h
        jmp     int_emu
new_b3 :
        push    00b3h
        jmp     int_emu
new_b4 :
        push    00b4h
        jmp     int_emu
new_b5 :
        push    00b5h
        jmp     int_emu
new_b6 :
        push    00b6h
        jmp     int_emu
new_b7 :
        push    00b7h
        jmp     int_emu
new_b8 :
        push    00b8h
        jmp     int_emu
new_b9 :
        push    00b9h
        jmp     int_emu
new_ba :
        push    00bah
        jmp     int_emu
new_bb :
        push    00bbh
        jmp     int_emu
new_bc :
        push    00bch
        jmp     int_emu
new_bd :
        push    00bdh
        jmp     int_emu
new_be :
        push    00beh
        jmp     int_emu
new_bf :
        push    00bfh
        jmp     int_emu
new_c0 :
        push    00c0h
        jmp     int_emu
new_c1 :
        push    00c1h
        jmp     int_emu
new_c2 :
        push    00c2h
        jmp     int_emu
new_c3 :
        push    00c3h
        jmp     int_emu
new_c4 :
        push    00c4h
        jmp     int_emu
new_c5 :
        push    00c5h
        jmp     int_emu
new_c6 :
        push    00c6h
        jmp     int_emu
new_c7 :
        push    00c7h
        jmp     int_emu
new_c8 :
        push    00c8h
        jmp     int_emu
new_c9 :
        push    00c9h
        jmp     int_emu
new_ca :
        push    00cah
        jmp     int_emu
new_cb :
        push    00cbh
        jmp     int_emu
new_cc :
        push    00cch
        jmp     int_emu
new_cd :
        push    00cdh
        jmp     int_emu
new_ce :
        push    00ceh
        jmp     int_emu
new_cf :
        push    00cfh
        jmp     int_emu
new_d0 :
        push    00d0h
        jmp     int_emu
new_d1 :
        push    00d1h
        jmp     int_emu
new_d2 :
        push    00d2h
        jmp     int_emu
new_d3 :
        push    00d3h
        jmp     int_emu
new_d4 :
        push    00d4h
        jmp     int_emu
new_d5 :
        push    00d5h
        jmp     int_emu
new_d6 :
        push    00d6h
        jmp     int_emu
new_d7 :
        push    00d7h
        jmp     int_emu
new_d8 :
        push    00d8h
        jmp     int_emu
new_d9 :
        push    00d9h
        jmp     int_emu
new_da :
        push    00dah
        jmp     int_emu
new_db :
        push    00dbh
        jmp     int_emu
new_dc :
        push    00dch
        jmp     int_emu
new_dd :
        push    00ddh
        jmp     int_emu
new_de :
        push    00deh
        jmp     int_emu
new_df :
        push    00dfh
        jmp     int_emu
new_e0 :
        push    00e0h
        jmp     int_emu
new_e1 :
        push    00e1h
        jmp     int_emu
new_e2 :
        push    00e2h
        jmp     int_emu
new_e3 :
        push    00e3h
        jmp     int_emu
new_e4 :
        push    00e4h
        jmp     int_emu
new_e5 :
        push    00e5h
        jmp     int_emu
new_e6 :
        push    00e6h
        jmp     int_emu
new_e7 :
        push    00e7h
        jmp     int_emu
new_e8 :
        push    00e8h
        jmp     int_emu
new_e9 :
        push    00e9h
        jmp     int_emu
new_ea :
        push    00eah
        jmp     int_emu
new_eb :
        push    00ebh
        jmp     int_emu
new_ec :
        push    00ech
        jmp     int_emu
new_ed :
        push    00edh
        jmp     int_emu
new_ee :
        push    00eeh
        jmp     int_emu
new_ef :
        push    00efh
        jmp     int_emu
new_f0 :
        push    00f0h
        jmp     int_emu
new_f1 :
        push    00f1h
        jmp     int_emu
new_f2 :
        push    00f2h
        jmp     int_emu
new_f3 :
        push    00f3h
        jmp     int_emu
new_f4 :
        push    00f4h
        jmp     int_emu
new_f5 :
        push    00f5h
        jmp     int_emu
new_f6 :
        push    00f6h
        jmp     int_emu
new_f7 :
        push    00f7h
        jmp     int_emu
new_f8 :
        push    00f8h
        jmp     int_emu
new_f9 :
        push    00f9h
        jmp     int_emu
new_fa :
        push    00fah
        jmp     int_emu
new_fb :
        push    00fbh
        jmp     int_emu
new_fc :
        push    00fch
        jmp     int_emu
new_fd :
        push    00fdh
        jmp     int_emu
new_fe :
        push    00feh
        jmp     int_emu
new_ff :
        push    00ffh
        jmp     int_emu

int_emu :
        push    bp
        mov     bp,sp
        add     bp,04h
        push    eax
        push    ebx
       mov     ax,0010h                 ;
       mov     ds,ax                    ;
        mov     ax,ss:[bp+0ch]          ;
        sub     ax,06h                  ;
        mov     ss:[bp+0ch],ax          ;
        xor     eax,eax                 ;
        xor     ebx,ebx                 ;
        mov     ax,ss:[bp+10h]          ;V86 U IRET n^}
        shl     eax,04h                 ;
        mov     bx,ss:[bp+0ch]          ;
        add     ebx,eax                 ;
        mov     ax,ss:[bp+00h]          ;
        mov     ds:[ebx],ax             ;
        mov     ax,ss:[bp+04h]          ;
        mov     ds:[ebx+02h],ax         ;
        mov     ax,ss:[bp+08h]          ;
        mov     ds:[ebx+04h],ax         ;
        nop
        xor     ebx,ebx                 ;
        mov     bx,ss:[bp-02h]          ;
        shl     ebx,02h                 ;
        mov     ax,ds:[ebx]             ;IRETDB
        mov     ss:[bp+00h],ax          ;(d 0000:0000 _)
        mov     ax,ds:[ebx+02h]         ;
        mov     ss:[bp+04h],ax          ;
        mov     eax,ss:[bp+08h]
        or      eax,00032000h
        and     eax,0fffffeffh
        mov     ss:[bp+08h],eax
        pop     ebx
        pop     eax
        pop     bp
        add     sp,02h
        iretd

set_base :
        mov     cs:[di+02h],ax
        shr     eax,0010h
        mov     cs:[di+04h],al
        mov     cs:[di+07h],ah
        ret
next :
        xor     eax,eax
        xor     ebx,ebx
        mov     ax,cs
        shl     eax,04h
        mov     bx,offset gdttab
        add     eax,ebx
        mov     di,offset gdtadds+02h
        mov     cs:[di],eax                     ;]w gdtadds
        NOP
        xor     eax,eax
        xor     ebx,ebx
        mov     ax,cs
        shl     eax,04h
        mov     di,offset gdttab+08h
        call    set_base                        ;]w PRG Seg  Base
        NOP
        xor     eax,eax
        xor     ebx,ebx
        mov     ax,cs
        shl     eax,04h
        mov     bx,offset tssltr
        add     eax,ebx
        mov     di,offset gdttab+18h
        call    set_base
        NOP                                     ;]w TSSltr  Base
        xor     eax,eax
        xor     ebx,ebx
        mov     ax,cs
        shl     eax,04h
        mov     bx,offset tssjmp
        add     eax,ebx
        mov     di,offset gdttab+20h
        call    set_base
        NOP                                     ;]w TSSjmp  Base
        xor     eax,eax
        xor     ebx,ebx
        mov     ax,cs
        shl     eax,04h
        mov     bx,offset buffer1
        add     eax,ebx
        mov     di,offset gdttab+28h
        call    set_base
        NOP                                     ;]w Stack  Base
        xor     eax,eax
        xor     ebx,ebx
        mov     ax,cs
        shl     eax,04h
        mov     bx,offset idttab
        add     eax,ebx
        mov     di,offset idtadds+02h
        mov     cs:[di],eax                     ;]w idtadds
        NOP
        cli
        lgdt    fword ptr cs:gdtadds
        lidt    fword ptr cs:idtadds
        mov     eax,cr0
        or      al,01h
        mov     cr0,eax
        mov     bx,0018h
        ltr     bx
        db      0eah,00h,00h,20h,00h            ;ھTSSienter_v86
enter_v86 :
        mov     ax,0028h
        mov     es,ax
        xor     eax,eax
        mov     ax,code
        push    eax             ;GS
        push    eax             ;FS
        push    eax             ;DS
        push    eax             ;ES
        push    eax             ;SS
        mov     ax,0f000h
        push    eax             ;ESP
        mov     eax,00023000h   ;]wVM=1    =3
        push    eax             ;Eflag
        xor     eax,eax
        mov     ax,code
        push    eax             ;CS
        mov     ax,offset return_dos
        push    eax             ;EIP
        clts                    ;N 387  32 줸Ҧ
        iretd                   ;^ V86 (@uX24h BYTE)
;-------------------------------------------------------------------------
;  U{KO^ V86 ~檺{
;-------------------------------------------------------------------------
return_dos :
        sti
        mov     ax,cs
        mov     ds,ax
        mov     dx,offset next
        add     dx,0200h
        int     27h
start   endp
code    ends
        end     start
;-------------------------------------------------------------------------
    p󰻴{bObuҦUΫO@ҦO ,INb CR0 Ȧs Bit0
O_ '1' ,Y '1' hܲ{bbO@Ҧ ,ϤhuҦ ,LpGn
 MOV EAX,CR0 oӫOݭnbSvŤ~ ,ҥHznoӦ줸
 ,iHϥ SMSW AX ,Ū CR0 C줸C


zwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww{
x  Soft Bugger nE 90:90/2                    ns޳N  x
x  BBS:02-5955461 24HR          ID:Werong Ho               -- nE --  x
|wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww}

