PC-9821 グラフィック機能(PEGC)


メモリマップ

まず最初に256色モード時のグラフィック制御に関連するメモリマップを簡単に書いておきます。VRAMの位置は16色モードの位置を使用するのですが、VRAMサイズが大きいためメインメモリに展開しきれないためにVRAMの一部だけを見せるようなウインドウ方式をとっています。

:
FFFFFH
:
:

E7FFFH
:
E0000H
PEGC
メモリマップトI/O
:
:

B7FFFH
:
B0000H
パックトピクセルモード
VRAMウインドウ2
プレーンモード
プレーンアクセス領域
AF000H
:
A8000H
VRAMウインドウ1
:
:
00000H




メモリマップトI/O
以前書いた資料をもとに書いているのですが書きながら意味不明なところがあったりします。現状はそのままにしていますが確認次第補足したいと思います。
EGCを知っている場合EGCと対比しながらのほうがわかりやすいと思います。説明が下手なもので...(^^)ゞ
それと、あくまで設定をいろいろ変えて現象から推定した機能であるため間違いがあるかもしれませんが、あらかじめご了承ください。
参考までに調べていたのは初代の無印9821です。この機種ではVRAMへの32ビットアクセスが可能でしたが、後継の機種では16ビットアクセスしか許されていないという話も聞くので、パターンデータ関連でダブルワードのことを書いてありますが、この辺は対応していない機種もあるかもしれません。
無印9821では一応動作確認しています。

記号の意味
○...機能あり
×...機能なし
?...機能なしもしくは不明(ライトデータのリードは可能だがが機能がわからない)


メモリ
ビット
説明
15
14131211109876543210
E0004H
パックトピクセルモード時A8000H〜AFFFFHに呼び出すVRAMバンク領域
(実際に取りうる範囲は0000H〜000FH)
E0006H
パックトピクセルモード時B0000H〜B7FFFHに呼び出すVRAMバンク領域
(実際に取りうる範囲は0000H〜000FH)
E0100H
×
×
×
×
×
×
×
0 : パックトピクセルモード
1 : プレーンモード
E0102H
×
×
×
×
×
×
未確認
E0104H
プレーンごとのアクセスプレーン(AP)の有効/無効設定(論理演算処理を行うプレーンの指定)
0 : 有効
1 : 無効
E0108H

ラスタオペレーション(ROP)時に使用するE0120H以降のパターンデータの形態を指定する
0 : プレーンごとに分割した2(4)バイトデータ×8プレーン
1 : ドットごとに分割した1バイトデータ×16(32)ドット
※よく覚えてませんが括弧のなかと外の違いはアドレスへのアクセスによって違ったような...ワードアクセスとダブルワードアクセスってことで、バイトアクセスは無効だったのかな?


不明


1 : VRAMを読み込んだ位置のデータをパターンデータの領域(E0120H〜)にビット15で指定した形式で展開する。ビット8が0である必要がある
0 : 上記機能の無効


VRAMへのライト時の表示方式の設定
0 : CPUデータのビットが
0のとき AP and D
1のとき (not AP) or D
※ AP ... アクセスプレーン(E0104H)
D ... ディスティネーションデータ(VRAM上のデータ)

1: ビット11〜0を用いて表示方式を設定する。
ビット11〜0の説明はビット12が1のときのもので、0のときは無効


ラスタオペレーション(ROP)の方法を指定する。
ROPにはビット7〜0を使用し、表示結果には各ROPデータの論理和が出力される。
00 : CPUデータ、ディスティネーションデータ、パターンデータを使用する。
01 : CPUデータ、ディスティネーションデータ、カラーコード2(E0118H)を使用する。
10 : CPUデータ、ディスティネーションデータ、カラーコード1(E0114H)を使用する。
11 : CPUデータ、ディスティネーションデータ、カラーコード1および2を使用する。


E0112H,E0113Hのビットシフトの方向を決定する
0 : 右方向へのシフト
1 : 左方向へのシフト


CPUデータの内容
0 : 直前に読み込んだVRAMデータ
1 : レジスタの内容

