PC-6001シリーズ技術情報いろいろ

参考文献から抜き出した情報をいろいろ書き留めてみました。SRについての記述はほぼありません。

目次


モード・ページ

mkII以降では起動時にモード選択画面が表示されます。これは初代PC-6001との互換性を保つためのもので、モード1〜4は初代PC-6001における、拡張RAMカートリッジと拡張BASICカートリッジの有無の組み合わせに対応しています。モード5はmkIIで新しく増えたもの、モード6はSRで更に増えたもので、画面の解像度などが異なります。

PC-6001シリーズでは複数の画面を持つことができ、ページ数を増やせば使用できる画面数が増えますが、かわりに使用できるメモリが減ります。(メモリマップ)

モード1〜4と初代機動作の対応
モード 拡張RAM 拡張BASIC
1 なし (RAM16KB) なし
2 あり (RAM32KB) なし
3 なし (RAM16KB) あり
4 あり (RAM32KB) あり

メモリマップ

BASICの各モードにおけるメモリマップです。

初代機・拡張RAMなし (16KB)

初代機・拡張RAMなし (16KB) のメモリマップ
アドレス ページ数=1 ページ数=2
0000h-3FFFh BASIC ROM
4000h-7FFFh 拡張ROM
8000h-BFFFh (不定値)
C000h-C3FFh 画面1
C400h-D9FFh ユーザエリア ユーザエリア
E000h-F9FFh 画面2
FA00h-FFFFh BASICワークエリア

拡張BASIC(モード3)では、BASICワークエリア開始がFA00h-47-ドライブ数×79-(ファイル数+1)×267になります。

初代機・拡張RAMあり (32KB)

初代機・拡張RAMあり (32KB) のメモリマップ
アドレス ページ数=1 ページ数=2 ページ数=3 ページ数=4
0000h-3FFFh BASIC ROM
4000h-7FFFh 拡張ROM
8000h-83FFh 画面1
8400h-9FFFh ユーザエリア ユーザエリア ユーザエリア ユーザエリア
A000h-BFFFh 画面4
C000h-DFFFh 画面3
E000h-F9FFh 画面2
FA00h-FFFFh BASICワークエリア

拡張BASIC(モード4)では、BASICワークエリア開始がFA00h-47-ドライブ数×79-(ファイル数+1)×267になります。

モード5

BASICのプログラムはユーザエリアBに置かれます。

モード5のメモリマップ
アドレス ページ数=1 ページ数=2 ページ数=3 ページ数=4
0000h-07FFh 画面1 画面2 画面3 画面4
0800h-3FFFh ユーザエリアA
4000h-47FFh 画面1 画面2 画面3
4800h-7FFFh ユーザエリアA
8000h-87FFh ユーザエリアB ユーザエリアB 画面1 画面2
8800h-BFFFh ユーザエリアB
C000h-C7FFh 画面1
C800h-※ ユーザエリアB
※-FFFFh BASICワークエリア

※=FA00h-47-ドライブ数×79-(ファイル数+1)×267


BASICプログラムの構造

BASICプログラムは以下の行構造の繰り返しです。行番号は直接入力できるのは0〜65529の範囲で、65530以上だと入力はできずLIST命令でも表示されませんが実行はされます。行の中身については、中間言語表にあるもの以外はキャラクタコードのまま格納されます。ただし、キャラクタコードが20h未満の文字については、14hとキャラクタコードに30hを足したものの2バイトの組を用います。最後の行の後ろに00hが3バイト連続するとプログラム終了となります。

