(FILECREATED "21-Oct-85 17:11:54" {ERIS}<LISPCORE>SOURCES>DOVEFLOPPY.;13 44895  

      changes to:  (FNS \DOVEFLOPPY.INITDCB \DOVEFLOPPY.RESET \DOVEFLOPPY.SETCONTEXT 
			\DOVEFLOPPY.XFERDISK \DOVEFLOPPY.BYTESWAPIOCB \DOVEFLOPPY.CLEARDISKCHANGED 
			\DOVEFLOPPY.DISKCHANGED \DOVEFLOPPY.DOOROPEN \DOVEFLOPPY.GETERRORSTATUS 
			\DOVEFLOPPY.INIT \DOVEFLOPPY.INITIOCB \DOVEFLOPPY.INITIATE 
			\DOVEFLOPPY.SETUPDMAINFO \DOVEFLOPPY.SETUPPRIMITIVEFDCOP 
			\DOVEFLOPPY.STOPHANDLER \DOVEFLOPPY.TRANSFER \DOVEFLOPPY.VALIDATEIOCB 
			\DOVEFLOPPY.WRITEPROTECTED)

      previous date: "19-Oct-85 01:57:10" {ERIS}<LISPCORE>SOURCES>DOVEFLOPPY.;12)


(* Copyright (c) 1985 by Xerox Corporation. All rights reserved.)

(PRETTYCOMPRINT DOVEFLOPPYCOMS)

(RPAQQ DOVEFLOPPYCOMS ((DECLARE: EVAL@COMPILE DONTCOPY (FILES MESATYPES (SOURCE)
								DOVEDECLS)
				   (COMS * DOVEFLOPPYDECLS))
	(VARS \DOVEFLOPPY.HARDFDCCOMMANDS \DOVEFLOPPY.#COMMANDBYTES \DOVEFLOPPY.#RESULTBYTES 
	      \DOVEFLOPPY.COMMANDS \DOVEFLOPPY.DATATRANSFEROPS \DOVEFLOPPY.DEBUG 
	      \DOVEFLOPPY.FDCBYTEONEMASKS \DOVEFLOPPY.FDCBYTETWOMASKS \DOVEFLOPPY.FORMATINFO 
	      \DOVEFLOPPY.IMPLIEDSEEKOPS \DOVEFLOPPY.ST0MASKS \DOVEFLOPPY.ST1MASKS 
	      \DOVEFLOPPY.ST2MASKS \DOVEFLOPPY.SECTORLENGTHS \DOVEFLOPPY.WAITFORINTERRUPTCMDS 
	      \DOVEFLOPPY.CURRENTCONTEXT)
	(FNS \DOVEFLOPPY.RESET \DOVEFLOPPY.SETCONTEXT \DOVEFLOPPY.XFERDISK \DOVEFLOPPY.BYTESWAPIOCB 
	     \DOVEFLOPPY.CLEARDISKCHANGED \DOVEFLOPPY.DISKCHANGED \DOVEFLOPPY.DOOROPEN 
	     \DOVEFLOPPY.GETERRORSTATUS \DOVEFLOPPY.INIT \DOVEFLOPPY.INITDCB \DOVEFLOPPY.INITIOCB 
	     \DOVEFLOPPY.INITIATE \DOVEFLOPPY.SETUPDMAINFO \DOVEFLOPPY.SETUPPRIMITIVEFDCOP 
	     \DOVEFLOPPY.STOPHANDLER \DOVEFLOPPY.TRANSFER \DOVEFLOPPY.VALIDATEIOCB 
	     \DOVEFLOPPY.WRITEPROTECTED)
	(INITVARS \DOVEFLOPPY.IOCB \DOVEFLOPPY.CURRENTCONTEXT (\DoveFloppy.FCBPointer))
	(GLOBALVARS \DOVEFLOPPY.IOCB \DOVEFLOPPY.CURRENTCONTEXT \DOVEFLOPPY.HARDFDCCOMMANDS 
		    \DoveFloppy.FCBPointer)))
