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