6532RIOTについて学ぶ

 6532の資料が少ない。


6502系のCPUを触ったり、AtariVCSとか触ったりすると出てくるこの6532RIOT。

日本語資料なんてもちろんないので、後の自分が楽できるように以下に仕様書を翻訳したものを書いていきます。どっかにあったらそっちを読むか、やっぱり公式資料読むのが一番いいと思います。
ちなみに私の英語力は3なのでクオリティはお察しです()

それでも日本語でwikiより詳しい内容は読めるので便利…なのかも?


【インターフェースシグナルの説明(割り込みピンとかの説明)】




Reset(RES)

システムをリセットしている際に、このピンにLOW信号を与えると6532の4つのI/O用内部レジスタをZEROにし、出力もZEROにセットします。これにより、すべてのI / Oバスが入力として機能し、システムがソフトウェア制御下で構成されている間、外部コンポーネントを起こりうる損傷や誤ったデータから保護します。

Read/Write(R/W)

CPUから6532にデータを読み書きするために使用します。HIGHなら読み込み、LOWなら書き込みを行います。

Interrupt Request(IRQ)

割り込み信号用ピン。基本は3kΩの抵抗でプルアップしておくことをお勧めします。
なお、6532側のIRQピンは、PA7の遷移またはインターバルタイマーのタイムアウトによってアクティブになる場合があります。

I/O Ports(PA0 - PA7,PB0 - PB7)
6532には16pinの周辺機器とやり取りができるI/Oポートがあります。
どのピンも個別にソフトウェアで制御ができ、入力または出力ポートとして制御できます。
これらの16ピンはPA0-PA7,PB0-PB7の各8bitのポートとして分割して制御することもできます。なお、PA7は特殊な用途があるため後程説明します。

データ方向レジスタに「0」を書き込むことにより、それぞれが入力として設定され、対応するビットが出力になります。
入力モードの場合、ペリフェラル出力バッファは「1」状態になり、内部プルアップデバイスはペリフェラルデータラインへのTTL一つ分未満の負荷として機能します。

I/Oポートの読み出し操作をすると、CPUはこれらの周辺ピンを読み出すことになります。
6532を通して周辺デバイスからデータを読み出す際、6532のデータレジスタにI/Oポートに入力されたデータを格納するため、CPUはこのレジスタにアクセスする形で情報を読み出します。

入出力の電圧は"1"のときに2.0v以上、"0"の場合は0.8v以下となります。周辺端子はすべてTTLコンパチブルで動作し、PB0-PB7のピンは1.5vを出力した場合3maまで電流を供給可能なダーリントン駆動となっております。

アドレスライン(A0-A6)
アドレスピンは7本あります。この7本の他に、RAM、SELECT、(RS)ピンがあります。AO-A6端子とRAM SELECT端子は、常にアドレス端子として使用されます。また、CHIP SELECTとして2本のピンがあります。CS1、CS2端子です。

【6532の内部構成】

R6532は、RAM、I/0、TIMER、割り込み制御の4つの基本セクションから構成されています。
RAMは、システム・データ・バスとアドレス・ラインを通じて、CPUと直接接続します。
I/0セクションは、2つの8ビットハーフで構成されています。
各半分には データディレクションレジスタ(DOR)とデータレジスタ(DR)です。

RAM -128 Bytes (1024 Bits)

128 x 8 bitの メモリは、従来のスタティック・メモリとして機能します。
CPUからRAMを選択するには、6532のピンを(CS1=1、CS2=0)およびRSをLOW(0.4V)に設定することで使用することができます。
アドレスIine A0~A6を使用して、データを記憶しているバイトを選択します。

I/0 Registers

Aポート側I/0ポートは,8本のラインから構成され,個別に入力または出力として動作するようプログラムすることができます。
データ方向レジスタ(DDRA)のビットに0(TTL_LOWレベル)を入力すると、Aポートの対応するラインは入力として動作します。逆に1、つまりTTL_HIGHにした場合は対応するAポートのラインが出力として動作します。
出力としてプログラムされたラインの電圧は、データレジスタ(DRA)の対応するビットで決定されます。

読み出し時には、データピンから直接データを読み出します。
どの出力ピンでも、ピンの電圧が2.4Vでロジック1の場合、プロセッサに転送されるデータはデータレジスタに含まれるデータと同じになります。
入力ラインでは、プロセッサはデータ・レジスタの対応するビットに書き込むことができることに注意してください。
DDRAの対応するビットがロジック1に設定され、I/Oラインが出力として機能するようになるまで、ピンの極性には影響しません。

