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