(DECLARE: EVAL@COMPILE DONTCOPY 
(FILESLOAD MESATYPES (SOURCE)
	   DOVEDECLS)


(RPAQQ DOVEFLOPPYDECLS ((CONSTANTS (\DOVEFLOPPY.STOPDMA 516)
				     (\DOVEFLOPPY.STARTDMAWRITE 5798)
				     (\DOVEFLOPPY.STOPCOUNTER 16384)
				     (\DOVEFLOPPY.STARTDMAREAD 41574)
				     (\DOVEFLOPPY.STARTCOUNTER 49159)
				     (\DOVEFLOPPY.BYTETRUE 1)
				     (\DOVEFLOPPY.BYTEFALSE 0))
			  (CONSTANTS (\DOVEFLOPPY.HARDDOUBLEDENSITY 64)
				     (\DOVEFLOPPY.HARDHEADONE 4)
				     (\DOVEFLOPPY.HARDMULTITRACKMODE 128)
				     (\DOVEFLOPPY.HARDSKIPDELETEDSECTOR 32))
			  (CONSTANTS (\DOVEFLOPPY.DMAINTERRUPTWHENDONE 256)
				     (\DOVEFLOPPY.FDCCMDLENGTH 13))
			  (CONSTANTS (\DOVEFLOPPY.WRITEPROTECT 64)
				     (\DOVEFLOPPY.WAITING 3)
				     (\DOVEFLOPPY.READ 1)
				     (\DOVEFLOPPY.WRITE 2)
				     (\DOVEFLOPPY.NONE 0)
				     (\DOVEFLOPPY.OPERATIONCOMPLETED 6)
				     (\DOVEFLOPPY.INPROGRESS 4)
				     (\DOVEFLOPPY.OPERATIONFAILED 7)
				     (\DOVEFLOPPY.OPERATIONBUILT 2))
			  (RECORDS DOVEFLOPPYCMDBYTES DOVEFLOPPYCONTEXT DOVEFLOPPYDCB DOVEFLOPPYFCB 
				   DOVEFLOPPYFDCCOMMAND DOVEFLOPPYFORMATINFO DOVEFLOPPYIOCB 
				   DOVEFLOPPYSECTORHEADER DOVEQUEUEBLOCK)))
(DECLARE: EVAL@COMPILE 

(RPAQQ \DOVEFLOPPY.STOPDMA 516)

(RPAQQ \DOVEFLOPPY.STARTDMAWRITE 5798)

(RPAQQ \DOVEFLOPPY.STOPCOUNTER 16384)

(RPAQQ \DOVEFLOPPY.STARTDMAREAD 41574)

(RPAQQ \DOVEFLOPPY.STARTCOUNTER 49159)

(RPAQQ \DOVEFLOPPY.BYTETRUE 1)

(RPAQQ \DOVEFLOPPY.BYTEFALSE 0)

(CONSTANTS (\DOVEFLOPPY.STOPDMA 516)
	   (\DOVEFLOPPY.STARTDMAWRITE 5798)
	   (\DOVEFLOPPY.STOPCOUNTER 16384)
	   (\DOVEFLOPPY.STARTDMAREAD 41574)
	   (\DOVEFLOPPY.STARTCOUNTER 49159)
	   (\DOVEFLOPPY.BYTETRUE 1)
	   (\DOVEFLOPPY.BYTEFALSE 0))
)
(DECLARE: EVAL@COMPILE 

(RPAQQ \DOVEFLOPPY.HARDDOUBLEDENSITY 64)

(RPAQQ \DOVEFLOPPY.HARDHEADONE 4)

(RPAQQ \DOVEFLOPPY.HARDMULTITRACKMODE 128)

(RPAQQ \DOVEFLOPPY.HARDSKIPDELETEDSECTOR 32)

(CONSTANTS (\DOVEFLOPPY.HARDDOUBLEDENSITY 64)
	   (\DOVEFLOPPY.HARDHEADONE 4)
	   (\DOVEFLOPPY.HARDMULTITRACKMODE 128)
	   (\DOVEFLOPPY.HARDSKIPDELETEDSECTOR 32))
)
(DECLARE: EVAL@COMPILE 

(RPAQQ \DOVEFLOPPY.DMAINTERRUPTWHENDONE 256)

(RPAQQ \DOVEFLOPPY.FDCCMDLENGTH 13)

(CONSTANTS (\DOVEFLOPPY.DMAINTERRUPTWHENDONE 256)
	   (\DOVEFLOPPY.FDCCMDLENGTH 13))
)
(DECLARE: EVAL@COMPILE 

(RPAQQ \DOVEFLOPPY.WRITEPROTECT 64)

(RPAQQ \DOVEFLOPPY.WAITING 3)

(RPAQQ \DOVEFLOPPY.READ 1)

(RPAQQ \DOVEFLOPPY.WRITE 2)

(RPAQQ \DOVEFLOPPY.NONE 0)

(RPAQQ \DOVEFLOPPY.OPERATIONCOMPLETED 6)

(RPAQQ \DOVEFLOPPY.INPROGRESS 4)

(RPAQQ \DOVEFLOPPY.OPERATIONFAILED 7)

(RPAQQ \DOVEFLOPPY.OPERATIONBUILT 2)

(CONSTANTS (\DOVEFLOPPY.WRITEPROTECT 64)
	   (\DOVEFLOPPY.WAITING 3)
	   (\DOVEFLOPPY.READ 1)
	   (\DOVEFLOPPY.WRITE 2)
	   (\DOVEFLOPPY.NONE 0)
	   (\DOVEFLOPPY.OPERATIONCOMPLETED 6)
	   (\DOVEFLOPPY.INPROGRESS 4)
	   (\DOVEFLOPPY.OPERATIONFAILED 7)
	   (\DOVEFLOPPY.OPERATIONBUILT 2))
)
[DECLARE: EVAL@COMPILE 

(BLOCKRECORD DOVEFLOPPYCMDBYTES ((CB1 BYTE)
				   (CB2 BYTE)
				   (CB3 BYTE)
				   (CB4 BYTE)
				   (CB5 BYTE)
				   (CB6 BYTE)
				   (CB7 BYTE)
				   (CB8 BYTE)
				   (CB9 BYTE)))

(TYPERECORD DOVEFLOPPYCONTEXT (DRIVETYPE SECTORSPERTRACK NUMBEROFHEADS NUMBEROFCYLINDERS DENSITY 
					   DISKCHANGED SECTORLENGTH))

(MESARECORD DOVEFLOPPYDCB ((DEVICEATTRIBUTES 5 WORD)
			     (DRIVEACQUIREDBYPCE BYTE)
			     (DRIVEBUSY BYTE)
			     (DIAGNOSTICDISKCHANGED WORD)
			     (PILOTDISKCHANGED WORD)
			     (DIAGNOSTICCONTEXT WORD)
			     (PILOTCONTEXT WORD)
			     (DOOROPEN WORD)
			     (DRIVESTATUSHEAD0 BYTE)
			     (DRIVESTATUSHEAD1 BYTE)
			     (Port80ControlWord WORD)
			     (StepRateTimePlusHeadUnloadTime BYTE)
			     (HeadLoadTimePlusNotInDMAmode BYTE))
			    (BLOCKRECORD DOVEFLOPPYDCB ((NIL 12 WORD)
					    (EnableMainMemory FLAG)
					    (EnableTimerZero FLAG)
					    (FDDMotorOn FLAG)
					    (FDDInUse FLAG)
					    (AllowTimerTC FLAG)
					    (FDDLowSpeed FLAG)
					    (SelectChAIntClk FLAG)
					    (EnableDCEClk FLAG)
					    (DriveSelect3 FLAG)
					    (DriveSelect2 FLAG)
					    (DriveSelect1 FLAG)
					    (DriveSelect0 FLAG)
					    (Select250KbDataRate FLAG)
					    (PreCompensation BITS 3))))

(MESARECORD DOVEFLOPPYFCB ((FLOPPYTASK DoveIO.TaskContextBlock)
			     (FLOPPYDMATASK DoveIO.TaskContextBlock)
			     (FLOPPYSTOPHANDLER BYTE)
			     (FLOPPYRESETFDC BYTE)
			     (FLOPPYHANDLERISSTOPPED BYTE)
			     (FLOPPYFDCHUNG BYTE)
			     (FLOPPYWAITINGFORDMA BYTE)
			     (FLOPPYFIRSTDMAINTERRUPT BYTE)
			     (FLOPPYDRIVEMOTORCONTROLCOUNT BYTE)
			     (FLOPPYNUMBEROFDRIVES BYTE)
			     (FLOPPYBADDMAINTERRUPTCOUNT BYTE)
			     (FLOPPYBADFDCINTERRUPTCOUNT BYTE)
			     (NIL WORD)
			     (FLOPPYFILLERFORFORMATTING BYTE)
			     (FLOPPYDIAGNOSTICSON BYTE)
			     (FLOPPYENCODEDDEVICETYPES WORD)
			     (FLOPPYWORKMASK WORD)
			     (FLOPPYWORKNOTIFY WORD)
			     (FLOPPYLOCKMASK WORD)
			     (FLOPPYCURRENTIOCB Dove.OpieAddress)
			     (FLOPPYDIAGNOSTICQUEUE Dove.QueueBlock)
			     (FLOPPYPILOTQUEUE Dove.QueueBlock)
			     (FLOPPYIOPQUEUE Dove.QueueBlock)
			     (FLOPPYDCB0BASE DOVEFLOPPYDCB)
			     (FLOPPYDCB1BASE DOVEFLOPPYDCB)
			     (FLOPPYDCB2BASE DOVEFLOPPYDCB)
			     (FLOPPYDCB3BASE DOVEFLOPPYDCB)))

(BLOCKRECORD DOVEFLOPPYFDCCOMMAND ((FDCCODE BYTE)
				     (DATATRANSFERCODE BYTE)
				     (NIL BYTE)
				     (MUSTWAITFORINTERRUPT BYTE)
				     (NUMBEROFCOMMANDBYTES BYTE)
				     (NUMBEROFCOMMANDBYTESWRITTEN BYTE)
				     (COMMANDBYTES 10 BYTE)
				     (NUMBEROFRESULTBYTES BYTE)
				     (NUMBEROFRESULTBYTESREAD BYTE)
				     (RESULTBYTES 8 BYTE)))

(RECORD DOVEFLOPPYFORMATINFO (VALIDFORMAT SECTORSPERTRACK READWRITEGAPLENGTH FORMATGAPLENGTH))

(BLOCKRECORD DOVEFLOPPYIOCB ((CYLINDER BYTE)
			       (HEAD BYTE)
			       (SECTOR BYTE)
			       (DENSITY BYTE)
			       (NIL WORD)
			       (RECALIBRATEFIRST? FLAG)
			       (RESETFIRST? FLAG)
			       (NIL BITS 6)
			       (DATATRANSFERCODE BYTE)
			       (BUFFER POINTER)
			       (OPERATION POINTER)
			       (FDCOPERATION BYTE)
			       (NIL BYTE)
			       (FLOPPYCONTEXT WORD)
			       (ALTERNATESECTORS FLAG)
			       (MULTITRACKMODE FLAG)
			       (SKIPDELETEDSECTOR FLAG)
			       (NIL BITS 5)
			       (CURRENTRETRYCOUNT BYTE)
			       (ISQUEUED BYTE)
			       (OPERATIONSTATE BYTE)
			       (NEXTIOCB 2 WORD)
			       (DATAADDRESS 2 WORD)
			       (CLIENTCONDITION 3 WORD)
			       (FinalStateOfFDC BYTE)
			       (SpecifyBeforeProcessing BYTE)
			       (PCEResetFDCFlag BYTE)
			       (PCEStartMotorFlags BYTE)
			       (RESETFDCBEFOREPROCESSING BYTE)
			       (RECALIBRATEBEFOREPROCESSING BYTE)
			       (DRIVENUMBER BYTE)
			       (FDCHUNG BYTE)
			       (BYTESTOTRANSFER WORD)
			       (BYTESTRANSFERRED WORD)
			       (COUNTERCONTROLREG WORD)
			       (FIRSTDMATRANSFERCOUNT WORD)
			       (FIRSTDMACONTROLWORD WORD)
			       (NUMBEROFMIDDLEDMATRANSFERS WORD)
			       (MIDDLEDMATRANSFERCOUNT WORD)
			       (MIDDLEDMACONTROLWORD WORD)
			       (LASTDMATRANSFERCOUNT WORD)
			       (LASTDMACONTROLWORD WORD)
			       (FINALDMACOUNT WORD)
			       (INCREMENTDATAPTR BYTE)
			       (TimeoutOccurred BYTE)
			       (NUMBEROFFDCCOMMANDS WORD)
			       (CURRENTFDCCOMMAND WORD)
			       (FDCCOMMANDS 39 WORD)))

(BLOCKRECORD DOVEFLOPPYSECTORHEADER ((CYLINDER BYTE)
				       (HEAD BYTE)
				       (SECTOR BYTE)
				       (ENCODEDSECTORLENGTH BYTE)))

(BLOCKRECORD DOVEQUEUEBLOCK ((QUEUEHEAD 2 WORD)
			       (QUEUETAIL 2 WORD)
			       (QUEUENEXT 2 WORD)))
]
)

