点を打つpset()関数の製作(バグあり版)

 画面へのパターン表示ができたので,次はpset()関数で点を打つ実験.

 int pset(x,y); でx=0~71,y=0~31の範囲で点を打ちます.点を打つといっても結局はアドレスを計算してそこにデータを書き込むだけです.

 アドレスの計算式ですが,座標(0,0)のアドレスが0x80000で,xが1増えるごとにアドレスが1増える.面倒なのがyの計算で,yが8増えるごとに0x100増えます.先日のVRAMのアドレスの項参照のこと.ということで計算式は,

      p = vram+(y/8)*0x100+x;

になります.ここに書き込むデータですが,y座標=0,8,16,24のときは0x01,y座標=1,9,17,25のときは0x02となります下記図参照.

■ ビット0 0x01を書き込むとこうなる.






□ ビット7
 

□ ビット0
■  0x02を書き込むとこうなる





□ ビット7
 

 ということでシフト演算子を使って,

   unsigned char data=1;
    data <<=(y % 8);    // 書き込むデータ

となります.ということで関数は以下の通り.

int pset(int x, int y){
const unsigned char *vram=0x80000;
unsigned char *p;
unsigned char data=1;

//範囲チェック
if ((x>72)||(y>32)){
return (-1); //以上終了
}
p = vram+(y/8)*0x100+x; //アドレスの計算
data <<=(y % 8); // 書き込むデータ
*p = data;

return (0); //正常終了
}
 

 入力値xとyの範囲チェックもちゃんとやってます.意外と重要.これを以下のように呼び出します.

for (i=0; i<32; i++){
pset(i,i);
}
 

 するとこんな感じ.

 斜め線です.右下のゴミは液晶のゴミです(余った基板使ってるので…).

 ところでバグあり版って何? 続く.

 

このブログ記事について

このページは、Interface編集部が2009年12月14日 12:13に書いたブログ記事です。

ひとつ前のブログ記事は「Amazonマーケットプレイスで本誌がすごい値段に」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。