エントリー

2022年07月の記事は以下のとおりです。

手作りSuper Serial Card

 AppleIIの最後の壁,巷にあふれるディスクイメージを実機で動かし,半永久的にAppleIIを動かし続けるという作戦は,簡単そうに見えて,なかなか高い壁です。

 この話の世界標準はADTProというツールです。PCやMacでJavaで書かれたこのツールを立ち上げておき,AppleIIでクライアントソフトを動かしてやると,PCに置かれたフォルダがAppleIIで一覧でき,読み書きが出来るようになるのです。

 長い歴史のあるツールなので様々な機能が実装されていますが,通信手段にも標準的なシリアル通信以外に,イーサーネットやカセットI/Fを使った音声にも対応する充実ぶりです。

 イーサーネットが高速で便利であることは言うまでもありませんが,AppleIIGSはともかく,AppleIIplusの時代にそんなものは一般的ではなく,おそらくApple純正の拡張カードなど存在しないでしょう。私もこれはパス。

 音声でもどうにかなるんじゃないかと試みましたが,我慢できないくらい遅いこと,エラーも起きやすいこと,そもそも音声での通信はProDOSでないとサポートしないことがあり,私が少し前に16kB拡張RAMカードを作ったのは,これが動機だったくらいでした。

 せっかくProDOSが動き,ADTProを音声で繋げることが出来たのに,遅くて使い物にならず,がっかりしたものです。

 その後,あるサイトで高速で安定した独自イメージをWAVファイルで配布されているのを発見し,こちらでしばらく遊んでいました。これ,2分ほどで140kBのイメージを転送でき,PCにもAppleIIにも特別なソフトがいりません。PCからはオーディオプレイヤーがあればよく,AppleIIでもBASICからLOADとやるだけです。

 ただ,この形式で配布されているものはまだまだ少ないですし,自分のディスクをこの形式で保存する方法がわかりません。

 ということで,結局ADTProを動かす必要からは逃れられませんでした。

 ADTProを使うために必要なものとして,シリアルインターフェースがあります。AppleIIcやAppleIIGSならなにも問題のないこのインターフェースですが,AppleIIplusやAPpleIIeには非搭載ですので,なんらかの手段でインターフェースを追加しないといけません。

 ADTProがサポートするインターフェースにはいくつかあるようなのですが,一般的なのは純正のSuper Serial Cardです。

 SSCと略されるこのカードは,最初期に登場したシフトレジスタだけで構成された単純なSerial Cardの後継で,6502ファミリのACIAである6551を中心に据えた多機能なものです。

 とにかくこれがないと始まらないわけですが,皆同じ事を考えているようで,SSCは値段が高めで推移しているようです。なにせ40年前の製品で現在は作られていませんから,中古で探すしかないわけですが,日本でも安くて5000円から,海外ではもう少し高いくらいの値段で取引されているようです。

 つい先日,そのSSCが安く手に入る機会があったのですが,うっかり買い逃してしまいました。ちょっと訳ありでしたが4000円ほどで買えたはずだったので,悔しい想いをしました。

 よろしい,ならば自作するまで。SSCは回路図も公開されているので,部品さえ揃えば自作可能です。ぱっと回路図を見ると結構複雑で,正直なところ失敗するかもしれません。

 まずは部品入手が現実的かどうかです。

 6551ACIAは,なんと通販で新品が買えます。先日手に入れたW65C02と一緒に,W65C51も買ってありました。お値段は1000円ほど。CMOSですし,互換性が心配ですがデータシートを見る限り問題はなさそうです。

 次,水晶発振子。6551は1.8432MHzの水晶発振子を直接繋ぐために,発振器と分周器を内蔵しています。ボーレートジェネレータって結構面倒くさいのですが,6551は良く出来ています。

 ですが,水晶発振子の周波数を決め打ちしているため,この周波数が手に入らないと手詰まりになります。幸いにしてW65C51のお店で7.3728MHzの発振子が安く買えました。これを1/4にして1.8432MHzを突っ込むことにします。

 次はROMです。SSCにはファームウェアが用意されていて,BASICやPASCALから叩けるようになっていますし,ターミナルモードへは特別なソフトなしに遷移出来ます。いわばBIOSのようなものですので,これは必須でしょう。

 容量は2kBと小さく,回路図でも32kBitを使っていますが,こんなものは入手出来ても書き込みが出来ません。ここは2764を使うことにします。え,中身はどうするの。ですか?中身はですね,一応マニュアルに公開されているのでそのまま使っていいという理解です。

 あとTTLです。一般的なものばかりと思って油断していたら,1つ見慣れない品番を発見しました。74LS279です。これ,RSフリップフロップです。RSフリップフロップってそういえばTTLにはないよなあと思ったのですが,こんなもの必要な場合はNANDゲート2つで作ってしまうようなものですし,需要も少ないのでしょう。

 さすがにこれは手持ちがありません。どこでも買えるものでもなさそうです。
