;WENDY.ASM BY DANIEL WOLF PH.D. 06/20/89
;COPYRIGHT 1989 BY ANTIC PUBLICATIONS
;EXEC EXAMPLE FOR MESSAGE PASSING

 BRA MAIN               ;BRANCH PAST THE INCLUDE STUFF

 INCLUDE "FREDANDWENDY.ASM"
 INCLUDE "MSGPORTS.ASM"

MAIN
 MOVE.L 4,A6            ;SETUP EXEC LIBRARY POINTER IN A6
 SUBA.L A5,A5           ;ZERO CONTENTS CAN NOW BE MEANINGFUL LATER
 SUBA.L A4,A4
 SUBA.L A3,A3
 LEA _DOSNAME,A1        ;FIRST OPEN DOS LIBRARY
 ZERO D0
 SYSCALL OPENLIBRARY
 TST.L D0
 BEQ EXIT               ;GET OUT OF HERE IF WE CANT OPEN DOS
 MOVE.L D0,A5

 SUBA.L A0,A0           ;CLEAR A0, NO NAME NEEDED FOR WENDYS PORT
 ZERO D0                ;SET A PRIORITY OF ZERO FOR REPLY PORT
 BSR MAKEAPORT          ;PUTS ADDRESS OF PORT OR 0 (FAILURE) IN A4 AND D0
 BEQ EXIT               ;CLOSE DOS AND QUIT IF IT FAILS

 LEA WENDYSMESSAGE,A0
 MOVE.L D0,MSG.REPLYPORT(A0)    ;TELL MESSAGE WHERE ITS REPLYPORT IS

ISFREDHOME
 LEA PORTNAME2,A1       ;SETUP POINTER TO NAME OF FREDS PORT
 ZERO D0
 SYSCALL FINDPORT       ;NOW LOOK FOR FREDS PORT BY NAME!
 TST.L D0
 BEQ EXIT               ;BYE-BYE IF PORT NOT FOUND
 MOVE.L D0,A0           ;PUT ADDRESS OF FREDS PORT IN A0 (WE NEED IT THERE)

SENDITTOFRED
 LEA WENDYSMESSAGE,A1   ;PTR TO FREDS PORT ALREADY IN A0
 SYSCALL PUTMSG         ;NOW SEND WENDYSMESSAGE TO FRED

WAITFORREPLY
 MOVE.L A4,A0           ;SETUP ADDRESS OF WENDYS MESSAGE PORT (REPLY PORT)
 SYSCALL WAITPORT       ;NOW WAIT FOR FRED TO RECEIVE THE MESSAGE, PRINT IT,
                        ;AND SEND IT BACK WITH REPLY TO WENDY (REPLYMSG)

 MOVE.L A4,A0           ;NOW GET THE MESSAGE REPLY
 SYSCALL GETMSG
 TST.L D0
 BEQ EXIT               ;IF THERE IS NO MESSAGE SOMETHINGS VERY WRONG

MEASUREREPLY
 DOSCALL OUTPUT
 MOVE.L D0,D1
 MOVE.L #THEMESSAGE,D2  ;GET ADDRESS OF THE TEXT (OF FREDS REPLY!) INTO D2
 MOVE.L D2,A0
 ZERO D3
MEASURETEXTLENGTH
 ADD.L #1,D3            ;COUNT LENGTH OF REPLY TEXT IN D3
 TST.B (A0)+
 BNE MEASURETEXTLENGTH

NOWPRINTREPLY
 DOSCALL WRITE          ;PRINT FREDS REPLY TO WENDY

EXIT
 MOVE.L A4,D0           ;CLEAN UP IN AN ORDERLY WAY AND EXIT
 BEQ CLOSEDOS           ;IF PORT NOT CREATED DONT KILL IT - MOVE ON
 MOVE.L D0,A0           ;NO NODE/PORT REMOVAL - ITS NOT PUBLIC (NO NAME)
 BSR KILLAPORT          ;SO JUST RETURN PORT MEMORY AND SIGNAL
CLOSEDOS
 MOVE.L A5,D0
 BEQ QUITNOW            ;IF DOS NOT OPENED DONT CLOSE IT
 MOVE.L D0,A1
 SYSCALL CLOSELIBRARY
QUITNOW
 RTS

 ;DSEG    ; use this line with the Aztec assembler (i.e. AS Wendy -CD)
 SECTION  DATA ; and make this line a comment

 CNOP 0,4                       ;LONG WORD ALIGN

WENDYSMESSAGE                   ;A STRUCTURE OF 20 BYTES SIZE
 DC.L 0                         ;NODE SUCCESSOR POINTER
 DC.L 0                         ;NODE PREDECESSOR POINTER
 DC.B 5                         ;NODE TYPE = NT_MESSAGE
 DC.B 0                         ;NODE PRIORITY
 DC.L 0                         ;NODE NAME POINTER
 DC.L 0                         ;REPLY PORT PRT (TO PORT CREATED ABOVE)
 DC.W 64                        ;MESSAGE LENGTH
THEMESSAGE                      ;ATTACH ACTUAL MESSAGE STUFF HERE!
 DC.B 'From Wendy: Hi, my name is  Wendy',13,10,0
 DS.B   29                        ;HERE ARE ANOTHER 32 ZERO BYTES OF THE MSG

_DOSNAME
 DC.B 'dos.library',0

PORTNAME2
 DC.B 'FRED',0
