xref: /plan9/sys/src/cmd/aux/vga/ibm8514.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1*219b2ee8SDavid du Colombier #include <u.h>
2*219b2ee8SDavid du Colombier #include <libc.h>
3*219b2ee8SDavid du Colombier 
4*219b2ee8SDavid du Colombier #include "vga.h"
5*219b2ee8SDavid du Colombier 
6*219b2ee8SDavid du Colombier /*
7*219b2ee8SDavid du Colombier  * IBM 8514/A Graphics Coprocessor.
8*219b2ee8SDavid du Colombier  */
9*219b2ee8SDavid du Colombier enum {
10*219b2ee8SDavid du Colombier 	Subsys		= 0x42E8,	/* Subsystem Status (R), Control (W) */
11*219b2ee8SDavid du Colombier 	Advfunc		= 0x4AE8,	/* Advanced Function Control */
12*219b2ee8SDavid du Colombier 	CurY		= 0x82E8,	/* Current Y Position */
13*219b2ee8SDavid du Colombier 	CurX		= 0x86E8,	/* Current X Position */
14*219b2ee8SDavid du Colombier 	DestyAxstp	= 0x8AE8,	/* Destination Y Position/Axial Step Constant */
15*219b2ee8SDavid du Colombier 	DestxDiastp	= 0x8EE8,	/* Destination X Position/Diagonal Step Constant */
16*219b2ee8SDavid du Colombier 	ErrTerm		= 0x92E8,	/* Error Term */
17*219b2ee8SDavid du Colombier 	MajAxisPcnt	= 0x96E8,	/* Major Axis Pixel Count */
18*219b2ee8SDavid du Colombier 	GPstat		= 0x9AE8,	/* Graphics Processor Status (R) */
19*219b2ee8SDavid du Colombier 	Cmd		= 0x9AE8,	/* Drawing Command (W) */
20*219b2ee8SDavid du Colombier 	ShortStroke	= 0x9EE8,	/* Short Stroke Vector (W) */
21*219b2ee8SDavid du Colombier 	BkgdColor	= 0xA2E8,	/* Background Colour */
22*219b2ee8SDavid du Colombier 	FrgdColor	= 0xA6E8,	/* Foreground Colour */
23*219b2ee8SDavid du Colombier 	WrtMask		= 0xAAE8,	/* Bitplane Write Mask */
24*219b2ee8SDavid du Colombier 	RdMask		= 0xAEE8,	/* Bitplane Read Mask */
25*219b2ee8SDavid du Colombier 	ColorCmp	= 0xB2E8,	/* Colour Compare */
26*219b2ee8SDavid du Colombier 	BkgdMix		= 0xB6E8,	/* Background Mix */
27*219b2ee8SDavid du Colombier 	FrgdMix		= 0xBAE8,	/* Foreground Mix */
28*219b2ee8SDavid du Colombier 	Multifunc	= 0xBEE8,	/* Multifunction Control */
29*219b2ee8SDavid du Colombier 	PixTrans	= 0xE2E8,	/* Pixel Data Transfer */
30*219b2ee8SDavid du Colombier };
31*219b2ee8SDavid du Colombier 
32*219b2ee8SDavid du Colombier enum {					/* Multifunc Index */
33*219b2ee8SDavid du Colombier 	MinAxisPcnt	= 0x0000,	/* Minor Axis Pixel Count */
34*219b2ee8SDavid du Colombier 	ScissorsT	= 0x1000,	/* Top Scissors */
35*219b2ee8SDavid du Colombier 	ScissorsL	= 0x2000,	/* Left Scissors */
36*219b2ee8SDavid du Colombier 	ScissorsB	= 0x3000,	/* Bottom Scissors */
37*219b2ee8SDavid du Colombier 	ScissorsR	= 0x4000,	/* Right Scissors */
38*219b2ee8SDavid du Colombier 	MemCntl		= 0x5000,	/* Memory Control */
39*219b2ee8SDavid du Colombier 	PixCntl		= 0xA000,	/* Pixel Control */
40*219b2ee8SDavid du Colombier 	MultMisc	= 0xE000,	/* Miscellaneous Multifunction Control (S3) */
41*219b2ee8SDavid du Colombier 	ReadSel		= 0xF000,	/* Read Register Select (S3) */
42*219b2ee8SDavid du Colombier };
43*219b2ee8SDavid du Colombier 
44*219b2ee8SDavid du Colombier static void
45*219b2ee8SDavid du Colombier load(Vga *vga, Ctlr *ctlr)
46*219b2ee8SDavid du Colombier {
47*219b2ee8SDavid du Colombier 	verbose("%s->load\n", ctlr->name);
48*219b2ee8SDavid du Colombier 
49*219b2ee8SDavid du Colombier 	outportw(Pixmask, 0x00);
50*219b2ee8SDavid du Colombier 	outportw(Subsys, 0x8000|0x1000);
51*219b2ee8SDavid du Colombier 	outportw(Subsys, 0x4000|0x1000);
52*219b2ee8SDavid du Colombier 	outportw(Pixmask, 0xFF);
53*219b2ee8SDavid du Colombier 
54*219b2ee8SDavid du Colombier 	outportw(FrgdMix, 0x47);
55*219b2ee8SDavid du Colombier 	outportw(BkgdMix, 0x07);
56*219b2ee8SDavid du Colombier 
57*219b2ee8SDavid du Colombier 	outportw(Multifunc, ScissorsT|0x000);
58*219b2ee8SDavid du Colombier 	outportw(Multifunc, ScissorsL|0x000);
59*219b2ee8SDavid du Colombier 	outportw(Multifunc, ScissorsB|(vga->vmb/vga->mode->x-1));
60*219b2ee8SDavid du Colombier 	outportw(Multifunc, ScissorsR|(vga->mode->x-1));
61*219b2ee8SDavid du Colombier 
62*219b2ee8SDavid du Colombier 	outportw(WrtMask, 0xFFFF);
63*219b2ee8SDavid du Colombier 	outportw(Multifunc, PixCntl|0x0000);
64*219b2ee8SDavid du Colombier }
65*219b2ee8SDavid du Colombier 
66*219b2ee8SDavid du Colombier static void
67*219b2ee8SDavid du Colombier dump(Vga *vga, Ctlr *ctlr)
68*219b2ee8SDavid du Colombier {
69*219b2ee8SDavid du Colombier 	USED(vga);
70*219b2ee8SDavid du Colombier 
71*219b2ee8SDavid du Colombier 	printitem(ctlr->name, "Advfunc");
72*219b2ee8SDavid du Colombier 	print("%9.4luX\n", inportw(Advfunc));
73*219b2ee8SDavid du Colombier 	printitem(ctlr->name, "Subsys");
74*219b2ee8SDavid du Colombier 	print("%9.4luX\n", inportw(Subsys));
75*219b2ee8SDavid du Colombier }
76*219b2ee8SDavid du Colombier 
77*219b2ee8SDavid du Colombier Ctlr ibm8514 = {
78*219b2ee8SDavid du Colombier 	"ibm8514",			/* name */
79*219b2ee8SDavid du Colombier 	0,				/* snarf */
80*219b2ee8SDavid du Colombier 	0,				/* options */
81*219b2ee8SDavid du Colombier 	0,				/* init */
82*219b2ee8SDavid du Colombier 	load,				/* load */
83*219b2ee8SDavid du Colombier 	dump,				/* dump */
84*219b2ee8SDavid du Colombier };
85