2016/05/20

オールBASICでSCSI

FDDのようなシビアなタイミング等は皆無で、BASICのみで制御が可能です。のんびりと処理をやっても、全てMB89352が対応してくれます。

HuBASICでSCSI制御をしたときのプログラムの一部です。

まず、セレクション。
変数TARGETに、セレクションしたいデバイスのIDを設定します。
1440 OUT PCTL,&H0               'START Selection Phase
1450 WAIT SSTS,&B11110000,&B11111111
1460 OUT SCTL,(INP(SCTL) OR &B10000)    'Arbitration Enable
1470 OUT TEMP,(INP(BDID) OR 2^TARGET)
1480 OUT TCH,&HF
1490 OUT TCM,&H46
1500 OUT TCL,&H4
1510 OUT INRS,INP(INRS)
1520 OUT SCMD,&B100000          'Command Code = Select
1530 WAIT INRS,&B10100
1540 R=INP(INRS):OUT INRS,INP(INRS)
1550 IF R<>&B10000 THEN PRINT"Selection Error[";BIN$(R);"]":GOTO"ERR"
"INRS"はMB89352のINTSです。BASICの予約語とぶつかり"INTS"に出来ないため。

バス制御は全てMB89352がやってくれるので、BASICではその結果を見ているだけです。


データイン動作は、変数TLENに転送バイト数、変数MBASEに読み込むメモリのアドレスを入れます。
1810 OUT TCH,0
1820 OUT TCM,(TLEN AND &HFF00)\&H100
1830 OUT TCL,TLEN AND &HFF
1840 WAIT PSNS,&B10000000       'REQ待ち
1850 IF (INP(PSNS) AND &B111)<>&B1 THEN PRINT"Data In Phase Error":GOTO"ERR"
1860 OUT PCTL,&B1               'Set Data In Phase
1870 OUT INRS,INP(INRS)
1880 OUT SCMD,&B10000100        'Command Code = Transfer
1890 WHILE (INP(SSTS) AND &B11110000)<>&B10110000
1900 WEND
1910 FOR X=1 TO TLEN
1920   WAIT SSTS,&B1,&B1
1930   POKE MBASE+X-1,INP(DREG)
1940 NEXT
1950 WAIT INRS,&HFF
1960 R=INP(INRS):OUT INRS,INP(INRS)
1970 IF R<>&B10000 THEN PRINT"Data In Error[";BIN$(r);"]":GOTO"ERR"
SSTSを見て、FIFOバッファが空でなければDREGからデータを受け取ります。 この1バイト受け取るために、SSTSを監視する方法は非常に遅く、『まずい!ぶっ壊れたか?』と思わせるくらいのインパクトがあります。

高速化したい場合には、SSTSのバッファフルを見て8バイト毎転送するようにすると良いです…とは言うものの、BASICでの高速化は意味がありません…素直にマシン語かDMAで。

2016/05/14

動作確認

配線が正しければ、余程の事が無い限り動作するはずです。

ここでいう余程の事とは、
  • MB89352が壊れている
  • X1turboの拡張スロットが壊れている
です。

動作の確認で起動するBASICは、I/Oポートを操作するだけなのでCZ-8FB02である必要もなく、DMAを使用しないBASICの方がある意味安心なので、CZ-8FB01を用います。

X1turboの電源を入れ、IPL画面が出たらMB89352とPLDを触って発熱していない…たぶん大丈夫

まず、BDID を設定。BDID は書き込んだ値(0~7の範囲)が、読み出し時にはビット位置となって反映されるため、MB89352の動作をみるには都合が良いいぞ。
OUT &HF70,0:PRINT INP(&HF70)
この時、BDIDのビット0がセットされるため、正常であれば「1」が表示されます。
OUT &HF70,5:PRINT INP(&HF70)
同様に、BDIDのビット5がセットされるため、正常であれば「32」が表示されます。

ここまで正常ならば、MB89352へのアクセスは問題無し。


次に、SCSIバスの方を確認。

