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

📄 int21h.asm

📁 开放源码的编译器open watcom 1.6.0版的源代码
💻 ASM
📖 第 1 页 / 共 3 页
字号:
	mov	ax,cs:_seg_buf
	mov	word ptr [ebp+24h],ax
	mov	word ptr [ebp+22h],ax
	mov	word ptr [ebp+04h],0200h
	mov	word ptr [ebp+00h],0000h
	call	int21h
	push	es
	pop	ds
	mov	esi,cs:_lobufbase
	pop	edi es
	test	byte ptr [ebp+20h],1
	jnz	@@err
@@2:	lods	byte ptr ds:[esi]
	stos	byte ptr es:[edi]
	test	al,al
	jnz	@@2
	add	esp,32h
	jmp	@__ok
@@err:	movzx	eax,word ptr [ebp+1Ch]
	add	esp,32h
	mov	[esp+1Ch],eax
	jmp	@__err



;=============================================================================
; Win95 Create or Open File
;  In:	BX = access mode
;	CX = attributes
;	DX = action
;	DI = alias hint
;	DS:ESI = ASCIIZ long filename
; Out:	AX = file handle
;	CX = action taken
;
@_716C:	sub	esp,32h
	mov	ebp,esp
	mov	[ebp+00h],di
	mov	[ebp+10h],bx
	mov	[ebp+14h],dx
	mov	[ebp+18h],cx
	mov	[ebp+1Ch],ax
	mov	ax,cs:_seg_buf
	mov	word ptr [ebp+24h],ax
	mov	word ptr [ebp+04h],0
	mov	es,cs:_sel_ds
	mov	edi,cs:_lobufbase
@@0:	lods	byte ptr ds:[esi]
	stos	byte ptr es:[edi]
	test	al,al
	jnz	@@0
	call	int21h
	movzx	eax,word ptr [ebp+1Ch]
	movzx	ecx,word ptr [ebp+18h]
	test	byte ptr [ebp+20h],1
	lea	esp,[esp+32h]
	mov	[esp+1Ch],eax
	jnz	@__err
	mov	[esp+18h],ecx
	jmp	@__ok





;=============================================================================
; DOS/4G Identification call
;  In:	AX = 0FF00h, DX = 0078h
;  Out:	EAX = 0FFFF3447h '..4G'
;
@__FFh:	cmp	al,88h			; AX=0FF88h - DOS/32A functional call
	jz	@_FF88
	cmp	al,89h			; AX=0FF89h - DOS/32A get config
	jz	@_FF89
	cmp	al,8Ah			; AX=0FF8Ah - DOS/32A get info
	jz	@_FF8A
	cmp	al,8Dh			; AX=0FF8Dh - DOS/32A decompress data
	jz	@_FF8D
	cmp	al,8Eh			; AX=0FF8Eh - DOS/32A get Client ptrs
	jz	@_FF8E
	cmp	al,8Fh			; AX=0FF8Fh - DOS/32A resize DOS buf
	jz	@_FF8F

	cmp	al,80h			; AX=0FF80h - DOS/32A prints (magic)
	jz	@_FF80
	cmp	al,90h			; AX=0FF90h - DOS/32A get hi mem
	jz	@_FF90
	cmp	al,91h			; AX=0FF91h - DOS/32A alloc hi mem
	jz	@_FF91
	cmp	al,92h			; AX=0FF92h - DOS/32A free hi mem
	jz	@_FF92
	cmp	al,93h			; AX=0FF93h - DOS/32A resize hi mem
	jz	@_FF93

	cmp	al,94h			; AX=0FF94h - DOS/32A get lo mem
	jz	@_FF94
	cmp	al,95h			; AX=0FF95h - DOS/32A alloc lo mem
	jz	@_FF95
	cmp	al,96h			; AX=0FF96h - DOS/32A free lo mem
	jz	@_FF96
	cmp	al,97h			; AX=0FF97h - DOS/32A resize lo mem
	jz	@_FF97

	cmp	al,98h			; AX=0FF98h - DOS/32A map phys mem
	jz	@_FF98
	cmp	al,99h			; AX=0FF99h - DOS/32A free phys mem
	jz	@_FF99
	cmp	al,9Ah			; AX=0FF9Ah - DOS/32A alloc selector
	jz	@_FF9A

	cmp	dx,0078h		; DX=0078h - DOS/4G functional call
	jnz	@__go21
	mov	gs,cs:_sel_ds
	mov	dword ptr [esp+1Ch],4734FFFFh
	jmp	@__ok


