	page	,132
	title	fmsghdr       - far message handler and finder
;***
;fmsghdr.asm - far message handler and finder
;
;	Copyright (c) 1986-1988, Microsoft Corporation.  All rights reserved.
;
;Purpose:
;	Far message handler and finder.
;
;*******************************************************************************


?DF=	1			; this is special for c startup
include	version.inc
?PLM=	1			; pascal calling conventions
.xlist
include	cmacros.inc
include	msdos.inc
.list

createSeg _TEXT, code,	word,	public, CODE,	<>

createSeg _DATA, data,	word,	public, DATA,	DGROUP

createSeg FAR_HDR,fhdr, byte,	public, FAR_MSG,FMGROUP
createSeg FAR_MSG,fmsg, byte,	public, FAR_MSG,FMGROUP
createSeg FAR_PAD,fpad, byte,	common, FAR_MSG,FMGROUP
createSeg FAR_EPAD,fepad, byte,	common, FAR_MSG,FMGROUP

defGrp	DGROUP			; define DGROUP
defGrp	FMGROUP			; define FMGROUP

codeOFFSET equ	offset _TEXT:
fmsgOFFSET equ	offset FMGROUP:


sBegin	fhdr
assumes	ds,data

	db	'<<FMSG>>'
stfmsg	label	byte

sEnd

SBegin	fpad
assumes	ds,data

	dw	-1		; message padding marker

sEnd

sBegin	fepad
assumes	ds,data

	db	-1

sEnd


sBegin	code
assumes	cs,code
assumes	ds,data

page
;***
;__FMSG_TEXT(messagenumber) - find message for given message number
;
;Purpose:
;	This routine returns a far pointer to the message associated with
;	messagenumber.	If the message does not exist, then a 0:0 is returned.
;
;Entry:
;	==PASCAL CALLING CONVENTIONS==
;	messagenumber	= WORD number of desired message
;
;Exit:
;	DX:AX	= pointer to message text or 0:0 if message doesn't exist
;
;Uses:
;
;Exceptions:
;
;*******************************************************************************

cProc	__FMSG_TEXT,<PUBLIC>,<ds,si,di>  ; pascal calling

parmW	msgt

cBegin
	mov	ax,FMGROUP
	mov	ds,ax		; ds = FMGROUP (force it always)
	push	ds
	pop	es
	mov	dx,msgt		; dx = message number
	mov	si,fmsgOFFSET stfmsg ; start of far messages

tloop:
	lodsw			; ax = current message number
	cmp	ax,dx
	je	found		;   found it - return address
	inc	ax
	xchg	ax,si
	jz	found		;   at end and not found - return 0
	xchg	di,ax
	xor	ax,ax
	mov	cx,-1
	repne	scasb		; skip until 00
	mov	si,di
	jmp	tloop		; try next entry

found:
	xchg	ax,si
	cwd			; zero out dx in case NULL
	or	ax,ax
	jz	notfound
	mov	dx,ds		; remember segment selector
notfound:
cEnd

sEnd

	end
