📄 dpmi16.asm
字号:
ret
FreeRMcallAddress endp
;
; int GetStateSaveAddress(WORD *size,POINTER16_16 *,POINTER16_16 *)
;
public C GetStateSaveAddress
GetStateSaveAddress PROC C USES SI DI, \
bytes :PTR , \
realaddr:PTR , \
protaddr:PTR , \
DPMI 0305h
CHECKERR
@@ok:
mov dx, bx
mov bx, bytes
mov word ptr [bx],ax
mov bx, realaddr
setdword [bx],dx,cx
mov bx, protaddr
ifdef HAVE386
.386
xor edi, edi
.286
endif
setdword [bx],si,di
xor ax, ax
@@end:
ret
GetStateSaveAddress endp
;
; int SaveState(WORD *buffer,POINTER16_16);
;
public C SaveState
SaveState PROC C USES DI, \
buffer :PTR , \
offaddr :BYTE
push ds
pop es
ifdef HAVE386
.386
movzx edi, buffer
.286
else
mov di, buffer
endif
mov ax, 0
call dword ptr offaddr
ret
SaveState endp
;
; int RestoreState(WORD *buffer,POINTER16_16);
;
public C RestoreState
RestoreState PROC C USES DI, \
buffer :PTR , \
offaddr :BYTE
push ds
pop es
ifdef HAVE386
.386
movzx edi, buffer
.286
else
mov di, buffer
endif
mov ax, 1
call dword ptr offaddr
ret
RestoreState endp
;
; void GetDPMIVersion(DPMIVERSION *v)
;
public C GetDPMIVersion
GetDPMIVersion PROC C USES SI, \
verptr :PTR
; packed struct req!
mov si,verptr
DPMI 0400h
mov byte ptr [si],ah
mov byte ptr [si+1],al
mov word ptr [si+2],bx
mov byte ptr [si+4],cl
mov byte ptr [si+5],dh
mov byte ptr [si+6],dl
ret
GetDPMIVersion endp
;
; int GetFreeMemInfo(NPFREEMEMINFO fm)
;
public C GetFreeMemInfo
GetFreeMemInfo PROC C USES DI, \
fm :PTR
push ds
pop es
ifdef HAVE386
.386
movzx edi, word ptr fm
.286
else
mov di,fm
endif
DPMI 0500h
CHECKERR
@@ok:
xor ax, ax
@@end:
ret
GetFreeMemInfo endp
;
; int AllocMem(DWORD bytes,DWORD *handle,DWORD *memaddress)
;
public C AllocMem
AllocMem PROC C USES SI DI, \
nbytes :DWORD , \
handle :PTR , \
memadr :PTR
getdword bx,cx,nbytes
DPMI 0501h
CHECKERR
@@ok:
mov ax,bx
mov bx,handle
setdword [bx],si,di
mov bx,memadr
setdword [bx],ax,cx
xor ax, ax
@@end:
ret
AllocMem endp
;
; int FreeMem(DWORD handle)
;
public C FreeMem
FreeMem PROC C USES SI DI, \
handle :DWORD
getdword si,di,handle
DPMI 0502h
CHECKERR
@@ok:
xor ax, ax
@@end:
ret
FreeMem endp
;
; int ResizeMem(DWORD bytes,DWORD oldhandle,DWORD *newhandle,DWORD *newaddress)
;
public C ResizeMem
ResizeMem PROC C USES SI DI , \
nbytes :DWORD , \
oldh :DWORD , \
newh :PTR , \
newadr : PTR
getdword bx,cx,nbytes
getdword si,di,oldh
DPMI 0503h
CHECKERR
@@ok:
mov ax,bx
mov bx,newadr
setdword [bx],ax,cx
mov bx,newh
setdword [bx],si,di
xor ax, ax
@@end:
ret
ResizeMem endp
;
; int LockLinRegion(DWORD size,DWORD address)
;
public C LockLinRegion
LockLinRegion PROC C USES SI DI, \
sizeb :DWORD , \
addr :DWORD
getdword bx,cx,addr
getdword si,di,sizeb
DPMI 0600h
CHECKERR
@@ok:
xor ax, ax
@@end:
ret
LockLinRegion endp
;
; int UnlockLinRegion(DWORD size,DWORD address)
;
public C UnlockLinRegion
UnlockLinRegion PROC C USES SI DI, \
sizeb :DWORD , \
address :DWORD
getdword si,di,sizeb
getdword bx,cx,address
DPMI 0601h
CHECKERR
@@ok:
xor ax, ax
@@end:
ret
UnlockLinRegion endp
;
; int MarkRealModePageable(DWORD size,DWORD address)
;
public C MarkRealModePageable
MarkRealModePageable PROC C USES SI DI , \
sizeb :DWORD , \
addr :DWORD
getdword bx,cx,addr
getdword si,di,sizeb
DPMI 0602h
CHECKERR
@@ok:
xor ax, ax
@@end:
ret
MarkRealModePageable endp
;
; int RelockRealModeRegion(DWORD size,DWORD address)
;
public C RelockRealModeRegion
RelockRealModeRegion PROC C USES SI DI, \
sizeb :DWORD , \
addr :DWORD
getdword bx,cx,addr
getdword si,di,sizeb
DPMI 0603h
CHECKERR
@@ok:
xor ax, ax
@@end:
ret
RelockRealModeRegion endp
;
; int GetPageSize(DWORD *size)
;
public C GetPageSize
GetPageSize PROC C \
sizeb :PTR
DPMI 0604h
CHECKERR
@@ok:
mov ax,bx
mov bx,sizeb
setdword [bx],ax,cx
xor ax, ax
@@end:
ret
GetPageSize endp
;
; int MarkPageDemand(DWORD address,DWORD n)
;
public C MarkPageDemand
MarkPageDemand PROC C USES SI DI , \
addr :DWORD , \
nbytes :DWORD
getdword bx,cx,addr
getdword si,di,nbytes
DPMI 0702h
CHECKERR
@@ok:
xor ax, ax
@@end:
ret
MarkPageDemand endp
;
; int DiscardPage(DWORD address,DWORD size)
;
public C DiscardPage
DiscardPage PROC C USES SI DI , \
addr :DWORD , \
sizeb :DWORD
getdword bx,cx,addr
getdword si,di,sizeb
DPMI 0703h
CHECKERR
@@ok:
xor ax, ax
@@end:
ret
DiscardPage endp
;
; int PhysicalMap(DWORD physical,DWORD size,DWORD *linear)
;
public C PhysicalMap
PhysicalMap PROC C USES SI DI , \
physic :DWORD , \
sizeb :DWORD , \
linear :PTR
getdword bx,cx,physic
getdword si,di,sizeb
DPMI 0800h
CHECKERR
@@ok:
mov di,linear
setdword [di],bx,cx
xor ax, ax
@@end:
ret
PhysicalMap endp
;
; BYTE DisableVirtuelInterruptState()
;
public C DisableVirtuelInterruptState
DisableVirtuelInterruptState PROC C
DPMI 0900h
xor ah,ah
ret
DisableVirtuelInterruptState endp
;
; BYTE EnableVirtuelInterruptState()
;
public C EnableVirtuelInterruptState
EnableVirtuelInterruptState PROC C
DPMI 0901h
xor ah,ah
ret
EnableVirtuelInterruptState endp
;
; BYTE GetVirtuelInterruptState()
;
public C GetVirtuelInterruptState
GetVirtuelInterruptState PROC C
DPMI 0902h
xor ah,ah
ret
GetVirtuelInterruptState endp
;
; int GetVendorEntry(BYTE *p,WORD *sel,WORD *off)
;
public C GetVendorEntry
GetVendorEntry PROC C USES ES SI DI , \
string :PTR , \
sel :PTR , \
offs :PTR
ifdef HAVE386
.386
movzx edi,string
.286
else
mov di,string
endif
DPMI 0A00h
CHECKERR
@@ok:
mov bx,sel
mov word ptr [bx],es
mov bx,offs
mov word ptr [bx],si
xor ax, ax
@@end:
ret
GetVendorEntry endp
;
; int SetDebugWatchpoint(DWORD address,WORD type,WORD *handle)
;
public C SetDebugWatchpoint
SetDebugWatchpoint PROC C , \
addr :DWORD , \
types :WORD , \
handle :PTR
getdword bx,cx,addr
mov dx,types
DPMI 0B00h
CHECKERR
@@ok:
mov dx,bx
mov bx,handle
mov word ptr [bx],dx
xor ax, ax
@@end:
ret
SetDebugWatchpoint endp
;
; int ClearDebugWatchpoint(WORD handle)
;
public C ClearDebugWatchpoint
ClearDebugWatchpoint PROC C \
handle :WORD
mov bx,handle
DPMI 0B01h
CHECKERR
@@ok:
xor ax, ax
@@end:
ret
ClearDebugWatchpoint endp
;
; int GetStateDebugWatchpoint(WORD handle,WORD *execute)
;
public C GetStateDebugWatchpoint
GetStateDebugWatchpoint PROC C \
handle :WORD , \
execute :PTR
mov bx,handle
DPMI 0B02h
CHECKERR
@@ok:
mov bx,execute
mov [bx],ax
xor ax, ax
@@end:
ret
GetStateDebugWatchpoint endp
;
; int ResetDebugWatchpoint(WORD handle)
;
public C ResetDebugWatchpoint
ResetDebugWatchpoint PROC C \
handle :WORD
mov bx,handle
DPMI 0B03h
CHECKERR
@@ok:
xor ax, ax
@@end:
ret
ResetDebugWatchpoint endp
;
; Protected mode instructions
;
.286p
;
; WORD lsl16(WORD sel) 16-bit version of lsl for 80286
;
public C lsl16
lsl16 PROC C \
sel :WORD
xor ax, ax
lsl ax,sel
ret
lsl16 endp
ifdef HAVE386
;
; DWORD lsl32(WORD sel) /* load selector limit for 80386 */
;
public C lsl32
lsl32 PROC C \
sel :WORD
.386p
movzx ebx,sel
lsl eax,ebx
mov edx,eax
shr edx,16
and eax,dword ptr 0ffffh
.286p
ret
lsl32 endp
endif
;
; WORD lar16(WORD sel) 16-bit version of lar for 80286
;
public C lar16
lar16 PROC C \
sel :WORD
xor ax, ax
lar ax,sel
shr ax,8
ret
lar16 endp
ifdef HAVE386
;
; WORD lar16(WORD sel) 16-bit version of lar for 80286
;
public C lar32
lar32 PROC C \
sel :WORD
.386p
movzx ebx,sel
lar eax,ebx
mov edx,eax
shr edx,16
and eax,dword ptr 0ffffh
.286p
ret
lar32 endp
endif
;
; WORD verr(WORD sel) verify read
;
public C verr16
verr16 PROC C \
sel :WORD
mov ax,1
verr sel
je short @@nok
dec ax
@@nok:
ret
verr16 endp
;
; WORD verw(WORD sel) verify write
;
public C verw16
verw16 PROC C \
sel :WORD
mov ax,1
verw sel
je short @@nok
dec ax
@@nok:
ret
verw16 endp
;
; void sgdt(LPGDTR g) save gdt table
;
public C sgdt16
sgdt16 PROC C \
g :DWORD
les bx,g
sgdt es:[bx]
ret
sgdt16 endp
;
; void sidt(LPGDTR g) save idt table
;
public C sidt16
sidt16 PROC C \
g :DWORD
les bx,g
sidt es:[bx]
ret
sidt16 endp
;
; WORD sldt(void) save ldt-selector
;
public C sldt16
sldt16 PROC C
sldt ax
ret
sldt16 endp
;
; WORD str16(void) save task-register
;
public C str16
str16 PROC C
str ax
ret
str16 endp
;
; void far * IncFP(void far *a) increment far piointer
;
public C IncFP
IncFP PROC C \
aptr :DWORD
call near ptr SelInc
mov cx, ax
getdword dx,ax,aptr
add dx,cx
ret
IncFP endp
;
; void far * DecFP(void far *a) decrement far pointer
;
public C DecFP
DecFP PROC C \
aptr :DWORD
call near ptr SelInc
mov cx, ax
getdword dx,ax,aptr
sub dx,cx
ret
DecFP endp
;
; int IsPM() execute in prot-mode ? ax==0, PMode under DPMI
;
public C IsPM
IsPM PROC C
mov ax,1686h
int 02FH
ret
IsPM endp
;
; int IsWindowsEnhanced(void)
;
public C IsWindowsEnhanced
IsWindowsEnhanced PROC C
mov ax,01600H
int 02fH
cmp al,3
jb short @@not
cmp al,10
ja short @@not
mov ax, 1
jmp short @@end
@@not:
xor ax, ax
@@end:
ret
IsWindowsEnhanced endp
;
; void yield() /* give control to operating system (like GetMassage) */
;
public C yield
yield PROC C
mov ax,1680H
int 2Fh
ret
yield endp
public dos_exit
dos_exit PROC C \
errorlevel:WORD
mov ax, errorlevel
mov ah, 04Ch
int 021h
ret
dos_exit endp
public DpmiEnableFpu
DpmiEnableFpu PROC C \
bits :WORD
mov bx, bits
DPMI 0E01h
CHECKERR
@@ok:
xor ax, ax
@@end:
ret
DpmiEnableFpu endp
public C DpmiDisableFpu
DpmiDisableFpu PROC C
mov bx, 0
DPMI 0E01h
CHECKERR
@@ok:
xor ax, ax
@@end:
ret
DpmiDisableFpu endp
public C GetCS
GetCS PROC C
mov ax,cs
ret
GetCS endp
public C GetDS
GetDS PROC C
mov ax,ds
ret
GetDS endp
public C GetES
GetES PROC C
mov ax,es
ret
GetES endp
public C GetDpmiEntryPoint
GetDpmiEntryPoint PROC C USES SI DI , \
entry :PTR, \
dpmipara:PTR, \
flags :PTR, \
dpmiver :PTR, \
cpu :PTR
mov ax, 1687h
int 2Fh
or ax,ax
jnz noDPMI
mov ax, bx ; save bx = bits
mov bx, entry
mov [bx], di
mov [bx+2], es
mov bx, flags
mov [bx], ax
mov bx, dpmiver
mov [bx], dx
mov bx, cpu
mov [bx], cl
mov bx, dpmipara
mov [bx], si
xor ax, ax
noDPMI:
ret
GetDpmiEntryPoint endp
public C GetDpmiHostParagraph
GetDpmiHostParagraph PROC C \
dpmipara:WORD
mov bx, dpmipara
mov ah, 48h
int 21h
jnc @@end
or ax,ax
@@end:
ret
GetDpmiHostParagraph endp
public C DpmiEnterProtectedMode
DpmiEnterProtectedMode PROC C \
entry :DWORD, \
flags :WORD, \
parasegm:WORD
mov ax, parasegm
mov es, ax
mov ax, flags
call dword ptr entry
jnc @@ok
mov ax, -1
jmp short @@end
@@ok:
xor ax, ax
@@end:
ret
DpmiEnterProtectedMode endp
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -