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 へ戻る