ザビタン開発日記
2009 | 01
2008 | 01 | 02 | 06 | 12
2007 | 10 | 11 | 12
10月 17 (水曜日) 2007
22:15
タスクを作成
 
いろいろと悩んだ末、マルチタスクの章でやってた、
いくつもウィンドゥを並べてそこで実験するというのでやってみる
ことにしますた・・・・

//テストウィンドゥ
//=============================
//メモリの定義??
struct MEMMAN *testmemman = (struct MEMMAN *) MEMMAN_ADDR;
//まず下敷きをもらってくる
struct SHEET *testsht = sheet_alloc(shtctl);
//このシートに書きもけるよう、バッファを確保する。
//大きいのでmemman_allocを使う
unsigned char *testbuf=(unsigned char *) memman_alloc_4k(testmemman,400*200);
//このバッファをtestwin下敷きで使用できるように当て込む
sheet_setbuf(testsht,testbuf,400,200,-1);
//バッファにウィンドゥを作成する
make_window8(testbuf,400,200,"testwin",0);
//新しいタスクを作るため、taskmanからタスクをもらってくる
struct TASK *testtask = task_alloc();
//このタスクで使うfifoバッファを確保する
int *testfifo = (int *) memman_alloc_4k(testmemman,128*4);
//タスクから使えるように当て込む
testtask->cons_stack = memman_alloc_4k(testmemman,64*1024);
testtask->tss.esp = testtask->cons_stack + 64 * 1024 - 12;
testtask->tss.eip = (int) &test_task;
testtask->tss.es = 1 * 8;
testtask->tss.cs = 2 * 8;
testtask->tss.ss = 1 * 8;
testtask->tss.ds = 1 * 8;
testtask->tss.fs = 1 * 8;
testtask->tss.gs = 1 * 8;
*((int *) (testtask->tss.esp + 4)) = (int) testsht;
*((int *) (testtask->tss.esp + 8)) = memtotal;
task_run(testtask, 2, 2); /* level=2, priority=2 */
fifo32_init(&testtask->fifo, 128, testfifo, testtask);

とりあえずこんなことして、とにもかくにもタスクを起動させてウィンドゥを持たせてみた。
・・・なんとか成功のようだな・・・

さて、このタスクにタイマーを置かなくちゃ。ええと・・・どうやるんだっけかな??

あー!そっかそっか! 同じパターンだね。そんなわけで、こんなのと追加。



・・・なんか大間違いっぽいな・・・
タスクをもう一回復習しとこう。
 
30日を過ぎたBlogにはコメントできません。
17:09
時計搭載に挑戦
 
