xref: /plan9-contrib/sys/src/9k/k10/vgax.c (revision 45e6af3b6d7025ef7184352bb3f6852edd8de07e)
1*45e6af3bSDavid du Colombier #include "u.h"
2*45e6af3bSDavid du Colombier #include "../port/lib.h"
3*45e6af3bSDavid du Colombier #include "mem.h"
4*45e6af3bSDavid du Colombier #include "dat.h"
5*45e6af3bSDavid du Colombier #include "fns.h"
6*45e6af3bSDavid du Colombier #include "io.h"
7*45e6af3bSDavid du Colombier #include "../port/error.h"
8*45e6af3bSDavid du Colombier 
9*45e6af3bSDavid du Colombier #define	Image	IMAGE
10*45e6af3bSDavid du Colombier #include <draw.h>
11*45e6af3bSDavid du Colombier #include <memdraw.h>
12*45e6af3bSDavid du Colombier #include <cursor.h>
13*45e6af3bSDavid du Colombier #include "screen.h"
14*45e6af3bSDavid du Colombier 
15*45e6af3bSDavid du Colombier static Lock vgaxlock;			/* access to index registers */
16*45e6af3bSDavid du Colombier 
17*45e6af3bSDavid du Colombier int
vgaxi(long port,uchar index)18*45e6af3bSDavid du Colombier vgaxi(long port, uchar index)
19*45e6af3bSDavid du Colombier {
20*45e6af3bSDavid du Colombier 	uchar data;
21*45e6af3bSDavid du Colombier 
22*45e6af3bSDavid du Colombier 	ilock(&vgaxlock);
23*45e6af3bSDavid du Colombier 	switch(port){
24*45e6af3bSDavid du Colombier 
25*45e6af3bSDavid du Colombier 	case Seqx:
26*45e6af3bSDavid du Colombier 	case Crtx:
27*45e6af3bSDavid du Colombier 	case Grx:
28*45e6af3bSDavid du Colombier 		outb(port, index);
29*45e6af3bSDavid du Colombier 		data = inb(port+1);
30*45e6af3bSDavid du Colombier 		break;
31*45e6af3bSDavid du Colombier 
32*45e6af3bSDavid du Colombier 	case Attrx:
33*45e6af3bSDavid du Colombier 		/*
34*45e6af3bSDavid du Colombier 		 * Allow processor access to the colour
35*45e6af3bSDavid du Colombier 		 * palette registers. Writes to Attrx must
36*45e6af3bSDavid du Colombier 		 * be preceded by a read from Status1 to
37*45e6af3bSDavid du Colombier 		 * initialise the register to point to the
38*45e6af3bSDavid du Colombier 		 * index register and not the data register.
39*45e6af3bSDavid du Colombier 		 * Processor access is allowed by turning
40*45e6af3bSDavid du Colombier 		 * off bit 0x20.
41*45e6af3bSDavid du Colombier 		 */
42*45e6af3bSDavid du Colombier 		inb(Status1);
43*45e6af3bSDavid du Colombier 		if(index < 0x10){
44*45e6af3bSDavid du Colombier 			outb(Attrx, index);
45*45e6af3bSDavid du Colombier 			data = inb(Attrx+1);
46*45e6af3bSDavid du Colombier 			inb(Status1);
47*45e6af3bSDavid du Colombier 			outb(Attrx, 0x20|index);
48*45e6af3bSDavid du Colombier 		}
49*45e6af3bSDavid du Colombier 		else{
50*45e6af3bSDavid du Colombier 			outb(Attrx, 0x20|index);
51*45e6af3bSDavid du Colombier 			data = inb(Attrx+1);
52*45e6af3bSDavid du Colombier 		}
53*45e6af3bSDavid du Colombier 		break;
54*45e6af3bSDavid du Colombier 
55*45e6af3bSDavid du Colombier 	default:
56*45e6af3bSDavid du Colombier 		iunlock(&vgaxlock);
57*45e6af3bSDavid du Colombier 		return -1;
58*45e6af3bSDavid du Colombier 	}
59*45e6af3bSDavid du Colombier 	iunlock(&vgaxlock);
60*45e6af3bSDavid du Colombier 
61*45e6af3bSDavid du Colombier 	return data & 0xFF;
62*45e6af3bSDavid du Colombier }
63*45e6af3bSDavid du Colombier 
64*45e6af3bSDavid du Colombier int
vgaxo(long port,uchar index,uchar data)65*45e6af3bSDavid du Colombier vgaxo(long port, uchar index, uchar data)
66*45e6af3bSDavid du Colombier {
67*45e6af3bSDavid du Colombier 	ilock(&vgaxlock);
68*45e6af3bSDavid du Colombier 	switch(port){
69*45e6af3bSDavid du Colombier 
70*45e6af3bSDavid du Colombier 	case Seqx:
71*45e6af3bSDavid du Colombier 	case Crtx:
72*45e6af3bSDavid du Colombier 	case Grx:
73*45e6af3bSDavid du Colombier 		/*
74*45e6af3bSDavid du Colombier 		 * We could use an outport here, but some chips
75*45e6af3bSDavid du Colombier 		 * (e.g. 86C928) have trouble with that for some
76*45e6af3bSDavid du Colombier 		 * registers.
77*45e6af3bSDavid du Colombier 		 */
78*45e6af3bSDavid du Colombier 		outb(port, index);
79*45e6af3bSDavid du Colombier 		outb(port+1, data);
80*45e6af3bSDavid du Colombier 		break;
81*45e6af3bSDavid du Colombier 
82*45e6af3bSDavid du Colombier 	case Attrx:
83*45e6af3bSDavid du Colombier 		inb(Status1);
84*45e6af3bSDavid du Colombier 		if(index < 0x10){
85*45e6af3bSDavid du Colombier 			outb(Attrx, index);
86*45e6af3bSDavid du Colombier 			outb(Attrx, data);
87*45e6af3bSDavid du Colombier 			inb(Status1);
88*45e6af3bSDavid du Colombier 			outb(Attrx, 0x20|index);
89*45e6af3bSDavid du Colombier 		}
90*45e6af3bSDavid du Colombier 		else{
91*45e6af3bSDavid du Colombier 			outb(Attrx, 0x20|index);
92*45e6af3bSDavid du Colombier 			outb(Attrx, data);
93*45e6af3bSDavid du Colombier 		}
94*45e6af3bSDavid du Colombier 		break;
95*45e6af3bSDavid du Colombier 
96*45e6af3bSDavid du Colombier 	default:
97*45e6af3bSDavid du Colombier 		iunlock(&vgaxlock);
98*45e6af3bSDavid du Colombier 		return -1;
99*45e6af3bSDavid du Colombier 	}
100*45e6af3bSDavid du Colombier 	iunlock(&vgaxlock);
101*45e6af3bSDavid du Colombier 
102*45e6af3bSDavid du Colombier 	return 0;
103*45e6af3bSDavid du Colombier }
104