雑記帳
ここはhideyosiの雑記帳です。テケトーに書き散らしてるだけなので間違っていたりとは普通にしてます。信用度は相当低いことをあらかじめご了承を。またご覧のようにWikiを使ってますが、hideyosi意外は書き込めません。
3: 2007-11-23 (金) 00:32:44 ソース バックアップ No.3 を復元して編集 現: 2024-01-06 (土) 22:39:11 ソース 編集
Line 54: Line 54:
      p[i] = 0x6;       p[i] = 0x6;
    }     }
 + 
  io_out8(0x03c4, 0x0102);  //00000001   io_out8(0x03c4, 0x0102);  //00000001
  for ( i = 0; i <= 512*1; i=i++)   for ( i = 0; i <= 512*1; i=i++)
Line 60: Line 60:
      p[i] = 0x6;       p[i] = 0x6;
    }     }
 + 
  io_out8(0x03c4, 0x0202);  //00000010   io_out8(0x03c4, 0x0202);  //00000010
  for ( i = 0; i <= 512*1; i=i++)   for ( i = 0; i <= 512*1; i=i++)
Line 66: Line 66:
      p[i] = 0x6;       p[i] = 0x6;
    }     }
 + 
  io_out8(0x03c4, 0x0302);  //00000011   io_out8(0x03c4, 0x0302);  //00000011
  for ( i = 0; i <= 512*1; i=i++)   for ( i = 0; i <= 512*1; i=i++)
