1/*	$NetBSD: palette.c,v 1.7 2007/03/04 06:01:07 christos 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.7 2007/03/04 06:01:07 christos 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
23int
24main(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