• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Tags
No Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

MASKONの開発作業部屋


Commit MetaInfo

Revision61d76045d85d80d6136d041d0208a16d27107e17 (tree)
Time2014-02-17 22:30:16
Authormask <endou_kousuke@yaho...>
Commitermask

Log Message

cui.cの挙動を少し変更

Change Summary

Incremental Difference

--- /dev/null
+++ b/os/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+}