PC-9821 PEGC

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

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

: FFFFFH : : |
E7FFFH : E0000H | PEGC メモリマップトI/O
: : |
B7FFFH : B0000H | パックトピクセルモード VRAMウインドウ２ | プレーンモード プレーンアクセス領域
AF000H : A8000H | VRAMウインドウ１
: : ０００００H |

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

メモリ | ビット | 説明
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
E0004H | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | パックトピクセルモード時A8000H～AFFFFHに呼び出すVRAMバンク領域 (実際に取りうる範囲は００００H～０００FH)
E0006H | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | パックトピクセルモード時B0000H～B7FFFHに呼び出すVRAMバンク領域 (実際に取りうる範囲は００００H～０００FH)
E0100H |  | × | × | × | × | × | × | × | ○ | 0 : パックトピクセルモード １ : プレーンモード
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)