;=============================================================================
; DOS/32A Identification call
;  In:	AX = 0FF88h
;  Out:	EAX = 'ID32'
;	EBX = DOS Extender version
;
@_FF88:	sub	esp,32h			; DOS/32A internal function
	mov	ebp,esp
	mov	[ebp+1Ch],ax
	call	int21h
	mov	eax,'ID32'
	movzx	ebx,cs:_version
	mov	ecx,[ebp+18h]
	mov	edx,[ebp+14h]
	mov	esi,[ebp+04h]
	mov	edi,[ebp+00h]
	mov	ebp,[esp+3Ah]
	add	esp,52h
	jmp	@__exi

;=============================================================================
; DOS/32A Get Client Configuration
;  In:	AX = 0FF89h
;  Out:	EAX = 'ID32'
;	EBX = DOS Extender version
;	ECX = size of low buffer
;	EDX = configuration bits
;	ESI = pointer to ID32 config header
;	FS = zero selector
;
@_FF89:	mov	eax,'ID32'
	movzx	esi,cs:_seg_id32
	shl	esi,4
	mov	fs,cs:_sel_zero
	movzx	ebx,cs:_version
	mov	ecx,cs:_lobufsize
	movzx	edx,word ptr cs:_misc_byte
	add	esp,20h
	jmp	@__exi

;=============================================================================
; DOS/32A Get Kernel Configuration
;  In:	AX = 0FF8Ah
;  Out:	EAX = 'ID32'
;	EBX = DOS Extender version
;	CL = CPU type
;	CH = System software
;	DL = Kernel configuration bits
;	ESI = pointer to Kernel config header
;	FS = zero selector
;
@_FF8A:	mov	eax,'ID32'
	movzx	esi,cs:_seg_kernel
	shl	esi,4
	add	esi,offs pm32_data
	mov	fs,cs:_sel_zero
	movzx	ebx,cs:_version
	mov	cl,cs:_cpu_type
	mov	ch,cs:_sys_type
	mov	dl,fs:[esi+00h]
	add	esp,20h
	jmp	@__exi

;=============================================================================
; DOS/32A Decompress data
;  In:	AX = 0FF8Dh
;	DS:EBX = source address
;	DS:EDI = destination address
;	ECX = source size
;  Out:	EAX = destination size
;
@_FF8D:	push	gs ds
	pop	gs
	mov	ds,cs:_sel_ds
	call	decompress
	mov	eax,_codesize
	sub	eax,edi
	pop	gs
	mov	[esp+1Ch],eax
	jmp	@__ok

;=============================================================================
; DOS/32A Return pointers to Client variables
;  In:	AX = 0FF8Eh
;  Out:	GS = Client data selector
;	EDX = pointer to "start" == module file name
;	ESI = pointer to loaded application sel/base table
;	EDI = pointer to Client variables structure
;
@_FF8E:	mov	gs,cs:_sel_ds
	mov	edx,offset start
	mov	esi,offset _app_buf_allocsel
	mov	edi,offset _misc_byte
	add	esp,20h
	jmp	@__exi

;=============================================================================
; DOS/32A Resize DOS transfer buffer
;  In:	AX = 0FF8Fh
;	EBX = new size of DOS transfer buffer in bytes
;  Out:	EBX = old size of DOS transfer buffer in bytes
;
@_FF8F:	mov	ds,cs:_sel_ds
	xchg	_lobufsize,ebx
	mov	[esp+10h],ebx
	jmp	@__ok


