|
|
1.1 root 1: TITLE fmsghdr - far message handler and finder
2: ;***
3: ;fmsghdr.asm - far message handler and finder
4: ;
5: ; Copyright (c) 1986-1987, Microsoft Corporation. All rights reserved.
6: ;
7: ;Purpose:
8: ; Far message handler and finder.
9: ;
10: ;*******************************************************************************
11:
12:
13: ?DF= 1 ; this is special for c startup
14: include version.inc
15: ?PLM= 1 ; pascal calling conventions
16: .xlist
17: include cmacros.inc
18: include msdos.inc
19: .list
20:
21: createSeg _TEXT, code, word, public, CODE, <>
22:
23: createSeg _DATA, data, word, public, DATA, DGROUP
24:
25: createSeg FAR_HDR,fhdr, byte, public, FAR_MSG,FMGROUP
26: createSeg FAR_MSG,fmsg, byte, public, FAR_MSG,FMGROUP
27: createSeg FAR_PAD,fpad, byte, common, FAR_MSG,FMGROUP
28: createSeg FAR_EPAD,fepad, byte, common, FAR_MSG,FMGROUP
29:
30: defGrp DGROUP ; define DGROUP
31: defGrp FMGROUP ; define FMGROUP
32:
33: codeOFFSET equ offset _TEXT:
34: fmsgOFFSET equ offset FMGROUP:
35:
36:
37: sBegin fhdr
38: assumes ds,data
39:
40: db '<<FMSG>>'
41: stfmsg label byte
42:
43: sEnd
44:
45: SBegin fpad
46: assumes ds,data
47:
48: dw -1 ; message padding marker
49:
50: sEnd
51:
52: sBegin fepad
53: assumes ds,data
54:
55: db -1
56:
57: sEnd
58:
59:
60: sBegin code
61: assumes cs,code
62: assumes ds,data
63:
64: page
65: ;***
66: ;__FMSG_TEXT(messagenumber) - find message for given message number
67: ;
68: ;Purpose:
69: ; This routine returns a far pointer to the message associated with
70: ; messagenumber. If the message does not exist, then a 0:0 is returned.
71: ;
72: ;Entry:
73: ; ==PASCAL CALLING CONVENTIONS==
74: ; messagenumber = WORD number of desired message
75: ;
76: ;Exit:
77: ; DX:AX = pointer to message text or 0:0 if message doesn't exist
78: ;
79: ;Uses:
80: ;
81: ;Exceptions:
82: ;
83: ;*******************************************************************************
84:
85: cProc __FMSG_TEXT,<PUBLIC>,<ds,si,di> ; pascal calling
86:
87: parmW msgt
88:
89: cBegin
90: mov ax,FMGROUP
91: mov ds,ax ; ds = FMGROUP (force it always)
92: push ds
93: pop es
94: mov dx,msgt ; dx = message number
95: mov si,fmsgOFFSET stfmsg ; start of far messages
96:
97: tloop:
98: lodsw ; ax = current message number
99: cmp ax,dx
100: je found ; found it - return address
101: inc ax
102: xchg ax,si
103: jz found ; at end and not found - return 0
104: xchg di,ax
105: xor ax,ax
106: mov cx,-1
107: repne scasb ; skip until 00
108: mov si,di
109: jmp tloop ; try next entry
110:
111: found:
112: xchg ax,si
113: cwd ; zero out dx in case NULL
114: or ax,ax
115: jz notfound
116: mov dx,ds ; remember segment selector
117: notfound:
118: cEnd
119:
120: sEnd
121:
122: end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.