Home | History | Annotate | Line # | Download | only in palette
palette.c revision 1.6.10.1
      1 /*	$NetBSD: palette.c,v 1.6.10.1 2007/03/12 05:51:43 rmind Exp $	*/
      2 /*
      3  * pelette - manipulate text colormap for NetBSD/x68k.
      4  * author: Masaru Oki
      5  *
      6  * This software is in the Public Domain.
      7  */
      8 
      9 #include <sys/cdefs.h>
     10 __RCSID("$NetBSD: palette.c,v 1.6.10.1 2007/03/12 05:51:43 rmind Exp $");
     11 
     12 #include <stdio.h>
     13 #include <stdlib.h>
     14 #include <sys/param.h>
     15 #include <sys/ioctl.h>
     16 #include <sys/mman.h>
     17 #include <sys/fcntl.h>
     18 
     19 #define PALETTE_OFFSET 0x2000 /* physical addr: 0xe82000 */
     20 #define PALETTE_SIZE   0x1000 /* at least 1 page */
     21 
     22 int
     23 main(int argc, char *argv[])
     24 {
     25 	int fd;
     26 	u_short *palette;
     27 	char *mapaddr;
     28 	int r, g, b;
     29 	int c = 7;
     30 
     31 #ifdef DEBUG
     32 {
     33 	int i;
     34 	printf("argc = %d\n", argc);
     35 	for (i = 0; i < argc; i++)
     36 		printf("argv[%d] = \"%s\"\n", i, argv[i]);
     37 }
     38 #endif
     39 
     40 	if ((fd = open("/dev/grf0", O_RDWR, 0)) < 0) {
     41 		perror("open");
     42 		exit(1);
     43 	}
     44 
     45 	mapaddr = mmap(0, PALETTE_SIZE, PROT_READ | PROT_WRITE,
     46 		       MAP_FILE | MAP_SHARED, fd, PALETTE_OFFSET);
     47 	if (mapaddr == (void *)-1) {
     48 		perror("mmap");
     49 		close(fd);
     50 		exit(1);
     51 	}
     52 	close(fd);
     53 	palette = (u_short *)(mapaddr + 0x0200);
     54 
     55 	if (argc == 5) {
     56 		c = atoi(argv[--argc]);
     57 		if (c > 15) {
     58 			printf("Usage: %s [red green blue [code]]\n", argv[0]);
     59 			exit(1);
     60 		}
     61 	}
     62 	if (argc != 4)
     63 		r = g = b = 31;
     64 	else {
     65 		r = atoi(argv[1]);
     66 		g = atoi(argv[2]);
     67 		b = atoi(argv[3]);
     68 		if (r > 31 || g > 31 || b > 31) {
     69 			printf("Usage: %s [red green blue [code]]\n", argv[0]);
     70 			r = g = b = 31;
     71 		}
     72 	}
     73 #ifdef DEBUG
     74 	printf("color table offset = %d\n", c);
     75 	printf("r = %d, g = %d, b = %d\n", r, g, b);
     76 #endif
     77 	r <<= 6;
     78 	g <<= 11;
     79 	b <<= 1;
     80 
     81 	palette[c] = r | g | b | 1;
     82 
     83 	exit(0);
     84 }
     85