2018年06月12日

SR画面周り(3)

  P6月間企画(その12)

  SRモードでの画面周りについて、続きです。

  今回は、横320ドットのグラフィックモードについて、その1です。


○グラフィックモード320×200/320x204ドット

1)縦ドット数について
 横320ドットの場合、縦は200ドットか204ドットになります。ポート0xC1のbit0で切り替えます。

 縦200ドットの場合は、『下4ドットが表示されない状態』です。

 スクロールした場合は、
  スクロールY座標が 0の場合:Y座標が0-203の内、0-199が表示される
  スクロールY座標が10の場合:Y座標が0-203の内、10-203,0-5が表示される
 となります。

2)ビットマップモード、直接アクセスモードについて
 ポート0xC8のbit3を0にすると、ビットマップモードがイネーブル(有効)になります。
 ポート0xC8のbit3を1にすると、ビットマップモードがディセーブル(無効)になります。

 呼び名が長いので、私は『ビットマップモード』『直接アクセスモード』と呼んでいます。
 (ビットアクセスモード、と言っているかも...)


 大雑把に言うと...

・ビットマップモード:
 Y座標をポート0xCE、X座標をアドレスで指定する。
 4ビット単位でVRAMに読み書きする。

・直接アクセスモード:
 VRAMのアドレスを直接指定する。
 8ビット単位でVRAMに読み書きする。


 直接アクセスモードは、VRAMアドレスが変な事以外は、ビットマップモードより理解しやすいと思います。


3)VRAMアドレス(直接アクセスモード)
 アドレシングがヘン&バグのために、すごくわかりにくいです...

 横320ドットの場合、1ドット=4ビットで、1バイトに2ドット収容されます。
 ビット順は、b7-4=HGRB / b3-0=HGRB です。

 VRAMアドレスは、ページ#0が0x0000〜0x7FFF、ページ#1が0x8000〜0xFFFFです(割り当ての変更がない場合)。
 以下、ページ#0についてで、X座標0〜319、Y座標0〜203とします。

○Xが256未満の場合
 X,Y = 0,0 は、0x1A00 の下位4ビット
 X,Y = 1,0 は、0x1A00 の上位4ビット
 X,Y = 2,0 は、0x1A01 の下位4ビット
 X,Y = 3,0 は、0x1A01 の上位4ビット
 X,Y = 0,1 は、0x1A02 の下位4ビット
 X,Y = 1,1 は、0x1A02 の上位4ビット
 X,Y = 2,1 は、0x1A03 の下位4ビット
 X,Y = 3,1 は、0x1A03 の上位4ビット

 X,Y = 4,0 は、0x1A000x1A04 の下位4ビット
 X,Y = 5,0 は、0x1A000x1A04 の上位4ビット
 X,Y = 6,0 は、0x1A010x1A05 の下位4ビット
 X,Y = 7,0 は、0x1A010x1A05 の上位4ビット
 X,Y = 4,1 は、0x1A020x1A06 の下位4ビット
 X,Y = 5,1 は、0x1A020x1A06 の上位4ビット
 X,Y = 6,1 は、0x1A030x1A07 の下位4ビット
 X,Y = 7,1 は、0x1A030x1A07 の上位4ビット
  :
 X,Y = 252,0 は、0x1AFC の下位4ビット
 X,Y = 253,0 は、0x1AFC の上位4ビット
 X,Y = 254,0 は、0x1AFD の下位4ビット
 X,Y = 255,0 は、0x1AFD の上位4ビット
 X,Y = 252,1 は、0x1AFE の下位4ビット
 X,Y = 253,1 は、0x1AFE の上位4ビット
 X,Y = 254,1 は、0x1AFF の下位4ビット
 X,Y = 255,1 は、0x1AFF の上位4ビット


 X,Y = 0,2 は、0x1B00 の下位4ビット
 X,Y = 1,2 は、0x1B00 の上位4ビット
 X,Y = 2,2 は、0x1B01 の下位4ビット
 X,Y = 3,2 は、0x1B01 の上位4ビット
 X,Y = 0,3 は、0x1B02 の下位4ビット
 X,Y = 1,3 は、0x1B02 の上位4ビット
 X,Y = 2,3 は、0x1B03 の下位4ビット
 X,Y = 3,3 は、0x1B03 の上位4ビット
  :
 X,Y = 252,2 は、0x1BFC の下位4ビット
 X,Y = 253,2 は、0x1BFC の上位4ビット
 X,Y = 254,2 は、0x1BFD の下位4ビット
 X,Y = 255,2 は、0x1BFD の上位4ビット
 X,Y = 252,3 は、0x1BFE の下位4ビット
 X,Y = 253,3 は、0x1BFE の上位4ビット
 X,Y = 254,3 は、0x1BFF の下位4ビット
 X,Y = 255,3 は、0x1BFF の上位4ビット

 以下同様で
  :
  :
 X,Y = 252,202 は、0x7FFC の下位4ビット
 X,Y = 253,202 は、0x7FFC の上位4ビット
 X,Y = 254,202 は、0x7FFD の下位4ビット
 X,Y = 255,202 は、0x7FFD の上位4ビット
 X,Y = 252,203 は、0x7FFE の下位4ビット
 X,Y = 253,203 は、0x7FFE の上位4ビット
 X,Y = 254,203 は、0x7FFF の下位4ビット
 X,Y = 255,203 は、0x7FFF の上位4ビット

 つまり、8ドット単位で
 X,Y = x+0,y+0 は、0x1A00 + 0x0100*(y/2) + x の下位4ビット
 X,Y = x+1,y+0 は、0x1A00 + 0x0100*(y/2) + x の上位4ビット
 X,Y = x+2,y+0 は、0x1A01 + 0x0100*(y/2) + x の下位4ビット
 X,Y = x+3,y+0 は、0x1A01 + 0x0100*(y/2) + x の上位4ビット
 X,Y = x+0,y+1 は、0x1A02 + 0x0100*(y/2) + x の下位4ビット
 X,Y = x+1,y+1 は、0x1A02 + 0x0100*(y/2) + x の上位4ビット
 X,Y = x+2,y+1 は、0x1A03 + 0x0100*(y/2) + x の下位4ビット
 X,Y = x+3,y+1 は、0x1A03 + 0x0100*(y/2) + x の上位4ビット
  (x は4の倍数。y は2の倍数)

 となります。


