# define DZADDR (UBA0_DEV + 0160100)
# define MSE 040 /* Master Scan Enable */
# define RIE 0100 /* Receiver Interrupt Enable */
# define TIE 040000 /* Transmit interrupt enable */
# define DZ_IEN (MSE+RIE+TIE)
# define SSPEED 7 /* std speed = 300 baud */
struct dzregs
*dz_addr
[] = {
(struct dzregs
*)(DZADDR
),
(struct dzregs
*)(DZADDR
+010),
(struct dzregs
*)(DZADDR
+020),
(struct dzregs
*)(DZADDR
+030)
0, 020 , 021 , 022 , 023 , 024 , 0, 025,
026 , 027 , 030 , 032 , 034 , 036 , 0 , 0,
register struct tty
*tp
;
extern dzstart() , dzscan() ;
tp
->t_addr
= ((struct dzregs
*)DZADDR
) + (dev
>>3);
if ((tp
->t_state
& ISOPEN
) == 0) {
tp
->t_ospeed
= tp
->t_ispeed
= SSPEED
;
tp
->t_flags
= ODDP
|EVENP
|ECHO
|HUPCLS
;
if (tp
->t_state
&XCLUDE
&& u
.u_uid
!= 0) {
while ((tp
->t_state
& CARR_ON
) == 0) {
sleep(&tp
->t_rawq
,TTIPRI
) ;
(*linesw
[tp
->t_line
].l_open
)(d
,tp
);
register struct tty
*tp
;
(*linesw
[tp
->t_line
].l_close
)(tp
);
if (tp
->t_flags
& HUPCLS
)
(*linesw
[tp
->t_line
].l_read
)(tp
);
(*linesw
[tp
->t_line
].l_write
)(tp
);
register struct tty
*tp
;
register struct dzregs
*dzaddr
;
while ((c
= dzaddr
->dzrbuf
) < 0) { /* char present */
tp
= &dz_tty
[((c
>>8)&07)|(dev
<<3)] ;
if (tp
>= &dz_tty
[dz_cnt
]) continue ;
if ((tp
->t_state
& ISOPEN
) == 0) {
if (c
& FRERROR
) /* framing error = break */
if (tp
->t_flags
& RAW
) c
= 0 ; /* null for getty */
else c
= 0177 ; /* DEL = interrupt */
if (c
& PERROR
) /* parity error */
if (((tp
->t_flags
& (EVENP
|ODDP
)) == EVENP
)
|| ((tp
->t_flags
& (EVENP
|ODDP
)) == ODDP
))
(*linesw
[tp
->t_line
].l_rint
)(c
,tp
);
dzioctl(dev
,cmd
,addr
,flag
)
tp
= &dz_tty
[minor(dev
)];
if (ttioccomm(cmd
,tp
,addr
,dev
)) {
if (cmd
==TIOCSETP
|| cmd
==TIOCSETN
)
register struct tty
*tp
;
register struct dzregs
*dzaddr
;
dzaddr
= dz_addr
[dev
>>3] ;
if (tp
->t_ispeed
== 0) { /* hang up line */
lpr
= (dz_speeds
[tp
->t_ispeed
]<<8) | (dev
& 07) ;
if (tp
->t_flags
& RAW
) lpr
|= BITS8
;
else lpr
|= (BITS7
|PENABLE
) ;
if ((tp
->t_flags
& EVENP
) == 0) lpr
|= OPAR
;
if (tp
->t_ispeed
== 3) /* 110 baud */
lpr
|= TWOSB
; /* 2 stop bits */
register struct tty
*tp
;
register struct dzregs
*dzaddr
;
while (dzaddr
->dzcsr
< 0) { /* Transmit Ready is on */
unit
= (dzaddr
->dzcsr
>> 8) & 07 ;
tp
= &dz_tty
[(dev
<<3) | unit
] ;
/* the following is an attempt to fix what appears
to be a DZ hardware bug which causes the system
to loop here. Transmitting the NUL should not
cause too many problems.... */
if ((dzaddr
->dztcr
& (1<<unit
)) == 0 ) {
printf("dzxint,line=%d\n", unit
);
if (tp
->t_state
& BUSY
) {
dzaddr
->dztbuf
= tp
->t_char
; /* output the char */
(*linesw
[tp
->t_line
].l_start
)(tp
);
dzaddr
->dztcr
&= (~unit
) ; /* Transmit enable off */
register struct tty
*tp
;
register struct dzregs
*dzaddr
;
dzaddr
= dz_addr
[unit
>>3] ;
if (tp
->t_state
& (TIMEOUT
|BUSY
|TTSTOP
)) {
if ((c
= getc(&tp
->t_outq
)) >= 0) {
if (c
>= 0200 && (tp
->t_flags
&RAW
) == 0) {
timeout(ttrstrt
,tp
,(c
&0177)+6) ;
if (tp
->t_outq
.c_cc
<= TTLOWAT
&& tp
->t_state
&ASLEEP
) {
register struct dzregs
*dzaddr
;
dzaddr
= dz_addr
[dev
>>3] ;
if (flag
== OFF
) dzaddr
->dzdtr
&= ~bit
;
else dzaddr
->dzdtr
|= bit
;
register struct dzregs
*dzaddr
;
register struct tty
*tp
;
for (i
= 0 ; i
< dz_cnt
; i
++) {
if (dzaddr
->dzmsr
& bit
) { /* carrier present */
if ((tp
->t_state
& CARR_ON
) == 0) {
if ((tp
->t_state
& CARR_ON
)) { /* carrier lost */
signal(tp
->t_pgrp
,SIGHUP
) ;
tp
->t_state
&= ~CARR_ON
;