/* Subs.c - Basic disk handler 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                                   (919)-471-6436  */
/* |  . |//                                                                  */
/* ======                                                                    */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

#include "handler.h"

#ifdef DEBUG
long _ECS;
static long *debuglog;

void initdebug()
{
debuglog = (long *)Open("CON:200/0/440/200/DISK-HANDLER", 1006);
}

void xwrite(str,len)
char *str;
int len;
{
long args[3];
struct FileHandle *fh;

fh = (struct FileHandle *)BADDR(debuglog);
args[0] = (long)fh->fh_Arg1;
args[1] = (long)str;
args[2] = (long)len;
sendpkt(fh->fh_Type,ACTION_WRITE,args,3);
}

void myprintf(str,p1,p2,p3,p4,p5,p6,p7,p8,p9)
char *str;
char *p1,*p2,*p3,*p4,*p5,*p6,*p7,*p8,*p9;
{
   char buf[128];
   int len;

   len = sprintf(buf,str,p1,p2,p3,p4,p5,p6,p7,p8,p9);
   if (len>128) len = 128;
   xwrite(buf,len);
}

void myputbstr(str, name)
char *str;
char *name;
{
   int len;

   xwrite(str, strlen(str));
   len = *name++;
   xwrite(name, len);
   xwrite("\n", 1);
}

void myputlstr(str, name, len)
char *str;
char *name;
int len;
{
   xwrite(str, strlen(str));
   xwrite(name, len);
   xwrite("\n", 1);
}

#endif

/* misc.c  - support routines - Phillip Lindsay (C) Commodore 1986  
 *  You may freely distribute this source and use it for Amiga Development -
 *  as long as the Copyright notice is left intact.
 *
 * 30-SEP-86
 */

/* returnpkt() - packet support routine 
 * here is the guy who sends the packet back to the sender...
 */
 
void retpkt(global, packet)
GLOBAL global;
struct DosPacket *packet;
{
 struct Message *mess;
 struct MsgPort *replyport;
 
 replyport                = packet->dp_Port;
 mess                     = packet->dp_Link;
 packet->dp_Port          = global->port;
 
 PutMsg(replyport,mess); 
}

/*
 * taskwait() ... Waits for a message to arrive at your port and 
 *   extracts the packet address which is returned to you.
 */

struct DosPacket *taskwait(global)
GLOBAL global;
{
 struct Message *mymess;

 WaitPort(global->port); /* wait for packet */
 mymess = (struct Message *) GetMsg(global->port);

 global->pkt = (struct DosPacket *) mymess->mn_Node.ln_Name;

#if 0
 BUG(("Incoming at %08lx from %08lx\n", global->pkt, global->pkt->dp_Port));
#endif
 /* give them the pointer to the packet */

 return(global->pkt);
} 

char *DosAllocMem(global, len)
GLOBAL global;
long len;
{
long *p;

if (( p = (long *)AllocMem(len+4, MEMF_PUBLIC | MEMF_CLEAR)) == NULL)
   {
   if (global->pkt != NULL)
      {
      global->pkt->dp_Res1 = DOS_FALSE;
      global->pkt->dp_Res2 = ERROR_NO_FREE_STORE;
      }
   else
      {
      /* Gee.  Out of memory AND there is nobody to tell about it ...  */
      /* Only choice is to GURU.  Maybe we could do something clever   */
      /* but I doubt it...                                             */
      BUG(("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"));
      BUG(("!!!!!!!!!!!!               !!!!!!!!\n"));
      BUG(("!!!!!!!!!!!! OUT OF MEMORY !!!!!!!!\n"));
      BUG(("!!!!!!!!!!!!               !!!!!!!!\n"));
      BUG(("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"));
      }
   }
else
   *p++ = len;

return((char *)p);
}

void DosFreeMem(p)
char *p;
{
long *lp;
long len;

   lp = (long *)p;
   len = *--lp;
   FreeMem((char *)lp, len);
}

#if 0
/***********************************************************************
*
*       Support Function -- Extended IO Request plus DosPacket
*
***********************************************************************/

struct IOExtPacket *CreateExtPkt(ioReplyPort,size)
struct MsgPort *ioReplyPort;
LONG size;
{
   register struct IOExtPacket  *ioExtPkt;

   if (ioReplyPort == 0)
      return (NULL);

   ioExtPkt = (struct IOExtPacket *)AllocMem (size, MEMF_CLEAR | MEMF_PUBLIC);

   if (ioExtPkt == 0)
      return (NULL);

   ioExtPkt->io_req.io_Message.mn_Node.ln_Type = NT_MESSAGE;
   ioExtPkt->io_req.io_Message.mn_Node.ln_Pri  = 0;
   ioExtPkt->io_req.io_Message.mn_ReplyPort    = ioReplyPort;
   ioExtPkt->io_req.io_Message.mn_Node.ln_Name = (char *)&(ioExtPkt -> io_pkt);

   ioExtPkt -> io_pkt.dp_Link = &(ioExtPkt ->io_req.io_Message);  
   ioExtPkt -> io_pkt.dp_Port = ioReplyPort;

   return(ioExtPkt);
}

void DeleteExtPkt(ioExtPkt,size)
struct IOExtPacket  *ioExtPkt;
LONG size;
{
   FreeMem ((char *)ioExtPkt, size);
}
#endif
