2008/05/02 ( n ) < HariboteOS >
初めにアプリケーションをC言語で作成するためにライブラリ(のようなもの)を作成する。作成したアプリケーションの先頭の数バイトを実行時に書き換えたりしてかなりあやしい。
それから不正なアプリから OS を守るためにかなり頑張る。
頑張って守ってみたが、意味不明。
例外にも少し対応。
で、アプリ用にいろんな API を追加してとうとうウィンドウに文字を表示できるようになりました。
2008/04/28 ( n ) < HariboteOS >
まず初めに、コンソールの昨日として様々なコマンドを実装する。
mem, ls, cat 等。ものすごく地道。でも重要。
FAT が地味。
改行コードの処理って Mac は考慮しなくていいのか?と思ったので \r だけでも改行するように改良。
次に、NASK で作った簡単なアプリケーションを実行するために色々頑張る。
GDT, far-JMP あたりが相変わらず微妙。
さらに、アプリ側からOSの機能を使用できるように API を作成する。
この辺のアセンブラも。。。
ついでに far-CALL, RETF, PUSHAD, POPAD, IRETD なんかも。。。
しかし、アプリから API をコールして文字(列)を表示するところまでなんとかたどり着いた。

次回はいよいよ C言語でのアプリ作成。
2008/04/23 ( n ) < HariboteOS >
今日はコンソール。本では17日目。
新しいタスクとウィンドウを作成して、両方のウィンドウでキー入力を受け付けるようにした。
途中で、Shift と CapsLock, NumLock, ScrollLock に対応。
Ctrl と Alt は?と思いつつ次へ。
2つのウィンドウでカーソルの点滅速度が違うのがすごく気になっていたら、 フォーカスが無い方は点滅しないようにして解決するようだ。。。
コンソールを作ったり簡単なコマンド(明日)を作るのもいいけど、
早く独立したアプリケーションで動かしたいぞ。
2008/04/21 ( n ) < HariboteOS >
今日はマルチタスクを実装。
この辺からソースの説明が大雑把になってくる。
CDのソースがメインで、本自体がおまけと著者が言っているのでしょうがない。
マルチタスクの仕組み、タスクの自動切り替え、優先度の設定などを実装。
今日もかなり満足。
2008/04/17 ( n ) < HariboteOS >
マルチタスクに進む前に、というか、進む気持ちが今日は起こらなかったので、 HariboteOS の C言語のソースを色々いじってみた。
typedef _Point
{
int x;
int y;
} Point;
と同じように Size, Rect 構造体を作って、
graphics.c や sheet.c の座標関係を扱っている部分を全て書き換えた。
C++ のクラスのようにメソッドを作れないとメリットが半減のような気がするが、 ソースの見た目は自分的にはとても良くなったようだ。
試しに、高速カウンタで計測してみると、、、、、2割くらい遅くなってるかも。
うーむ。よくない。でも、元に戻すのは何かくやしいのでどうするかは保留。
変更の途中で、背景、ウィンドウを描画しているところを書き換える際にKDE4ライクなイメージに書き換えた。
寄り道はこの位にして、明日こそはマルチタスクを実装しよう。
2008/04/16 ( n ) < HariboteOS >
カウントアップアプリケーションを作成して表示をしてみると
画面がチラチラすることが判明したので、描画まわりの改善をとりあえず始めてみる。
途中で、本の map の使い方が気に入らなかったので自分方式に変更。
void sheet_refreshsub( struct SHTCTL* ctl, int vx0, int vy0, int vx1, int vy1, int h0 )
{
int h, bx, by, vx, vy, bx0, by0, bx1, by1;
unsigned char *buf, c, *vram = ctl->vram;
struct SHEET* sht;
if( vx0 < 0 ) vx0 = 0;
if( vy0 < 0 ) vy0 = 0;
if( vx1 > ctl->xsize ) vx1 = ctl->xsize;
if( vy1 > ctl->ysize ) vy1 = ctl->ysize;
// init map
for( vy = vy0; vy <= vy1; vy++ )
{
for( vx = vx0; vx <= vx1; vx++ )
{
ctl->map[vy * ctl->xsize + vx ] = 0;
}
}
for( h = ctl->top; h >= h0; h-- )
{
sht = ctl->sheets[h];
buf = sht->buf;
bx0 = vx0 - sht->vx0;
by0 = vy0 - sht->vy0;
bx1 = vx1 - sht->vx0;
by1 = vy1 - sht->vy0;
if( bx0 < 0 ) bx0 = 0;
if( by0 < 0 ) by0 = 0;
if( bx1 > sht->bxsize ) bx1 = sht->bxsize;
if( by1 > sht->bysize ) by1 = sht->bysize;
for( by = by0; by < by1; by++ )
{
vy = sht->vy0 + by;
for( bx = bx0; bx < bx1; bx++ )
{
vx = sht->vx0 + bx;
c = buf[by * sht->bxsize + bx];
if( ctl->map[vy * ctl->xsize + vx] == 0 && c != sht->col_inv )
{
vram[vy * ctl->xsize + vx] = c;
ctl->map[vy * ctl->xsize + vx] = 1;
}
}
}
}
}
一番上のレイヤーから描画していって、描画済みの部分にフラグをたてて、下位のレイヤーでは描画しないようにした。
次はタイマの作成。
IRQ0 の割り込み。仕様は見ていないけど、実装は難しくない。
割り込みハンドラの最適化も頑張って改善。アルゴリズム系はそんなに難しくない。
さらに高解像度に挑戦。
相変わらず BIOS 関係のアセンブラが登場すると理解ができない。
どのレジスタが何のためにあるのか、どういう風に使う(使える)のかが分かってないのが問題かなぁ。
で、適当にキー入力に対応して、マウスでウィンドウを動かせるようにしたところで、
14日目の分が終了。やっと半分。

