|
|
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
|