xref: /original-bsd/lib/libplot/aed/subr.c (revision c3e32dec)
1 /*-
2  * Copyright (c) 1983, 1993
3  *	The Regents of the University of California.  All rights reserved.
4  *
5  * %sccs.include.proprietary.c%
6  */
7 
8 #ifndef lint
9 static char sccsid[] = "@(#)subr.c	8.1 (Berkeley) 06/04/93";
10 #endif /* not lint */
11 
12 #include "aed.h"
13 
14 /*
15  * The following table is used to convert numbers to hex.  We cannot use
16  * standard C library conversion because it generates lower case letters
17  * which are bad news to the AED512.
18  */
19 
20 static char hex[] = "0123456789ABCDEF";
21 
22 /*---------------------------------------------------------
23  *	This is a local routine that converts an integer to a string
24  *	of hexadecimal characters.
25  *
26  *	Results:	None.
27  *
28  *	Side Effects:
29  *	The string contains the value of the low-order nchars 4-bit chunks
30  *	of val, as represented in hexadecimal.  String is zero-filled.
31  *---------------------------------------------------------
32  */
33 chex(val, string, nchars)
34 int val;			/* Integer value to be converted. */
35 char *string;			/* Pointer to area for converted result. */
36 int nchars;			/* Number of characters to be converted. */
37 {
38     string = &(string[nchars]);
39     *string = '\0';
40     for (; nchars>0 ; nchars--)
41     {
42 	*(--string) = hex[val & 017];
43 	val >>= 4;
44     }
45 }
46 
47 /*---------------------------------------------------------
48  *	This local routine outputs an x-y coordinate pair in the standard
49  *	format required by the AED display.
50  *
51  *	Results:	None.
52  *
53  *	Side Effects:
54  *	Characters are output to the AED512 in the standard way required
55  *	for values indicated by "xy20" in the user manual.
56  *
57  *	Errors:		None.
58  *---------------------------------------------------------
59  */
60 outxy20(x, y)
61 int x, y;			/* The coordinates to be output.  Note:
62 				 * these are world coordinates, not screen
63 				 * ones.  We scale in this routine.
64 				 */
65 {
66     char s1[4], s2[4], s3[4];
67     x = ((x - xbot) * scale)>>12;
68     y = ((y - ybot) * scale)>>12;
69     chex(((y>>8)&03) | ((x>>6)&014), s1, 1);
70     chex(x&0377, s2, 2);
71     chex(y&0377, s3, 2);
72     fprintf(stdout, "%s%s%s", s1, s2, s3);
73 }
74 
75 /*---------------------------------------------------------
76  *	This routine sets the display's current color.
77  *
78  *	Results:	None.
79  *
80  *	Side Effects:
81  *	The current color in the display is set to pcolor, if it
82  *	isn't that already.
83  *---------------------------------------------------------
84  */
85 setcolor(pcolor)
86 char *pcolor;			/* Pointer to a string giving the desired
87 				 * color in hexadecimal.
88 				 */
89 {
90     static char curcolor[] = "xx";
91     if ((pcolor[0] != curcolor[0]) || (pcolor[1] != curcolor[1]))
92     {
93 	curcolor[0] = pcolor[0];
94 	curcolor[1] = pcolor[1];
95 	putc('L', stdout);
96 	fputs(curcolor, stdout);
97     }
98 }
99