; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! CORRUPTED !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;   Sorry, after my disk-crash, I can't found any backup of this file, please
; refer to documentation for more informations or to next part (6th)...
;                                                                      THANX!
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³           PMode Tutorial (c) 1996 MATTsoft, All rights reserved.          ³
;ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
;³THiS iS EXAMPLE (5th) New segment organization(CODE32,DATA32,CODE16,DATA16)³
;³                    úúúúúúúúúúúúú G00D LuCK! úúúúúúúúúúúúú                 ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

; þþþþþþþþþþþþþ IMPORTANT þþþþþþþþþþþþþþ
; ÛÛÛÛÛÛ Select your graphics card ÛÛÛÛÛÛ
 VIDEO_SEG equ 0B0000h	; for HERCULES
;VIDEO_SEG equ 0B8000h	; for VGA
; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ

LOCALS @@
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
CODE16  SEGMENT BYTE PUBLIC 'CODE'
        ASSUME CS:CODE16,DS:DATA16
        .386
	.386P
;ùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùú
Start:  mov ax,DATA16
	mov ds,ax
	mov es,ax
;ùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùú
        call CheckProcessor                     ; Check if 386+
	call CheckV86				; Check V86 mode
        call EnableA20
;ùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùú
	ASSUME DS:DATA32
        ;ùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùú
        xor eax,eax
        mov ax,DATA32
        mov ds,ax
        ;ùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùú
        shl eax,4
        add dword ptr ds:[GDT+2],eax
        ;ùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùú
        xor eax,eax
        mov ax,CODE16
        shl eax,4
        add dword ptr ds:[GDT_Code16+2],eax
        ;ùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùú
        xor eax,eax
        mov ax,CODE32
        shl eax,4
        add dword ptr ds:[GDT_Code32+2],eax
        ;ùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùú
        xor eax,eax
        mov ax,DATA32
        shl eax,4
        add dword ptr ds:[GDT_Data32+2],eax
        ;ùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùú
        xor eax,eax
        mov ax,DATA16
        shl eax,4
        add dword ptr ds:[GDT_Data16+2],eax
;ùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùú
	cli
        lgdt fword ptr ds:[GDT]                 ; Load GDTR
        mov eax,cr0
        or al,1
        mov cr0,eax                             ; Set Pmode
        mov ax,CORE32_idx
	mov ds,ax
	mov es,ax
	mov gs,ax
	mov fs,ax
;ùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùú
        db 0EAh
        dw 0
        dw CODE32_idx
