cd6887ac3c34cfb407e3416de82964e6a630bbab
[reactos.git] / reactos / ntoskrnl / kd / mda.c
1 /* $Id$
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/kd/mda.c
6 * PURPOSE: Support for debugging using an MDA card.
7 *
8 * PROGRAMMERS: David Welch <welch@cwcom.net>
9 */
10
11 /* INCLUDES ******************************************************************/
12
13 #include <ntoskrnl.h>
14 #include "../dbg/kdb.h"
15
16 /* VARIABLES ***************************************************************/
17
18 STATIC ULONG MdaIndexPort;
19 STATIC ULONG MdaValuePort;
20 STATIC ULONG MdaStatusPort;
21 STATIC ULONG MdaGfxPort;
22 STATIC ULONG MdaModePort;
23 STATIC PUSHORT VideoBuffer;
24
25 #define MDA_COLUMNS (80)
26 #define MDA_LINES (25)
27
28 STATIC ULONG MdaCursorX, MdaCursorY;
29
30 /* PRIVATE FUNCTIONS ********************************************************/
31
32 #if 0
33 VOID STATIC
34 KdWriteByteMDA(ULONG Reg, ULONG Value)
35 {
36 WRITE_PORT_UCHAR((PUCHAR)MdaIndexPort, (CHAR)Reg);
37 WRITE_PORT_UCHAR((PUCHAR)MdaValuePort, (CHAR)Value);
38 }
39
40 VOID STATIC
41 KdWriteWordMDA(ULONG Reg, ULONG Value)
42 {
43 WRITE_PORT_UCHAR((PUCHAR)MdaIndexPort, (CHAR)Reg);
44 WRITE_PORT_UCHAR((PUCHAR)MdaValuePort, (CHAR)(Value >> 8));
45 WRITE_PORT_UCHAR((PUCHAR)MdaIndexPort, (CHAR)(Reg + 1));
46 WRITE_PORT_UCHAR((PUCHAR)MdaValuePort, (CHAR)(Value & 0xFF));
47 }
48 #endif
49
50 VOID
51 KdInitializeMda(VOID)
52 {
53 /* Setup the variables for the various port addresses. */
54 MdaIndexPort = 0x3b4;
55 MdaValuePort = 0x3b5;
56 MdaModePort = 0x3b8;
57 MdaStatusPort = 0x3ba;
58 MdaGfxPort = 0x3bf;
59
60 VideoBuffer = (PUSHORT)(0xff3b0000);
61
62 MdaCursorX = MdaCursorY = 0;
63 }
64
65 VOID STATIC
66 KdScrollMda(VOID)
67 {
68 memmove(&VideoBuffer[(MDA_COLUMNS * 0) + 0],
69 &VideoBuffer[(MDA_COLUMNS * 1) + 0],
70 MDA_COLUMNS * (MDA_LINES - 1) * 2);
71 memset(&VideoBuffer[(MDA_COLUMNS * (MDA_LINES - 1)) + 0], 0,
72 MDA_COLUMNS * 2);
73 }
74
75 VOID STATIC
76 KdPutCharMda(CHAR Ch)
77 {
78 if (Ch == '\n')
79 {
80 if (MdaCursorY == (MDA_LINES - 1))
81 {
82 KdScrollMda();
83 }
84 else
85 {
86 MdaCursorY++;
87 }
88 MdaCursorX = 0;
89 return;
90 }
91 VideoBuffer[(MdaCursorY * MDA_COLUMNS) + MdaCursorX] = (Ch & 0xFF) | 0x0700;
92 MdaCursorX++;
93 if (MdaCursorX == (MDA_COLUMNS - 1))
94 {
95 if (MdaCursorY == (MDA_LINES - 1))
96 {
97 KdScrollMda();
98 }
99 else
100 {
101 MdaCursorY++;
102 }
103 MdaCursorX = 0;
104 }
105 }
106
107 VOID
108 KdPrintMda(PCH pch)
109 {
110 while((*pch) != 0)
111 {
112 if ((*pch) == '\t')
113 {
114 KdPutCharMda(' ');
115 KdPutCharMda(' ');
116 KdPutCharMda(' ');
117 KdPutCharMda(' ');
118 }
119 if ((*pch) == '\r')
120 {
121 /* Nothing. */
122 }
123 else
124 {
125 KdPutCharMda(*pch);
126 }
127 pch++;
128 }
129 }
130
131 /* EOF */