画面へのパターン表示ができたので,次は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);
}
するとこんな感じ.
斜め線です.右下のゴミは液晶のゴミです(余った基板使ってるので…).
ところでバグあり版って何? 続く.