間隔があいてしまいました。 まだまだ4日目です。
前回、いろいろ疑問が出てきたのですが、 まだ疑問を解消するレベルまで僕が達していないと思うので とりあえずもう少し進めることにしました。
さて前回までは描画を行うために、いちいちVRAMとして使われているメモリにアクセスしていました。 しかしこれではただ点を打つだけでも、大変でした。
そこで今回はVRAMへのアクセス処理を隠蔽した、 DrawRectという関数を作成しました。(本文中でやっていることとほぼ同じです。)
int DrawRect(int x, int y, int width, int height, int colorNum, int isFill) { int result = TRUE; char* display = (char*)0; char* startAddr = (char*)(VRAM_ADDR_START + x + y * SCREEN_WIDTH); int i = 0; int j = 0; // 領域チェック if (x < 0 || y < 0 || x > SCREEN_WIDTH || y > SCREEN_HEIGHT || width < 0 || height < 0) { result = FALSE; } else if (x + width > SCREEN_WIDTH || y + height > SCREEN_HEIGHT) { result = FALSE; } if (result != FALSE) { // 描画処理 // 一行ずつ描画していく for (i = 0; i < height; i++) { display = startAddr + i * SCREEN_WIDTH; for (j = 0; j < width; j++) { // 枠 if (j == 0 || j == width - 1 || i == 0 || i == height - 1) { display[j] = colorNum; } // 塗りつぶし else if (isFill != FALSE) { display[j] = colorNum; } } } } return result; }
この関数を利用していくつか四角を描画してみました。

さらにこの関数を使用して以下のようにWindowsのような画面?を書いて見ました。 本文とは少し違っているのですが、なるほど「ハリボテOS」はナイスネーミングですね(笑)

今回進んだ部分は以上なのですが、若干つまずいたことがあるので残しておきます。 それは現在使用しているコンパイラ(cc1.exe)の検出してくれるエラーが想定よりも少ないと言うことです。 例えば、定義されていない関数を呼び出そうとしてもエラーが出ず、 コンパイルが通ってしまいます。そして実行時に予期しないメモリ領域にアクセス してしまい、固まってしまうと言うことが起こりました。 つまり関数のタイプミスにかなり気づきにくいと言うことです。 僕は1時間ほどハマってしまいました。
少しコンパイラのオプションについて調べてみようと思います。
次回はついに5日目です。 文字の描画などを解説しているようです。張り切って進みます!
テーマ:プログラミング - ジャンル:コンピュータ |