ちょっと冷静に考えてみると、実質7日でこんなにOSらしく動いているのはすごい。
2008/04/15 ( n ) < HariboteOS >
週末は飲んでました。
昨日は仕事。
今日はメモリ管理からスタート。
32MB のメモリを管理して、一部の確保、開放なんかを実装。
シンプルだけど、よく考えられている。
次に画面のレイヤー管理。
SHEET 構造体を作成して位置、順序を管理して、描画処理を行う。
vx0, vy0, vx, vy, vx1, vy1 とか変数が増えてめんどくさい。
Point とか Rect とか作って。。。みるか。今度。
苦労の甲斐があって、マウスの動きで背景が上書きされる問題が解決。
で、最後にウィンドウの表示。
地道にウィンドウを描画して。。。

明日はタイマーの作成と描画の最適化。地道にがんばりましょう。
2008/04/11 ( n ) < HariboteOS >
今週は仕事を普通にしながら、夕食後から夜中にかけてOS作りをしていたので、 さすがに相当疲労が溜まってしまいまして、今日はあまり進まなかった。
初めにマウスを動かす処理。
昨日マウスからのデータの読み込みまで終了していたので、今日はこのデータを解析して、マウスカーソルを実際に動かしてみた。ついでにボタンに応じてカーソルの色を変えてみたり。
それからブートローダー関連で後回しになっていたアセンブラソースの解説を読む。
GDT,IDT の簡単な初期化、OSのメモリ領域へのコピー等など。
なんか若干理解できた気分。
次に、メモリ容量の取得。
すごくシンプルだけど、こんなもんでいいんだろうか。
それからメモリ管理部分に頭を突っ込んだけど、今日はギブアップ。
今日のところの成果。

