1219b2ee8SDavid du Colombier #include <u.h>
2219b2ee8SDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <bio.h>
4219b2ee8SDavid du Colombier
5*9a747e4fSDavid du Colombier #include "pci.h"
6219b2ee8SDavid du Colombier #include "vga.h"
7219b2ee8SDavid du Colombier
8219b2ee8SDavid du Colombier /*
9219b2ee8SDavid du Colombier * IBM 8514/A Graphics Coprocessor.
10219b2ee8SDavid du Colombier */
11219b2ee8SDavid du Colombier enum {
12219b2ee8SDavid du Colombier Subsys = 0x42E8, /* Subsystem Status (R), Control (W) */
13219b2ee8SDavid du Colombier Advfunc = 0x4AE8, /* Advanced Function Control */
14219b2ee8SDavid du Colombier CurY = 0x82E8, /* Current Y Position */
15219b2ee8SDavid du Colombier CurX = 0x86E8, /* Current X Position */
16219b2ee8SDavid du Colombier DestyAxstp = 0x8AE8, /* Destination Y Position/Axial Step Constant */
17219b2ee8SDavid du Colombier DestxDiastp = 0x8EE8, /* Destination X Position/Diagonal Step Constant */
18219b2ee8SDavid du Colombier ErrTerm = 0x92E8, /* Error Term */
19219b2ee8SDavid du Colombier MajAxisPcnt = 0x96E8, /* Major Axis Pixel Count */
20219b2ee8SDavid du Colombier GPstat = 0x9AE8, /* Graphics Processor Status (R) */
21219b2ee8SDavid du Colombier Cmd = 0x9AE8, /* Drawing Command (W) */
22219b2ee8SDavid du Colombier ShortStroke = 0x9EE8, /* Short Stroke Vector (W) */
23219b2ee8SDavid du Colombier BkgdColor = 0xA2E8, /* Background Colour */
24219b2ee8SDavid du Colombier FrgdColor = 0xA6E8, /* Foreground Colour */
25219b2ee8SDavid du Colombier WrtMask = 0xAAE8, /* Bitplane Write Mask */
26219b2ee8SDavid du Colombier RdMask = 0xAEE8, /* Bitplane Read Mask */
27219b2ee8SDavid du Colombier ColorCmp = 0xB2E8, /* Colour Compare */
28219b2ee8SDavid du Colombier BkgdMix = 0xB6E8, /* Background Mix */
29219b2ee8SDavid du Colombier FrgdMix = 0xBAE8, /* Foreground Mix */
30219b2ee8SDavid du Colombier Multifunc = 0xBEE8, /* Multifunction Control */
31219b2ee8SDavid du Colombier PixTrans = 0xE2E8, /* Pixel Data Transfer */
32219b2ee8SDavid du Colombier };
33219b2ee8SDavid du Colombier
34219b2ee8SDavid du Colombier enum { /* Multifunc Index */
35219b2ee8SDavid du Colombier MinAxisPcnt = 0x0000, /* Minor Axis Pixel Count */
36219b2ee8SDavid du Colombier ScissorsT = 0x1000, /* Top Scissors */
37219b2ee8SDavid du Colombier ScissorsL = 0x2000, /* Left Scissors */
38219b2ee8SDavid du Colombier ScissorsB = 0x3000, /* Bottom Scissors */
39219b2ee8SDavid du Colombier ScissorsR = 0x4000, /* Right Scissors */
40219b2ee8SDavid du Colombier MemCntl = 0x5000, /* Memory Control */
41219b2ee8SDavid du Colombier PixCntl = 0xA000, /* Pixel Control */
42219b2ee8SDavid du Colombier MultMisc = 0xE000, /* Miscellaneous Multifunction Control (S3) */
43219b2ee8SDavid du Colombier ReadSel = 0xF000, /* Read Register Select (S3) */
44219b2ee8SDavid du Colombier };
45219b2ee8SDavid du Colombier
46219b2ee8SDavid du Colombier static void
load(Vga * vga,Ctlr *)477dd7cddfSDavid du Colombier load(Vga* vga, Ctlr*)
48219b2ee8SDavid du Colombier {
49219b2ee8SDavid du Colombier outportw(Pixmask, 0x00);
50219b2ee8SDavid du Colombier outportw(Subsys, 0x8000|0x1000);
51219b2ee8SDavid du Colombier outportw(Subsys, 0x4000|0x1000);
52219b2ee8SDavid du Colombier outportw(Pixmask, 0xFF);
53219b2ee8SDavid du Colombier
54219b2ee8SDavid du Colombier outportw(FrgdMix, 0x47);
55219b2ee8SDavid du Colombier outportw(BkgdMix, 0x07);
56219b2ee8SDavid du Colombier
57219b2ee8SDavid du Colombier outportw(Multifunc, ScissorsT|0x000);
58219b2ee8SDavid du Colombier outportw(Multifunc, ScissorsL|0x000);
597dd7cddfSDavid du Colombier outportw(Multifunc, ScissorsB|(vga->vmz/vga->mode->x-1));
60219b2ee8SDavid du Colombier outportw(Multifunc, ScissorsR|(vga->mode->x-1));
61219b2ee8SDavid du Colombier
62219b2ee8SDavid du Colombier outportw(WrtMask, 0xFFFF);
63219b2ee8SDavid du Colombier outportw(Multifunc, PixCntl|0x0000);
64219b2ee8SDavid du Colombier }
65219b2ee8SDavid du Colombier
66219b2ee8SDavid du Colombier static void
dump(Vga *,Ctlr * ctlr)677dd7cddfSDavid du Colombier dump(Vga*, Ctlr* ctlr)
68219b2ee8SDavid du Colombier {
69219b2ee8SDavid du Colombier printitem(ctlr->name, "Advfunc");
707dd7cddfSDavid du Colombier Bprint(&stdout, "%9.4uX\n", inportw(Advfunc));
71219b2ee8SDavid du Colombier printitem(ctlr->name, "Subsys");
727dd7cddfSDavid du Colombier Bprint(&stdout, "%9.4uX\n", inportw(Subsys));
73219b2ee8SDavid du Colombier }
74219b2ee8SDavid du Colombier
75219b2ee8SDavid du Colombier Ctlr ibm8514 = {
76219b2ee8SDavid du Colombier "ibm8514", /* name */
77219b2ee8SDavid du Colombier 0, /* snarf */
78219b2ee8SDavid du Colombier 0, /* options */
79219b2ee8SDavid du Colombier 0, /* init */
80219b2ee8SDavid du Colombier load, /* load */
81219b2ee8SDavid du Colombier dump, /* dump */
82219b2ee8SDavid du Colombier };
83