annotate lcdemu/process.c @ 10:ad0d9f7c06e9 default tip

README: update for the present situation
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 29 Dec 2019 23:01:26 +0000
parents e7f1035f10d4
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /*
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 * Processing of LCD output (input to us)
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3 */
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5 #include <stdio.h>
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 #include <stdint.h>
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7 #include <stdlib.h>
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8 #include <ctype.h>
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9 #include <string.h>
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 #include <strings.h>
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11 #include <X11/Xlib.h>
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12 #include <X11/Xresource.h>
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13 #include <X11/Xutil.h>
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14 #include "globals.h"
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16 #define MAX_WIDTH 176
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 static unsigned
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19 hexdecode(str)
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20 char *str;
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21 {
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 unsigned accum = 0;
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23 int i, c, n;
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25 for (i = 0; i < 4; i++) {
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 c = str[i];
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27 if (isdigit(c))
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28 n = c - '0';
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 else if (isupper(c))
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 n = c - 'A' + 10;
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31 else
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
32 n = c - 'a' + 10;
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33 accum <<= 4;
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
34 accum |= n;
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
35 }
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36 return(accum);
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37 }
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
39 process_input_line(line)
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40 char *line;
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
41 {
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42 int blitrow, blitcol, npix;
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43 uint16_t pix16[MAX_WIDTH];
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
44 char *cp;
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
45 XImage *xi;
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
46
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
47 for (cp = line; isspace(*cp); cp++)
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
48 ;
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
49 if (!isdigit(*cp)) {
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
50 inv: fprintf(stderr, "fc-lcdemu: invalid input line\n");
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
51 exit(1);
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
52 }
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
53 blitrow = atoi(cp);
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
54 while (isdigit(*cp))
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
55 cp++;
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
56 if (!isspace(*cp))
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
57 goto inv;
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
58 while (isspace(*cp))
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
59 cp++;
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
60 if (!isdigit(*cp))
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
61 goto inv;
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
62 blitcol = atoi(cp);
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
63 while (isdigit(*cp))
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
64 cp++;
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
65 if (!isspace(*cp))
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
66 goto inv;
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
67 while (isspace(*cp))
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
68 cp++;
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
69 if (!isxdigit(*cp))
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
70 goto inv;
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
71 for (npix = 0; *cp; ) {
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
72 if (!isxdigit(cp[0]) || !isxdigit(cp[1]) ||
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
73 !isxdigit(cp[2]) || !isxdigit(cp[3]))
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
74 goto inv;
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
75 if (npix >= MAX_WIDTH) {
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
76 fprintf(stderr,
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
77 "fc-lcdemu error: input line exceeds MAX_WIDTH of %d pixels\n",
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
78 MAX_WIDTH);
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
79 exit(1);
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
80 }
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
81 pix16[npix++] = hexdecode(cp);
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
82 cp += 4;
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
83 }
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
84 xi = convert_function(pix16, npix);
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
85 XPutImage(mydisplay, mainwindow, mainwingc, xi, 0, 0, blitcol, blitrow,
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
86 npix, 1);
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
87 XDestroyImage(xi);
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
88 }
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
89
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
90 input_on_stdin(inbuf, incount)
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
91 char *inbuf;
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
92 {
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
93 char *input_end = inbuf + incount;
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
94 static char linebuf[1024];
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
95 static int linesz;
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
96 char *cp;
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
97
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
98 for (cp = inbuf; cp < input_end; cp++) {
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
99 if (*cp == '\n') {
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
100 linebuf[linesz] = '\0';
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
101 process_input_line(linebuf);
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
102 linesz = 0;
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
103 continue;
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
104 }
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
105 if (linesz < sizeof(linebuf) - 1)
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
106 linebuf[linesz++] = *cp;
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
107 }
e7f1035f10d4 lcdemu: initial import from freecalypso-tools
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
108 }