SimpleOS

LXR

Navigation



Site hébergé par : enix

The LXR Cross Referencer for SOS

source navigation ]
diff markup ]
identifier search ]
general search ]
 
 
Article:1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 6.5 ] [ 7 ] [ 7.5 ] [ 8 ] [ 9 ] [ 9.5 ]

Diff markup

Differences between /drivers/x86_videomem.c (Article 9) and /drivers/x86_videomem.c (Article 5)


001 /* Copyright (C) 2004  David Decotigny            001 /* Copyright (C) 2004  David Decotigny
                                                   >> 002    Copyright (C) 1999  Free Software Foundation, Inc.
002                                                   003 
003    This program is free software; you can redi    004    This program is free software; you can redistribute it and/or
004    modify it under the terms of the GNU Genera    005    modify it under the terms of the GNU General Public License
005    as published by the Free Software Foundatio    006    as published by the Free Software Foundation; either version 2
006    of the License, or (at your option) any lat    007    of the License, or (at your option) any later version.
007                                                !! 008    
008    This program is distributed in the hope tha    009    This program is distributed in the hope that it will be useful,
009    but WITHOUT ANY WARRANTY; without even the     010    but WITHOUT ANY WARRANTY; without even the implied warranty of
010    MERCHANTABILITY or FITNESS FOR A PARTICULAR    011    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
011    GNU General Public License for more details    012    GNU General Public License for more details.
012                                                !! 013    
013    You should have received a copy of the GNU     014    You should have received a copy of the GNU General Public License
014    along with this program; if not, write to t    015    along with this program; if not, write to the Free Software
015    Foundation, Inc., 59 Temple Place - Suite 3    016    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
016    USA.                                        !! 017    USA. 
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 /* The text video memory starts at address 0xB    024 /* The text video memory starts at address 0xB8000. Odd bytes are the
024    ASCII value of the character, even bytes ar    025    ASCII value of the character, even bytes are attribute for the
025    preceding character. */                        026    preceding character. */
026 #define VIDEO   0xb8000                           027 #define VIDEO   0xb8000
027                                                   028 
028                                                   029 
029 /* Console screen size */                         030 /* Console screen size */
030 #define LINES   25                                031 #define LINES   25
031 #define COLUMNS 80                                032 #define COLUMNS 80
032                                                   033 
033 /*                                             << 
034  * VGA ports and commands.                     << 
035  *                                             << 
036  * @see Ralf Brown's interrupt (and port) list << 
037  * http://www-2.cs.cmu.edu/~ralf/files.html    << 
038  */                                            << 
039                                                << 
040 /* VGA ports */                                << 
041 #define VGA_COMMAND_PORT 0x3D4                 << 
042 #define VGA_DATA_PORT    0x3D5                 << 
043                                                << 
044 /* VGA commands */                             << 
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 /** The structure of a character element in th    035 /** The structure of a character element in the video memory. @see
051     http://webster.cs.ucr.edu/AoA DOS edition     036     http://webster.cs.ucr.edu/AoA DOS edition chapter 23 */
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 /** The base pointer for the video memory */      044 /** The base pointer for the video memory */
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    * Hide cursor. @see Ralf Brown's interrupt (and port) list
                                                   >> 051    * http://www-2.cs.cmu.edu/~ralf/files.html
                                                   >> 052    */
                                                   >> 053 #define CRT_REG_INDEX 0x3d4
                                                   >> 054 #define CRT_REG_DATA  0x3d5
                                                   >> 055 
064   /* CRT index port => ask for access to regis    056   /* CRT index port => ask for access to register 0xa ("cursor
065      start") */                                   057      start") */
066   outb(0x0a, VGA_COMMAND_PORT);                !! 058   outb(0x0a, CRT_REG_INDEX);
067                                                   059 
068   /* (RBIL Tables 708 & 654) CRT Register 0xa     060   /* (RBIL Tables 708 & 654) CRT Register 0xa => bit 5 = cursor OFF */
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   /* Clears the screen */                         069   /* Clears the screen */
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, /* args */...)
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  * Console that supports scrolling, based on t << 
141  * above. This console only takes part of the  << 
142  * CONSOLE_ROW_START. The rows before that one << 
143  * kernel debugging messages.                  << 
144  */                                            << 
145                                                << 
146 /* Current row in the high-level console. Must << 
147    computations inside sos_screen_putchar() */ << 
148 static int row;                                << 
149                                                << 
150 /* Current column in the high-level console. M << 
151    of computations inside sos_screen_putchar() << 
152 static int col;                                << 
153                                                << 
154 /* The limit between the low-level console, ac << 
155    and the high-level console, accessible to t << 
156    through the sos_screen_putchar() function.  << 
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       /* Go to first row */                    << 
176       col = 0;                                 << 
177     }                                          << 
178                                                << 
179   /* New line */                               << 
180   else if (c == '\n')                          << 
181     {                                          << 
182       /* Go to next line */                    << 
183       col = 0;                                 << 
184       row ++;                                  << 
185     }                                          << 
186                                                << 
187   /* Remove the last character */              << 
188   else if (c == '\b')                          << 
189     {                                          << 
190       /* Next character should be displayed in << 
191          one */                                << 
192       col --;                                  << 
193                                                << 
194       /* Handle the case where we're at the be << 
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       /* Replace the current character with a  << 
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   /* Need to scroll ? */                       << 
224   if (row == LINES)                            << 
225     {                                          << 
226       int i;                                   << 
227                                                << 
228       /* Copy each line in the previous line * << 
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       /* Reset the last line of the console */ << 
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   /* Set the first scan line for the cursor, a << 
255      mode. First scan line is 11, so that we h << 
256      cursor. */                                << 
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 }
                                                      

source navigation ] diff markup ] identifier search ] general search ]