(RPAQQ \DOVEFLOPPY.HARDFDCCOMMANDS ((NOP . 0)
				      (FORMATTRACK . 13)
				      (READDATA . 6)
				      (READDELETEDDATA . 12)
				      (READID . 10)
				      (READTRACK . 2)
				      (RECALIBRATE . 7)
				      (SCANEQUAL . 17)
				      (SCANHIGHOREQUAL . 29)
				      (SCANLOWOREQUAL . 25)
				      (SEEK . 15)
				      (SENSEDRIVESTATUS . 4)
				      (SENSEINTERRUPTSTATUS . 8)
				      (SPECIFY . 3)
				      (WRITEDATA . 5)
				      (WRITEDELETEDDATA . 9)))

(RPAQQ \DOVEFLOPPY.#COMMANDBYTES ((NOP . 0)
				    (FORMATTRACK . 6)
				    (READDATA . 9)
				    (READDELETEDDATA . 9)
				    (READID . 2)
				    (READTRACK . 9)
				    (RECALIBRATE . 2)
				    (SCANEQUAL . 9)
				    (SCANHIGHOREQUAL . 9)
				    (SCANLOWOREQUAL . 9)
				    (SEEK . 3)
				    (SENSEDRIVESTATUS . 2)
				    (SENSEINTERRUPTSTATUS . 1)
				    (SPECIFY . 3)
				    (WRITEDATA . 9)
				    (WRITEDELETEDDATA . 9)))

(RPAQQ \DOVEFLOPPY.#RESULTBYTES ((NOP . 0)
				   (FORMATTRACK . 7)
				   (READDATA . 7)
				   (READDELETEDDATA . 7)
				   (READID . 7)
				   (READTRACK . 7)
				   (RECALIBRATE . 0)
				   (SCANEQUAL . 7)
				   (SCANHIGHOREQUAL . 7)
				   (SCANLOWOREQUAL . 7)
				   (SEEK . 0)
				   (SENSEDRIVESTATUS . 1)
				   (SENSEINTERRUPTSTATUS . 2)
				   (SPECIFY . 0)
				   (WRITEDATA . 7)))

(RPAQQ \DOVEFLOPPY.COMMANDS ((NOP . 0)
			       (FORMATTRACK . 1)
			       (READDATA . 2)
			       (READDELETEDDATA . 3)
			       (READID . 4)
			       (READTRACK . 5)
			       (RECALIBRATE . 6)
			       (SCANEQUAL . 7)
			       (SCANHIGHOREQUAL . 8)
			       (SCANLOWOREQUAL . 9)
			       (SEEK . 10)
			       (SENSEDRIVESTATUS . 11)
			       (SENSEINTERRUPTSTATUS . 12)
			       (SPECIFY . 13)
			       (WRITEDATA . 14)
			       (WRITEDELETEDDATA . 15)))

(RPAQQ \DOVEFLOPPY.DATATRANSFEROPS ((NOP . 0)
				      (FORMATTRACK . 2)
				      (READDATA . 1)
				      (READDELETEDDATA . 1)
				      (READID . 0)
				      (READTRACK . 1)
				      (RECALIBRATE . 0)
				      (SCANEQUAL . 2)
				      (SCANHIGHOREQUAL . 2)
				      (SCANLOWOREQUAL . 2)
				      (SEEK . 0)
				      (SENSEDRIVESTATUS . 0)
				      (SENSEINTERRUPTSTATUS . 0)
				      (SPECIFY . 0)
				      (WRITEDATA . 2)
				      (WRITEDELETEDDATA . 2)))

(RPAQQ \DOVEFLOPPY.DEBUG T)

(RPAQQ \DOVEFLOPPY.FDCBYTEONEMASKS ((NOP . 0)
				      (FORMATTRACK . 95)
				      (READDATA . 255)
				      (READDELETEDDATA . 255)
				      (READID . 95)
				      (READTRACK . 127)
				      (RECALIBRATE . 31)
				      (SCANEQUAL . 255)
				      (SCANHIGHOREQUAL . 255)
				      (SCANLOWOREQUAL . 255)
				      (SEEK . 31)
				      (SENSEDRIVESTATUS . 31)
				      (SENSEINTERRUPTSTATUS . 31)
				      (SPECIFY . 31)
				      (WRITEDATA . 223)
				      (WRITEDELETEDDATA . 223)))

(RPAQQ \DOVEFLOPPY.FDCBYTETWOMASKS ((NOP . 0)
				      (FORMATTRACK . 7)
				      (READDATA . 7)
				      (READDELETEDDATA . 7)
				      (READID . 7)
				      (READTRACK . 7)
				      (RECALIBRATE . 3)
				      (SCANEQUAL . 7)
				      (SCANHIGHOREQUAL . 7)
				      (SCANLOWOREQUAL . 7)
				      (SEEK . 7)
				      (SENSEDRIVESTATUS . 7)
				      (SENSEINTERRUPTSTATUS . 0)
				      (SPECIFY . 255)
				      (WRITEDATA . 7)
				      (WRITEDELETEDDATA . 7)))

(RPAQQ \DOVEFLOPPY.FORMATINFO ((128 ((SINGLE T 16 16 25)
				       (DOUBLE NIL 0 0 0)))
				 (256 ((SINGLE T 8 24 48)
				       (DOUBLE T 16 32 50)))
				 (512 ((SINGLE T 4 70 135)
				       (DOUBLE T 9 42 80)))
				 (1024 ((SINGLE NIL 2 200 255)
					(DOUBLE NIL 4 200 240)))
				 (2048 ((SINGLE NIL 1 200 255)
					(DOUBLE NIL 2 200 255)))
				 (4096 ((SINGLE NIL 0 0 0)
					(DOUBLE NIL 1 200 255)))))

(RPAQQ \DOVEFLOPPY.IMPLIEDSEEKOPS (FORMATTRACK READDATA READDELETEDDATA READID READTRACK SCANEQUAL 
						 SCANHIGHOREQUAL SCANLOWOREQUAL SEEK WRITEDATA 
						 WRITEDELETEDDATA))

(RPAQQ \DOVEFLOPPY.ST0MASKS ((8 . NOTREADY)))

(RPAQQ \DOVEFLOPPY.ST1MASKS ((128 . ENDOFTRACK)
			       (32 . DATAERROR)
			       (16 . OVERRUNERROR)
			       (4 . SECTORNOTFOUND)
			       (2 . WRITEPROTECTED)
			       (1 . MISSINGADDRESSMARK)))

(RPAQQ \DOVEFLOPPY.ST2MASKS ((16 . WRONGCYLINDER)
			       (8 . SCANEQUALHIT)
			       (4 . SCANNOTSATISFIED)
			       (2 . BADCYLINDER)))

(RPAQQ \DOVEFLOPPY.SECTORLENGTHS ((128 . 0)
				    (256 . 1)
				    (512 . 2)
				    (1024 . 3)
				    (2048 . 4)
				    (4096 . 5)))

(RPAQQ \DOVEFLOPPY.WAITFORINTERRUPTCMDS (FORMATTRACK READDATA READDELETEDDATA READID READTRACK 
						       RECALIBRATE SCANEQUAL SCANHIGHOREQUAL 
						       SCANLOWOREQUAL SEEK WRITEDATA WRITEDELETEDDATA)
)

