From 756cafbf8cfad7be3f99d8b022f105b8fc095c98 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Wed, 11 Nov 1992 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1992-11-11 --- pc/fns.h | 1 + pc/l.s | 82 ++++++++++++++++--- pc/main.c | 2 +- pc/vga.c | 236 +++++++++++++++++++++++++++++++++++++++++------------- 4 files changed, 254 insertions(+), 67 deletions(-) diff --git a/pc/fns.h b/pc/fns.h index bf39bd5c080259b3a627bf637eb2b2d78e7a3744..4474f8d499b9105229eefce5f6f9dbcd3e76b59d 100644 --- a/pc/fns.h +++ b/pc/fns.h @@ -36,6 +36,7 @@ ulong isamem(int); void kbdinit(void); void l0update(uchar*, uchar*, int); void l1update(uchar*, uchar*, int); +void l2update(uchar*, uchar*, int); void mathinit(void); void mmuinit(void); int modem(int); diff --git a/pc/l.s b/pc/l.s index 36d45c57bfe0c23d29bc1030014bb31851481f11..be3bde309e4ae66096b21a6aed6e83594160b332 100644 --- a/pc/l.s +++ b/pc/l.s @@ -659,25 +659,85 @@ l00: * same as l0update but for ldepth 1 (2 bit plane) screens */ TEXT l1update(SB),$0 + XORL AX,AX MOVL from+0(FP),SI MOVL to+4(FP),DI MOVL len+8(FP),CX MOVB $(Smmask),AL MOVW $(SRX),DX OUTB - MOVW $(SR),DX l10: + MOVL -4(SI)(CX*2),DX + MOVB DL,AL + MOVL l1revsep(SB)(AX*4),BX + SHLL $4,BX + RORL $8,DX + MOVB DL,AL + ORL l1revsep(SB)(AX*4),BX + RORL $12,BX + RORL $8,DX + MOVB DL,AL + ORL l1revsep(SB)(AX*4),BX + SHLL $4,BX + RORL $8,DX + MOVB DL,AL + ORL l1revsep(SB)(AX*4),BX + ROLL $8,BX + MOVW $(SR),DX + MOVB $0x5,AL /* write lo order bits to bit planes 1 & 3 */ + OUTB + MOVW BX,-2(DI)(CX*1) + SHRL $16,BX /* write hi order bits to bit planes 1 & 3 */ + MOVB $0xA,AL + OUTB + MOVW BX,-2(DI)(CX*1) + LOOP l11 + RET +l11: LOOP l10 + RET + +/* + * same as l0update but for ldepth 2 (4 bit plane) screens + */ +TEXT l2update(SB),$0 XORL AX,AX - MOVB -2(SI)(CX*2),AL /* high order nibbles */ - MOVW l1revsep(SB)(AX*2),BX - SHLW $4,BX - MOVB -1(SI)(CX*2),AL /* low order nibbles */ - ORW l1revsep(SB)(AX*2),BX - MOVB $0xA,AL /* write hi order bits to bit planes 0 & 2 */ + MOVL from+0(FP),SI + MOVL to+4(FP),DI + MOVL len+8(FP),CX + MOVB $(Smmask),AL + MOVW $(SRX),DX OUTB - MOVB BH,-1(DI)(CX*1) - MOVB $0x5,AL /* write lo order bits to bit planes 1 & 3 */ +l20: + MOVL -4(SI)(CX*4),DX + MOVB DL,AL + MOVL l2revsep(SB)(AX*4),BX + SHLL $2,BX + SHRL $8,DX + MOVB DL,AL + ORL l2revsep(SB)(AX*4),BX + SHLL $2,BX + SHRL $8,DX + MOVB DL,AL + ORL l2revsep(SB)(AX*4),BX + SHLL $2,BX + SHRL $8,DX + MOVB DL,AL + ORL l2revsep(SB)(AX*4),BX + MOVW $(SR),DX + MOVB $0x1,AL /* plane 3 */ + OUTB + MOVB BX,-1(DI)(CX*1) + MOVB $0x2,AL /* plane 2 */ + OUTB + SHRL $8,BX + MOVB BX,-1(DI)(CX*1) + MOVB $0x4,AL /* plane 1 */ + OUTB + SHRL $8,BX + MOVB BX,-1(DI)(CX*1) + MOVB $0x8,AL /* plane 0*/ OUTB - MOVB BL,-1(DI)(CX*1) - LOOP l10 + SHRL $8,BX + MOVB BX,-1(DI)(CX*1) + LOOP l20 RET diff --git a/pc/main.c b/pc/main.c index 86cecf94b014eb475772cc6a675d0ecb39a0341d..708024078412096c8462df875a6d3069d6258a3c 100644 --- a/pc/main.c +++ b/pc/main.c @@ -271,7 +271,7 @@ confinit(void) conf.npage1 = (i*MB - conf.base1)/BY2PG; conf.npage = conf.npage0 + conf.npage1; - conf.ldepth = 1; + conf.ldepth = 2; pcnt = screenbits()-1; /* Calculate % of memory for page pool */ pcnt = 70 - (pcnt*10); conf.upages = (conf.npage*pcnt)/100; diff --git a/pc/vga.c b/pc/vga.c index 9d9e1b16dc57c868b5ec4e41a0cb008f8e17806f..41f4a70090c4d041d83645f35cf09bd63a84a419 100644 --- a/pc/vga.c +++ b/pc/vga.c @@ -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<>(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, };