2014年6月4日水曜日

ATmega1284P

AVR側のロジックを書いてみる
パソピアのCSEL2をAVRのINT1に接続して、外部割込みでロジックを書いてみた。

OUTとIN命令を続けて実行すると、以下のようになった


MRAMアクセスのロジックなどいれず、単純に0を返答しているだけだが、後半のIN命令がギリギリのタイミングになっている。
CRDの場合に、MRAMの値を返答するようなロジックを入れると、間違いなくオーバーする。

原因は、外部割込みが発生してから処理が実施されるまで、最低で4clockかかること。更に、その前に実行中の命令によっては、4clock以上の待ちが発生してしまう場合がある。

そこで割り込みを諦めて、ポーリングでCSEL2待ちすることで4clockの待ち時間を減らすようにする
RAMPAC_SCAN_POLLING:
  sbic _SFR_IO_ADDR(PIND), PD2 ; PD2=0(CSEL2=Low)でスキップ ; clock=1/2,3
  rjmp RAMPAC_SCAN_POLLING ; RAMPAC12_SCAN_POLLINGへ戻る ; clock=2
  sbic _SFR_IO_ADDR(PIND), PD3 ; PD3=0(CRD=Low)でスキップ ; clock=1/2,3
  rjmp RAMPAC_NOT_READ_DATA ; RAMPAC12_NOT_READ_DATAへ ; clock=2

RAMPAC_READ_DATA:
  ;PD2=0(CSEL2=Low)でPD3=0(CRD=Low)の場合 = PasopiaのIN命令
  ・・・

RAMPAC_NOT_READ_DATA:
  ;PD2=0(CSEL2=Low)でPD4=0(CWR=Low)の場合 = PasopiaのOUT命令
  ・・・
これで、若干のロジックを入れても、IN命令の応答が間に合うようになった。
AVRのロジックでIN命令が間に合うことが確認できたので、40pin DIPソケットの横につけていた8bitバスバッファ(541)を外した

OUT &H18(下位アドレスセット)の場合、MRAMのA0-A7に接続されている574の8bitをラッチする
OUT &H19(上位アドレスセット)の場合、MRAMのA8-A15に接続されている574の8bitをラッチする
アドレスをラッチした後、MRAMから該当アドレスのデータを取得して、PortAの8bitにセットしておく。
IN命令が来た時には、PortAをOutputに切り替え、CSEL2がHighになったらPortAをInputに戻す
これで16bitアドレスのメモリ領域(64KByte)を制御できる。

MRAMの容量は128KByteなので、バンク切り替えできるようにする。
MRAMの最後のアドレスピン(A16)は、AVRのD7ピンから制御できるようにする

パソピア7は、PAC拡張ユニットを2つ接続して、PAC2スロットを7つまで拡張できる
(広告には64KBのRAM PAC2も記載されているが見たこと無い。。本当に発売されたのだろうか。。)

7スロット中、どのスロットのRAM PAC2を利用するかは、パソピア7のSLOT命令で指定する
SLOT [R1], [R2], [K], [J]
 [R1] : RAM PAC2 #1が装着されるスロット番号。ドライブ5で利用される
 [R2] : RAM PAC2 #2が装着されるスロット番号。ドライブ6で利用される
 [K] : 漢字ROM PACが装着されるスロット番号
 [J] : ジョイスティック装置が装着されるスロット番号
デフォルトは、SLOT 4, 3, 2, 1

スロット番号は、OUT &H1Bで指定される
OUT &H1Bで書き込まれたデータの7bitが0の場合、0-2bitの値がスロット番号となる。

OUT &H1B, 4の場合、スロット4が指定されたことになるので、ドライブ5で利用されるMRAMアドレス(A16=Low)を指定する
OUT &H1B, 3の場合、スロット3が指定されたことになるので、ドライブ6で利用されるMRAMアドレス(A16=Low)を指定する
これで、ドライブ番号を5 or 6を指定することで、MRAMの領域を切り替えるようになった。
初代パソピアは、ドライブ5までしか用意されていないので、ドライブ6を使いたい場合はOUT &H1B,3を直接叩いた後、FILES/LOAD/SAVEを呼ぶ必要がある

0 件のコメント:

コメントを投稿