PC-8001 CRTC
PC−8001はCRTCにμPD3301を使用します。
そしてCPUメモリの一部をDMAでCRTCに転送して画像を表示します。
Z80でDMA転送なのでCPUが一旦止まりますが
ソフトでブロック転送するより当然早く
また垂直帰線を見て(待って)VRAMを書き換えるより
効率が良いともいえます
しかし画面は常に表示することが多いので
常にCPUが止まることが多くなります
さらにソフトウェアでのタイミングがとれなくなるので
常に画面表示しながら他のデバイスにアクセスする為に
CMTに8251、FDDに8255を使用する事になります
キャラクタコード
N−BASICのVRAM
VRAMは設定によってアドレスの変更が出来ますが
N−BASICでは0F300Hに固定して使用
構成は表示領域が80バイト(80桁)に
アトリビュートが40バイト(20組分)で1行分
それが最大25行なので(80+40)×25で3000バイトになります
アトリビュートは1文字につき1つではなくて
1行につき40バイトしかなくアトリビュートは最低でも2バイト消費します
つまり20回分しかアトリビュートの設定が出来ません
また40桁でもVRAMでは
1行80バイトとアトリビュート40バイトは変わりません

使用アドレスは0F300H〜0FEB7H
表示領域
ここにキャラクタデータまたはグラフィックデータを書き込みます。
キャラクタ(ASCIIコード)かグラフィックかはアトリビュートで設定します。
グラフィックは1キャラクタ分を2*4ドットにして表示します。
アトリビュート
ICWの設定(ATn、SC)によってかわります
ノントランスペアレント モード
1バイトの構成になります
d7:1
d6:V 1=バーチカルライン オン、0=バーチカルライン オフ
d5:U 1=アンダーライン オン、0=アンダーライン オフ
d4:O 1=オーバーライン オン、0=オーバーライン オフ
d3:H 1=ハイライト オン、0=ハイライト オフ
d2:R リバース ビデオ (Z2)
d1:B ブリンク (Z1)S=1の時 無効
d0:S シークレット (Z0)
H(ハイライト)は輝度強調
Z2〜Z0
111:リバースシークレット
110:リバースブリンク
101:リバースシークレット
100:リバース
011:シークレット
010:ブリンク
001:シークレット
000:ノーマル
トランスペアレント モード
2バイトで1組の構成になります。
第1バイトは、左端を0として何番目のキャラクタに対して
第2バイトの属性を対応させるかの指定
第2バイトは、指定した桁からの色やキャラクタか
グラフィックの選択等(属性)を書き込みます
属性データは白黒、カラー選択、カラー通常指定でデータの意味が変ります
<第1バイト>
d7:0
d6:a6 列アドレス 04FH〜000H
d5:a5
d4:a4
d3:a3
d2:a2
d1:a1
d0:a0
<第2バイト>
白黒モード
d7:G 1=グラフィック 、0=キャラクタ
d6:V 1=バーチカルライン オン、0=バーチカルライン オフ
d5:U 1=アンダーライン オン、0=アンダーライン オフ
d4:O 1=オーバーライン オン、0=オーバーライン オフ
d3:0
d2:R リバース ビデオ (Z2)
d1:B ブリンク (Z1)S=1の時 無効
d0:S シークレット (Z0)
カラー選択 (d3=1)
d7:緑 1=緑オン 、0=緑オフ *緑赤青信号は白黒モニタでは濃淡になる
d6:赤 1=赤オン 、0=赤オフ 111(明るい) <−> 000(暗い)
d5:青 1=青オン 、0=青オフ
d4:G 1=グラフィック、0=キャラクタ
d3:1
d2:0
d1:0
d0:0
カラー通常指定(d3=0)
d7:G 1=グラフィック 、0=キャラクタ
d6:V 1=バーチカルライン オン、0=バーチカルライン オフ
d5:U 1=アンダーライン オン、0=アンダーライン オフ
d4:O 1=オーバーライン オン、0=オーバーライン オフ
d3:0
d2:R リバース ビデオ (Z2)
d1:B ブリンク (Z1)S=1の時 無効
d0:S シークレット (Z0)
Z2〜Z0
111:リバースシークレット
110:リバースブリンク
101:リバースシークレット
100:リバース
011:シークレット
010:ブリンク
001:シークレット
000:ノーマル
特殊制御コード
ノントランスペアレント、トランスペアレント共に指定でき
2バイトのデータを指定します
<第1バイト>
d7:1 または 0
d6:1
d5:1
d4:0
d3:0
d2:0
d1:0
d0:0
<第2バイト>
d7:0
d6:0
d5:0
d4:0
d3:0
d2:I 1=特殊制御文字を検出時に割込み、ステータスNを1にする
d1:V 1=特殊制御文字を検出時から最終行まで表示停止
d0:D 1=特殊制御文字を検出時から最終行までDMA停止
使用ポート
050H:パラメータ入出力
051H:コマンド入出力(ICWまたはOCWn)
ICWコマンド
CRTCのイニシャライズ(設定)を行います。
まずポート051Hに000Hを出力(ICW:RESETを実行)、
DMAの設定してから ポート050Hにパラメータ
(ICW SCREEN FORMAT1〜5)を順にデータを書き込みます。
OCW3の割り込みのマスクを設定したらDMAを実行するようにして
OCW2のDISPLAY STARTを行います
最後にポート040Hのd3を0(/CLDS)にして設定終了です
ICW:RESET
DMAアンダーライン(1行表示期間中にDMA転送が終了しない)以外の原因による
割り込みDMA要求が停止されVSP出力がアクティブになり
パラメータ(ICW:SCREEN FORMAT)書き込みが可能になります
d7:0
d6:0
d5:0
d4:0
d3:0
d2:0
d1:0
d0:0
ICW:SCREEN FORMAT1(パラメータ)
画面構成、同期信号幅、特殊文字、DMA制御の設定を行います。
d7:C/B 1=DMAキャラクタモード、0=DMAバーストモード
d6:H6
d5:H5
d4:H4
d3:H3
d2:H2
d1:H1
d0:H0
DMAバースト モード:1行分のデータを1度にDMA転送する
DMAキャラクタモード:1文字ごとにDMA転送
H6〜H0:1行に表示する文字数を設定します(000H〜04EH)
n文字分表示するにはn−2を設定します。
PC−8001は常に80文字で使用し、
字際の40文字の切り換えはポート030Hのd0を使用
80文字以上の値の指定は禁止されています
ICW:SCREEN FORMAT2
d7:B1 B1〜B0 ブリンキング指定時間
d6:B0
d5:L5 L5〜L0 行数指定
d4:L4
d3:L3
d2:L2
d1:L1
d0:L0
B0〜B1:ブリンキングのタイミングを設定します。
カーソルブリングの明暗時間の比率は1:1、
アトリビュートブリンクの明暗時間の比率は3:1
00=カーソルブリング 16、アトリビュートブリング 32
01=カーソルブリング 32、アトリビュートブリング 64
10=カーソルブリング 48、アトリビュートブリング 96
11=カーソルブリング 64、アトリビュートブリング 128
L5〜L0:行数指定
画面に表示する行数を設定します。
m行分表示するにはm−1を設定します。
000000:01行/画面
000001:02行/画面
|
010011:20行/画面
|
011000:25行/画面
|
ICW:SCREEN FORMAT3
d7:S 1=1行おきの表示、0=通常表示
d6:C1 C1〜C0 カーソル表示モード
d5:C0
d4:R4 R4〜R0 ライン数/文字指定
d3:R3
d2:R2
d1:R1
d0:R0
S=1にすると画面上では1行おきの表示がなされます。
L5〜L0で行数指定を25行にすると1行から13行までが1行おきに表示されます。
C1〜C0:カーソル表示モード
カーソルの種類を指定します。
ただし。ライン数/文字指定を13以下の場合はアンダーラインの指定をしても
カーソル表示はされません。
00:ブリンキング無し、アンダーラインカーソル
01:ブリンキング有り、アンダーラインカーソル
10:ブリンキング無し、カーソル
11:ブリンキング有り、反転ブロックカーソル
R4〜R0:ライン数/文字指定
1文字のライン数(ラスタ)を設定します。
n’ライン/文字数の指定はn’−1を設定します。
200ライン/25行=8ライン/文字
200ライン/20行=10ライン/文字
400ライン/25行=16ライン/文字
400ライン/20行=20ライン/文字
00000:指定禁止
00001:指定禁止
00010:3ライン/文字
00011:4ライン/文字
|
00111:8ライン/文字
|
01001:10ライン/文字
|
11111:32ライン/文字
ICW:SCREEN FORMA4
d7:V2 V2〜V0 垂直帰線幅
d6:V1
d5:V0
d4:Z4 Z4〜Z0 水平帰線幅
d3:Z3
d2:Z2
d1:Z1
d0:Z0
V2〜V0:垂直帰線幅を行数単位で設定します(1〜8)
n行分指定は場合はn−1を設定します
VRTC = 水平周波数 ÷ (垂直周波数×1文字のライン数) − 1画面に表示する行数
000:1行
|
101:6行(20行モード)
110:7行(25行モード)
111:8行
Z4〜Z0:水平帰線幅を文字数単位で設定します(6〜33)
m文字分指定は場合はm−1を設定します。
HRTC = 発振周波数 ÷ (水平周波数×8) − 1行に表示する文字数
PC−8001、 200ラインの発信周波数 14.31818(MHz)
水平周波数 15.98(KHz)
垂直周波数 60(Hz)(実際には63.5?)
PC−8801、 400ラインの発信周波数 21.0526(MHz)
水平周波数 24.83(KHz)
垂直周波数 55(Hz)
200ライン:20行 水平帰線幅=32、垂直帰線幅=6
25行 水平帰線幅=32、垂直帰線幅=7
400ライン:20行 水平帰線幅=26、垂直帰線幅=2
25行 水平帰線幅=26、垂直帰線幅=3
00000:使用禁止
|
00011:使用禁止
11110:32
11111:33
ICW:SCREEN FORMAT5
d7:AT1
d6:AT0
d5:SC
d4:A4 A4〜A0 最大アトリビュート/行指定
d3:A3
d2:A2
d1:A1
d0:A0
AT1、AT0、SC アトリビュートおよび特殊制御文字モード
000:トランスペアレント白黒、 特殊制御文字=有効
001:アトリビュート無し、 特殊制御文字=無効
010:トランスペアレントカラー、 特殊制御文字=有効
011:指定禁止
100:ノントランスペアレント白黒、特殊制御文字=有効
101:ノントランスペアレント白黒、特殊制御文字=無効
110:指定禁止
111:指定禁止
トランスペアレントは文字エリアとアトリビュートエリアを分離
ノントランスペアレントは文字コードとアトリビュートコードを混在します
ノントランスペアレントはd7を文字かアトリビュートの区別に使うので
PC−8001では256キャラクタ使用の為トランスペアレントの指定を行います。
A4〜A0 最大アトリビュート数(1〜20)
00000:1個/行
00001:2個/行
10011:20個/行
11111:32個/行(最大20個の為、使用不可)
OCWコマンド
ICWと同様にポート051Hにコマンドを送り、
パラメータがあるコマンドならポート050Hにパラメータが送られます
OCW1:STOP DISPLAY(出力)
d7:0
d6:0
d5:0
d4:0
d3:0
d2:0
d1:0
d0:0
ICWコマンドと同じです。(パラメータを書き込まない)
DMAアンダーラン以外の原因による割り込み要求、DMA要求が停止
VSP出力がアクティブになり、画面表示がされません。
OCW2:START DISPLAY(出力)
d7:0
d6:0
d5:1
d4:0
d3:0
d2:0
d1:0
d0:DM 1=反転表示、0=通常表示
DMAアンダーランによる割り込み要求、ステータスをクリアして
DMA要求を可能にして画面表示の開始を行います。
また反転表示は全ての画面を反転します。
OCW3:SET INTERRUPT MASK(出力)
d7:0
d6:1
d5:0
d4:0
d3:0
d2:0
d1:MN 1=特殊制御文字の割り込みの無効、0=特殊制御文字の割り込みの有効
d0:ME 1=画面終了時割り込みの無効 、0=画面終了時割り込みの有効
CRTCによる割り込み要求のマスクの指定を行います。
DMAをオートロードモードで使用している場合はMN=1、ME=1にします。
OCW4:READ LIGHT PEN(出力)
d7:0
d6:1
d5:1
d4:0
d3:0
d2:0
d1:0
d0:0
パラメータ(入力)
d7:HR
d6:CH POS
d5:CH POS
d4:CH POS
d3:CH POS
d2:CH POS
d1:CH POS
d0:CH POS
d7:0
d6:0
d5:ROW POS
d4:ROW POS
d3:ROW POS
d2:ROW POS
d1:ROW POS
d0:ROW POS
ライトペン入力信号が入力されたときの座標を読み込みます。
このコマンドの実行後にライトペン検出スターテスが0になります。
ライトペン信号が帰線時間中に入力された場合はHR=1になります。
また、このコマンドを使用した場合ライトペンのタイミング補正をソフトで行う必要があります。
OCW5:LOAD CURSOR POSISITION(出力)
d7:1
d6:0
d5:0
d4:0
d3:0
d2:0
d1:0
d0:CM 1=カーソル表示をする、0=カーソル表示をしない
パラメータ(入力)
d7:0
d6:CH POS
d5:CH POS
d4:CH POS
d3:CH POS
d2:CH POS
d1:CH POS
d0:CH POS
d7:0
d6:0
d5:ROW POS
d4:ROW POS
d3:ROW POS
d2:ROW POS
d1:ROW POS
d0:ROW POS
カーソル表示の指定を行い、カーソル位置を取得します
CM=1に設定した時点で次のパラメータを設定しなくても
DMA転送が行われる可能性があるのでカーソルが意図しない所から現れる(誤動作)場合があります。
誤動作を回避するにはDMA期間外で設定する必要があります。
つまり画面終了割り込みかVRTCのチェックをして垂直帰線期間が始まった直後に設定する事になります。
OCW6:RESET INTERRUPT(出力)
d7:1
d6:0
d5:1
d4:0
d3:0
d2:0
d1:0
d0:0
DMAアンダーラン以外の割り込み要求、ステータスのN、Eをクリアして
DMA要求を有効にします。
OCW7:RESET COUNTERS(出力)
d7:1
d6:1
d5:0
d4:0
d3:0
d2:0
d1:0
d0:0
内部カウンタ・リセットを1文字区間分発生して、内部カウンタを全てクリアします。
OCW8:READ STATUS(入力)
d7:0
d6:0
d5:0
d4:VE
d3:U
d2:N
d1:E
d0:LP
CRTC内のステータスフラグです。
DMAアンダーランが発生した場合U=1にして割り込み要求を発生し、VE=0にして表示を停止させます。
VE:Video Enable
1=Start Display
0=Reset or Stop Display またはDMAアンダーラン発生
U :DMAアンダーラン
1=DMAアンダーラン発生
0=Start Display
N :特殊制御文字による割り込み、割り込み要求出力がアクティブ
1=特殊制御文字による割り込み発生
0=Reset Interrput 、Reset Stop Display、Reset Counter
E :表示終了の割り込みが発生
1=表示終了による割り込み発生
0=Reset Interrput 、Reset Stop Display、Reset Counter
LP:ライトペン信号
1=ライトペン信号
0=リード ライトペン
DMA
コントローラICは8257を使用
PC−8001ではCh2のみを使用しています。(CRTC用)
PC−8001mkII、PC−8801では
Ch0、Ch1が外部の拡張ポート(主にDMAタイプのFDD用)、
Ch2がCRTC用になります
またN、N80 BASICではオートロード・モードで使用する為、
Ch2しか使用しません
オートロード・モードでは一垂直画面ごとに
DMAアドレスのロード、プリセットが行われます
060H Ch0 DMAアドレス・セット (拡張用スロットバス)
d7:A7
d6:A6
d5:A5
d4:A4
d3:A3
d2:A2
d1:A1
d0:A0
d7:A15
d6:A14
d5:A13
d4:A12
d3:A11
d2:A10
d1:A9
d0:A8
061H Ch0 ターミナル・カウンタ・セット (拡張用スロットバス)
d7:C7
d6:C6
d5:C5
d4:C4
d3:C3
d2:C2
d1:C1
d0:C0
d7:Rd
d6:Wr
d5:C13
d4:C12
d3:C11
d2:C10
d1:C9
d0:C8
Rd=0、Wr=0 DMA ベリファイサイクル
Rd=0、Wr=1 DMA リード サイクル
Rd=1、Wr=0 DMA ライト サイクル
Rd=1、Wr=1 使用禁止
062H Ch1 DMAアドレス・セット (拡張用スロットバス)
Ch0と同様
063H Ch1 ターミナル・カウンタ・セット (拡張用スロットバス)
Ch0と同様
064H Ch2 DMAアドレス・セット (VRAMアドレス)
Ch0と同様
065H Ch2 ターミナル・カウンタ・セット (オペレーション+VRAMの大きさ)
Ch0と同様
066H Ch3 DMAアドレス・セット (未使用)
Ch0と同様
067H Ch3 ターミナル・カウンタ・セット (未使用)
Ch0と同様
068H モード・セット またはステータス・リード
モード・セット
d7:AL 1=イネーブル オートロードモード、0=ディスイネーブル オートロードモード
d6:TCS ターミナル・カウンタ ストップ
d5:EW エクステンドライト
d4:RP ローテション・プライオリィテイ
d3:EN3 1=イネーブル DMA Ch3、0=ディスイネーブル DMA Ch3
d2:EN2 1=イネーブル DMA Ch2、0=ディスイネーブル DMA Ch2
d1:EN1 1=イネーブル DMA Ch1、0=ディスイネーブル DMA Ch1
d0:EN0 1=イネーブル DMA Ch0、0=ディスイネーブル DMA Ch0
ステータス・リード
d7:0
d6:0
d5:0
d4:UP
d3:TC3
d2:TC2
d1:TC1
d0:TC0
PEN STICK
ライトペン回路を応用したジョイスティックで白黒CRT IFがある機種なら
全て利用可能となっています(4方向、1トリガー)
<例> 広告のサンプルより
LD A,060H ;OCW4
LD (051H),A
IN A,(050H)
IN A,(050H) ;ジョィステックの内容
PC−8001のコーナへ
Home へ戻る