B 側ポート入出力ポートの動作はA 側ポートの通常のI/0動作と同じです。 
各 8本のラインは、データディレクションレジスタ(DDRB)に0または1を書き込むことで、それぞれ入力または出力として動作するようにプログラムすることができます。
出力モードでは,周辺ピンの電圧はデータレジスタ(DRB)で制御されます。

AポートとBポートの主な違いは、これらのピンを駆動する出力バッファの動作にあります。
Bポート側の出力バッファは、1.5Vで3mアンペアを供給できるプッシュプル・デバイスです。
これにより、これらのピンは直接トランジスタ・スイッチを駆動することができます。
Bポート側を読む操作でCPUが適切なデータを読むことを保証するために、チップ内に十分なロジックが用意されており、CPUが「B'側を読む」操作を行うことができるようになっています。Aポートのように周辺ピンを読み出すのではなく、出力レジスタを読み出します。

PA7ピンによるエッジ検出

周辺I/0ラインポートピンとしてだけでなく。PA7 ラインは、エッジ検出入力として使用することができます。
このモードでは、アクティブな遷移は内部割り込みフラグ(割り込みフラグレジスタのビット6)を設定します。割り込みフラグをセットすると、IRQ出力がLowになり、PA7割り込みが有効になります。

PA7 のエッジ検出モードの制御は、4 つのアドレスのうちの 1 つに書き込むことで行います。
この動作では、A0がアクティブトランジションの極性を制御し、A1がプロセッサの割り込みのイネーブルまたはディセーブルに作用します。この動作の間、データバスに置かれたデータは破棄され、PA7の制御には影響しません。

PA7割り込みフラグは、ピンが通常の入力または周辺制御出力として使用されている場合でも、アクティブ遷移時に設定され ます。また、PA7 割り込みが無効になっている場合にも、アクティブな遷移でフラグがセットされます。リセット信号(RES)はPA7割り込みを無効にし、アクティブな遷移を負(high->low)にします。システムの初期化ルーチンの間、割り込みフラグは負の遷移によって設定することができます。
したがって、PA7からの割り込みを有効にする前に、割り込みフラグをクリアすることをお勧めします。PA7 割り込みフラグをクリアするには、単に割り込みフラグレジスタを読み込んでください。

Interval Timer(タイマー割り込み)

R6532のタイマー割り込みは、予備分周レジスタ、プログラマブル8ビットレジスタ、割り込みロジックの3つの基本部分から構成されています。

インターバルタイマーは、最大255個の時間間隔をカウントするようにプログラムすることができます。
各タイムインターバルは、1T、8T、64T、1024Tのいずれかを選択できます。
ここで言う「T」はシステムクロックの周期のことです。
フルカウントになると、割り込みフラグが論理 "1 "にセットされます。
割り込みフラグが立った後、内部クロックはシステムクロックでカウントダウンを始め、最大-255Tまでカウントダウンします。従って、割り込みフラグがセットされた後、タイマーを読み出すと、フラグがセットされてからの時間が最大255Tまで分かります。

8ビット・システム・データ・バスは、インターバルタイマとのデータ転送に使用されます。
52個の時間間隔をカウントする場合、0 0 1 1 0 1 0 0 というパターンが データバスを通して1分周のインターバルタイマレジスタに書き込まれます。
インターバルにデータを書き込むと同時に タイマ アドレス線A0,A1から1,8,64,1024Tのカウント間隔がデコードされます。
アドレス線A3は、リード/ライト時に、A3=1ならIRQを有効に、A3=0ならIRQを無効にします。 割り込みフラグが立つ前にタイマーをリードすると、残り時間間隔が51、50、49、等と読み取れます。

タイマーが次のカウントタイムで00000000をカウントすると割り込みが入り、カウンタは1 1 1 1 1 1 1 1を読み取ります。割り込みフラグがセットされた後、タイマレジスタはシステムクロックの "1 "倍でデクリメントされます。
割り込みフラグがセットされた後にタイマーを読み出し、1 1 1 0 0 1 0 0 を読み出した場合、割り込み発生からの時間は27Tとなります。読み出された値は2の補数ですが、割り込みはカウント1番で発生したことを覚えておいてください。従って、1を引かなければなりません。

