[P6MK2VGA] リファレンス

# はじめに

* [公式サイト](http://tulip-house.ddo.jp/digital/P6MK2VGA/)
* 勝手にまとめています。
* 一部の用語は独自のものを使用しています。
* コードの動作確認（どころかアセンブルすら）していません。
* 手元に実物が無いのでほとんど妄想です。
* エミュレータ対応よろしくお願いします。
* 編集リクエストお待ちしております。

# I/O

|address|name|
|:-:|:-:|
|$91|DATA|
|$93|STROBE|
|$C0|STATUS|

## DATA ($91)

送信したい`Command`または`Data`を書き込む。

## STROBE ($93)

|data|description|
|:-:|:--|
|$01|Command送信|
|$00|Data送信|

## STATUS ($C0)

|bit|description|
|:-:|:--|
|7-2| (reserved)|
|1|VBlank (0:垂直帰線期間)|
|0|(reserved)|


## 基本的なコマンド送信手順

```Z80
ld      a,Command
out     ($91),a
ld      a,1
out     ($93),a     ;send Command
ld      a,Data
out     ($91),a
ld      a,0
out     ($93),a     ;send Data
```

# 用語集

|用語|説明|
|:--|:--|
|スプライト番号|0~255(\$00~$FF)で指定。同時に256枚の表示が可能。表示優先は0が一番高く、255が一番低い。水平方向に20枚までしか表示出来ない。20枚を超えるとスプライト番号の小さいものから消えていく。|
|属性|スプライトの各種設定。アトリビュート、座標、キャラクタ番号、リンク。|
|アトリビュート|スプライトの表示/非表示、反転、回転などの設定を行う。|
|X座標| 0~511(\$000~$1FF)で指定。表示領域は16〜335（初代機モードでは16~271）。|
|Y座標| 0~255(\$00~$FF)で指定。表示領域は16〜215（初代機モードでは16~207)。|
|リンク|スレーブに設定したスプライトは、指定したマスターからのオフセット座標に表示される。座標更新が不要になるのでPC側の処理が軽くなる（と思われる）。デカキャラなどに使用すると良い。|
|キャラクタ番号|0〜191(\$00~$BF)で指定。16x16で192パターンの定義が可能。スプライトに表示させるキャラクタの番号。|
|画面優先順位|16bit。bit0~15がPC側の色番号0~15に対応。bitが立っている色番号のPC側のドットはスプライトよりも優先が高くなる。|
|スクロール値|0~319(\$000~$13F)で指定。PC側の画面をスクロールさせることが出来る。数値を増やすと左方向にスクロールする。|
|画面切り取り|横スクロール時に画面端の書き換えが見えないようにするために使用する。|

# Command

## スプライト関連コマンド

### $10 属性の設定を行うスプライト番号の指定

|Command|Data|
|:-:|:-:|
|$10|スプライト番号 (\$00~$FF)|

* これでスプライト番号を指定した後、属性（アトリビュート、座標、キャラクタ番号、リンク）の変更を行う。

### $20 アトリビュートの設定

|Command|Data|
|:-:|:-:|
|$20|アトリビュート|

#### アトリビュート

|bit|name|description|
|:-:|:--|:--|
|7-6|QUAD|00:左上, 01:右上, 10:左下, 11:右下|
|5|SIZE|0:16x16, 1:8x8|
|4|LINK|0:マスター, 1:スレーブ|
|3|ROTATE|0:回転なし, 1:左90°回転|
|2|VFLIP|1:上下反転|
|1|HFLIP|1:左右反転|
|0|VISIBLE|0:非表示, 1:表示|

* 回転→反転の順に処理される。
* SIZE=1(8x8)の場合、QUADで指定した位置のキャラクタが指定した座標の位置に表示される。
 * SIZE=0(16x16)のときのQUADの影響については未検証。
 
### $21 X座標の設定（下位1bit)

|Command|Data|
|:-:|:-:|
|$21|X座標の下位1bit (\$00~$01)|