Exit16:
;ùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùú
        mov eax,cr0
        xor al,1
        mov cr0,eax                             ; Return back to real :-(
;ùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùú
        mov ax,4c00h
        int 21h                                 ; ... and terminate
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;                               $0ME R0UTiNES...

;ùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùú
; Checks if the processor is 386+
CheckProcessor:
	pushf			; save flags for later
        xor ah,ah               ; clear high byte
        push ax                 ; push AX on the stack
	popf			; pop this value into the flag register
	pushf			; push flags on the stack
        pop ax                  ; ...and get flags into AX
        and ah,0f0h             ; try to set the high nibble
        cmp ah,0f0h             ; on a 80386, the high nibble can never be 0f0h
        je @@1                  ; ...
        mov ah,70h              ; now try to set NT and IOPL
        push ax                 ;
        popf                    ;
        pushf                   ;
        pop ax                  ;
        and ah,70h              ; if they couldn't be modified, no 386 is installed
        jz @@1                  ; ...
	popf			; restore flags
        retn                    ; and return
@@1:    mov dx,offset no386err  ; if there is no 386,                                 L@OwlÄÄÄÄ'(e     ox   ao3aùúùai3ao3aùúùai3ao3aùúùai3ao3aùúùaiaùúùai3ao3aùúùaiaùúùai3ao3aaùúùúù      v ax,CODE3GIGBG9idx
Exit16:
;ùúùúùúùúùúùúùúIùúùailgúùú
	cli
        lgdt fwor  pop ax                  ;
  ; ...@    $0dncd
   úùúùú
        mov eax,cr0
          v          6;e,eùúIùúùailgúùú
	cli
        lgdt Í ùúùú
        mov eax,cr0
  ufset no386err  þy  úùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùÍ ùúù3cr0,eax                            ac;;wlaaaaaafaafaafaafaafaafaafaa86err,aaaain'3wlaaaaaaL86err,aaaain'3wlaaaaaaL8rn
@@1         ; ani86 is installed
    ; L,,,,aaL8rn
@@1         ; ani86 is in;dIm aieRtsi86 is in;	 ; Coúùúùúùúùúù     lgdtgTb    lgdttttt eaaff$oi;3b    lgdttttt eaaff$oi;3b    lgdtttlAtlAtlAÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄfgdtgTb    le@aain'ain'3wla        lgdttttt eaeLlgdtt   ; 9           Aeaax,cr0
          v          6;e,e 660Al    '(G9x.xÄÄÄÄUcr0
          v          6;e,aAca  ac;   v          6;e,aAca  1 o       ,e,aA,aAn
   Aeaax,cr0
          v          nG9op ax                  ; ...a'(e      Ti installed
    ; Le0000    E   G9op ax                lr          l         E             3t f	   l         E         0f0f0linaaaaaaaaaigh nibble can never be  l ldn't b              lr ;    ; tyo   Bh       Oaei 6;lsg_nn't    o
i         ac;;wlaaaaABh sDd, no 3 6;e,aAcae0000die      xor ah,a;e,aAcae0000die      ; D; tyo   Bh no 3 6;e,aAcae0000die      xor ¿ 6;len't    o
i         ac;;wlaaaaAB  ; eaw0B ut    o
i         ac;     3t f	L
 ¿ 6;la:  E       Ci)M$ ; :inaaaaaaaaÄ   Bh       Oaei           Oaefrocessor        Oaefrocessor        Oaefrl660    Oaefrocessorh      Úrh      Úrh      Úrh      ÚrGMfeR6no inaaaaaaaaÄ   Bh $rl660    Oaefrocessorh      Úrh  ;lh      ain'ain'3wla  d  ac;     3t f	L
 ¿ 6;la:  2iR6 o
if  vA o
if  vA o
if  vAeR6 o
iDlaaùúùúù      v ax,COD 3aaùúùúù      v ax,CODE3GIG v ax,Cac;     3t f	L
 rNk=fwor  po eEna AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA	 M    AAAAAAAAAAA	 M    AAAAAAAAAAA	 EeaAcae0000di4Nk=1wor  po eEna AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 	AAAAAAAAAAACorenaaaaaaaAAAAffffhaaaaaaaaaaaaaaaaaaaaaaaAAAAAAA 	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 	AAAAAAAAAAAAAAAAAAAAAAAAA1       ;aaaaaaaaaaaaaaaaaaaaAAAAAP=1,DPL=0,ED=0,W=1,A=0AAA 	AAAAAAAAAAAAAAAAA anni86 ;aaaaaaaaaaaaaaaaaaaaAAAAAAAG=1,s=1],      v16AAA9AAA 	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0000di4Nk=1wor  po eEna AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 	AAAAAAAAAAACodenaaaaaaaAAAAffffhaaaaaaaaaaaaaaaaaaaaaaaAAAAAAA 	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 	AAAAAAAAAAAAAAAAAAAAAAAAA1   1   ;aaaaaaaaaaaaaaaaaaaaAAAAAP=1,DPL=0,C=0,R=1,A=0AAA 	AAAAAAAAAAAAAAAAA anni86 ;aaaaaaaaaaaaaaaaaaaaAAAAAAAG=1,s=0],      v16AAA9AAA 	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0000di4Nk=1wor  po eEna AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 	AAAAAAAAAAADatanaaaaaaaAAAAffffhaaaaaaaaaaaaaaaaaaaaaaaAAAAAAA 	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 	AAAAAAAAAAAAAAAAAAAAAAAAA1       ;aaaaaaaaaaaaaaaaaaaaAAAAAP=1,DPL=0,ED=0,W=1,A=0AAA 	AAAAAAAAAAAAAAAAA anni86 ;aaaaaaaaaaaaaaaaaaaaAAAAAAAG=1,s=1],      v16AAA9AAA 	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0000di4Nk=1wor  po eEna AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 	AAAAAAAAAAACode16AAAAAAAAAAffffhaaaaaaaaaaaaaaaaaaaaaaaAAAAAAA 	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 	AAAAAAAAAAAAAAAAAAAAAAAAA1   1   ;aaaaaaaaaaaa	€>Ruë€¾€¿ ÃP¸,è”°/´5Í!ŒÀÃt*¸CÍ/<€u!P¸&.èx¸CÍ/‰ÔŒÖ‰ÛŒÝ€¾ÃP¸lèVèD%rP¸f)èJ‰Ò‰ß€¾ÃP¸ìè5€>£rÆ2ëG°/´5Í!ŒÀÃt;¸Í/$t$<t<t€>£rÆ2ëÆ2ëÆ2ë¸€FÍ/ÀuÆ2Ã€>£