本の9日目までを4日で進んだのでいいペース。ただ、ちゃんと理解できていない部分もある。
でも、とりあえず楽しんで作って、細かいことは後でちゃんと勉強するって方針でいいと思います。
2008/04/10 ( n ) < HariboteOS >
まず最初に文字の描画。32bit になってしまったのでもはやBIOSはつかえない。
ビットマップみたいなフォントデータを作成して1ドットづつ地道に描画。。。
なかなか切ない。
本に付属のフォントデータを使用してASCII文字列の描画ができるようになった。
デバッグメッセージを表示できる様になったのは喜ぶべきことのはず。
次に、マウスカーソルの表示。
とりあえず表示だけ。
で、ここからが本日のメインイベント。
GDT と IDT。
IDTの方はやりたいこともやってることも(やり方は別として)なんとなく理解できる。
一方GDTの方はさっぱり。要復習。
息抜き程度にソースを分割。
複数のソースファイル(*.c,*.nas)に対してヘッダファイルが一つっていう状況に違和感を感じるのは普通なんだろうか。
で、割り込みの設定をしてキーボードとマウスの反応を得る。
ハードの制御となると途端に難しく感じる。こちらも要復習。
途中で FIFO を実装。
オブジェクトにしてメソッド呼び出したいよーと思いながらも C++ でやることのハードルの高さに(全然見当もつかないけど)しぶしぶ我慢。
やっぱり C言語はあまり好きではない。
今日の結果。

見た目はそんなに変わらないけど、マウスとキーボードを例にハードウェア回りの最初の一歩を踏み出した感じ。
今日はここまで。いいペース。
2008/04/09 ( n ) < HariboteOS >
昨日手書きしたイメージファイル を作るためのアセンブラを、とりあえず本を見ながら打ってみる。
イメージファイルをバイナリエディタで作ってからアセンブラで作り始めるのは順番が逆では?と思いつつもこっちの順番の方が意外と理解しやすいのが不思議だ。
Linux版開発セットを HariboteOS/Index から持ってきてアセンブルして実行。当然結果は昨日と同じ。
Linux/wako_memo をブックマークに追加。
......................
レジスタがたくさんあって、8ビットだ16ビットだ32ビットだと全然覚えられない。 そのうちアセンブラの教科書的なものを買ってこよう。
で、なんか調子がよくて、なんと本の四日目まで終わってしまった。
要所要所で説明が省かれて(後で説明しますとかなんとか)、
肝心なところが理解できていないような感じを残しつつ、
画面にお絵描きをするに至る。

今日はここまで。GW前に終わらないかなぁ。
![]()
![]()
![]()
![]()
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
|---|---|---|---|---|---|---|
| 19 | 海の日 | |||||
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
![]()
フルスクラッチによるグラフィックスプログラミング入門
0から画像処理のプログラミングが学べます
★★★★☆
Unixバックアップ&リカバリ
サーバー管理者は必読!自信と安心をこの本で。
★★★★☆
からくり儀右衛門
最高の技術で妥協しないものづくり
★★★☆☆
PostgreSQL完全攻略ガイド
データベース使いを目指して
★★★★☆
オトナ語の謎。
「…。」でニュアンスまで伝えろ!詳細はお求め頂ければ分かるかと…。←
★★☆☆☆
Qt GUIプログラミング
豊富な例と重要なテクニックがぎっしりです。Qt開発者必読。あれもこれも直したい…。
★★★★☆
ネイティブスピーカーの英文法
丸暗記の英文法を卒業しましょう?
★☆☆☆☆
プロジェクトX リーダーたちの言葉
読んでください
★★★☆☆
BLOG HACKS
ブログを様々な角度から改造してみましょう。
★★★★☆
インテル スレッディング・ビルディング・ブロック —マルチコア時代のC++並列プログラミング
マルチコア時代のC++並列プログラミング
★★★★★
プロ論。
仕事と人生に対する強烈なメッセージ集
★★★★☆
仕事で差がつくメモ術・ノート術
うーん
☆☆☆☆☆
SQLite入門 すぐに使える軽快・軽量データベース・エンジン
SQLite のすべてがわかる、充実の1冊!!
★★★★★
入門 Qt 4 プログラミング
Qt4 開発者必携
★★★★★
世界最速のF1タイヤ
タイヤの開発からレースまで分かりやすく面白く書かれています
★★☆☆☆
![]()
Copyright - ©2003- tasuku All Rights Reserved