* SI Model 9700 -- emulates TU45 on the UNIBUS
#include "../machine/pte.h"
#include "../vaxuba/ubareg.h"
#include "../vaxuba/utreg.h"
#define MASKREG(reg) ((reg)&0xffff)
u_short utstd
[] = { 0172440 }; /* non-standard */
utstrategy(io
, UT_SFORWF
);
#define utwait(addr) {do word=addr->utcs1; while((word&UT_RDY)==0);}
register struct utdevice
*addr
=
(struct utdevice
*)ubamem(io
->i_unit
, utstd
[0]);
dens
= (io
->i_unit
&07) | 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("tj error: cs1=%b er=%b cs2=%b ds=%b",
addr
->utcs1
, UT_BITS
, addr
->uter
, UTER_BITS
,
addr
->utcs2
, UTCS2_BITS
, word
, UTDS_BITS
);
addr
->utcs2
|= UTCS2_CLR
;
addr
->utcs1
= UT_CLEAR
| UT_GO
;
addr
->utcs1
= UT_ERASE
| UT_GO
;
printf(" 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
));