From 38b9bcf4cb19fbda63bba9713d765042f7187b47 Mon Sep 17 00:00:00 2001 From: Dennis Ritchie Date: Tue, 26 Nov 1974 18:13:21 -0500 Subject: [PATCH] Research V5 development Work on file usr/sys/dmr/dn.c Work on file usr/c/sptab.s Work on file usr/sys/dmr/dh.c Work on file usr/sys/dmr/rf.c Synthesized-from: v5 --- usr/c/sptab.s | 109 ++++++++++++++++++++++++ usr/sys/dmr/dh.c | 215 +++++++++++++++++++++++++++++++++++++++++++++++ usr/sys/dmr/dn.c | 90 ++++++++++++++++++++ usr/sys/dmr/rf.c | 100 ++++++++++++++++++++++ 4 files changed, 514 insertions(+) create mode 100644 usr/c/sptab.s create mode 100644 usr/sys/dmr/dh.c create mode 100644 usr/sys/dmr/dn.c create mode 100644 usr/sys/dmr/rf.c diff --git a/usr/c/sptab.s b/usr/c/sptab.s new file mode 100644 index 0000000000..15ec76302c --- /dev/null +++ b/usr/c/sptab.s @@ -0,0 +1,109 @@ +/ c code tables-- expression to -(sp) + +.globl _sptab + +.data +_sptab=. + 106.; cs106 + 30.; cs30 + 31.; cs30 + 32.; cs32 + 33.; cs32 + 40.; cs40 + 41.; cs40 + 47.; cs47 + 48.; cs48 + 0 +.text + + +/ name +cs106: +%z,n +%zf,n + clrB1 -(sp) + +%aw,n + mov A1,-(sp) + +%nw*,n + F* + mov #1(R),-(sp) + +/ ++,-- prefix +cs30: +%nbp*,n +%ni*,n + F* + I #1(R) + mov #1(R),-(sp) + +%nip*,n + F* + I' $^,#1(R) + mov #1(R),-(sp) + +/ ++,-- postfix +cs32: +%nbp*,n +%ni*,n + F* + mov #1(R),-(sp) + I #1(R) + +%nip*,n + F* + mov #1(R),-(sp) + I' $^,#1(R) + +/ + +cs40: +%n,1 + FS + I' (sp) + +%n,aw + FS + I A2,(sp) + +%n,nw* + FS + S* + I #2(R),(sp) + +%n,n + FS + S + I R,(sp) + +/ & +cs47: +%n,c + FS + bic $!C2,(sp) + +%n,n + FS + S + com R + bic R,(sp) + +/ | +cs48: +%n,a + FS + bisB2 A2,(sp) + +%n,n* + FS + S* + bisB2 #2(R),(sp) + +%n,n + FS + S + bis R,(sp) + +.data +.even +.text diff --git a/usr/sys/dmr/dh.c b/usr/sys/dmr/dh.c new file mode 100644 index 0000000000..0cb1e5655a --- /dev/null +++ b/usr/sys/dmr/dh.c @@ -0,0 +1,215 @@ +# +/* + * Copyright 1973 Bell Telephone Laboratories Inc + */ + +/* + * DH-11 driver + * This driver calls on the DHDM driver. + * If the DH has no DM11-BB, then this driver will + * be fake. To insure loading of the correct DM code, + * lib2 should have dhdm.o dh.o and dhfdm.o in that order. + */ + +#include "../param.h" +#include "../conf.h" +#include "../user.h" +#include "../tty.h" +#include "../proc.h" + +#define DHADDR 0160020 +#define NDH11 16 + +struct tty dh11[NDH11]; +int ndh11 NDH11; + +#define BITS6 01 +#define BITS7 02 +#define BITS8 03 +#define TWOSB 04 +#define PENABLE 020 +#define OPAR 040 /* beware DEC manuals */ +#define HDUPLX 040000 + +#define IENABLE 030100 +#define PERROR 010000 +#define FRERROR 020000 +#define SSPEED 7 /* standard speed: 300 baud */ + +#define PS 0177776 + +int dhsar; +struct dhregs { + int dhcsr; + int dhnxch; + int dhlpr; + int dhcar; + int dhbcr; + int dhbar; + int dhbreak; + int dhsilo; +}; + +dhopen(dev, flag) +{ + register struct tty *tp; + extern dhstart(); + + if (dev.d_minor >= NDH11) { + u.u_error = ENXIO; + return; + } + tp = &dh11[dev.d_minor]; + tp->t_addr = dhstart; + DHADDR->dhcsr =| IENABLE; + tp->t_state =| WOPEN|SSTART; + if ((tp->t_state&ISOPEN) == 0) { + tp->t_erase = CERASE; + tp->t_kill = CKILL; + tp->t_speeds = SSPEED | (SSPEED<<8); + tp->t_flags = ODDP|EVENP|ECHO; + dhparam(tp); + } + dmopen(dev); + tp->t_state =& ~WOPEN; + tp->t_state =| ISOPEN; + if (u.u_procp->p_ttyp == 0) + u.u_procp->p_ttyp = tp; +} + +dhclose(dev) +{ + register struct tty *tp; + + tp = &dh11[dev.d_minor]; + dmclose(dev); + tp->t_state =& (CARR_ON|SSTART); + wflushtty(tp); +} + +dhread(dev) +{ + register struct tty *tp; + + tp = &dh11[dev.d_minor]; + if ((tp->t_state&CARR_ON) != 0) + ttread(tp); +} + +dhwrite(dev) +{ + register struct tty *tp; + + tp = &dh11[dev.d_minor]; + if ((tp->t_state&CARR_ON) != 0) + ttwrite(tp); +} + +dhrint() +{ + register struct tty *tp; + register int c; + + while ((c = DHADDR->dhnxch) < 0) { /* char. present */ + tp = &dh11[(c>>8)&017]; + if (tp >= &dh11[NDH11]) + continue; + if((tp->t_state&ISOPEN)==0 || (c&PERROR)) { + wakeup(tp); + continue; + } + if (c&FRERROR) /* break */ + if (tp->t_flags&RAW) + c = 0; /* null (for getty) */ + else + c = 0177; /* DEL (intr) */ + ttyinput(c, tp); + } +} + +dhsgtty(dev, av) +int *av; +{ + register struct tty *tp; + register r; + + tp = &dh11[dev.d_minor]; + if (ttystty(tp, av)) + return; + dhparam(tp); +} + +dhparam(atp) +struct tty *atp; +{ + register struct tty *tp; + register int lpr; + + tp = atp; + spl5(); + DHADDR->dhcsr.lobyte = (tp - dh11) | IENABLE; + lpr = (tp->t_speeds.hibyte<<10) | (tp->t_speeds.lobyte<<6); + if (tp->t_speeds.lobyte == 4) /* 134.5 baud */ + lpr =| BITS6|PENABLE|HDUPLX; else + if (tp->t_flags&EVENP) + if (tp->t_flags&ODDP) + lpr =| BITS8; else + lpr =| BITS7|PENABLE; else + lpr =| BITS7|OPAR|PENABLE; + if (tp->t_speeds.lobyte == 3) /* 110 baud */ + lpr =| TWOSB; + DHADDR->dhlpr = lpr; + spl0(); +} + +dhxint() +{ + register struct tty *tp; + register ttybit, bar; + + bar = DHADDR->dhbar; + DHADDR->dhcsr =& ~0101060; + bar = (bar|dhsar)^bar; + ttybit = 1; + for (tp = dh11; tp < &dh11[NDH11]; tp++) { + if(bar&ttybit) { + dhsar =& ~ttybit; + tp->t_state =& ~BUSY; + dhstart(tp); + } + ttybit =<< 1; + } +} + +dhstart(atp) +struct tty *atp; +{ + extern ttrstrt(); + register lineno, c; + register struct tty *tp; + int sps; + struct { int int; }; + + sps = PS->int; + spl5(); + tp = atp; + if (tp->t_state&(TIMEOUT|BUSY) || (tp->t_outq.c_cc==0)) + return; + if ((c = getc(&tp->t_outq))<=0177) { + tp->t_char = c; + lineno = tp-dh11; + DHADDR->dhcsr.lobyte = lineno | IENABLE; + DHADDR->dhcar = &tp->t_char; + DHADDR->dhbcr = -1; + lineno = 1<dhbar =| lineno; + dhsar =| lineno; + tp->t_state =| BUSY; + } else { + timeout(ttrstrt, tp, (c&0177)+6); + tp->t_state =| TIMEOUT; + } + if (tp->t_outq.c_cc == 0 || tp->t_outq.c_cc == TTLOWAT) + wakeup(&tp->t_outq); + PS->int = sps; +} diff --git a/usr/sys/dmr/dn.c b/usr/sys/dmr/dn.c new file mode 100644 index 0000000000..999c0bb55a --- /dev/null +++ b/usr/sys/dmr/dn.c @@ -0,0 +1,90 @@ +# +/* + * Copyright 1973 Bell Telephone Laboratories Inc + */ + +/* + * DN-11 ACU interface + */ + +#include "../param.h" +#include "../conf.h" +#include "../user.h" + +struct dn { + struct { + char dn_stat; + char dn_reg; + } dn11[3]; +} + +#define DNADDR 0175200 + +#define PWI 00200 +#define ACR 00100 +#define DLO 0020 +#define DONE 0200 +#define IENABLE 0100 +#define DSS 040 +#define PND 020 +#define MENABLE 04 +#define DPR 02 +#define CRQ 01 + +#define DNPRI 5 + +dnopen(dev, flag) +{ + register struct dn *dp; + register int rdev; + + rdev = dev.d_minor; + dp = &DNADDR->dn11[rdev]; + if (dp->dn_reg&(PWI|DLO)) + u.u_error = ENXIO; + else { + DNADDR->dn11[0].dn_stat =| MENABLE; + dp->dn_stat = IENABLE|MENABLE|CRQ; + } +} + +dnclose(dev) +{ + DNADDR->dn11[dev.d_minor].dn_stat =& MENABLE; +} + +dnwrite(dev) +{ + register struct dn *dp; + register c; + extern lbolt; + + dp = &DNADDR->dn11[dev.d_minor]; + for(;;) { + while ((dp->dn_stat&DONE)==0) + sleep(DNADDR, DNPRI); + dp->dn_stat =& ~DONE; + contin: + if (dp->dn_reg&(PWI|ACR)) { + u.u_error = EIO; + return; + } + if (dp->dn_stat&DSS) + return; + c = 0; + if (u.u_count==0 || (dp->dn_stat&PND)==0 || (c=cpass())<0) + continue; + if (c=='-') { + sleep(&lbolt, DNPRI); + sleep(&lbolt, DNPRI); + goto contin; + } + dp->dn_reg = c-'0'; + dp->dn_stat =| DPR; + } +} + +dnint(dev) +{ + wakeup(DNADDR); +} diff --git a/usr/sys/dmr/rf.c b/usr/sys/dmr/rf.c new file mode 100644 index 0000000000..8b73253e28 --- /dev/null +++ b/usr/sys/dmr/rf.c @@ -0,0 +1,100 @@ +# +/* + * Copyright 1973 Bell Telephone Laboratories Inc + */ + +/* + * RF disk driver + */ + +#include "../param.h" +#include "../buf.h" +#include "../conf.h" +#include "../user.h" + +struct { + int rfcs; + int rfwc; + int rfba; + int rfda; + int rfdae; +}; + +struct devtab rftab; +struct buf rrfbuf; + +#define NRFBLK 1024 +#define RFADDR 0177460 + +#define GO 01 +#define RCOM 02 +#define WCOM 04 +#define IENABLE 0100 + +rfstrategy(abp) +struct buf *abp; +{ + register struct buf *bp; + + bp = abp; + if (bp->b_blkno >= NRFBLK*(bp->b_dev.d_minor+1)) { + bp->b_flags =| B_ERROR; + iodone(bp); + return; + } + bp->av_forw = 0; + spl5(); + if (rftab.d_actf==0) + rftab.d_actf = bp; + else + rftab.d_actl->av_forw = bp; + rftab.d_actl = bp; + if (rftab.d_active==0) + rfstart(); + spl0(); +} + +rfstart() +{ + register struct buf *bp; + + if ((bp = rftab.d_actf) == 0) + return; + rftab.d_active++; + RFADDR->rfdae = bp->b_blkno.hibyte; + devstart(bp, &RFADDR->rfda, bp->b_blkno<<8, 0); +} + +rfintr() +{ + register struct buf *bp; + + if (rftab.d_active == 0) + return; + bp = rftab.d_actf; + rftab.d_active = 0; + if (RFADDR->rfcs < 0) { /* error bit */ + deverror(bp, RFADDR->rfcs); + if (++rftab.d_errcnt <= 10) { + rfstart(); + return; + } + bp->b_flags =| B_ERROR; + } + rftab.d_errcnt = 0; + rftab.d_actf = bp->av_forw; + iodone(bp); + rfstart(); +} + +rfread(dev) +{ + + physio(rfstrategy, &rrfbuf, dev, B_READ); +} + +rfwrite(dev) +{ + + physio(rfstrategy, &rrfbuf, dev, B_WRITE); +} -- 2.20.1