* Versatec matrix printer/plotter
#define VPADDR ((struct vpregs *)(UBA0_DEV + 0177500))
if (vp11
.vp_state
& VISOPEN
) {
vp11
.vp_state
= VISOPEN
| PRINT
| CLRCOM
| FFCOM
| RESET
;
VPADDR
->prcsr
= IENABLE
| DTCINTR
;
while (vp11
.vp_state
& CMNDS
) {
while (vp11
.vp_state
& VBUSY
)
sleep((caddr_t
)&vp11
, VPPRI
);
ubainfo
= ubasetup(bp
, vpbdp
);
vp11
.vp_bufp
= ubainfo
& 0x3ffff;
vp11
.vp_count
= bp
->b_bcount
;
while ((vp11
.vp_state
&PLOT
? VPADDR
->plcsr
: VPADDR
->prcsr
) & DMAACT
)
sleep((caddr_t
)&vp11
, VPPRI
);
if ((vp11
.vp_state
&MODE
) == PPLOT
)
vp11
.vp_state
= (vp11
.vp_state
&~ MODE
) | PLOT
;
if (bp
->b_bcount
> vpblock
)
physio(vpstrategy
, &rvpbuf
, dev
, B_WRITE
, minvpph
);
state
= vp11
.vp_state
& PLOT
;
while ((e
= (state
? VPADDR
->plcsr
: VPADDR
->prcsr
) & (bit
|ERROR
)) == 0)
sleep((caddr_t
)&vp11
, VPPRI
);
VPADDR
->pbaddr
= vp11
.vp_bufp
;
if (vp11
.vp_state
& (PRINT
|PPLOT
))
VPADDR
->prbcr
= vp11
.vp_count
;
VPADDR
->plbcr
= vp11
.vp_count
;
for (bit
= 1; bit
!= 0; bit
<<= 1)
if (vp11
.vp_state
&bit
&CMNDS
) {
vpioctl(dev
, cmd
, addr
, flag
)
VOID
suword(addr
, vp11
.vp_state
);
vp11
.vp_state
= (vp11
.vp_state
& ~MODE
) | (m
&(MODE
|CMNDS
));
while (CMNDS
& vp11
.vp_state
) {
if (vp11
.vp_state
&VISOPEN
)
timeout(vptimo
, (caddr_t
)0, HZ
/10);