市販のものに比べ、内蔵SSDには情報が少ないので、一応書いておきます。

東芝Portege R600-108の搭載SSDは、デバイスマネージャ上では、TOSHIBA THNS128GE8BMDCとなっています。 これがまた、詳細な仕様がどこにもなく、どういったものなのか不明です。

SSDのモニタリングソフトを試してみたところ、動かなかったので、コントローラがJMicronのJMF602でないことだけは確かです。 まぁ東芝製ですから、ありえないでしょうけどね。

日本のDynabook SS RX2 T9G(G)なども同じかもしれません。

日本のマクドナルドにはありませんが、国によってはBaby Macというメニューもあります。

これがそのBaby Macだ! なんとかわいい、いや禍々しい?!

日本ではクォーターパウンダーが販売され始めて、買うために8時間並ぶなどという珍事も起きているようですが、アメリカなど国によってはレギュラーメニューとなっています。


ラッチを使ってZ80との入出力ができることがわかったので、修正した回路図です。 Webページに収まるようになるべく小さく描いたので見にくいのはご勘弁。


20081225-AVR_SD-OR3.PNG

う~ん、4075(3入力OR)は持ってないぞ。 32(2入力OR)ならあるんですが、効率が悪いんですよね。 4078(8入力OR)を使ってもいいですね。 ゲートの段数も少なくなってすっきりします。 こんな感じ。

20081225-AVR_SD-OR8.PNG

その場合、グランドになっている部分を変更することでA1までデコードできます。 AVRにA0だけしか入れられなくなるけど。 まだPCからのインタフェースは設計途上なのですが、一応下位のアドレスラインはデコードして使うかと思い、残してあります。

ゲートはすべてHCシリーズを想定しています。 Z80へデータを出力するときのみ、レベルあわせのために5Vを供給しています。 ちゃんとバッファICを使ってないけど、大丈夫かなこんなんで?

事実上、NORが1ゲートあまっている(4-5-6ピン)ので、必要ならA6~A2のどこかにNOT代わりに入れればI/Oアドレスを調整できますね。

今のところ最下位アドレス(0x00~0x03)を使う想定になっています。 AVRのI/Oが3本ほど余っていますが、外部クロックを使うことになったときに使うもよし、他の機器をコントロールするもよし。

...とりあえずデバッグLED用かな?


とりあえず、前回のテストは期待通りの動作をさせることができました。 原因はあちらこちらの断線でした。

UEWを使っていて、しょっちゅう回路を変更するものだから、そのたびに線をいじったりしているうちに断線してしまっているのでした。 直しては他の箇所が断線するいたちごっこ状態。 こんなんじゃ先が思いやられるなぁ。

ちょっと面白かったのは、LS373の電源(Vcc)が断線していたときのことです。 入力端子の電圧が3.3V程度あり、そのときの出力端子の電圧が2.3Vくらいあるんですね。 もちろんVccがないので出力コントロール(^OE)が利かず、バス直結のラインにその電圧を出力していたわけですが、なぜかPC側本体側は暴走しませんでした。 本体側でデータバスがぶつかってるのに。

どうも、拡張スロットへのデータバス入出力にはLS245または他のバッファが接続されているようです。 拡張メモリを使っていない状態だったため、拡張スロットへの入出力がこの実験用回路に向けたもののみだったのが幸いしたのでしょう。

今回はPC側から見て入力のみを実験しましたが、同じ手法で出力もできます。 というか、出力のほうが楽(あらかじめデータを用意しなくていいから)ですね。 また回路変更で断線しまくりそうで怖いですが。

さて、そうなると次はSDカードのアクセスか...。

I/O回路の要求には高速応答性が必要で、到底AVRの割り込み反応時間では間に合わないことがわかったので、バッファを入れる実験をしました。

例により、簡略化した回路です。 手持ちのラッチがLS373しかなかったので、電圧が混在しています。

20081221-Test.PNG

プログラムのほうは、なんかoutしたら、そのタイミングでデータを出力し、inで読めるようにしてみました。単純にデータをインクリメントしているだけです。

.org	0
	rjmp	RESET
	rjmp	INT_IN
	rjmp	INT_OUT
INT_IN:
	inc		Data
	; buffer input close
	cbi		PORTB, 1
	reti
INT_OUT:
	; output data
	mov		Temp, Data
	ori		Temp, 0x40
	out		PORTC, Temp
	mov		Temp, Data
	ori		Temp, 0x3f
	out		PORTD, Temp
	; load data to the buffer
	sbi		PORTB, 1
	reti
RESET:
	ldi		Temp, low(RAMEND)
	out		SPL, Temp
	ldi		Temp, high(RAMEND)
	out		SPH, Temp
	ldi		Data, 0x00
	ldi		Temp, 0x12
	out		DDRB, Temp
	ldi		Temp, 0x3f
	out		DDRC, Temp
	ldi		Temp, 0xc0
	out		DDRD, Temp
	ldi		Temp, 0x0a
	out		MCUCR, Temp
	ldi		Temp, 0xc0
	out		GICR, Temp
	sei
