.title msg .enabl gbl .psect .macro clrfqb call fqbzap .endm .macro clrxrb call xrbzap .endm .psect msgini ,d,ro,lcl,con,rel sr$dcl == 1 ; declare myself a reciever sr$rcv == 2 ; recieve a messag ms$dcl::.ascii <0>/INDIRE/ ; message reciever id is INDIRE .byte 0,1!2 ; object type 0, local senders .word 40 ; 32 byte messages at most .byte 30.,0 ; 30 max messages, no net links $$ = . ; rest is unused .rept 40 - < $$ - ms$dcl > .byte 0 .endr .even ms$rcv::.byte sr$rcv .byte 2 ; no sleep and truncate msg .byte 0 ; local sender number .byte 0 ; sender select qualifier .word 0,0,0,0,0 ; always ignored .word 0 ; sleep forever $$ = . ; the rest is unused .rept 40 - < $$ - ms$rcv > .byte 0 .endr .even section $code clrmsg::clrxrb ; clear xrb and firqb clrfqb .priv ,.mesag ; simple, isn't it return ; bye dclmsg::save mov #firqb+4,r2 ; declare 'INDIRE' as our msg mov #ms$dcl ,r1 ; reciever name mov #40 ,r0 ; fill firqb with the data 10$: movb (r1)+ ,(r2)+ ; byte by byte sob r0 ,10$ ; next please call xrbzap ; insure no side effects .priv ; may need prefix code .mesag ; now really do it clr @2(r5) movb r0 ,@2(r5) unsave return ; and exit ; R C V M S G ; ; 2(r5) buffer address ; @4(r5) buffer length ; @6(r5) return length ; @10(r5) error code rcvmsg::save mov #firqb+4,r2 ; declare 'INDIRE' as our msg mov #ms$rcv ,r1 ; reciever name mov #40 ,r0 ; fill firqb with the data 10$: movb (r1)+ ,(r2)+ ; byte by byte sob r0 ,10$ ; next please call xrbzap ; when a message is sent to it mov @4(r5) ,xrb+xrlen mov 2(r5) ,xrb+xrloc .priv .mesag clr @6(r5) ; return length here clr @10(r5) ; error code movb firqb ,@10(r5) ; get error code bne 100$ ; oops mov xrb+xrbc,@6(r5) ; no error, get the message len 100$: unsave ; pop temps and exit return xrbzap: save ; clear out the xrb for .mesag mov #xrb ,r0 10$: clr (r0)+ cmp r0 ,#xrb+xrmod+2 bne 10$ unsave return fqbzap: save ; clear out the xrb for .mesag mov #firqb ,r0 10$: clr (r0)+ cmp r0 ,#firqb+40+2 bne 10$ unsave return .end