2018年06月11日

SR画面周り(2)

  P6月間企画(その11)

  SRモードでの画面周りについて、記載します。

  SRモードですので、ポート0xC8のbit0=0の時のみの記述になります。
  非SRモード(ポート0xC8のbit0=1)や、初代/mk2/66の画面周りに関しては、また別の機会に。

 注)SRモードの画面周りのI/Oポートは、SR-BASICを使う際にはBASIC側で管理されています。具体的には、VSYNC割り込みで、ワークエリアに設定した値でI/Oポートの内容を設定され直されます。
  そのため、直接I/Oポートを叩いて画面モードの変更などをする場合は、割り込み禁止にするか、ワークエリアの方に値を設定するなどが必要になります。
  テスト的に試すのであれば、割り込み禁止→設定変更→無限ループ、などの方法を採るのがいいかと思います。


  SRモードの画面種類は、大きく3つに分かれます。BASICのSCREENコマンドの第一パラメータと同じです。

 ・キャラクタモード
 ・横320ドットのグラフィックモード
 ・横640ドットのグラフィックモード

  それぞれのモードを個別に記載していきます。



○キャラクタモード
 ポート0xC1のbit2を1にするとキャラクタモードになります。
 画面は、横80列x縦25行、80x20、40x25、40x20 が設定できます。

 ポート0xC1:bit1:横文字数(0:80文字/1:40文字)
 ポート0xC8:bit2:縦行数設定(0:25行/1:20行)

 ポート0xC1、0xC8は、他のデータも設定するので、誤って設定しないように注意が必要です。

 どのページを表示させるかは、ポート0xC9で設定します。
 例えば、0xf000〜を表示させる場合は、0x0fを設定します。

 また、ポート0xC1、0xC8で画面制御を変更した場合は、関係がなくてもポート0xC9〜0xCCを設定する必要があります(関係のないポートは、0x00で構わない)。
 設定しない場合、正常動作しない場合があります。


 キャラクタ画面に文字を表示するには、VRAMにデータを書き込むだけです。
 1文字で2バイト使用します。1バイト目がキャラクタデータ、2バイト目がアトリビュートデータです。

 例えば、ポート0xC9に0x0Fを設定している場合、0xF000〜が表示されるVRAMになります。
 横方向0〜39/0〜79桁、縦方向0〜19/0〜24行とすると、

40x20
 F000/F001 F002/F003 ... F04C/F04D F04E/F04F
 F050/F051 F052/F053 ... F09C/F09D F09E/F09F
  :                  :
  :                  :
 F5A0/F5A1 F5A2/F5A3 ... F5EC/F5ED F5EE/F5EF
 F5F0/F5F1 F5F2/F5F3 ... F63C/F63D F63E/F63F

40x25
 F000/F001 F002/F003 ... F04C/F04D F04E/F04F
 F050/F051 F052/F053 ... F09C/F09D F09E/F09F
  :                  :
  :                  :
 F730/F731 F732/F733 ... F77C/F77D F77E/F77F
 F780/F781 F782/F783 ... F7CC/F7CD F7CE/F7CF

80x20
 F000/F001 F002/F003 ... F09C/F09D F09E/F09F
 F0A0/F0A1 F0A2/F0A3 ... F13C/F13D F13E/F13F
  :                  :
  :                  :
 FB40/FB41 FB42/FB43 ... FBDC/FBDD FBDE/FBDF
 FBE0/FBE1 FBE2/FBE3 ... FC7C/FC7D FC7E/FC7F

80x25
 F000/F001 F002/F003 ... F09C/F09D F09E/F09F
 F0A0/F0A1 F0A2/F0A3 ... F13C/F13D F13E/F13F
  :                  :
  :                  :
 FE60/FE61 FE62/FE63 ... FEFC/FEFD FEFE/FEFF
 FF00/FF01 FF02/FF03 ... FF9C/FF9D FF9E/FF9F

 となります。


 データ1バイト目は、キャラクタコード(いわゆるアスキーコード)、2バイト目がアトリビュートです。

 アトリビュートは、

 bit7 :グラフィックフラグ(0:ノーマル、1:セミグラフィック)
 bit6-4:背景色BGR
 bit3-0:文字色HBGR

 背景色のHは、ポート0xC0のbit1(CSS2)で与えられます。
 ポート0xC0の他のビット(CSS1、CSS3)は、キャラクタモードでは無効です。


○注意点:
1)セミグラフィックは、縦行数によって違います。
  40x20、80x20の場合、別のキャラセット(mk2/66で使用されている人間とかがあるキャラセット)が選ばれます。
  40x25の場合、80x100のセミグラフィックになります。
  80x25の場合、160x100のセミグラフィックになります(PC-8001相当)。

  セミグラフィックと言っても、単にそういうキャラセットを読み出すだけですが...

  PC-8001相当の160x100のセミグラフィックですが、ビットアサインが違います。

P6SR:
  b7 b6
  b5 b4
  b3 b2
  b1 b0

80:
  b0 b4
  b1 b5
  b2 b6
  b3 b7

  また、ハードウエアのバグがあります
  セミグラフィック使用時(40x25/80x25表示で、グラフィックフラグ=1時)に、画面右の方のキャラクタが、なぜかずれて表示されます。
  同じ場所でグラフィックフラグ=0 にしても、通常キャラクタはずれないのが不思議...


2)背景色、文字色の並びがグラフィックと違います。
  キャラクタモード :HBGR
  グラフィックモード:HGRB

  理由は不明...バグかな?

  ちなみに、H はハーフトーン、の意味だったと思います。


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

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

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


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