home *** CD-ROM | disk | FTP | other *** search
- /* Disk.c - Disk support routines */
-
- /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
- /* |_o_o|\\ Copyright (c) 1987 The Software Distillery. All Rights Reserved */
- /* |. o.| || This program may not be distributed without the permission of */
- /* | . | || the author. BBS: */
- /* | o | || John Toebes Dave Baker (919)-471-6436 */
- /* | . |// */
- /* ====== */
- /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
- #include "handler.h"
- #define PHYSSIZE 512
- extern void DskChngIntA(); /* Assem disk change interrupt server routine */
-
-
- void RemDskChngInt(global)
- GLOBAL global;
- {
- BUG(("RemChngInt\n"));
- if (global->dskchngpkt != NULL)
- {
- /* now remove the disk change interrupt */
- global->devreq->iotd_Req.io_Command = TD_REMCHANGEINT;
- BUG(("devreq Rmsgprt: %08lx\n",global->devreq->iotd_Req.io_Message.mn_ReplyPort))
- BUG(("dskchngR msgprt: %08lx\n",global->dskchngpkt->dc_req.iotd_Req.io_Message.mn_ReplyPort));
- BUG(("task msgprt: %08lx\n",global->port));
- BUG(("devmsg msgprt: %08lx\n",global->devport));
- DoIO((struct IORequest *)global->devreq);
-
- BUG(("DoIO end\n"));
- DeleteExtIO((struct IORequest *)global->dskchngpkt);
- }
- BUG(("RemChngInt Exit\n"));
- }
-
- void DskChngInt(global)
- GLOBAL global;
- {
- BUG(("Disk Change Interrupt Called\n"));
- BUG(("DskChng devname:%s\n",global->devname));
- global->changedisk = 1;
- }
-
- int AddDskChngInt(global)
- GLOBAL global;
- {
-
- /* assumes that a msg port has been allocated */
- if (((global->dskchngpkt) = (struct DskChngPacket *)
- CreateExtIO(global->port, sizeof(struct DskChngPacket)))== NULL)
- return(NULL);
-
- /* Copy the Device and Unit pointers from OpenDevice */
- global->dskchngpkt->dc_req.iotd_Req.io_Device =
- global->devreq->iotd_Req.io_Device;
- global->dskchngpkt->dc_req.iotd_Req.io_Unit =
- global->devreq->iotd_Req.io_Unit;
- global->dskchngpkt->dc_req.iotd_Req.io_Flags = 0;
-
- BUG(("Reply port %08lx vs %08lx\n",
- global->dskchngpkt->dc_req.iotd_Req.io_Message.mn_ReplyPort,
- global->port));
- global->dskchngpkt->dc_req.iotd_Req.io_Command = TD_ADDCHANGEINT;
- global->dskchngpkt->dc_req.iotd_Req.io_Data =
- (APTR)&(global->dskchngpkt->dc_int);
-
- /* Initialize the interrupt structure */
- global->dskchngpkt->dc_int.is_Node.ln_Type = NT_INTERRUPT;
- global->dskchngpkt->dc_int.is_Node.ln_Pri = 0;
- global->dskchngpkt->dc_int.is_Node.ln_Name = "DskChngInt";
- global->dskchngpkt->dc_int.is_Data = (APTR)global;
- global->dskchngpkt->dc_int.is_Code = DskChngIntA;
-
- /* Async IO so we don't sleep here for the msg */
- SendIO((struct IORequest *)&global->dskchngpkt->dc_req);
-
- return(1);
-
- }
-
- int ReadPhy(global, block, key)
- GLOBAL global;
- char *block;
- KEY key;
- {
- BUG(("ReadPhy Block:%08lx Key:%ld\n",block,key));
-
- /* Make sure the disk is there! */
- if (global->diskstatus == ID_NO_DISK_PRESENT)
- demanddisk(global);
-
- Motor(global,1);
-
- global->deviotimeout = 2;
- global->devreq->iotd_Req.io_Length = PHYSSIZE;
- global->devreq->iotd_Req.io_Data = (APTR)block;
-
- /* show where to put the data when read */
- global->devreq->iotd_Req.io_Command = ETD_READ;
-
- /* check that disk not changed before reading */
- global->devreq->iotd_Count = global->DiskChange;
-
- global->devreq->iotd_Req.io_Offset = TD_SECTOR * key;
- DoIO((struct IORequest *)global->devreq);
-
- return((int)global->devreq->iotd_Req.io_Error);
- }
-
- int WritePhy(global, block, key)
- GLOBAL global;
- char *block;
- KEY key;
- {
- BUG(("WritePhy Block:%08lx Key:%ld\n",block,key));
-
- /* make sure the disk is there */
- if (global->diskstatus == ID_NO_DISK_PRESENT)
- demanddisk(global);
-
- Motor(global,1);
- global->deviotimeout = 2;
- global->devreq->iotd_Req.io_Length = PHYSSIZE;
- global->devreq->iotd_Req.io_Data = (APTR)block;
-
- /* show where to put the data when read */
- global->devreq->iotd_Req.io_Command = ETD_WRITE;
-
- /* check that disk not changed before reading */
- global->devreq->iotd_Count = global->DiskChange;
-
- global->devreq->iotd_Req.io_Offset = TD_SECTOR * key;
- DoIO((struct IORequest *)global->devreq);
-
- return((int)global->devreq->iotd_Req.io_Error);
- }
-
- int Motor(global,flag)
- GLOBAL global;
- int flag;
- {
- /* TURN ON DISK MOTOR ... old motor state is returned in io_Actual */
- global->devreq->iotd_Req.io_Length = flag;
-
- /* this says motor is to be turned on */
- global->devreq->iotd_Req.io_Command = TD_MOTOR;
-
- /* do something with the motor */
- DoIO((struct IORequest *)global->devreq);
- return((int)global->devreq->iotd_Req.io_Error);
- }
-
- /* Reset the drive for a new disk and return the protection status of it */
- int ResetDrive(global)
- GLOBAL global;
- {
- /* now get the disk change value */
- global->devreq->iotd_Req.io_Command = TD_CHANGESTATE;
- DoIO((struct IORequest *)global->devreq);
- if (global->devreq->iotd_Req.io_Actual)
- {
- BUG(("Pretending no disk in drive\n"));
- global->diskstatus = ID_NO_DISK_PRESENT;
- return(-1);
- }
-
- global->diskstatus = ID_NOT_REALLY_DOS;
-
- global->devreq->iotd_Req.io_Command = TD_CHANGENUM;
- DoIO((struct IORequest *)global->devreq);
-
- global->DiskChange = global->devreq->iotd_Req.io_Actual;
-
- global->devreq->iotd_Req.io_Command = TD_PROTSTATUS;
- DoIO((struct IORequest *)global->devreq);
-
- return(global->devreq->iotd_Req.io_Actual);
- }
-
- void demanddisk(global)
- GLOBAL global;
- {
- while(global->diskstatus == ID_NO_DISK_PRESENT)
- {
- request(global, REQ_MUST, NULL);
- ResetDrive(global);
- /* We really should verify that we have the right disk but for now */
- /* we will trust the user to follow the requesters */
- }
- }
-