さーて。あんまし見た目だけやっててもアレなんで(まだやりたいのや山々でつが・・・(汗 )

ダミーで置いてある時計。これを本当に動かすことってできないもんかなぁと・・・

ここいら辺に参考文献が!??

さっそくカンニング参考にしながらイジってみよう・・・

おぉ! ちゃんと現在時刻をゲットできたぞ!??(^^

・・・さてここで考察。

CMOSによって、とりあえず現在の時刻を得ることができた。あとは
タイマーを使って1秒ごとに割り込みをかけ、数値を
足して行けばいい・・・・。そんなんでいいのかな???

えーっと。タイマーはどうしよう? それ用に作るかな?それとも??

いろいろ考えてみたけど、マルチタスクの時、別の窓開いてカウントとかやってたよね。
ああいうのをやって実験してみよう!!

えーっと。今はウィンドゥを出すにはどうしてるんだっけ。

  1. ウィンドゥを出すAPIを呼び出す

・・・あ”これだけだったっけ・・・

・・・その後、かなりガチョーーンなことに気が付いた。
bootpac.cからはAPI使えないのね・・・
 
30日を過ぎたBlogにはコメントできません。
16:54
THE-BBL OS リリース!
 
そんなわけで、リリースの第一弾つーかね。
Ver.0.00ということでどうかひとつ・・・・(汗

(以前にも一回おんなじような感じでリリースしたんですが、あれは忘れてください・・・)

Makefileをちょこっと直して、ウチの子の画像を挟み込みました


リビジョン10相当っすね。
 
30日を過ぎたBlogにはコメントできません。
14:18
コンソールの各パラメータを定数化
 
console.c内の各関数。ここでは初期値(文字数30x8)が決め打ちされている。
これらをとりあえず全て定数化してみる。

#define CONS_CHAR_X 80;
#define CONS_CHAR_Y 24;

こんなのをconsole.cの先頭に追加。
各関数内の数値を変更してみる。


おっと??
なんかいけたっぽいぞ??
euc.txtに文字を沢山書き込んでテスト・・・

おぉ! いいじゃんいいじゃん!!!


リビジョン9

 
30日を過ぎたBlogにはコメントできません。
09:39
コンソールの位置と大きさ
 
ニセタスクバーを上にもっていっちゃったせいで、最初に表示される
コンソールとかぶってしまうようになりました。
また、当分は800x600でやっていきますが、それだとちょっとこの
コンソールでは狭すぎですよね?80x24くらいにしたいなぁ・・・

そんなわけでさっそく改造!
まずはコンソールの表示位置ね。
えーっと。これはどこでやってたっけかな・・・。

あったあった。bootpac.c内で key_win = open_console(shtctl, memtotal); として呼んでいる。これが最初のコンソール。

そのすぐ下のあたり。ここで、マウスや初期コンソールなどのシートの位置を
sheet_slideなどで調整しているね。

sheet_slide(key_win, 32, 4);

これを書き換えれば最初の位置が変更できる。

sheet_slide(key_win, 32, 32);

とりあえずこんなもんでいいかな。

次にコンソールの大きさ。これはどこでやってるのかな。
???あれれれ?
open_console関数内で決めうちしてるのかな?これ??

sheet_setbuf(sht, buf, 256, 165, -1); /* 透明色なし */

とりあえずこの辺の数字をいろいろといじってみる・・・

ふむ・・・・単にここいらへんの数字を変えただけではいろいろとズレが
生じちゃうよね?ここは一発、open_console関数の復習と逆説で考えてみよう。

まず、オイラの目的は80x24のコンソールがほしいわけ。
そうなると単にウィンドゥの大きさだけじゃない。その大きさの
テキストボックスが収まる窓が必要。これを逆に計算してみると・・・

標準状態:30x8文字で240x128(文字が8x16だからね)
欲しい状態:80x24文字だから640x384。

さらにウィンドゥの部品が覆うので高さが+37、幅が+16となるから
ウィンドゥの大きさは656x421とこうなるわけね。
open_console内の各数字をこれに合わせてみる・・・


             :
unsigned char *buf = (unsigned char *) memman_alloc_4k(memman, 656 * 421);
sheet_setbuf(sht, buf, 656, 421, -1); /* 透明色なし */
make_window8(buf, 656, 421, "console", 0);
make_textbox8(sht, 8, 28, 640, 384, COL8_000000);
sht->task = open_constask(sht, memtotal);
             :


・・・・おぉぉ! ひろーーいコンソールが!できたーーー!

ダメじゃん!!!!!!!


これ、わかります? 
ウィンドゥは広くなってるけど、コンソール部分は前と同じ大きさ
のままなんですよ〜?(T T)
これじゃまるで、旅館の大広間で3人だけ朝食喰ってる状態じゃないですか!!

えーーーっと、この辺の制御はどこだったかな・・・

むむむーーーーー!!!!

これはconsole.c内。でも、幅や高さをみな決め打ちで行ってますねぇ・・・

こりゃ大幅な改造・・・いや! むしろ引数、いやさ、せめて定数かなんかに改造しておかないと大変だぞおぉぉ!!!(汗

リビジョン8
 
30日を過ぎたBlogにはコメントできません。

Referer  (9)
00:11
パターン関数。怪我の功名!??
 
画面の四隅。oldMacではどこも角をまるくしている。
BBLも上の上下はそうしてる。例のパターン関数でね。
・・・でも、問題発生。下のほうだと、こうなっちゃう・・・

これはわかるよね?。背景パターンの上に白を新たに塗ってしまった上体なんだよなぁ。
今パターン関数は二色対応だけど、透明色か三色対応しなくてはならんかなぁ・・・

と思っていたら!!

現在のパターン関数は * しか判断していない。
ってことは、 . も判断させて、それ以外の文字(たとえばスペースとか)を放置するようにしたら・・・

おぉぉ! 透明色(と言えば聞こえはいいが、ようはなんもしない部分)ができた!
これで下の四隅もOKだぞ!??




●リージョン7
 
30日を過ぎたBlogにはコメントできません。
10月 16 (火曜日) 2007
04:06
微調整
 
大体ウィンドゥは出来上がったけど、ちょっと問題が。

ウィンドゥをアクティブ・非アクティブに切り替えた時。

えーっと。非アクティブの時タイトルバーを塗り潰してるところってどこだっけ・・・

あったあった。change_wtitle8。

さっそく改造・・・

でけたでけた〜♪

 
30日を過ぎたBlogにはコメントできません。
00:41
ウィンドゥの描画はどこ?
 
えとえと。ウィンドゥを作成している場所はというと・・・


  1. ウィンドゥを出すためのAPIがある。api_openwin。
  2. これが呼び出されると、a_nask.nas内の_api_openwinがコールされる。
  3. 内部で機能番号5としての割り込み(0x40)を発生させる。
  4. console.c内に実際の動作が書かれている。
  5. ・・・sheet_allocで下じきを一枚もらって・・・
  6. ・・・sheet_setbufで新しい下じきの大きさ等を設定。
  7. ・・・make_window8で実際のウィンドゥ画面を書く

こういう道筋だったよね。
えーっと。make_window8はと・・・あったあった! window.c内だ!!

おっと!?? この中ではboxfill8を呼び出してるね。ってことは、
例のオイラのptboxfill関数でいろいろいけるね〜♪。早速配置!

むむむむ!??
あ〜。タイトルバーは別関数かぁ。ええと・・・
すぐ下のmake_wtitle8だね。先にこっちを改造。
 
30日を過ぎたBlogにはコメントできません。

Referer  (2)
10月 15 (月曜日) 2007
23:17
背景でけたー!
 



パターン関数が思いのほか便利なので、こんなんなりました〜。



さーーーて!!

いよいよウィンドゥへのカスタムと行きますか!!
 
30日を過ぎたBlogにはコメントできません。
13:52
パターン埋め関数できたかな?
 
うーん。これでいいかな???


void ptboxfill8(char *vram, int vgax, int startX, int startY,int xsize,
int ysize, char *ptn, int ptnY, int ptnX,int forcolor,int backcolor){

/*引数一覧
   --*vram vramのアドレス
--vgax 現在の画面モードのx方向のサイズ
--startX 塗り潰し開始点のx座標
--startY 塗り潰し開始点のy座標
--xsize 塗り潰す範囲のx方向の大きさ
--ysize 塗り潰す範囲のy方向の大きさ
--*ptn 塗り潰しパターンの配列変数

--ptnY パターン配列のy方向(縦方向)の大きさ
--ptnX パターン配列のx方向(横方向)の大きさ
  ここが逆転しているのは配列宣言と同じ
          置き方になるようにするため

--forcolor パターンで*だった場合にこの色を置く
--backcolor パターンで*以外だった場合にこの色を置く
*/
int y2,x2;
int ptnX2,ptnY2;
ptnX2=0;ptnY2=0;

for(y2=startY; y2 <= ysize; y2++){
if (ptnY2 > ptnY-1){ptnY2=0;}

for(x2=startX; x2 < xsize-1; x2++){
if (ptnX2 > ptnX-1){ptnX2=0;}

if(ptn[ptnY2*ptnX+ptnX2] == '*'){
vram[y2*vgax+x2]=forcolor;
}
else {
vram[y2*vgax+x2]=backcolor;
}

ptnX2++;
}
ptnX2=0;
ptnY2++;
}

return;
}




で、呼び出しはこんなことしてみたり・・・

static char ptn[8][8] = {
"********",
"**.....*",
"*.*....*",
"*..*...*",
"*...*..*",
"*....*.*",
"*.....**",
"********"
};
char sas[40];
sprintf(sas,"ptn= %05x",ptn);
putfonts8_asc(vram,800,64,8,COL8_000000,sas);

ptboxfill8(vram,x,0,20,x,y-30,ptn,8,8,COL8_000000,COL8_FFFFFF);






おぉぉ! でけたーーーー!!!!

━━━━━━(゜∀゜)━━━━━━

そんなわけで!!!!


char ptn[6][9] = {
"*..*..*..",
".........",
".........",
"..*..*..*",
".........",
"........."
};
ptboxfill8(vram,x,0,0,x,y-29,ptn,6,9,COL8_000000,COL8_FFFFFF);



init_screen側からこんなふうに呼び出すことで、最初の計算式と
同じ効果を出せましたぁ!! (^^
 
30日を過ぎたBlogにはコメントできません。

Referer  (4)
« 6 7 8 9 10 11 12 13 14 15 (16) 17 » 

PopnupBlog V3 Denali created by Bluemoon inc.