LSX/sys/aedfd.c
#
/*
* Copyright 1976 Bell Telephone Laboratories Inc
*/
/*
* AED 6200lp disk driver
*/
#include "param.h"
#include "buf.h"
#include "user.h"
#define FDVECT 0170
#define FDPS 0172
#define FDADDR 0164000
#define NFDBLK 1232
#define NFD 2
#define CMD0 0
#define CMD1 01000
#define CMD2 02000
#define CMD3 03000
#define WSC0 0
#define RS 020000
#define WSC1 040000
#define INSS 060000
#define WSC2 0100000
#define RSID 0120000
#define WSC3 0140000
#define RZSK 0160000
#define MO 0400
#define IS 0200
#define UN0 0
#define UN1 04000
#define UN2 010000
#define UN3 014000
#define ERR 0100000
#define DONE 0200
#define IENB 0100
#define IF 0100000
#define IX 040000
#define DE 020000
#define AE 010000
#define SE 04000
#define NE 02000
#define WE 01000
#define S62 040
#define IE 0400
#define IM 020
#define OL 04
#define DMIDC0 0
#define DMIDC1 01
#define DMIDC2 02
#define DMIDC3 03
struct {
int sstat;
int pstat;
int badr;
int wcr;
};
struct devtab fdtab;
fdstrategy(abp)
struct buf *abp;
{
register struct buf *bp;
bp = abp;
if (bp->b_blkno >= NFDBLK || bp->b_dev>=NFD || bp->b_dev<0) {
bp->b_flags =| B_DONE | B_ERROR;
return;
}
bp->b_link = 0;
spl7();
if (fdtab.d_actf==0)
fdtab.d_actf = bp;
else
fdtab.d_actl->b_link = bp;
fdtab.d_actl = bp;
if (fdtab.d_active==0)
fdstart();
spl0();
}
fdstart()
{
register struct buf *bp;
register com;
if((bp=fdtab.d_actf)==0)
return;
fdtab.d_active++;
com=bp->b_dev<<11;
while((FDADDR->pstat&DONE)==0);
FDADDR->badr=bp->b_addr;
FDADDR->wcr= -256;
FDADDR->sstat=com|CMD1|(bp->b_blkno&017);
com=| CMD0|((bp->b_blkno>>4)&0177);
FDADDR->pstat=IENB;
if(bp->b_flags&B_READ)
FDADDR->sstat=RS|com;
else
FDADDR->sstat=WSC0|com;
}
fdintr()
{
register struct buf *bp;
register int unit;
if (fdtab.d_active == 0)
return;
bp = fdtab.d_actf;
fdtab.d_active = 0;
if(FDADDR->pstat&ERR){
if (++fdtab.d_errcnt <= 10) {
fdstart();
return;
}
bp->b_flags =| B_ERROR;
}
fdtab.d_errcnt = 0;
if((bp->b_wcount =+ 256) == 0) {
fdtab.d_actf = bp->b_link;
bp->b_flags =| B_DONE;
#ifdef BGOPTION
wakeup(bp);
#endif
} else {
bp->b_addr =+ 512;
bp->b_blkno++;
}
fdstart();
}