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