(RPAQQ \DOVEFLOPPY.CURRENTCONTEXT (DOVEFLOPPYCONTEXT SA455 9 2 40 DOUBLE NIL 512))
(DEFINEQ

(\DOVEFLOPPY.RESET
  (LAMBDA NIL                                                (* mpl " 7-Aug-85 15:17")
    (\DOVEFLOPPY.INIT)))

(\DOVEFLOPPY.SETCONTEXT
  (LAMBDA (DENSITY SECTORLENGTH)                             (* mpl " 7-Aug-85 15:20")
    (DECLARE (GLOBALVARS \DOVEFLOPPY.SECTORLENGTHS \DOVEFLOPPY.CURRENTCONTEXT))
    (COND
      ((NOT (LISTP \DOVEFLOPPY.CURRENTCONTEXT))
	(\DOVEFLOPPY.INIT)))
    (COND
      ((FMEMB DENSITY (QUOTE (SINGLE DOUBLE)))
	(replace (DOVEFLOPPYCONTEXT DENSITY) of \DOVEFLOPPY.CURRENTCONTEXT with DENSITY))
      (T (HELP "Invalid density " DENSITY)))
    (COND
      ((FASSOC SECTORLENGTH \DOVEFLOPPY.SECTORLENGTHS)
	(replace (DOVEFLOPPYCONTEXT SECTORLENGTH) of \DOVEFLOPPY.CURRENTCONTEXT with 
										     SECTORLENGTH))
      (T (HELP "Invalid sector length " SECTORLENGTH)))))

(\DOVEFLOPPY.XFERDISK
  (LAMBDA (CYL HD SEC BUFF MODE RECAL? RESET?)               (* kbr: " 7-Oct-85 10:37")
    (PROG (STATUS)
	    (SETQ STATUS (\DOVEFLOPPY.TRANSFER CYL HD SEC BUFF MODE RESET? RECAL?))
	    (for I from 1 to 3
	       do                                          (* Repeat a few times because of spurious OVERRUN 
							     errors. *)
		    (COND
		      ((OR (EQ STATUS (QUOTE OK))
			     (EQ STATUS (QUOTE TIMEOUT)))
			(RETURN)))
		    (SETQ STATUS (\DOVEFLOPPY.TRANSFER CYL HD SEC BUFF MODE T T)))
	    (RETURN STATUS))))

(\DOVEFLOPPY.BYTESWAPIOCB
  (LAMBDA (IOCB)                                             (* kbr: " 5-Oct-85 16:37")
    (replace (DOVEFLOPPYIOCB BYTESTOTRANSFER) of IOCB with (\DoveIO.ByteSwap
								   (fetch (DOVEFLOPPYIOCB 
										  BYTESTOTRANSFER)
								      of IOCB)))
    (replace (DOVEFLOPPYIOCB BYTESTRANSFERRED) of IOCB with (\DoveIO.ByteSwap
								    (fetch (DOVEFLOPPYIOCB 
										 BYTESTRANSFERRED)
								       of IOCB)))
    (replace (DOVEFLOPPYIOCB COUNTERCONTROLREG) of IOCB with (\DoveIO.ByteSwap
								     (fetch (DOVEFLOPPYIOCB 
										COUNTERCONTROLREG)
									of IOCB)))
    (replace (DOVEFLOPPYIOCB FIRSTDMATRANSFERCOUNT) of IOCB with (\DoveIO.ByteSwap
									 (fetch (DOVEFLOPPYIOCB
										    
									    FIRSTDMATRANSFERCOUNT)
									    of IOCB)))
    (replace (DOVEFLOPPYIOCB FIRSTDMACONTROLWORD) of IOCB with (\DoveIO.ByteSwap
								       (fetch (DOVEFLOPPYIOCB
										  FIRSTDMACONTROLWORD)
									  of IOCB)))
    (replace (DOVEFLOPPYIOCB NUMBEROFMIDDLEDMATRANSFERS) of IOCB
       with (\DoveIO.ByteSwap (fetch (DOVEFLOPPYIOCB NUMBEROFMIDDLEDMATRANSFERS) of IOCB)))
    (replace (DOVEFLOPPYIOCB MIDDLEDMATRANSFERCOUNT) of IOCB with (\DoveIO.ByteSwap
									  (fetch (DOVEFLOPPYIOCB
										     
									   MIDDLEDMATRANSFERCOUNT)
									     of IOCB)))
    (replace (DOVEFLOPPYIOCB MIDDLEDMACONTROLWORD) of IOCB with (\DoveIO.ByteSwap
									(fetch (DOVEFLOPPYIOCB
										   
									     MIDDLEDMACONTROLWORD)
									   of IOCB)))
    (replace (DOVEFLOPPYIOCB LASTDMATRANSFERCOUNT) of IOCB with (\DoveIO.ByteSwap
									(fetch (DOVEFLOPPYIOCB
										   
									     LASTDMATRANSFERCOUNT)
									   of IOCB)))
    (replace (DOVEFLOPPYIOCB LASTDMACONTROLWORD) of IOCB with (\DoveIO.ByteSwap
								      (fetch (DOVEFLOPPYIOCB 
									       LASTDMACONTROLWORD)
									 of IOCB)))
    (replace (DOVEFLOPPYIOCB FINALDMACOUNT) of IOCB with (\DoveIO.ByteSwap (fetch
										   (DOVEFLOPPYIOCB
										     FINALDMACOUNT)
										    of IOCB)))
    (replace (DOVEFLOPPYIOCB NUMBEROFFDCCOMMANDS) of IOCB with (\DoveIO.ByteSwap
								       (fetch (DOVEFLOPPYIOCB
										  NUMBEROFFDCCOMMANDS)
									  of IOCB)))
    (replace (DOVEFLOPPYIOCB CURRENTFDCCOMMAND) of IOCB with (\DoveIO.ByteSwap
								     (fetch (DOVEFLOPPYIOCB 
										CURRENTFDCCOMMAND)
									of IOCB)))))

(\DOVEFLOPPY.CLEARDISKCHANGED
  (LAMBDA NIL                                                (* mpl " 4-Aug-85 12:39")
    (replace (DOVEFLOPPYDCB PILOTDISKCHANGED) of (fetch (DOVEFLOPPYFCB FLOPPYDCB0BASE)
							of \DoveFloppy.FCBPointer)
       with 0)))

(\DOVEFLOPPY.DISKCHANGED
  (LAMBDA NIL                                                (* mpl " 4-Aug-85 12:39")
    (NOT (EQ 0 (fetch (DOVEFLOPPYDCB PILOTDISKCHANGED) of (fetch (DOVEFLOPPYFCB 
										   FLOPPYDCB0BASE)
								     of \DoveFloppy.FCBPointer))))))

(\DOVEFLOPPY.DOOROPEN
  (LAMBDA NIL                                                (* mpl " 4-Aug-85 12:40")
    (NOT (EQ 0 (fetch (DOVEFLOPPYDCB DOOROPEN) of (fetch (DOVEFLOPPYFCB FLOPPYDCB0BASE)
							     of \DoveFloppy.FCBPointer))))))

(\DOVEFLOPPY.GETERRORSTATUS
  (LAMBDA (IOCB)                                             (* kbr: " 5-Oct-85 16:40")
    (DECLARE (GLOBALVARS \DOVEFLOPPY.ST0MASKS \DOVEFLOPPY.ST1MASKS \DOVEFLOPPY.ST2MASKS))
    (PROG (CMDINDEX CMDLOC CMDBYTES ST0 ST1 ST2 STATUS)
	    (SETQ CMDINDEX (SUB1 (fetch (DOVEFLOPPYIOCB CURRENTFDCCOMMAND) of IOCB)))
	    (SETQ CMDLOC (\ADDBASE (LOCF (fetch (DOVEFLOPPYIOCB FDCCOMMANDS) of IOCB))
				       (ITIMES CMDINDEX \DOVEFLOPPY.FDCCMDLENGTH)))
	    (SETQ CMDBYTES (LOCF (fetch (DOVEFLOPPYFDCCOMMAND RESULTBYTES) of CMDLOC)))
	    (SETQ ST0 (fetch (DOVEFLOPPYCMDBYTES CB1) of CMDBYTES))
	    (SETQ ST1 (fetch (DOVEFLOPPYCMDBYTES CB2) of CMDBYTES))
	    (SETQ ST2 (fetch (DOVEFLOPPYCMDBYTES CB3) of CMDBYTES))
	    (SETQ STATUS NIL)
	    (COND
	      ((EQ (fetch (DOVEFLOPPYIOCB OPERATIONSTATE) of IOCB)
		     \DOVEFLOPPY.INPROGRESS)
		(SETQ STATUS (QUOTE TIMEOUT))))
	    (SETQ STATUS (OR STATUS (for I in \DOVEFLOPPY.ST0MASKS
					   do (COND
						  ((NOT (EQ 0 (LOGAND (CAR I)
									    ST0)))
						    (RETURN (CDR I)))))))
	    (SETQ STATUS (OR STATUS (for I in \DOVEFLOPPY.ST1MASKS
					   do (COND
						  ((NOT (EQ 0 (LOGAND (CAR I)
									    ST1)))
						    (RETURN (CDR I)))))))
	    (SETQ STATUS (OR STATUS (for I in \DOVEFLOPPY.ST2MASKS
					   do (COND
						  ((NOT (EQ 0 (LOGAND (CAR I)
									    ST2)))
						    (RETURN (CDR I)))))))
	    (RETURN (OR STATUS (QUOTE OK))))))

(\DOVEFLOPPY.INIT
  (LAMBDA NIL                                                (* mpl " 7-Aug-85 20:45")
    (DECLARE (GLOBALVARS \DOVEFLOPPY.CURRENTCONTEXT))
    (SETQ \DoveFloppy.FCBPointer (\DoveIO.GetHandlerIORegionPtr DoveIO.floppyHandler))
    (PROG1 (\DOVEFLOPPY.STOPHANDLER)
	     (SETQ \DOVEFLOPPY.CURRENTCONTEXT (create DOVEFLOPPYCONTEXT
							  DRIVETYPE ← (QUOTE SA455)
							  SECTORSPERTRACK ← 9
							  NUMBEROFCYLINDERS ← 40
							  NUMBEROFHEADS ← 2
							  DENSITY ← (QUOTE DOUBLE)
							  SECTORLENGTH ← 512
							  DISKCHANGED ← NIL))
	     (\DOVEFLOPPY.INITDCB))))

(\DOVEFLOPPY.INITDCB
  (LAMBDA NIL                                                (* kbr: "21-Oct-85 16:41")
    (replace (DOVEFLOPPYDCB DOOROPEN) of (fetch (DOVEFLOPPYFCB FLOPPYDCB0BASE) of 
									   \DoveFloppy.FCBPointer)
       with 0)
    (replace (DOVEFLOPPYDCB PILOTDISKCHANGED) of (fetch (DOVEFLOPPYFCB FLOPPYDCB0BASE)
							of \DoveFloppy.FCBPointer)
       with 0)
    (replace (DOVEFLOPPYDCB DIAGNOSTICDISKCHANGED) of (fetch (DOVEFLOPPYFCB FLOPPYDCB0BASE)
							     of \DoveFloppy.FCBPointer)
       with 0)                                             (* Magic constant 6712 is byteswap of Mesa's 14362 
							     magic constant. *)
    (replace (DOVEFLOPPYDCB Port80ControlWord) of (fetch (DOVEFLOPPYFCB FLOPPYDCB0BASE)
							 of \DoveFloppy.FCBPointer)
       with 6712)))

(\DOVEFLOPPY.INITIOCB
  (LAMBDA (IOCB)                                             (* kbr: " 5-Oct-85 16:44")
    (DECLARE (GLOBALVARS \DOVEFLOPPY.COMMANDS \DOVEFLOPPY.IMPLIEDSEEKOPS 
			     \DoveFloppy.DataTransferCode \DOVEFLOPPY.DATATRANSFEROPS))
    (PROG (DCBPTR OP)
	    (SETQ DCBPTR (fetch (DOVEFLOPPYFCB FLOPPYDCB0BASE) of \DoveFloppy.FCBPointer))
	    (SETQ OP (fetch (DOVEFLOPPYIOCB OPERATION) of IOCB))
	    (\CLEARWORDS (LOCF (fetch (DOVEFLOPPYIOCB FDCOPERATION) of IOCB))
			   81)
	    (\DoveIO.MakeOpieAddress (LOCF (fetch (DOVEFLOPPYIOCB NEXTIOCB) of IOCB))
				       NIL)
	    (\DoveIO.MakeOpieAddress (LOCF (fetch (DOVEFLOPPYIOCB DATAADDRESS) of IOCB))
				       (fetch (DOVEFLOPPYIOCB BUFFER) of IOCB))
	    (replace (DOVEFLOPPYIOCB ALTERNATESECTORS) of IOCB with NIL)
	    (replace (DOVEFLOPPYIOCB FDCOPERATION) of IOCB with (CDR (FASSOC OP 
									     \DOVEFLOPPY.COMMANDS)))
	    (replace (DOVEFLOPPYIOCB MULTITRACKMODE) of IOCB with T)
	    (replace (DOVEFLOPPYIOCB SKIPDELETEDSECTOR) of IOCB with NIL)
	    (replace (DOVEFLOPPYIOCB CURRENTRETRYCOUNT) of IOCB with 1)
	    (replace (DOVEFLOPPYIOCB ISQUEUED) of IOCB with \DOVEFLOPPY.BYTEFALSE)
	    (replace (DOVEFLOPPYIOCB OPERATIONSTATE) of IOCB with \DOVEFLOPPY.OPERATIONBUILT)
	    (replace (DOVEFLOPPYIOCB RESETFDCBEFOREPROCESSING) of IOCB
	       with (COND
			((fetch (DOVEFLOPPYIOCB RESETFIRST?) of IOCB)
			  \DOVEFLOPPY.BYTETRUE)
			(T \DOVEFLOPPY.BYTEFALSE)))
	    (replace (DOVEFLOPPYIOCB RECALIBRATEBEFOREPROCESSING) of IOCB
	       with (COND
			((fetch (DOVEFLOPPYIOCB RECALIBRATEFIRST?) of IOCB)
			  \DOVEFLOPPY.BYTETRUE)
			(T \DOVEFLOPPY.BYTEFALSE)))
	    (replace (DOVEFLOPPYIOCB DRIVENUMBER) of IOCB with 0)
	    (replace (DOVEFLOPPYIOCB FDCHUNG) of IOCB with \DOVEFLOPPY.BYTEFALSE)
	    (replace (DOVEFLOPPYIOCB COUNTERCONTROLREG) of IOCB with \DOVEFLOPPY.STOPCOUNTER)
	    (replace (DOVEFLOPPYIOCB FIRSTDMACONTROLWORD) of IOCB with \DOVEFLOPPY.STOPDMA)
	    (replace (DOVEFLOPPYIOCB MIDDLEDMACONTROLWORD) of IOCB with \DOVEFLOPPY.STOPDMA)
	    (replace (DOVEFLOPPYIOCB LASTDMACONTROLWORD) of IOCB with \DOVEFLOPPY.STOPDMA)
	    (replace (DOVEFLOPPYIOCB DATATRANSFERCODE) of IOCB with (CDR (FASSOC OP 
								      \DOVEFLOPPY.DATATRANSFEROPS)))
	    (COND
	      ((FMEMB OP \DOVEFLOPPY.IMPLIEDSEEKOPS)
		(\DOVEFLOPPY.SETUPPRIMITIVEFDCOP IOCB (QUOTE SEEK))
		(\DOVEFLOPPY.SETUPPRIMITIVEFDCOP IOCB (QUOTE SENSEINTERRUPTSTATUS))))
	    (COND
	      ((NOT (FMEMB OP (QUOTE (NOP SEEK))))
		(\DOVEFLOPPY.SETUPPRIMITIVEFDCOP IOCB OP)
		(COND
		  ((EQ OP (QUOTE RECALIBRATE))
		    (\DOVEFLOPPY.SETUPPRIMITIVEFDCOP IOCB (QUOTE SENSEINTERRUPTSTATUS)))))))))

(\DOVEFLOPPY.INITIATE
  (LAMBDA (IOCB)                                             (* kbr: "21-Oct-85 17:00")

          (* * This fn makes the IOP go.)



          (* * We don't care about queues of IOCBs to floppies... what a waste!)


    (PROG (TIMER RESULTS)                                  (* \DoveIO.LockMem is pointless here)
	    (\DOVEFLOPPY.VALIDATEIOCB IOCB)
	    (\DOVEFLOPPY.INITIOCB IOCB)
	    (\DOVEFLOPPY.SETUPDMAINFO IOCB)
	    (replace (DOVEFLOPPYIOCB OPERATIONSTATE) of IOCB with \DOVEFLOPPY.WAITING)
	    (replace (DOVEFLOPPYIOCB ISQUEUED) of IOCB with \DOVEFLOPPY.BYTETRUE)
	    (\DOVEFLOPPY.BYTESWAPIOCB IOCB)                (* Lock buffer before doing anything)
	    (\LOCKPAGES IOCB 1)
	    (\PUTBASE (fetch (DOVEFLOPPYIOCB BUFFER) of IOCB)
			0
			(\GETBASE (fetch (DOVEFLOPPYIOCB BUFFER) of IOCB)
				    0))
	    (\LOCKPAGES (fetch (DOVEFLOPPYIOCB BUFFER) of IOCB)
			  1)
	    (replace (DOVEFLOPPYFCB FLOPPYSTOPHANDLER) of \DoveFloppy.FCBPointer with 
									    \DOVEFLOPPY.BYTEFALSE)
	    (COND
	      ((EQ \DOVEFLOPPY.BYTETRUE (fetch (DOVEFLOPPYFCB FLOPPYFDCHUNG) of 
									   \DoveFloppy.FCBPointer))
		(replace (DOVEFLOPPYFCB FLOPPYRESETFDC) of \DoveFloppy.FCBPointer with 
									     \DOVEFLOPPY.BYTETRUE)))
	    (replace (Dove.QueueBlock LispQueueNext) of (fetch (DOVEFLOPPYFCB FLOPPYPILOTQUEUE)
							       of \DoveFloppy.FCBPointer)
	       with IOCB)
	    (\DoveIO.NotifyIOP (fetch (DOVEFLOPPYFCB FLOPPYWORKMASK) of \DoveFloppy.FCBPointer))
	    (SETQ TIMER (SETUPTIMER 2000))
	    (until (OR (TIMEREXPIRED? TIMER)
			   (EQ (fetch (DOVEFLOPPYIOCB OPERATIONSTATE) of IOCB)
				 \DOVEFLOPPY.OPERATIONCOMPLETED)
			   (EQ (fetch (DOVEFLOPPYIOCB OPERATIONSTATE) of IOCB)
				 \DOVEFLOPPY.OPERATIONFAILED))
	       do (BLOCK))
	    (SETQ RESULTS (COND
		((OR (EQ (fetch (DOVEFLOPPYIOCB OPERATIONSTATE) of IOCB)
			     \DOVEFLOPPY.OPERATIONCOMPLETED)
		       (EQ (fetch (DOVEFLOPPYIOCB OPERATIONSTATE) of IOCB)
			     \DOVEFLOPPY.OPERATIONFAILED))

          (* NOTE: An expired TIMER doesn't necessarily imply FLOPPY failure. It can be that the process scheduler simply 
	  didn't get back to FLOPPY soon enough (e.g. user holds mouse button down long time.) A previous version of this 
	  COND tested (TIMEREXPIRED? TIMER) in the first branch, which was wrong. *)


		  (QUOTE OK))
		(T (\DOVEFLOPPY.STOPHANDLER)
		   (QUOTE TIMEOUT))))
	    (\DOVEFLOPPY.BYTESWAPIOCB IOCB)
	    (\UNLOCKPAGES IOCB 1)
	    (\UNLOCKPAGES (fetch (DOVEFLOPPYIOCB BUFFER) of IOCB)
			    1)
	    (COND
	      ((EQ RESULTS (QUOTE TIMEOUT))
		(replace (DOVEFLOPPYIOCB OPERATIONSTATE) of IOCB with \DOVEFLOPPY.INPROGRESS)))
	    (RETURN (fetch (DOVEFLOPPYIOCB OPERATIONSTATE) of IOCB)))))

(\DOVEFLOPPY.SETUPDMAINFO
  (LAMBDA (IOCB)                                             (* kbr: " 5-Oct-85 17:52")
    (DECLARE (GLOBALVARS \DOVEFLOPPY.CURRENTCONTEXT \DOVEFLOPPY.FORMATINFO 
			     \DOVEFLOPPY.SECTORLENGTHS))
    (PROG (FORMATINFO SECTORHEADER)
	    (SETQ FORMATINFO (CDR (FASSOC (fetch (DOVEFLOPPYCONTEXT DENSITY) of 
								       \DOVEFLOPPY.CURRENTCONTEXT)
						(CADR (FASSOC (fetch (DOVEFLOPPYCONTEXT 
										     SECTORLENGTH)
								     of \DOVEFLOPPY.CURRENTCONTEXT)
								  \DOVEFLOPPY.FORMATINFO)))))
	    (replace (DOVEFLOPPYIOCB COUNTERCONTROLREG) of IOCB with \DOVEFLOPPY.STARTCOUNTER)
	    (SELECTQ (fetch (DOVEFLOPPYIOCB OPERATION) of IOCB)
		       (FORMATTRACK (for I from 1 to (fetch (DOVEFLOPPYFORMATINFO 
										  SECTORSPERTRACK)
							      of FORMATINFO)
				       do (SETQ SECTORHEADER (\ADDBASE (fetch (DOVEFLOPPYIOCB
											BUFFER)
										of IOCB)
									     (ITIMES 2
										       (SUB1 I))))
                                                             (* Set up SECTORHEADER *)
					    (replace (DOVEFLOPPYSECTORHEADER CYLINDER)
					       of SECTORHEADER with (fetch (DOVEFLOPPYIOCB
										   CYLINDER)
									   of IOCB))
					    (replace (DOVEFLOPPYSECTORHEADER HEAD) of 
										     SECTORHEADER
					       with (fetch (DOVEFLOPPYIOCB HEAD) of IOCB))
					    (replace (DOVEFLOPPYSECTORHEADER SECTOR) of 
										     SECTORHEADER
					       with I)
					    (replace (DOVEFLOPPYSECTORHEADER ENCODEDSECTORLENGTH)
					       of SECTORHEADER
					       with (CDR (FASSOC (fetch (DOVEFLOPPYCONTEXT
										  SECTORLENGTH)
									  of 
								       \DOVEFLOPPY.CURRENTCONTEXT)
								       \DOVEFLOPPY.SECTORLENGTHS))))
                                                             (* Set up IOCB *)
				    (replace (DOVEFLOPPYIOCB BYTESTOTRANSFER) of IOCB
				       with (ITIMES 4 (fetch (DOVEFLOPPYFORMATINFO 
										  SECTORSPERTRACK)
							     of FORMATINFO)))
				    (replace (DOVEFLOPPYIOCB FIRSTDMATRANSFERCOUNT) of IOCB
				       with (fetch (DOVEFLOPPYIOCB BYTESTOTRANSFER) of IOCB))
				    (replace (DOVEFLOPPYIOCB FIRSTDMACONTROLWORD) of IOCB
				       with \DOVEFLOPPY.STARTDMAWRITE))
		       (PROGN (replace (DOVEFLOPPYIOCB BYTESTOTRANSFER) of IOCB
				   with (fetch (DOVEFLOPPYCONTEXT SECTORLENGTH) of 
								       \DOVEFLOPPY.CURRENTCONTEXT))
				(replace (DOVEFLOPPYIOCB FIRSTDMATRANSFERCOUNT) of IOCB
				   with (fetch (DOVEFLOPPYIOCB BYTESTOTRANSFER) of IOCB))
				(SELECTC (fetch (DOVEFLOPPYIOCB DATATRANSFERCODE) of IOCB)
					   (\DOVEFLOPPY.READ (replace (DOVEFLOPPYIOCB 
									      FIRSTDMACONTROLWORD)
								of IOCB with 
									 \DOVEFLOPPY.STARTDMAREAD)
							     (replace (DOVEFLOPPYIOCB 
									     MIDDLEDMACONTROLWORD)
								of IOCB with 
									 \DOVEFLOPPY.STARTDMAREAD)
							     (replace (DOVEFLOPPYIOCB 
									       LASTDMACONTROLWORD)
								of IOCB with 
									 \DOVEFLOPPY.STARTDMAREAD))
					   (\DOVEFLOPPY.WRITE (replace (DOVEFLOPPYIOCB 
									      FIRSTDMACONTROLWORD)
								 of IOCB with 
									\DOVEFLOPPY.STARTDMAWRITE)
							      (replace (DOVEFLOPPYIOCB 
									     MIDDLEDMACONTROLWORD)
								 of IOCB with 
									\DOVEFLOPPY.STARTDMAWRITE)
							      (replace (DOVEFLOPPYIOCB 
									       LASTDMACONTROLWORD)
								 of IOCB with 
									\DOVEFLOPPY.STARTDMAWRITE))
					   (PROGN (replace (DOVEFLOPPYIOCB FIRSTDMACONTROLWORD)
						       of IOCB with (LOGOR (fetch
										   (DOVEFLOPPYIOCB
										     
									      FIRSTDMACONTROLWORD)
										    of IOCB)
										 
								 \DOVEFLOPPY.DMAINTERRUPTWHENDONE))
						    (replace (DOVEFLOPPYIOCB 
								       NUMBEROFMIDDLEDMATRANSFERS)
						       of IOCB with 0)
						    (replace (DOVEFLOPPYIOCB LASTDMATRANSFERCOUNT)
						       of IOCB with 0))))))))

(\DOVEFLOPPY.SETUPPRIMITIVEFDCOP
  (LAMBDA (IOCB OPERATION)                                   (* kbr: " 5-Oct-85 17:00")
    (DECLARE (GLOBALVARS \DOVEFLOPPY.SECTORLENGTHS \DOVEFLOPPY.COMMANDS 
			     \DOVEFLOPPY.CURRENTCONTEXT \DOVEFLOPPY.FORMATINFO 
			     \DOVEFLOPPY.DATATRANSFEROPS \DOVEFLOPPY.#COMMANDBYTES 
			     \DOVEFLOPPY.#RESULTBYTES \DOVEFLOPPY.FDCBYTEONEMASKS 
			     \DOVEFLOPPY.FDCBYTETWOMASKS \DOVEFLOPPY.WAITFORINTERRUPTCMDS))
    (PROG (FDCCMDINDEX FDCCMD ENCODEDSECTORLENGTH FORMATINFO CURRENTCMDRECORD CMDBYTES)
	    (SETQ FDCCMDINDEX (ADD1 (fetch (DOVEFLOPPYIOCB NUMBEROFFDCCOMMANDS) of IOCB)))
	    (SETQ FDCCMD (CDR (FASSOC OPERATION \DOVEFLOPPY.COMMANDS)))
	    (SETQ ENCODEDSECTORLENGTH (CDR (FASSOC (fetch (DOVEFLOPPYCONTEXT SECTORLENGTH)
							    of \DOVEFLOPPY.CURRENTCONTEXT)
							 \DOVEFLOPPY.SECTORLENGTHS)))
	    (SETQ FORMATINFO (CDR (FASSOC (fetch (DOVEFLOPPYCONTEXT DENSITY) of 
								       \DOVEFLOPPY.CURRENTCONTEXT)
						(CADR (FASSOC (fetch (DOVEFLOPPYCONTEXT 
										     SECTORLENGTH)
								     of \DOVEFLOPPY.CURRENTCONTEXT)
								  \DOVEFLOPPY.FORMATINFO)))))
	    (SETQ CURRENTCMDRECORD (\ADDBASE (LOCF (fetch (DOVEFLOPPYIOCB FDCCOMMANDS)
							  of IOCB))
						 (ITIMES \DOVEFLOPPY.FDCCMDLENGTH (SUB1 
										      FDCCMDINDEX))))
	    (replace (DOVEFLOPPYIOCB NUMBEROFFDCCOMMANDS) of IOCB with FDCCMDINDEX)
	    (replace (DOVEFLOPPYIOCB DATATRANSFERCODE) of IOCB
	       with (CDR (FASSOC (fetch (DOVEFLOPPYIOCB OPERATION) of IOCB)
				       \DOVEFLOPPY.DATATRANSFEROPS)))
                                                             (* Set up CURRENTCMDRECORD *)
	    (replace (DOVEFLOPPYFDCCOMMAND FDCCODE) of CURRENTCMDRECORD with FDCCMD)
	    (replace (DOVEFLOPPYFDCCOMMAND DATATRANSFERCODE) of CURRENTCMDRECORD
	       with (CDR (FASSOC OPERATION \DOVEFLOPPY.DATATRANSFEROPS)))
	    (replace (DOVEFLOPPYFDCCOMMAND NUMBEROFCOMMANDBYTES) of CURRENTCMDRECORD
	       with (CDR (FASSOC OPERATION \DOVEFLOPPY.#COMMANDBYTES)))
	    (replace (DOVEFLOPPYFDCCOMMAND NUMBEROFRESULTBYTES) of CURRENTCMDRECORD
	       with (CDR (FASSOC OPERATION \DOVEFLOPPY.#RESULTBYTES)))
	    (replace (DOVEFLOPPYFDCCOMMAND MUSTWAITFORINTERRUPT) of CURRENTCMDRECORD
	       with (COND
			((FMEMB OPERATION \DOVEFLOPPY.WAITFORINTERRUPTCMDS)
			  \DOVEFLOPPY.BYTETRUE)
			(T \DOVEFLOPPY.BYTEFALSE)))          (* Set up CMDBYTES *)
	    (SETQ CMDBYTES (LOCF (fetch (DOVEFLOPPYFDCCOMMAND COMMANDBYTES) of CURRENTCMDRECORD)
				   ))
	    (replace (DOVEFLOPPYCMDBYTES CB1) of CMDBYTES with (CDR (FASSOC OPERATION 
								      \DOVEFLOPPY.HARDFDCCOMMANDS)))
	    (COND
	      ((fetch (DOVEFLOPPYIOCB MULTITRACKMODE) of IOCB)
		(replace (DOVEFLOPPYCMDBYTES CB1) of CMDBYTES with (LOGOR
									   (fetch (
DOVEFLOPPYCMDBYTES CB1) of CMDBYTES)
									   
								   \DOVEFLOPPY.HARDMULTITRACKMODE))))
	    (COND
	      ((EQ (fetch (DOVEFLOPPYCONTEXT DENSITY) of \DOVEFLOPPY.CURRENTCONTEXT)
		     (QUOTE DOUBLE))
		(replace (DOVEFLOPPYCMDBYTES CB1) of CMDBYTES with (LOGOR
									   (fetch (
DOVEFLOPPYCMDBYTES CB1) of CMDBYTES)
									   
								    \DOVEFLOPPY.HARDDOUBLEDENSITY))))
	    (COND
	      ((fetch (DOVEFLOPPYIOCB SKIPDELETEDSECTOR) of IOCB)
		(replace (DOVEFLOPPYCMDBYTES CB1) of CMDBYTES with (LOGOR
									   (fetch (
DOVEFLOPPYCMDBYTES CB1) of CMDBYTES)
									   
								\DOVEFLOPPY.HARDSKIPDELETEDSECTOR))))
	    (replace (DOVEFLOPPYCMDBYTES CB1) of CMDBYTES with (LOGAND (fetch (
DOVEFLOPPYCMDBYTES CB1) of CMDBYTES)
									       (CDR (FASSOC
											OPERATION 
								      \DOVEFLOPPY.FDCBYTEONEMASKS))))
	    (replace (DOVEFLOPPYCMDBYTES CB2) of CMDBYTES with 0)
	    (COND
	      ((EQ (fetch (DOVEFLOPPYIOCB HEAD) of IOCB)
		     1)
		(replace (DOVEFLOPPYCMDBYTES CB2) of CMDBYTES with (LOGOR
									   (fetch (
DOVEFLOPPYCMDBYTES CB2) of CMDBYTES)
									   \DOVEFLOPPY.HARDHEADONE))))
	    (replace (DOVEFLOPPYCMDBYTES CB2) of CMDBYTES with (LOGAND (fetch (
DOVEFLOPPYCMDBYTES CB2) of CMDBYTES)
									       (CDR (FASSOC
											OPERATION 
								      \DOVEFLOPPY.FDCBYTETWOMASKS))))
	    (replace (DOVEFLOPPYCMDBYTES CB3) of CMDBYTES with (fetch (DOVEFLOPPYIOCB 
											 CYLINDER)
									of IOCB))
	    (replace (DOVEFLOPPYCMDBYTES CB4) of CMDBYTES with (fetch (DOVEFLOPPYIOCB HEAD)
									of IOCB))
	    (replace (DOVEFLOPPYCMDBYTES CB5) of CMDBYTES with (fetch (DOVEFLOPPYIOCB SECTOR)
									of IOCB))
	    (replace (DOVEFLOPPYCMDBYTES CB6) of CMDBYTES with ENCODEDSECTORLENGTH)
	    (replace (DOVEFLOPPYCMDBYTES CB7) of CMDBYTES with (fetch (DOVEFLOPPYFORMATINFO
										SECTORSPERTRACK)
									of FORMATINFO))
	    (replace (DOVEFLOPPYCMDBYTES CB8) of CMDBYTES with (fetch (DOVEFLOPPYFORMATINFO
										READWRITEGAPLENGTH)
									of FORMATINFO))
	    (replace (DOVEFLOPPYCMDBYTES CB9) of CMDBYTES with (COND
								       ((EQ (fetch (
DOVEFLOPPYCMDBYTES CB6) of CMDBYTES)
									      0)
									 128)
								       (T 255)))
	    (SELECTQ OPERATION
		       (FORMATTRACK (replace (DOVEFLOPPYCMDBYTES CB3) of CMDBYTES with 
									      ENCODEDSECTORLENGTH)
				    (replace (DOVEFLOPPYCMDBYTES CB4) of CMDBYTES
				       with (fetch (DOVEFLOPPYFORMATINFO SECTORSPERTRACK)
						 of FORMATINFO))
				    (replace (DOVEFLOPPYCMDBYTES CB5) of CMDBYTES
				       with (fetch (DOVEFLOPPYFORMATINFO FORMATGAPLENGTH)
						 of FORMATINFO))
				    (replace (DOVEFLOPPYCMDBYTES CB6) of CMDBYTES
				       with (fetch (DOVEFLOPPYFCB FLOPPYFILLERFORFORMATTING)
						 of \DoveFloppy.FCBPointer)))
		       ((SCANEQUAL SCANHIGHOREQUAL SCANLOWOREQUAL)
			 (replace (DOVEFLOPPYCMDBYTES CB9) of CMDBYTES with 1))
		       (SPECIFY (replace (DOVEFLOPPYCMDBYTES CB2) of CMDBYTES
				   with (fetch (DOVEFLOPPYDCB StepRateTimePlusHeadUnloadTime)
					     of (fetch (DOVEFLOPPYFCB FLOPPYDCB0BASE)
						     of \DoveFloppy.FCBPointer)))
				(replace (DOVEFLOPPYCMDBYTES CB3) of CMDBYTES
				   with (fetch (DOVEFLOPPYDCB HeadLoadTimePlusNotInDMAmode)
					     of (fetch (DOVEFLOPPYFCB FLOPPYDCB0BASE)
						     of \DoveFloppy.FCBPointer))))
		       NIL))))

(\DOVEFLOPPY.STOPHANDLER
  (LAMBDA NIL                                                (* kbr: "21-Oct-85 17:02")
    (PROG (TIMER STATUS)
	    (replace (DOVEFLOPPYFCB FLOPPYSTOPHANDLER) of \DoveFloppy.FCBPointer with 
									     \DOVEFLOPPY.BYTETRUE)
	    (\DoveIO.NotifyIOP (fetch (DOVEFLOPPYFCB FLOPPYWORKMASK) of \DoveFloppy.FCBPointer))
	    (SETQ TIMER (SETUPTIMER 500))
	    (until (OR (TIMEREXPIRED? TIMER)
			   (EQ \DOVEFLOPPY.BYTETRUE (fetch (DOVEFLOPPYFCB FLOPPYHANDLERISSTOPPED)
							 of \DoveFloppy.FCBPointer)))
	       do (BLOCK))

          (* * This line clears out all 3 queueblocks in the fcb. beware!)


	    (\CLEARWORDS (fetch (DOVEFLOPPYFCB FLOPPYDIAGNOSTICQUEUE) of \DoveFloppy.FCBPointer)
			   (ITIMES 3 (MESASIZE Dove.QueueBlock)))
	    (replace (DOVEFLOPPYFCB FLOPPYSTOPHANDLER) of \DoveFloppy.FCBPointer with 
									    \DOVEFLOPPY.BYTEFALSE)
	    (SETQ STATUS (COND
		((EQ \DOVEFLOPPY.BYTETRUE (fetch (DOVEFLOPPYFCB FLOPPYHANDLERISSTOPPED)
					       of \DoveFloppy.FCBPointer))
                                                             (* A previous version of this COND had 
							     (TIMEREXPIRED? TIMER) as the first test, which was 
							     wrong. *)
		  (QUOTE OK))
		(T (QUOTE TIMEOUT))))
	    (RETURN STATUS))))

(\DOVEFLOPPY.TRANSFER
  (LAMBDA (CYL HD SEC BUFF MODE RESET? RECAL?)               (* kbr: " 5-Oct-85 17:04")
    (PROG (STATUS)
	    (COND
	      ((NULL \DOVEFLOPPY.IOCB)
		(SETQ \DOVEFLOPPY.IOCB (NCREATE (QUOTE VMEMPAGEP)))))
                                                             (* Set up IOCB. *)
	    (replace (DOVEFLOPPYIOCB CYLINDER) of \DOVEFLOPPY.IOCB with CYL)
	    (replace (DOVEFLOPPYIOCB HEAD) of \DOVEFLOPPY.IOCB with HD)
	    (replace (DOVEFLOPPYIOCB SECTOR) of \DOVEFLOPPY.IOCB with SEC)
	    (replace (DOVEFLOPPYIOCB BUFFER) of \DOVEFLOPPY.IOCB with BUFF)
	    (replace (DOVEFLOPPYIOCB OPERATION) of \DOVEFLOPPY.IOCB with MODE)
	    (replace (DOVEFLOPPYIOCB RESETFIRST?) of \DOVEFLOPPY.IOCB with RESET?)
	    (replace (DOVEFLOPPYIOCB RECALIBRATEFIRST?) of \DOVEFLOPPY.IOCB with RECAL?)
	    (SETQ STATUS (COND
		((EQ (\DOVEFLOPPY.INITIATE \DOVEFLOPPY.IOCB)
		       \DOVEFLOPPY.OPERATIONCOMPLETED)
		  (QUOTE OK))
		(T (\DOVEFLOPPY.GETERRORSTATUS \DOVEFLOPPY.IOCB))))
	    (RETURN STATUS))))

(\DOVEFLOPPY.VALIDATEIOCB
  (LAMBDA (IOCB)                                             (* kbr: " 5-Oct-85 17:08")
    (DECLARE (GLOBALVARS \DOVEFLOPPY.CURRENTCONTEXT \DOVEFLOPPY.COMMANDS))
    (PROG (DCBPTR)
	    (SETQ DCBPTR (fetch (DOVEFLOPPYFCB FLOPPYDCB0BASE) of \DoveFloppy.FCBPointer))
	    (COND
	      ((NOT (FASSOC (fetch (DOVEFLOPPYIOCB OPERATION) of IOCB)
				\DOVEFLOPPY.COMMANDS))
		(HELP "Invalid operation " (fetch (DOVEFLOPPYIOCB OPERATION) of IOCB))))
	    (COND
	      ((NOT (fetch (DOVEFLOPPYIOCB BUFFER) of IOCB))
		(HELP "No buffer supplied!")))
	    (COND
	      ((OR (ILESSP (fetch (DOVEFLOPPYIOCB CYLINDER) of IOCB)
			       0)
		     (IGREATERP (fetch (DOVEFLOPPYIOCB CYLINDER) of IOCB)
				  (fetch (DOVEFLOPPYCONTEXT NUMBEROFCYLINDERS) of 
								       \DOVEFLOPPY.CURRENTCONTEXT)))
		(HELP "Invalid Cylinder " (fetch (DOVEFLOPPYIOCB CYLINDER) of IOCB))))
	    (COND
	      ((OR (ILESSP (fetch (DOVEFLOPPYIOCB HEAD) of IOCB)
			       0)
		     (IGREATERP (fetch (DOVEFLOPPYIOCB HEAD) of IOCB)
				  (fetch (DOVEFLOPPYCONTEXT NUMBEROFHEADS) of 
								       \DOVEFLOPPY.CURRENTCONTEXT)))
		(HELP "Invalid Head " (fetch (DOVEFLOPPYIOCB HEAD) of IOCB))))
	    (COND
	      ((EQ (fetch (DOVEFLOPPYDCB DRIVEACQUIREDBYPCE) of DCBPTR)
		     \DOVEFLOPPY.BYTETRUE)
		(HELP "The PCE is using this drive!")))
	    (replace (DOVEFLOPPYIOCB OPERATIONSTATE) of IOCB with \DOVEFLOPPY.INPROGRESS))))

(\DOVEFLOPPY.WRITEPROTECTED
  (LAMBDA NIL                                                (* kbr: " 5-Oct-85 17:45")
    (NOT (EQ 0 (LOGAND \DOVEFLOPPY.WRITEPROTECT (fetch (DOVEFLOPPYDCB DRIVESTATUSHEAD0)
							 of (fetch (DOVEFLOPPYFCB FLOPPYDCB0BASE)
								 of \DoveFloppy.FCBPointer)))))))
)

(RPAQ? \DOVEFLOPPY.IOCB NIL)

(RPAQ? \DOVEFLOPPY.CURRENTCONTEXT NIL)

(RPAQ? \DoveFloppy.FCBPointer )
(DECLARE: DOEVAL@COMPILE DONTCOPY

(GLOBALVARS \DOVEFLOPPY.IOCB \DOVEFLOPPY.CURRENTCONTEXT \DOVEFLOPPY.HARDFDCCOMMANDS 
	    \DoveFloppy.FCBPointer)
)
(PUTPROPS DOVEFLOPPY COPYRIGHT ("Xerox Corporation" 1985))
(DECLARE: DONTCOPY
  (FILEMAP (NIL (14361 44548 (\DOVEFLOPPY.RESET 14371 . 14513) (\DOVEFLOPPY.SETCONTEXT 14515 . 15286) (
\DOVEFLOPPY.XFERDISK 15288 . 15919) (\DOVEFLOPPY.BYTESWAPIOCB 15921 . 18575) (
\DOVEFLOPPY.CLEARDISKCHANGED 18577 . 18859) (\DOVEFLOPPY.DISKCHANGED 18861 . 19159) (
\DOVEFLOPPY.DOOROPEN 19161 . 19433) (\DOVEFLOPPY.GETERRORSTATUS 19435 . 21157) (\DOVEFLOPPY.INIT 21159
 . 21803) (\DOVEFLOPPY.INITDCB 21805 . 22695) (\DOVEFLOPPY.INITIOCB 22697 . 25732) (
\DOVEFLOPPY.INITIATE 25734 . 28793) (\DOVEFLOPPY.SETUPDMAINFO 28795 . 33093) (
\DOVEFLOPPY.SETUPPRIMITIVEFDCOP 33095 . 39992) (\DOVEFLOPPY.STOPHANDLER 39994 . 41410) (
\DOVEFLOPPY.TRANSFER 41412 . 42575) (\DOVEFLOPPY.VALIDATEIOCB 42577 . 44214) (
\DOVEFLOPPY.WRITEPROTECTED 44216 . 44546)))))
STOP