summaryrefslogblamecommitdiffstats
path: root/private/sdktools/masm/fmsghdr.asm
blob: d551ec0108250bbc974fe3a0af420dd4896d4ea0 (plain) (tree)


















































































































                                                                              
	title	fmsghdr       - far message header and finder

;--------------------------------------------------------------------------
;
;	Microsoft C Compiler Runtime for MS-DOS
;
;	(C)Copyright Microsoft Corporation, 1986
;
;--------------------------------------------------------------------------
;
;	Revision History
;
;	04/17/86	Randy Nevin (adapted from Greg Whitten's version
;			of nmsghdr.asm)
;
;--------------------------------------------------------------------------


?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,	byte,	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,DGROUP

	db	'<<FMSG>>'
stfmsg	label	byte

sEnd

SBegin	fpad
assumes ds,DGROUP

	dw	-1			; message padding marker

sEnd

sBegin	fepad
assumes ds,DGROUP

	db	-1

sEnd


sBegin	code
assumes cs,code
assumes ds,DGROUP

;------------------------------------------------------------------------
;
;	char far * pascal __FMSG_TEXT ( messagenumber)
;
;	This routine returns a far pointer to the message associated with
;	messagenumber.	If the message does not exist, then a 0:0 is returned.

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