;FRED.ASM BY DANIEL WOLF PH.D. 06/20/89
;COPYRIGHT 1989 AMIGA Plus
;EXEC EXAMPLE FOR MESSAGE PASSING


 BRA MAIN               ;BRANCH AROUND THE INCLUDE STUFF

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

MAIN
 MOVE.L 4,A6            ;EXEC LIBRARY POINTER IN A6
 SUBA.L A3,A3           ;ZERO CONTENTS CAN MEAN SOMETHING LATER
 SUBA.L A4,A4
 SUBA.L A5,A5
 LEA _DOSNAME,A1        ;FIRST OPEN DOS LIBRARY
 ZERO D0
 SYSCALL OPENLIBRARY
 TST.L D0
 BEQ EXIT               ;HOLY SMOKES BATMAN, NO DOS LIBRARY!
 MOVE.L D0,A5           ;HANG ONTO DOS LIBRARY POINTER IN A5

 LEA PORTNAME2,A0       ;NOW MAKE A MESSAGE PORT WITH FREDS NAME ON IT
 ZERO D0                ;SET A PRIORITY OF ZERO FOR PORT
 BSR MAKEAPORT          ;PUTS ADDRESS OF PORT (OR 0 IF FAILS) IN A4 AND D0
 BEQ EXIT               ;CLOSE DOS AND QUIT IF IT FAILS

WAITFORWENDYSMESSAGE
 MOVE.L A4,A0           ;PTR TO FREDS MESSAGE PORT IN A0
 SYSCALL WAITPORT       ;WAIT FOR FRED TO GET, USE, AND REPLY TO MESSAGE

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

 DOSCALL OUTPUT
 MOVE.L D0,D1
 MOVE.L A3,D2
 ADD.L #20,D2           ;GET ADDRESS OF WENDYS TEXT TO FRED INTO D2
 MOVE.L #50,D3          ;WENDY IS SENDING EXACTLY 50 BYTES

NOWPRINTIT              ;LENGTH OF TEXT NOW IN D3
 DOSCALL WRITE          ;WRITE OUT THE REPLIED MESSAGE (FRED CHANGED IT)
                        ;TO THE WENDY CONSOLE WINDOW
NOWCHANGEIT
 LEA MESSAGETOWENDY,A0
 MOVE.L A3,A1
 ADDA.L #20,A1          ;TEXT BEGINS 20 BYTES INTO MESSAGE STRUCTURE
CHANGEMESSAGE
 MOVE.B (A0)+,(A1)+
 BNE.S CHANGEMESSAGE

ANDREPLY
 MOVE.L A3,A1           ;PTR TO WENDYSMESSAGE INTO A1
 SYSCALL REPLYMSG       ;REPLY NOW - MESSAGE READ AND ALTERED BY FRED
                        ;WENDY IS WAITING TO READ AND PRINT FREDS REPLY

EXIT                    ;CLEAN UP IN AN ORDERLY WAY AND EXIT
 MOVE.L A4,D0           ;WAS PORT CREATED?
 BEQ CLOSEDOS           ;IF NOT, MOVE ON
 MOVE.L D0,A1           ;THIS IS A PUBLIC (NAMED) MESSAGE PORT -
; SYSCALL REMPORT       ;MUST BE REMOVED FROM PUBLIC PORT LIST FIRST!!!
 SYSCALL REMOVE         ;EITHER REMOVE OR REMPORT WORKS FINE - NOT BOTH!!!
 MOVE.L A4,A0           ;THEN ITS OK TO KILL IT -
 BSR KILLAPORT          ;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 Fred -CD)
 SECTION  DATA ; and make this line a comment

 CNOP 0,4                       ;LONG WORD ALIGN

PORTNAME2
 DC.B 'FRED',0
 EVEN

MESSAGETOWENDY
 DC.B 'From Fred: My name is Fred, glad to meet you',13,10,0
 EVEN

_DOSNAME
 DC.B 'dos.library',0
