File:  [MW Coherent from dump] / coherent / b / kernel / io.386 / fontgen.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Wed May 29 04:56:37 2019 UTC (7 years ago) by root
Branches: MarkWilliams, MAIN
CVS tags: relic, HEAD
coherent

/*
 * fontgen - generate 16x8 font assembler source on stdout.
 */

#define	BIT(n)	(1 << (n))
#define	BITS(n)	(((n) >= 4) ? (3 << (((n) - 4) * 2)) : (3 << (((n) + 4) * 2)))

unsigned char ibuf[1024];
unsigned char odef[] = "\tB________ = 0000000\n";
unsigned char obuf[] = "\t.word\tB________\n";

main()
{
	register unsigned s;
	register unsigned j;
	register unsigned i;
	extern long lseek();

	/*
	 * Read fonts from /dev/mem at offset 0xFFA6E.
	 */
	close(0);
	if (open("/dev/mem", 0) != 0)
		fatal("/dev/mem: can't open\n");
	if (lseek( 0, 0xFFA6EL, 0) != 0xFFA6EL)
		fatal("/dev/mem: can't seek to fonts");
	if (read( 0, ibuf, sizeof ibuf ) != sizeof ibuf)
		fatal("/dev/mem: can't read fonts");

	/*
	 * Define symbolic constants.
	 */
	for (i=0; i < 256; ++i) {
		/* Generate constant's name. */
		s = i;
		for (j=10; --j >= 2; s>>=1)
			odef[j] = (s&1) ? 'X' : '_';

		/* Convert 8 pixel width to 16 pixels */
		s = 0;
		for (j=0; j < 8; ++j)
			if (i & BIT(j))
				s |= BITS(j);

		/* Generate constant's value */
		for (j=19; j >= 14; --j) {
			odef[j] = (s & 7) + '0';
			s >>= 3;
		}

		/* Print constant's name and value */
		send( odef );
	}
	send( "\n\t.globl\tfontw_\nfontw_:" );

	/*
	 * Define fonts for 128 characters.
	 */
	for (i=0; i < sizeof ibuf; ++i) {

		/* Format and print one pixel line */
		j = 16;
		s = ibuf[i];
		while ( --j >= 8 ) {
			obuf[j] = (s&1) ? 'X' : '_' ;
			s >>= 1;
		}
		send( obuf );

		/* Insert blank line between characters for readability */
		if ( (i & 7) == 7 )
			send( "\n" );
	}
	exit( 0 );
}

/*
 * Fatal( msg ) - report error, and abort.
 */

fatal( msg )
register char *msg;
{
	write( 2, msg, strlen(msg) );
	exit( 1 );
}

/*
 * send( s ) - write null-terminated string to standard output.
 */

send( s )
register char *s;
{
	write( 1, s, strlen(s) );
}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.