page	60,132
name	_parse
title	C	to PARSER interface
;-------------------------------------------------------------------
;
;	MODULE: 	_parse
;
;	PURPOSE:	Supplies an interface between C programs and
;			the DOS 3.30 parser
;
;	CALLING FORMAT:
;			parse(&inregs,&outregs);
;
;	DATE:		5-21-87
;
;-------------------------------------------------------------------

;	extrn	sysparse:far

	public	_parse

	include version.inc

;-------------------------------------------------------------------
FarSW	equ	0			; make sysparse be a NEAR proc
TimeSW	equ	1			; Check time format
FileSW	equ	1			; Check file specification
CAPSW	equ	1			; Perform CAPS if specified
CmpxSW	equ	0			; Check complex list
NumSW	equ	0			; Check numeric value
KeySW	equ	0			; Support keywords
SwSW	equ	1			; Support switches
Val1SW	equ	0			; Support value definition 1
Val2SW	equ	0			; Support value definition 2
if ibmcopyright
Val3SW	equ	0			; Support value definition 3
else
Val3SW	equ	1			; Support value definition 3
endif
DrvSW	equ	1			; Support drive only format
QusSW	equ	0			; Support quoted string format
IncSW	equ	0			; Dont include PSDATA, I just did it
BaseSW	equ	1			; DS points to data
;-------------------------------------------------------------------

DGROUP	GROUP	_DATA
PGROUP	GROUP	_TEXT

_DATA	segment byte public 'DATA'
include psdata.inc
_DATA	ends

_TEXT	segment byte public 'CODE'

	ASSUME	CS: PGROUP
	ASSUME	DS: DGROUP

;-------------------------------------------------------------------
.xlist
include parse.asm			; include the parser
.list
;-------------------------------------------------------------------

_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	sysparse		; 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

	lahf				; get flags into ax
	mov	al,ah			; move into low byte
	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