○X座標が256以上の場合
 256未満の場合と同じ8ドット単位ですが...

 X,Y = 256,0 は、0x0000 の下位4ビット
 X,Y = 257,0 は、0x0000 の上位4ビット
 X,Y = 258,0 は、0x0001 の下位4ビット
 X,Y = 259,0 は、0x0001 の上位4ビット
 X,Y = 256,1 は、0x0002 の下位4ビット
 X,Y = 257,1 は、0x0002 の上位4ビット
 X,Y = 258,1 は、0x0003 の下位4ビット
 X,Y = 259,1 は、0x0003 の上位4ビット
  :
 X,Y = 316,0 は、0x003C の下位4ビット
 X,Y = 317,0 は、0x003C の上位4ビット
 X,Y = 318,0 は、0x003D の下位4ビット
 X,Y = 319,0 は、0x003D の上位4ビット
 X,Y = 316,1 は、0x003E の下位4ビット
 X,Y = 317,1 は、0x003E の上位4ビット
 X,Y = 318,1 は、0x003F の下位4ビット
 X,Y = 319,1 は、0x003F の上位4ビット

 X,Y = 256,2 は、0x0100 の下位4ビット
 X,Y = 257,2 は、0x0100 の上位4ビット
 X,Y = 258,2 は、0x0101 の下位4ビット
 X,Y = 259,2 は、0x0101 の上位4ビット
 X,Y = 256,3 は、0x0102 の下位4ビット
 X,Y = 257,3 は、0x0102 の上位4ビット
 X,Y = 258,3 は、0x0103 の下位4ビット
 X,Y = 259,3 は、0x0103 の上位4ビット
  :
 X,Y = 316,2 は、0x013C の下位4ビット
 X,Y = 317,2 は、0x013C の上位4ビット
 X,Y = 318,2 は、0x013D の下位4ビット
 X,Y = 319,2 は、0x013D の上位4ビット
 X,Y = 316,3 は、0x013E の下位4ビット
 X,Y = 317,3 は、0x013E の上位4ビット
 X,Y = 318,3 は、0x013F の下位4ビット
 X,Y = 319,3 は、0x013F の上位4ビット

 X,Y = 256,4 は、0x0040 の下位4ビット
 X,Y = 257,4 は、0x0040 の上位4ビット
 X,Y = 258,4 は、0x0041 の下位4ビット
 X,Y = 259,4 は、0x0041 の上位4ビット
 X,Y = 256,5 は、0x0042 の下位4ビット
 X,Y = 257,5 は、0x0042 の上位4ビット
 X,Y = 258,5 は、0x0043 の下位4ビット
 X,Y = 259,5 は、0x0043 の上位4ビット
  :
 X,Y = 316,4 は、0x007C の下位4ビット
 X,Y = 317,4 は、0x007C の上位4ビット
 X,Y = 318,4 は、0x007D の下位4ビット
 X,Y = 319,4 は、0x007D の上位4ビット
 X,Y = 316,5 は、0x007E の下位4ビット
 X,Y = 317,5 は、0x007E の上位4ビット
 X,Y = 318,5 は、0x007F の下位4ビット
 X,Y = 319,5 は、0x007F の上位4ビット

 とわかりにくくなっています。

 長くなりますが8ビット単位の先頭だけを書き出すと、

 X,Y = 256, 0 は、0x0000 の下位4ビット
 X,Y = 256, 2 は、0x0100 の下位4ビット
 X,Y = 256, 4 は、0x0040 の下位4ビット
 X,Y = 256, 6 は、0x0140 の下位4ビット
 X,Y = 256, 8 は、0x0080 の下位4ビット
 X,Y = 256, 10 は、0x0180 の下位4ビット
 X,Y = 256, 12 は、0x00C0 の下位4ビット
 X,Y = 256, 14 は、0x01C0 の下位4ビット

 X,Y = 256, 16 は、0x0200 の下位4ビット
 X,Y = 256, 18 は、0x0300 の下位4ビット
 X,Y = 256, 20 は、0x0240 の下位4ビット
 X,Y = 256, 22 は、0x0340 の下位4ビット
 X,Y = 256, 24 は、0x0280 の下位4ビット
 X,Y = 256, 26 は、0x0380 の下位4ビット
 X,Y = 256, 28 は、0x02C0 の下位4ビット
 X,Y = 256, 30 は、0x03C0 の下位4ビット

 X,Y = 256, 32 は、0x0400 の下位4ビット
 X,Y = 256, 34 は、0x0500 の下位4ビット
 X,Y = 256, 36 は、0x0440 の下位4ビット
 X,Y = 256, 38 は、0x0540 の下位4ビット
 X,Y = 256, 40 は、0x0480 の下位4ビット
 X,Y = 256, 42 は、0x0580 の下位4ビット
 X,Y = 256, 44 は、0x04C0 の下位4ビット
 X,Y = 256, 46 は、0x05C0 の下位4ビット

 X,Y = 256, 48 は、0x0600 の下位4ビット
 X,Y = 256, 50 は、0x0700 の下位4ビット
 X,Y = 256, 52 は、0x0640 の下位4ビット
 X,Y = 256, 54 は、0x0740 の下位4ビット
 X,Y = 256, 56 は、0x0680 の下位4ビット
 X,Y = 256, 58 は、0x0780 の下位4ビット
 X,Y = 256, 60 は、0x06C0 の下位4ビット
 X,Y = 256, 62 は、0x07C0 の下位4ビット

 X,Y = 256, 64 は、0x0800 の下位4ビット
 X,Y = 256, 66 は、0x0900 の下位4ビット
 X,Y = 256, 68 は、0x0840 の下位4ビット
 X,Y = 256, 70 は、0x0940 の下位4ビット
 X,Y = 256, 72 は、0x0880 の下位4ビット
 X,Y = 256, 74 は、0x0980 の下位4ビット
 X,Y = 256, 76 は、0x08C0 の下位4ビット
 X,Y = 256, 78 は、0x09C0 の下位4ビット

 X,Y = 256, 80 は、0x0A00 の下位4ビット
 X,Y = 256, 82 は、0x0B00 の下位4ビット
 X,Y = 256, 84 は、0x0A40 の下位4ビット
 X,Y = 256, 86 は、0x0B40 の下位4ビット
 X,Y = 256, 88 は、0x0A80 の下位4ビット
 X,Y = 256, 90 は、0x0B80 の下位4ビット
 X,Y = 256, 92 は、0x0AC0 の下位4ビット
 X,Y = 256, 94 は、0x0BC0 の下位4ビット

 X,Y = 256, 96 は、0x0C00 の下位4ビット
 X,Y = 256, 98 は、0x0D00 の下位4ビット
 X,Y = 256,100 は、0x0C40 の下位4ビット
 X,Y = 256,102 は、0x0D40 の下位4ビット
 X,Y = 256,104 は、0x0C80 の下位4ビット
 X,Y = 256,106 は、0x0D80 の下位4ビット
 X,Y = 256,108 は、0x0CC0 の下位4ビット
 X,Y = 256,110 は、0x0DC0 の下位4ビット

 X,Y = 256,112 は、0x0E00 の下位4ビット
 X,Y = 256,114 は、0x0F00 の下位4ビット
 X,Y = 256,116 は、0x0E40 の下位4ビット
 X,Y = 256,118 は、0x0F40 の下位4ビット
 X,Y = 256,120 は、0x0E80 の下位4ビット
 X,Y = 256,122 は、0x0F80 の下位4ビット
 X,Y = 256,124 は、0x0EC0 の下位4ビット
 X,Y = 256,126 は、0x0FC0 の下位4ビット

 X,Y = 256,128 は、0x1000 の下位4ビット
 X,Y = 256,130 は、0x1100 の下位4ビット
 X,Y = 256,132 は、0x1040 の下位4ビット
 X,Y = 256,133 は、0x1140 の下位4ビット
 X,Y = 256,136 は、0x1080 の下位4ビット
 X,Y = 256,138 は、0x1180 の下位4ビット
 X,Y = 256,140 は、0x10C0 の下位4ビット
 X,Y = 256,142 は、0x11C0 の下位4ビット

 X,Y = 256,144 は、0x1200 の下位4ビット
 X,Y = 256,146 は、0x1300 の下位4ビット
 X,Y = 256,148 は、0x1240 の下位4ビット
 X,Y = 256,150 は、0x1340 の下位4ビット
 X,Y = 256,152 は、0x1280 の下位4ビット
 X,Y = 256,154 は、0x1380 の下位4ビット
 X,Y = 256,156 は、0x12C0 の下位4ビット
 X,Y = 256,158 は、0x13C0 の下位4ビット

 X,Y = 256,160 は、0x1400 の下位4ビット
 X,Y = 256,162 は、0x1500 の下位4ビット
 X,Y = 256,164 は、0x1440 の下位4ビット
 X,Y = 256,166 は、0x1540 の下位4ビット
 X,Y = 256,168 は、0x1480 の下位4ビット
 X,Y = 256,170 は、0x1580 の下位4ビット
 X,Y = 256,172 は、0x14C0 の下位4ビット
 X,Y = 256,174 は、0x15C0 の下位4ビット

 X,Y = 256,176 は、0x1600 の下位4ビット
 X,Y = 256,178 は、0x1700 の下位4ビット
 X,Y = 256,180 は、0x1640 の下位4ビット
 X,Y = 256,182 は、0x1740 の下位4ビット
 X,Y = 256,184 は、0x1680 の下位4ビット
 X,Y = 256,186 は、0x1780 の下位4ビット
 X,Y = 256,188 は、0x16C0 の下位4ビット
 X,Y = 256,190 は、0x17C0 の下位4ビット

 X,Y = 256,192 は、0x1800 の下位4ビット
 X,Y = 256,194 は、0x1900 の下位4ビット
 X,Y = 256,196 は、0x1840 の下位4ビット
 X,Y = 256,198 は、0x1940 の下位4ビット
 X,Y = 256,200 は、0x1880 の下位4ビット
 X,Y = 256,202 は、0x1980 の下位4ビット

 0x18C0〜0x18FF、0x19C0〜0x19FFは未使用です。


 ややこしくなりますが、8ドット単位で
 X,Y = x+0,y+0 は、0x0000 + 0x0040*(y/2) + x の下位4ビット
 X,Y = x+1,y+0 は、0x0000 + 0x0040*(y/2) + x の上位4ビット
 X,Y = x+2,y+0 は、0x0001 + 0x0040*(y/2) + x の下位4ビット
 X,Y = x+3,y+0 は、0x0001 + 0x0040*(y/2) + x の上位4ビット
 X,Y = x+0,y+1 は、0x0002 + 0x0040*(y/2) + x の下位4ビット
 X,Y = x+1,y+1 は、0x0002 + 0x0040*(y/2) + x の上位4ビット
 X,Y = x+2,y+1 は、0x0003 + 0x0040*(y/2) + x の下位4ビット
 X,Y = x+3,y+1 は、0x0003 + 0x0040*(y/2) + x の上位4ビット
  (x は4の倍数。y は2の倍数)

 ここで、y と Y の関係が以下のようになります(括弧内は、ビット番号)。

 Y(0)=y(0) (=0)
 Y(1)=y(2) Y(1)=y(3)
 Y(2)=y(3) Y(2)=y(1)
 Y(3)=y(1) Y(3)=y(2)
 Y(4)=y(4)
 Y(5)=y(5)
 Y(6)=y(6)
 Y(7)=y(7)


 本来だと、0x0000、0x0040、0x0080、…、となるはずの所が、ビットが入れ替わっているんですね。
 多分バグだと思いますが...

 これのせいで、直接アクセスモードでのプログラムが煩雑になってしまいます。


posted by えすび at 21:00| Comment(0) | P6解析:画面周り | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。