home *** CD-ROM | disk | FTP | other *** search
/ Media Share 9 / MEDIASHARE_09.ISO / misc / realmem.zip / XMSPATCH.ASM < prev   
Assembly Source File  |  1994-01-30  |  2KB  |  125 lines

  1. ;//Patch for XMS-driver to prevent A20 shutdown
  2. ;//Note: You can't compile this source directly 
  3. ;//      to executable
  4.  
  5. .386c
  6.  
  7. CS_SEG segment byte use16
  8.     assume cs:CS_SEG
  9.  
  10. XMSDRVADDRESS   dd      ?
  11. REALXMSSTUFF    db      5 dup (?)
  12. FAKEXMSSTUFF    db      0EAh
  13.         dw      offset FAKEHIMEM, ?
  14. RMEM_GDT        db      000h,000h,000h,000h,000h,000h,000h,000h
  15.         db      0FFh,0FFh,000h,000h,000h,092h,0CFh,0FFh
  16. RMEM_48         db      6 dup (?)
  17.  
  18. getvect MACRO vect,var
  19.     mov ah,035h
  20.     mov al,vect
  21.     int 021h
  22.     mov word ptr var[2],es
  23.     mov word ptr var[0],bx
  24. endm
  25. ;// AL=VECT, DS:DX-->INT
  26. setvect MACRO vect,var1,var2,var3
  27.     mov ah,025h
  28.     mov al,vect
  29.     push ds
  30.     mov dx,var1
  31.     mov ds,dx
  32.     mov dx,var2 var3
  33.     int 021h
  34.     pop ds
  35. endm
  36.  
  37. setFAKE MACRO
  38.     cli
  39.     mov es,word ptr XMSDRVADDRESS[2]
  40.     mov di,word ptr XMSDRVADDRESS[0]
  41.     mov si,offset FAKEXMSSTUFF
  42.     mov ecx,5
  43.     rep movs byte ptr [di],cs:[si]
  44.     sti
  45. endm
  46.  
  47. setREAL MACRO
  48.     cli
  49.     mov es,word ptr XMSDRVADDRESS[2]
  50.     mov di,word ptr XMSDRVADDRESS[0]
  51.     mov si,offset REALXMSSTUFF
  52.     mov ecx,5
  53.     rep movs byte ptr [di],cs:[si]
  54.     sti
  55. endm
  56.  
  57. XMScall MACRO func,data
  58.     mov dx,data
  59.     mov ah,func
  60.     call dword ptr XMSDRVADDRESS
  61. endm
  62.  
  63. XMSinit proc near
  64.     mov ax,04300h
  65.     int 02Fh
  66.     cmp al,080h
  67.     jne XM@ERROR
  68.     mov ax,04310h
  69.     int 02Fh
  70.     mov word ptr XMSDRVADDRESS[0],bx
  71.     mov word ptr XMSDRVADDRESS[2],es
  72.     XMScall 0,0
  73.     cmp ah,2
  74.     jb XM@ERROR
  75.     clc
  76.     ret
  77.     XM@ERROR:
  78.     stc
  79.     ret
  80. XMSinit endp
  81.  
  82. FAKEHIMEM proc far
  83.     cmp ah,04h
  84.     je A20PROTECT
  85.     cmp ah,06h
  86.     je A20PROTECT
  87.     push si di cx es
  88.     setREAL
  89.     pop es cx di si
  90.     call dword ptr XMSDRVADDRESS
  91.     push si di cx es
  92.     setFAKE
  93.     pop es cx di si
  94.     retf
  95.     A20PROTECT:
  96.         xor ax,ax
  97.         mov bl,094h
  98.         retf
  99. FAKEHIMEM endp
  100.  
  101. REALMEMORYINIT proc near
  102.     call XMSinit
  103.     XMScall 05h,00h
  104.         push ds
  105.         mov word ptr FAKEXMSSTUFF[3],cs
  106.         mov ds,word ptr XMSDRVADDRESS[2]
  107.         mov si,word ptr XMSDRVADDRESS[0]
  108.         push cs
  109.         pop es
  110.         mov di,offset REALXMSSTUFF
  111.         mov cx,5
  112.         rep movsb
  113.         pop ds
  114.     setFAKE
  115.     ret
  116. REALMEMORYINIT endp
  117.  
  118. REALMEMORYDEINIT proc near
  119.     setREAL
  120.     ret
  121. REALMEMORYDEINIT endp
  122.  
  123. CS_SEG ends
  124. end
  125.