⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dpmi16.asm

📁 汇编源代码大全
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	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 + -