LOOP:
	rjmp	LOOP

とりあえずの「データを読ませる」という結果としては良好です。 AVRからのデータらしきものがPC側から読めています。

ただ、なんかD0がふらふらする変な挙動です。 outしないでinし続けると0が入力され続けるはずなのに、ときどき1が混じります。 out/inを交互に繰り返すと、大部分が2回ずつ同じ値を読んで、次は2インクリメントします。

データラインがショートしたりているわけではなさそうなのですが、いまのところ原因はわかりません。接触が悪い可能性はありますが、直しても同じなのが謎。そこら辺から剥ぎ取ったラッチが変なのかも。

とりあえずラッチ意味があったということで勘弁しといてあげよう(弱気)。


秋葉原で、以前話題にしたグリーンハウスの1.8インチのIDE SSD発売になりましたね。

MLCならば32GBモデルのGH-SSD32GP-1Mが約1万円、64GBモデルのGH-SSD64GP-1Mが約2万円だそうで、安価です。速度はあまり速くないようですが、1.8インチのHDDのスピードもかなり遅いのでそれほど悪い選択肢ではなさそうです。

ただし、残念ながら写真でもわかるとおりZIFタイプですね。

本体サイズは長さが71mm。東芝タイプの1.8 インチHDDの長さは78.5mmですので、7.5mmほどのマージンがあります。でも、市販の変換基板(長さ24mm)をPC本体内に納める余地はちょっとなさそうです。

7.5mmというと、ほとんどコネクタ部分くらいの余裕しかないということでしょうね。

一応実測しました。おそらくDynabook SS RX2 T9GもしくはT9GGでもほぼ同じような性能になるのではないかと思います(DVDドライブ分が変わります)。

標準バッテリ(3セル、2900mAh)では、ライトな使い方(Webブラウジングやテキスト編集等)でほぼ3時間でした。
条件は以下のとおり:
  • ネットワークはワイヤレス、Bluetoothも利用
  • 新品状態から何度(10回程度)か充放電を繰り返したバッテリによる性能
  • Toshiba Power Saverの設定はほぼデフォルトで、残り5分でスタンバイする設定で、スタンバイまでの時間を計測。
まぁ、だいたい予想通りかな?
ご参考まで。

Z80からのI/O信号に対し、どのくらいでAVRによる割り込み反応が得られるのかを調査してみました。 回路は前回作ったものを使います。

PC-6001側からI/O命令を発行し、AVRの外部割込み入力をトリガにして反応を調べます。 まずは、主な信号線の様子。

20081214-INT0.PNG

ここで、INT0が活性化されている時間(A-B)は、630ns。

実行されているプログラムは以下のような感じです。

.org	1
	rjmp	INT_IN
INT_IN:
	sbic	PIND, 2	; 割り込み終了だったらInputへ
	rjmp	Input
	; omit...
Input:
	out	DDRC, r18
	out	PORTC, r19
	sbi	PORTB, 4
	reti

INT0は両トリガでの割り込みにしているのですが、 AVRの割り込みルーチンが反応するときには、INT0はHレベルになっているのか、常にInputルーチンへ飛びます。

上図にあるLEDという信号線は実際にはAVRのポートB4で、これがLからHになる(sbi PORTB, 4)まで2,040nsかかっています。 8MHzだと約16クロック分です。

割り込みへの反応速度を見るために、プログラムを少し変えてみました。

.org	1
	rjmp	INT_IN
INT_IN:
	sbi	PORTB, 4
	; omit...

割り込みがアクティブになってから、rjmpおよびsbiのみの実行です。 タイミングは以下のようになっています。

20081214-INT1.PNG

これで、LED(PORTB4)の変化までの反応時間は1,200nsでした。8MHzで9.6クロック分。 rjmpとsbiの実行時間4クロックを差し引くと、割り込みの反応に700ns(5.6クロック)ほどかかることになります。

ちなみに、割り込みをダウンエッジのみにして追試してみましたが、反応時間は1,160nsで、それほど大きな差はありませんでした。

これを、最初の図と照らし合わせると、INT0の活性化時間が700nsに満たないため、割り込みルーチン開始時にはどう足掻いてもI/Oには間に合わない、ということになります。

やはりどうしてもZ80とAVRの間にはラッチが必要ということになりますね。


以前出たような複数カードのストライピングで高速化&1.8インチ SSD化できないものか、ちょっと思考実験してみましょう。


サイズと容量について

現時点で、100円ショップでも売ることが可能な格安のmicro SDカードがあります。 こいつを10枚でも20枚でも使ってストライピングできないものでしょうか?

サイズ的には、1.8インチHDD/SSDの体積は

8.0 x 54.0 x 78.5 = 33,912mm3
  