;=============================================================================
; DOS/32A Print String (Magic)
;  In:	AX = 0FF80h
;	EBX = value
;	DS:EDX = pointer to string
;  Out:	-
;
@_FF80:	mov	es,cs:_sel_ds
	mov	edi,cs:_lobufbase
	mov	esi,edx
	mov	dx,di
@@1:	lods	byte ptr ds:[esi]
	stosb
	test	al,al
	jnz	@@1
	push	es
	pop	ds
	mov	_int_ss,ss
	mov	_int_esp,esp
	lss	esp,fword ptr _sel_esp
	push	ecx
	push	ebx
	call	prints
	lss	esp,fword ptr _int_esp
	jmp	@__ok


;=============================================================================
; DOS/32A Get Free Extended Memory Information
;  In:	AX = 0FF90h
;  Out:	EAX = largest free memory block
;
@_FF90:	push	ss
	pop	es
	sub	esp,30h
	mov	edi,esp
	mov	ax,0500h
	int	31h
	mov	eax,[esp]
	add	esp,30h
	mov	[esp+1Ch],eax
	jmp	@__ok

;=============================================================================
; DOS/32A Allocate Extended Memory
;  In:	AX = 0FF91h
;	EBX = size of block
;  Out:	EBX = linear address of block
;	ESI = handle of block
;
@_FF91:	call	@_FF9x1
	mov	ax,0501h
	int	31h
	jmp	@_FF9x2

;=============================================================================
; DOS/32A Free Extended Memory
;  In:	AX = 0FF92h
;	ESI = handle of block
;  Out:	-
;
@_FF92:	call	@_FF9x1
	mov	ax,0502h
	int	31h
	jc	@__err
	jmp	@__ok

;=============================================================================
; DOS/32A Resize Extended Memory
;  In:	AX = 0FF93h
;	EBX = new size of block
;	ESI = handle of block
;  Out:	EBX = new linear address of block
;	ESI = new handle of block
;
@_FF93:	call	@_FF9x1
	mov	ax,0503h
	int	31h
	jmp	@_FF9x2

;=============================================================================
; DOS/32A Get Free DOS Memory Information
;  In:	AX = 0FF94h
;  Out:	EAX = largest free memory block
;
@_FF94:	mov	ah,48h
	mov	bx,-1
	call	@__all
	shl	ebx,4
	mov	[esp+1Ch],ebx
	jmp	@__ok

;=============================================================================
; DOS/32A Allocate DOS Memory
;  In:	AX = 0FF94h
;	EBX = size of block
;  Out:	EBX = linear address of block
;	ESI = handle of block
;
@_FF95:	add	ebx,0Fh
	shr	ebx,4
	test	ebx,0FFFF0000h
	jnz	@__err
	test	bx,bx
	jz	@__err
	mov	ah,48h
	call	@__all
	jnz	@__err
	mov	[esp+04h],eax
	shl	eax,4
	mov	[esp+10h],eax
	jmp	@__ok

;=============================================================================
; DOS/32A Free DOS Memory
;  In:	AX = 0FF96h
;	ESI = handle of block
;  Out:	-
;
@_FF96:	sub	esp,32h
	mov	ebp,esp
	mov	byte ptr [ebp+1Dh],49h
	mov	word ptr [ebp+22h],si
	call	int21h
	test	byte ptr [ebp+20h],1
	lea	esp,[esp+32h]
	jnz	@__err
	jmp	@__ok

;=============================================================================
; DOS/32A Resize DOS Memory
;  In:	AX = 0FF97h
;	EBX = new size of block
;	ESI = handle of block
;  Out:	EBX = new linear address of block
;	ESI = new handle of block
;
@_FF97:	add	ebx,0Fh
	shr	ebx,4
	test	ebx,0FFFF0000h
	jnz	@__err
	test	bx,bx
	jz	@__err
	sub	esp,32h
	mov	ebp,esp
	mov	byte ptr [ebp+1Dh],4Ah
	mov	word ptr [ebp+10h],bx
	mov	word ptr [ebp+22h],si
	call	int21h
	test	byte ptr [ebp+20h],1
	lea	esp,[esp+32h]
	jnz	@__err
	jmp	@__ok

