|
|
1.1 root 1: /*
2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * The contents of this file constitute Original Code as defined in and
7: * are subject to the Apple Public Source License Version 1.1 (the
8: * "License"). You may not use this file except in compliance with the
9: * License. Please obtain a copy of the License at
10: * http://www.apple.com/publicsource and read it before using this file.
11: *
12: * This Original Code and all software distributed under the License are
13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17: * License for the specific language governing rights and limitations
18: * under the License.
19: *
20: * @APPLE_LICENSE_HEADER_END@
21: */
22: #include "debug_font.h"
23:
24:
25: #define kNormal 0
26: #define kBold 1
27: #define kInverse 2
28:
29:
30: #define kCharHeight 12 // pixels
31: #define kCharWidth 6 // pixels
32: #define kHeaderHeight 18 // pixels
33:
34: /* Internal routines */
35: void init_display_putc(unsigned char *baseaddr, int rowbytes, int height);
36: void display_putc(char c);
37: void scroll(void);
38: void checkXY(void);
39: void copyNormalChar(unsigned char *bptr, unsigned char *fptr);
40: void copyBoldChar(unsigned char *bptr, unsigned char *fptr);
41: void copyInverseChar(unsigned char *bptr, unsigned char *fptr);
42:
43: /* globals */
44: static unsigned char *gBaseAddr;
45: static int gRowBytes, gHeight;
46: static int gCursorX, gCursorY; // Where the cursor is at all times
47: static int gMaxX, gMaxY; // screen limits
48: static int gStyle; // normal, bold, inverse, etc.
49:
50: void init_display_putc(unsigned char *baseaddr, int rowbytes, int height)
51: {
52: if (!baseaddr)
53: gBaseAddr = 0;
54: else
55: {
56: gBaseAddr = baseaddr;
57: gRowBytes = rowbytes;
58: gHeight = height;
59: gCursorX = 0;
60: gCursorY = 2;
61: gStyle = kNormal;
62: gMaxX = gRowBytes / kCharWidth;
63: gMaxY = gHeight / kCharHeight;
64: }
65: }
66:
67: void display_putc(char c)
68: {
69: register unsigned char *bptr;
70: register unsigned char *fptr;
71:
72:
73: // handle special characters first
74: switch (c)
75: {
76: case '\t': gCursorX += 4; return;
77: case '\b': gCursorX -= 4; return;
78: case '\n': gCursorX = 0; gCursorY++; return;
79: case '\r': gCursorX = 0; gCursorY++; return;
80: case '\300': gStyle = kNormal; return;
81: case '\301': gStyle = kBold; return;
82: case '\302': gStyle = kInverse; return;
83: }
84:
85: // scroll if needed
86: checkXY();
87:
88: // non-printable chars are a space
89: if ((c < 0x20) || (c > 0x7e)) c = 0x20;
90:
91: // our font starts with a space
92: c -= 0x20;
93:
94: bptr = gBaseAddr
95: + (gRowBytes * kCharHeight * gCursorY)
96: + (kCharWidth * gCursorX);
97: fptr = Font[(int)c];
98:
99: switch (gStyle)
100: {
101: case kNormal: copyNormalChar(bptr, fptr); break;
102: case kBold: copyBoldChar(bptr, fptr); break;
103: case kInverse: copyInverseChar(bptr, fptr);break;
104: }
105: gCursorX++;
106: }
107:
108:
109: void checkXY(void)
110: {
111: if (gCursorX >= gMaxX)
112: {
113: gCursorX = 0;
114: gCursorY++;
115: }
116:
117: if (gCursorY >= gMaxY)
118: {
119: scroll();
120: gCursorY--;
121: }
122: }
123:
124: void scroll(void)
125: {
126: unsigned long *src;
127: unsigned long *dst;
128: int xlimit = gRowBytes / 4;
129: int ylimit = gHeight - kCharHeight - kHeaderHeight;
130: int x,y;
131:
132: src = (unsigned long*)(gBaseAddr + (gRowBytes * (kCharHeight + kHeaderHeight)));
133: dst = (unsigned long*)(gBaseAddr + (gRowBytes * kHeaderHeight));
134:
135: for (y = 0; y < ylimit; y++)
136: for (x = 0; x < xlimit; x++)
137: *dst++ = *src++;
138: }
139:
140: void copyNormalChar(register unsigned char *bptr, register unsigned char *fptr)
141: {
142: int i;
143:
144: for (i = 0; i < kCharHeight; i++)
145: {
146: *bptr++ = *fptr++; *bptr++ = *fptr++; *bptr++ = *fptr++;
147: *bptr++ = *fptr++; *bptr++ = *fptr++; *bptr++ = *fptr++;
148: bptr += gRowBytes - kCharWidth;
149: }
150: }
151:
152: void copyBoldChar(register unsigned char *bptr, register unsigned char *fptr)
153: {
154: int i;
155:
156: for (i = 0; i < kCharHeight; i++)
157: {
158: *bptr++ = *fptr++; if (!(*fptr)) *(bptr-1) = *fptr;
159: *bptr++ = *fptr++; if (!(*fptr)) *(bptr-1) = *fptr;
160: *bptr++ = *fptr++; if (!(*fptr)) *(bptr-1) = *fptr;
161: *bptr++ = *fptr++; if (!(*fptr)) *(bptr-1) = *fptr;
162: *bptr++ = *fptr++; if (!(*fptr)) *(bptr-1) = *fptr;
163: *bptr++ = *fptr++; if (!(*fptr)) *(bptr-1) = *fptr;
164: bptr += gRowBytes - kCharWidth;
165: }
166: }
167:
168: void copyInverseChar(register unsigned char *bptr, register unsigned char *fptr)
169: {
170: int i;
171:
172: for (i = 0; i < kCharHeight; i++)
173: {
174: *bptr++ = ~(*fptr++);
175: *bptr++ = ~(*fptr++);
176: *bptr++ = ~(*fptr++);
177: *bptr++ = ~(*fptr++);
178: *bptr++ = ~(*fptr++);
179: *bptr++ = ~(*fptr++);
180: bptr += gRowBytes - kCharWidth;
181: }
182: }
183:
184:
185: #if DEBUG
186: void dump_kprintf_state(void)
187: {
188: printf("gBaseAddr=%lx\tgRowBytes=%d\tgHeight=%d\tgStyle=%d\n",
189: (long)gBaseAddr, gRowBytes, gHeight, gStyle);
190: }
191: #endif /* DEBUG */
192:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.