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