From 07d617b66c2f516337ffdb9fea14aaf7e9f076ca Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Sun, 26 Mar 2000 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2000-03-26 --- pc/devvga.c | 23 ++++++++++------------- pc/screen.c | 11 +++++++++++ pc/screen.h | 3 +++ pc/vgas3.c | 21 +++++++++++++++++++++ pc/vgat2r4.c | 19 +++++++++++++++++++ port/chan.c | 1 + port/devdraw.c | 12 ++++++++++-- 7 files changed, 75 insertions(+), 15 deletions(-) diff --git a/pc/devvga.c b/pc/devvga.c index abbfa4abee2b09905dffd5fef17c74d9b39fc637..76e9566cf56582c6e965e50065eacb6068c70dd9 100644 --- a/pc/devvga.c +++ b/pc/devvga.c @@ -1,4 +1,5 @@ /* + * VGA controller */ #include "u.h" #include "../port/lib.h" @@ -151,10 +152,6 @@ vgactl(char* a) if(n < 2) error(Ebadarg); - /* BUG: drawinit should become a different message rather than piggybacking */ - if(scr && scr->dev && scr->dev->drawinit) - scr->dev->drawinit(scr); - if(strcmp(field[1], "off") == 0){ lock(&cursor); if(scr->cur){ @@ -269,17 +266,8 @@ vgactl(char* a) return; } else if(strcmp(field[0], "drawinit") == 0){ - /* - * This is a separate message, but first we need to make - * aux/vga send it; once everyone has the new vga, we - * can take the drawinit stuff out of hwgc. - */ - - /* if(scr && scr->dev && scr->dev->drawinit) scr->dev->drawinit(scr); - */ - return; } else if(strcmp(field[0], "linear") == 0){ @@ -317,6 +305,15 @@ vgactl(char* a) hwaccel = 0; return; } + else if(strcmp(field[0], "hwblank") == 0){ + if(n < 2) + error(Ebadarg); + if(strcmp(field[1], "on") == 0) + hwblank = 1; + else if(strcmp(field[1], "off") == 0) + hwblank = 0; + return; + } error(Ebadarg); } diff --git a/pc/screen.c b/pc/screen.c index e175af09ef377c3b387cc19e4ea32c3ed4efb520..290fc4393dd90215b13c45610a616f9869c5a09f 100644 --- a/pc/screen.c +++ b/pc/screen.c @@ -463,6 +463,7 @@ Memimage *lastbadi; Memdata *lastbad; Memimage *lastbadsrc, *lastbaddst; int hwaccel = 1; +int hwblank = 1; int hwdraw(Memdrawparam *par) @@ -516,3 +517,13 @@ hwdraw(Memdrawparam *par) return 0; } + +void +blankscreen(int blank) +{ + VGAscr *scr; + + scr = &vgascreen[0]; + if(hwblank && scr->blank) + scr->blank(scr, blank); +} diff --git a/pc/screen.h b/pc/screen.h index 863c4543be10135514798d73c525d9552ba2dec6..8837a921da1ad76559df4d9d5c4b21b185b53465 100644 --- a/pc/screen.h +++ b/pc/screen.h @@ -110,6 +110,7 @@ struct VGAscr { int (*fill)(VGAscr*, Rectangle, ulong); int (*scroll)(VGAscr*, Rectangle, Rectangle); + void (*blank)(VGAscr*, int); ulong id; /* internal identifier for driver use */ }; @@ -124,6 +125,7 @@ extern void mousectl(char*[], int); /* screen.c */ extern int hwaccel; /* use hw acceleration; default on */ +extern int hwblank; /* use hw blanking; default on */ extern void flushmemscreen(Rectangle); extern int cursoron(int); extern void cursoroff(int); @@ -131,6 +133,7 @@ extern void setcursor(Cursor*); extern int screensize(int, int, int, ulong); extern int screenaperture(int, int); extern Rectangle physgscreenr; /* actual monitor size */ +extern void blankscreen(int); /* devdraw.c */ extern void deletescreenimage(void); diff --git a/pc/vgas3.c b/pc/vgas3.c index 19add082de133bf0f72aa2af52e495fb58a2347a..c6c7f0a4ad59e615ebadc6e61be1b042fba4df23 100644 --- a/pc/vgas3.c +++ b/pc/vgas3.c @@ -441,6 +441,26 @@ hwfill(VGAscr *scr, Rectangle r, ulong sval) return 1; } +enum { + CursorSyncCtl = 0x0D, /* in Seqx */ + VsyncHi = 0x80, + VsyncLo = 0x40, + HsyncHi = 0x20, + HsyncLo = 0x10, +}; + +static void +s3blank(int blank) +{ + uchar x; + + x = vgaxi(Seqx, CursorSyncCtl); + x &= ~0xF0; + if(blank) + x |= VsyncLo | HsyncLo; + vgaxo(Seqx, CursorSyncCtl, x); +} + static void s3drawinit(VGAscr *scr) { @@ -463,6 +483,7 @@ s3drawinit(VGAscr *scr) scr->mmio = (ulong*)(scr->aperture+0x1000000); scr->fill = hwfill; scr->scroll = hwscroll; + /* scr->blank = hwblank; */ } } diff --git a/pc/vgat2r4.c b/pc/vgat2r4.c index 5b01c203b9b840f2cbd03edf94943682938ccb25..629e28f25decd409c793e45105e24ba8d8baa5e6 100644 --- a/pc/vgat2r4.c +++ b/pc/vgat2r4.c @@ -25,6 +25,12 @@ enum { }; enum { /* index registers */ + CursorSyncCtl = 0x03, + HsyncHi = 0x01, + HsyncLo = 0x02, + VsyncHi = 0x04, + VsyncLo = 0x08, + CursorCtl = 0x30, CursorXLo = 0x31, CursorXHi = 0x32, @@ -513,6 +519,18 @@ t2r4hwfill(VGAscr *scr, Rectangle r, ulong sval) return 1; } +static void +t2r4blank(VGAscr *scr, int blank) +{ + uchar x; + + x = t2r4xi(scr, CursorSyncCtl); + x &= ~0x0F; + if(blank) + x |= HsyncLo | VsyncLo; + t2r4xo(scr, CursorSyncCtl, x); +} + static void t2r4drawinit(VGAscr *scr) { @@ -557,6 +575,7 @@ t2r4drawinit(VGAscr *scr) scr->fill = t2r4hwfill; scr->scroll = t2r4hwscroll; + scr->blank = t2r4blank; } VGAdev vgat2r4dev = { diff --git a/port/chan.c b/port/chan.c index 5b1165435c3b8fe4ad0d6b25a3d9768b58ea1f01..54e32948af05b7c56cb5fce0c4f975b374f6c6e2 100644 --- a/port/chan.c +++ b/port/chan.c @@ -721,6 +721,7 @@ namec(char *name, int amode, int omode, ulong perm) * c time and pid, but also cons and consctl * p control of your own processes (and unfortunately * any others left unprotected) + * all are ASCII, so it's safe to use strchr to check. */ if(up->pgrp->noattach) if(strchr("|decp", name[1]) == 0) diff --git a/port/devdraw.c b/port/devdraw.c index 4f7e2215a701d5cfb95213b7929a7bfd5b29487e..6bae2163ac572fbc8314045db44530858656bbe3 100644 --- a/port/devdraw.c +++ b/port/devdraw.c @@ -1980,14 +1980,22 @@ drawblankscreen(int blank) p = sdraw.savemap; nc = screenimage->depth > 8 ? 256 : 1<depth; - if(blank == 0) /* turn screen on */ + /* + * blankscreen uses the hardware to blank the screen + * when possible. to help in cases when it is not possible, + * we set the color map to be all black. + */ + if(blank == 0){ /* turn screen on */ for(i=0; i