text: #include <u.h>
  #include <libc.h>
  
  #include "vga.h"
  
  /*
   * IBM 8514/A Graphics Coprocessor.
   */
  enum {
  	Subsys		= 0x42E8,	/* Subsystem Status (R), Control (W) */
  	Advfunc		= 0x4AE8,	/* Advanced Function Control */
  	CurY		= 0x82E8,	/* Current Y Position */
  	CurX		= 0x86E8,	/* Current X Position */
  	DestyAxstp	= 0x8AE8,	/* Destination Y Position/Axial Step Constant */
  	DestxDiastp	= 0x8EE8,	/* Destination X Position/Diagonal Step Constant */
  	ErrTerm		= 0x92E8,	/* Error Term */
  	MajAxisPcnt	= 0x96E8,	/* Major Axis Pixel Count */
  	GPstat		= 0x9AE8,	/* Graphics Processor Status (R) */
  	Cmd		= 0x9AE8,	/* Drawing Command (W) */
  	ShortStroke	= 0x9EE8,	/* Short Stroke Vector (W) */
  	BkgdColor	= 0xA2E8,	/* Background Colour */
  	FrgdColor	= 0xA6E8,	/* Foreground Colour */
  	WrtMask		= 0xAAE8,	/* Bitplane Write Mask */
  	RdMask		= 0xAEE8,	/* Bitplane Read Mask */
  	ColorCmp	= 0xB2E8,	/* Colour Compare */
  	BkgdMix		= 0xB6E8,	/* Background Mix */
  	FrgdMix		= 0xBAE8,	/* Foreground Mix */
  	Multifunc	= 0xBEE8,	/* Multifunction Control */
  	PixTrans	= 0xE2E8,	/* Pixel Data Transfer */
  };
  
  enum {					/* Multifunc Index */
  	MinAxisPcnt	= 0x0000,	/* Minor Axis Pixel Count */
  	ScissorsT	= 0x1000,	/* Top Scissors */
  	ScissorsL	= 0x2000,	/* Left Scissors */
  	ScissorsB	= 0x3000,	/* Bottom Scissors */
  	ScissorsR	= 0x4000,	/* Right Scissors */
  	MemCntl		= 0x5000,	/* Memory Control */
  	PixCntl		= 0xA000,	/* Pixel Control */
  	MultMisc	= 0xE000,	/* Miscellaneous Multifunction Control (S3) */
  	ReadSel		= 0xF000,	/* Read Register Select (S3) */
  };
  
  static void
  load(Vga *vga, Ctlr *ctlr)
  {
  	verbose("%s->load\n", ctlr->name);
  
  	outportw(Pixmask, 0x00);
  	outportw(Subsys, 0x8000|0x1000);
  	outportw(Subsys, 0x4000|0x1000);
  	outportw(Pixmask, 0xFF);
  
  	outportw(FrgdMix, 0x47);
  	outportw(BkgdMix, 0x07);
  
  	outportw(Multifunc, ScissorsT|0x000);
  	outportw(Multifunc, ScissorsL|0x000);
  	outportw(Multifunc, ScissorsB|(vga->vmb/vga->mode->x-1));
  	outportw(Multifunc, ScissorsR|(vga->mode->x-1));
  
  	outportw(WrtMask, 0xFFFF);
  	outportw(Multifunc, PixCntl|0x0000);
  }
  
  static void
  dump(Vga *vga, Ctlr *ctlr)
  {
  	USED(vga);
  
  	printitem(ctlr->name, "Advfunc");
  	print("%9.4luX\n", inportw(Advfunc));
  	printitem(ctlr->name, "Subsys");
  	print("%9.4luX\n", inportw(Subsys));
  }
  
  Ctlr ibm8514 = {
  	"ibm8514",			/* name */
  	0,				/* snarf */
  	0,				/* options */
  	0,				/* init */
  	load,				/* load */
  	dump,				/* dump */
  };
  