BASICプログラムの構造
サイズ 内容
1 00h
2 リンクポインタ (=次行のリンクポインタのアドレス)
2 行番号
任意 行の中身
中間言語表
00h 01h 02h 03h 04h 05h 06h 07h 08h 09h 0Ah 0Bh 0Ch 0Dh 0Eh 0Fh
80h END FOR NEXT DATA INPUT DIM READ LET GOTO RUN IF RESTORE GOSUB RETURN REM STOP
90h OUT ON LPRINT DEF POKE PRINT CONT LIST LLIST CLEAR COLOR PSET PRESET LINE PAINT SCREEN
A0h CLS LOCATE CONSOLE CLOAD CSAVE EXEC SOUND PLAY KEY LCOPY NEW RENUM CIRCLE GET PUT BLOAD
B0h BSAVE FILES LFILES LOAD MERGE NAME SAVE FIELD LSET RSET OPEN CLOSE DSKO$ KILL TALK MON
C0h KANJI DELETE TAB( TO FN SPC( INKEY$ THEN NOT STEP + - * / ^ AND
D0h OR > = < SGN INT ABS USR FRE INP LPOS POS SQR RND LOG EXP
E0h COS SIN TAN PEEK LEN HEX$ STR$ VAL ASC CHR$ LEFT$ RIGHT$ MID$ POINT CSRLIN STICK
F0h STRIG TIME PAD DSKI$ LOF LOC EOF DSKF CVS MKS$

外部記憶フォーマット

CSAVEによるテープへのセーブ

CSAVEによるテープへのセーブ
サイズ 内容
- 長いピー音 (2400Hz)
10 D3hの連続
6 ファイル名 (6文字未満の場合は00h埋め)
- やや短いピー音 (2400Hz)
任意 プログラム (ユーザエリア・ユーザエリアBの先頭+1から最後まで)
10以上 00hの連続
- ごく短いピー音 (2400Hz)

プログラム部分は、例えば16KBモードならばアドレスC401hからのデータが出力されます (C400hは常に00h)。末尾の00hは、CSAVEでは通常12個 (空のプログラムの場合は13個) 出力されますが、CLOADでは10個連続した時点でプログラム終了とみなしてロードを終了するようになっています。


PRINT#-1によるテープへのセーブ

PRINT#-1によるテープへのセーブ
サイズ 内容
- 長いピー音 (2400Hz)
6 9Chの連続
任意 データ
- ごく短いピー音 (2400Hz)

データは通常のPRINT文の書式に順じますが、コンマで値を区切った時の処理が初代機とmkII以降とで異なります。初代機では16個のスペース、mkII/6601 (N60-BASICでも) ではコンマそのものが出力されます。mkII/6601ではそのままINPUT#-1で読める形式になっているわけです。ちなみにPRINT#-2も同様の差異があります。


モード5マシン語モニタによるテープへのセーブ

マシン語モニタのWコマンドは、インテルHEX形式を若干変形した形での出力を行います。

モード5マシン語モニタによるテープへのセーブ
サイズ 内容
- 長いピー音 (2400Hz)
6 9Chの連続
2 0Dh 0Ah
繰り返し 3 ":10"
8 アドレスオフセット4バイト分8文字
32 データ16バイト分を2文字ずつ (余った場合は"00"で埋める)
2 チェックサム2文字 (データ合計を2の補数に直したものの下位1バイト)
2 0Dh 0Ah
17 ":0000000000000000"
1 1Ah
- ごく短いピー音 (2400Hz)

フロッピーディスクへのセーブ

標準フォーマットは、1トラックを2分割したクラスタ番号 (0オリジン) と、8ビットのFATを用いて管理されています。

フロッピーディスクへのセーブ
トラック (1D) トラック (1DD) セクタ 内容
0-17 0-36 1-16 データ
18 37 1-12 ディレクトリ
13 ID (先頭データのビット4が1なら書き込み不可)
14-16 FAT (同じものが3個)
19-34 38-79 1-16 データ
ディレクトリ構造
オフセット サイズ 内容
0 6 ファイル名
6 3 拡張子
9 1 アトリビュート
10 1 最初のクラスタ番号
11 5 予約
FATに記録される値
意味
00h-9Fh 続きが記録されているクラスタ番号
C1h-C8h ファイル最後のクラスタであることを示す。下位4ビットが使用セクタ数
FEh 予約 (ディレクトリ、ID、FAT)
FFh 使用可能

自動実行

ROMカートリッジの自動実行

通常のROMカートリッジでは、4000h〜7FFFhの領域にデータが配置されます。先頭の2文字が「AB」であれば、4002h〜4003hに書いてあるアドレスをコールします。「AB」に加えて、mkII/6601では「CD」、SRでは「EF」であっても、同様の動作を行うようです。

フロッピーの自動実行

mkII/6601でフロッピーが接続されている場合、起動時にトラック0セクタ1のデータがF900h〜F9FFhに読み込まれ、先頭の3文字が「SYS」であればF903hから実行されます。初代機+拡張BASICではこの動作は起きません。また、F903hからのコードでretすると、FF4Ehにある値+1のモードを選択したことになります。


VRAMと画面モード

大きく初代機画面モードmkII画面モードに分けられます。(SRの画面モードについては未記述です)

初代機モード

初代PC-6001はグラフィックチップとしてM5C6847P-1 (MC6847互換) を採用しており、キャラクタの表示のみできるモード、文字単位のセミグラフィックが使えるモード、フルグラフィックが使えるモードなどが使用可能です。また、同じグラフィックモードでも解像度や使える色数が異なる複数のモードを選択できます。mkII以降ではカスタムICが使用されており、ある程度の互換性は保たれていますが、あまり使われない画面モードは省略されています。全機種で共通して使える画面モードは以下の通りです。

VRAM先頭の512バイトはアトリビュートと呼ばれ、画面モードや文字の色などを決めるのに使われます。512バイト目以降がデータで、表示キャラクタやグラフィックパターンのための領域です。アトリビュート512バイトは32x16文字に対応しており、キャラクタモードやセミグラフィックモードでは1文字単位でモードを変更したり色を変えたりできます。複数の画面モードを混在させることも可能です。例えばBASICのスクリーンモード2はセミグラフィックモードを使用していますが、文字のある部分だけはキャラクタモードになっています。

キャラクタモード

1画面は32x16文字です。 データ=キャラクタコードです。

32x16画面の位置とアトリビュートアドレス先頭からのオフセットの対応
X=0 X=1 X=2 ... X=31
Y=0 0000h 0001h 0002h ... 001Fh
Y=1 0020h 0021h 0022h ... 003Fh
...
Y=15 01E0h 01E1h 01E2h ... 01FFh

セミグラフィックモード

1文字分の領域ごとに、2x3ドットもしくは2x2ドット(初代機のみ)で、黒背景+8色中1色指定の粗いグラフィックを表示できます。アトリビュートの位置対応はテキストモードと同じです。データ領域は、ビット7〜6=カラーコード1〜4と5〜8に対応、ビット5〜0=ドットパターンに対応します。

2x3セミグラフィックモードのドットパターン
bit5 bit4
bit3 bit2
bit1 bit0

グラフィックモード

画面全体を横に32分割し、縦は16ラインおきで飛び飛びの12本分をアトリビュート1バイトでまとめて指定します。そのため、画面の左右で違うモードに分割することはできますが上下分割はできません。

データ領域は32バイト=横1ラインです。スクリーンモード3では2ビット=1ドットで4色中1色、スクリーンモード4では1ビット=1ドットで2色中1色を指定します。MSBが画面左側です。

256x192ドット画面での位置とアトリビュートアドレス先頭からのオフセットの対応
X=0-7 X=8-15 X=16-23 ... X=248-255
Y=0 0000h 0001h 0002h ... 001Fh
Y=1 0020h 0021h 0022h ... 003Fh
...
Y=15 01E0h 01E1h 01E2h ... 01FFh
Y=16 0000h 0001h 0002h ... 001Fh
Y=17 0020h 0021h 0022h ... 003Fh
...
Y=31 01E0h 01E1h 01E2h ... 01FFh
Y=32 0000h 0001h 0002h ... 001Fh
Y=33 0020h 0021h 0022h ... 003Fh
...
Y=48 0000h 0001h 0002h ... 001Fh
...
Y=19101E0h 01E1h 01E2h ... 01FFh

アトリビュートの各ビットは以下のような名前で呼ばれます。グラフィックチップM5C6847P-1の各制御線に対応します。

初代機画面モードのアトリビュート
bit7bit6bit5bit4bit3bit2bit1bit0
#A/G #A/S #INT/EXT GM0 GM1 GM2 CSS INV

各ビットの働きは以下の通りです。

アトリビュートの各ビット
bit7-6 #A/G,#A/S
00 キャラクタモード
01 セミグラフィックモード
10or11 グラフィックモード
bit5 #INT/EXT キャラクタモードの時
0 6847内部フォント使用
1 外部フォント(CGROM)使用
セミグラフィックモードの時
0 4ドット/1文字 (64x32)
1 6ドット/1文字 (64x48)
bit4-2 GM0,GM1,GM2 グラフィックモードの時
000 カラー64x64
001 カラー128x96
010 カラー128x64
011 カラー128x192
100 モノクロ128x64
101 モノクロ128x192
110 モノクロ128x96
111 モノクロ256x192
bit1 CSS カラーセット選択
bit0 INV キャラクタモードの時
0 非反転
1 反転

各スクリーンモードでのアトリビュート値は以下の通りです。

スクリーンモードとアトリビュート値
スクリーンモード アトリビュート値 色の組み合わせ
1 20h カラー1 (初代機=緑/mkII以降=白)
21h カラー2 (初代機=緑反転/mkII以降=白反転)
22h カラー3 (初代機=橙/mkII以降=緑)
23h カラー4 (初代機=橙反転/mkII以降=緑反転)
2 60h カラー1〜4 (緑,黄,青,赤)
62h カラー5〜8 (白,シアン,マゼンタ,橙)
3 8Ch カラーセット1 (緑,黄,青,赤)
8Eh カラーセット2 (白,シアン,マゼンタ,橙)
4 DCh カラーセット1 (黒,緑)
DEh カラーセット2 (黒,白)

mkII以降ではBASICのスクリーンモード1,2,3,4以外のモードはサポートされていませんが、初代機ではBASICで用意された以外の画面モードも使用可能です。下の表でSCREENが「-」になっているものは、初代機でのみ使用が可能です。

アトリビュートと画面モード
bit7bit6bit5bit4bit3bit2bit1bit0モード SCREEN
#A/G#A/S#INT/EXTGM0GM1GM2CSSINV
0 0 0 X X X 0,10,1内部アルファニューメリック -
0 0 1 X X X 0,10,1外部アルファニューメリック 1
0 1 0 X X X 0,10,164x32セミグラフィック -
0 1 1 X X X 0,10,164x48セミグラフィック 2
1 X X 0 0 0 0,1X 64x64カラーグラフィック -
1 X X 0 0 1 0,1X 128x96カラーグラフィック -
1 X X 0 1 0 0,1X 128x64カラーグラフィック -
1 X X 0 1 1 0,1X 128x192カラーグラフィック 3
1 X X 1 0 0 0,1X 128x64グラフィック -
1 X X 1 0 1 0,1X 128x192グラフィック -
1 X X 1 1 0 0,1X 128x96グラフィック -
1 X X 1 1 1 0,1X 256x192グラフィック 4

色とデータの対応は以下の通りです。

色の対応 (スクリーンモード1)
CSS INV 色(初代機) 色(mkII以降)
0 0
0 1 緑反転 白反転
1 0
1 1 橙反転 緑反転
色の対応 (スクリーンモード2)
CSS bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
0 X X 0 0 0 0 0 0
0 0 0 X X X X X X
0 0 1 X X X X X X
0 1 0 X X X X X X
0 1 1 X X X X X X
1 X X 0 0 0 0 0 0
1 0 0 X X X X X X
1 0 1 X X X X X X シアン
1 1 0 X X X X X X マゼンタ
1 1 1 X X X X X X
色の対応 (スクリーンモード3)
CSS bit奇 bit偶
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1 シアン
1 1 0 マゼンタ
1 1 1
色の対応 (スクリーンモード4)
CSS bit
0 0
0 1
1 0
1 1

mkII画面モード

mkII以降では、初代機のスクリーンモード1〜4相当のモード以外に、以下の画面モードが使用できます。

画面モードの切り替えはポートC1hで行います。切り替え時に表示される画面は、mkII/6601とmkIISR/6601SRとで異なります。前者ではポートB0hに書き込んだ値が維持されて表示アドレスが改めて決定されるのに対し、後者では切り替え前の表示アドレスが維持されるようです。互換性のある形でプログラムを書きたい場合は、ポートC1hで画面モード決定→ポートB0hで表示アドレス決定、という順で行うのが良いでしょう。

ポートC1hへの出力値と画面モードの対応
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 画面モード
- - - - X X 1 - 初代機画面モード
- - - - X 1 0 - スクリーンモード1,2
- - - - 1 0 0 - スクリーンモード3
- - - - 0 0 0 - スクリーンモード4

mkII画面モードでは、キャラクタモード (スクリーンモード1,2) に限り先頭の1024バイトがアトリビュートになっています。40x20文字表示なので、実際に使用されるのはそのうち800バイトです。アトリビュートの最上位ビットではキャラクタセットの切り替えが可能で、ここを1にするとギリシャ文字などmkII独自のキャラクタを表示できます。BASICのスクリーンモード2ではこの機能を使ってブロック状の文字を表示することによりセミグラフィック表示を行っています。1024バイト目以降はデータで、キャラクタコードに対応した表示が行われます。

表: キャラクタモードのアトリビュート
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
グラフィックフラグ 背景色 文字色
B G R H B G R

グラフィックモードはアトリビュートがなく、16Kバイトすべてデータ領域です。8Kバイトずつの2プレーン構成で、各プレーンの色ビットの組み合わせで表示色が決まります。スクリーンモード3は2プレーン×2ビット=16色1ドット、スクリーンモード4は2プレーン×1ビット=4色1ドットに対応します。MSBが画面左側です。

カラーセット変更はポートC0hで行います。概ね、CSS1=G、CSS2=H(色相)、CSS3=初代機スクリーンモード3カラー選択、と考えると理解しやすいです。

色の対応 (スクリーンモード1,2)
背景 文字
CSS2 bit6 bit5 bit4 bit3 bit2 bit1 bit0
H B G R H B G R
0 0 0 0 0 0 0 0 透明(黒)
0 0 1 0 0 0 1
0 1 0 0 0 1 0 青緑
0 1 1 0 0 1 1 黄緑
1 0 0 0 1 0 0 青紫
1 0 1 0 1 0 1 赤紫
1 1 0 0 1 1 0 空色
1 1 1 0 1 1 1 灰色
1 0 0 0 1 0 0 0
0 0 1 1 0 0 1
0 1 0 1 0 1 0
0 1 1 1 0 1 1
1 0 0 1 1 0 0
1 0 1 1 1 0 1 マゼンタ
1 1 0 1 1 1 0 シアン
1 1 1 1 1 1 1
色の対応 (スクリーンモード3)
CSS3 プレーン1 プレーン0
bit奇 bit偶 bit奇 bit偶
H G R B
0 0 0 0 0 黒(透明)
0 0 0 1 青紫
0 0 1 0
0 0 1 1 赤紫
0 1 0 0 青緑
0 1 0 1 空色
0 1 1 0 黄緑
0 1 1 1 灰色
1 0 0 0
1 0 0 1
1 0 1 0
1 0 1 1 マゼンタ
1 1 0 0
1 1 0 1 シアン
1 1 1 0
1 1 1 1
1 X 0 0 0
X 0 0 1
X 0 1 0
X 0 1 1
X 1 0 0
X 1 0 1 シアン
X 1 1 0 マゼンタ
X 1 1 1
色の対応 (スクリーンモード4)
CSS3 CSS2 CSS1 プレーン1 プレーン0
H G R B
0 0 0 0 0 透明(黒)
0 1 青紫
1 0
1 1 赤紫
0 0 1 0 0 青緑
0 1 空色
1 0 黄緑
1 1 灰色
0 1 0 0 0
0 1
1 0
1 1 マゼンタ
0 1 1 0 0
0 1 シアン
1 0
1 1
1 X 0 0 0
0 1
1 0
1 1
1 X 1 0 0
0 1 シアン
1 0 マゼンタ
1 1

クロック

クロックはPC-6601が一番速いです。タイマ割り込み周期は、回路図を見る限りメインクロックの8192分周で約2ms。(1/512)秒と言われることもありますが、少し異なる値のようです。mkII以降はポートF6hで割り込み周期を変更可能で、(ポートF6hの値+1)×2048クロックになります (通常はポートF6h=3に設定されている)。SRでも(ポートF6hの値+1)に比例するのは同じですが係数が若干異なるらしく、マニュアルに(2/999)秒と書いてあるので、3に設定した時にはこうなるようです。

CPUウェイトはM1サイクルごとに+1、ROMへのアクセスで+1、I/OポートA0h〜AFh (PSG用ポート) へのアクセスで+1で、OR条件でかかります。mkII以降ではポートF3hによる設定で一部変更可能ですが、本体ROMだとアクセス時間が間に合わずに動かなくなる場合もあります。

メインクロックとタイマ割り込み周期 (mkII以降ではポートF6hを3に設定した場合)
PC-6001/mkII PC-6601 PC-6001mkIISR/6601SR
メインクロック3.9936MHz 4MHz 3.579545MHz
タイマ割り込み周期(2/975)s 2.048ms (2/999)s

バスリクエスト

画面表示期間中はバスリクエスト信号によりCPUが停止します。ポート93hを使いバスリクエストを止めることで実行速度を稼ぐこともできますが、その間は画面が表示されなくなります。停止時間の割合は以下の通りです。

バスリクエストの割合
機種 画面モード 水平走査本数 水平走査時間 垂直方向停止割合 水平方向停止割合 全体の停止割合
初代機 262 910/14.318MHz 192/262 592/910 47.7%
mkII/6601 初代機画面モード 912/14.318MHz 608/912 48.9%
mkII画面モード 200/262 736/912 61.6%

バスリクエストOFF中は、初代機ではテキスト画面は消えるだけ、グラフィック画面では砂嵐状になります。mkII以降では逆に、テキスト画面では砂嵐状、グラフィック画面では消えるだけのようです。砂嵐の時は、アトリビュートや画面モードについては、バスリクエストがOFFになる直前の値がそのまま維持されます。データ部分としては、初代機の砂嵐はアドレスバスのA11-A4が表示され (リフレッシュ期間中はIRレジスタの値が見える)、mkII以降は概ねデータバスの値が表示されます。

SRではサイクルスチールが採用されているらしく、モード1〜5でも画面表示を保ったまま任意にバスリクエストをOFFできます。


割り込み

基本動作はZ80の割り込みモード2です。起動ルーチンではIレジスタはFAhに設定され、FA00hから割り込みルーチンのアドレスが格納されます。NMIは初代機ではカートリッジスロットから入力可能ですが、mkII以降ではプルアップされ無効になっています。

割り込み番号
割り込み番号 条件
02h 通常キー入力
04h RS-232C
06h タイマ
08h テープ読み込み
0Eh テープ書き込み中のSTOP
10h テープ読み込み中のSTOP
12h テープ読み込みエラー
14h 特殊キー入力
16h キー状態問い合わせ応答

mkII以降では、ジョイスティックポートの7番ピン (トリガ2) による割り込みも利用できます。通常は無効になっており、I/OポートF3hとF5hを使って設定します。


カートリッジスロット

7,8,16は初代機とmkII以降とで異なります。

カートリッジスロット
1 #RAS2 2 #CS3(6000-7FFF)
3 #DRD 4 #CS2(4000-5FFF)
5 #WE 6 #EROM
7 #WAIT/#OCS5 8 #NMI/#EXINT
9 #M1 10 #EXCAS
11 #IORQ 12 #MREQ
13 #WR 14 #RD
15 #RESET 16 16MHz/#MPX
17 A9 18 A15
19 A11 20 A10
21 A7 22 A6
23 A12 24 A8
25 A14 26 A13
27 A1 28 A0
29 A3 30 A2
31 A5 32 A4
33 D1 34 D0
35 D3 36 D2
37 D5 38 D4
39 D7 40 D6
41 GND 42 4MHz
43 GND 44 MSW1
45 +5V 46 MSW2
47 +5V 48 +12V
49 +5V 50 -12V

I/Oポート

I/Oポートの機能は、大きく分けると以下のようになっています。

I/Oポート
ポート 機能
00h-7Fh 内部では未使用 (自作カートリッジなどでは使用可能) ※SRでは内部でも使用している
80h-8Fh RS-232C
90h-9Fh 8255 (サブCPUプリンタなど)
A0h-AFh PSG
B0h-BFh VRAM、タイマなど
C0h-CFh プリンタ制御、グラフィック制御など
D0h-DFh フロッピーディスク
E0h-EFh 音声合成
F0h-FFh バンク切り替え、ウェイト、割り込み制御

RS-232C

ポート80hはデータ、ポート81hは入力が8251のステータス、出力がコマンドワードに対応します。イメージとして同じものが80h-8Fhに8ポートずつあります。

RS-232C用ポート
ポート bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
81h(入力) DSR SYNDET FE OE PE TxEMPTY RxRDY TxRDY
81h(出力) EH IR RTS ER SBRK RxE DTR TxEN

サブCPUと8255

キー入力やテープ入出力はサブCPUが担当しており、メインCPUは8255を介してサブCPUとやり取りする必要があります。8255のポートA〜Cと制御レジスタに対応したI/Oポートがあり、メインCPUからはそのポートを使用して操作します。8255はポートAをモード2、ポートBをモード0出力設定にして使います。

8255用ポート
ポート bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
90h 8255ポートA (サブCPU入出力用)
91h 8255ポートB (プリンタ出力用)
92h 8255ポートC (変更する時はポート93hを使う)
#OBF #ACK(入力) / INTE1(出力) IBF #STB(入力) / INTE2(出力) INTR CGROM OFF バスリクエストON プリンタストローブ
93h 8255制御レジスタ
0=ポートC設定 - - - ビット番号 0=リセット 1=セット

イメージとして同じものが90h-9Fhに4ポートずつあります。

キー入力やテープ入力があった場合、サブCPUは割り込み番号とデータを続けて送る状態になります。割り込み有効状態ならば割り込み番号は自動的にメインCPU側に読み込まれるので、割り込みルーチン内で残るデータ1バイトを読み込むようにします。

サブCPUからのデータを読む時は以下のようにします。

  1. ポート93hに0Chを出力して8255のwrite割り込みを禁止
  2. ポート92hのビット3とビット5が1になるのを待つ
  3. ポート93hに0Dhを出力して8255のwrite割り込みを許可
  4. ポート90hを読む

サブCPUへデータを出力する時は以下のようにします。

  1. ポート93hに08hを出力して8255のread割り込みを禁止
  2. ポート92hのビット7が1になるのを待つ
  3. ポート93hに09hを出力して8255のread割り込みを許可
  4. ポート90hに値を出力

サブCPUに対するコマンドとして、以下のようなものを送ることができます。

サブCPUコマンド
コマンド 機能
06h ゲームキー状態調査要求 (スペース・カーソル・STOP・SHIFT)
19h テープ入力開始
1Ah テープ入力終了
1Dh テープ入力を600ボーに設定
1Eh テープ入力を1200ボーに設定
38h テープ1バイト出力 (これに続けてデータを送る)
39h テープ出力開始
3Ah テープ出力終了
3Dh テープ出力を600ボーに設定
3Eh テープ出力を1200ボーに設定

キー入力

キー入力はサブCPUで管理されています。キーが押されるとサブCPUから割り込みがかかり、メインCPU側は8255を経由してキーコードをサブCPUから読み込みます。「あるキーが現在押されているかどうか」は一部のキーを除いてメインCPUではわかりません。またオートリピート処理もサブCPUで行われるため、押しっぱなしでオートリピートがかかっているのか、ユーザーが連打しているのか、メインCPU側からは判別できません。

「現在押されているかどうか」がわかるのは、カーソルキー・スペースキー・STOPキー・シフトキー (左右の区別無し) のみです。これらのキーについては、サブCPUに対して調査コマンドを投げると、一定時間後に応答の割り込みがかかり、メインCPUがデータを読むことで各キーの状態がわかります。

ゲームキー状態調査コマンドの返り値
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
スペース 0 STOP SHIFT

テープ

テープ入出力もサブCPUで管理されています。読み込み時はキー入力同様に1バイト読むたびに割り込みがかかります。書き込み時は、テープ出力コマンドとデータ1バイトを交互に送ってやる形になります。テープ書き込みモードで何もせずにいると、2400Hzヘッダ (いわゆるピー音) が出力され続けます。サブCPUの動作は、キー入力モード・テープ読み込みモード・テープ書き込みモードが完全に分かれており、あるモードに入ると他の機能は使えません。

記録方式としてはいわゆる4倍カンザス (1200ボー) もしくは2倍カンザス (600ボー) が使えますが、通常は1200ボーが用いられます。データ=0を1200Hz1周期、データ=1を2400Hz2周期に割り当てた形式です。スタートビット (0) 1個、データを下位から8ビット、ストップビット (1) 3個という組で出力されるため、記録速度としては100バイト/秒となります。読み込み時はストップビットが2個以上あれば概ね読めるようです。多い分にはいくつあっても構いません。また、ヘッダ音 (いわゆるピー音) は2400Hz成分のみから成りますが、スタートビットとストップビットで1バイト分が挟まれていることがデータの条件のため、ヘッダ音そのものはデータを含みません。

カセット用コネクタは8ピンDINコネクタです。mkII以降では、ポートB2hを使ってピン1・ピン3を出力端子として使用できます。

カセット用コネクタ
1 GND(初代機)/CMT1(mkII以降)
2 GND
3 GND(初代機)/CMT3(mkII以降)
4 CMTOUT
5 CMTIN
6 REM+
7 REM-
8 GND

プリンタ

プリンタ出力は以下の手順で行います。

  1. ポートC0hのbit1が1になるのを待つ
  2. 出力したいデータを全ビット反転させたものをポート91hに出力する
  3. ポート93hに01hを出力してプリンタへのストローブ信号をセットする
  4. ポート93hに00hを出力してプリンタへのストローブ信号をリセットする

プリンタ用コネクタは14ピンコネクタです。

プリンタ用コネクタ
1 #STROBE 8 D6
2 D0 9 D7
3 D1 10 -
4 D2 11 #READY
5 D3 12 -
6 D4 13 GND
7 D5 14 GND

PSG

ポートA0h,A1h,A2hを使って制御します。イメージとして同じものがA0h-AFhに4ポートずつあります。1ウェイト余分に入ります。

PSG制御ポート
ポート 機能
A0h PSGレジスタ指定
A1h 書き込み値
A2h 読み込み値
A3h -

各PSGレジスタの機能は以下の通りです。

PSGレジスタ
レジスタ番号 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
0 ch.A周期下位8ビット
1 - - - - ch.A周期上位4ビット
2 ch.B周期下位8ビット
3 - - - - ch.B周期上位4ビット
4 ch.C周期下位8ビット
5 - - - - ch.C周期上位4ビット
6 - - - ノイズ周期
7 ポートB入出力選択 ポートA入出力選択 ch.Cノイズ ch.Bノイズ ch.Aノイズ ch.Cトーン ch.Bトーン ch.Aトーン
0=入力 1=出力0=有効 1=無効
8 - - - ch.Aエンベロープモード ch.Aボリューム
9 - - - ch.Bエンベロープモード ch.Bボリューム
10 - - - ch.Cエンベロープモード ch.Cボリューム
11 エンベロープ周期下位8ビット
12 エンベロープ周期上位8ビット
13 - - - - エンベロープ形状
14 ポートA入出力値
15 ポートB入出力値

レジスタ0〜6は、初代機とmkIIでは1996800/16/周波数(Hz)、6601では2000000/16/周波数(Hz)を設定します。レジスタ11〜12は、初代機とmkIIでは1996800/256/周波数(Hz)、6601では2000000/256/周波数(Hz)を設定します。

ジョイスティックポートもPSGに接続されており、以下の手順で読むことができます。負論理で、入力があれば0になります。

  1. PSGポートAを入力、ポートBを出力にする
  2. PSGポートBのbit7を1にし、bit6でジョイスティック1か2を選択し、bit5とbit4を0にする
  3. PSGポートAを読む
PSGポートAでのジョイスティック読み値
機種 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
初代機 1 1 トリガ2 トリガ1
mkII以降 VSYNC HSYNC
PSGポートBへの出力
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
ピン6,7入出力選択(1=入力) ジョイスティックポート選択(1=ポート1) ジョイティックポート1,ピン8に出力する値 ジョイティックポート2,ピン8に出力する値 bit7=0の時、ジョイティックポート1,ピン7に出力する値 bit7=0の時、ジョイティックポート1,ピン6に出力する値 bit7=0の時、ジョイティックポート2,ピン7に出力する値 bit7=0の時、ジョイティックポート2,ピン6に出力する値

ジョイスティックポートはD-sub9ピン (本体側がオス) で、入力端子が4個、入出力選択可能端子が2個、出力端子が1個です。通常のジョイスティックは6入力1出力モードで、出力端子を0Vにして信号の共通リターン線として使用しています。タッチパネルPC-6051は4入力3出力モードで、BASICではジョイスティックポート2に接続して使用します。

ジョイスティックポートのピンアサイン
D-sub 1 2 3 4 5 6 7 8 9
機能 IN IN IN IN +5V IN/OUT IN/OUT OUT GND
PSGポート A0 A1 A2 A3 - A4(IN)/B2(ジョイスティックポート1OUT)/B0(ジョイスティックポート2OUT) A5(IN)/B3(ジョイスティックポート1OUT)/B1(ジョイスティックポート2OUT) B5(ジョイスティックポート1)/B4(ジョイスティックポート2) -
ジョイスティック +5V トリガ1 トリガ2 COM GND
PC-6051 #SENSE EOC SO - +5V #SCK SI #CS GND

ポートB0hなど

雑多な機能が詰め込まれたポートです。初代機ではB0hからBFhまで共通ですが、mkII以降ではB1h以降は別の機能が割り振られています。読み出しはできないので、BASIC ROMのB0hへの書き込みルーチン (1B54h) では、ワークエリアに現在の値を保存しておくようになっています。初代機では、このポートを読むとFFhを書き込んだのと同じ動作 (リレーがONになり、ページ4を表示し、タイマ割り込みがOFFになる) をしますが、mkII以降では何も起こらないように修正されています。また初代機では、タイマ割り込みをOFFからONにした時、最初の1回の割り込みのみ通常の半分の周期で割り込みがかかります。こちらもmkII以降では1周期になるよう変更されています。

ポートB0h
ポート bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
B0h - - - - テープリレー 表示VRAMアドレス タイマ割り込み
0=OFF 1=ON 初代機画面モード: 00=C000h 01=E000h 10=8000h 11=A000h 0=ON 1=OFF
mkII画面モード: 00=8000h 01=C000h 10=0000h 11=4000h

B1h〜B3hは内蔵FDD制御 (6601/6601SRのみ) やカセット端子へのTTL出力 (mkII以降のみ) を行うポートになっています。

ポートB1h〜B3h
ポート bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
B1h - - - - - ドライブ選択 DMA方向 DMAアクセス
0=内蔵 1=外付け 0=書き込み 1=読み込み 0=可 1=不可
B2h - - - - CMT3ピン出力 - CMT1ピン出力 FDC割り込み
B3h - - - - ポートB2h-bit3 ポートB2h-bit2 ポートB2h-bit1 ポートB2h-bit0
0=入力 1=出力

プリンタ制御、グラフィック制御など

C0hの入力はプリンタとRS-232Cの制御を行います。C0hの出力とC1h〜C3hはmkII以降のみで、画面モードやカラーセットの選択、拡張漢字ROM制御などを行います。

ポートC0h〜C3h
ポート bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
C0h (入力) - - - - - - 0=プリンタBUSY 1=READY RS-232Cキャリア検出
C0h (出力) - - - - - CSS3 CSS2 CSS1
C1h - - - - 0=320x200 1=160x200 0=グラフィックモード 1=キャラクタモード 0=mkII画面モード 1=初代機画面モード -
C2h - - - - - - 0=漢字ROM左半分 1=右半分 0=音声合成ROM選択 1=漢字ROM選択
C3h - - - - - - 0=ポートC2h-bit1入力選択 1=出力選択 0=ポートC2h-bit0入力選択 1=出力選択

フロッピーディスク

PC-6001+PC-6011とPC-6001mkII/SRは外付けドライブのみ使用可能です。PC-6601/SRは基本的には内蔵ドライブのみ使用可能ですが、本体改造や特殊なハードウェアを用いれば外付けドライブも使用可能なようです。外付けドライブは8255を介してドライブ内のCPUとハンドシェイクを行うことで、内蔵ドライブはFDC (μPD765A) とDMAを使用することでデータ転送を行います。両者で使用するI/Oポート番号には重複がありますが、機能や使い方は全く異なります。

外付けドライブはFDD用の8255に接続されており、8255のポートA〜Cと制御ポートに対応するI/Oポートを使ってデータをやり取りします。8255はモード0設定で、ポートAを入力、ポートBを出力にして使います。

外付けFDD用ポート
ポート bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
D0h 8255ポートA (FDD→PCデータ)
D1h 8255ポートB (PC→FDDデータ)
D2h 8255ポートC (変更する時はポートD3hを使う)
ATN DAC RFD DAV - DAC RFD DAV
出力 入力
D3h 8255制御レジスタ
0=ポートCビット設定 - - - ビット番号 0=リセット 1=セット

内蔵ドライブはDMAによりデータをやり取りします。DMA用メモリは1Kバイトあり、ポートD0〜D3が256バイトずつ受け持ちます。4ポートのうちいくつ使うかはポートDAhで指定します。256バイト分の指定は、Z80のIN/OUT命令使用時にアドレスバス上位に出る8ビットを00h〜FFhに変化させることで行います。また、内蔵ドライブ制御にはポートB1h〜B3hも使用します。

内蔵FDD用ポート
ポート bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
D0h データ入出力
D1h データ入出力
D2h データ入出力
D3h データ入出力
D4h FDDモータ状態
- - - - - - ドライブ2停止中 ドライブ1停止中
D5h -
D6h FDDモータ制御
- - - - - - ドライブ2停止 ドライブ1停止
D7h -
D8h 何かの調整値 (ピークシフト関連?)
D9h -
DAh - 転送セクタ数(1-4)のビット反転
DBh -
DCh FDCステータスレジスタ
DDh FDCデータレジスタ
DEh 何かの調整値 (VFO関連?)
DFh -

音声合成

初代機にはありません。mkII以降では概ね以下のような手順で行います。詳しくは別ページに。

  1. ポートE2hに発声速度を表す値を出力する
  2. ポートE3hにコマンドを表す値を出力する
  3. ポートE0hを読んでステータスを確認しながら、ポートE0hに音声データを出力する
音声合成用ポート
ポート bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
E0h (入力) BSY REQ #INT/EXT ERR - - - -
E0h (出力) TIME QMAG S.I V/UV
f1 b1
f2 b2
f3 b3
f4 b4
f5 b5
AMP FV p
E2h - - - - - フレーム周期 発声速度
0=10ms 1=20ms 00=NORMAL 01=SLOW 10=FAST
E3h 00h-04h=固定語 FEh=外部データ使用 FFh=発声停止

バンク切り替え、ウェイト、割り込み制御

キャラクタROM (CGROM) の中身を見るには、ポート93hを使って、6000h-6FFFhをバンク切り替えします。

mkII以降では、キャラクタROMのアドレスを8KB単位で変更できる他、他の多種類のメモリについて8KBもしくは16KB単位でバンク切り替えが可能です。また、ウェイトの条件や割り込みの制御に関するポートもあります。

バンク切り替え用ポート (読み込み)
ポートbit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
F0h 4000h-7FFFh 0000h-3FFFh
F1h C000h-FFFFh 8000h-BFFFh
バンク切り替え設定値 (読み込み)
後ろの8KB
BASIC ROM VOICE/KANJI ROM 外部ROM(6000h-7FFF) 外部ROM(4000h-5FFFh) 内部RAM 外部RAM
前の8KB BASIC ROM 1 6 A - - -
VOICE/KANJI ROM 5 2 - C - -
外部ROM(6000h-7FFFh) 9 - 3 8 - -
外部ROM(4000h-5FFFh) - B 7 4 - -
内部RAM - - - - D -
外部RAM - - - - - E
書き込み許可用ポート (1=書き込み可)
ポート bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
F2h C000h-FFFFh 8000h-BFFFh 4000h-7FFFh 0000h-3FFFh
外部RAM 内部RAM 外部RAM 内部RAM 外部RAM 内部RAM 外部RAM 内部RAM
ウェイト、割り込み制御用ポート
ポート bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
F3h M1 WAIT ON ROM WAIT ON RAM WAIT ON INT2割込アドレス出力 INT1割込アドレス出力 タイマ割込停止 INT2割込停止 INT1割込停止
F4h INT1(サブCPU)割り込みアドレス指定
F5h INT2(ジョイスティック7ピン)割り込みアドレス指定
F6h タイマ割り込み周期:約0.5ms×(portF6h+1)
F7h タイマ割り込みアドレス指定(普通は06h)
CGROM切り替え用ポート (通常はC3hに設定)
ポート bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
F8h WAIT OFF 読み込み可 bit2無効 bit1無効 bit0無効 先頭アドレス/2000h
拡張漢字ROM用ポート
ポート bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
FCh 漢字ROMアドレス (下位8ビット-上位8ビットをアドレスバス16ビットに出力)
FDh 漢字左側データ読み込み
FEh 漢字右側データ読み込み
FFh 00h=読み込み可 FFh=読み込み不可

参考文献


トップ > 雑多なもの > PC-6001シリーズ技術情報いろいろメモ