Category : C++ Source Code
Archive   : VCCRT2.ZIP
Filename : NMSGHDR.ASM

 
Output of file : NMSGHDR.ASM contained in archive : VCCRT2.ZIP
page ,132
title nmsghdr - near message handler and finder
;***
;nmsghdr.asm - near message handler and finder
;
; Copyright (c) 1986-1992, Microsoft Corporation. All rights reserved.
;
;Purpose:
; Near 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
include defsegs.inc
.list

ifndef _WINDOWS
_DEBUGSCREEN equ 1 ; debug screen swapping
endif

;
; segment definitions
;

CrtDefSegs
CrtDefSegs
CrtDefSegs

codeOFFSET equ
dataOFFSET equ

;
; data segments
;

sBegin nhdr
assumes ds,data

db '<>'

stnmsg label byte

sEnd

sBegin npad
assumes ds,data

dw -1 ; message padding marker

sEnd

sBegin nepad
assumes ds,data

db -1

sEnd

ifdef _QWIN
sBegin data
assumes ds,data

extrn __nfile:word ; Maximum number of file handles
extrn __qwinused:word ; QWIN used/notused flag
sEnd
endif ; _QWIN

ifdef _DEBUGSCREEN
sBegin dbdata ;
assumes ds,data ; Used to do the running under
externW ___aDBswpflg ; a debugger screen swapping
externW ___aDBswpchk ;
sEnd dbdata ;
extrn __aDBdoswp:ABS ;
endif ; _DEBUGSCREEN


;
; external functions
;

ifdef _QWIN
externNP __wwrite ; Write to QWIN window handle
endif

ifdef _WINDEBUG
externFP OUTPUTDEBUGSTRING ; debug output call
endif


sBegin code
assumes cs,code
assumes ds,data

page
;***
;__NMSG_TEXT(messagenumber) - find message for given message number
;
;Purpose:
; 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 assumes DS = DGROUP
;
;Entry:
; ==PASCAL CALLING CONVENTIONS==
; messagenumber = WORD message number of desired message
;
;Exit:
; AX = pointer to message text or 0 if no message exists.
;
;Uses:
;
;Exceptions:
;
;*******************************************************************************

cProc __NMSG_TEXT,, ; pascal calling

parmW msgt

cBegin
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


page
;***
;__NMSGWRITE(messagenumber) - writes message on stderr
;
;Purpose:
; This routine writes the message associated with messagenumber
; to stderr.
;
;
ifdef _WINDOWS
; NOTES:
;
; (1) _WINDOWS = Only output if under QuickWin (no stderr
; otherwise).
;
; (2) _WINDLL = Can't do any output (no stderr).
;
ifdef _WINDEBUG
; (3) _WINDEBUG = Send output to OUTPUTDEBUGSTRING. Can't
; use this for standard libs because that call sends output
; to AUX port if no debugger present (bogus popup on users
; screen about attempting to write to AUX).
;
endif ;_WINDEBUG
endif ;_WINDOWS
;
;Entry:
; ==PASCAL CALLING CONVENTIONS==
; messagenumber = WORD number of desired message
;
;Exit:
;
;Uses:
;
;Exceptions:
;
;*******************************************************************************

cProc __NMSG_WRITE,, ; pascal calling

parmW msgw

cBegin

ifndef _WINDLL

ifdef _QWIN
cmp [__qwinused],0 ; QWIN enabled ??
je nowrite ; nope, can't write to stderr
endif
push msgw
callcrt __NMSG_TEXT ; find near text pointer
or ax,ax
jz nowrite ; don't write anything if not there

xchg dx,ax ; ds:dx = string address
mov di,dx
xor ax,ax
mov cx,-1
repne scasb ; es = ds from __NMSG_TEXT
not cx
dec cx ; cx = string length
ifdef _QWIN
mov bx,[__nfile] ; bx = __nfile (QWIN std file handle)
call __wwrite ; QWIN call
else
mov bx,2 ; bx = stderr
ifdef _DEBUGSCREEN
cmp ___aDBswpflg,__aDBdoswp ; Aware debugger as parent?
jne @F ; No -- skip
call ___aDBswpchk ; Yes -- see if we need to swap screens
@@:
endif ; _DEBUGSCREEN

callos write ; write to stderr
endif


endif ;!_WINDLL

nowrite:

ifdef _WINDEBUG

;
; Put out the message to the system debugger,
; (message goes to AUX port if no debugger).
;

push msgw
callcrt __NMSG_TEXT ; find near text pointer
or ax,ax
jz endwrite ; don't write anything if not there

push ds
push ax
call OUTPUTDEBUGSTRING ; OUTPUTDEBUGSTRING(errormsg)

endwrite:

endif ;_WINDEBUG

cEnd

sEnd

end


  3 Responses to “Category : C++ Source Code
Archive   : VCCRT2.ZIP
Filename : NMSGHDR.ASM

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/