SCSIバスの制御線状態はPSNSに反映されるので、このレジスタを連続して読み出すプログラムを走らせ、I/O や MSG 等を GNDと直結してみてレジスタ値の変化で確認。データバスはチェック方法が思いつかなかったので未確認。制御線は読めているし、後は何かSCSI機器を接続してみることに。

2016/05/11

製作開始から完了まで

とくに難所はありませんが、意外と部品配置が最大の難所です。

配線が終われば配線チェックをしますが、大したことはしません。

『回路図通りか?』

これをやるだけです。電源のショートにだけは、十分に注意。

極力、配線量を減らした構成なので、意外と早く終わってしまいますね。

2016/05/04

製作前にする事

X1用ユニバーサル基板MCC-153に実装しますが、この基板には大きな問題点があります。

この基板を持っている人ならば、誰もが感じたことがあるのではないでしょうか。
なんで力一杯押し込まないと拡張スロットに入らないんだろう?
それは、カードエッジが本体後方から見て左側に2mm程ずれて作られているためです。この基板を力任せに押し込んでしまった場合、ガイドレールが歪みコネクタには異常な力が加わり、短時間では破損に至らないまでも、極めて危険な状態です。

ということなので、拡張スロットを壊さないためにも基板の修正を行います。修正と言ってもカードエッジ部をずらす事は不可能なので、ずれている分だけ基板の外周を削ります。

削る側は『1 5 10 15 20 25 30 35 40』とハンダ面にあります。この『10 15 20 25 30 35 40』の一の位が半分無くなる程度まで削ります。削り過ぎると拡張スロットに挿入した際ガイドレールから脱落してしまうので、様子を見ながら削ります。

それと、この基板の謎として、カードエッジそばの表示があります。部品面には23~44、ハンダ面には1~22という表示があるのですが、X1の拡張スロットのピン番号と全く関係がありません。しかも、1~22の並びは、X1の拡張スロットのピン番号とは正反対という罠の様な事になっています。一体、何のための番号なのでしょう。兎に角、謎の多い基板です。

2016/05/03

回路設計・その4

ということでGAL16V8を用いるとTTL ICはすべてなくなり、次の回路となります。

最終的な部品は次の通りです。
  • X1用ユニバーサル基板MCC-153
  • MB89352
  • GAL16V8(互換品可)
  • 8MHzのオシレータ(TTL出力で5~8MHzならなんでも)
  • ICソケット(今回、唯一の新規購入品が48ピンソケット)
  • SCSIの終端抵抗(X68030から取り外した物)
  • ショットキーバリアダイオードと、ヒューズ(ポリスイッチ)的な部品
  • 基板用D-Sub25ピン・レセプタクル
  • 220μF(100μFでもいい。気分の問題ですが、電源用が良いね)
  • 100μF(こいつも気分の問題。極端な話、無くても良い)
  • 0.1μF(適量)
以上です。

2016/05/02

回路圧縮

別の部品ケースにEPROMなんかと一緒に別の場所に保管してあったPLDを完全に見落としていました。これを用いれば、今回の様な簡単な回路は1チップで済む可能性があります。

ということで、信号をリストアップ。

入力
  1. AB11
  2. AB10
  3. AB9
  4. AB8
  5. AB7
  6. AB6
  7. AB5
  8. AB4
  9. EXIO
  10. IORQ
  11. BUSAK
  12. RESET
  13. MB89352 からの DREQ
出力
  1. MB89352 への CS
  2. MB89352 への RESET
  3. MB89352 への DACK
  4. EXRDY
と、これならばPLDのGAL16V8で余裕では…

2016/05/01

回路設計・その3

ぐぬぬ、LS30は買わないと無いぞ。

楽な配線ばかり考えていてはダメで、手持ち部品を活用する事も考えます。
LS138なら複数個のあるので…とはいえ、ちょっと変態的。アドレスデコードに部品点数が増えてしまいましたが、手持ち部品を用いてローコストも方針のひとつなわけで。

しかし、手持ち部品をちゃんと調べたために…