/* FarCom.c ***************************************************************** * * FarCom -------- Debugging functions for programs which don't * have links to their environment. * * FarPrint communication routines. * * Author -------- Olaf Barthel of ED Electronic Design Hannover * Brabeckstrasse 35 * D-3000 Hannover 71 * * Federal Republic of Germany. * * This program truly is in the PUBLIC DOMAIN. Written on a sunny * September day in 1989. * * Compiled using Aztec C 3.6a, CygnusEd Professional & ARexx. * ****************************************************************************/ #include /* Forward declarations. */ extern struct MsgPort *FindPort(); extern struct MsgPort *CreatePort(); /* Global task <-> task communication stuff. */ #define FM_ADDTXT 0 #define FM_REQTXT 1 #define FM_REQNUM 2 struct FarMessage { struct Message fm_ExecMessage; USHORT fm_Command; STRPTR fm_Identifier; STRPTR fm_Text; }; /* SendIt(MessageText,Identifier,Command): * * Sends message/request to FarPort, completely * reentrant, shouldn't work from interrupt code * since we wait for the reply. */ BOOL SendIt(MessageText,Identifier,Command) STRPTR MessageText,Identifier; USHORT Command; { struct MsgPort *ReplyPort,*FarPort; struct FarMessage FarMessage; /* Destination port present? */ if(FarPort = (struct MsgPort *)FindPort("FarPort")) { /* Create a replyport. */ if(ReplyPort = (struct MsgPort *)CreatePort(NULL,0L)) { /* Initialize custom message structure. */ FarMessage . fm_ExecMessage . mn_Node . ln_Type = NT_MESSAGE; FarMessage . fm_ExecMessage . mn_Length = sizeof(struct FarMessage); FarMessage . fm_ExecMessage . mn_ReplyPort = ReplyPort; FarMessage . fm_Text = MessageText; FarMessage . fm_Identifier = Identifier; FarMessage . fm_Command = Command; /* Send it and wait for a reply. */ PutMsg(FarPort,&FarMessage); Wait(1 << ReplyPort -> mp_SigBit); /* Remove the replyport. */ DeletePort(ReplyPort); return(TRUE); } } return(FALSE); } /* AddText(MessageText): * * Subroutine called by SendText, adds a Text to * the list of messages FarPrint maintains. */ BOOL AddText(MessageText) STRPTR MessageText; { return(SendIt(MessageText,NULL,FM_ADDTXT)); } /* RequestNumber(Identifier): * * Requests a number to be entered by the user. * Identifier points to a string which is to * identify the calling process. */ long RequestNumber(Identifier) STRPTR Identifier; { UBYTE NumBuff[81]; setmem(NumBuff,81,0); SendIt(NumBuff,Identifier,FM_REQNUM); return(atoi(NumBuff)); } /* RequestString(Identifier): * * Requests a string to be entered by the user, * Identifier points to a string which is to * identify the calling process. Note: this one * isn't reentrant since it uses a temporary * string buffer. This could easily be fixed * by using a second argument to be used as * a destination string buffer. */ STRPTR RequestString(Identifier) STRPTR Identifier; { static UBYTE TxtBuff[81]; if(SendIt(TxtBuff,Identifier,FM_REQTXT)) return(TxtBuff); else return(NULL); } /* This embedded assembly fragment handles the SendText() * function. It basically consists of a call to the * exec RawDoFmt() function to build the argument string * it passes to AddText(). Original Author: Justin V. McCormick. */ #asm _LVORawDoFmt EQU $FFFFFDF6 XDEF kput1 kput1: MOVE.B D0,(A3)+ RTS XDEF _SendText _SendText: LINK A5,#-512 MOVEM.L D1/A0-A3,-(SP) MOVEA.L 8(A5),A0 LEA 12(A5),A1 LEA kput1(PC),A2 LEA -512(A5),A3 MOVE.L 4,A6 JSR _LVORawDoFmt(A6) LEA -512(A5),A0 MOVE.L A5,-(SP) MOVE.L A0,-(SP) JSR _geta4# ; Use this call only with small code ; memory model or it will pull half of the ; standard library code into your ; program (devilish when developing ; a shared library!) JSR _AddText ADD.W #4,SP MOVE.L (SP)+,A5 MOVEM.L (SP)+,D1/A0-A3 UNLK A5 RTS #endasm