ならば,ここは74HC00で作ることにしましょう。SSCの回路図でも,FFとして使っているのは4つのうち1つだけで,後はNANDやNOTの代用として無駄遣いしています。

 それからLS365とDIP-SWですか。LS365でDPI-SWを読み取る仕組みのようですが,6551に繋がっていませんので,6551の設定は完全にソフトでやっているはずです。ならばなんでDPI-SWがいるのかと思いますが,1つには過去のインターフェースとの互換性切り替えや,プリンタI/Fとして使う場合などの初期設定が必要なのでしょう。

 ADTProでは必要ないのですが,実物を見たことすらない初心者が意味も知らないで削除すると痛い目に遭いますので,ここは素直に残しておきます。

 あとはあれですね,RS-232Cのレベルコンバータです。これは入手は難しくありませんが,今さら3電源の1488/1489を使うのもなんですし,MAX232シリーズを使います。

 今回はTx/RxとRTC/CTSだけではなく,DTR/DSRやDCDも必要なので,送受信4つずつを持つMAX238を使います。都合良くこんなものが手持ちにあるのです。

 最後に基板。これが一番難しいかも知れません。50ピンのカードエッジコネクタ付きの万能基板ですが,以前16kB拡張RAMで使ったMSX用のユニバーサル基板では面積が足りない感じです。それにもう使い切ってしまいましたし。

 探してみましたがなかなか高価で,どれも決め手に欠けます。ならばと,実験用に買ってあったカードエッジコネクタだけの小さい基板を,大きめの万能基板に取り付けて使うことにしましょう。不細工ですし,厚みも出ますが背に腹は代えられません。

 基板は以前八潮の秋月で安く買った両面スルーホールの万能基板をカットして使います。ピンヘッダで結合すれば,AppleII用ユニバーサル基板を完成です。

 部品はなんとかなりそうです。次は回路図です。

 オリジナルの回路図をそのまま作るのも手ですが,今回は部品の変更もありますし,動かい場合のデバッグのことを考えて,ちゃんと回路図を理解しましょう。

 構成は簡単です。6551とDIP-SWのレジスタをI/Oに割り当て2kBのROMをメモリ空間にマッピングしてあります。あとはクロックを作って6551に突っ込み,6551からドライバを経てRS-232Cとして出してやれば完成です。

 I/OへのデコードはAppleIIらしく簡単で,6551へはDEVSELの反転,レジスタへはDEVSELとA3のORを取るだけでおしまいです。6551へはA0,A1,A2,A3も別の端子に突っ込みますので,例えばスロット2なら$C0A8から$C0ABまでの4バイトが割り当てられます。

 問題はROMです。これ,私は理解するのにちょっと手間がかかりました。

 まず,AppleIIでは,0を除くスロットに,256バイトのROM空間を割り当てていて,各スロットのI/OSELECTをイネーブル信号に使えます。例えばスロット2なら$C200から$C20Fまでの256バイトを占有できるのです。

 天才WozのフロッピーI/Fのように256バイトで済んでいる場合もありますが,ちょっと気の利いたことをやろうとすると256バイトでは足りません。でも,そのためにわざわざデバイスドライバをロードするのも面倒だという事で,やはり天才Wozは拡張スロットに大きなメモリ空間を割り当ててくれています。

 その大きさは2kバイト。256バイトに比べると8倍という広大さです。全部で64kバイトしかない6502のメモリ空間において,2kバイトとは破格の割り当てです。これを7スロット用意すると14kBとなり,しかもほとんど使用されない場合もあるわけで,この無駄をなんとかしないとWozは考えてくれました。

 まず最初に,この2kバイトはすべてのスロットで共有としました。これなら使わない場合でも2kバイトの無駄で済みます。しかし,2kバイトを分割して使うと最悪の場合1スロットあたり256バイトになってしまい,メモリが足りないという問題はなにも解決しません。

 ならば,と必要とするスロットに全部割り当てることを考えるのですが,それだと同時に差し込む事の出来る拡張カードの組み合わせが発生してしまいます。当然同時使用出来ません。

 そこでWozの天才っぷりっが発動します。まず,2KバイトのROMを$C800から$CFFFまでに割り当て,このアドレスをデコード信号としてI/OSTROBEを各スロットに用意しておきます。

 各スロットに割り当てられた256バイトのROMにアクセスすると,そのスロットのカードにあるフリップフロップがセットされます。

 このフリップフロップの出力とI/OSTROBEでそのカード上にあるROMをイネーブルしてやれば,$C800からの2kバイトに自分のROMがマッピングされます。

 こうして2Kバイトを占有できるわけですが,あいにく他が使っていたらどうしましょうか。大丈夫,256バイトの割り当てROMの先頭に,すべてのスロットにあるフリップフロップをリセットするコードを入れておくのです。

 リセットは$CFFFをアクセスすると行われるように回路を作っておきます。こうすると,自分が占有した場合でもリセットされますが,リセット直後に続けて自分のROMでコード実行すればフリップフロップはセットされ,2Kバイトのメモリが見えるようになります。

 だから,自分が使い終わった時に,そのエリアを自分で開放するということはしなくてもよいのです。

 え,自分が使っている最中に他からフリップフロップをリセットされたらどうするの,ですか?

 ご心配なく,それはありません。一種のバンク切り替えですのでこうした心配が出てくるのももっともなのですが,国産マシンに良くあるバンク切り替えはソフトだけで制御されている場合が多く,この場合ソフトがバンク切り替えをしないと,あるべきデータがそのアドレスにない,と言うことが起きてしまい,暴走します。

 しかしAppleIIの場合,このバンク切り替えは,CPUがそのスロットに専用に割り当てたROMをアクセスした時に自動的に切り替わります。リセットは別のスロットのROMがアクセスされたときに起きるわけですから,もう自分がこのエリアをアクセスすることは終わっています。

 確かにバスマスタが2つ同時に動くという特殊なシステムを作り,同時にアクセス出来るような仕組みがあったら破綻するでしょうが,AppleIIは40年前の8ビットマシンであり,そんな手の込んだ仕組みは用意されていません。

 欠点がないわけではなく,たかだた2kバイトのメモリを持つだけでフリップフロップを用意しないといけないことであるとか,アクセスの手順を守る必要があるのですが,少なくとも不手際の影響が本体や他のスロットのメモリアクセスを邪魔しないような仕組みになっていますので,いつまで経ってもエリアを開放しないといったずるいことは,出来なくなっています。

 いや,言ってみれば簡単な仕組みですが,これを1977年にやってしまうというあたり,すごいとしかいいようがありません。各スロットに僅かなサイズのROMを割り当てることと,スロット共通の大きなROMエリアを切り替えて使うこと,それを破綻なくまとめ上げて,拡張カードを差し込むだけでデバイスドライバも同時に用意され,すぐに動かせるようになるなんて,Wozの拡張性に対するこだわりが見えてきます。

 この機能は後にプラグアンドプレイと呼ばれるのですが,1981年に登場したIBM-PCではもちろん実現されておらず,1980年代後半のPCIやMCAでようやく盛り込まれましたし,我々が普通に扱えるようになるのは1990年代のWindows95からですので,その先進性には頭が上がりません。

 さて,回路図を見直して見ると,この通りの回路が実装されていることがわかります。ややこしく見えたアドレスデコーダも,こうしてみれば簡単です。

 ただ,1つ注意点があります。これはSSCのマニュアルにも記載があるのですが,スロットごとに割り当てられた256バイトのROMと,2kバイトの共通ROMはアドレスが非連続で,本来なら2つ搭載しないといけないのです。

 そこで,SSCでは1つにまとめるために,スロットごとに割り当てられた256バイトのROMのアドレスをリマッピングして,ROMの0x0700から0x07ffまでに書き込んでいます。

 ですので,スロット2の場合なら,$C200へのアクセスがあったとき,ROMの0x0700が出てくるように回路が組まれています。

 え,0x0700なんかに書き込めるの?ですか。はい,思い出して欲しいのですが,$CFFFにはフリップフロップをリセットするスイッチが割り当てられていますよね。だからどうやっても$CFFFは使えません。

 それに,$CFFFのデコードをするのにA0からA7すべてをフルデコードするのも大変なので,多くのケースでA0からA7はデコードせず,よって$CF00から$CFFFまでが使えないわけです。

 このあいたエリアにデータを書き込んでおき,$C200をアクセスした時に見えるようにしておけば,ROMを1つにまとめる事ができますよね。

 このあたりの仕組みを,SSCの回路はORゲートを3つで構成しています。わかってしまえば簡単な仕組みです。

 とまあ,出来るだけ回路を簡素化することも考えたのですが,出来そうな事といえばバスバッファのLS245を省略することくらいで,あとは結構しっかり最適化されてることがわかってきました。よく考えてあるなあと。

 LS245を省略すると,LS245のイネーブル信号を作る回路が不要になりますが,全体としては1チップ少なくなるくらいです。私の場合水晶発振器に74HCU04が1ゲート,そこに分周器のHC393が1つなので,むしろ増えるくらいなのです。

 さすがに1ゲートのためにアンバッファのHCU04をあてがうのはもったいないので,ここは手持ちの1ゲートロジックNC7SU04を使うのですが,HC393だけはどうにもなりません。この段階では秋月でも安価に手に入る分周器付き発振器(発振器付き分周器でもいいんですが)のNJU6319AEがあれば一発解決なんですけど,この段階では知らなかったので,後で気が付いて悔しい想いをしました。

 フリップフロップですが,LS279が手に入りません。前述のようにHC00で作るのは難しくないですし,LS279の4つのフリップフロップのうち,3つはNANDやインバータとして使っていますので,問題はないです。

 そうそう,HC365とDPI-SWです。オリジナルでは7ビットのDIP-SWを使っていますが,手持ちの関係で6ビットのものを使うことにします。足りない分は別にCPUが読めなくてもよいものだったりするので,問題はないでしょう。

 最後に,ドライバから後ろの話です。オリジナルはショートピンが固まったショートブロックで,ストレートとクロスを切り替えるように作ってあります。また,10ピンのコネクタの先はDsub25ピンですが,私は手持ちの関係で9ピンのメスを使い,その代わりストレートとクロスはスイッチで切り替えられるようにしました。

 ただ,クロスではそれだけではだめで,RTS/CTSとDSR/DTRをLowにするショートピンやDCDをLowにするショートピンも追加が必要になってしまいました。


 回路の動きはわかりました。部品集めも終わりました。ROMも焼きました。(ちょうどaitendoでTL866II-PLUSを手に入れたので,早速使いました。)


 では,早速製作です。今どきユニバーサル基板とポリウレタン線でちまちまと配線する人なんているんかいな,と思うのですが,ブレッドボードで出来るような回路規模ではないですし,基板を起こすのは興味がありつつも,それなりに費用がかかってしまうことを考えると,結局この方法が一番という事になりました。

 私は単純労働が好きなので,頭を真っ白にして配線できてむしろ楽しいくらいです。真っ白になりすぎて配線ミスをするのはいつのも事ですが,今回は特にひどかったです。

 まず,RS-232Cドライバの配線ミス。VCCとGNDを逆に繋いだまま長時間通電したので,チャージポンプが壊れてしまいました。交換用のMAX238を持っていなかったので,MAX232相当品を2つ使うことに回路を変更する羽目に。しかし,16ピンのDIP2つがのる面積は残されておらず,やむなく秋月で買ってあった特価品の面実装品のSP203Eを2つ使うことにしました。ただでさえ混乱気味のドライバ周りが,ますますややこしくなってしまいました。

 あとはレジスタです。オリジナルの回路図を確認せず,D0からD5までを順番に配線したのですが,実はデータ線へのマッピングは順番通りではなく,後になってからDIP-SWの設定がおかしくなるという問題に悩まされました。

 他にも2つ使ったHC00を取り違えたり,レイアウトがまずくて配線が長くなったり,VCCとGNDを間違えたりと,まあ今回は本当にひどかったです。

 さて,ある程度出来たところで確認をしてみましょう。まず,ACIAとROMにアクセス出来るかを確かめます。スロット2に差し込み電源ON。起動すれば一安心です。

 このあと,IN#2と打ち込み,CTRL-AとすればAPPLE SSCというプロンプトが出てくるはず。しかし出てきません。ハングアップです。ROMがダメ,あるいはフリップフロップを含むデコードでコケている可能性があります。

 そこでモニタから$C800をリードしてみると,ちゃんと読めています。$C200も問題なし。$CFFFアクセスで$C800が読めなくなり,$C200アクセス後に$C800が読めることも確認出来ました。よし。

 6551も読み書き出来ます。レジスタは変な値が読めている(これはあとで配線ミスと判明)のですが,とりあえず衝突などはなさそうです。

 おかしい,これで動かないというのはどういうことだ・・・

 DIP-SWをいじっているうちに,プロンプトが出るようになりました。設定で変わるようです。これでROMとACIAは動いているようです。

 続いてドライバですが,これはチャージポンプを壊してしまったのでなかなか動いてくれませんでした。やむを得ずドライバの前でループバックテストをするのですが,それもなかなか動きません。DCDをLowにすると動くようになったのですが,シリアル通信はTxとRx,あとはせいぜいRTSとCTSをケアすればそれで済む場合が多いので,まさかDCDが問題とは思いませんでした。昔の方々は真面目だったという事でしょう。

 ドライバを交換し,ループバックテストを通し,いよいよPCのシリアルケーブルと繋いでテストですが,これもなかなか動きません。

 ボーレートがなかなかあわないうえに,文字化けしまくりです。結局レジスタの配線ミスを修正して解決したことと,実は7bitだと文字化けしないことがわかって,一応解決としました。いや,配線ミスのせいでボーレートを設定するビットが宙に浮いてしまっており,立ち上げる度にボーレートが変わるという現象に悩まされていたので,気が付いて正解でした。

 ということで,一応手作りSuper Serial Cardは完成です。いやー今回は苦労しました。配線も汚く,ドライバ周りは未だにすっきり理解出来た気がしないのですが,とりあえず通信が出来ており,期待通りに動作しているので良しとしましょう。

 ちなみに,かかった費用はコネクタとW65C51で1500円くらい,あとは基本的に手持ちの部品ばかりなので,合計で2000円ほどでしょう。SSCが最近高価になっていることを考えると,十分ペイする金額だと思います。

 ここまでくれば,最終目標であるADTProもすんなり動くはず・・・なのですが,全然ダメなのです。思いつくことは試しました。でも思うように動きません。複数の原因が考えられるので1つ1つ潰していくしかないのですが,まだ動かせていません。

 せっかくここまできたのです。もう一踏ん張りです。

 

ページ移動

  • 前のページ
  • 次のページ
  • ページ
  • 1

ユーティリティ

2022年07月

- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 - - - - - -

検索

エントリー検索フォーム
キーワード

ユーザー

新着画像

過去ログ

Feed