• R/O
  • SSH
  • HTTPS

chnosproject: コミット


コミットメタ情報

リビジョン313 (tree)
日時2012-02-18 14:22:59
作者hikarupsp

ログメッセージ

シートの基本機能は完成した。
重なるシートのリフレッシュも、マップを使用してできるようになった。
予想よりは遅くないものの、やはり遅いので今後高速化が必要だ。

Bochsで動作させると、途中で止まってしまうことがある。
どうやらキーボード割り込みの処理中に止まってしまっているようだが、他のエミュレーターでは異常がないので詳細は不明。

変更サマリ

差分

--- beta/tolset_chn_000/chnos_010/chnos/display.c (revision 312)
+++ beta/tolset_chn_000/chnos_010/chnos/display.c (revision 313)
@@ -43,8 +43,8 @@
4343 ctrl->vram = VGA_VRAM_ADR;
4444
4545 Drawing08_Initialise_Palette();
46- Error_Set_Enable_Display_TextMode(false);
47- Error_Set_Enable_Display_GraphicMode(true, ctrl->vram, ctrl->xsize, ctrl->ysize >> 4);
46+ Error_Set_Enable_Display_TextMode(False);
47+ Error_Set_Enable_Display_GraphicMode(True, ctrl->vram, ctrl->xsize, ctrl->ysize >> 4);
4848
4949
5050 //次に、VBEのBIOS情報を得る。
@@ -268,7 +268,7 @@
268268 debug("\n");
269269 #endif
270270 Initialise_Drawing();
271- Error_Set_Enable_Display_GraphicMode(true, ctrl->vram, ctrl->xsize, ctrl->ysize >> 4);
271+ Error_Set_Enable_Display_GraphicMode(True, ctrl->vram, ctrl->xsize, ctrl->ysize >> 4);
272272 return 0;
273273 }
274274
--- beta/tolset_chn_000/chnos_010/chnos/sheet.c (revision 312)
+++ beta/tolset_chn_000/chnos_010/chnos/sheet.c (revision 313)
@@ -1,6 +1,8 @@
11
22 #include "core.h"
33
4+//各シートの左上をP、左下をQ、右下をR、右上をS(すべて書き込める座標)とする。
5+
46 UI_Sheet *Sheet_Initialise(void)
57 {
68 UI_Sheet *sheet;
@@ -16,6 +18,58 @@
1618 return sheet;
1719 }
1820
21+uint Sheet_Free(UI_Sheet *sheet)
22+{
23+ UI_Sheet **search;
24+ uint i;
25+
26+ if(sheet == Null){
27+ #ifdef CHNOSPROJECT_DEBUG_SHEET
28+ debug("Sheet_Free:Null sheet.\n");
29+ #endif
30+ return 0;
31+ }
32+ if(!sheet->flags.bit.initialized){
33+ #ifdef CHNOSPROJECT_DEBUG_SHEET
34+ debug("Sheet_Free:Not Initialised sheet.\n");
35+ #endif
36+ return 1;
37+ }
38+
39+//親への子登録を削除する
40+ if(sheet->parent != Null){
41+ search = &sheet->parent->child;
42+ for(i = 0; i < SHEET_MAX_CHILDREN; i++){
43+ if(*search == sheet){
44+ *search = sheet->next;
45+ sheet->parent = Null;
46+ break;
47+ }
48+ search = &(*search)->next;
49+ }
50+ if(i == SHEET_MAX_CHILDREN){
51+ #ifdef CHNOSPROJECT_DEBUG_SHEET
52+ debug("Sheet_Free:TRAP:Sheet not found in the link for the parent.\n");
53+ #endif
54+ INT_3();
55+ }
56+ }
57+
58+//子への親登録を削除する
59+ if(sheet->child != Null){
60+ search = &sheet->child;
61+ for(i = 0; i < SHEET_MAX_CHILDREN; i++){
62+ if(search == Null){
63+ break;
64+ }
65+ (*search)->parent = Null;
66+ search = &(*search)->child;
67+ }
68+ }
69+
70+ return 0;
71+}
72+
1973 uint Sheet_SetBuffer(UI_Sheet *sheet, void *vram, uint xsize, uint ysize, uint bpp)
2074 {
2175 if(sheet == Null){
@@ -102,6 +156,10 @@
102156
103157 sheet->parent = parent;
104158
159+ if(!parent->flags.bit.using_map){
160+ Sheet_Internal_MapInitialise(sheet->parent);
161+ }
162+
105163 #ifdef CHNOSPROJECT_DEBUG_SHEET
106164 debug("Sheet_SetParent:[0x%08X] parent:[0x%08X]\n", sheet, parent);
107165 #endif
@@ -173,14 +231,21 @@
173231 *search = sheet;
174232
175233 sheet->flags.bit.visible = True;
176- if(px != SHEET_LOCATION_NOCHANGE){
177- sheet->location.x = px;
234+ if(px != SHEET_LOCATION_NOCHANGE && py != SHEET_LOCATION_NOCHANGE){
235+ Sheet_Slide_Absolute(sheet, px, py);
236+ } else{
237+ if(px != SHEET_LOCATION_NOCHANGE){
238+ Sheet_Slide_Absolute(sheet, px, sheet->location.y);
239+ }
240+ if(py != SHEET_LOCATION_NOCHANGE){
241+ Sheet_Slide_Absolute(sheet, sheet->location.x, py);
242+ }
243+ if(px == SHEET_LOCATION_NOCHANGE && py == SHEET_LOCATION_NOCHANGE){
244+ Sheet_Internal_MapRefresh(sheet, sheet->location.x, sheet->location.y, sheet->location.x + sheet->size.x - 1, sheet->location.y + sheet->size.y - 1, False);
245+ }
178246 }
179- if(py != SHEET_LOCATION_NOCHANGE){
180- sheet->location.y = py;
181- }
182247
183- Sheet_Refresh_Sheet(sheet);
248+ Sheet_RefreshSheet_All(sheet);
184249
185250 #ifdef CHNOSPROJECT_DEBUG_SHEET
186251 debug("Sheet_Show:[0x%08X] height:%d\n", sheet, i);
@@ -189,18 +254,18 @@
189254 return 0;
190255 }
191256
192-uint Sheet_Refresh_Sheet(UI_Sheet *sheet)
257+uint Sheet_RefreshSheet_All(UI_Sheet *sheet)
193258 {
194- UI_Sheet *now;
195- int x, y;
196- int apx0, apy0;
197- uchar *vram;
198- int vxsize, vysize;
199- int xsize, ysize;
259+ return Sheet_RefreshSheet(sheet, 0, 0, sheet->size.x - 1, sheet->size.y - 1);
260+}
200261
262+uint Sheet_Slide_Absolute(UI_Sheet *sheet, int apx, int apy)
263+{
264+ uint retv;
265+
201266 if(sheet == Null){
202267 #ifdef CHNOSPROJECT_DEBUG_SHEET
203- debug("Sheet_Refresh_Sheet:Null sheet.\n");
268+ debug("Sheet_Slide_Absolute:Null sheet.\n");
204269 #endif
205270 return 1;
206271 }
@@ -207,51 +272,102 @@
207272
208273 if(sheet->parent == Null){
209274 #ifdef CHNOSPROJECT_DEBUG_SHEET
210- debug("Sheet_Refresh_Sheet:Null parent.\n");
275+ debug("Sheet_Slide_Absolute:Null parent.\n");
211276 #endif
212277 return 2;
213278 }
214279
215- vram = (uchar *)sheet->parent->vram;
216- vxsize = (int)sheet->parent->size.x;
217- vysize = (int)sheet->parent->size.y;
218- for(now = sheet; now != Null; now = now->next){
219- if(now->location.x < vxsize && now->location.y < vysize && now->location.x + (int)now->size.x > 0 && now->location.y + (int)now->size.y > 0 && now->flags.bit.visible){
220- if((now->location.x + now->size.x) > vxsize){
221- xsize = now->size.x - ((now->location.x + now->size.x) - vxsize);
222- } else{
223- xsize = now->size.x;
224- }
225- if((now->location.y + now->size.y) > vysize){
226- ysize = now->size.y - ((now->location.y + now->size.y) - vysize);
227- } else{
228- ysize = now->size.y;
229- }
230- if(now->location.x < 0){
231- xsize += now->location.x;
232- apx0 = 0;
233- } else{
234- apx0 = now->location.x;
235- }
236- if(now->location.y < 0){
237- ysize += now->location.y;
238- apy0 = 0;
239- } else{
240- apy0 = now->location.y;
241- }
280+ if(!sheet->flags.bit.visible){
281+ sheet->location.x = apx;
282+ sheet->location.y = apy;
283+ return 0;
284+ }
242285
243- #ifdef CHNOSPROJECT_DEBUG_SHEET
244- debug("Sheet_Refresh_Sheet:[0x%08X]\n", sheet);
245- debug("Sheet_Refresh_Sheet:apx0:%d apy0:%d xsize:%d ysize:%d\n", apx0, apy0, xsize, ysize);
246- #endif
286+ sheet->flags.bit.visible = False;
287+ Sheet_Internal_MapRefresh(sheet, sheet->location.x, sheet->location.y, sheet->location.x + (int)sheet->size.x - 1, sheet->location.y + (int)sheet->size.y - 1, True);
288+ Sheet_RefreshAllInRange(sheet->parent, sheet->location.x, sheet->location.y, sheet->location.x + (int)sheet->size.x - 1, sheet->location.y + (int)sheet->size.y - 1);
247289
248- for(y = apy0; y < ysize + apy0; y++){
249- for(x = apx0; x < xsize + apx0; x++){
250- vram[y * vxsize + x] = ((uchar *)now->vram)[(y - now->location.y) * now->size.x + (x - now->location.x)];
251- }
252- }
290+ sheet->location.x = apx;
291+ sheet->location.y = apy;
292+
293+ sheet->flags.bit.visible = True;
294+ Sheet_Internal_MapRefresh(sheet, sheet->location.x, sheet->location.y, sheet->location.x + (int)sheet->size.x - 1, sheet->location.y + (int)sheet->size.y - 1, False);
295+
296+ retv = Sheet_RefreshSheet_All(sheet);
297+
298+ if(retv != 0){
299+ return retv + 2;
300+ }
301+
302+ return 0;
303+}
304+
305+uint Sheet_Slide_Relative(UI_Sheet *sheet, int rpx, int rpy)
306+{
307+ uint retv;
308+
309+ if(sheet == Null){
310+ #ifdef CHNOSPROJECT_DEBUG_SHEET
311+ debug("Sheet_Slide_Relative:Null sheet.\n");
312+ #endif
313+ return 1;
314+ }
315+
316+ if(sheet->parent == Null){
317+ #ifdef CHNOSPROJECT_DEBUG_SHEET
318+ debug("Sheet_Slide_Relative:Null parent.\n");
319+ #endif
320+ return 2;
321+ }
322+
323+ if(!sheet->flags.bit.visible){
324+ sheet->location.x += rpx;
325+ sheet->location.y += rpy;
326+ return 0;
327+ }
328+
329+ sheet->flags.bit.visible = False;
330+
331+ Sheet_Internal_MapRefresh(sheet, sheet->location.x, sheet->location.y, sheet->location.x + (int)sheet->size.x - 1, sheet->location.y + (int)sheet->size.y - 1, True);
332+ Sheet_RefreshAllInRange(sheet->parent, sheet->location.x, sheet->location.y, sheet->location.x + (int)sheet->size.x - 1, sheet->location.y + (int)sheet->size.y - 1);
333+
334+ sheet->location.x += rpx;
335+ sheet->location.y += rpy;
336+
337+ sheet->flags.bit.visible = True;
338+ Sheet_Internal_MapRefresh(sheet, sheet->location.x, sheet->location.y, sheet->location.x + (int)sheet->size.x - 1, sheet->location.y + (int)sheet->size.y - 1, False);
339+
340+ retv = Sheet_RefreshSheet_All(sheet);
341+
342+ if(retv != 0){
343+ return retv + 2;
344+ }
345+
346+ return 0;
347+}
348+
349+uint Sheet_RefreshAllInRange(UI_Sheet *parent, int px0, int py0, int px1, int py1)
350+{
351+ uint i;
352+ UI_Sheet *search;
353+
354+ search = parent->child;
355+ for(i = 0; i < SHEET_MAX_CHILDREN; i++){
356+ if(search == Null){
357+ break;
253358 }
359+ if(Sheet_Internal_IsRangeOverlappedWithSheet(search, px0, py0, px1, py1)){
360+ Sheet_Internal_RefreshSheet(search, px0, py0, px1, py1);
361+ }
362+ search = search->next;
254363 }
255364
256365 return 0;
257366 }
367+
368+uint Sheet_RefreshSheet(UI_Sheet *sheet, int px0, int py0, int px1, int py1)
369+{
370+ return Sheet_Internal_RefreshSheet(sheet, px0 + sheet->location.x, py0 + sheet->location.y, px1 + sheet->location.x, py1 + sheet->location.y);
371+}
372+
373+
--- beta/tolset_chn_000/chnos_010/chnos/shtfunc.c (nonexistent)
+++ beta/tolset_chn_000/chnos_010/chnos/shtfunc.c (revision 313)
@@ -0,0 +1,452 @@
1+
2+#include "core.h"
3+
4+//シート制御用内部関数。sheet.c以外からは呼び出し禁止。
5+//その代わり、シート有効性チェックはある程度省く。
6+//呼び出し側の関数で、シートが有効であることを確認してから渡すこと。
7+
8+//uint Sheet_Internal_GetLocation[P,Q,R,S](UI_Sheet *sheet, DATA_Location2D *dest);
9+//書き込み可能なもっとも端の各座標を親シートでの座標で求める。destに座標を格納。
10+//親がないシートの場合は、戻り値が1になり、locationが(0,0)であると仮定される。
11+//親のあるシートの場合は、戻り値が0になり、各座標が格納される。
12+
13+uint Sheet_Internal_GetLocationP(UI_Sheet *sheet, DATA_Location2D *dest)
14+{
15+ if(sheet->parent == Null){
16+ dest->x = 0;
17+ dest->y = 0;
18+ return 1;
19+ }
20+ dest->x = sheet->location.x;
21+ dest->y = sheet->location.y;
22+
23+ return 0;
24+}
25+
26+uint Sheet_Internal_GetLocationQ(UI_Sheet *sheet, DATA_Location2D *dest)
27+{
28+ if(sheet->parent == Null){
29+ dest->x = 0;
30+ dest->y = (int)sheet->size.y - 1;
31+ return 1;
32+ }
33+ dest->x = sheet->location.x;
34+ dest->y = sheet->location.y + (int)sheet->size.y - 1;
35+
36+ return 0;
37+}
38+
39+uint Sheet_Internal_GetLocationR(UI_Sheet *sheet, DATA_Location2D *dest)
40+{
41+ if(sheet->parent == Null){
42+ dest->x = (int)sheet->size.x - 1;
43+ dest->y = (int)sheet->size.y - 1;
44+ return 1;
45+ }
46+ dest->x = sheet->location.x + (int)sheet->size.x - 1;
47+ dest->y = sheet->location.y + (int)sheet->size.y - 1;
48+
49+ return 0;
50+}
51+
52+uint Sheet_Internal_GetLocationS(UI_Sheet *sheet, DATA_Location2D *dest)
53+{
54+ if(sheet->parent == Null){
55+ dest->x = (int)sheet->size.x - 1;
56+ dest->y = 0;
57+ return 1;
58+ }
59+ dest->x = sheet->location.x + (int)sheet->size.x - 1;
60+ dest->y = sheet->location.y;
61+
62+ return 0;
63+}
64+
65+//uint Sheet_Internal_MapInitialise(UI_Sheet *parent);
66+//mapを初期化する。
67+//すでにマップが確保されていた場合は、解放した後に再確保する。
68+//マップの再構成も自動で行う。
69+
70+uint Sheet_Internal_MapInitialise(UI_Sheet *parent)
71+{
72+ if(parent->flags.bit.using_map){
73+ parent->flags.bit.using_map = False;
74+ System_Memory_Free(parent->map, parent->mapsize);
75+ }
76+
77+ parent->mapsize = parent->size.x * parent->size.y * 4;
78+ parent->map = (uint *)System_Memory_Allocate(parent->mapsize);
79+ MOVSD_ZeroFill(parent->map, parent->mapsize);
80+ parent->flags.bit.using_map = True;
81+
82+ Sheet_Internal_MapRebuild(parent, 0, 0, parent->size.x - 1, parent->size.y - 1);
83+
84+ return 0;
85+}
86+
87+//uint Sheet_Internal_Map[Write, Clear]FromSheet(UI_Sheet *sheet, bool force);
88+//各シートの範囲内のマップを生成する。
89+//forceがFalseの時は、mapのNullまたは自分のアドレスの部分しかいじらない。
90+//forceがTrueの時は、mapの範囲内に強制的に書き込む。
91+
92+uint Sheet_Internal_MapWriteFromSheet(UI_Sheet *sheet, bool force, int px0, int py0, int px1, int py1)
93+{
94+ int x, y;
95+ DATA_Location2D p, r;
96+
97+ if(sheet->parent == Null){
98+ #ifdef CHNOSPROJECT_DEBUG_SHEET
99+ debug("Sheet_Internal_MapWriteFromSheet:Null parent.\n");
100+ #endif
101+ return 1;
102+ }
103+
104+ if(sheet->parent->map == Null){
105+ #ifdef CHNOSPROJECT_DEBUG_SHEET
106+ debug("Sheet_Internal_MapWriteFromSheet:Null map.\n");
107+ #endif
108+ return 2;
109+ }
110+
111+ if(!sheet->flags.bit.visible){
112+ return 0;
113+ }
114+
115+ Sheet_Internal_GetLocationP(sheet, &p);
116+ Sheet_Internal_GetLocationR(sheet, &r);
117+
118+ if(p.x < px0){
119+ p.x = px0;
120+ }
121+ if(p.y < py0){
122+ p.y = py0;
123+ }
124+ if(r.x > px1){
125+ r.x = px1;
126+ }
127+ if(r.y > py1){
128+ r.y = py1;
129+ }
130+
131+ if(p.x < 0){
132+ p.x = 0;
133+ }
134+ if(p.y < 0){
135+ p.y = 0;
136+ }
137+ if(r.x >= sheet->parent->size.x){
138+ r.x = sheet->parent->size.x - 1;
139+ }
140+ if(r.y >= sheet->parent->size.y){
141+ r.y = sheet->parent->size.y - 1;
142+ }
143+
144+ if(force){
145+ for(y = p.y; y <= r.y; y++){
146+ for(x = p.x; x <= r.x; x++){
147+ sheet->parent->map[y * sheet->parent->size.x + x] = (uint)sheet;
148+ }
149+ }
150+ } else{
151+ for(y = p.y; y <= r.y; y++){
152+ for(x = p.x; x <= r.x; x++){
153+ if(sheet->parent->map[y * sheet->parent->size.x + x] == Null){
154+ sheet->parent->map[y * sheet->parent->size.x + x] = (uint)sheet;
155+ }
156+ }
157+ }
158+ }
159+
160+ return 0;
161+}
162+
163+uint Sheet_Internal_MapClearFromSheet(UI_Sheet *sheet, bool force, int px0, int py0, int px1, int py1)
164+{
165+ int x, y;
166+ DATA_Location2D p, r;
167+
168+ if(sheet->parent == Null){
169+ #ifdef CHNOSPROJECT_DEBUG_SHEET
170+ debug("Sheet_Internal_MapClearFromSheet:Null parent.\n");
171+ #endif
172+ return 1;
173+ }
174+
175+ if(sheet->parent->map == Null){
176+ #ifdef CHNOSPROJECT_DEBUG_SHEET
177+ debug("Sheet_Internal_MapClearFromSheet:Null map.\n");
178+ #endif
179+ return 2;
180+ }
181+
182+ Sheet_Internal_GetLocationP(sheet, &p);
183+ Sheet_Internal_GetLocationR(sheet, &r);
184+
185+ if(p.x < px0){
186+ p.x = px0;
187+ }
188+ if(p.y < py0){
189+ p.y = py0;
190+ }
191+ if(r.x > px1){
192+ r.x = px1;
193+ }
194+ if(r.y > py1){
195+ r.y = py1;
196+ }
197+
198+ if(p.x < 0){
199+ p.x = 0;
200+ }
201+ if(p.y < 0){
202+ p.y = 0;
203+ }
204+ if(r.x >= sheet->parent->size.x){
205+ r.x = sheet->parent->size.x - 1;
206+ }
207+ if(r.y >= sheet->parent->size.y){
208+ r.y = sheet->parent->size.y - 1;
209+ }
210+
211+ if(force){
212+ for(y = p.y; y <= r.y; y++){
213+ for(x = p.x; x <= r.x; x++){
214+ sheet->parent->map[y * sheet->parent->size.x + x] = Null;
215+ }
216+ }
217+ } else{
218+ for(y = p.y; y <= r.y; y++){
219+ for(x = p.x; x <= r.x; x++){
220+ if(sheet->parent->map[y * sheet->parent->size.x + x] == (uint)sheet){
221+ sheet->parent->map[y * sheet->parent->size.x + x] = Null;
222+ }
223+ }
224+ }
225+ }
226+
227+ return 0;
228+}
229+
230+//bool Sheet_Internal_IsLocationInRangeOfSheet(UI_Sheet *sheet, int px, int py);
231+//そのシートが、そのシートの親内部での座標である(px, py)を含むかどうかを返す。
232+//シートが無効でも、Falseを返すだけである。
233+//親がいないシートでこの関数を実行しても無意味だと思われるので、Falseを返すだけである。
234+
235+bool Sheet_Internal_IsLocationInRangeOfSheet(UI_Sheet *sheet, int px, int py)
236+{
237+ if(sheet == Null){
238+ return False;
239+ }
240+ if(sheet->parent == Null){
241+ return False;
242+ }
243+
244+ if(sheet->location.x > px || sheet->location.y > py){
245+ return False;
246+ }
247+ if(sheet->location.x + (int)sheet->size.x - 1 < px || sheet->location.y + (int)sheet->size.y - 1 < py){
248+ return False;
249+ }
250+
251+ return True;
252+}
253+
254+//bool Sheet_Internal_IsRangeOverlappedWithSheet(UI_Sheet *sheet, int px0, int py0, int px1, int py1);
255+//指定されたシートが引数の座標範囲内に重なるかどうかを返す。
256+
257+bool Sheet_Internal_IsRangeOverlappedWithSheet(UI_Sheet *sheet, int px0, int py0, int px1, int py1)
258+{
259+ if(sheet == Null){
260+ return False;
261+ }
262+ if(sheet->parent == Null){
263+ return False;
264+ }
265+
266+ if(sheet->location.x > px1){
267+ return False;
268+ }
269+
270+ if(sheet->location.y > py1){
271+ return False;
272+ }
273+
274+ if(sheet->location.x + (int)sheet->size.x - 1 < px0){
275+ return False;
276+ }
277+
278+ if(sheet->location.y + (int)sheet->size.y - 1 < py0){
279+ return False;
280+ }
281+
282+ return True;
283+}
284+
285+//UI_Sheet *Sheet_Internal_GetSheetFromLocation(UI_Sheet *parent, int px, int py)
286+//親内部での(px, py)における、可視状態のもっとも高い高さのシートを返す。
287+//この関数はきっと遅いので、mapが利用できない時のみ、使用するべきである。
288+//エラーが発生した時は、Nullを返すだけである。
289+
290+UI_Sheet *Sheet_Internal_GetSheetFromLocation(UI_Sheet *parent, int px, int py)
291+{
292+ uint i;
293+ UI_Sheet *sheet, *search;
294+
295+ sheet = Null;
296+
297+ search = parent->child;
298+ for(i = 0; i < SHEET_MAX_CHILDREN; i++){
299+ if(search == Null){
300+ break;
301+ }
302+ if(Sheet_Internal_IsLocationInRangeOfSheet(search, px, py) && search->flags.bit.visible){
303+ sheet = search;
304+ }
305+ search = search->next;
306+ }
307+
308+ return sheet;
309+}
310+
311+//uint Sheet_Internal_MapRebuild(UI_Sheet *parent, int px0, int py0, int px1, int py1);
312+//その範囲内のマップを完全に再構成する。
313+uint Sheet_Internal_MapRebuild(UI_Sheet *parent, int px0, int py0, int px1, int py1)
314+{
315+ uint i;
316+ UI_Sheet *search;
317+
318+ search = parent->child;
319+ for(i = 0; i < SHEET_MAX_CHILDREN; i++){
320+ if(search == Null){
321+ break;
322+ }
323+ if(Sheet_Internal_IsRangeOverlappedWithSheet(search, px0, py0, px1, py1)){
324+ Sheet_Internal_MapWriteFromSheet(search, True, px0, py0, px1, py1);
325+ }
326+ search = search->next;
327+ }
328+
329+ return 0;
330+}
331+
332+//uint Sheet_Internal_MapRefresh(UI_Sheet *sheet, int px0, int py0, int px1, int py1);
333+//その範囲内のマップを、sheetに変更があったとして、最小限で再構成する。
334+//座標はmap(parent)なので注意。
335+//nolocationchanged==Trueで、sheetの移動が無いものとみなし、書き込み対象を元々シートがあった場所のみに限定する。
336+//nolocationchanged==Falseで、sheetの高さまではすべて再構成する。
337+uint Sheet_Internal_MapRefresh(UI_Sheet *sheet, int px0, int py0, int px1, int py1, bool nolocationchanged)
338+{
339+ UI_Sheet *search;
340+ int x, y;
341+ uint i;
342+
343+ if(px0 < 0){
344+ px0 = 0;
345+ }
346+ if(py0 < 0){
347+ py0 = 0;
348+ }
349+ if(px1 >= sheet->parent->size.x){
350+ px1 = sheet->parent->size.x - 1;
351+ }
352+ if(py1 >= sheet->parent->size.y){
353+ py1 = sheet->parent->size.y - 1;
354+ }
355+
356+ if(!nolocationchanged){
357+ search = sheet->parent->child;
358+ for(i = 0; i < SHEET_MAX_CHILDREN; i++){
359+ if(search == Null){
360+ break;
361+ }
362+ if(Sheet_Internal_IsRangeOverlappedWithSheet(search, px0, py0, px1, py1)){
363+ Sheet_Internal_MapClearFromSheet(search, False, px0, py0, px1, py1);
364+ }
365+ if(search == sheet){
366+ break;
367+ }
368+ search = search->next;
369+ }
370+ } else{
371+ Sheet_Internal_MapClearFromSheet(sheet, False, px0, py0, px1, py1);
372+ }
373+
374+ for(y = py0; y <= py1; y++){
375+ for(x = px0; x <= px1; x++){
376+ if(sheet->parent->map[y * sheet->parent->size.x + x] == Null){
377+ search = Sheet_Internal_GetSheetFromLocation(sheet->parent, x, y);
378+ if(search != Null){
379+ Sheet_Internal_MapWriteFromSheet(search, False, px0, py0, px1, py1);
380+ }
381+ }
382+ }
383+ }
384+
385+ return 0;
386+}
387+
388+//uint Sheet_Internal_RefreshSheet(UI_Sheet *sheet, int px0, int py0, int px1, int py1);
389+//親グローバル座標でのシートvramリフレッシュ。
390+uint Sheet_Internal_RefreshSheet(UI_Sheet *sheet, int px0, int py0, int px1, int py1)
391+{
392+ DATA_Location2D p, r;
393+ int x, y;
394+
395+ if(sheet->parent == Null){
396+ #ifdef CHNOSPROJECT_DEBUG_SHEET
397+ debug("Sheet_Internal_RefreshSheet:Null parent.\n");
398+ #endif
399+ return 1;
400+ }
401+
402+ if(sheet->parent->map == Null){
403+ #ifdef CHNOSPROJECT_DEBUG_SHEET
404+ debug("Sheet_Internal_RefreshSheet:Null map.\n");
405+ #endif
406+ return 2;
407+ }
408+
409+ if(!sheet->flags.bit.visible){
410+ return 0;
411+ }
412+
413+ Sheet_Internal_GetLocationP(sheet, &p);
414+ Sheet_Internal_GetLocationR(sheet, &r);
415+
416+ if(p.x < px0){
417+ p.x = px0;
418+ }
419+ if(p.y < py0){
420+ p.y = py0;
421+ }
422+ if(r.x > px1){
423+ r.x = px1;
424+ }
425+ if(r.y > py1){
426+ r.y = py1;
427+ }
428+
429+ if(p.x < 0){
430+ p.x = 0;
431+ }
432+ if(p.y < 0){
433+ p.y = 0;
434+ }
435+ if(r.x >= sheet->parent->size.x){
436+ r.x = sheet->parent->size.x - 1;
437+ }
438+ if(r.y >= sheet->parent->size.y){
439+ r.y = sheet->parent->size.y - 1;
440+ }
441+
442+ for(y = p.y; y <= r.y; y++){
443+ for(x = p.x; x <= r.x; x++){
444+ if(sheet->parent->map[y * sheet->parent->size.x + x] == (uint)sheet){
445+ ((uchar *)sheet->parent->vram)[y * sheet->parent->size.x + x] = ((uchar *)sheet->vram)[(y - sheet->location.y) * sheet->size.x + (x - sheet->location.x)];
446+ }
447+ }
448+ }
449+
450+ return 0;
451+}
452+
--- beta/tolset_chn_000/chnos_010/chnos/mtask.c (revision 312)
+++ beta/tolset_chn_000/chnos_010/chnos/mtask.c (revision 313)
@@ -136,7 +136,7 @@
136136 IO_CLI();
137137
138138 *find = task->next;
139- task->flags.linked = false;
139+ task->flags.linked = False;
140140
141141 if(ctrl->now == task){
142142 MultiTask_TaskSwitch(ctrl);
--- beta/tolset_chn_000/chnos_010/chnos/system.c (revision 312)
+++ beta/tolset_chn_000/chnos_010/chnos/system.c (revision 313)
@@ -114,7 +114,7 @@
114114 IO_CLI();
115115
116116 TextMode_Clear_Screen();
117- Error_Set_Enable_Display_TextMode(true);
117+ Error_Set_Enable_Display_TextMode(True);
118118
119119 TextMode_Put_String("Welcome to CHNOSProject!\n", green);
120120
@@ -122,7 +122,7 @@
122122
123123 TextMode_Put_String("\tInitialising SerialPort...\n", white);
124124 Initialise_SerialPort();
125- Error_Set_Enable_SerialPort(true);
125+ Error_Set_Enable_SerialPort(True);
126126
127127 #ifdef CHNOSPROJECT_DEBUG
128128 debug("%s:%d\n", __FILE__, __LINE__);
--- beta/tolset_chn_000/chnos_010/chnos/makeset.txt (revision 312)
+++ beta/tolset_chn_000/chnos_010/chnos/makeset.txt (revision 313)
@@ -1,3 +1,3 @@
11
2-OBJS_BOOTPACK = nasfunc0.obj nasfunc1.obj nasfunc2.obj hankaku.obj chnlogo.obj callbios.obj cfunc.obj display.obj draw08.obj draw16.obj draw32.obj drawing.obj dsctbl.obj emu86.obj emu86asm.obj error.obj fifo.obj fmt_bmp.obj intrpt.obj keyboard.obj memory.obj mtask.obj serial.obj sheet.obj system.obj timer.obj vgatmode.obj xception.obj bootpack.obj
2+OBJS_BOOTPACK = nasfunc0.obj nasfunc1.obj nasfunc2.obj hankaku.obj chnlogo.obj callbios.obj cfunc.obj display.obj draw08.obj draw16.obj draw32.obj drawing.obj dsctbl.obj emu86.obj emu86asm.obj error.obj fifo.obj fmt_bmp.obj intrpt.obj keyboard.obj memory.obj mtask.obj serial.obj sheet.obj shtfunc.obj system.obj timer.obj vgatmode.obj xception.obj bootpack.obj
33 HEADS_BOOTPACK = core.h coredef0.h coredef1.h coredef2.h coredef3.h keyid.h
--- beta/tolset_chn_000/chnos_010/chnos/error.c (revision 312)
+++ beta/tolset_chn_000/chnos_010/chnos/error.c (revision 313)
@@ -1,9 +1,9 @@
11
22 #include "core.h"
33
4-bool Error_Output_Enable_SerialPort = false;
5-bool Error_Output_Enable_Display_TextMode = false;
6-uint Error_Output_Enable_Display_GraphicMode = false;
4+bool Error_Output_Enable_SerialPort = False;
5+bool Error_Output_Enable_Display_TextMode = False;
6+uint Error_Output_Enable_Display_GraphicMode = False;
77
88 void *Error_Output_Display_GraphicMode_VRAM = 0;
99 uint Error_Output_Display_GraphicMode_Lines = 0;
--- beta/tolset_chn_000/chnos_010/chnos/core.h (revision 312)
+++ beta/tolset_chn_000/chnos_010/chnos/core.h (revision 313)
@@ -208,11 +208,30 @@
208208
209209 /*sheet.c シート関連*/
210210 UI_Sheet *Sheet_Initialise(void);
211+uint Sheet_Free(UI_Sheet *sheet);
211212 uint Sheet_SetBuffer(UI_Sheet *sheet, void *vram, uint xsize, uint ysize, uint bpp);
212213 uint Sheet_SetParent(UI_Sheet *sheet, UI_Sheet *parent);
213214 uint Sheet_Show(UI_Sheet *sheet, uint height, int px, int py);
214-uint Sheet_Refresh_Sheet(UI_Sheet *sheet);
215+uint Sheet_RefreshSheet_All(UI_Sheet *sheet);
216+uint Sheet_Slide_Absolute(UI_Sheet *sheet, int apx, int apy);
217+uint Sheet_Slide_Relative(UI_Sheet *sheet, int rpx, int rpy);
218+uint Sheet_RefreshAllInRange(UI_Sheet *parent, int px0, int py0, int px1, int py1);
219+uint Sheet_RefreshSheet(UI_Sheet *sheet, int px0, int py0, int px1, int py1);
215220
221+/*shtfunc.c シート内部関数*/
222+uint Sheet_Internal_GetLocationP(UI_Sheet *sheet, DATA_Location2D *dest);
223+uint Sheet_Internal_GetLocationQ(UI_Sheet *sheet, DATA_Location2D *dest);
224+uint Sheet_Internal_GetLocationR(UI_Sheet *sheet, DATA_Location2D *dest);
225+uint Sheet_Internal_GetLocationS(UI_Sheet *sheet, DATA_Location2D *dest);
226+uint Sheet_Internal_MapInitialise(UI_Sheet *parent);
227+uint Sheet_Internal_MapWriteFromSheet(UI_Sheet *sheet, bool force, int px0, int py0, int px1, int py1);
228+bool Sheet_Internal_IsLocationInRangeOfSheet(UI_Sheet *sheet, int px, int py);
229+bool Sheet_Internal_IsRangeOverlappedWithSheet(UI_Sheet *sheet, int px0, int py0, int px1, int py1);
230+UI_Sheet *Sheet_Internal_GetSheetFromLocation(UI_Sheet *parent, int px, int py);
231+uint Sheet_Internal_MapRebuild(UI_Sheet *parent, int px0, int py0, int px1, int py1);
232+uint Sheet_Internal_MapRefresh(UI_Sheet *sheet, int px0, int py0, int px1, int py1, bool nolocationchanged);
233+uint Sheet_Internal_RefreshSheet(UI_Sheet *sheet, int px0, int py0, int px1, int py1);
234+
216235 /*system.c システムデータ・初期化関連*/
217236 void Initialise_System(void);
218237 void System_Set_RunningPhase(uint phase);
--- beta/tolset_chn_000/chnos_010/chnos/bootpack.c (revision 312)
+++ beta/tolset_chn_000/chnos_010/chnos/bootpack.c (revision 313)
@@ -10,7 +10,7 @@
1010 UI_Task *mytask;
1111 uint i;
1212 IO_DisplayControl *disp_ctrl;
13- UI_Sheet *vramsheet, *testsheet, *testsheet2;
13+ UI_Sheet *vramsheet, *testsheet, *testsheet2, *sheet_desktop;
1414 int x, y;
1515
1616 Initialise_System();
@@ -94,11 +94,19 @@
9494 vramsheet = Sheet_Initialise();
9595 testsheet = Sheet_Initialise();
9696 testsheet2 = Sheet_Initialise();
97+ sheet_desktop = Sheet_Initialise();
9798
9899 Sheet_SetBuffer(vramsheet, disp_ctrl->vram, disp_ctrl->xsize, disp_ctrl->ysize, disp_ctrl->bpp);
99100 Sheet_SetBuffer(testsheet, System_Memory_Allocate(128 * 64 * 1), 128, 64, 8);
100101 Sheet_SetBuffer(testsheet2, System_Memory_Allocate(160 * 100 * 1), 160, 100, 8);
102+ Sheet_SetBuffer(sheet_desktop, System_Memory_Allocate(disp_ctrl->xsize * disp_ctrl->ysize * (disp_ctrl->bpp >> 3)), disp_ctrl->xsize, disp_ctrl->ysize, disp_ctrl->bpp);
101103
104+ for(y = 0; y < disp_ctrl->ysize; y++){
105+ for(x = 0; x < disp_ctrl->xsize; x++){
106+ ((uchar*)sheet_desktop->vram)[y * sheet_desktop->size.x + x] = ((uchar *)disp_ctrl->vram)[y * disp_ctrl->xsize + x];
107+ }
108+ }
109+
102110 for(y = 0; y < testsheet->size.y; y++){
103111 for(x = 0; x < testsheet->size.x; x++){
104112 ((uchar*)testsheet->vram)[y * testsheet->size.x + x] = x * 2;
@@ -113,11 +121,14 @@
113121 Drawing08_Put_String(testsheet->vram, testsheet->size.x, 4, 4, 0xffffff, "TestSheet");
114122 Drawing08_Put_String(testsheet2->vram, testsheet2->size.x, 4, 4, 0xffffff, "TestSheet2");
115123
124+ Sheet_SetParent(sheet_desktop, vramsheet);
125+ Sheet_Show(sheet_desktop, 0, 0, 0);
126+
116127 Sheet_SetParent(testsheet, vramsheet);
117- Sheet_Show(testsheet, 0, 10, 10);
128+ Sheet_Show(testsheet, 1, 10, 10);
118129
119130 Sheet_SetParent(testsheet2, vramsheet);
120- Sheet_Show(testsheet2, 1, 20, 20);
131+ Sheet_Show(testsheet2, 2, 20, 20);
121132
122133 for(;;){
123134 if(FIFO32_MyTaskFIFO_Status() == 0){
@@ -128,19 +139,15 @@
128139 data -= MAIN_KEYBASE;
129140 if(!(data & KEYID_MASK_BREAK) && (data & KEYID_MASK_EXTENDED)){
130141 if((data & KEYID_MASK_ID) == KEYID_CURSOR_U){
131- testsheet->location.y -= 5;
132- Sheet_Refresh_Sheet(testsheet);
142+ Sheet_Slide_Relative(testsheet, 0, -5);
133143 } else if((data & KEYID_MASK_ID) == KEYID_CURSOR_D){
134- testsheet->location.y += 5;
135- Sheet_Refresh_Sheet(testsheet);
144+ Sheet_Slide_Relative(testsheet, 0, 5);
136145 } else if((data & KEYID_MASK_ID) == KEYID_CURSOR_L){
137- testsheet->location.x -= 5;
138- Sheet_Refresh_Sheet(testsheet);
146+ Sheet_Slide_Relative(testsheet, -5, 0);
139147 } else if((data & KEYID_MASK_ID) == KEYID_CURSOR_R){
140- testsheet->location.x += 5;
141- Sheet_Refresh_Sheet(testsheet);
148+ Sheet_Slide_Relative(testsheet, 5, 0);
142149 } else if((data & KEYID_MASK_ID) == KEYID_ENTER){
143-
150+ Sheet_Slide_Absolute(testsheet, disp_ctrl->xsize >> 1, disp_ctrl->ysize >> 1);
144151 }
145152 }
146153 }
--- beta/tolset_chn_000/chnos_010/chnos/fifo.c (revision 312)
+++ beta/tolset_chn_000/chnos_010/chnos/fifo.c (revision 313)
@@ -17,7 +17,7 @@
1717 fifo->flags.overflow = False;
1818 fifo->p = 0; /*write*/
1919 fifo->q = 0; /*read*/
20- fifo->flags.initialized = true;
20+ fifo->flags.initialized = True;
2121 return fifo;
2222 }
2323
--- beta/tolset_chn_000/chnos_010/chnos/coredef1.h (revision 312)
+++ beta/tolset_chn_000/chnos_010/chnos/coredef1.h (revision 313)
@@ -2,7 +2,8 @@
22 /*システムデータ型宣言*/
33
44 /*new object types*/
5-typedef enum _bool { false, true} bool;
5+//typedef enum _bool { false, true} bool;
6+typedef unsigned char bool;
67 typedef unsigned char uchar;
78 typedef unsigned short ushort;
89 typedef unsigned int uint;
@@ -414,10 +415,11 @@
414415 unsigned initialized : 1;
415416 unsigned buffer_configured : 1;
416417 unsigned visible : 1;
417- unsigned map : 1;
418+ unsigned using_map : 1;
418419 } bit;
419420 } flags;
420421 void *vram;
421- void *map;
422+ uint *map;
422423 uint vramsize;
424+ uint mapsize;
423425 } UI_Sheet;
旧リポジトリブラウザで表示