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 はハーフトーン、の意味だったと思います。
2018年06月11日
この記事へのコメント
コメントを書く

