;
Grab broadcast messages
.title grab_broadcast_messages
devnam: .ascid 'SYS$INPUT'
mbxchn: .word
devchn: .word
iosb: .quad
chbuf: .blkb 12
buffsize=256
bufdesc:.long buffsize
.long buffer+22
buffer: .blkb buffsize
.entry grab_broadcast_messages,0
pushaw w^mbxchn
pushaw w^devchn
pushl #0
pushal w^bufdesc ; max. msg size stored in descriptor
pushaq w^devnam
calls #5,g^lib$asn_wth_mbx
blbs r0,5$
brw 10$
5$: $qiow_s func=#io$_sensemode, - ; get the current characteristics
chan=w^devchn, -
iosb=w^iosb, -
p1=w^chbuf, -
p2=#12
jsb w^check_io
bisl #tt2$m_brdcstmbx,w^chbuf+8
$qiow_s func=#io$_setmode, - ; set the characteristics
chan=w^devchn, -
iosb=w^iosb, -
p1=w^chbuf, -
p2=#12
jsb w^check_io
$qiow_s func=#io$_setmode!io$m_wrtattn, -
chan=w^mbxchn, -
iosb=w^iosb, -
p1=w^get_msg
jsb w^check_io
$hiber_s
10$: ret
check_io:
blbc r0,10$
movzwl iosb,r0
blbc r0,10$
rsb
10$: ret
.entry get_msg,0
; get the message
$qiow_s func=#io$_readvblk, -
chan=mbxchn, -
iosb=iosb, -
p1=buffer,-
p2=#buffsize
cmpw #msg$_trmbrdcst,buffer ; see if it's a broadcast message
bneq 10$
movzwl buffer+20,bufdesc ; store the length of the message
beql 10$ ; ignore zero length messages
pushaq bufdesc
calls #1,g^lib$put_output
; requeue the ast
10$: $qiow_s func=#io$_setmode!io$m_wrtattn, -
chan=mbxchn, -
iosb=iosb, -
p1=get_msg
ret
.end grab_broadcast_messages