参考文献から抜き出した情報をいろいろ書き留めてみました。SRについての記述はほぼありません。
mkII以降では起動時にモード選択画面が表示されます。これは初代PC-6001との互換性を保つためのもので、モード1〜4は初代PC-6001における、拡張RAMカートリッジと拡張BASICカートリッジの有無の組み合わせに対応しています。モード5はmkIIで新しく増えたもの、モード6はSRで更に増えたもので、画面の解像度などが異なります。
PC-6001シリーズでは複数の画面を持つことができ、ページ数を増やせば使用できる画面数が増えますが、かわりに使用できるメモリが減ります。(メモリマップ)
モード | 拡張RAM | 拡張BASIC | 最大ページ数 |
---|---|---|---|
1 | なし (RAM16KB) | なし | 2 |
2 | あり (RAM32KB) | なし | 4 |
3 | なし (RAM16KB) | あり | 2 |
4 | あり (RAM32KB) | あり | 4 |
BASICの各モードにおけるメモリマップです。
アドレス | ページ数=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になります。
アドレス | ページ数=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になります。
BASICのプログラムはユーザエリアBに置かれます。
アドレス | ページ数=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プログラムは以下の行構造の繰り返しです。行番号は直接入力できるのは0〜65529の範囲で、65530以上だと入力はできずLIST命令でも表示されませんが実行はされます。行の中身については、中間言語表にあるもの以外はキャラクタコードのまま格納されます。ただし、キャラクタコードが20h未満の文字については、14hとキャラクタコードに30hを足したものの2バイトの組を用います。最後の行の後ろに00hが3バイト連続するとプログラム終了となります。
サイズ | 内容 |
---|---|
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 | 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$ |
サイズ | 内容 |
---|---|
- | 長いピー音 (2400Hz) |
10 | D3hの連続 |
6 | ファイル名 (6文字未満の場合は00h埋め) |
- | やや短いピー音 (2400Hz) |
任意 | プログラム (ユーザエリア・ユーザエリアBの先頭+1から最後まで) |
10以上 | 00hの連続 |
- | ごく短いピー音 (2400Hz) |
プログラム部分は、例えば16KBモードならばアドレスC401hからのデータが出力されます (C400hは常に00h)。末尾の00hは、CSAVEでは通常12個 (空のプログラムの場合は13個) 出力されますが、CLOADでは10個連続した時点でプログラム終了とみなしてロードを終了するようになっています。
サイズ | 内容 |
---|---|
- | 長いピー音 (2400Hz) |
6 | 9Chの連続 |
任意 | データ |
- | ごく短いピー音 (2400Hz) |
データは通常のPRINT文の書式に順じますが、コンマで値を区切った時の処理が初代機とmkII以降とで異なります。初代機では16個のスペース、mkII/6601 (N60-BASICでも) ではコンマそのものが出力されます。mkII/6601ではそのままINPUT#-1で読める形式になっているわけです。ちなみにPRINT#-2も同様の差異があります。
マシン語モニタのWコマンドは、インテルHEX形式を若干変形した形での出力を行います。
サイズ | 内容 | |
---|---|---|
- | 長いピー音 (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 | 予約 |
値 | 意味 |
---|---|
00h-9Fh | 続きが記録されているクラスタ番号 |
C1h-C8h | ファイル最後のクラスタであることを示す。下位4ビットが使用セクタ数 |
FEh | 予約 (ディレクトリ、ID、FAT) |
FFh | 使用可能 |
通常の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のモードを選択したことになります。
大きく初代機画面モードとmkII画面モードに分けられます。(SRの画面モードについては未記述です)
初代PC-6001はグラフィックチップとしてM5C6847P-1 (MC6847互換) を採用しており、キャラクタの表示のみできるモード、文字単位のセミグラフィックが使えるモード、フルグラフィックが使えるモードなどが使用可能です。また、同じグラフィックモードでも解像度や使える色数が異なる複数のモードを選択できます。mkII以降ではカスタムICが使用されており、ある程度の互換性は保たれていますが、あまり使われない画面モードは省略されています。全機種で共通して使える画面モードは以下の通りです。
VRAM先頭の512バイトはアトリビュートと呼ばれ、画面モードや文字の色などを決めるのに使われます。512バイト目以降がデータで、表示キャラクタやグラフィックパターンのための領域です。アトリビュート512バイトは32x16文字に対応しており、キャラクタモードやセミグラフィックモードでは1文字単位でモードを変更したり色を変えたりできます。複数の画面モードを混在させることも可能です。例えばBASICのスクリーンモード2はセミグラフィックモードを使用していますが、文字のある部分だけはキャラクタモードになっています。
1画面は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=ドットパターンに対応します。
bit5 | bit4 |
bit3 | bit2 |
bit1 | bit0 |
画面全体を横に32分割し、縦は16ラインおきで飛び飛びの12本分をアトリビュート1バイトでまとめて指定します。そのため、画面の左右で違うモードに分割することはできますが上下分割はできません。
データ領域は32バイト=横1ラインです。スクリーンモード3では2ビット=1ドットで4色中1色、スクリーンモード4では1ビット=1ドットで2色中1色を指定します。MSBが画面左側です。
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=191 | 01E0h | 01E1h | 01E2h | ... | 01FFh |
アトリビュートの各ビットは以下のような名前で呼ばれます。グラフィックチップM5C6847P-1の各制御線に対応します。
bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
---|---|---|---|---|---|---|---|
#A/G | #A/S | #INT/EXT | GM0 | GM1 | GM2 | CSS | INV |
各ビットの働きは以下の通りです。
bit7-6 | #A/G,#A/S |
| ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
bit5 | #INT/EXT | キャラクタモードの時
| ||||||||||||||||
bit4-2 | GM0,GM1,GM2 | グラフィックモードの時
| ||||||||||||||||
bit1 | CSS | カラーセット選択 | ||||||||||||||||
bit0 | INV | キャラクタモードの時
|
各スクリーンモードでのアトリビュート値は以下の通りです。
スクリーンモード | アトリビュート値 | 色の組み合わせ |
---|---|---|
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が「-」になっているものは、初代機でのみ使用が可能です。
bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 | モード | SCREEN |
---|---|---|---|---|---|---|---|---|---|
#A/G | #A/S | #INT/EXT | GM0 | GM1 | GM2 | CSS | INV | ||
0 | 0 | 0 | X | X | X | 0,1 | 0,1 | 内部アルファニューメリック | - |
0 | 0 | 1 | X | X | X | 0,1 | 0,1 | 外部アルファニューメリック | 1 |
0 | 1 | 0 | X | X | X | 0,1 | 0,1 | 64x32セミグラフィック | - |
0 | 1 | 1 | X | X | X | 0,1 | 0,1 | 64x48セミグラフィック | 2 |
1 | X | X | 0 | 0 | 0 | 0,1 | X | 64x64カラーグラフィック | - |
1 | X | X | 0 | 0 | 1 | 0,1 | X | 128x96カラーグラフィック | - |
1 | X | X | 0 | 1 | 0 | 0,1 | X | 128x64カラーグラフィック | - |
1 | X | X | 0 | 1 | 1 | 0,1 | X | 128x192カラーグラフィック | 3 |
1 | X | X | 1 | 0 | 0 | 0,1 | X | 128x64グラフィック | - |
1 | X | X | 1 | 0 | 1 | 0,1 | X | 128x192グラフィック | - |
1 | X | X | 1 | 1 | 0 | 0,1 | X | 128x96グラフィック | - |
1 | X | X | 1 | 1 | 1 | 0,1 | X | 256x192グラフィック | 4 |
色とデータの対応は以下の通りです。
CSS | INV | 色(初代機) | 色(mkII以降) |
---|---|---|---|
0 | 0 | 緑 | 白 |
0 | 1 | 緑反転 | 白反転 |
1 | 0 | 橙 | 緑 |
1 | 1 | 橙反転 | 緑反転 |
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 | 橙 |
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 | 橙 |
CSS | bit | 色 |
---|---|---|
0 | 0 | 黒 |
0 | 1 | 緑 |
1 | 0 | 黒 |
1 | 1 | 白 |
mkII以降では、初代機のスクリーンモード1〜4相当のモード以外に、以下の画面モードが使用できます。
画面モードの切り替えはポートC1hで行います。切り替え時に表示される画面は、mkII/6601とmkIISR/6601SRとで異なります。前者ではポートB0hに書き込んだ値が維持されて表示アドレスが改めて決定されるのに対し、後者では切り替え前の表示アドレスが維持されるようです。互換性のある形でプログラムを書きたい場合は、ポートC1hで画面モード決定→ポートB0hで表示アドレス決定、という順で行うのが良いでしょう。
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カラー選択、と考えると理解しやすいです。
背景 | 文字 | 色 | ||||||
---|---|---|---|---|---|---|---|---|
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 | 白 |
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 | 橙 |
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だとアクセス時間が間に合わずに動かなくなる場合もあります。
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する直前に表示していたラインの右端1バイトのパターンが表示されるようです。砂嵐の時は、アトリビュートや画面モードについては、バスリクエストが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ポートの機能は、大きく分けると以下のようになっています。
ポート | 機能 |
---|---|
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 | バンク切り替え、ウェイト、割り込み制御 |
ポート80hはデータ、ポート81hは入力が8251のステータス、出力がコマンドワードに対応します。イメージとして同じものが80h-8Fhに8ポートずつあります。
ポート | 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が担当しており、メインCPUは8255を介してサブCPUとやり取りする必要があります。8255のポートA〜Cと制御レジスタに対応したI/Oポートがあり、メインCPUからはそのポートを使用して操作します。8255はポートAをモード2出力に、ポートBをモード0出力に、ポートCを出力設定にして使います。
ポート | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
---|---|---|---|---|---|---|---|---|
90h | 8255ポートA (サブCPU入出力用) | |||||||
91h | 8255ポートB (プリンタ出力用) | |||||||
92h | 8255ポートC (変更する時はポート93hを使う) | |||||||
#OBF | INTE1(出力割り込み許可) | IBF | INTE2(入力割り込み許可) | INTR | CGROM OFF | バスリクエストON | プリンタストローブ | |
93h | 8255制御レジスタ | |||||||
0=ポートC設定 | - | - | - | ビット番号 | 0=リセット 1=セット |
イメージとして同じものが90h-9Fhに4ポートずつあります。
キー入力やテープ入力があった場合、サブCPUは割り込み番号とデータを続けて送る状態になります。割り込み有効状態ならば割り込み番号は自動的にメインCPU側に読み込まれるので、割り込みルーチン内で残るデータ1バイトを読み込むようにします。
サブCPUからのデータを読む時は以下のようにします。
(※ポート92hのビット5(IBF)が1になるのを待ってポート90hを読むだけでも可能ですが、エミュレータなどでは対応していない場合があります)
サブCPUへデータを出力する時は以下のようにします。
(※ポート92hのビット7(#OBF)が1になるのを待ってポート90hに値を出力するだけでも可能ですが、エミュレータなどでは対応していない場合があります)
サブCPUに対するコマンドとして、以下のようなものを送ることができます。
コマンド | 機能 |
---|---|
04h | 英数入力・かな入力の切り替え (mkII以降のみ) |
05h | ひらがな入力・カタカナ入力の切り替え (mkII以降のみ) |
06h | ゲームキー状態調査要求 (スペース・カーソル・STOP・SHIFT) |
0Ch | RS-232C割り込み有効化 (割り込みが発生すると無効になるのでその度有効化すること) |
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 |
記録方式としてはいわゆる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 |
プリンタ出力は以下の手順で行います。
プリンタ用コネクタは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 |
ポートA0h,A1h,A2hを使って制御します。イメージとして同じものがA0h-AFhに4ポートずつあります。1ウェイト余分に入ります。
ポート | 機能 |
---|---|
A0h | PSGレジスタ指定 |
A1h | 書き込み値 |
A2h | 読み込み値 |
A3h | - |
各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になります。
機種 | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
---|---|---|---|---|---|---|---|---|
初代機 | 1 | 1 | トリガ2 | トリガ1 | → | ← | ↓ | ↑ |
mkII以降 | VSYNC | HSYNC |
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からBFhまで共通ですが、mkII以降ではB1h以降は別の機能が割り振られています。読み出しはできないので、BASIC ROMのB0hへの書き込みルーチン (1B54h) では、ワークエリアに現在の値を保存しておくようになっています。初代機では、このポートを読むとFFhを書き込んだのと同じ動作 (リレーがONになり、ページ4を表示し、タイマ割り込みがOFFになる) をしますが、mkII以降では何も起こらないように修正されています。また初代機では、タイマ割り込みをOFFからONにした時、最初の1回の割り込みのみ通常の半分の周期で割り込みがかかります。こちらもmkII以降では1周期になるよう変更されています。
ポート | 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以降のみ) を行うポートになっています。
ポート | 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制御などを行います。
ポート | 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を出力、ポートC下位4ビットを入力、ポートC上位4ビットを出力にして使います。
ポート | 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も使用します。
ポート | 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以降では概ね以下のような手順で行います。詳しくは別ページに。
ポート | 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-4 | bit3-0 |
---|---|---|
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 |
ポート | 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) |
ポート | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
---|---|---|---|---|---|---|---|---|
F8h | WAIT OFF | 読み込み可 | bit2無効 | bit1無効 | bit0無効 | 先頭アドレス/2000h |
ポート | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
---|---|---|---|---|---|---|---|---|
FCh | 漢字ROMアドレス (下位8ビット-上位8ビットをアドレスバス16ビットに出力) | |||||||
FDh | 漢字左側データ読み込み | |||||||
FEh | 漢字右側データ読み込み | |||||||
FFh | 00h=読み込み可 FFh=読み込み不可 |
トップ > 雑多なもの > PC-6001シリーズ技術情報いろいろメモ