24826ff66df9c1c94c983702e6bbaae79a703bb0
* Copyright (c) 1982, 1986, 1988 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
* @(#)ut.c 7.5 (Berkeley) %G%
* SI Model 9700 -- emulates TU45 on the UNIBUS
#include "../vaxuba/ubareg.h"
#include "../vaxuba/utreg.h"
#define MASKREG(reg) ((reg)&0xffff)
#define MAXCTLR 1 /* all addresses must be specified */
u_short utstd
[MAXCTLR
] = { 0172440 }; /* non-standard */
if ((u_int
)io
->i_adapt
>= nuba
)
if ((u_int
)io
->i_ctlr
>= MAXCTLR
)
if (badaddr((char *)ubamem(io
->i_unit
, utstd
[io
->i_ctlr
]), sizeof(short)))
for (skip
= io
->i_part
; skip
--;)
utstrategy(io
, UT_SFORWF
);
while((word&UT_RDY) == 0); \
register struct utdevice
*addr
;
addr
= (struct utdevice
*)ubamem(io
->i_unit
, utstd
[io
->i_ctlr
]);
dens
= io
->i_unit
| PDP11FMT
| UT_PE
;
addr
->utwc
= -((io
->i_cc
+1) >> 1);
addr
->utcs1
= UT_RCOM
| ((info
>>8) & 0x30) | UT_GO
;
} else if (func
== WRITE
) {
addr
->utcs1
= UT_WCOM
| ((info
>>8) & 0x30) | UT_GO
;
} else if (func
== UT_SREV
) {
addr
->utcs1
= UT_SREV
| UT_GO
;
addr
->utcs1
= func
| UT_GO
;
if (word
&(UTDS_EOT
|UTDS_TM
)) {
addr
->utcs1
= UT_CLEAR
| UT_GO
;
if ((word
&UTDS_ERR
) || (addr
->utcs1
&UT_TRE
)) {
printf("ut error: cs1=%b er=%b cs2=%b ds=%b",
addr
->utcs1
, UT_BITS
, addr
->uter
, UTER_BITS
,
addr
->utcs2
, UTCS2_BITS
, word
, UTDS_BITS
);
printf("ut: unrecovered error\n");
addr
->utcs2
|= UTCS2_CLR
;
addr
->utcs1
= UT_CLEAR
| UT_GO
;
addr
->utcs1
= UT_ERASE
| UT_GO
;
printf("ut: recovered by retry\n");
if (io
->i_cc
> MASKREG(addr
->utfc
))
resid
= io
->i_cc
- MASKREG(addr
->utfc
);
resid
= MASKREG(-addr
->utfc
);
return (io
->i_cc
- resid
);
register struct utdevice
*addr
;
while ((word
&UTDS_DRY
) == 0 && (word
&UTDS_PIP
));