Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

171 lines
3.8 KiB

;/*
; * Microsoft Confidential
; * Copyright (C) Microsoft Corporation 1988 - 1991
; * All Rights Reserved.
; */
page 60,132
name _parse
title C to PARSER interface
;-------------------------------------------------------------------
;
; MODULE: _parse
;
; PURPOSE: Supplies an interface between C programs and
; the DOS 3.3 parser
;
; CALLING FORMAT:
; parse(&inregs,&outregs);
;
; DATE: 5-21-87
;
;-------------------------------------------------------------------
; extrn sysparse:far
public _parse
;-------------------------------------------------------------------
;FarSW equ 0 ; make sysparse be a NEAR proc
;TimeSW equ 0 ; Check time format
;FileSW equ 0 ; Check file specification
;CAPSW equ 0 ; Perform CAPS if specified
;CmpxSW equ 0 ; Check complex list
;NumSW equ 1 ; Check numeric value
;KeySW equ 0 ; Support keywords
;SwSW equ 1 ; Support switches
;Val1SW equ 1 ; Support value definition 1
;Val2SW equ 1 ; Support value definition 2
;Val3SW equ 0 ; Support value definition 3
;DrvSW equ 0 ; Support drive only format
;QusSW equ 0 ; Support quoted string format
;-------------------------------------------------------------------
_TEXT SEGMENT BYTE PUBLIC 'CODE'
_TEXT ENDS
_DATA SEGMENT WORD PUBLIC 'DATA'
_DATA ENDS
CONST SEGMENT WORD PUBLIC 'CONST'
CONST ENDS
_BSS SEGMENT WORD PUBLIC 'BSS'
_BSS ENDS
DGROUP GROUP CONST, _BSS, _DATA
_DATA segment word public 'DATA'
assume cs:DGROUP
assume ss:dgroup
public SysParse
;-------------------------------------------------------------------
.xlist
include version.inc
include parse.asm ; include the parser
.list
;-------------------------------------------------------------------
public CallParser
CallParser proc far
push ds
PUSH ES
push cs
pop ds
assume ds:DGROUP
push cs
pop es
assume es:DGROUP
nop
call SysParse
POP ES
pop ds
ret
CallParser endp
_DATA ends
_TEXT segment byte public 'CODE'
ASSUME CS:_TEXT
ASSUME DS:DGROUP
ASSUME ES:NOTHING
ASSUME SS:DGROUP
_parse proc near
push bp ; save user's base pointer
mov bp,sp ; set bp to current sp
push di ; save some registers
push si
; copy C inregs into proper registers
mov di,[bp+4] ; fix di (arg 0)
;-------------------------------------------------------------------
mov ax,[di+0ah] ; load di
push ax ; the di value from inregs is now on stack
mov ax,[di+00] ; get inregs.x.ax
mov bx,[di+02] ; get inregs.x.bx
mov cx,[di+04] ; get inregs.x.cx
mov dx,[di+06] ; get inregs.x.dx
mov si,[di+08] ; get inregs.x.si
pop di ; get inregs.x.di from stack
push bp ; save base pointer
;-------------------------------------------------------------------
;-------------------------------------------------------------------
call CallParser ; call the parser
;-------------------------------------------------------------------
;-------------------------------------------------------------------
pop bp ; restore base pointer
push di ; the di value from call is now on stack
mov di,[bp+6] ; fix di (arg 1)
mov [di+00],ax ; load outregs.x.ax
mov [di+02],bx ; load outregs.x.bx
mov [di+04],cx ; load outregs.x.cx
mov [di+06],dx ; load outregs.x.dx
mov [di+08],si ; load outregs.x.si
xor ax,ax ; clear ax
lahf ; get flags into ax
mov [di+0ch],ax ; load outregs.x.cflag
pop ax ; get di from stack
mov [di+0ah],ax ; load outregs.x.di
;-------------------------------------------------------------------
pop si ; restore registers
pop di
mov sp,bp ; restore sp
pop bp ; restore user's bp
ret
_parse endp
_TEXT ends ; end code segment
end