/*  This module is a collection of all the Z8000	*/
/*  dependent C code for the P-CP/M dual processor	*/
/*  BIOS.						*/


/*
*************************************************	
*						*
*	Author:		David Heintz		*
*	Module:		Zoom8kc.c		*
*	Creation Date:	10/26/82		*
*	Language:	Standard C		*
*	Version:	1.0			*
*	Last Mod:	11/26/82		*
*						*
*************************************************
*/



/*
*************************************************
*						*
*	   	STANDARD HEADERS		*
*						*
*************************************************
*/

#include "unstdsys.h"
#include "zooequ.h"
#include "chnequ.h"

/*
*************************************************
*						*
*	EXTERNAL DECLARATIONS			*
*						*
*************************************************
*/

extern	BYTE	gb_word();
extern	BYTE	gb_long();
extern		pb_word();
extern		pb_long();

extern	WORD	bytlen;
extern	WORD	wrdlen;
extern	WORD	lnglen;

/*
*************************************************
*						*
*	 Byte Ordering Arrays For		*
*	     Word and Long			*
*						*
*************************************************
*/

static	BYTE	wrdtab[2] = {1, 0};
static	WORD	lngtab[4] = {3, 2, 1, 0};

/*
*************************************************
*						*
*	Machine dependent entities		*
*						*
*************************************************
*/

WORD	bytlen = 1;
WORD	wrdlen = 2;
WORD	lnglen = 4;

/*
*************************************************
*						*
*	Port Addresses for Zoom Board		*
*						*
*************************************************
*/

WORD	fiodat	= 0x0001;	/* Values for Zoom side	*/
WORD	fioctl	= 0x0003;	/* only.		*/

/*
*************************************************
*						*
*	     Memory Region Table		*
*						*
*************************************************
*/

/*  The following table describes two memory regions:		*/
/*  Region 1	Type:	Separated instruction and data space	*/
/*		Length:	64k I space, 64k D space, 128k total.	*/ 
/*		Base:	<<42>>					*/
/*								*/
/*  Region 2	Type:	Merged instruction and data space	*/
/*		Length:	64k combined space.			*/
/*		Base:	<<1>>					*/
/*								*/
/*  Notes	This table is machine dependent (ZOOM board), 	*/
/*		but not processor dependent.			*/
/*		Table does not include system segment.		*/
/*		Table should probably be removed to module of	*/
/*		machine dependent code and data.		*/

/*	********* This is the real memory region table ********	*/

/*
struct	mrt	{
			int count;
			struct	{long tpalow;
				 long tpalen;
				}	regions[2];
		}	memtab = {2, 
					{{0x42000000L, 0x1ffffL},
					 {0x01000000L, 0x0ffffL}
					}
				 };
*/

/*	******** This is a kludge table for use with 	******	*/
/*	******** flaky zoom board hardware.		******	*/

struct	mrt	{
			int count;
			struct	{long tpalow;
				 long tpalen;
				}	regions[2];
		}	memtab = {2, 
					{{0x42000000L, 0x1ffffL},
					 {0x02000000L, 0x0ffffL}
					}
				 };

/*
*****************************************
*					*
*	      gb_word():		*
*        Retrieve a specified		*
*	   byte from a word		*
*					*
*****************************************
/
/	Inputs:		Address of word
/			Byte number
/	Outputs:	Byte corresponding to 
/			byte number in word
*/

BYTE	gb_word(pbyte, i)

BYTE 	*pbyte;
WORD 	i;
{
	return(pbyte[wrdtab[i]]);
}	

/*
*****************************************
*					*
*	      gb_long():		*
*        Retrieve a specified		*
*	   byte from a long		*
*					*
*****************************************
/
/
/	Inputs:		Address of long
/			Byte number
/	Outputs:	Byte corresponding to 
/			byte number in long
*/

BYTE	gb_long(pbyte, i)

BYTE	*pbyte;
WORD	i;
{
	return(pbyte[lngtab[i]]);
}	

/*
*****************************************
*					*
*	      pb_word():		*
*          Place a specified		*
*	   byte into a word		*
*					*
*****************************************
/
/
/	Inputs:		Byte to be place
/			Address of word
/			Byte number
/	Outputs:	None
*/

pb_word(sbyte, pbyte, i)

BYTE 	sbyte, *pbyte;
WORD 	i;
{
	pbyte[wrdtab[i]] = sbyte;
}	

/*
*****************************************
*					*
*	      pb_long():		*
*          Place a specified		*
*	   byte into a long		*
*					*
*****************************************
/
/
/	Inputs:		Byte to be place
/			Address of long
/			Byte number
/	Outputs:	None
*/

pb_long(sbyte, pbyte, i)

BYTE 	sbyte, *pbyte;
WORD 	i;
{
	pbyte[lngtab[i]] = sbyte;
}	




/*		End of	Modul;
A!2,/****************************************************************************/
/*									    */
/*	                   B A S E P A G E . H                              */
/*	                   -------------------                              */
/*	                                                                    */
/*	This file contains a definition of the CP/M basepage structure,     */
/*	b_page.								    */
/*									    */
/*	NOTE: In the portable CP/M environment, it is NOT guaranteed        */
/*	that the location of the base page is known at link-edit time       */
/*	(as it is, for example, in CP/M-80 and CP/M-86.)  Instead, a        */
/*	pointer to the current basepage is delivered by the BDOS	    */
/*	to each new program which is run.   This pointer, _base, is         */
/*	initialized by the C startup function (startup.s) and is            */
/*	available to C programs as an external.                             */
/*									    */
/*	This file has been modified to live with the BDOS definitions.	    */
/*									    */
/****************************************************************************/

struct b_page
	{
		XADDR		ltpa;		/* Low TPA address	    */	
		XADDR		htpa;		/* High TPA address	    */	
		XADDR		lcode;		/* Start address of code seg*/
		long		codelen;	/* Code segment length	    */
		XADDR		ldata;		/* Start address of data seg*/
		long		datalen;	/* Data segment length	    */
		XADDR		lbss;		/* Start address of bss seg */
		long		bsslen;		/* Bss segment length	    */
		long		freelen;	/* Free segment length	    */
		char		resvd1[20];	/* Reserved area	    */
		struct fcb	fcb2;		/* Second basepage FCB	    */
		struct fcb	fcb1;		/* First basepage FCB	    */
		char		buff[128];	/* Default DMA buffer,	    */
						/*   command line tail	    */
	};
