/*****************************************************************************
 * $Id: dd.h,v 1.4 1992/07/24 11:34:00 ak Exp $
 *****************************************************************************
 * $Log: dd.h,v $
 * Revision 1.4  1992/07/24  11:34:00  ak
 * OS/2 2.0
 * BASEDEV drivers
 * VGA debugging
 *
 * Revision 1.3  1992/01/07  07:50:22  ak
 * DevHlp function which return error state only
 * now return byte instead of word. Corresponds
 * to SETxx.
 *
 * Revision 1.2  1992/01/06  22:48:44  ak
 * int_on/off() for != ZTC.
 *
 * Revision 1.1.1.1  1992/01/06  19:54:02  ak
 * Alpha version.
 *
 * Revision 1.1  1992/01/06  19:54:00  ak
 * Initial revision
 *
 *****************************************************************************
 * -DBASEDEV	for BASEDEV drivers
 *****************************************************************************/
 

#ifdef __cplusplus
extern "C" {
#endif

/****************************************************************************/

typedef unsigned char	byte;
typedef unsigned short	word;
typedef unsigned long	dword;

typedef dword		paddr;
typedef dword		handle;

typedef void		_near *	nearptr;
typedef void		_far * farptr;

typedef void		(_far * farfcn) (void);
typedef void		(_far * farptrfcn) (farptr);

#define Segment(p)	(word)((dword)(farptr)(p) >> 16)
#define Offset(p)	(word)((dword)(farptr)(p))
#define Pointer(s,o)	(farptr)((dword)(s) << 16 | (dword)(o))

/************************************************************************/
/*		Device driver interface definitions.			*/
/************************************************************************/

typedef struct ReqPkt ReqPkt;
struct ReqPkt {
	byte		len;				/* 00 */
	byte		unit;				/* 01 */
	byte		cmd;				/* 02 */
	word		status;				/* 03 */
	dword		reserved;			/* 05 */
	ReqPkt _far *	link;				/* 09 */
	union {
		struct {			/* INIT in */
			byte	_1_;			/* 0D */
			farptr	devhlp;			/* 0E */
			farptr	cmdline;		/* 12 */
			byte	firstUnit;		/* 16 */
		} ini;
		struct {			/* INIT out */
			byte	nunits;			/* 0D */
			word	endCode;		/* 0E */
			word	endData;		/* 10 */
			farptr	bpb;			/* 12 */
		} ino;
		struct {			/* READ/WRITE/VERIFY */
			byte	media;			/* 0D */
			paddr	addr;			/* 0E */
			word	count;			/* 12 */
			dword	sector;			/* 14 */
			word	fileno;			/* 18 */
		} rw;
		struct {
			byte	ch;		/* PEEK	*/
		} pk;
		struct {			/* OPEN/CLOSE */
			word	fileno;			/* 0D */
		} oc;
		struct {			/* IOCTL */
			byte	cat;			/* 0D */
			byte	fcn;			/* 0E */
			farptr	parm;			/* 0F */
			farptr	data;			/* 13 */
			word	fileno;			/* 17 */
			word	plen;			/* 19 */
			word	dlen;			/* 1B */
		} ioc;
	} u;
};

typedef ReqPkt _far * ReqPtr;

/* Status codes */
#define DONE	0x0100
#define BUSY	0x0200
#define DEVERR	0x4000
#define ERROR	0x8000

/* Error codes */
#define WriteProtect	0x00
#define UnknownUnit	0x01
#define DeviceNotReady	0x02
#define InvalidCommand	0x03
#define CRCError	0x04
#define BadReqStruct	0x05
#define SeekError	0x06
#define UnknownMedia	0x07
#define SectorNotFound	0x08
#define NoPaper		0x09
#define WriteFault	0x0A
#define ReadFault	0x0B
#define GeneralFailure	0x0C
#define ChangeDisk	0x0D
#define UncertainMedia	0x10
#define Interrupted	0x11
#define NoMonitors	0x12
#define InvalidParam	0x13

/* Char-device command codes */
#define DevInit		0x00	/* DEVICE init, ring 3 */
#define DevRead		0x04
#define DevPeek		0x05
#define DevInputStatus	0x06
#define DevInputFlush	0x07
#define DevWrite	0x08
#define DevWriteVerify	0x09
#define DevOutputStatus	0x0A
#define DevOutputFlush	0x0B
#define DevOpen		0x0D
#define DevClose	0x0E
#define DevIOCtl	0x10
#define DevDeinstall	0x14
#define DevPortaccess	0x15
#define DevBaseInit	0x1B	/* 2.0 BASEDEV init, ring 0 */
#define DevShutdown	0x1C	/* 2.0 */

/* IOCtl categories */
#define IOCtlAsync	1
#define IOCtlPointer	2
#define IOCtlVideo	3
#define IOCtlScreen	4
#define IOCtlKeyboard	5
#define IOCtlPrinter	6
#define IOCtlMouse	7
#define IOCtlLogDisk	8
#define IOCtlPhysDisk	9	
#define IOCtlMonitor	10
#define IOCtlGeneral	11

/* IOCtlGeneral function codes */
#define GenFlushInput	 0x01
#define GenFlushOutput	 0x02
#define GenSessionSwitch 0x41
#define GenQueryMonitor	 0x60

typedef struct DevHeader {
	dword		link;
	word		attr;
	word		entries [2];
	byte		name [8];
	word		protCS, protDS;
	word		realCS, realDS;
} DevHeader;

extern DevHeader	header;		/* caution: near address is NULL */

/************************************************************************/
/*		Device helper functions.				*/
/************************************************************************/

#define Infinite	0xFFFFFFFFL

extern word	AllocGDTSelector (farptr sels, word nsels);
extern paddr	AllocPhys	 (dword size);
extern ReqPtr	AllocReqPkt	 (word waitflag);
extern byte	AttachDD	 (nearptr name, nearptr area);
extern int	Block		 (dword id, dword time, word interruptible);
extern void	DevDone		 (ReqPtr reqpkt);
extern void	DispMsg		 (farptr msgtab);
extern void	EOI		 (word irqnum);
extern byte	FreePhys	 (paddr);
extern void	FreeReqPacket	 (ReqPtr);
extern farptr	GetDOSVar	 (word varnum, word cx);
extern void	InternalError	 (farptr msg, word len);
extern handle	Lock		 (word seg, word flags);
extern word	PhysToGDTSelector(paddr addr, word len, word sel);
extern farptr	PhysToUVirt	 (paddr addr, word len, word type, word tag);
extern word	ProtToReal	 (void);
extern byte	PullParticular	 (nearptr queue, ReqPtr reqpkt);
extern ReqPtr	PullReqPacket	 (nearptr queue);
extern word	PushReqPacket	 (nearptr queue, ReqPtr reqpkt);
extern void	QueueFlush	 (nearptr queue);
extern void	QueueInit	 (nearptr queue);
extern int	QueueRead	 (nearptr queue);
extern byte	QueueWrite	 (nearptr queue, word ch);
extern byte	RealToProt	 (void);
extern byte	RegisterStackUsage(nearptr data);
extern byte	ResetTimer	 (farfcn handler);
extern word	Run		 (dword id);
extern word	SemClear	 (handle);
extern handle	SemHandle	 (dword semid, word inuse);
extern word	SemRequest	 (handle h, dword timeout);
extern byte	SendEvent	 (word event, word arg);
extern byte	SetIRQ		 (farfcn handler, word irqnum, word shared);
extern dword	SetROMVector	 (farfcn handler, word intnum, word saveDS);
extern byte	SetTimer	 (farfcn handler);
extern void	SortReqPacket	 (nearptr queue, ReqPtr reqpkt);
extern void	TCYield		 (void);
extern byte	TickCount	 (farfcn handler, word tick_count);
extern byte	Unlock		 (handle);
extern byte	VerifyAccess	 (farptr addr, word length, word type);
extern paddr	VirtToPhys	 (farptr addr);
extern void	Yield		 (void);

/* 2.0 only: */
extern farptr	PhysToVirt	 (paddr addr, word len);
extern void	UnPhysToVirt	 (void);

/* Dos variables */
#define DosVar_SysinfoSeg	1
#define DosVar_LocinfoSeg	2
#define DosVar_DumpVector	4
#define DosVar_RebootVector	5
#define DosVar_MSATSVector	6
#define DosVar_Yield		7
#define DosVar_TCYield		8
#define DosVar_InterruptLevel	13	/* 2.0 */
#define DosVar_DeviceClassTable	14	/* 2.0 */

/* Lock flags */
#define LockShort	0x0000
#define LockLong	0x0100
#define LockLongHigh	0x0300
#define LockShortVerify	0x0400
/* Lock option - or-ed in */
#define LockNowait	0x0001

/* Event numbers */
#define EventSMMouse		0	/* Session Manager - mouse */
#define EventCtrlBreak		1	/* Ctrl-Break */
#define EventCtrlC		2	/* Ctrl-C */
#define EventCtrlScrollLock	3	/* Ctrl-ScrollLock */
#define EventCtrlPrintScreen	4	/* Ctrl-PrtSc */
#define EventShftPrintScreen	5	/* Shift-PrtSc */
#define EventSMKeyboard		6	/* Session Manager - keyboard */

/* VerifyAccess types */
#define VerifyRead	0
#define VerifyWrite	1

/* Character queue */
typedef struct CharQueue {
	word	size;		/* Size of queue in bytes */
	word	index;		/* Index of next char out */
	word	count;		/* Count of characters in the queue */
	byte	base [1];	/* Queue buffer */
} CharQueue;

/* AttachDD data record */
typedef struct IDCEntry {
	dword	real;
	word	realDS;
	dword	prot;
	word	protDS;
} IDCEntry;

/* 2.0 ADD entry point table */
typedef struct DevClassTableEntry {
	farptrfcn	entry;		/* ADD vector */
	word		flags;	
	char		name[16];
} DevClassTableEntry;
typedef struct DevClassTable {
	word		count;		/* number of entries */
	word		maxCount;	/* ??? */
	DevClassTableEntry entries[1];
} DevClassTable;

/************************************************************************/
/*		Support functions.					*/
/************************************************************************/

extern word	inProtMode (void);
extern word	inInitPhase (void);

#ifdef __ZTC__
# define int_on()	asm(0xFB)	/* STI	*/
# define int_off()	asm(0xFA)	/* CLI	*/
#else
  extern void int_on();
  extern void int_off();
#endif

#ifdef BASEDEV
  extern void	put2c (byte);
  extern void	put2s (char _far *);
  extern void	put2x (dword);
  extern void	put2d (long);
  #define putc	put2c
  #define puts	put2s
  #define putx	put2x
  #define putd	put2d
  #define _STI_ddebug _STI_d2debug
#else
  extern void	putc (byte);
  extern void	puts (char _far *);
  extern void	putx (dword);
  extern void	putd (long);
#endif

#ifdef DEBUG
 extern int	trace;
 #define PUTC(n,c) (trace >= n && putc(c))
 #define PUTS(n,s) (trace >= n && puts(s))
 #define PUTX(n,x) (trace >= n && putx(x))
 #define PUTD(n,x) (trace >= n && putd(x))
#else
 #define PUTC(n,c)
 #define PUTS(n,s)
 #define PUTX(n,x)
 #define PUTD(n,x)
#endif

extern dword	video_address;		/* set this to B0000 or B8000 */
					/* default is B8000 */

/************************************************************************/
/*		Driver specific functions.				*/
/************************************************************************/

/* Device driver dependant functions */
extern word	DrvInit		(char _far *);
extern word	DrvInitBase	(char _far *);
extern word	DrvRead		(ReqPtr);
extern word	DrvPeek		(ReqPtr);
extern word	DrvWrite	(ReqPtr, int);	/* 1: verify */
extern word	DrvInputStatus	(void);
extern word	DrvInputFlush	(void);
extern word	DrvOutputStatus	(void);
extern word	DrvOutputFlush	(void);
extern word	DrvOpen		(ReqPtr);
extern word	DrvClose	(ReqPtr);
extern word	DrvIOCtl	(ReqPtr);

/************************************************************************/

#ifdef __cplusplus
}
#endif

