Diff markup
001 001
002 002
003 003
004 004
005 005
006 006
007 !! 007
008 008
009 009
010 010
011 011
012 !! 012
013 013
014 014
015 015
016 !! 016
017 017
018 #include <sos/klibc.h> 018 #include <sos/klibc.h>
019 #include <hwcore/ioports.h> 019 #include <hwcore/ioports.h>
020 020
021 #include "x86_videomem.h" 021 #include "x86_videomem.h"
022 022
023 023
024 024
025 025
026 #define VIDEO 0xb8000 026 #define VIDEO 0xb8000
027 027
028 028
029 029
030 #define LINES 25 030 #define LINES 25
031 #define COLUMNS 80 031 #define COLUMNS 80
032 032
033 <<
034 <<
035 <<
036 <<
037 <<
038 <<
039 <<
040 <<
041 #define VGA_COMMAND_PORT 0x3D4 <<
042 #define VGA_DATA_PORT 0x3D5 <<
043 <<
044 <<
045 #define VGA_SET_CURSOR_START 0xA <<
046 #define VGA_SET_CURSOR_END 0xB <<
047 #define VGA_SET_CURSOR_HIGH 0xE <<
048 #define VGA_SET_CURSOR_LOW 0xF <<
049 033
050 034
051 035
052 typedef struct { 036 typedef struct {
053 unsigned char character; 037 unsigned char character;
054 unsigned char attribute; 038 unsigned char attribute;
055 } __attribute__ ((packed)) x86_video_mem[LINES 039 } __attribute__ ((packed)) x86_video_mem[LINES*COLUMNS];
056 040
057 041
058 042
059 043
060 static volatile x86_video_mem *video = (volati 044 static volatile x86_video_mem *video = (volatile x86_video_mem*)VIDEO;
061 045
062 sos_ret_t sos_x86_videomem_setup(void) 046 sos_ret_t sos_x86_videomem_setup(void)
063 { 047 {
>> 048
>> 049
>> 050
>> 051
>> 052 #define CRT_REG_INDEX 0x3d4
>> 053 #define CRT_REG_DATA 0x3d5
>> 054
064 055
065 056
066 outb(0x0a, VGA_COMMAND_PORT); !! 057 outb(0x0a, CRT_REG_INDEX);
067 058
068 059
069 outb(1 << 5, VGA_DATA_PORT); !! 060 outb(1 << 5, CRT_REG_DATA);
070 061
071 return SOS_OK; 062 return SOS_OK;
072 } 063 }
073 064
074 065
075 sos_ret_t sos_x86_videomem_cls(unsigned char a 066 sos_ret_t sos_x86_videomem_cls(unsigned char attribute)
076 { 067 {
077 068
078 int i; 069 int i;
079 for(i = 0 ; i < LINES*COLUMNS ; i++) 070 for(i = 0 ; i < LINES*COLUMNS ; i++)
080 { 071 {
081 (*video)[i].character = 0; 072 (*video)[i].character = 0;
082 (*video)[i].attribute = attribute; 073 (*video)[i].attribute = attribute;
083 } 074 }
084 075
085 return SOS_OK; !! 076 return SOS_OK;
086 } 077 }
087 078
088 079
089 sos_ret_t sos_x86_videomem_putstring(unsigned 080 sos_ret_t sos_x86_videomem_putstring(unsigned char row, unsigned char col,
090 unsigned 081 unsigned char attribute,
091 const cha 082 const char *str)
092 { 083 {
093 unsigned video_offs = row*COLUMNS + col; 084 unsigned video_offs = row*COLUMNS + col;
094 085
095 if (video_offs >= LINES*COLUMNS) 086 if (video_offs >= LINES*COLUMNS)
096 return -SOS_EINVAL; 087 return -SOS_EINVAL;
097 !! 088
098 for ( ; str && *str && (video_offs < LINES*C 089 for ( ; str && *str && (video_offs < LINES*COLUMNS) ; str++, video_offs++)
099 { 090 {
100 (*video)[video_offs].character = (unsign 091 (*video)[video_offs].character = (unsigned char)*str;
101 (*video)[video_offs].attribute = attribu 092 (*video)[video_offs].attribute = attribute;
102 } 093 }
103 094
104 return SOS_OK; 095 return SOS_OK;
105 } 096 }
106 097
107 098
108 sos_ret_t sos_x86_videomem_putchar(unsigned ch 099 sos_ret_t sos_x86_videomem_putchar(unsigned char row, unsigned char col,
109 unsigned ch 100 unsigned char attribute,
110 unsigned ch 101 unsigned char c)
111 { 102 {
112 unsigned video_offs = row*COLUMNS + col; 103 unsigned video_offs = row*COLUMNS + col;
113 104
114 if (video_offs >= LINES*COLUMNS) 105 if (video_offs >= LINES*COLUMNS)
115 return -SOS_EINVAL; 106 return -SOS_EINVAL;
116 !! 107
117 (*video)[video_offs].character = c; 108 (*video)[video_offs].character = c;
118 (*video)[video_offs].attribute = attribute; 109 (*video)[video_offs].attribute = attribute;
119 110
120 return SOS_OK; 111 return SOS_OK;
121 } 112 }
122 113
123 114
124 sos_ret_t sos_x86_videomem_printf(unsigned cha 115 sos_ret_t sos_x86_videomem_printf(unsigned char row, unsigned char col,
125 unsigned cha 116 unsigned char attribute,
126 const char * 117 const char *format, ...)
127 { 118 {
128 char buff[256]; 119 char buff[256];
129 va_list ap; 120 va_list ap;
130 !! 121
131 va_start(ap, format); 122 va_start(ap, format);
132 vsnprintf(buff, sizeof(buff), format, ap); 123 vsnprintf(buff, sizeof(buff), format, ap);
133 va_end(ap); 124 va_end(ap);
134 !! 125
135 return sos_x86_videomem_putstring(row, col, 126 return sos_x86_videomem_putstring(row, col, attribute, buff);
136 } <<
137 <<
138 <<
139 <<
140 <<
141 <<
142 <<
143 <<
144 <<
145 <<
146 <<
147 <<
148 static int row; <<
149 <<
150 <<
151 <<
152 static int col; <<
153 <<
154 <<
155 <<
156 <<
157 #define CONSOLE_ROW_START 12 <<
158 <<
159 static void sos_screen_set_cursor (unsigned in <<
160 { <<
161 unsigned int pos; <<
162 <<
163 pos = (_row * COLUMNS + _col); <<
164 <<
165 outb(VGA_SET_CURSOR_HIGH, VGA_COMMAND_PORT); <<
166 outb( (pos >> 8), VGA_DATA_PORT); <<
167 outb(VGA_SET_CURSOR_LOW, VGA_COMMAND_PORT); <<
168 outb( (pos & 0xFF), VGA_DATA_PORT); <<
169 } <<
170 <<
171 sos_ret_t sos_screen_putchar (char c) <<
172 { <<
173 if (c == '\r') <<
174 { <<
175 <<
176 col = 0; <<
177 } <<
178 <<
179 <<
180 else if (c == '\n') <<
181 { <<
182 <<
183 col = 0; <<
184 row ++; <<
185 } <<
186 <<
187 <<
188 else if (c == '\b') <<
189 { <<
190 <<
191 <<
192 col --; <<
193 <<
194 <<
195 if (col < 0) <<
196 { <<
197 row --; <<
198 col = COLUMNS-1; <<
199 <<
200 if (row < CONSOLE_ROW_START) <<
201 { <<
202 row = CONSOLE_ROW_START; <<
203 col = 0; <<
204 } <<
205 } <<
206 <<
207 <<
208 sos_x86_videomem_putchar <<
209 (row, col, SOS_X86_VIDEO_FG_BLUE | SOS <<
210 } <<
211 else if (c != 0) <<
212 { <<
213 sos_x86_videomem_putchar <<
214 (row, col, SOS_X86_VIDEO_FG_BLUE | SOS <<
215 col++; <<
216 if (col == COLUMNS) <<
217 { <<
218 col = 0; <<
219 row++; <<
220 } <<
221 } <<
222 <<
223 <<
224 if (row == LINES) <<
225 { <<
226 int i; <<
227 <<
228 <<
229 for (i = CONSOLE_ROW_START; i < LINES; i <<
230 memcpy ((char*) video + i * COLUMNS * <<
231 (char*) video + ((i + 1) * COL <<
232 COLUMNS * 2); <<
233 <<
234 <<
235 for (i = 0; i < COLUMNS; i++) <<
236 sos_x86_videomem_putchar <<
237 (LINES-1, i, SOS_X86_VIDEO_FG_BLUE | <<
238 <<
239 row--; <<
240 } <<
241 <<
242 sos_screen_set_cursor (row, col); <<
243 <<
244 return SOS_OK; <<
245 } <<
246 <<
247 sos_ret_t sos_screen_init (void) <<
248 { <<
249 int i, j; <<
250 <<
251 row = CONSOLE_ROW_START; <<
252 col = 0; <<
253 <<
254 <<
255 <<
256 <<
257 outb(VGA_SET_CURSOR_START, VGA_COMMAND_PORT) <<
258 outb(((0x2 << 5) | 14), VGA_DATA_PORT); <<
259 <<
260 for (i = CONSOLE_ROW_START; i < LINES; i++) <<
261 { <<
262 for (j = 0; j < COLUMNS; j++) <<
263 sos_x86_videomem_putchar <<
264 (i, j, SOS_X86_VIDEO_FG_BLUE | SOS_X <<
265 } <<
266 <<
267 sos_screen_set_cursor (row, col); <<
268 <<
269 return SOS_OK; <<
270 } 127 }