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