* 範囲外の値に関しては未検証。

### $22 X座標の設定(上位8bit)

|Command|Data|
|:-:|:-:|
|$22|X座標の上位8bit (\$00~$FF)|

### $23 Y座標の設定

|Command|Data|
|:-:|:-:|
|$23|Y座標 (\$00~$FF)|

### $24 キャラクタ番号の設定

|Command|Data|
|:-:|:-:|
|$24|キャラクタ番号 (\$00~$BF)|

* 範囲外の値に関しては未検証。

### $25 リンクの設定

|Command|Data|
|:-:|:-:|
|$25|マスターのスプライト番号 (\$00~$FF)|

* スレーブのスプライトを指定してはいけない。
 * どうなるのかは未検証。
* 座標指定は、マスターからのオフセットになる。
 * 基準座標や、回転/反転による影響などは未検証。（おそらく影響は無いと思われる）

### $30 キャラクタデータの設定

|Command|Data|Data2|
|:-:|:-:|:-:|
|$30|キャラクタ番号 (\$00~$BF)|キャラクタデータ (128バイト)

* Command/Data送信後にキャラクタデータを送信する。

```Z80
    ld      a,$30       ;コマンド
    out     ($91),a
    ld      a,1
    out     ($93),a
    ld      a,$00       ;キャラクタ番号
    out     ($91),a
    xor     a
    out     ($93),a

    ld      hl,data     ;キャラクタデータ
    ld      b,64        ;2バイト×64回
loop:
    ;+0
    ld      a,(hl)
    out     ($91),a
    ld      a,1
    out     ($93),a
    inc     hl
    ;+1
    ld      a,(hl)
    inc     hl
    out     ($91),a
    xor     a
    out     ($93),a
    inc     hl

    djnz    loop
```

## スクロール関連コマンド

### $40 スクロール値の設定(下位1bit)

|Command|Data|
|:-:|:-:|
|$40|スクロール値の下位1bit (\$00~$01)|

* 初代機の画面モードでは使用しない。
* 範囲外の値に関しては未検証。

### $41 スクロール値の設定(上位8bit)

|Command|Data|
|:-:|:-:|
|$41|スクロール値の上位8bit (\$00~$FF)|

* 初代機の画面モードではこの値(上位8bit)のみ使用する。
 * スクロール値は0~255(\$00~$FF)ということ。
* 範囲外の値に関しては未検証。

## 画面サイズ切り替えコマンド

### $50 mkIIモード（デフォルト）

|Command|Data|
|:-:|:-:|
|$50|-|

* Dataは無いがSTROBEへの書き込みは必要。

```Z80
ld      a,$50
out     ($91),a
ld      a,1
out     ($93),a
xor     a
out     ($93),a
```

### $51 初代機モード

|Command|Data|
|:-:|:-:|
|$51|-|

* Dataは無いがSTROBEへの書き込みは必要。

## 画面優先順位設定コマンド

### $60 画面優先順位の設定(下位8bit)

|Command|Data|
|:-:|:-:|
|$60|画面優先順位の下位8bit (\$00~$FF)|

### $61 画面優先順位の設定(上位8bit)

|Command|Data|
|:-:|:-:|
|$61|画面優先順位の上位8bit (\$00~$FF)|

## PC-6001mkII画面表示禁止コマンド

### $70 画面表示許可

|Command|Data|
|:-:|:-:|
|$70|-|

* Dataは無いがSTROBEへの書き込みは必要。

### $71 画面表示禁止

|Command|Data|
|:-:|:-:|
|$71|-|

* Dataは無いがSTROBEへの書き込みは必要。

## 画面左右切り取りコマンド

### $80 画面切り取り設定（左端）

|Command|Data|
|:-:|:-:|
|$80|切り取るドット数 (\$00~$1F)|

* 範囲外の値に関しては未検証。

### $81 画面切り取り設定（右端）

|Command|Data|
|:-:|:-:|
|$81|切り取るドット数 (\$00~$1F)|

* 範囲外の値に関しては未検証。