home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
274.lha
/
DiskHandler
/
disk.c
< prev
next >
Wrap
C/C++ Source or Header
|
1989-07-25
|
6KB
|
192 lines
/* 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 */
}
}