となります(東芝製MK8007GAHデータシートより)。

一方、micro SDカードのサイズは、

11.0 x 15.0 x 1.0 = 165mm3
  

となります。

物理配置や基板、配線等を無視すれば、1.8インチHDD/SSDのスペース内にmicro SDは200個以上入ることになります。

実際にはソケットに入れる必要があるでしょう。 こちらの製品例では、ソケットの外形寸法は

13.7 x 15.3 x 1.4 = 293.454mm3
  

です。また、プッシュプル方式ではないですが、こちらのアダプタ

12.6 x 14.5 x 1.5 = 274.050mm3
  

と、さらに小さくなっています。

計算だけだとこれでもHDD/SSDに100個以上の体積を収められますが、現実的には無理でしょう。

実際には、最大限でもこんな感じじゃないかな?

20081213-MicroSD.png

縮尺はあわせてあります。 緑色のが基板部分で、斜め線のがmicroSDカードスロットです。 厚さを考えると裏側にも同じだけ装備できるので、計24枚入ります。

これで、2GBのmicroSDを使えば48GB。 メディア代がおよそ2,500円。 安い~!


マイコンは使えるか?

次はこれのコントローラです。

趣味の電子工作の範囲だと、SDカードの入出力は簡単に可能で、もっぱらストレージの主流ですね。 ただ、電子工作ではプログラムが簡単なSPIモードを使うため、SDカード側のクロック制限はおおよそ25MHz(約3MB/sec)となります。

また、AVRを使うとすると、最大周波数は20MHz、SPI入出力ではその半分のクロックが最大供給クロックなので、結局10MHzです。 すると、ビット単位の入出力なので1.25MB/secとなり、あまり高速ではありませんね。 PICの場合も最大動作周波数は20MHzのようなので、似たり寄ったりです。

でも、超小型のATtinyあたりを16個並列動作させて、1ビットごとに分散させればスピードも16倍(パラレルATAの信号は16ビット幅)。 これでやっと20MB/secだ~。

どうも、これらの簡単マイコンを使うソリューションはあまりうまくないですね。


もっと高性能なコントローラ?

組み込みCPUは非常に多種のものがあり、ハイパワーなものから小消費電力なものまで千差万別です。

でも、一般的に上記のマイコンよりはかなり高速であり、数100MHz程度のものも珍しくありません。 SHシリーズなんか結構いいかも? これなら、ストライピングしたSDカードを十分ドライブできそうです。


というわけで、技術的には十分可能そうではあります。 さて、誰か作ってくれないかなぁ??


レトロパソコンのインテリジェントな周辺機器を作るのに 大きな間違いに気づいてショックな今日この頃。 デコーダ・バッファは8255が入手困難な現在、手持ちのCPLD(Xilinx XC9536XL)があるのでそれでやってみようと思うのですが、困ったことにライタがありません。

ライタを作ろうにも、そのための部品が手持ちでは苦しいところです。 またしても鶏卵問題に陥りそうなのですが、悩んでいても埒が明かないので、とりあえずやれることからやってみることに。


まずは、テスト用に以前の回路を手直しして、以下のような簡単な回路を作ってみました。

20081213-Test.PNG

入出力に対応させてありますが、とりあえずそれは気にしないでin命令に応じてLEDを点滅させてみることにしました。

AVRのプログラムは以下のとおり。

.include	"m8def.inc"
.org	0
	rjmp	RESET
INTERRUPT:
	sbic	PORTB, 4	; 前回は点灯ならスキップ
	rjmp	LEDON
	sbi	PORTB, 4	; LEDを消灯
	reti
LEDON:
	cbi	PORTB, 4	; LEDを点灯
	reti
RESET:
	ldi	r24, low(RAMEND)
	out	SPL, r24
	ldi	r24, high(RAMEND)
	out	SPH, r24
	ldi	r24, 0x10
	out	DDRB, r24
	cbi	PORTB, 4	; 初期状態は点灯
	ldi	r24, 0x02
	out	MCUCR, r24	; 割り込みモード(INT0ダウンエッジ)
	ldi	r24, 0x40
	out	GICR, r24	; INT0割り込みイネーブル
	sei	      		; 割り込み許可
LOOP:
	rjmp	LOOP

LOOPでの無限ループ中に、割り込みがかかるとINTERRUPTルーチンが走ります(INT0のベクタアドレスに直接書いています)。 割り込み条件はINT0のダウンエッジです。

INT0は回路にあるように、IORQ | RD | A7 | A6なので、これらがすべて0のとき、すなわちBASICなどで

a=inp(0)
  

を実行すると点滅します。

ところが、不思議なことに放っておいても(BASICのテキストモードで何もしなくても)不規則に点滅します。

割り込みの条件から考えると、0x00~0x3fのI/Oリード要求により点滅するはずなのですが...。 何かおかしいんでしょうかねぇ。