2024/4/18
- PC-8001でユーザー定義キャラクタ(PCG)を使用可能にするハードウェア
- 従来品より2倍以上速いデータ登録速度
- 画面分割により256種類を超えるPCG表示が可能
- PCGとROMキャラクタの同時表示が可能
| I/O | アドレス | 用途 |
|---|---|---|
| OUT | $00 | ラインデータ #0 |
| OUT | $01 | ラインデータ #1 |
| OUT | $02 | ラインデータ #2 |
| OUT | $03 | ラインデータ #3 |
| OUT | $04 | ラインデータ #4 |
| OUT | $05 | ラインデータ #5 |
| OUT | $06 | ラインデータ #6 |
| OUT | $07 | ラインデータ #7 |
| OUT | $08 | コントロール |
- 8x8ドットのキャラクタを垂直方向に8分割し、上からライン#0とする
- ラインデータは1バイトで、MSBが左端のドットに対応する
- PCGはビット反転して出力されるため、データはあらかじめ反転したものを作成すること
| BIT | 用途 |
|---|---|
| 0,1 | 書き込みバンク# (bit0=LSB) |
| 2 | PCGスイッチ (1=on) |
| 3 | モードスイッチ (1=ブロックモード) |
| 4~7 | 予約 |
2種類の表示モードが存在し、登録可能なPCGの最大数と使用可能エリアに違いがある
| モード | PCGの最大数 | 使用可能エリア |
|---|---|---|
| ノーマル | 256 | 制限なし |
| ブロック | 1024 | 制限あり (7.ブロックモードを参照) |
CG-RAMは2KBバイトずつ4つのバンクに分割されている
| アドレス | バンク | 用途 |
|---|---|---|
| $0000~$07FF | 0 | ノーマルモード、ブロックモード共用データエリア |
| $0800~$0FFF | 1 | ブロックモード専用データエリア |
| $1000~$17FF | 2 | ブロックモード専用データエリア |
| $1800~$1FFF | 3 | ブロックモード専用データエリア |
CG-RAMにPCGのデータを登録する手順は下記の通り
- コントロールポートで書き込みバンク#をセットする
- 垂直帰線消去期間を待機
- Bレジスタにキャラクタコードをセットする
- Cレジスタにライン番号をセットする
- Aレジスタにラインデータをセットする
- OUT(C),A を実行する
4から6を8回くりかえすことで登録が完了する
- 予期しないデータが書き込まれるのを防ぐため、データ登録は必ず垂直帰線消去期間内に行うこと
- 1キャラクタのデータ登録が完了するまでBレジスタの値を変化させないこと
- Bレジスタを使用するため、BASICのOUT命令では登録できない
PCGを表示する手順は下記の通り
- 表示したい領域のVRAMアトリビュートをリバースにする
- コントロールポートのPCGスイッチ(bit2)をonにする
VRAMのアトリビュート情報でキャラクタ表示を切り替えるため、画面内でPCGとROMキャラクタの併用が可能である
| アトリビュート | 表示 |
|---|---|
| ノーマル | ROMキャラクタ |
| リバース | PCG |
画面を行で4分割し、それぞれにCG-RAMのバンクを割り当てることで256種類を超えるPCGの表示を可能にする
| 行番号 | バンク |
|---|---|
| 0~7 | 0 |
| 8~15 | 1 |
| 16~23 | 2 |
| 24 | 3 |
ブロックモードではCRTCからのVSP信号をカウントして行番号を識別している。 25行モードでは1行あたり8回VSP信号が送られるので、8行(VSP信号64回)ごとにCG-RAMのバンクを1つ進めている。 一方で20行モードでは1行あたり10回VSP信号が送られるためカウントにズレが生じ、表示が崩れてしまう。 このためブロックモードは25行モードで使用しなければならない。
| VSPカウンタ値 | 行番号(25行モード) |
|---|---|
| 0~63 | 0~7 |
| 64~127 | 8~15 |
| 128~191 | 16~23 |
| 192~199 | 24 |