;=============================================================================
; DOS/32A Map Physical Memory
;  In:	AX = 0FF98h
;	EBX = base of physical memory
;	ESI = size of region
;  Out:	EBX = linear address of memory
;
@_FF98:	call	@_FF9x1
	mov	ax,0800h
	int	31h
	jc	@__err
	jmp	@_FF9x3

;=============================================================================
; DOS/32A Unmap Physical Memory
;  In:	AX = 0FF99h
;	EBX = linear address of memory
;  Out:	-
;
@_FF99:	call	@_FF9x1
	mov	ax,0801h
	int	31h
	jc	@__err
	jmp	@__ok

;=============================================================================
; DOS/32A Allocate Selector
;  In:	AX = 0FF94h
;	EBX = selector base
;	ECX = selector limit
;	DX = selector access rights
;  Out:	AX = selector
;
@_FF9A:	mov	edi,ebx
	call	set_descriptor
	jc	@__err
	mov	[esp+1Ch],ax
	jmp	@__ok




;-----------------------------------------------------------------------------
@_FF9x1:mov	cx,bx			; convert BX:CX to EBX
	shr	ebx,16
	mov	di,si			; convert SI:DI to EDI
	shr	esi,16
	ret
@_FF9x2:jc	@__err
	shl	esi,16
	mov	si,di
	mov	[esp+04h],esi
@_FF9x3:shl	ebx,16
	mov	bx,cx
	mov	[esp+10h],ebx
	jmp	@__ok




;*****************************************************************************
@__cpy:	push	ds		; copy NULL-terminated string to buffer
	pop	es
	xor	ax,ax
	mov	esi,edx
	mov	edi,edx
	or	ecx,-1
	repne	scas byte ptr es:[edi]
	not	ecx
	mov	es,cs:_sel_ds
	mov	edi,cs:_lobufbase
	rep	movs byte ptr es:[edi],[esi]
	mov	ax,cs:_seg_buf
	mov	word ptr [ebp+24h],ax
	mov	word ptr [ebp+14h],0
	jmp	int21h
@__std:	sub	esp,32h
	mov	ebp,esp
	mov	[ebp+04h],si			; these two pass-downs are
	mov	[ebp+10h],bx			; for Win95 longfilenames
	mov	[ebp+18h],cx
	mov	[ebp+1Ch],ax
	call	@__cpy
	movzx	eax,word ptr [ebp+1Ch]
	movzx	ecx,word ptr [ebp+18h]
	test	byte ptr [ebp+20h],1
	lea	esp,[esp+32h]			; restore stack
	ret
@__all:	sub	esp,32h
	mov	ebp,esp
	mov	[ebp+10h],bx
	mov	[ebp+14h],dx
	mov	[ebp+18h],cx
	mov	[ebp+1Ch],ax
	call	int21h
	movzx	eax,word ptr [ebp+1Ch]
	movzx	ecx,word ptr [ebp+18h]
	movzx	edx,word ptr [ebp+14h]
	movzx	ebx,word ptr [ebp+10h]
	movzx	edi,word ptr [ebp+22h]		; ES
	movzx	esi,word ptr [ebp+24h]		; DS
	test	byte ptr [ebp+20h],1
	lea	esp,[esp+32h]			; restore stack
	ret
@__tst:	movzx	eax,word ptr [ebp+1Ch]		; get error number
	test	byte ptr [ebp+20h],1		; check if CF is set
	lea	esp,[esp+32h]			; restore stack
	mov	[esp+1Ch],eax			; put EAX (error) on stack
	jnz	@__err
@__ok:	popad					; return ok
@__exi:	pop	es ds
	and	byte ptr [esp+8],0FEh
	iretd
@__err:	popad					; return with error
	pop	es ds
	or	byte ptr [esp+8],01h
	iretd


PopState

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -