/************************************************************************/
/* This pal performs address decoding for the 32k address space. IODEC	*/
/* is asserted for all i/o devices. Note that the /dram select does not	*/
/* have the /conf conditioning, this is to ensure that the signal is	*/
/* fast enough to go into a clocked D pal.				*/
/************************************************************************/

#define DESIGNER George Scolaro  (C) 1988,89,90
#define REVISION 02	05/12/88
#define PARTNUM U37

dec32(	in	a31..27,	/* 32532 addresses */
		swap,		/* swap dram & eprom */
		a8,		/* address for int/nmi */
		!ioinh,		/* i/o inhibit */
		!conf;		/* confirmed bus cycle */
	out
		!iodec,		/* i/o device decoded */
		!slows,		/* all the slow peripherals */
		!eprom,		/* eprom select */
		!dram,		/* dram select */
		!scsi,		/* scsi select */
		!icu,		/* icu select */
		!duart,		/* duart select */
		!slow;		/* slow device, needs wait states */
)
{
iodec.oe = 1;
slows.oe = 1;	
eprom.oe = 1;
dram.oe = 1;
scsi.oe = 1;	
icu.oe = 1;
duart.oe = 1;
slow.oe = 1;

int a0..7, a9..26;

[a0..7] = [a9..26] = ?;

group memadr[a31..0];

#define reprom	(memadr[] >= 0x00000000 && memadr[] <= 0x07ffffff)
#define ieprom	(memadr[] >= 0x10000000 && memadr[] <= 0x17ffffff)
#define idramn	(memadr[] >= 0x00000000 && memadr[] <= 0x07ffffff)
#define idramp	(memadr[] >= 0x08000000 && memadr[] <= 0x0fffffff)
#define iduart	(memadr[] >= 0x28000000 && memadr[] <= 0x2fffffff)
#define ipscsi	(memadr[] >= 0x30000000 && memadr[] <= 0x37ffffff)
#define idscsi	(memadr[] >= 0x38000000 && memadr[] <= 0x3fffffff)
#define iiodev	(memadr[] >= 0x20000000 && memadr[] <= 0x37ffffff)
#define iicu	(memadr[] == 0xfffffe00)

slow	= reprom & swap		/* eprom at power on */
	| ieprom 		/* eprom normal */	
	| iduart & !ioinh	/* duart */
	| ipscsi & !ioinh	/* scsi, polled */
	| iicu & !ioinh;	/* icu */

/* slows is used to enable the slow peripheral bus via the 74as646 */

slows	= reprom & swap		/* eprom at power on */
	| ieprom		/* eprom normal */	
	| iduart		/* duart */
	| ipscsi | idscsi	/* scsi */
	| iicu;			/* icu */

duart	= iduart & !ioinh;

scsi	= ipscsi & !ioinh	/* scsi polled */
	| idscsi;		/* scsi dma */

icu	= iicu & conf & !ioinh;

iodec	= iiodev & conf
	| iicu & conf;

dram	= idramn & !swap	/* normal position */
	| idramp &  swap;	/* at power up */

eprom	= reprom & conf & swap	/* at power on */
	| ieprom & conf;	/* normally */

putpart("p16l8", "dec32",
	a31, a30, a29, a28, a27, swap, a8, ioinh, conf, GND,
	_, iodec, slows, eprom, dram, scsi, icu, duart, slow, VCC);
}
