windows-nt/Source/XPSP1/NT/sdktools/masm/nmsghdr.asm
2020-09-26 16:20:57 +08:00

116 lines
2.2 KiB
NASM

title nmsghdr - near message header and finder
;--------------------------------------------------------------------------
;
; Microsoft C Compiler Runtime for MS-DOS
;
; (C)Copyright Microsoft Corporation, 1986
;
;--------------------------------------------------------------------------
;
; Revision History
;
; 04/03/86 Greg Whitten
;
; 05/28/86 Randy Nevin
; some pointers removed from the nhdr segment to
; save space. they were there in anticipation of
; being used as a method of changing messages, but
; it turns out they are not needed
;
;--------------------------------------------------------------------------
?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 HDR, nhdr, byte, public, CONST, DGROUP
createSeg MSG, nmsg, byte, public, CONST, DGROUP
createSeg PAD, npad, byte, common, CONST, DGROUP
createSeg EPAD, nepad, byte, common, CONST, DGROUP
defGrp DGROUP ; define DGROUP
codeOFFSET equ offset _TEXT:
dataOFFSET equ offset DGROUP:
sBegin nhdr
assumes ds,DGROUP
db '<<NMSG>>'
stnmsg label byte
sEnd
sBegin npad
assumes ds,DGROUP
dw -1 ; message padding marker
sEnd
sBegin nepad
assumes ds,DGROUP
db -1
sEnd
sBegin code
assumes cs,code
assumes ds,DGROUP
;------------------------------------------------------------------------
;
; char * pascal __NMSG_TEXT ( messagenumber)
;
; This routine returns a near pointer to the message associated with
; messagenumber. If the message does not exist, then a 0 is returned.
;
; This routine reestablishes DS = ES = DGROUP
cProc __NMSG_TEXT,<PUBLIC>,<si,di> ; pascal calling
parmW msgt
cBegin
mov ax,DGROUP
mov ds,ax ; ds = DGROUP (force it always)
push ds
pop es
mov dx,msgt ; dx = message number
mov si,dataOFFSET stnmsg ; start of near 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
cEnd
sEnd
end