xref: /csrg-svn/sys/hp300/stand/ite_subr.c (revision 54073)
141488Smckusick /*
241488Smckusick  * Copyright (c) 1988 University of Utah.
341488Smckusick  * Copyright (c) 1990 The Regents of the University of California.
441488Smckusick  * All rights reserved.
541488Smckusick  *
641488Smckusick  * This code is derived from software contributed to Berkeley by
741488Smckusick  * the Systems Programming Group of the University of Utah Computer
841488Smckusick  * Science Department.
941488Smckusick  *
1041488Smckusick  * %sccs.include.redist.c%
1141488Smckusick  *
12*54073Shibler  * from: Utah $Hdr: ite_subr.c 1.2 92/01/20$
1341488Smckusick  *
14*54073Shibler  *	@(#)ite_subr.c	7.3 (Berkeley) 06/18/92
1541488Smckusick  */
1641488Smckusick 
1741488Smckusick #include "samachdep.h"
1841488Smckusick 
1941488Smckusick #ifdef ITECONSOLE
2041488Smckusick 
2145790Sbostic #include "sys/param.h"
22*54073Shibler #include "hp/dev/itevar.h"
23*54073Shibler #include "hp/dev/itereg.h"
2441488Smckusick 
25*54073Shibler ite_fontinfo(ip)
2641488Smckusick 	struct ite_softc *ip;
2741488Smckusick {
28*54073Shibler 	u_long fontaddr = getword(ip, getword(ip, FONTROM) + FONTADDR);
2941488Smckusick 
30*54073Shibler 	ip->ftheight = getbyte(ip, fontaddr + FONTHEIGHT);
31*54073Shibler 	ip->ftwidth  = getbyte(ip, fontaddr + FONTWIDTH);
3241488Smckusick 	ip->rows     = ip->dheight / ip->ftheight;
3341488Smckusick 	ip->cols     = ip->dwidth / ip->ftwidth;
3441488Smckusick 
3541488Smckusick 	if (ip->fbwidth > ip->dwidth) {
3641488Smckusick 		/*
3741488Smckusick 		 * Stuff goes to right of display.
3841488Smckusick 		 */
3941488Smckusick 		ip->fontx    = ip->dwidth;
4041488Smckusick 		ip->fonty    = 0;
4141488Smckusick 		ip->cpl      = (ip->fbwidth - ip->dwidth) / ip->ftwidth;
4241488Smckusick 		ip->cblankx  = ip->dwidth;
4341488Smckusick 		ip->cblanky  = ip->fonty + ((128 / ip->cpl) +1) * ip->ftheight;
4441488Smckusick 	}
4541488Smckusick 	else {
4641488Smckusick 		/*
4741488Smckusick 		 * Stuff goes below the display.
4841488Smckusick 		 */
4941488Smckusick 		ip->fontx   = 0;
5041488Smckusick 		ip->fonty   = ip->dheight;
5141488Smckusick 		ip->cpl     = ip->fbwidth / ip->ftwidth;
5241488Smckusick 		ip->cblankx = 0;
5341488Smckusick 		ip->cblanky = ip->fonty + ((128 / ip->cpl) + 1) * ip->ftheight;
5441488Smckusick 	}
5541488Smckusick }
5641488Smckusick 
5741488Smckusick ite_fontinit(ip)
5841488Smckusick 	register struct ite_softc *ip;
5941488Smckusick {
60*54073Shibler 	int bytewidth = (((ip->ftwidth - 1) / 8) + 1);
61*54073Shibler 	int glyphsize = bytewidth * ip->ftheight;
62*54073Shibler 	u_char fontbuf[500];
63*54073Shibler 	u_char *dp, *fbmem;
64*54073Shibler 	int c, i, romp;
65*54073Shibler 
66*54073Shibler 	romp = getword(ip, getword(ip, FONTROM) + FONTADDR) + FONTDATA;
67*54073Shibler 	for (c = 0; c < 128; c++) {
68*54073Shibler 		fbmem = (u_char *)
69*54073Shibler 		    (FBBASE +
70*54073Shibler 		     (ip->fonty + (c / ip->cpl) * ip->ftheight) * ip->fbwidth +
71*54073Shibler 		     (ip->fontx + (c % ip->cpl) * ip->ftwidth));
72*54073Shibler 		dp = fontbuf;
73*54073Shibler 		for (i = 0; i < glyphsize; i++) {
74*54073Shibler 			*dp++ = getbyte(ip, romp);
75*54073Shibler 			romp += 2;
76*54073Shibler 		}
77*54073Shibler 		writeglyph(ip, fbmem, fontbuf);
78*54073Shibler 	}
79*54073Shibler }
80*54073Shibler 
81*54073Shibler /*
82*54073Shibler  * Display independent versions of the readbyte and writeglyph routines.
83*54073Shibler  */
84*54073Shibler u_char
85*54073Shibler ite_readbyte(ip, disp)
86*54073Shibler 	struct ite_softc *ip;
87*54073Shibler 	int disp;
88*54073Shibler {
89*54073Shibler 	return((u_char) *(((u_char *)ip->regbase) + disp));
90*54073Shibler }
91*54073Shibler 
92*54073Shibler ite_writeglyph(ip, fbmem, glyphp)
93*54073Shibler 	register struct ite_softc *ip;
94*54073Shibler 	register u_char *fbmem, *glyphp;
95*54073Shibler {
9641488Smckusick 	register int bn;
9741488Smckusick 	int c, l, b;
9841488Smckusick 
99*54073Shibler 	for (l = 0; l < ip->ftheight; l++) {
100*54073Shibler 		bn = 7;
101*54073Shibler 		for (b = 0; b < ip->ftwidth; b++) {
102*54073Shibler 			if ((1 << bn) & *glyphp)
103*54073Shibler 				*fbmem++ = 1;
104*54073Shibler 			else
105*54073Shibler 				*fbmem++ = 0;
106*54073Shibler 			if (--bn < 0) {
107*54073Shibler 				bn = 7;
108*54073Shibler 				glyphp++;
10941488Smckusick 			}
11041488Smckusick 		}
111*54073Shibler 		if (bn < 7)
112*54073Shibler 			glyphp++;
113*54073Shibler 		fbmem -= ip->ftwidth;
114*54073Shibler 		fbmem += ip->fbwidth;
11541488Smckusick 	}
11641488Smckusick }
11741488Smckusick #endif
118