2014年6月8日日曜日

RAM PAC2フォーマット

出来上がったMRAMのRAM PAC2をパソピア7に接続して、本体付属のテープにあるフォーマットツールをかけてみた


ちゃんと64KByteと認識して、フォーマットが終了

フォーマット後、FILESでファイルを確認すると問題なし。
しかし、SAVEでファイルを書き込もうとすると、「?DF Error」で終了する
MRAMに何が書き込まれたのか、ダンプしてみた。

フォーマット後の先頭16バイトを、他の容量と比較してみる。
000102030405060708090A0B0C0D0E0F
64KB (?DF Error)AA1F0800048000020708020610000000
32KBAA1F0400048000010404010308000000
16KBAA0F0400044000010404010308000000
8KBAA070400042000010404010308000000
4KBAA030400041000010404010308000000
やはり64KBのみ色々変わっているので、この辺に原因がありそう。。

初代パソピアのフォーマッタから、各アドレスの意味を予測してみる
アドレス変数式/値
00
0x00 :初代パソピア
0xAA :パソピア7
01最大トラック数0x03 :4KB
0x07 :8KB
0x0F :16KB
0x1F :32KB
0x1F :64KB
0x3F :128KB
0x7F :256KB
0x7F :512KB
0x7F :1MB
0x7F :2MB
0x7F :4MB
02セクタ数0x04 :4KB
0x04 :8KB
0x04 :16KB
0x04 :32KB
0x08 :64KB
0x08 :128KB
0x08 :256KB
0x10 :512KB
0x20 :1MB
0x40 :2MB
0x80 :4MB
03両面0固定
04クラスタトラック128/(最大トラック数+1)
※但しセクタ数以下
05クラスタ数クラスタトラック×(最大トラック数+1)
06DIRトラック0固定
07クラスタサイズセクタ数/クラスタトラック
08FAT先頭FAT終了-FAT数+1
09FAT終了セクタ数
0AFAT数0x01:セクター数が1-4の場合
0x02:セクター数が5-8の場合
0x03:セクター数が9以上の場合
0BDISK情報FAT先頭-1
0Cモディファイカウントセクタ数×2

64KBフォーマットの場合、32KB以下に比べてセクタ数が倍になっており、それに応じてFAT情報なとも変わっている様子。

MRAM本体側の問題であることも捨てきれないので、エミュレータとを改造して試してみたところ、実機と同じように?DF Errorになった。
T-BASIC1.0/1.1、T-BASIC7、いずれも同じ結果。

MRAMのRAM PAC2にこのフォーマットを書き込んでおくと、32KBに制限されるがBASICでの読み書きが出来たので、MRAM側は問題なさそう。

32KBのフォーマットは、以下の通り。
アドレス000102030405060708090A0B0C0D0E0F
0000-000FヘッダAA1F0400048000010404010308000000
0010-001F00000000000000000000000000000000
0020-021FディレクトリFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
0220-02FF属性00000000000000000000000000000000
0300-030FFATFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFF
0310-037FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
0380-03FF00000000000000000000000000000000
0400-7FFFデータ領域00000000000000000000000000000000

つづく

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を呼ぶ必要がある