]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/9/pc/cga.c
archacpi: make *acpi=1 the default
[plan9front.git] / sys / src / 9 / pc / cga.c
index b07652b0c3bc058f594bea09e1fd0677bb6794c4..824cd62eb67c7f9a0cab83d1523655763f37b503 100644 (file)
@@ -169,14 +169,51 @@ cgascreenputs(char* s, int n)
        unlock(&cgascreenlock);
 }
 
+static void
+cgatokmesg(void)
+{
+       int i, n;
+       char *p;
+
+       ilock(&kmesg.lk);
+       n = kmesg.n;
+       for(i = cgapos-2; i >= 0 && n < sizeof kmesg.buf-UTFmax-1; i -= 2){
+               if((i % Width) == Width-2)
+                       n++;
+               n += runelen(cp437[CGASCREENBASE[i]]);
+       }
+       n -= kmesg.n;
+       if(n > 0){
+               memmove(kmesg.buf+n, kmesg.buf, kmesg.n);
+               kmesg.n += n;
+               p = kmesg.buf;
+               for(i += 2; i >= 0 && i < cgapos && p < kmesg.buf+n; i += 2){
+                       p += runetochar(p, &cp437[CGASCREENBASE[i]]);
+                       if((i % Width) == Width-2)
+                               *p++ = '\n';
+               }
+       }
+       iunlock(&kmesg.lk);
+}
+
 void
 screeninit(void)
 {
+       static int once;
 
        cgapos = cgaregr(0x0E)<<8;
        cgapos |= cgaregr(0x0F);
        cgapos *= 2;
 
+       if(cgapos >= Width*Height){
+               cgapos = 0;
+               movecursor();
+       }
+
+       if(once == 0){
+               once = 1;
+               cgatokmesg();
+       }
+
        screenputs = cgascreenputs;
 }
-