ROPデータ。ビット11,10で指定されたデータを使用してROPを行う。
bit7:S and D and P
bit6: S and D and (not P)
bit5: S and (not D) and P
bit4: S and (not D) and (not P)
bit3: (not S) and D and P
bit2: (not S) and D and (not P)
bit1: (not S) and (not D) and P
bit0: (not S) and (not D) and (not P)

S...CPUデータ
D...ディスティネーションデータ(書きこみ先のVRAMデータ)
P...ビット11,10が00のときパターンデータ、01のときカラーコード2、10のときカラーコード1

ただしビット11,10が11のときは下記のようになる。
bit7:S and D and C1
bit6: S and D and (not C1)
bit5: S and (not D) and C1
bit4: S and (not D) and (not C1)
bit3: (not S) and D and C2
bit2: (not S) and D and (not C2)
bit1: (not S) and (not D) and C2
bit0: (not S) and (not D) and (not C2)

C1...カラーコード1
C2...カラーコード2
E010AH
×
×
×
×
×
×
×
1 : A8000H以降のVRAM領域にE0114Hで指定したパレットナンバーとディスティネーションデータのプレーンごとの論理積を書き出す。その際E0104Hのアクセスプレーンの制約を受ける。
E0108Hのビットが0である必要がある。
AP and D and C1
E010CH マスクレジスタ
ビット15〜0または31〜0の範囲で指定
0 : マスクする
1 : マスクしない
E010EH
E0110H×××× ブロック転送ビット長
(0〜4095) + 1ビット(ドット)
(特別なことをしない限り639を設定するのが無難)
E0112H
×
×
×
読み出し時のビットシフト長。ビット4は32ビットアクセスのみ有効
VRAMデータを読み込む際、右(左)シフトしたところから読み出す。ただし、E0112Hの値がE0113Hより大きいときは一番最初の読み出しだけではデータが不足するため(シフトして空いた下位(上位)のビットは次の読み込みの際にシフトによってあふれたデータが入るようになっている)そのまま書き込んでも表示が無視されるため、書き込む前にもう一度読み込みを行う必要がある
E0113H
×
×
×
書きこみ時のビットシフト長。ビット4は32ビットアクセスのみ有効
VRAMデータを書き込む際、右(左)にシフトして書き込む。シフトによって空いたスペースには直前に書き込んだデータの、シフトによってあふれた部分が書かれる。
E0114H
カラーコード1
ROPで使用する
E0118H
カラーコード2
ROPで使用する
E0120H
ROPのパターンデータ
上位16ビット(△)はダブルワードアクセス時のみ有効
E0122H
E0124H
E0126H
E0128H
E012AH
E012CH
E012EH
E0130H
E0132H
E0134H
E0136H
E0138H
E013AH
E013CH
E013EH



I/Oポート

256制御に関連するI/Oポートも紹介しておきます。ほかにもあったような気がするのですが、手元に資料が残ってないのでわかるものだけです。
(確かテキストとグラフィックを合成するときにテキストをずらして表示させるポートがあったと思うのですが...)

ポート説明
6AH ライトモードレジスタ(それ以外の機能については省略)
68H : 2画面モード
69H : 1画面モード
A4H 表示画面選択(0,1)
2画面モード時のみ有効
A6H 描画画面選択(0,1)
2画面モード時のみ有効
A8Hパレット番号(00H〜FFH)
AAH緑成分(00H〜FFH)
ACH赤成分(00H〜FFH)
AEH青成分(00H〜FFH)



パックトピクセルモード時の表示範囲とVRAMバンク領域の関係
パックトピクセルモード時のVRAMアクセスはVRAM領域を32kバイトごとに区切り、その単位でウインドウ領域に表示して行います。
そこでバンク範囲とドットの関係をわかりやすく表にしておきます。

バンク範囲
0(0,0)-(127,51)
1(128,51)-(255,102)
2(256,102)-(383,153)
3(384,153)-(511,204)
4(512,204)-(639,255)
5(0,256)-(127,307)
6(127,307)-(255,358)
7(256,358)-(383,409)
8(384,409)-(511,460)
9(512,460)-(639,511)