|
|
1.1 root 1: #define _DDI_DKI 1
2: #define _SYSV4 1
3:
4: /*
5: * Simple console output for kernel debugging.
6: *
7: * This module exists to service the DDI/DKI cmn_err () function, which takes
8: * care of details like locking. This function is a simple debugging output
9: * which on PC's expects to write to the screen memory.
10: */
11:
12: /*
13: *-IMPORTS:
14: * <common/ccompat.h>
15: * __USE_PROTO__
16: * __ARGS ()
17: * <common/xdebug.h>
18: * __LOCAL__
19: */
20:
21: #include <common/ccompat.h>
22: #include <common/xdebug.h>
23:
24:
25: /*
26: * For the IBM PC, simply define a way of making the console directly-
27: * addressable memory. A plausible and useful alternative would be to define
28: * a "console" virtual terminal that audiovisually signals the operator (via
29: * the speaker and by palette "flash") when new information is written to it.
30: *
31: * That's a creature feature for later.
32: */
33:
34: #if defined (GNUDOS)
35:
36: #include <pc.h>
37:
38: #define _putconsole(x,y,c) ScreenPutChar (c, 0x07, x, y)
39: #define _setcursor(x,y) ScreenSetCursor (y, x)
40:
41: #elif __BORLANDC__
42:
43: #include <dos.h>
44:
45: #define _putconsole(x,y,c) (* ((int __far *) MK_FP (0xB800, \
46: ((x) - 1 + ((y) - 1) * 80) * 2)) \
47: = (c) | 0x700)
48: __LOCAL__ void _setcursor (int x, int y) {
49: union REGS regs;
50: regs.h.ah = 0x2;
51: regs.h.dh = y;
52: regs.h.dl = x;
53: regs.h.bh = 0;
54: int86 (0x10, & regs, & regs);
55: }
56:
57: #else
58:
59: #error I do not know how to perform debugging output on this system
60:
61: #endif
62:
63:
64: /*
65: * Local state for the simple debug output.
66: */
67:
68: __LOCAL__ struct {
69: unsigned x;
70: unsigned y;
71: unsigned width;
72: unsigned height;
73: } _console = {
74: 1, 1, 80, 25
75: };
76:
77:
78: /*
79: *-STATUS:
80: * Private to cmn_err ()
81: *
82: *-NAME:
83: * _put_console () simple console debugging output
84: *
85: *-ARGUMENTS:
86: * outch The character to display on the system console. The
87: * '\n' and '\r' characters are interpreted as carriage-
88: * return+line-feed and carriage-return respectively.
89: * It is recommended that '\a' also be interpreted and
90: * audibly signal the console operator if the
91: * implementation can possibly do so.
92: *
93: *-DESCRIPTION:
94: * This function provides system-specific debugging output support for
95: * the DDI/DKI cnm_err () function, interfacing to the system console
96: * hardware.
97: *
98: *-NOTES:
99: * This function does not sleep.
100: *
101: * Driver-defined basic locks, read/write locks and sleep locks may
102: * be held across calls to this function.
103: */
104:
105: #if __USE_PROTO__
106: void (_put_console) (unsigned char outch)
107: #else
108: void
109: _put_console __ARGS ((outch))
110: unsigned char outch;
111: #endif
112: {
113: switch (outch) {
114:
115: case '\n': /* Carriage return... clear to eol */
116:
117: while (_console.x < _console.width)
118: _putconsole (_console.x ++, _console.y, ' ');
119: nextline:
120: _console.x = 1;
121:
122: /*
123: * Don't bother scrolling, just wrap around will do.
124: */
125:
126: _console.y = _console.y % _console.height + 1;
127: break;
128:
129: case '\r':
130: _console.x = 0;
131: break;
132:
133: case '\a':
134: break;
135:
136: default:
137: _putconsole (_console.x ++, _console.y, outch);
138:
139: if (_console.x > _console.width)
140: goto nextline;
141:
142: break;
143: }
144:
145: _setcursor (_console.x, _console.y);
146: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.