;----------------------------------------------------------------------------- ; Az FS regisztert tilos atirni kimenteni/visszatolteni stb.!!!!! ; (ekkor visszater real modba)!!!!!!! ;----------------------------------------------------------------------------- ; Tabla de descriptores LABEL DescTabl DB 8 DUP (?) ; Descriptor 0 no utilizado DW 0FFFFh ; 4 Gigabyte (64K pag) de tama$o DW 0 ; b15..0 del origen DB 0 ; b23..16 del origen DB 10010010b ; b7: presente (s! = 1) ; b65: privilege level (00) ; b4: segmento de sistema: (no=1) ; b3: no ejecutable (0) ; b2: no hacia abajo (0) ; b1: escribible (1) ; b0: acceso (no a#n) DB 11001111b ; b7: granularidad (p ginas = 1) ; b6: grande (?) (s! = 1) ; b5: (?) (0) ; b4: no utilizado (0) ; b30: 19..16 del l!mite (1111) DB 0 ; b31..24 del origen del segmento NemJo db "Csak real modban fut helyesen!",13,10,"$" Xinst db "Nincs XMS memoria kezelo!",13,10,"$" nomem db "A memoria lefoglalas nem sikerult",13,10,"$" XMSHandle dw 0 XMSBase dd 0 StartMem dd 0 ;lefoglalt memoria elso byte-ja EndMem dd 0 ;lefoglalt memoria utolso byte-ja+1 gdtref: DW 0Fh ; limite de la gdt: 2 descriptores l_ref: DW OFFSET DescTabl, 0 XMSDrv: db 9ah ;call far xxxx:xxxx XMSEntry: dd ? ret ;------------------------------------------------------------------------------- ;XMSInstalled ,XMS meghajto program instalalva van-e ; be: - ; ki: ax= False XMS Drv. nincs ; ax= True XMS Drv. van ; cx= XMS verzio kod (pl. 3.00 -> 0300h) ; bx= XMS driver verzio kod (pl. 3.10 -> 0310h) ; dx= 1, ha HMA elerheto, egyebkent dx=0 ; XMSEntry valtozo balaltodik ;------------------------------------------------------------------------------ XMSInstalled: mov ax,4300h int 2fh cmp al,80H mov ax,False jne short XMSIExit ;XMS belepesi pont beallitasa ;az 'XMSEntry' valtozoban a belepesi pont cime mov ax,4310h int 2fh mov word ptr cs:XMSEntry[0],bx mov word ptr cs:XMSEntry[2],es xor ax,ax call cs:[XMSdrv] mov cx,ax ;driver legalabb 2.0-as legyen mov ax,true XMSIExit: ret ; ;----------------------------------------------------------------------------- ;XMSAvail , elerheto XMS memoria lekerdezes ; be: - ; ki: ax - elerheto legnagyobb XMS memoria merete ; dx - teljes szabad XMS memoria merete ; bx - hibakod 80,81,A1-es lehet ;----------------------------------------------------------------------------- XMSAvail macro mov ax,0801h call cs:[XMSdrv] endm ; ;----------------------------------------------------------------------------- ;AllocateXMS ,XMS memoria lefoglalasa ; be: dx - lefoglalando memoria kbyte-ban ; ki: ax - vegrehajtas kodja 0= nincs hiba ; dx - XMS handle ; bl - lehetseges hibakodok 80,81,A0,A1 ;----------------------------------------------------------------------------- AllocateXMS macro memory mov dx,memory mov ah,9 call cs:[XMSdrv] endm ; ;------------------------------------------------------------------------------ ;FreeXMS ,XMS memoria felszabaditasa ; be: dx - felszabaditando XMS handle ; ki: ax - vegrehajtas hiba kodjai ; bl - lehetseges hiakodok 80,81,A2,A3 ;------------------------------------------------------------------------------ FreeXMS macro handle mov ah,0ah mov dx,handle call cs:[XMSdrv] endm ; ;------------------------------------------------------------------------------ ;XMSLock ,XMS memoriacim rogzites ; be: dx - handle ; ki: ax =1 ; dx:bx - a rogzitett cim ; ax = 0, akkor hibakod bl=80,81,A2,AC,AD ;------------------------------------------------------------------------------ XMSLock macro handle mov ah,0ch mov dx,handle call cs:[XMSdrv] endm ; ;------------------------------------------------------------------------------ ;XMSUnlock ,rogzitett XMS cim felszabaditasa ; be: dx - handle ; ki: ax - 1 ok, az=0 hiba bl=80,81,A2,AA ;------------------------------------------------------------------------------ XMSUnlock macro handle mov dx,handle mov ah,0dh call cs:[XMSdrv] endm ; ;------------------------------------------------------------------------------ ;LocalA20En - A20 vonal helyi engedelyezese a direkt XMS elereshez ; be: - ; ki: ax=1 Enabled ,egyebkent hiba ; bl=hibakod 80,81,81 ;------------------------------------------------------------------------------ LocalA20En macro mov ah,05h call cs:[XMSdrv] endm ;------------------------------------------------------------------------------ ;LocalA20Dis - A20 vonal helyi tiltasa ; be: - ; ki: ax=1 disabled ,egyebkent hiba ; bl=hibakod 80,81,82,94 ;------------------------------------------------------------------------------ LocalA20En macro mov ah,06h call cs:[XMSdrv] endm ;------------------------------------------------------------------------------ ;A20Info - A20 vonalrol info szerzes ; be: - ; ki: ax=1 fizikailag engedelyezett ,egyebkent hiba ; bl=hibakod 80,81 ;------------------------------------------------------------------------------ LocalA20En macro mov ah,07h call cs:[XMSdrv] endm ; ;------------------------------------------------------------------------------ ;Az FS 4 Gb szegmens beallitasa ; ;------------------------------------------------------------------------------ Set4GB: mov ax,seg adataim mov ds,ax ; Have to fix up the gdt reference mov eax,seg adataim shl eax,4 add [DWORD PTR l_ref],eax lgdt [FWORD PTR cs:gdtref] mov eax,cr0 or al,1 mov cr0,eax jmp far ptr @@n @@n: ; YA ESTAMOS EN PMODE!!!!!!!!!!! mov ax,8 mov fs,ax ; Selector del segmento plano de 4 gigas mov eax,cr0 and eax,0FEh mov cr0,eax ; ya estamos en rmode :_((((((((( ; PERO CON UN SEGMENTO DE 4 GIGAS!!!! jmp far ptr realm realm: ret ;--------------------------------------------------------------------------- ;--------------------------------------------------------------------------- XMSmain proc push dx mov ax,seg adataim mov ds,ax SMSW ax test ax,1 jz short Okjo Print_str Nemjo end_process 1 OkJO: call XMSInstalled and ax,ax jnz short XMSyes print_str xinst end_process 2 XMSyes: pop dx AllocateXMS dx ;1.9 Mb cmp ax,1 jz short Memok print_str nomem end_process 3 memok: mov ax,seg adataim mov ds,ax mov ds:XMSHandle,dx XMSLock XMShandle movzx edx,dx shl edx,16 mov dx,bx ;dx 32 bites fizikai cimet adja mov XMSBase,edx call set4GB retf endp XMSDone proc mov ax,seg adataim mov ds,ax mov bx,XMShandle XMSUnlock bx mov bx,XMShandle push bx FreeXMS bx pop ax xor ax,ax mov fs,ax retf endp DosVerOk proc mov ah,30h ;dos verzio ellenorzese min 5.00 kell int 21h xchg al,ah cmp ax,0500h jnc dosvok print_str dverr end_process 4 DosVok: retf endp