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
018 #include <sos/klibc.h> 019 #include <sos/klibc.h>
019 #include <hwcore/ioports.h> 020 #include <hwcore/ioports.h>
020 021
021 #include "x86_videomem.h" 022 #include "x86_videomem.h"
022 023
023 024
024 025
025 026
026 #define VIDEO 0xb8000 027 #define VIDEO 0xb8000
027 028
028 029
029 030
030 #define LINES 25 031 #define LINES 25
031 #define COLUMNS 80 032 #define COLUMNS 80
032 033
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 034
050 035
051 036
052 typedef struct { 037 typedef struct {
053 unsigned char character; 038 unsigned char character;
054 unsigned char attribute; 039 unsigned char attribute;
055 } __attribute__ ((packed)) x86_video_mem[LINES 040 } __attribute__ ((packed)) x86_video_mem[LINES*COLUMNS];
056 041
057 042
058 043
059 044
060 static volatile x86_video_mem *video = (volati 045 static volatile x86_video_mem *video = (volatile x86_video_mem*)VIDEO;
061 046
062 sos_ret_t sos_x86_videomem_setup(void) 047 sos_ret_t sos_x86_videomem_setup(void)
063 { 048 {
>> 049
>> 050
>> 051
>> 052
>> 053 #define CRT_REG_INDEX 0x3d4
>> 054 #define CRT_REG_DATA 0x3d5
>> 055
064 056
065 057
066 outb(0x0a, VGA_COMMAND_PORT); !! 058 outb(0x0a, CRT_REG_INDEX);
067 059
068 060
069 outb(1 << 5, VGA_DATA_PORT); !! 061 outb(1 << 5, CRT_REG_DATA);
070 062
071 return SOS_OK; 063 return SOS_OK;
072 } 064 }
073 065
074 066
075 sos_ret_t sos_x86_videomem_cls(unsigned char a 067 sos_ret_t sos_x86_videomem_cls(unsigned char attribute)
076 { 068 {
077 069
078 int i; 070 int i;
079 for(i = 0 ; i < LINES*COLUMNS ; i++) 071 for(i = 0 ; i < LINES*COLUMNS ; i++)
080 { 072 {
081 (*video)[i].character = 0; 073 (*video)[i].character = 0;
082 (*video)[i].attribute = attribute; 074 (*video)[i].attribute = attribute;
083 } 075 }
084 076
085 return SOS_OK; !! 077 return SOS_OK;
086 } 078 }
087 079
088 080
089 sos_ret_t sos_x86_videomem_putstring(unsigned 081 sos_ret_t sos_x86_videomem_putstring(unsigned char row, unsigned char col,
090 unsigned 082 unsigned char attribute,
091 const cha 083 const char *str)
092 { 084 {
093 unsigned video_offs = row*COLUMNS + col; 085 unsigned video_offs = row*COLUMNS + col;
094 086
095 if (video_offs >= LINES*COLUMNS) 087 if (video_offs >= LINES*COLUMNS)
096 return -SOS_EINVAL; 088 return -SOS_EINVAL;
097 !! 089
098 for ( ; str && *str && (video_offs < LINES*C 090 for ( ; str && *str && (video_offs < LINES*COLUMNS) ; str++, video_offs++)
099 { 091 {
100 (*video)[video_offs].character = (unsign 092 (*video)[video_offs].character = (unsigned char)*str;
101 (*video)[video_offs].attribute = attribu 093 (*video)[video_offs].attribute = attribute;
102 } 094 }
103 095
104 return SOS_OK; 096 return SOS_OK;
105 } 097 }
106 098
107 099
108 sos_ret_t sos_x86_videomem_putchar(unsigned ch 100 sos_ret_t sos_x86_videomem_putchar(unsigned char row, unsigned char col,
109 unsigned ch 101 unsigned char attribute,
110 unsigned ch 102 unsigned char c)
111 { 103 {
112 unsigned video_offs = row*COLUMNS + col; 104 unsigned video_offs = row*COLUMNS + col;
113 105
114 if (video_offs >= LINES*COLUMNS) 106 if (video_offs >= LINES*COLUMNS)
115 return -SOS_EINVAL; 107 return -SOS_EINVAL;
116 !! 108
117 (*video)[video_offs].character = c; 109 (*video)[video_offs].character = c;
118 (*video)[video_offs].attribute = attribute; 110 (*video)[video_offs].attribute = attribute;
119 111
120 return SOS_OK; 112 return SOS_OK;
121 } 113 }
122 114
123 115
124 sos_ret_t sos_x86_videomem_printf(unsigned cha 116 sos_ret_t sos_x86_videomem_printf(unsigned char row, unsigned char col,
125 unsigned cha 117 unsigned char attribute,
126 const char * 118 const char *format, ...)
127 { 119 {
128 char buff[256]; 120 char buff[256];
129 va_list ap; 121 va_list ap;
130 !! 122
131 va_start(ap, format); 123 va_start(ap, format);
132 vsnprintf(buff, sizeof(buff), format, ap); 124 vsnprintf(buff, sizeof(buff), format, ap);
133 va_end(ap); 125 va_end(ap);
134 !! 126
135 return sos_x86_videomem_putstring(row, col, 127 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 } 128 }