00001
00002
00003
00004
00005
00006
00007
00008 #include <const.h>
00009 #include <stdarg.h>
00010 #include <stdio.h>
00011
00012 #include <arch/mem.h>
00013
00014 #include <kernel/keyboard.h>
00015 #include <kernel/kmalloc.h>
00016 #include <kernel/task.h>
00017 #include <kernel/video.h>
00018
00019 #include <kernel/console.h>
00020
00021
00022 #define VIDEO_BUFFER VIDEO_MEM_ADDRESS
00023
00024 #define VIDEO_BUF_DIM (80*25)
00025
00026
00027 static console_t vir_cons[K_TOT_VIR_CONS+1];
00028
00029 static int curr_cons=1;
00030
00031
00032
00033
00034
00035
00036
00037 console_t *get_console_addr(int c)
00038 {
00039 if ( (c>=0) && (c<=K_TOT_VIR_CONS) )
00040 return( (console_t *)(&vir_cons[c]) );
00041
00042 return((console_t *)NULL);
00043 }
00044
00045
00046
00047 int get_curr_console()
00048 {
00049 return(curr_cons);
00050 }
00051
00052
00053
00054
00055
00056
00057 bool set_curr_console(int c)
00058 {
00059 if ( (c > 0) && (c <= K_TOT_VIR_CONS) )
00060 curr_cons = c;
00061 else
00062 return(FALSE);
00063
00064 return(TRUE);
00065 }
00066
00067
00068
00069
00070
00071
00072 bool switch_to_console(int c)
00073 {
00074 if ( c == curr_cons)
00075
00076 return(TRUE);
00077
00078
00079 memcpyw(vir_cons[curr_cons].vid_buffer, vir_cons[0].vid_buffer, VIDEO_BUF_DIM);
00080 vir_cons[curr_cons].cur_pos = vir_cons[0].cur_pos;
00081 vir_cons[curr_cons].cur_color = vir_cons[0].cur_color;
00082
00083 if ( set_curr_console(c) )
00084 {
00085
00086 memcpyw(vir_cons[0].vid_buffer, vir_cons[c].vid_buffer, VIDEO_BUF_DIM);
00087 k_set_cur_pos( (console_t *)(&vir_cons[0]), vir_cons[c].cur_pos );
00088 k_set_color( (console_t *)(&vir_cons[0]), vir_cons[c].cur_color );
00089
00090
00091 update_leds();
00092
00093 return(TRUE);
00094 }
00095 return(FALSE);
00096 }
00097
00098
00099
00100
00101 void clrscr()
00102 {
00103 task_t *p;
00104
00105 if ( !(p=get_curr_task()) )
00106 {
00107
00108 k_clrscr( (console_t *)(&vir_cons[0]) );
00109 return;
00110 }
00111
00112 if ( p->console==curr_cons )
00113
00114
00115 k_clrscr( (console_t *)(&vir_cons[0]) );
00116 else
00117
00118
00119 k_clrscr( (console_t *)(&vir_cons[p->console]) );
00120 }
00121
00122
00123
00124 byte get_color()
00125 {
00126 task_t *p;
00127
00128 if ( !(p=get_curr_task()) )
00129 {
00130
00131 return( k_get_color((console_t *)(&vir_cons[0])) );
00132 }
00133
00134 if ( p->console==curr_cons )
00135
00136
00137 return( k_get_color((console_t *)(&vir_cons[0])) );
00138 else
00139
00140
00141 return( k_get_color((console_t *)(&vir_cons[p->console])) );
00142 }
00143
00144
00145
00146 void set_color(byte attrib)
00147 {
00148 task_t *p;
00149
00150 if ( !(p=get_curr_task()) )
00151 {
00152
00153 k_set_color( (console_t *)(&vir_cons[0]), attrib );
00154 return;
00155 }
00156
00157 if ( p->console==curr_cons )
00158
00159
00160 k_set_color( (console_t *)(&vir_cons[0]), attrib );
00161 else
00162
00163
00164 k_set_color( (console_t *)(&vir_cons[p->console]), attrib );
00165 }
00166
00167
00168 void scroll_up()
00169 {
00170 task_t *p;
00171
00172 if ( !(p=get_curr_task()) )
00173 {
00174
00175 k_scroll_up( (console_t *)(&vir_cons[0]) );
00176 return;
00177 }
00178
00179 if ( p->console==curr_cons )
00180
00181
00182 k_scroll_up( (console_t *)(&vir_cons[0]) );
00183 else
00184
00185
00186 k_scroll_up( (console_t *)(&vir_cons[p->console]) );
00187 }
00188
00189
00190
00191
00192
00193 void gotoxy(int x, int y)
00194 {
00195 task_t *p;
00196
00197 if ( !(p=get_curr_task()) )
00198 {
00199
00200 k_gotoxy((console_t *)(&vir_cons[0]), x, y);
00201 return;
00202 }
00203
00204 if ( p->console==curr_cons )
00205
00206
00207 k_gotoxy((console_t *)(&vir_cons[0]), x, y);
00208 else
00209
00210
00211 k_gotoxy((console_t *)(&vir_cons[p->console]), x, y);
00212 }
00213
00214
00215
00216 void kputchar( int c )
00217 {
00218 task_t *p = get_curr_task();
00219 uint32_t IF = GET_IF();
00220
00221 if ( !p )
00222 {
00223
00224 _kputchar((console_t *)(&vir_cons[0]), c);
00225 return;
00226 }
00227
00228 disable();
00229
00230 if ( p->console==curr_cons )
00231
00232
00233 _kputchar((console_t *)(&vir_cons[0]), c);
00234 else
00235
00236
00237 _kputchar((console_t *)(&vir_cons[p->console]), c);
00238
00239 SET_IF( IF );
00240 }
00241
00242
00243
00244
00245 int kprintf(const char *fmt, ...)
00246 {
00247 char buf[1024];
00248 va_list args;
00249 int i;
00250
00251 va_start( args, fmt );
00252
00253 vsnprintf( buf, sizeof(buf), fmt, args );
00254 va_end( args );
00255
00256 for( i=0; i<1024; i++ )
00257 {
00258 if( !buf[i] ) break;
00259 kputchar( buf[i] );
00260 }
00261
00262 return( i );
00263 }
00264
00265
00266
00267
00268 void init_main_console()
00269 {
00270 vir_cons[0].vid_buffer = (word *)VIDEO_BUFFER;
00271 vir_cons[0].cur_pos = 0;
00272 vir_cons[0].cur_color = DEFAULT_COLOR;
00273
00274
00275 k_clrscr( (console_t *)(&vir_cons[0]) );
00276 }
00277
00278
00279
00280
00281
00282 void create_virtual_console()
00283 {
00284 int i;
00285
00286 for (i=1; i < (K_TOT_VIR_CONS+1); i++)
00287 {
00288 vir_cons[i].vid_buffer = kmalloc( VIDEO_BUF_DIM*sizeof(word) );
00289 memsetw(vir_cons[i].vid_buffer, 0, VIDEO_BUF_DIM);
00290 vir_cons[i].cur_pos = 0;
00291 vir_cons[i].cur_color = DEFAULT_COLOR;
00292 }
00293
00294
00295
00296 memcpyw(vir_cons[1].vid_buffer, vir_cons[0].vid_buffer, VIDEO_BUF_DIM);
00297 vir_cons[1].cur_pos = vir_cons[0].cur_pos;
00298 vir_cons[1].cur_color = vir_cons[0].cur_color;
00299
00300
00301 curr_cons = 1;
00302 }