/* @(#)memreg.h 1.16 88/02/08 SMI */

/*
 * Copyright 1983, 1987 by Sun Microsystems, Inc.
 */

#ifndef	memreg_DEFINED
#define	memreg_DEFINED

/*
 * Rasterop hardware registers.  To do a rasterop set the
 * rasterop function in mrc_op.  Clear mrc_pattern unless
 * a special pattern is desired.
 *
 * Set mrc_shift to cause the source to be properly
 * aligned with the destination:  if words are being processed
 * left-to-right, then mrc_shift should be a positive number
 * between 0 and 15 inclusive; if words are being processed
 * right-to-left, then mrc_shift should be a negative number
 * between -16 and -1 inclusive.  If the first source word
 * does not supply enough data to satisfy the first destination
 * words requirements then load mrc_source1 (in the left-to-right
 * case) or mcr_source2 (in the right-to-left case) with the
 * first source word.
 *
 * Load mrc_mask1 with a mask of the bits not contributed by
 * the first source word (if the width were large), i.e. a
 * mask of high-order bits.  Load mrc_mask2 with a mask of the
 * bits not contributed by the last source word, i.e. a mask
 * of low-order bits.  Set mrc_width to the number of words
 * in the destination line.
 *
 * Then enable the chip and stuff the data through it and
 * finally disable the chip.
 */
struct memropc {
	u_short	mrc_dest;		/* destination register */
	u_short	mrc_source1;		/* source1 register (right) */
	u_short	mrc_source2;		/* source2 register (left) */
	u_short	mrc_pattern;		/* pattern register */
	u_short	mrc_mask1;		/* mask1 register */
	u_short mrc_mask2;		/* mask2 register */
	short	mrc_shift;		/* bit 0..3 shift count for source */
					/* bit 8    sourceload bit */
	short	mrc_op;			/* function */
	short	mrc_width;		/* word width */
	short	mrc_opcount;		/* counts down the width */
	short	mrc_decoderout;		/* decoder output */
	short	mrc_x11;		/* manual load destination (diag)*/
	short	mrc_x12;		/* manual load source (diag) */
	short	mrc_x13;
	short	mrc_x14;
	short	mrc_x15;		/* flags register for applications */
};

/* note: these are not relevant to color boards */
#define	mrc_enable(mrc)		((mrc)->mrc_shift |= 0x100)
#define	mrc_disable(mrc)	((mrc)->mrc_shift &= ~0x100)

/* macros for generating left (mask1) and right (mask2) masks */
#define	mrc_lmask(x)	(0xffff0000 >> (x))
#define	mrc_rmask(x)	(0x7fff >> (x))

#endif
