xref: /freebsd/lib/libvgl/main.c (revision 9a57b7d230c34b2703928de03fb53ed7dc6f9c4f)
19a57b7d2SSøren Schmidt /*-
29a57b7d2SSøren Schmidt  * Copyright (c) 1991-1997 S�ren Schmidt
39a57b7d2SSøren Schmidt  * All rights reserved.
49a57b7d2SSøren Schmidt  *
59a57b7d2SSøren Schmidt  * Redistribution and use in source and binary forms, with or without
69a57b7d2SSøren Schmidt  * modification, are permitted provided that the following conditions
79a57b7d2SSøren Schmidt  * are met:
89a57b7d2SSøren Schmidt  * 1. Redistributions of source code must retain the above copyright
99a57b7d2SSøren Schmidt  *    notice, this list of conditions and the following disclaimer
109a57b7d2SSøren Schmidt  *    in this position and unchanged.
119a57b7d2SSøren Schmidt  * 2. Redistributions in binary form must reproduce the above copyright
129a57b7d2SSøren Schmidt  *    notice, this list of conditions and the following disclaimer in the
139a57b7d2SSøren Schmidt  *    documentation and/or other materials provided with the distribution.
149a57b7d2SSøren Schmidt  * 3. The name of the author may not be used to endorse or promote products
159a57b7d2SSøren Schmidt  *    derived from this software withough specific prior written permission
169a57b7d2SSøren Schmidt  *
179a57b7d2SSøren Schmidt  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
189a57b7d2SSøren Schmidt  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
199a57b7d2SSøren Schmidt  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
209a57b7d2SSøren Schmidt  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
219a57b7d2SSøren Schmidt  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
229a57b7d2SSøren Schmidt  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
239a57b7d2SSøren Schmidt  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
249a57b7d2SSøren Schmidt  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
259a57b7d2SSøren Schmidt  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
269a57b7d2SSøren Schmidt  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
279a57b7d2SSøren Schmidt  *
289a57b7d2SSøren Schmidt  *  $Id: main.c,v 1.14 1997/08/15 12:32:59 sos Exp $
299a57b7d2SSøren Schmidt  */
309a57b7d2SSøren Schmidt 
319a57b7d2SSøren Schmidt #include <stdio.h>
329a57b7d2SSøren Schmidt #include <sys/types.h>
339a57b7d2SSøren Schmidt #include <sys/signal.h>
349a57b7d2SSøren Schmidt #include <sys/file.h>
359a57b7d2SSøren Schmidt #include <sys/ioctl.h>
369a57b7d2SSøren Schmidt #include <sys/mman.h>
379a57b7d2SSøren Schmidt #include <machine/console.h>
389a57b7d2SSøren Schmidt #include "vgl.h"
399a57b7d2SSøren Schmidt 
409a57b7d2SSøren Schmidt VGLBitmap *VGLDisplay;
419a57b7d2SSøren Schmidt 
429a57b7d2SSøren Schmidt static int VGLMode;
439a57b7d2SSøren Schmidt static int VGLOldMode;
449a57b7d2SSøren Schmidt static byte *VGLBuf;
459a57b7d2SSøren Schmidt static byte *VGLMem;
469a57b7d2SSøren Schmidt static int VGLSwitchPending;
479a57b7d2SSøren Schmidt static int VGLOnDisplay;
489a57b7d2SSøren Schmidt 
499a57b7d2SSøren Schmidt void
509a57b7d2SSøren Schmidt VGLEnd()
519a57b7d2SSøren Schmidt {
529a57b7d2SSøren Schmidt struct vt_mode smode;
539a57b7d2SSøren Schmidt 
549a57b7d2SSøren Schmidt /*
559a57b7d2SSøren Schmidt   while (!VGLOnDisplay) pause();
569a57b7d2SSøren Schmidt   VGLCheckSwitch();;
579a57b7d2SSøren Schmidt */
589a57b7d2SSøren Schmidt   outb(0x3c4, 0x02);
599a57b7d2SSøren Schmidt   outb(0x3c5, 0x0f);
609a57b7d2SSøren Schmidt   bzero(VGLMem, 64*1024);
619a57b7d2SSøren Schmidt   ioctl(0, _IO('S', VGLOldMode), 0);
629a57b7d2SSøren Schmidt   ioctl(0, KDDISABIO, 0);
639a57b7d2SSøren Schmidt   ioctl(0, KDSETMODE, KD_TEXT);
649a57b7d2SSøren Schmidt   smode.mode = VT_AUTO;
659a57b7d2SSøren Schmidt   ioctl(0, VT_SETMODE, &smode);
669a57b7d2SSøren Schmidt   free(VGLBuf);
679a57b7d2SSøren Schmidt   free(VGLDisplay);
689a57b7d2SSøren Schmidt }
699a57b7d2SSøren Schmidt 
709a57b7d2SSøren Schmidt static void
719a57b7d2SSøren Schmidt VGLAbort()
729a57b7d2SSøren Schmidt {
739a57b7d2SSøren Schmidt   VGLEnd();
749a57b7d2SSøren Schmidt   exit(0);
759a57b7d2SSøren Schmidt }
769a57b7d2SSøren Schmidt 
779a57b7d2SSøren Schmidt static void
789a57b7d2SSøren Schmidt VGLSwitch()
799a57b7d2SSøren Schmidt {
809a57b7d2SSøren Schmidt   if (!VGLOnDisplay)
819a57b7d2SSøren Schmidt     VGLOnDisplay = 1;
829a57b7d2SSøren Schmidt   else
839a57b7d2SSøren Schmidt     VGLOnDisplay = 0;
849a57b7d2SSøren Schmidt   VGLSwitchPending = 1;
859a57b7d2SSøren Schmidt   signal(SIGUSR1, VGLSwitch);
869a57b7d2SSøren Schmidt }
879a57b7d2SSøren Schmidt 
889a57b7d2SSøren Schmidt int
899a57b7d2SSøren Schmidt VGLInit(int mode)
909a57b7d2SSøren Schmidt {
919a57b7d2SSøren Schmidt   struct vt_mode smode;
929a57b7d2SSøren Schmidt   struct winsize winsz;
939a57b7d2SSøren Schmidt   int error;
949a57b7d2SSøren Schmidt 
959a57b7d2SSøren Schmidt   signal(SIGUSR1, VGLSwitch);
969a57b7d2SSøren Schmidt   signal(SIGINT, VGLAbort);
979a57b7d2SSøren Schmidt   signal(SIGSEGV, VGLAbort);
989a57b7d2SSøren Schmidt   signal(SIGBUS, VGLAbort);
999a57b7d2SSøren Schmidt 
1009a57b7d2SSøren Schmidt   VGLOnDisplay = 1;
1019a57b7d2SSøren Schmidt   VGLSwitchPending = 0;
1029a57b7d2SSøren Schmidt 
1039a57b7d2SSøren Schmidt   ioctl(0, CONS_GET, &VGLOldMode);
1049a57b7d2SSøren Schmidt 
1059a57b7d2SSøren Schmidt   VGLMem = (byte*)mmap(0, 0x10000, PROT_READ|PROT_WRITE, MAP_FILE,
1069a57b7d2SSøren Schmidt                           open("/dev/mem", O_RDWR), 0xA0000);
1079a57b7d2SSøren Schmidt   if (VGLMem <= (byte*)0)
1089a57b7d2SSøren Schmidt     return 1;
1099a57b7d2SSøren Schmidt 
1109a57b7d2SSøren Schmidt   VGLBuf = (byte*)malloc(256*1024);
1119a57b7d2SSøren Schmidt   if (VGLBuf == NULL)
1129a57b7d2SSøren Schmidt     return 1;
1139a57b7d2SSøren Schmidt 
1149a57b7d2SSøren Schmidt   VGLDisplay = (VGLBitmap*) malloc(sizeof(VGLBitmap));
1159a57b7d2SSøren Schmidt   if (VGLDisplay == NULL) {
1169a57b7d2SSøren Schmidt     free(VGLBuf);
1179a57b7d2SSøren Schmidt     return 1;
1189a57b7d2SSøren Schmidt   }
1199a57b7d2SSøren Schmidt 
1209a57b7d2SSøren Schmidt   switch (mode) {
1219a57b7d2SSøren Schmidt   case SW_BG640x480: case SW_CG640x480:
1229a57b7d2SSøren Schmidt     VGLDisplay->Type = VIDBUF4;
1239a57b7d2SSøren Schmidt     break;
1249a57b7d2SSøren Schmidt   case SW_VGA_CG320:
1259a57b7d2SSøren Schmidt     VGLDisplay->Type = VIDBUF8;
1269a57b7d2SSøren Schmidt     break;
1279a57b7d2SSøren Schmidt   case SW_VGA_MODEX:
1289a57b7d2SSøren Schmidt     VGLDisplay->Type = VIDBUF8X;
1299a57b7d2SSøren Schmidt     break;
1309a57b7d2SSøren Schmidt   default:
1319a57b7d2SSøren Schmidt     VGLEnd();
1329a57b7d2SSøren Schmidt     return 1;
1339a57b7d2SSøren Schmidt   }
1349a57b7d2SSøren Schmidt 
1359a57b7d2SSøren Schmidt   if ((error = ioctl(0, KDENABIO, 0)))
1369a57b7d2SSøren Schmidt     return error;
1379a57b7d2SSøren Schmidt 
1389a57b7d2SSøren Schmidt   ioctl(0, VT_WAITACTIVE, 0);
1399a57b7d2SSøren Schmidt   ioctl(0, KDSETMODE, KD_GRAPHICS);
1409a57b7d2SSøren Schmidt   if ((error = ioctl(0, mode, 0))) {
1419a57b7d2SSøren Schmidt     ioctl(0, KDSETMODE, KD_TEXT);
1429a57b7d2SSøren Schmidt     ioctl(0, KDDISABIO, 0);
1439a57b7d2SSøren Schmidt     return error;
1449a57b7d2SSøren Schmidt   }
1459a57b7d2SSøren Schmidt 
1469a57b7d2SSøren Schmidt   VGLMode = mode;
1479a57b7d2SSøren Schmidt 
1489a57b7d2SSøren Schmidt   outb(0x3c4, 0x02);
1499a57b7d2SSøren Schmidt   outb(0x3c5, 0x0f);
1509a57b7d2SSøren Schmidt   bzero(VGLMem, 64*1024);
1519a57b7d2SSøren Schmidt 
1529a57b7d2SSøren Schmidt   if (ioctl(0, TIOCGWINSZ, &winsz)) {
1539a57b7d2SSøren Schmidt     VGLEnd();
1549a57b7d2SSøren Schmidt     return 1;
1559a57b7d2SSøren Schmidt   }
1569a57b7d2SSøren Schmidt 
1579a57b7d2SSøren Schmidt   VGLDisplay->Bitmap = VGLMem;
1589a57b7d2SSøren Schmidt   VGLDisplay->Xsize = winsz.ws_xpixel;
1599a57b7d2SSøren Schmidt   VGLDisplay->Ysize = winsz.ws_ypixel;
1609a57b7d2SSøren Schmidt   VGLSavePalette();
1619a57b7d2SSøren Schmidt 
1629a57b7d2SSøren Schmidt   smode.mode = VT_PROCESS;
1639a57b7d2SSøren Schmidt   smode.waitv = 0;
1649a57b7d2SSøren Schmidt   smode.relsig = SIGUSR1;
1659a57b7d2SSøren Schmidt   smode.acqsig = SIGUSR1;
1669a57b7d2SSøren Schmidt   smode.frsig  = SIGINT;
1679a57b7d2SSøren Schmidt   if (ioctl(0, VT_SETMODE, &smode) == -1) {
1689a57b7d2SSøren Schmidt     VGLEnd();
1699a57b7d2SSøren Schmidt     return 1;
1709a57b7d2SSøren Schmidt   }
1719a57b7d2SSøren Schmidt   VGLTextSetFontFile((byte*)0);
1729a57b7d2SSøren Schmidt   return 0;
1739a57b7d2SSøren Schmidt }
1749a57b7d2SSøren Schmidt 
1759a57b7d2SSøren Schmidt void
1769a57b7d2SSøren Schmidt VGLCheckSwitch()
1779a57b7d2SSøren Schmidt {
1789a57b7d2SSøren Schmidt   if (VGLSwitchPending) {
1799a57b7d2SSøren Schmidt     int i;
1809a57b7d2SSøren Schmidt 
1819a57b7d2SSøren Schmidt     VGLSwitchPending = 0;
1829a57b7d2SSøren Schmidt     if (VGLOnDisplay) {
1839a57b7d2SSøren Schmidt       ioctl(0, KDENABIO, 0);
1849a57b7d2SSøren Schmidt       ioctl(0, KDSETMODE, KD_GRAPHICS);
1859a57b7d2SSøren Schmidt       ioctl(0, VGLMode, 0);
1869a57b7d2SSøren Schmidt       outb(0x3c6, 0xff);
1879a57b7d2SSøren Schmidt       for (i=0; i<4; i++) {
1889a57b7d2SSøren Schmidt         outb(0x3c4, 0x02);
1899a57b7d2SSøren Schmidt         outb(0x3c5, 0x01<<i);
1909a57b7d2SSøren Schmidt         bcopy(&VGLBuf[i*64*1024], VGLMem, 64*1024);
1919a57b7d2SSøren Schmidt       }
1929a57b7d2SSøren Schmidt       VGLRestorePalette();
1939a57b7d2SSøren Schmidt       ioctl(0, VT_RELDISP, VT_ACKACQ);
1949a57b7d2SSøren Schmidt       VGLDisplay->Bitmap = VGLMem;
1959a57b7d2SSøren Schmidt       switch (VGLMode) {
1969a57b7d2SSøren Schmidt       case SW_BG640x480: case SW_CG640x480:
1979a57b7d2SSøren Schmidt         VGLDisplay->Type = VIDBUF4;
1989a57b7d2SSøren Schmidt         break;
1999a57b7d2SSøren Schmidt       case SW_VGA_CG320:
2009a57b7d2SSøren Schmidt         VGLDisplay->Type = VIDBUF8;
2019a57b7d2SSøren Schmidt         break;
2029a57b7d2SSøren Schmidt       case SW_VGA_MODEX:
2039a57b7d2SSøren Schmidt         VGLDisplay->Type = VIDBUF8X;
2049a57b7d2SSøren Schmidt         break;
2059a57b7d2SSøren Schmidt       default:
2069a57b7d2SSøren Schmidt         VGLDisplay->Type = VIDBUF8;			/* XXX */
2079a57b7d2SSøren Schmidt         break;
2089a57b7d2SSøren Schmidt       }
2099a57b7d2SSøren Schmidt     }
2109a57b7d2SSøren Schmidt     else {
2119a57b7d2SSøren Schmidt       for (i=0; i<4; i++) {
2129a57b7d2SSøren Schmidt         outb(0x3ce, 0x04);
2139a57b7d2SSøren Schmidt         outb(0x3cf, i);
2149a57b7d2SSøren Schmidt         bcopy(VGLMem, &VGLBuf[i*64*1024], 64*1024);
2159a57b7d2SSøren Schmidt       }
2169a57b7d2SSøren Schmidt       ioctl(0, VGLOldMode, 0);
2179a57b7d2SSøren Schmidt       ioctl(0, KDSETMODE, KD_TEXT);
2189a57b7d2SSøren Schmidt       ioctl(0, KDDISABIO, 0);
2199a57b7d2SSøren Schmidt       ioctl(0, VT_RELDISP, VT_TRUE);
2209a57b7d2SSøren Schmidt       VGLDisplay->Bitmap = VGLBuf;
2219a57b7d2SSøren Schmidt       VGLDisplay->Type = MEMBUF;
2229a57b7d2SSøren Schmidt     }
2239a57b7d2SSøren Schmidt   }
2249a57b7d2SSøren Schmidt   while (!VGLOnDisplay) pause();
2259a57b7d2SSøren Schmidt }
2269a57b7d2SSøren Schmidt 
227