OSDN Git Service

DMAドライバ. DrFSマイナーチェンジ
[vaneos/DivergeMirror.git] / drivers / vga / vga.c
1 /*
2         vga.c
3         VGA Driver
4         (C) 2014-2015 VOSystems.
5 */
6
7 #include<Diverge/kstdio.h>
8 #include<Diverge/diverge.h>
9 #include<Diverge/types.h>
10 #include<Diverge/string.h>
11
12 /*VGA Text Control*/
13 static unsigned short *ch_vram;
14 static unsigned short X,Y;
15 static unsigned char attr;
16
17 #define SCREEN_START 0xb8000
18 #define SCREEN_END   0xc0000
19
20 void ClearScreen(void)
21 {
22         ch_vram=(unsigned short*)0xb8000;
23         X=0;Y=0;
24         while(ch_vram<(unsigned short*)0xc0000)
25         {
26                 //*ch_vram++ =NULL;
27                 *ch_vram++ = (((Black)<<8) | ' ');
28         }
29         ch_vram=(unsigned short*)0xb8000;
30         AutoMoveCursol(X, Y);
31         return;
32 }
33
34 void init_vga(void)
35 {
36         strcpy(kstdout.sign,STDOUT_SIGN);
37         kstdout.fp                      = NULL;
38         kstdout.data_cnt        = NULL;
39         kstdout.buf_addr        = NULL;
40         kstdout.err_flag        = NULL;
41         kstdout.file_desc       = 1;
42         
43         strcpy(kstdin.sign,STDIN_SIGN);
44         kstdin.fp                       = NULL;
45         kstdin.data_cnt         = NULL;
46         kstdin.buf_addr         = NULL;
47         kstdin.err_flag         = NULL;
48         kstdin.file_desc        = 0;
49         
50         strcpy(kstderr.sign,STDERR_SIGN);
51         kstderr.fp                      = NULL;
52         kstderr.data_cnt        = NULL;
53         kstderr.buf_addr        = NULL;
54         kstderr.err_flag        = NULL;
55         kstderr.file_desc       = 2;
56         
57         fp_count=3;
58         
59         stdout  = &kstdout;
60         stdin   = &kstdin;
61         stderr  = &kstderr;
62         
63         DisplayColorChangeChar(White);
64         
65         init_flag=true;
66         ClearScreen();
67 }
68
69 void DisplayOutputChar(const char ch)
70 {
71         if(ch=='\n'){
72                 ch_vram+=(80-X);/*80 charactors * 2byte - X charactors * 2 byte*/
73                 Y++;
74                 X=0;
75                 
76         }else if(ch=='\t'){
77                 *ch_vram++ = (((attr)<<8) | ' ');
78                 *ch_vram++ = (((attr)<<8) | ' ');
79                 X+=2;
80                 
81         }else if(ch=='\r'){
82                 while(X>0)
83                 {
84                         *ch_vram-- = (unsigned short)NULL;
85                         X--;
86                 }
87                 X=0;
88                 
89         }else if(ch=='\b'){
90                 ch_vram--;
91                 *ch_vram = (unsigned short)NULL;
92                 X--;
93                 
94         }else if(ch==0x7f){
95                 /*Delete*/
96                 
97         }else{
98                 *ch_vram++ = (((attr)<<8) | ch);
99                 X++;
100                 
101         }
102         
103         AutoMoveCursol(X, Y);
104         
105         if(X>=80){
106                 X=0;
107                 Y++;
108         }
109         
110         if(Y==25){
111                 ShiftDisplayChar(1);
112                 Y--;
113                 ch_vram-=(80-X);
114         }
115         
116         return;
117 }
118
119 void ShiftDisplayChar(unsigned int len)
120 {
121         unsigned short *sc1,*sc2;
122         sc1=0xb8000;    sc2=0xb8000+(80*2);
123         while(sc2<=0xc0000)*sc1++ = *sc2++;
124         if(len>1){
125                 len--;
126                 ShiftDisplayChar(len);
127         }
128 }
129
130 void DisplayColorChangeChar(char att)
131 {
132         attr = att;
133 }