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

📄 int2f.asm

📁 GNU FreeDOS兼容MS DOS很好的东东.
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;          returns non-zero.;          If the return value is non-zero, it is the negated error;          return code for the DOS 0x5c call. */;STATIC int share_lock_unlock(unsigned short pspseg,     /* psp segment address of owner process */;                             int fileno,        /* file_table entry number */;                             unsigned long ofs, /* offset into file */;                             unsigned long len, /* length (in bytes) of region to lock or unlock */;                             int unlock)       /* one to unlock; zero to lock */		global	SHARE_LOCK_UNLOCKSHARE_LOCK_UNLOCK:		mov	ax,0x10a4		jmp	short share_common; Int 2F Multipurpose Remote System Calls;; added by James Tabor jimtabor@infohwy.com; changed by Bart Oldeman;; assume ss == ds after setup of stack in entry; sumtimes return data *ptr is the push stack word;remote_lseek:   ; arg is a pointer to the long seek value                mov     bx, cx                mov     dx, [bx]                mov     cx, [bx+2]                ; "fall through"remote_getfattr:                        clc                    ; set to succeed                int     2fh                jc      ret_neg_ax                jmp     short ret_int2fremote_lock_unlock:		mov	dx, cx   	; parameter block (dx) in arg		mov	bx, cx		mov	bl, [bx + 8]	; unlock or not		mov	cx, 1		int	0x2f		jnc	ret_set_ax_to_carry		mov	ah, 0                jmp     short ret_neg_ax;long ASMPASCAL network_redirector_mx(unsigned cmd, void far *s, void *arg)                global NETWORK_REDIRECTOR_MXNETWORK_REDIRECTOR_MX:                pop     bx             ; ret address                pop     cx             ; stack value (arg); cx in remote_rw                pop     dx             ; off s                pop     es             ; seg s                pop     ax             ; cmd (ax)                push    bx             ; ret addresscall_int2f:                push    bp                push    si                push    di                cmp     al, 0fh                je      remote_getfattr                mov     di, dx         ; es:di -> s and dx is used for 1125!                cmp     al, 08h                je      remote_rw                cmp     al, 09h                je      remote_rw                cmp     al, 0ah                je      remote_lock_unlock                cmp     al, 21h                je      remote_lseek                cmp     al, 22h                je      remote_process_end                cmp     al, 23h                je      qremote_fn                push    cx             ; arg                cmp     al, 0ch                je      remote_getfree                cmp     al, 1eh                je      remote_print_doredir                cmp     al, 1fh                je      remote_print_doredirint2f_call:                xor     cx, cx         ; set to succeed; clear carry and CX                int     2fh                pop     bx                jnc     ret_set_ax_to_cxret_neg_ax:                neg     axret_int2f:                pop     di                pop     si                pop     bp                retret_set_ax_to_cx:                      ; ext_open or rw -> status from CX in AX                                       ; otherwise CX was set to zero above                xchg    ax, cx         ; set ax:=cx (one byte shorter than mov)                jmp     short ret_int2fremote_print_doredir:                  ; di points to an lregs structure                mov     es,[di+0xe]                mov     bx,[di+2]                mov     cx,[di+4]                mov     dx,[di+6]                mov     si,[di+8]                lds     di,[di+0xa]                clc                     ; set to succeed                int     2fh                pop     bx              ; restore stack and ds=ss                push    ss                pop     ds                jc      ret_neg_axret_set_ax_to_carry:                    ; carry => -1 else 0 (SUCCESS)                sbb     ax, ax                jmp     short ret_int2fremote_getfree:                clc                     ; set to succeed                int     2fh                pop     di              ; retrieve pushed pointer arg                jc      ret_set_ax_to_carry                mov     [di],ax                mov     [di+2],bx                mov     [di+4],cx                mov     [di+6],dx                jmp     short ret_set_ax_to_carryremote_rw:                clc                    ; set to succeed                int     2fh                jc      ret_min_dx_ax                xor     dx, dx         ; dx:ax := dx:cx = bytes read                jmp     short ret_set_ax_to_cxret_min_dx_ax:  neg     ax                cwd                jmp     short ret_int2f                qremote_fn:                mov     bx, cx                lds     si, [bx]                jmp     short int2f_restore_dsremote_process_end:                   ; Terminate process                mov     ds, [_cu_psp]int2f_restore_ds:                clc                int     2fh                push    ss                pop     ds                jmp     short ret_set_ax_to_carry; extern UWORD ASMCFUNC call_nls(UWORD subfct, struct nlsInfoBlock *nlsinfo,; UWORD bp, UWORD cp, UWORD cntry, UWORD bufsize, UWORD FAR *buf, UWORD *id);		global _call_nls_call_nls:		push	bp		mov	bp, sp		push	si		push	di		mov	al, [bp + 4]	; subfct		mov	ah, 0x14		mov	si, [bp + 6]	; nlsinfo		mov	bx, [bp + 10]	; cp		mov	dx, [bp + 12]	; cntry		mov	cx, [bp + 14]	; bufsize		les	di, [bp + 16]	; buf		push	bp		mov	bp, [bp + 8]	; bp		int	0x2f		pop	bp		mov	bp, [bp + 20]	; store id (in SS:) unless it's NULL		or	bp, bp		jz	nostore		mov	[bp], bxnostore:		pop	di		pop	si		pop	bp		ret;; Test to see if a umb driver has been loaded.; if so, retrieve largest available block+size;; From RB list and Dosemu xms.c.;; Call the XMS driver "Request upper memory block" function with:;     AH = 10h;     DX = size of block in paragraphs; Return: AX = status;         0001h success;         BX = segment address of UMB;         DX = actual size of block;         0000h failure;         BL = error code (80h,B0h,B1h) (see #02775);         DX = largest available block;; (Table 02775); Values for XMS error code returned in BL:;  00h    successful;  80h    function not implemented;  B0h    only a smaller UMB is available;  B1h    no UMB's are available;  B2h    UMB segment number is invalid;segment INIT_TEXT                ; int ASMPASCAL UMB_get_largest(void FAR * driverAddress,                ;                UCOUNT * seg, UCOUNT * size);                global UMB_GET_LARGEST                UMB_GET_LARGEST:                push    bp                mov     bp,sp                mov     dx,0xffff       ; go for broke!                mov     ax,1000h        ; get the umb's                call    far [bp+8]      ; Call the driver;;       bl = 0xB0 and  ax = 0 so do it again.;                cmp     bl,0xb0         ; fail safe                jne     umbt_error                and     dx,dx           ; if it returns a size of zero.                je      umbt_error                mov     ax,1000h        ; dx set with largest size                call    far [bp+8]      ; Call the driver                cmp     ax,1                jne     umbt_error                                        ; now return the segment                                        ; and the size                mov 	cx,bx           ; *seg = segment                mov 	bx, [bp+6]                mov 	[bx],cx                mov 	bx, [bp+4]      ; *size = size                mov 	[bx],dxumbt_ret:                pop     bp                ret     8           	; this was called NEAR!!umbt_error:     xor 	ax,ax                jmp 	short umbt_ret

⌨️ 快捷键说明

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