|
|
1.1 root 1: /*
2: * fontgen - generate 16x8 font assembler source on stdout.
3: */
4:
5: #define BIT(n) (1 << (n))
6: #define BITS(n) (((n) >= 4) ? (3 << (((n) - 4) * 2)) : (3 << (((n) + 4) * 2)))
7:
8: unsigned char ibuf[1024];
9: unsigned char odef[] = "\tB________ = 0000000\n";
10: unsigned char obuf[] = "\t.word\tB________\n";
11:
12: main()
13: {
14: register unsigned s;
15: register unsigned j;
16: register unsigned i;
17: extern long lseek();
18:
19: /*
20: * Read fonts from /dev/mem at offset 0xFFA6E.
21: */
22: close(0);
23: if (open("/dev/mem", 0) != 0)
24: fatal("/dev/mem: can't open\n");
25: if (lseek( 0, 0xFFA6EL, 0) != 0xFFA6EL)
26: fatal("/dev/mem: can't seek to fonts");
27: if (read( 0, ibuf, sizeof ibuf ) != sizeof ibuf)
28: fatal("/dev/mem: can't read fonts");
29:
30: /*
31: * Define symbolic constants.
32: */
33: for (i=0; i < 256; ++i) {
34: /* Generate constant's name. */
35: s = i;
36: for (j=10; --j >= 2; s>>=1)
37: odef[j] = (s&1) ? 'X' : '_';
38:
39: /* Convert 8 pixel width to 16 pixels */
40: s = 0;
41: for (j=0; j < 8; ++j)
42: if (i & BIT(j))
43: s |= BITS(j);
44:
45: /* Generate constant's value */
46: for (j=19; j >= 14; --j) {
47: odef[j] = (s & 7) + '0';
48: s >>= 3;
49: }
50:
51: /* Print constant's name and value */
52: send( odef );
53: }
54: send( "\n\t.globl\tfontw_\nfontw_:" );
55:
56: /*
57: * Define fonts for 128 characters.
58: */
59: for (i=0; i < sizeof ibuf; ++i) {
60:
61: /* Format and print one pixel line */
62: j = 16;
63: s = ibuf[i];
64: while ( --j >= 8 ) {
65: obuf[j] = (s&1) ? 'X' : '_' ;
66: s >>= 1;
67: }
68: send( obuf );
69:
70: /* Insert blank line between characters for readability */
71: if ( (i & 7) == 7 )
72: send( "\n" );
73: }
74: exit( 0 );
75: }
76:
77: /*
78: * Fatal( msg ) - report error, and abort.
79: */
80:
81: fatal( msg )
82: register char *msg;
83: {
84: write( 2, msg, strlen(msg) );
85: exit( 1 );
86: }
87:
88: /*
89: * send( s ) - write null-terminated string to standard output.
90: */
91:
92: send( s )
93: register char *s;
94: {
95: write( 1, s, strlen(s) );
96: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.