s°¹EDºQS´+Í!þÀt	‰0€PÃöO€u:P¸ìè°Ž´¾= ¹èe#r!P¸æ(èšŽ´¿¯è6¾¯èe!r‰9é÷P¸ìèvü¾€¬ŠÈ2íã¬< t<	uâõ3É‰5N‰63¸@9ƒÀ±Óè‚@ƒèŽÀƒÀ‹;Ãré¯¿P¹°ÿ+Øûûs±Óã‰7¾5 ¬ò®ue‹×¹ó¦uM‹ß&Š
Àt< t<	uGâî‹5ã‹63ó¦u+‹úƒïý¹@;Ïv‹Ï°:ò®üu&Šèn<Ar<Zw&€}ÿSt‹ú‹7+ÏƒÁPvë“ŒÀöéeÿ‹÷¿ÿW‹Ë+Îó¤^ès rP¸æ,è‹‹Êè>ÃP¸iè~ö¾ub3À»XƒÃƒãðS±ÓëŒÚÚ‹\èÞrE^¼šÔMt€¾€¿ ë0¿•¹œó¤¿*‰>•‹™ó¤¿*‰>›‹ŸÑáÑáó¤ÇÛë;¾•ÇDÇ*ÇDÇDÇD*ÇD@ÇD
VèD.Ç„šÔM€>£rÆ„ŠÃö¾u/‹6«ƒþÿu÷¡@t‹6­ƒþÿt6•è6A¿ÿ‹Çüó¤èÃVWP¸pè—P‰&A¼XP¸•P°@€>@t°€Pè%.‹&A^Àt ƒøtö¾@uº?!´	Í!è¤4ºN!´	Í!ùë$€(€ö¾tèUè£5¿•»èÐ2sº€!è#ø_^ÃVWP¸dè"ö¾t>ö(€u7‹9ÉtP¸#)è¾¯Qè$Ysƒù	 ,:ÿtP¸¢,èæ¾,¹è_^Ãü¿ÿWó¤¾¹ ¹	ó¤Xè%ÿÃACDEFKPRYZ/[.a.v.~.øÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ !"#$øÿ&'()*+,-.øÿøÿøÿøÿøÿ4øÿøÿøÿøÿøÿøÿøÿ<=>øÿøÿAøÿøÿøÿøÿøÿGHIøÿøÿøÿøÿøÿøÿøÿøÿøÿSøÿøÿøÿøÿøÿ]^_`aøÿøÿøÿøÿøÿøÿhøÿjøÿøÿøÿøÿøÿpøÿøÿøÿøÿuøÿøÿxøÿøÿøÿøÿ}øÿøÿ€‚ƒøÿøÿøÿøÿøÿøÿøÿøÿŒøÿøÿøÿøÿøÿ’øÿøÿøÿøÿøÿøÿøÿøÿ›œžŸ ¡¢£øÿ¥¦§øÿøÿøÿøÿøÿøÿøÿøÿ°øÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ»øÿøÿøÿøÿÀøÿÂÃøÿøÿøÿøÿøÿøÿøÿøÿÌøÿøÿøÿÐøÿøÿÓøÿÕøÿ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüý