<> <> <> <> <> <<>> <> <<>> <> <> DIRECTORY DiskFace USING [Label], SA4000Face USING [Command, Operation, Status]; DDC: DEFINITIONS = BEGIN Base: TYPE = LONG BASE POINTER; <> <<16 word aligned, and MUST NOT CROSS A PAGE!>> IOCB: TYPE = MACHINE DEPENDENT RECORD [ operation(0): SA4000Face.Operation, savedIOCBCmd(13:0..4): SA4000Face.Command, -- for label fixup. savedError(13:5..8): SA4000Face.Status, unused(13:9..11): [0..8) _ NULL, iocbState(13:12..15): ProcessingState, presentCylinder(14): CARDINAL, -- cyl after this stage destCylinder(15): CARDINAL, -- when we're done.... <> transferParm(16): ParameterBlock, nextIOCB(33): Base RELATIVE POINTER TO ChannelCommand, seekCommand(34): SeekBlock, transferCommand(52): TransferBlock, countThisStage(66): CARDINAL, -- # pages for this stage label(67): DiskFace.Label, unusedLabel(77): LONG CARDINAL _ 0 -- must follow label ]; ChannelCommand: TYPE; -- never used, just something to point at IOCBshortPtr: TYPE = Base RELATIVE POINTER TO IOCB; IOCBlongPtr: TYPE = LONG POINTER TO IOCB; <> <> ProcessingState: TYPE = MACHINE DEPENDENT { startRecal, recalSeek, recalStepIn, recalStepOut, startSeek, doSeek, startTransfer, eraseSA1000Track, transfer, transferFinish, labelRead }; <<>> <> <> ParameterBlock: TYPE = MACHINE DEPENDENT RECORD [ sectorCount(0): CARDINAL, -- number of sectors to transfer failCount(1): CARDINAL, -- sectors/fields to skip when <> headerOp(2:0..79): HeaderBlock, -- block of words used to specify <> labelOp(7:0..63): LabelBlock, -- block of words used to specify <> dataOp(11:0..63): DataBlock, -- block of words used to specify <> miscCmds(15:0..31): MiscCommandBlock -- stop the hardware between ]; <> HeaderBlock: TYPE = MACHINE DEPENDENT RECORD [ headerCmd(0): WORD, -- command word specifying header op headerCnt(1): CARDINAL, -- word count for header field headerAddr(2): CARDINAL, -- lo 16 bits of clientHeader if verify <> headerQuitMsk(3): WORD, -- mask used to decide to quit after <
> headerLoopMsk(4): WORD -- mask used to decide to loop looking ]; <> <
> LabelBlock: TYPE = MACHINE DEPENDENT RECORD [ labelCmd(0): WORD, -- control word specifying operation <> labelCnt(1): CARDINAL, -- word count for label field labelAddr(2): CARDINAL, -- lo 16 physical addr of IOCB's <