123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- #include "u.h"
- #include "../port/lib.h"
- #include "mem.h"
- #include "dat.h"
- #include "fns.h"
- #include "io.h"
- #include "../port/error.h"
- #define Image IMAGE
- #include <draw.h>
- #include <memdraw.h>
- #include <cursor.h>
- #include "screen.h"
- static Lock vgaxlock; /* access to index registers */
- int
- vgaxi(long port, uchar index)
- {
- uchar data;
- ilock(&vgaxlock);
- switch(port){
- case Seqx:
- case Crtx:
- case Grx:
- outb(port, index);
- data = inb(port+1);
- break;
- case Attrx:
- /*
- * Allow processor access to the colour
- * palette registers. Writes to Attrx must
- * be preceded by a read from Status1 to
- * initialise the register to point to the
- * index register and not the data register.
- * Processor access is allowed by turning
- * off bit 0x20.
- */
- inb(Status1);
- if(index < 0x10){
- outb(Attrx, index);
- data = inb(Attrx+1);
- inb(Status1);
- outb(Attrx, 0x20|index);
- }
- else{
- outb(Attrx, 0x20|index);
- data = inb(Attrx+1);
- }
- break;
- default:
- iunlock(&vgaxlock);
- return -1;
- }
- iunlock(&vgaxlock);
- return data & 0xFF;
- }
- int
- vgaxo(long port, uchar index, uchar data)
- {
- ilock(&vgaxlock);
- switch(port){
- case Seqx:
- case Crtx:
- case Grx:
- /*
- * We could use an outport here, but some chips
- * (e.g. 86C928) have trouble with that for some
- * registers.
- */
- outb(port, index);
- outb(port+1, data);
- break;
- case Attrx:
- inb(Status1);
- if(index < 0x10){
- outb(Attrx, index);
- outb(Attrx, data);
- inb(Status1);
- outb(Attrx, 0x20|index);
- }
- else{
- outb(Attrx, 0x20|index);
- outb(Attrx, data);
- }
- break;
- default:
- iunlock(&vgaxlock);
- return -1;
- }
- iunlock(&vgaxlock);
- return 0;
- }
|