読み取った値=1 1 1 0 0 1 0 0
コンプリメント = 0 0 1 0 1 1
ADD 1 = 0 0 1 1 1 0 0 = 28 2の等しい レジスタの補数
SUB 1 = 0 0 1 0 1 1 1 = 27

したがって、合計の経過時間を求めるには、タイマーに書き込まれた元の時間に2の補数を足すだけでよいのです。ここでは、0 0 1 1 0 1 0 0 1(=52)と書き込んだとします。8で割ると、割り込みまでの総時間は、(52×8)+1=417Tとなります。
割り込み後に読み込んだ値が1 1 1 0 0 1 0 0だったとすると、総経過時間は416T + 27T = 443Tとなります。

タイマにリードまたはライトでアクセスするたびに、割り込みフラグはリセットされます。
ただし、割り込み発生と同時にタイマーを読み出すと、割り込みフラグはリセットされません。
割り込みフラグが読み出された場合 (タイマはD7,D6はエッジディテクト)データバスラインD0-D5が0になります。

割り込みが発生した後にタイマーを読み出す場合、A3をLにしてIRQピンをディセーブルにする必要があります。
これは、次のWriteタイマ動作まで割り込みが入らないようにするためです。



Interrupt Flag Register

割り込みフラグレジスタは、タイマ割り込みフラグとPA7割り込みフラグの2ビットで構成されています。
割り込みフラグレジスタの読み出し操作を行うと、下図のようにビットがデータバスでプロセッサに転送されます。




PA7フラグは、割り込みフラグレジスタの読み出しが行われたときにクリアされます。
タイマフラグは、書き込みまたは読み出しのどちらかを実行した場合にタイマレジスタが読み出されるとクリアされます。

■|具体的なレジスタへのアクセス方法

まず、6532のレジスタは以下の5種類です。
  • Register A(ポートAレジスタ)
  • Register B(ポートBレジスタ)
  • DDR A (直にポートAに読み書き)
  • DDR B (直にポートBに読み書き)
  • Timer (タイマーカウンターを読み書き)
これらのレジスタへ書き込むにあたり、6532のアドレスバスA0-A2にアクセスして、疑似メモリ書き込みのようにしてコントロールします。

  • $0:ポートA側のレジスタを読み書き
  • $1:ポートA側のピンを直接読み書き?
  • $2:ポートB側のレジスタを読み書き
  • $3:ポートB側のピンを直接読み書き
  • $4:(割り込みタイマーOFFのとき)タイマーレジスタ読み取り
  • $4:エッジ検出モードを書き込み(ネガティブにすると、割り込みをoffにする)
  • $5:割り込みフラグを読み取れるレジスタ(bit7=timer,bit6=ポートAの七番ピンをエッジ検出)、ポートA7番ピンをクリア
  • $5:エッジ検出コントロールへ書き込み(ポジティブ、HIGHにするとインタラプト割り込みをoffに)
  • $6:エッジ検出コントロールへ書き込み(ネガティブにするとインタラプト割り込みをonに)
  • $7:エッジ検出コントロールへ書き込み(エッジ検出をポジティブに設定するとインタラプト割り込みをonに)
  • $C:(インタラプト割り込みonのとき)タイマー読み取り
  • $14: タイマーに書き込み。1に設定するとインタラプト割り込みをoff
  • $15:タイマーに書き込み。8に設定するとインタラプト割り込みをoff
  • $16:タイマーに書き込み。64に設定するとインタラプト割り込みをoff
  • $17:タイマーに書き込み。1024に設定するとインタラプト割り込みをoff
  • $1C: タイマーに書き込み。1に設定するとインタラプト割り込みをon
  • $1D: タイマーに書き込み。8に設定するとインタラプト割り込みをon
  • $1E: タイマーに書き込み。64に設定するとインタラプト割り込みをon
  • $1F: タイマーに書き込み。1024に設定するとインタラプト割り込みをon
すごく命令がダブっているような気がするのですが多分こう書いてあります。
あと、翻訳する際にタイマーの設定のところdivide by 1 とか書いてあったのですが、タイマーを1で割るってあるんですよ。あ、もしかして1刻みってことですかね。うーん、わからない。


その他制御等で更新できることがあった際には追記しますノシ

次の記事:

コメント

このブログの人気の投稿

ファミコンの完全自作ROM&カセットを作ろう!!その1~立ちはだかるコンパイラの壁~

ファミコンの完全自作ROM&カセット作ろう!〜cc65で起動ROMをつくる〜

74HC595を使ってarduinoの16ビットパラレル出力に挑んでみた