#define C105

/*
 *	Header file.....
 *	xPM.H: VERY small i/o package (cpmio.c) header file...
 *		includes console and file i/o
 *	Objective was to make a SIMPLE, efficient, WORKING! I/O package to
 *	use in the Metal Message system.
 *
 *			Copyright (c) 1984  Tim Gary
 *			     Delphi Data Systems
 *			     All Rights reserved.
 *
 *
 *  10/04/84	Full USER area change for read/write ops supported.
 *  10/03/84	Added reset_disk() define for bdos disk system reset.
 *
 *	CP/M and MP/M are registered trademarks of Digital Research.
 *	TurboDOS is a registered trademark of Software 2000, Inc.
 */

#define ERROR -1
#define EOF -1

/****************************************
 * differences from 1.05 and 1.06	*
 ****************************************/

#ifdef C105
#define malloc(a) alloc(a)		/* for name change */
#define movmem(a,b,c) blockmv(b,a,c)	/* name and order change */
#define setusr(a) bdos(32,a)		/* everything change */
#define setmem(a,b,c) clear(a,b,c)	/* name change */
#endif

/* Ways to open files... */

#define F_RD	0	/* open for read (just says not to MAKE file) */
#define F_RW	1	/* open/make file */
#define F_UNLOCK 0x10	/* open in multiuser unlocked mode */
#define F_RO	 0x20	/* open for Read only (multiuser)	*/
#define F_LOCK	 0	/* open in locked mode (   "   )	*/

/* define a xP/M fcb, length of it is 36 bytes	*/

struct fcb {
	char f_drive;		/* drive code 0=current, 1=A, etc...	*/
	char f_name[8];		/* file name, up to 8 chars in length	*/
	char f_type[3];		/* file type (extention), 3 chars long	*/
	char f_ext;		/* curret extent number			*/
	char f_resv[2];		/* internal cp/m use, 0's initially !	*/
	char f_rc;		/* extent record count			*/
	char f_sydx[16];	/* disk map				*/
	char f_cr;		/* current record for r/w		*/
	unsigned f_record;	/* random record number (low 2 bytes)	*/
	char f_overfl;		/* random record number high byte	*/
};

/* this is the buffered file structure... use 'FILE *fil;' in declarations */

typedef struct	{
	struct	fcb _fcb;	/* pointer to fcb (must be first item	*/
	char	_buffer[128];	/* cpm sector buffer..			*/
	char	*_bp;		/* buffer pointer.. to current char	*/
	char	_user;		/* user number file is in		*/
	} FILE;

#define _BUFSIZ	128		/* for now use 128 byte buffer		*/

#define bufloc(fd) ((fd)->_buffer)	/* pointer to begin of buffer..	*/
#define gchar(fd) (*(fd)->_bp++)    /* get next char from buffer, increment */
#define pchar(fd,ch) (*(fd)->_bp++=ch)	/* put char in buffer, increment*/
#define setbuf(fd,pos) ((fd)->_bp=fd->_buffer+pos)  /* set buffer pointer */
#define	getbuf(fd) ((fd)->_bp - (fd)->_buffer)	/* offset pos of _bp	*/
#define eobuf(f) (getbuf(f)>=_BUFSIZ)	/* end of buffer indicater...	*/

#define	setarec(fd,pos) ((fd)->_fcb.f_record=pos)      /* set absolute record*/
#define setrrec(fd,offset) ((fd)->_fcb.f_record+=offset)      /* set rel rec */
#define getrec(fd) ((fd)->_fcb.f_record)	/* like tell function */

#define toeof(fd) bdos(35,fd)	/* seek to end of xP/M file */

#define reset_disk(nada) bdos(13,nada)	/* reset disk system for disk change */

