annotate bwsplash/pbm2c.c @ 268:f2e52cab0a73

abb_inth.c: check all interrupt causes, not just one The original code used if - else if - else if etc constructs, thus the first detected interrupt was the only one handled. However, Iota ITSTATREG is a clear-on-read register, thus if we only handle the first detected interrupt and skip checking the others, then the other interrupts will be lost, if more than one interrupt happened to occur in one ABB interrupt handling cycle - a form of rare race condition. Change the code to check all interrupts that were read in this cycle.
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 13 Jun 2021 18:17:53 +0000
parents 4d9f24c501f3
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
195
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /*
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 * This program compiles bwsplash.pbm into a C char array
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3 * for inclusion into phone UI firmware source.
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4 */
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 #include <sys/types.h>
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7 #include <stdio.h>
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8 #include <stdlib.h>
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9 #include <string.h>
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 #include <strings.h>
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12 FILE *inf, *outf;
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13 char *infname, linebuf[128];
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14 int lineno;
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16 void
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17 get_input_line()
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 {
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19 char *cp;
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21 if (!fgets(linebuf, sizeof linebuf, inf)) {
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 fprintf(stderr, "%s: premature EOF\n", infname);
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23 exit(1);
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24 }
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25 lineno++;
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 cp = index(linebuf, '\n');
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27 if (!cp) {
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28 fprintf(stderr, "%s line %d: too long or missing newline\n",
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 infname, lineno);
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 exit(1);
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31 }
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
32 *cp = '\0';
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33 }
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
34
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
35 void
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36 parse_pixel_line(outbuf, npix)
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37 u_char *outbuf;
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38 unsigned npix;
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
39 {
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40 char *cp;
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
41 u_char *dp;
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42 unsigned n;
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
44 cp = linebuf;
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
45 dp = outbuf;
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
46 for (n = 0; n < npix; n++) {
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
47 if (*cp != '0' && *cp != '1') {
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
48 inv: fprintf(stderr,
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
49 "%s line %d: does not match expected line of %u 0/1 characters\n",
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
50 infname, lineno, npix);
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
51 exit(1);
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
52 }
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
53 *dp++ = *cp++ - '0';
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
54 }
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
55 if (*cp)
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
56 goto inv;
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
57 }
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
58
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
59 void
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
60 pack_pixel_byte(bits)
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
61 u_char *bits;
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
62 {
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
63 unsigned byte, mask, n;
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
64
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
65 byte = 0;
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
66 for (n = 0, mask = 0x80; n < 8; n++, mask >>= 1)
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
67 if (bits[n])
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
68 byte |= mask;
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
69 fprintf(outf, "0x%02X,", byte);
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
70 }
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
71
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
72 main(argc, argv)
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
73 char **argv;
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
74 {
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
75 unsigned nrow, ncol;
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
76 u_char rowbuf[80];
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
77
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
78 if (argc != 3) {
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
79 fprintf(stderr, "usage: %s pbmfile outfile\n", argv[0]);
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
80 exit(1);
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
81 }
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
82 infname = argv[1];
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
83 inf = fopen(infname, "r");
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
84 if (!inf) {
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
85 perror(infname);
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
86 exit(1);
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
87 }
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
88 get_input_line();
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
89 if (strcmp(linebuf, "P1")) {
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
90 fprintf(stderr,
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
91 "error in %s: first line is not the expected \"P1\"\n",
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
92 infname);
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
93 exit(1);
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
94 }
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
95 get_input_line();
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
96 if (strcmp(linebuf, "80 30")) {
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
97 fprintf(stderr,
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
98 "error in %s: second line is not the expected \"80 30\"\n",
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
99 infname);
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
100 exit(1);
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
101 }
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
102 outf = fopen(argv[2], "w");
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
103 if (!outf) {
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
104 perror(argv[2]);
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
105 exit(1);
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
106 }
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
107 for (nrow = 0; nrow < 30; nrow++) {
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
108 get_input_line();
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
109 parse_pixel_line(rowbuf, 80);
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
110 putc('\t', outf);
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
111 for (ncol = 0; ncol < 80; ncol += 8)
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
112 pack_pixel_byte(rowbuf + ncol);
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
113 putc('\n', outf);
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
114 }
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
115 exit(0);
4d9f24c501f3 bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
116 }