MASKONの開発作業部屋
Revision | 61d76045d85d80d6136d041d0208a16d27107e17 (tree) |
---|---|
Time | 2014-02-17 22:30:16 |
Author | mask <endou_kousuke@yaho...> |
Commiter | mask |
cui.cの挙動を少し変更
@@ -0,0 +1,310 @@ | ||
1 | +#include "head.h" | |
2 | +#include <string.h> | |
3 | +#include <stdio.h> | |
4 | +extern struct TASKCTL *task_control; | |
5 | +extern struct biosinfo *basic; | |
6 | +extern struct wcontrol *window_control; | |
7 | +extern struct tcontrol *timer_control; | |
8 | +extern struct mouse_dec *dec; | |
9 | +extern unsigned short table_8_565[256]; | |
10 | +struct TASK *into_cui(struct manager *memory) | |
11 | +{ | |
12 | + struct TASK *cui_console_task; | |
13 | + cui_console_task=task_alloc(); | |
14 | + cui_console_task->stack=alloc4(memory,64*1024); | |
15 | + cui_console_task->tss.esp=cui_console_task->stack+64*1024; | |
16 | + cui_console_task->tss.eip=(int) &cui_console; | |
17 | + cui_console_task->tss.es=1*8; | |
18 | + cui_console_task->tss.cs=2*8; | |
19 | + cui_console_task->tss.ss=1*8; | |
20 | + cui_console_task->tss.ds=1*8; | |
21 | + cui_console_task->tss.fs=1*8; | |
22 | + cui_console_task->tss.gs=1*8; | |
23 | + fifo_init(&(cui_console_task->fifo),CUI_BUFFER_LENGTH,cui_console_task); | |
24 | + task_run(cui_console_task,2,2); | |
25 | + return cui_console_task; | |
26 | +} | |
27 | +void into_gui(struct manager *memory) | |
28 | +{ | |
29 | + int i,j; | |
30 | + | |
31 | + static char cursor[MOUSE_CURSOR_YSIZE][MOUSE_CURSOR_XSIZE]={ | |
32 | + "++++++++++", | |
33 | + "++++------", | |
34 | + "++++------", | |
35 | + "++++------", | |
36 | + "+---------", | |
37 | + "+---------", | |
38 | + "+---------", | |
39 | + "+---------", | |
40 | + "+---------", | |
41 | + "+---------" | |
42 | + }; | |
43 | + window_control_init(); | |
44 | + dec=(struct mouse_dec *)alloc4((struct manager *)(MANAGER_ADDR),sizeof (struct mouse_dec)); | |
45 | + | |
46 | + task_control->task_keyboard=task_alloc(); | |
47 | + task_control->task_keyboard->stack=alloc4(memory,64*1024); | |
48 | + task_control->task_keyboard->tss.esp=task_control->task_keyboard->stack+64*1024; | |
49 | + task_control->task_keyboard->tss.eip=(int) &keyboard_task_gui; | |
50 | + task_control->task_keyboard->tss.es=1*8; | |
51 | + task_control->task_keyboard->tss.cs=2*8; | |
52 | + task_control->task_keyboard->tss.ss=1*8; | |
53 | + task_control->task_keyboard->tss.ds=1*8; | |
54 | + task_control->task_keyboard->tss.fs=1*8; | |
55 | + task_control->task_keyboard->tss.gs=1*8; | |
56 | + fifo_init(&(task_control->task_keyboard->fifo),KEYBOARD_BUFFER_LENGTH,task_control->task_keyboard); | |
57 | + task_run(task_control->task_keyboard,2,2); | |
58 | + | |
59 | + task_control->task_mouse=task_alloc(); | |
60 | + task_control->task_mouse->stack=alloc4(memory,64*1024); | |
61 | + task_control->task_mouse->tss.esp=task_control->task_mouse->stack+64*1024; | |
62 | + task_control->task_mouse->tss.eip=(int) &mouse_task; | |
63 | + task_control->task_mouse->tss.es=1*8; | |
64 | + task_control->task_mouse->tss.cs=2*8; | |
65 | + task_control->task_mouse->tss.ss=1*8; | |
66 | + task_control->task_mouse->tss.ds=1*8; | |
67 | + task_control->task_mouse->tss.fs=1*8; | |
68 | + task_control->task_mouse->tss.gs=1*8; | |
69 | + fifo_init(&(task_control->task_mouse->fifo),MOUSE_BUFFER_LENGTH,task_control->task_mouse); | |
70 | + enable_mouse(); | |
71 | + io_out_eight(pic1_imr,0xef); /* マウスを許可(11101111) */ | |
72 | + task_run(task_control->task_mouse,2,2); | |
73 | + | |
74 | + task_control->task_close=task_alloc(); | |
75 | + task_control->task_close->stack=alloc4(memory,64*1024); | |
76 | + task_control->task_close->tss.esp=task_control->task_close->stack+64*1024; | |
77 | + task_control->task_close->tss.eip=(int) &close_task; | |
78 | + task_control->task_close->tss.es=1*8; | |
79 | + task_control->task_close->tss.cs=2*8; | |
80 | + task_control->task_close->tss.ss=1*8; | |
81 | + task_control->task_close->tss.ds=1*8; | |
82 | + task_control->task_close->tss.fs=1*8; | |
83 | + task_control->task_close->tss.gs=1*8; | |
84 | + fifo_init(&(task_control->task_close->fifo),close_buffer_length,task_control->task_close); | |
85 | + task_run(task_control->task_close,2,10); | |
86 | + window_control->back_window=make_external_window(0,0,basic->fullx,basic->fully,-1); | |
87 | + for(j=0;j<basic->fully;j++){ | |
88 | + for(i=0;i<basic->fullx;i++){ | |
89 | + window_control->back_window->buffer[j*basic->fullx+i]=table_8_565[kuro]; | |
90 | + } | |
91 | + } | |
92 | + window_control->mouse_window=make_external_window(0,0,MOUSE_CURSOR_XSIZE,MOUSE_CURSOR_YSIZE,1); | |
93 | + for(j=0;j<MOUSE_CURSOR_YSIZE;j++){ | |
94 | + for(i=0;i<MOUSE_CURSOR_XSIZE;i++){ | |
95 | + if(cursor[j][i]=='+'){ | |
96 | + window_control->mouse_window->buffer[j*MOUSE_CURSOR_XSIZE+i]=table_8_565[siro]; | |
97 | + }else{ | |
98 | + window_control->mouse_window->buffer[j*MOUSE_CURSOR_XSIZE+i]=table_8_565[1]; | |
99 | + } | |
100 | + } | |
101 | + } | |
102 | + for(j=0;j<TASKBAR_WIDTH;j++){ | |
103 | + for(i=0;i<basic->fullx;i++){ | |
104 | + window_control->back_window->buffer[j*basic->fullx+i]=TASKBAR_COLOR; | |
105 | + } | |
106 | + } | |
107 | + move_window(window_control->back_window,0,0); | |
108 | + move_window(window_control->mouse_window,0,0); | |
109 | + switch_window(window_control->back_window,0); | |
110 | + switch_window(window_control->mouse_window,1); | |
111 | +} | |
112 | +#define CUICONSOLE_STR_COLOR 0xffff | |
113 | +#define CUICONSOLE_BACK_COLOR 0x0000 | |
114 | +void cui_console(void) | |
115 | +{ | |
116 | + int i,j; | |
117 | + char s[30]; | |
118 | + struct TASK *task=task_now(); | |
119 | + struct CUICONSOLE cons; | |
120 | + cons.cur_x=0; | |
121 | + cons.cur_y=0; | |
122 | + cons.cmdline_count=0; | |
123 | + welcome_message(&cons); | |
124 | + cons.timer=make_timer(); | |
125 | + setfifo(cons.timer,&task->fifo); | |
126 | + setdata_timer(cons.timer,0); | |
127 | + timer_settime(cons.timer,50); | |
128 | + | |
129 | + print_cons_cui(&cons,">>",CUICONSOLE_STR_COLOR); | |
130 | + | |
131 | + for(;;){ | |
132 | + io_cli(); | |
133 | + if(fifo_status(&task->fifo)==0){ | |
134 | + task_sleep(task); | |
135 | + io_sti(); | |
136 | + }else{ | |
137 | + i=fifo_out(&task->fifo); | |
138 | + io_sti(); | |
139 | + if(i==0){ | |
140 | + dbox_rawcolor( | |
141 | + cons.cur_x, | |
142 | + cons.cur_y, | |
143 | + cons.cur_x+font_xsize, | |
144 | + cons.cur_y+font_ysize, | |
145 | + CUICONSOLE_BACK_COLOR); | |
146 | + setdata_timer(cons.timer,1); | |
147 | + timer_settime(cons.timer,50); | |
148 | + }else if(i==1){ | |
149 | + dbox_rawcolor( | |
150 | + cons.cur_x, | |
151 | + cons.cur_y, | |
152 | + cons.cur_x+font_xsize, | |
153 | + cons.cur_y+font_ysize, | |
154 | + CUICONSOLE_STR_COLOR); | |
155 | + setdata_timer(cons.timer,0); | |
156 | + timer_settime(cons.timer,50); | |
157 | + } | |
158 | + if(i>=256 && i<=511){ | |
159 | + if(i==(8+256)){ | |
160 | + if(cons.cur_x>font_xsize){ | |
161 | + dbox_rawcolor( | |
162 | + cons.cur_x, | |
163 | + cons.cur_y, | |
164 | + cons.cur_x+font_xsize, | |
165 | + cons.cur_y+font_ysize, | |
166 | + CUICONSOLE_BACK_COLOR); | |
167 | + cons.cmdline_count--; | |
168 | + cons.cur_x-=font_xsize; | |
169 | + } | |
170 | + }else if(i==(10+256)){ | |
171 | + cons.cmdline[cons.cmdline_count]=0; | |
172 | + cons.cmdline_count=0; | |
173 | + cuicons_newline(&cons); | |
174 | + dbox_rawcolor( | |
175 | + cons.cur_x, | |
176 | + cons.cur_y, | |
177 | + cons.cur_x+font_xsize, | |
178 | + cons.cur_y+font_ysize, | |
179 | + CUICONSOLE_BACK_COLOR); | |
180 | + cons_cui_runcmd(&cons); | |
181 | + print_cons_cui(&cons,">>",CUICONSOLE_STR_COLOR); | |
182 | + }else{ | |
183 | + if(cons.cur_x<(basic->fullx-font_xsize)){ | |
184 | + s[0]=i-256; | |
185 | + s[1]=0; | |
186 | + dbox_rawcolor( | |
187 | + cons.cur_x, | |
188 | + cons.cur_y, | |
189 | + cons.cur_x+font_xsize, | |
190 | + cons.cur_y+font_ysize, | |
191 | + CUICONSOLE_BACK_COLOR); | |
192 | + cons.cmdline[cons.cmdline_count]=i-256; | |
193 | + cons.cmdline_count++; | |
194 | + print_cons_cui(&cons,s,CUICONSOLE_STR_COLOR); | |
195 | + } | |
196 | + } | |
197 | + } | |
198 | + } | |
199 | + } | |
200 | +} | |
201 | +void print_cons_cui(struct CUICONSOLE *cons,char *str,int color) | |
202 | +{ | |
203 | + int i; | |
204 | + for(i=0;str[i]!=0x00;i++){ | |
205 | + print_cons_cui_char(cons,str[i],color); | |
206 | + } | |
207 | + return; | |
208 | +} | |
209 | +void print_cons_cui_char(struct CUICONSOLE *cons,char chr,int color) | |
210 | +{ | |
211 | + char s[2]; | |
212 | + s[0]=chr; | |
213 | + s[1]=0; | |
214 | + if(s[0]==0x09){ | |
215 | + for(;;){ | |
216 | + if((cons->cur_x&0x1f)==0){ | |
217 | + break; | |
218 | + } | |
219 | + } | |
220 | + }else if(s[0]==0x0a){ | |
221 | + cuicons_newline(cons); | |
222 | + }else if(s[0]==0x0d){ | |
223 | + | |
224 | + }else{ | |
225 | + dprint_rawcolor(s,cons->cur_x,cons->cur_y,color); | |
226 | + cons->cur_x+=font_xsize; | |
227 | + if(cons->cur_x>basic->fullx){ | |
228 | + cuicons_newline(cons); | |
229 | + } | |
230 | + } | |
231 | +} | |
232 | +void cuicons_newline(struct CUICONSOLE *cons) | |
233 | +{ | |
234 | + int i,j; | |
235 | + if(cons->cur_y<basic->fully){ | |
236 | + cons->cur_y+=font_ysize; | |
237 | + }else{ | |
238 | + for(j=0;j<basic->fully;j++){ | |
239 | + for(i=0;i<basic->fullx;i++){ | |
240 | + basic->vram[j*basic->fullx+i]=basic->vram[(j+font_ysize)*basic->fullx+i]; | |
241 | + } | |
242 | + } | |
243 | + dbox_rawcolor(0,basic->fully-font_ysize,basic->fullx,basic->fully,CUICONSOLE_BACK_COLOR); | |
244 | + } | |
245 | + cons->cur_x=0; | |
246 | + return; | |
247 | +} | |
248 | +void welcome_message(struct CUICONSOLE *cons) | |
249 | +{ | |
250 | + int i,j; | |
251 | + char mes[]="BOOT PROCESS FINISHED"; | |
252 | + for(i=0;i<(basic->fullx/2/font_xsize-strlen(mes)/2);i++){ | |
253 | + print_cons_cui(cons,"-",0x8fb0); | |
254 | + } | |
255 | + print_cons_cui(cons,mes,0x8fb0); | |
256 | + for(;i<basic->fullx/font_xsize-strlen(mes);i++){ | |
257 | + print_cons_cui(cons,"-",0x8fb0); | |
258 | + } | |
259 | + print_cons_cui(cons,"\n",0x0000); | |
260 | + print_cons_cui(cons,"WELCOME TO MASK OS BY MASKY\n",0xf3bb); | |
261 | + print_cons_cui(cons,"TO ENTER GUI MODE,TYPE \"gui\"\n",0x87bd); | |
262 | +} | |
263 | +void cons_cui_runcmd(struct CUICONSOLE *cons) | |
264 | +{ | |
265 | + if(strcmp(cons->cmdline,"mem")==0){ | |
266 | + char s[20]; | |
267 | + sprintf(s,"FREE %uKB",memory_total((struct manager *)(MANAGER_ADDR))); | |
268 | + print_cons_cui(cons,s,CUICONSOLE_STR_COLOR); | |
269 | + cuicons_newline(cons); | |
270 | + }else if(strcmp(cons->cmdline,"ls")==0){ | |
271 | + int x,y; | |
272 | + char s[30]; | |
273 | + struct FILEINFO *finfo=(struct FILEINFO *)(ADR_DISKIMG+0x002600); | |
274 | + for(x=0;x<MAX_FILES;x++){ | |
275 | + if(finfo[x].name[0]==0x00){ | |
276 | + break; | |
277 | + } | |
278 | + if(finfo[x].name[0]!=0xe5){ | |
279 | + if((finfo[x].type&0x18)==0){ | |
280 | + if((finfo[x].type&0x10)==0 && (finfo[x].type&0x08)!=0){ | |
281 | + print_cons_cui(cons,"DIR ",CUICONSOLE_STR_COLOR); | |
282 | + } | |
283 | + sprintf(s,"filename.ext size:%7d",finfo[x].size); | |
284 | + for(y=0;y<8;y++){ | |
285 | + s[y]=finfo[x].name[y]; | |
286 | + } | |
287 | + s[9]=finfo[x].ext[0]; | |
288 | + s[10]=finfo[x].ext[1]; | |
289 | + s[11]=finfo[x].ext[2]; | |
290 | + print_cons_cui(cons,s,CUICONSOLE_STR_COLOR); | |
291 | + cuicons_newline(cons); | |
292 | + } | |
293 | + } | |
294 | + } | |
295 | + }else if(strcmp(cons->cmdline,"gui")==0){ | |
296 | + struct TASK *task=task_now(); | |
297 | + dbox_rawcolor(0,0,basic->fullx,basic->fully,0x0000); | |
298 | + timer_cancel(cons->timer); | |
299 | + task_sleep(task_control->task_keyboard); | |
300 | + task_control->task_keyboard->tss.eip=(int) &keyboard_task_gui; | |
301 | + task_run(task_control->task_keyboard,2,2); | |
302 | + into_gui((struct manager *)(MANAGER_ADDR)); | |
303 | + free4((struct manager *)(MANAGER_ADDR),task->stack,64*1024); | |
304 | + free4((struct manager *)(MANAGER_ADDR),(int)task->fifo.buffer,CUI_BUFFER_LENGTH*4); | |
305 | + io_cli(); | |
306 | + task->flag=TASK_NOT_USING; | |
307 | + io_sti(); | |
308 | + task_sleep(task); | |
309 | + } | |
310 | +} |