Ennek a módnak több neve is van, nevezik UNREAL-nak, FLAT REALNAK, meg mindennek :), de nekem ezt tetszik a legjobban, úgyhogy ezt fogom használni. A kérdés az, hogy hogyan tudunk felső memóriát használni ?

  • EMS
  • XMS
  • Loadall
  • PMODE
  • Unreal
Az EMS nem túl nyerő ,mert lapozgatni kell össze-vissza. Az XMS esetén egy kicsit jobb a helyzet, mert itt egy táblázatot kell kitöltögetni, bár ez sem túl nyerő. A 'loadall' utasítással már lehetne valamit kezdeni, csak nem sok helyen működik.

Maradt a védett mód. Ez azonban megint csak nem túl nyerő, mert akkor a védett mód működését is meg kellene érteni, és ráadásul kellene egy jó extender...

Akkor marad a Unreal mód. Ez úgy működik, hogy felváltunk védett módba, beállítjuk, hogy láthassuk az egész memóriát , és visszakapcsolunk normál módba. Ennek azonban az a hátránya, hogy ems-sel nem megy, erre azonban van egy trükk, amit a M*****soft nem dokumentált, miszerint ki lehet kapcsolni az EMM386-ot megfelelő interrupt hívással. Hogy mik ki nem derülnek... :)

Ha valaki bővebb információt akar kapni, akkor olvasson:
COV-ot
PMODE/W doksit
Tran féle pmode doksit
Meg mindenféle doksit :)

Háromféle forrást találhattok a leirás mellett, az UTILS-ban egy MASSIVE'S FLAT REALT, egy Herman Dullink féle FLAT REALT, és egy COV-ból kiszedett FLAT REAL-t, amit egy kicsit módosítgattam is..

  -------------------------[ UNREAL EXAMPLE ]-----------------------   org      100h   section  .text   start:   mov          ax,DescriptorTable            mov          [GDTA],ax            smsw         ax            test         ax,1                    ; védett módban vagyunk?            jnz          prot                    ; ha igen, kilépés            call         AllocX                  ; megvizsgáljuk,            jnc          xm                      ; van-e XMS    error:  mov          ah,9            mov          dx,error_x            int          21h            jmp          bye    xm:            call         Unreal            mov          eax,[PHA]            mov          [unr],eax            mov          ah,9            mov          dx,unr            int          21h            ; Innentől kezdődik a programod, és a PHA címtől            ; kezdve lehet írni a memóriába ! pl.            ; ...            ; mov edi,pha            ; mov esi,offset picture            ; mov cx,64000            ; run:            ; mov  al,[esi]            ; mov  [edi],al            ; inc  di            ; inc  si            ; loop run            ; ...            call         FreeX                   ; az XMS felszabadítása    bye:    ret    prot:   sub          byte [error+3],24   ; Egy kis önmódosítás :)            jmp          error    AllocX:            mov          ax,4300h                ; van XMS?            int          2fh            cmp          al,80h            je           yes            stc                                  ; nincs            ret                                  ; visszatérés    yes:    mov          ax,4310h                ; van, a függvények            int          2fh                     ; címét lekérdezzük            mov          word [XMSCTL],bx            mov          word [XMSCTL+2],es            mov          ah,8                    ; a legnagyobb szabad            call         far [XMSCTL]            ; blokk méretének            push         ax                      ; megállapítása            mov          dx,ax                   ; és a blokk            mov          ah,9                    ; lefoglalása            call         far [XMSCTL]            mov          [XMSHNDL],dx            ; a blokk zárolása            mov          ah,0ch                  ; így kapunk            call         far [XMSCTL]            ; fizikai címet            mov          word [PHA], bx            mov          word [PHA+2], dx            mov          ah,5                    ; az A20 vonal lokális            call         far [XMSCTL]            ; engedélyezése            pop          ax                      ; AX-ben a blokk mérete            clc                                  ; visszatérés "van XMS"            ret                                  ; jelzéssel    FreeX:  cmp          DWORD [XMSCTL],0        ; ha a függvények            jne          yes2                    ; belépési pontja nem            ret                                  ; változott, nincs XMS    yes2:   mov          ah,0dh                  ; zárolás feloldása            mov          dx,[XMSHNDL]            call         far [XMSCTL]            mov          ah,0ah                  ; blokk felszabadítása            mov          dx,[XMSHNDL]            call         far [XMSCTL]            mov          ah,6                    ; a lokális engedélyezés            call         far [XMSCTL]            ; megszüntetése            ret    Unreal: xor          eax,eax                 ; a GDTR-nek 32-bites            mov          ax,ds                   ; fizikai cím kell, így            shl          eax,4                   ; szegmenscím*16-ot                                                 ; adunk az offset-hez            add          [dword GDTA],eax            lgdt         [dword GDTD]            ; GDTR betöltése            mov          eax,cr0            or           al,1                    ; átváltunk            mov          cr0,eax                 ; védett módba            mov          ax,8                    ; az 1. deszkriptorra            mov          ds,ax                   ; mutató szelektort            mov          es,ax                   ; töltjük a szegmens-            mov          fs,ax                   ; regiszterekbe (RPL=0,            mov          gs,ax                   ; deszkriptor a GDT-ben)            mov          eax,cr0            and          al,0feh                 ; visszaváltunk            mov          cr0,eax                 ; valós módba            push         cs                      ; DS-t elállítottuk,            pop          ds                      ; most visszaírjuk            ret   section  .data DescriptorTable:            times 8 db 0                         ; nulldeszkriptor                                                 ; innentől az 1. deszkriptor            dw 0ffffh                            ; határ (0..15)            dw 0                                 ; báziscím (0..15)            db 0                                 ; báziscím (16..23)            db 10010010b                         ; információk:                                                 ; P=1                                                 ; DPL=0 (00)                                                 ; S=1                                                 ; EX=0                                                 ; C/E=0                                                 ; W/R=1                                                 ; A=0            db 11001111b                         ; további információk:                                                 ; G=1                                                 ; B=1                                                 ; 0                                                 ; AVL=0                                                 ; határ (16..19)            db 0                                 ; báziscím (24..31)    GDTD    dw 0fh    GDTA    dw 0, 0    error_e  db  'Remove your EMS-manager$'    error_x  db  'XMS error$'    XMSCTL  dd   0                               ; XMS Rutin    XMSHNDL dw   0                               ; XMS handle    PHA     dd   0                               ; Fizikai cím    xmsdriver dw  0,0    unr      dd   0             db   ' Hello world from Unreal mode!$'   section .bss   -------------------------[ END OF UNREAL ]-----------------------