2014年7月19日土曜日

鎌力SFX買った

以前紹介した98ケースはCPU上にATX電源があり、排熱に問題があった。

今回は一回り小さい、SFX電源を購入。
Scytheの「鎌力GOLD SFX PLUG-IN (SPKRG-S500P)」

マザーボードの横に設置する。
但しこの電源、奥行きが130mmと少し長いので、HDDスロットと干渉したため、HDDスロットを削った

これで縦に収まるようになった。

今までATX電源があった部分には、8cmファンを設置する。
アルミ板を削って、ファン固定のプレートを作成

ファンをつけるとこんなかんじ

マザーボードは、今まで通りAsusのP5N-D

CPUクーラーは、CoolerMaster Hyper48。
ファンがうるさかったので、X-FANのRDL9025S-PWMに交換。
相変わらずファイルスロットととのクリアランスは無いが、以前に比べてCPU上のスペースは余裕ができた。

カバーをつけて完成
外見は以前と変わらないが、CPU(X3350)は冷えるようになった。

2014年7月6日日曜日

64KB RAM PAC2

無いと思っていた64KBのRAM PAC2を、オクで入手。
探してみると、あるもんだ。。
但し付属品はなく、本体のみ。

Pasopia700にセット。

MRAMと同じように、Pasopia7のフォーマッタでフォーマットする。
64K bytesと認識されているが、save命令はやはり?DF Errorが出てしまった。

付属品を持っていないので推測になるが、64KBのRAM PAC2には専用のフォーマッターが付いていたのではないだろうか。。このままだと使えない。。
BASICのパッチが付属していた可能性もあるが、まずはフォーマッターを疑ってみる。

64KB RAM PAC2の場合、トラック数は32KBと同じ1Fh(31)になり、セクタ数が倍の8になり、クラスタ数は2となる。はず。
もしトラック数を3Fh(63)にすると、クラスタ数の最大がFFh(255)となるが、FATのNEXTクラスタ番号では、C1h~C4hが最終クラスタと定義されているので、問題が出そう。
なので、フォーマット結果が示すように、トラック数そのまま、セクタ数・クラスタ数が倍になる。はず。
では、FAT領域側に問題があると考え、08h~0Bhの設定を32KBと同じにした。
000102030405060708090A0B0C0D0E0F
64KBAA1F0800048000020404010310000000
64KB (?DF Error)AA1F0800048000020708020610000000
32KBAA1F0400048000010404010308000000
16KBAA0F0400044000010404010308000000
8KBAA070400042000010404010308000000
4KBAA030400041000010404010308000000

この設定で64KB RAM PAC2に書き込みしてみると、、、書けた!

 RAM PAC2の先頭256バイトをダンプすると、こんなかんじ。

MRAMでも、このフォーマットでBASICファイルの読み書きができることを確認した。
全てをチェックしたわけではないので問題が残っている可能性もあるか、64KB x 2のMRAMは、以下のフォーマットで使おうことにする。
アドレス000102030405060708090A0B0C0D0E0F
0000-000Fヘッダ001F0800048000020404010310000000
0010-001F00000000000000000000000000000000
0020-021FディレクトリFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
0220-02FF属性00000000000000000000000000000000
0300-030FFATFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFF
0310-03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
0400-FFFFデータ領域00000000000000000000000000000000

絶妙なタイミングだったが、64KBのRAM PAC2が入手できたおかけで、MRAMの容量を最大限利用できるようになった。

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

2014年5月31日土曜日

MRAM

本家のRAM PAC2は電池でメモリ内容を保持するが、電池が切れるとメモリ内容が消えてしまうのが欠点。。
そこで、電池切れの心配がない不揮発メモリ、Everspin社のMRAM(MR0A08B)を使う。
容量は1Mbit(128KByte)、アクセスタイムは35ns
シリアルSPIだと、データ読み書きが間に合わないため、パラレルインターフェイスを選ぶ。

製作にとりかかる。
まずは、基板とソケットなどを準備

20pinコネクターを取り付け。

AVRはATmega1284Pを使うので、40pin DIP用のソケットを取り付ける
AVRは、定格最大の20MHzで動かすため、5Vのまま利用。
AVR出力側のピンと20pinコネクターの間に、8bitバスバッファ(541)を挟んでおく。

32-SOICのMRAMは、変換基板に乗せてDIPに
MRAMは3.3V動作のため、レギュレータも用意する。
AVRを取り外しやすいように、40pinソケットの上にZIFソケットを乗せる

