124 lines
2.4 KiB
NASM
124 lines
2.4 KiB
NASM
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
|