Line 74: Line 74:
うーーーん・・・なにも変化がない・・・ うーーーん・・・なにも変化がない・・・
 +
 +**ズギャ!!! 色が出たぞ!!!!! [#bc07c8e2]
 +・・・・なっあぁるほどおぉぉぉお!!!!!!! そういうことなのね!!!
 +
 +オイラが今までなにやっても変化がなかったコードがこれ。
 +
 +  io_out8(0x03ce, 0x0005);  //書き込みモードを0に
 +  io_out8(0x03ce, 0x0301);  //全プレーンをenableに
 +  io_out8(0x03ce, 0x0700);  //色番号7をセット
 +  io_out8(0x03ce, 0xff08);  //描画データのマスク
 + 
 +  for ( i = 0; i <= 512*2; i++){
 +  p[i] = 0x6;
 +  }
 +
 +#ref(q0.jpg)
 +
 +値をいろいろ変化させても白い色の点しか書けない。なにか致命的なミスや勘違いでもあるのかと、かなり迷宮のラビリンスですた・・・
 +
 +''解決!!'' っというか、問題点が見つかった。
 +
 +なんのことはない! はりぼてのio_out8は伊達に''8''に字が付いていない。これは8バイトしかアクセスしないんじゃねーかよ!!!  ・・・・orz・・・
 +
 +見たほうが早いよね? 同じ目的のコードだけど、これで解決!!
 +
 +  io_out8(0x03ce, 0x05);  //書き込みモードを0に
 +  io_out8(0x03cf, 0x00);
 + 
 +  io_out8(0x03ce, 0x01);  //全プレーンをenableに
 +  io_out8(0x03cf, 0x03);
 + 
 +  io_out8(0x03ce, 0x00);  //色番号7をセット
 +  io_out8(0x03cf, 0x07);
 + 
 +  io_out8(0x03ce, 0x08);  //描画データのマスク
 +  io_out8(0x03cf, 0xff);
 + 
 +  for ( i = 0; i <= 512*2; i++){
 +  p[i] = 0x6;
 +  }
 +#ref(q1.jpg)
 +
 +うーーーん・・・。今思えばかなりマヌケな話だなぁ我ながら・・・(^^;
 +まあ、とにもかくにも変化が起こり、レジスタにちょっかいを出すと効果が出るというところまで漕ぎ着けた。後はさっそく、各プレーンの意味等を実験してみよう!!
 +
 +COLOR(red){・・・ラッチは?・・・・ラ・・・ラッチはあぁぁぁぁ????・・・・}
 +
 +**まずはモード3に絞ってみるか・・・ [#ye165799]
 +[[OS-Wiki:http://community.osdev.info/index.php?VGA]]によると、もっとも有用なモードとある。(OSASKでも多様されているらしい)
 +
 +とりあえずこのモードに絞っていろいろ試してみよう。
 +
 +-まずはEnable Set/Resetについて。
 +--プレーン0のみ・プレーン1のみ・・・・プレーン2と3のみ・・・等等と実験してみたが変化はない・・・
 +''って!!!!'' これはモード0のみしか効かないのか・・・(最初によく読もう)
 +
 +-次はBit Mask (描画マスク)ね
 +--これはまあわかるね。読んで字のごとくだし・・・(^^
 +
 +-次にSet/Reset (ラッチとの演算に関するレジスタ)。
 +--ここに色をセットするとその通りの色が書き込まれる・・・でいいのかな??
 +--ここは頭4ビットが無視されるんだから事実上0x0〜0xFまでの値しか指定できない。つまり、16色つーことかな。
 +---0x00:COLOR(black){黒}
 +---0x01:COLOR(#0000A8){暗い青}
 +---0x02:COLOR(#00A800){暗い緑}
 +---0x03:COLOR(#00A8A8){暗い水色}
 +---0x04:COLOR(#A80000){暗い赤}
 +---0x05:COLOR(#A800A8){暗い紫}
 +---0x06:COLOR(#A85700){暗い黄色}
 +---0x07:COLOR(#A8A8A8){暗い灰色}
 +---0x08:COLOR(#575757){さらに暗い灰色}
 +---0x09:COLOR(#5757FF){青}
 +---0x0a:COLOR(#57FF57){緑}
 +---0x0b:COLOR(#57ffff){水色}
 +---0x0c:COLOR(#FF5757){赤}
 +---0x0d:COLOR(#FF57FF){紫}
 +---0x0e:COLOR(#FFFF57){黄色}
 +---0x01:COLOR(black){白}
 +
 +**そんなにややこしくない・・・のかな?? [#n84ce344]
 +うーーーーーん・・・・
 +
 +ここまでやってみたけど、少なくともモード3なら、そんなにバカみたいにややこしいわけではないのかなぁ・・・
 +
 +ちょっと試しに、harib01g で同じ動作をするbox関数を作ってみるか・・・
 +
 +**試作boxfill8関数でけたー! [#sd7644b1]
 +おっしゃぁ! 出来た! これでどうじゃろ!???
 +
 + void boxfill8(unsigned char *vram, int xsize, unsigned char c, int x0, int y0, int x1, int y1)
 + {
 +  int i,i2,i3;
 +  int xx0,xx1;
 +  unsigned char maskx;
 + 
 +  io_out8(0x03ce, 0x00);io_out8(0x03cf, c);    //色番号をセット
 + 
 +  //x(横)の始点と終点を8で丸める
 +  if ( x0 % 8 == 0 )
 +   {
 +     xx0 = x0;
 +   }
 +  else
 +   {
 +     xx0 = x0 - ( x0 % 8);
 +   }
 + 
 +  if ( x1 % 8 == 0 )
 +   {
 +     xx1 = x1;
 +   }
 +  else
 +   {
 +     xx1 = x1 + ( x1 % 8) - 8;
 +   }
 + 
 +  for ( i = y0; i <= y1; i++)
 +   {
 +     for ( i2 = xx0; i2 <= xx1; i2=i2+8)
 +    {
 +      //xの先頭部分との修正
 +      if (i2 == xx0)
 +        {
 +       maskx = 0xFF;
 +       maskx = maskx >> (x0 % 8 );
 + 
 +       io_out8(0x03ce, 0x08);  //描画データのマスク
 +       io_out8(0x03cf, maskx);  //描画データのマスク
 +        }
 +      //xのお尻の部分の修正
 +      if ( i2 == xx1 )
 +        {
 +          maskx = 0xFF;
 +          maskx = maskx << (8 - (x1 % 8));
 + 
 +          io_out8(0x03ce, 0x08);  //描画データのマスク
 +          io_out8(0x03cf, maskx);  //描画データのマスク
 +        }
 + 
 +      //頭でもお尻でもなければ・・・
 +      if ( i2 != xx0 && i2 != xx1 )
 +        {
 +       io_out8(0x03ce, 0x08);  //描画データのマスク
 +       io_out8(0x03cf, 0xff);  //マスクなし
 +        }
 + 
 +      vram[ ( i * xsize / 8 ) + (i2 / 8) ] = 0xff;
 + 
 +    }
 + 
 +   }
 + 
 +  return;
 + }
 +
 +**あれえぇ??? [#af97836a]
 +まってまって!?
 +
 +マスクって、覆ったところ(0の部分)って、元の色じゃなくて新たに黒で塗られちゃうの!???
 +えーーーーーー!!! ダメじゃん!!!
 +
 +**俺はハンパでナンパな男なんだよ! (ヴオォォォォ!!) [#la742295]
 +
 +うーーん。8の倍数でないx座標だとどうしてもこうなってしまう・・・
 +#ref(q2.jpg)
 +もともとある色を崩さずに書き込む方法ってないのかなぁ・・・
 +(OSASKのフォント描写の方法がヒントのようだがいまだにラッチがなんなのかよくわからない・・・)
 +
 +「ラッチに背景色を読み込んでおいて・・・」とある。
 +
 +このラッチという場所に色のデータを読み込ませる・・・(この場合は背景の緑色)
 +
 +ラッチに色を読み込ませるにはリードすればいい???
 +
 +え? じゃ、たとえば、 aaa = 0xa0001;  とか、そういう意味????
 +
 +・・・やっぱ違うよなぁ・・・・
 +
 +
 +    io_out8(0x03ce, 0x08);  //描画データのマスク
 +    io_out8(0x03cf, 0xff);  //マスクなし
 + 
 +    //psetmodeに・・・
 +    io_out8(0x03ce, 0x03);
 +    io_out8(0x03cf, 0x00);
 + 
 +    tmp = vram[( i * xsize / 8 ) + (i2 / 8) ] ;  //読み込んでラッチに・・・?
 +    vram[ ( i * xsize / 8 ) + (i2 / 8) ] = maskx;
 +
 +
 +**あっれぇ? ちょっとまてよ!?? [#eb2e4716]
 +
 +・・・こゆことか!? こーゆーこーとーかーーーーぁ!!
 +
 +*わかったあぁぁぁぁ!!!!!!!!!!! [#z831b124]