アドレスラッチ用の574を2つ用意。(I/Oポート18h用と19h用)
AVRは5V、MRAMは3.3Vなので、5Vトレラントのチップを選択。
こちらも、DIP変換基板にのせる。

20pin用が売ってなかったので、28pin用の前後を削って20pin用にした。

MRAMとATmega1284Pの間に、信号の向きを制御するバス変換(245)と、8bitバスバッファ(541)を取り付け。これらも、5Vトレラントのを使う。
20pinのDIP変換基板を手に入れたので、こちらはそのまま利用。

5VトレラントICと、ATmega1284Pをのせるとこんな感じ。
16pin x 2列のソケットに、DIP変換されたMRAMが乗る

これで基板は一旦完成。

2014年5月26日月曜日

RAM PAC2を調べてみる

16KBのRAM PAC2を分解してみる。
ラベル面にはネジが2つ。1つはラベルに隠れているが、ラベルを破いて外した。
ラベルの無い方は、蓋を固定するネジを外す。
蓋は少し横にスライドさせてから持ち上げると取れる

コネクタ側にあるツメを少し押しながら開くと、蓋が外れる

基板を外すとこんな感じ
上がラベル面。
下が電池蓋のある面

基板にピン番号が書いてあるので、配線を追ってみると、ソケットとピンの番号は以下の様子

RAM PAC2の場合、I/Oポートは以下
I/Oポート
アドレス
リード/ライト内容CAD1CAD0
18hライトRAM PAC2 下位アドレス8ビットLowLow
19hライトRAM PAC2 上位アドレス8ビットLowHigh
1AhライトRAM PAC2 ライトデータ8ビットHighLow
1BhライトRAM PAC2 PIOコントロール8ビット
(RAM PAC2 4KBのみ必要)
HighHigh
18h - 1BhリードRAM PAC2 リードデータ8ビット

RAM PAC2のサイズとアドレスの関係は、以下


ロジアナで以下の挙動を計測
OUT 19h, 00h
IN 1Ah

ピンと信号線の関係も含めて、以下のようになった

CSEL2(14pin)がLowになった時点のCAD0(12pin)とCAD1(11pin)で、I/Oポートアドレスを判別できる。
OUT命令の場合はCWR(16pin)がLow、IN命令の場合はCRD(15pin)がLowになる。
パソピア側からみて、CDB0~7の8bitはOUT命令の場合はOutput、IN命令の場合はInputとなる。CAD1/CAD0,/CSEL2/CRD/CWRは、常にOutput。
OUT命令もIN命令も、CSEL2がLowの間隔は約600ns。
IN命令の場合、もう少し早いタイミング(500nsくらい?)でCDB0~7がInputされるので、その前にメモリ内容をパソピアへ返答をしなければならない。
また、OUT命令とIN命令の間隔は2usちょっとなので、OUT命令でアドレスをセットしたあと、IN命令でパソピアへ返答するまで、この間隔以内で処理をしなければならない。

8bitAVRを使う場合、1サイクル50ns(20MHz動作時)なので、結構ギリギリ。。

2014年5月24日土曜日

RAM PAC2を作ろう

PASOPIA/7にはPACスロット1と2のスロットが2つ付いている。
奥の44pinがPACスロット1で、手前の20pinがPACスロット2

PASOPIA700にはPACスロット2のみスロット化されている。

PACスロット2にはRAM PAC2や漢字ROM、ジョイスティックアダプタなどを利用できる。
RAM PAC2はメモリにデータを読み書きでき、電源をOFFしても電池でデータが保持されるため、ディスクのように外部メモリ装置として利用できる

東芝からは、4KB/16KB/32KBと3種類のRAM PAC2が用意された。下の写真は、4KBのパッケージ

カートリッジは、カセットテープのケースと同じくらいのサイズ。

PASOPIA700は横に差し込む
PASOPIA/7だとカートリッジのラベル面が手前だが、PASOPIA700だとラベル面が下面になる(電池蓋がある面が上向き)

どんな信号が出ているのかロジアナで調べるために、信号線を引き出すコネクタを作ってみた

パソピア7に、コネクターを挿してみる

RAM PAC2を挿すと、こんなかんじ

パソピア700は、こんな感じになる。
Bドライブは、挿入できなくなるが。。

コネクタに16KBのRAM PAC2を付けたまま、フォーマットしてみる
これくらいの信号線延長なら、問題なく使えそう