@@ 225,10 225,13 @@ dumpmodes(void) {
}
#endif
+uchar *pad1, *pad2;
+
void
setscreen(int maxx, int maxy, int ldepth)
{
int len;
+ uchar *p;
mbb = NULLMBB;
@@ 255,9 258,16 @@ setscreen(int maxx, int maxy, int ldepth)
len = gscreen.width * BY2WD * maxy;
if(gscreen.base){
free(gscreen.base);
- gscreen.base = ((ulong*)smalloc(len+2*1024))+256;
- } else
- gscreen.base = ((ulong*)malloc(len+2*1024))+256;
+ p = smalloc(len+2*1024));
+ gscreen.base = ((ulong*)p) + 256;
+ } else {
+ p = malloc(len+2*1024));
+ gscreen.base = ((ulong*)p) + 256;
+ }
+ pad1 = p;
+ pad2 = p + len + 1024;
+ memset(pad1, 0, 1024);
+ memset(pad2, 0, 1024);
memset((char*)gscreen.base, 0xff, len);
/*
@@ 268,6 278,13 @@ setscreen(int maxx, int maxy, int ldepth)
out.bwid = defont0.info[' '].width;
}
+int
+colourxpnd(int x)
+{
+ x &= 3;
+ return (x<<4)|(x<<2)|x;
+}
+
void
screeninit(void)
{
@@ 303,15 320,22 @@ screeninit(void)
setscreen(conf.maxx, conf.maxy, conf.ldepth);
/*
- * set up default grey scale color map
+ * set up color map
*/
outb(CMWX, 0);
for(i = 0; i < 16; i++){
- x = (i*63)/15;
- outb(CM, x);
- outb(CM, x);
- outb(CM, x);
+ outb(CM, colourxpnd(i<<1));
+ outb(CM, colourxpnd(i>>2));
+ outb(CM, colourxpnd(i&~1));
}
+ outb(CMWX, 5);
+ outb(CM, 21);
+ outb(CM, 21);
+ outb(CM, 21);
+ outb(CMWX, 0xa);
+ outb(CM, 42);
+ outb(CM, 42);
+ outb(CM, 42);
}
/*
@@ 344,6 368,12 @@ mbbpt(Point p)
mbb.max.y = p.y+1;
}
+void
+unlocktseng(void) {
+ outb(0x3bf, 0x03);
+ outb(0x3d8, 0xa0);
+}
+
/*
* copy litte endian soft screen to big endian hard screen
*/
@@ 351,7 381,7 @@ void
screenupdate(void)
{
uchar *sp, *hp;
- int y, len, incs, inch, bits, off;
+ int y, len, incs, inch, off, page, y2pg, ey;
Rectangle r;
r = mbb;
@@ 369,21 399,18 @@ screenupdate(void)
if(r.max.y > gscreen.r.max.y)
r.max.y = gscreen.r.max.y;
- bits = 1<<vgascreen.ldepth;
- off = (r.min.x*bits)>>(3-vgascreen.ldepth);
- hp = (uchar*)(vgascreen.base+(r.min.y*vgascreen.width)) + off;
- off <<= gscreen.ldepth - vgascreen.ldepth;
- sp = (uchar*)(gscreen.base+(r.min.y*gscreen.width)) + off;
- len = (r.max.x*bits + 7)/8 - (r.min.x*bits)/8;
- if(len <= 0)
- return;
-
incs = gscreen.width * BY2WD;
inch = vgascreen.width * BY2WD;
switch(gscreen.ldepth){
case 0:
- case 3:
+ off = r.min.x>>3;
+ hp = (uchar*)(vgascreen.base+(r.min.y*vgascreen.width)) + off;
+ sp = (uchar*)(gscreen.base+(r.min.y*gscreen.width)) + off;
+ len = (r.max.x + 7)/8 - r.min.x/8;
+ if(len < 1)
+ return;
+
/* reverse the bits */
for (y = r.min.y; y < r.max.y; y++){
l0update(sp, hp, len);
@@ 392,13 419,60 @@ screenupdate(void)
}
break;
case 1:
- /* reverse the bits and split into 2 bitmaps */
+ r.min.x &= ~15; /* 16 bit allignment for l1update() */
+ off = r.min.x>>3;
+ hp = (uchar*)(vgascreen.base+(r.min.y*vgascreen.width)) + off;
+ sp = (uchar*)(gscreen.base+(r.min.y*gscreen.width)) + 2*off;
+ len = (r.max.x + 15)/8 - r.min.x/8;
+ if(len < 2)
+ len = 2;
+
+ /* reverse the bits and split into 2 bit planes */
for (y = r.min.y; y < r.max.y; y++){
l1update(sp, hp, len);
sp += incs;
hp += inch;
}
break;
+ case 2:
+ off = r.min.x>>3;
+ hp = (uchar*)(vgascreen.base+(r.min.y*vgascreen.width)) + off;
+ sp = (uchar*)(gscreen.base+(r.min.y*gscreen.width)) + 4*off;
+ len = (r.max.x + 7)/8 - r.min.x/8;
+ if(len < 1)
+ len = 1;
+
+ /* reverse the bits and split into 2 bit planes */
+ for (y = r.min.y; y < r.max.y; y++){
+ l2update(sp, hp, len);
+ sp += incs;
+ hp += inch;
+ }
+ break;
+ case 3:
+ y2pg = (64*1024/BY2WD)/gscreen.width;
+ off = (r.min.y % y2pg) * gscreen.width * BY2WD + r.min.x;
+ hp = (uchar*)(vgascreen.base) + off;
+ sp = (uchar*)(gscreen.base) + off;
+ len = r.max.x - r.min.x;
+ if(len < 1)
+ return;
+
+ y = r.min.y;
+ for(page = y/y2pg; y < r.max.y; page++){
+ unlocktseng();
+ outb(0x3cd, (page<<4)|page);
+ ey = (page+1)*y2pg;
+ if(ey > r.max.y)
+ ey = r.max.y;
+ for (; y < ey; y++){
+ memmove(sp, hp, len);
+ sp += incs;
+ hp += inch;
+ }
+ hp = (uchar*)(vgascreen.base) + r.min.x;
+ }
+ break;
}
}
@@ 552,44 626,96 @@ bigcursor(void)
* if the bits in uchar x are labeled
* 76543210
* then l1revsep[x] yields a ushort with bits
- * ____0246____1357
+ * ________0246________1357
* where _ represents a bit whose value is 0.
*
* This table is used by l1update() in l.s. l1update is implemented
- * in assembler for speed (yech).
+ * in assembler for speed.
+ *
+ */
+ulong l1revsep[] =
+{
+ 0x00000, 0x80000, 0x00008, 0x80008, 0x40000, 0xc0000, 0x40008, 0xc0008,
+ 0x00004, 0x80004, 0x0000c, 0x8000c, 0x40004, 0xc0004, 0x4000c, 0xc000c,
+ 0x20000, 0xa0000, 0x20008, 0xa0008, 0x60000, 0xe0000, 0x60008, 0xe0008,
+ 0x20004, 0xa0004, 0x2000c, 0xa000c, 0x60004, 0xe0004, 0x6000c, 0xe000c,
+ 0x00002, 0x80002, 0x0000a, 0x8000a, 0x40002, 0xc0002, 0x4000a, 0xc000a,
+ 0x00006, 0x80006, 0x0000e, 0x8000e, 0x40006, 0xc0006, 0x4000e, 0xc000e,
+ 0x20002, 0xa0002, 0x2000a, 0xa000a, 0x60002, 0xe0002, 0x6000a, 0xe000a,
+ 0x20006, 0xa0006, 0x2000e, 0xa000e, 0x60006, 0xe0006, 0x6000e, 0xe000e,
+ 0x10000, 0x90000, 0x10008, 0x90008, 0x50000, 0xd0000, 0x50008, 0xd0008,
+ 0x10004, 0x90004, 0x1000c, 0x9000c, 0x50004, 0xd0004, 0x5000c, 0xd000c,
+ 0x30000, 0xb0000, 0x30008, 0xb0008, 0x70000, 0xf0000, 0x70008, 0xf0008,
+ 0x30004, 0xb0004, 0x3000c, 0xb000c, 0x70004, 0xf0004, 0x7000c, 0xf000c,
+ 0x10002, 0x90002, 0x1000a, 0x9000a, 0x50002, 0xd0002, 0x5000a, 0xd000a,
+ 0x10006, 0x90006, 0x1000e, 0x9000e, 0x50006, 0xd0006, 0x5000e, 0xd000e,
+ 0x30002, 0xb0002, 0x3000a, 0xb000a, 0x70002, 0xf0002, 0x7000a, 0xf000a,
+ 0x30006, 0xb0006, 0x3000e, 0xb000e, 0x70006, 0xf0006, 0x7000e, 0xf000e,
+ 0x00001, 0x80001, 0x00009, 0x80009, 0x40001, 0xc0001, 0x40009, 0xc0009,
+ 0x00005, 0x80005, 0x0000d, 0x8000d, 0x40005, 0xc0005, 0x4000d, 0xc000d,
+ 0x20001, 0xa0001, 0x20009, 0xa0009, 0x60001, 0xe0001, 0x60009, 0xe0009,
+ 0x20005, 0xa0005, 0x2000d, 0xa000d, 0x60005, 0xe0005, 0x6000d, 0xe000d,
+ 0x00003, 0x80003, 0x0000b, 0x8000b, 0x40003, 0xc0003, 0x4000b, 0xc000b,
+ 0x00007, 0x80007, 0x0000f, 0x8000f, 0x40007, 0xc0007, 0x4000f, 0xc000f,
+ 0x20003, 0xa0003, 0x2000b, 0xa000b, 0x60003, 0xe0003, 0x6000b, 0xe000b,
+ 0x20007, 0xa0007, 0x2000f, 0xa000f, 0x60007, 0xe0007, 0x6000f, 0xe000f,
+ 0x10001, 0x90001, 0x10009, 0x90009, 0x50001, 0xd0001, 0x50009, 0xd0009,
+ 0x10005, 0x90005, 0x1000d, 0x9000d, 0x50005, 0xd0005, 0x5000d, 0xd000d,
+ 0x30001, 0xb0001, 0x30009, 0xb0009, 0x70001, 0xf0001, 0x70009, 0xf0009,
+ 0x30005, 0xb0005, 0x3000d, 0xb000d, 0x70005, 0xf0005, 0x7000d, 0xf000d,
+ 0x10003, 0x90003, 0x1000b, 0x9000b, 0x50003, 0xd0003, 0x5000b, 0xd000b,
+ 0x10007, 0x90007, 0x1000f, 0x9000f, 0x50007, 0xd0007, 0x5000f, 0xd000f,
+ 0x30003, 0xb0003, 0x3000b, 0xb000b, 0x70003, 0xf0003, 0x7000b, 0xf000b,
+ 0x30007, 0xb0007, 0x3000f, 0xb000f, 0x70007, 0xf0007, 0x7000f, 0xf000f,
+};
+
+/*
+ * Table for separating and reversing bits in a ldepth 2 bitmap.
+ * This aids in coverting a little endian ldepth 1 bitmap into the
+ * 4 big-endian ldepth 0 bitmaps used for the VGA bit planes.
+ *
+ * if the bits in uchar x are labeled
+ * 76543210
+ * then l1revsep[x] yields a ushort with bits
+ * ______04______15______26______37
+ * where _ represents a bit whose value is 0.
+ *
+ * This table is used by l2update() in l.s. l2update is implemented
+ * in assembler for speed.
*
*/
-ushort l1revsep[] = {
- 0x0000, 0x0800, 0x0008, 0x0808, 0x0400, 0x0c00, 0x0408, 0x0c08,
- 0x0004, 0x0804, 0x000c, 0x080c, 0x0404, 0x0c04, 0x040c, 0x0c0c,
- 0x0200, 0x0a00, 0x0208, 0x0a08, 0x0600, 0x0e00, 0x0608, 0x0e08,
- 0x0204, 0x0a04, 0x020c, 0x0a0c, 0x0604, 0x0e04, 0x060c, 0x0e0c,
- 0x0002, 0x0802, 0x000a, 0x080a, 0x0402, 0x0c02, 0x040a, 0x0c0a,
- 0x0006, 0x0806, 0x000e, 0x080e, 0x0406, 0x0c06, 0x040e, 0x0c0e,
- 0x0202, 0x0a02, 0x020a, 0x0a0a, 0x0602, 0x0e02, 0x060a, 0x0e0a,
- 0x0206, 0x0a06, 0x020e, 0x0a0e, 0x0606, 0x0e06, 0x060e, 0x0e0e,
- 0x0100, 0x0900, 0x0108, 0x0908, 0x0500, 0x0d00, 0x0508, 0x0d08,
- 0x0104, 0x0904, 0x010c, 0x090c, 0x0504, 0x0d04, 0x050c, 0x0d0c,
- 0x0300, 0x0b00, 0x0308, 0x0b08, 0x0700, 0x0f00, 0x0708, 0x0f08,
- 0x0304, 0x0b04, 0x030c, 0x0b0c, 0x0704, 0x0f04, 0x070c, 0x0f0c,
- 0x0102, 0x0902, 0x010a, 0x090a, 0x0502, 0x0d02, 0x050a, 0x0d0a,
- 0x0106, 0x0906, 0x010e, 0x090e, 0x0506, 0x0d06, 0x050e, 0x0d0e,
- 0x0302, 0x0b02, 0x030a, 0x0b0a, 0x0702, 0x0f02, 0x070a, 0x0f0a,
- 0x0306, 0x0b06, 0x030e, 0x0b0e, 0x0706, 0x0f06, 0x070e, 0x0f0e,
- 0x0001, 0x0801, 0x0009, 0x0809, 0x0401, 0x0c01, 0x0409, 0x0c09,
- 0x0005, 0x0805, 0x000d, 0x080d, 0x0405, 0x0c05, 0x040d, 0x0c0d,
- 0x0201, 0x0a01, 0x0209, 0x0a09, 0x0601, 0x0e01, 0x0609, 0x0e09,
- 0x0205, 0x0a05, 0x020d, 0x0a0d, 0x0605, 0x0e05, 0x060d, 0x0e0d,
- 0x0003, 0x0803, 0x000b, 0x080b, 0x0403, 0x0c03, 0x040b, 0x0c0b,
- 0x0007, 0x0807, 0x000f, 0x080f, 0x0407, 0x0c07, 0x040f, 0x0c0f,
- 0x0203, 0x0a03, 0x020b, 0x0a0b, 0x0603, 0x0e03, 0x060b, 0x0e0b,
- 0x0207, 0x0a07, 0x020f, 0x0a0f, 0x0607, 0x0e07, 0x060f, 0x0e0f,
- 0x0101, 0x0901, 0x0109, 0x0909, 0x0501, 0x0d01, 0x0509, 0x0d09,
- 0x0105, 0x0905, 0x010d, 0x090d, 0x0505, 0x0d05, 0x050d, 0x0d0d,
- 0x0301, 0x0b01, 0x0309, 0x0b09, 0x0701, 0x0f01, 0x0709, 0x0f09,
- 0x0305, 0x0b05, 0x030d, 0x0b0d, 0x0705, 0x0f05, 0x070d, 0x0f0d,
- 0x0103, 0x0903, 0x010b, 0x090b, 0x0503, 0x0d03, 0x050b, 0x0d0b,
- 0x0107, 0x0907, 0x010f, 0x090f, 0x0507, 0x0d07, 0x050f, 0x0d0f,
- 0x0303, 0x0b03, 0x030b, 0x0b0b, 0x0703, 0x0f03, 0x070b, 0x0f0b,
- 0x0307, 0x0b07, 0x030f, 0x0b0f, 0x0707, 0x0f07, 0x070f, 0x0f0f,
+ulong l2revsep[] =
+{
+ 0x0000000, 0x2000000, 0x0020000, 0x2020000, 0x0000200, 0x2000200, 0x0020200, 0x2020200,
+ 0x0000002, 0x2000002, 0x0020002, 0x2020002, 0x0000202, 0x2000202, 0x0020202, 0x2020202,
+ 0x1000000, 0x3000000, 0x1020000, 0x3020000, 0x1000200, 0x3000200, 0x1020200, 0x3020200,
+ 0x1000002, 0x3000002, 0x1020002, 0x3020002, 0x1000202, 0x3000202, 0x1020202, 0x3020202,
+ 0x0010000, 0x2010000, 0x0030000, 0x2030000, 0x0010200, 0x2010200, 0x0030200, 0x2030200,
+ 0x0010002, 0x2010002, 0x0030002, 0x2030002, 0x0010202, 0x2010202, 0x0030202, 0x2030202,
+ 0x1010000, 0x3010000, 0x1030000, 0x3030000, 0x1010200, 0x3010200, 0x1030200, 0x3030200,
+ 0x1010002, 0x3010002, 0x1030002, 0x3030002, 0x1010202, 0x3010202, 0x1030202, 0x3030202,
+ 0x0000100, 0x2000100, 0x0020100, 0x2020100, 0x0000300, 0x2000300, 0x0020300, 0x2020300,
+ 0x0000102, 0x2000102, 0x0020102, 0x2020102, 0x0000302, 0x2000302, 0x0020302, 0x2020302,
+ 0x1000100, 0x3000100, 0x1020100, 0x3020100, 0x1000300, 0x3000300, 0x1020300, 0x3020300,
+ 0x1000102, 0x3000102, 0x1020102, 0x3020102, 0x1000302, 0x3000302, 0x1020302, 0x3020302,
+ 0x0010100, 0x2010100, 0x0030100, 0x2030100, 0x0010300, 0x2010300, 0x0030300, 0x2030300,
+ 0x0010102, 0x2010102, 0x0030102, 0x2030102, 0x0010302, 0x2010302, 0x0030302, 0x2030302,
+ 0x1010100, 0x3010100, 0x1030100, 0x3030100, 0x1010300, 0x3010300, 0x1030300, 0x3030300,
+ 0x1010102, 0x3010102, 0x1030102, 0x3030102, 0x1010302, 0x3010302, 0x1030302, 0x3030302,
+ 0x0000001, 0x2000001, 0x0020001, 0x2020001, 0x0000201, 0x2000201, 0x0020201, 0x2020201,
+ 0x0000003, 0x2000003, 0x0020003, 0x2020003, 0x0000203, 0x2000203, 0x0020203, 0x2020203,
+ 0x1000001, 0x3000001, 0x1020001, 0x3020001, 0x1000201, 0x3000201, 0x1020201, 0x3020201,
+ 0x1000003, 0x3000003, 0x1020003, 0x3020003, 0x1000203, 0x3000203, 0x1020203, 0x3020203,
+ 0x0010001, 0x2010001, 0x0030001, 0x2030001, 0x0010201, 0x2010201, 0x0030201, 0x2030201,
+ 0x0010003, 0x2010003, 0x0030003, 0x2030003, 0x0010203, 0x2010203, 0x0030203, 0x2030203,
+ 0x1010001, 0x3010001, 0x1030001, 0x3030001, 0x1010201, 0x3010201, 0x1030201, 0x3030201,
+ 0x1010003, 0x3010003, 0x1030003, 0x3030003, 0x1010203, 0x3010203, 0x1030203, 0x3030203,
+ 0x0000101, 0x2000101, 0x0020101, 0x2020101, 0x0000301, 0x2000301, 0x0020301, 0x2020301,
+ 0x0000103, 0x2000103, 0x0020103, 0x2020103, 0x0000303, 0x2000303, 0x0020303, 0x2020303,
+ 0x1000101, 0x3000101, 0x1020101, 0x3020101, 0x1000301, 0x3000301, 0x1020301, 0x3020301,
+ 0x1000103, 0x3000103, 0x1020103, 0x3020103, 0x1000303, 0x3000303, 0x1020303, 0x3020303,
+ 0x0010101, 0x2010101, 0x0030101, 0x2030101, 0x0010301, 0x2010301, 0x0030301, 0x2030301,
+ 0x0010103, 0x2010103, 0x0030103, 0x2030103, 0x0010303, 0x2010303, 0x0030303, 0x2030303,
+ 0x1010101, 0x3010101, 0x1030101, 0x3030101, 0x1010301, 0x3010301, 0x1030301, 0x3030301,
+ 0x1010103, 0x3010103, 0x1030103, 0x3030103, 0x1010303, 0x3010303, 0x1030303, 0x3030303,
};