エントリー

カテゴリー「make:」の検索結果は以下のとおりです。

SuperSerialCardの問題に決着を

 結局ADTProで動かなくてあきらめてしまったSuperSerialCardの自作プロジェクトですが,某オークションでSuperSerialCardIIが出てきたので無理をして買ってみました。

 確かめたかったことは,ADTProが自作したカードで動作しなかった原因です。自作のカードはシリアル通信は可能で,ADTProも古いバージョンに限定されますが,Bootloaderは起動しますし,一瞬ですがディレクトリを取得することも出来ています。

 ただ,そのシリアル通信も7bitだけが動作していて,8bitでは動いていません。

 こうなるともう回路の問題と言うより,W65C51Nに問題があるんじゃないのかという話になり,先に進めなくなってしまったのです。

 ここで,SuperSerialCardIIでADTProを動作させて動いてしまえば原因は自作のカードに内在したことが明確になりますし,もしW65C51NからR6551に交換して自作のカードが動作してしまえば,W65C51NとR6551の非互換にあった,ということになるでしょう。

 とはいえ,ADTProでの使用を前提とした自作カードの回路図が海外では公開されていて,そこでは当然現在入手可能なW65C51Nが使われています。

 実際これで使っているという話を見つけることは出来なかったのですが,なにより作者が動いていると言っているのですから,信じるしかありません。

 もちろん,広義の非互換として,端子のタイミングの違いなど,回路設計上で解決すべきものもあると思いますが,そうはいってもW65C51NとAppleIIのバスの間には大した回路も入っていませんし,今は考えないことにします。

 さて,早速実験開始です。

 まず入手したSuperSerialCardIIの動作確認です。ジャンパブロックをTerminalにして(これで手持ちのクロスケーブルが使えるようになる),もういきなりADTProを起動します。

 ホストはMacBookAirです。これはEthernet経由でもホストとして使っています。

 するとあっさり動作。ホストからデータを受け取りフロッピーに書き戻すところまで問題なく終わりました。あっさりと書きましたが,実はPL2303を内蔵したUSB-シリアルケーブルではエラーが発生してフロッピーへの書き戻しは出来ても,Bootloaderが上手く動作せず,一度も起動に成功しませんでした。

 そこで秋月で調達したFDTIのチップを搭載したUSB-シリアルケーブルに変えたところ,嘘のように上手くいくようになりました。とはいえ,Bootloaderは微妙なところで,ProDOSの起動に失敗することもしばしばで,ADTProの起動まで到達出来ないケースは感覚的に2割ほどという気がします。

 次に気になっていた事ですが,AppleII側から8bitで通信出来ていなかった件を確かめます。先に結論を書くとこれは変化なし。PC側からは8bitで文字化けしませんが,AppleII側からは8bitでは文字化けします。ここはもしかしたらROMに依存した問題なのかも知れません。

 さて確認作業の本命,6551の入れ替えです。すでに自作品と本物の間で動作に違いがあったわけですが,それが6551の違いによるものかどうかがこれでわかります。

 結果は,SuperSerialCardIIに搭載されていたR6551を自作品に取り付けるとADTProが動作しました。逆にW65C51NをSuperSerialCardIIに取り付けると,動作しませんでした。

 少なくとも,R6551を使えば動作するようになるのは事実ですが,逆にW65C51Nを使えば動かないというのはちょっと判断が難しく,実はどちらでも動くはずのターミナルモード(CTRL+AからTで移行)で,W65C51Nを搭載したSuperSerialCardIIが全く動かなかったのです。

 そもそもチップが動作していない状態で,クロックの供給方法がそれぞれのカードで違うので波形を見ていないのでなんとも言えませんが,おそらくクロックが発振していないのではないかと思います。

 ということで,とりあえず自作でもR6551を使えばちゃんと動作する事は判明しました。

 しかし課題も残りました。

 自作カードに用意した10ピンのコネクタはSuperSerialCardのものと同じ形状なのにピン配置が異なります。これは手持ちの関係で10ピンコネクタも9ピンのD-subも圧着のものを使って,フラットケーブルで直結したものを使いたかったからで,カード上のコネクタのピン配置を変更してあわせていました。

 しかし,SuperSerialCardIIとケーブルを共通にしておく方が混乱もないでしょうから,自作品のピン配置を変更します。とはいえこれがなかなか大変で,特にスレート結線のMODEMとクロス結線のTERMINALの両モードを切り替えられるようにするのはなかなかややこしく,何度も失敗しました。

 しかも,DCDとCTS,DSRの3つを12Vでプルアップしておらず,そのせいでSuperSerialCardとはことなる挙動をしていました。特にDCDがHighになっていないことで,通信が始まってくれませんでした。 

 次にW65C51NがSuperSerialCardIIで本当に動かないのか、と言う問題です。SuperSerialCardとして機能しないのか,あるいはADTProで動かないのかによるわけですが,クロックの発振が止まっているなら自作品以下の状態ですから,これは対応しなければいけません。

 情報によると,プロセスの違い(W65C51NはCMOS)から,水晶発振子に1MΩを並列に取り付けないと発振しないそうなので試してみたところ,クロックは無事に発振して,通信が行われるようになりました。

 しかしADTProは動作せず。つまり自作品と同じ状態になったわけで,これはもうW65C51Nが原因だったと確定させてもよいのではないでしょうか。

 最終的には,W65C51Nを使った自作カードでADTProが動くようにしたいですが,チップ依存の問題なら詰みますから,動かないならその原因くらいははっきりさせたいところです。

 W65C51Nを使ってADTProが動かなかったという話を私は見つけることが出来ずにいて,逆に明確に動作したという話もありません。SuperSerialCardが高騰しているため(といっても$50くらいで高騰といっているので日本国内との感覚のズレはあると思いますが)自作した人はいて,その方々はW65C51Nを使っている,ということで,間接的にADTProが動いているんだろうと推測される程度です。

 でもやっぱり自作品でADTProを動かしたいですよね。組み立てや設計が原因ではなく,チップのせいで動かないというならなおさら悔しいじゃないですか。

 そこで,あやしい部品が簡単に手に入るAliexpressで探してみると,ロックウェルのR6551がゴロゴロしています。送料を入れても$10未満です。ものは試しにと,先日の387SXに気をよくして,R6551を頼んでしまいました。

 加えて少し時間のあるときに,ADTProのソースを読んでみました。するとW65C51Nのエラッタに引っかかる部分がバッチリありました。つまり,ADTProがW65C51Nで動かないのは当然で,おそらく世界中の誰もW65C51Nで動かせていないのではないかと思います。

 問題は,W65C51Nがステータスレジスタのbit4を,常に1にしているという点です。ここは本来Trasnmitter Data Register Emptyというフラグで,0なら転送中,1なら空っぽになったことを示すもので,W65C51N以外はすべて機能しています。

 このビットを監視し,空っぽになるまでループするというコードをみんな書いているわけですが,悪いことにW65C51Nはここが常に1になるというエラッタがあるので,ループを素通りしてしまいます。

 さらに悪いことに,W65C51Nはこれを「仕様」としてデータシートを改訂し,しれっと対策版のW65C51Sに切り替えています。

 しかし,市中の在庫はエラッタを含むW65C51Nが大半です。私も2つ買ってどちらもエラッタのあるW65C51Nでした。

 ここが常に1ですので,いつも通信していない状態と認識され,実は送信が終わっていないのに新しい送信データがレジスタに書き込まれてしまいます。これじゃデータの通信など正しく出来ません。

 そこで,bit4の確認を行う代わりに,少しループでウェイトを入れてやるのがいいそうです。実際,日本の方でもW65C51Nで苦しんでいた方が,この対策でサクッと動くようになったと書かれていました。

 それでADTProですが,まさにbit4を確認してループするコードになっていました。ここをウェイトにすればきっと動くようになると思うのですが,ビルド環境を整えるのも面倒ですし,原因がはっきりしたという事で,もうこれでいいです。

 最新のADTProのリリースが2020年11月ですので,その後も誰も指摘していないし,誰も対応して欲しいとは言っていないのでしょう。AppleIIのコミュニティは活発かと思っていましたが,実は案外そうでもないのかも知れません。

 ということで,一連の検討で明らかになったことは,W65C51NではエラッタのためにADTProは動かないということ(これはもっと早くにソースを見ていればわかったこと),R6551を使えば動くという事,自作品でもR6551なら問題なく動くということでした。

 結局W65C51Nのエラッタに振り回されただけだったというオチですが,結論が出てうれしいと言うよりも疲れました。時間も労力も費用もかかってしまいましたが,あまりいい勉強になったと言う気もしません。やっぱソースをきちんと見るべきだったなあと思います。

 さて,あとはAliexpressからR6551が届くのを待つばかり・・・

 

ADTProへの長い道~UthernetII編~

20220805102643.JPG
 まさかの自作失敗で動作がかなわないADTPro。ここで悔しがっていても前に進まないので,不本意ながら別の方法を考えてみます。

 オーディオ経由は非現実です。なら残った方法はイーサーネットだけ。

 しかし,AppleIIの時代にイーサーネットなんて,どう考えても不自然です。純正品のカードもなかったはずですし,ならどんなカードを用意すればよいのやら・・・

 調べてみると答えは簡単でした。イーサーネットカードは自作されたもの。しかもそれはすでにマニアの間では標準的なものになっており,ADTProもそれをサポートしています。

 そのカードとは,UthernetIIというものです。

 開発者が頒布するもの以外で完成品もキットもありません。基本的には公開された情報で自作です。しかし,イーサーネットの回路など作ったことがありません。どうしたものか・・・

 そもそも,AppleIIにTCP/IPならなんやらを実装できるのか?

 仕掛けは案外簡単でした。実は世の中には,ハードウェアでTCP/IPなどを組み込んでしまうイーサーネットコントローラICが存在します。W5100というチップなのですが,上位からは通信したい内容をレジスタでやりとりすれば,チップ内部ですべて処理され,内蔵されたPHYに出てくるという便利なものです。PHY内蔵だけでも一昔前なら超便利と言われたのにねえ。

 このW5100を使えば,非力なCPUでも少ないメモリでも,イーサーネットに繋がるマシンが作れます。実際,Arduinoでも標準的に使われているようです。

 しかし,W5100は0.4mmピッチのQFPです。これをハンダ付けするのも大変ですし,そもそも基板はどうするという話もあります。

 すると,なんとありがたい事に,W5100とイーサーネットのコネクタまで搭載した小さい基板が売られていました。チップ製造元が評価用に用意したもののようですが,組み込み用途にも十分使えるものです。

 W5100とAppleIIとの接続は簡単ですので,このボードを使えば1日もかからずUthernetIIのクローンが作れるでしょう。2500円とちょっと高いですが,早速注文です。

 W5100は5Vトレラントですので,基本的にはAppleIIのバスト直結出来ます。しかしUthernetIIではデータバスのバッファはもちろん,アドレスバスやコントロールバスにもシュミットのバッファを入れる念の入りようです。

 面倒な私は全部すっ飛ばして直結です。

 さくっと結線を終えて,マニュアルにあるモニタからのレジスタ読み書きテストは合格。しめしめ。

 しかし,ADTProでは動かず。DHCPで失敗します。IPアドレスを手動入力しても,実際の通信は出来ません。

 もしかしてIRQかと思って波形を見ますが,ヒゲのようなものが出ています。よく見ると,IRQはW5100の出力ですので,3.3Vが出ています。一方のAppleIIは入力ですが,オープンコレクタの出力端子が繋がるようになっているので,5Vでプルアップされています。

 ありゃ,W5100に5Vがかかってしまった。

 あわてて回路図通りに,オープンコレクタのバッファ(LS07を追加しますが,結果は変わらずで,ヒゲも出ているし動作もしません。この段階でW5100の破壊を疑い,チップだけを手配しました。(結果これは無駄に終わります)

 さらに波形を見ていくと,途中でDHCPに成功することもありますし,上手くいくとDirectoryコマンドまでは通ることがあります。差し込むスロットを2にすると上手く動くことが増える代わりに,7にするとさっぱり動きません。やはりバスですね,こりゃ。

 そこでLS245を追加。これは想定済みです。

 試してみますが,確かに安定しますし,DHCPも通ることが増えましたが,まだまだです。ならばと,回路図通りに他のバッファも追加しましょう。手持ちの関係でLS244を使います。

 うれしいことに,ここまでやると上手く動くようになりました。ADTProが初めてまともに動いた瞬間です。さすがにイーサーネットだけに高速です。

 この時,IRQを確かめてみますが,ヒゲは出ています。どうもヒゲは関係ないようです。IRQは使っていないんじゃないかと思っているところです。


 ようやくADTProがまともに動き出しました。長い時間をかけましたし,失敗もしました。でも,これでようやくゴールです。

 ・・・といいたいところですが,あと3つ,ネタがあります。待て次号。

 

ADTProへの長い道~SuperSerialCard編~

20220805102627.JPG

 なかなかこの日誌を更新できずにいたのですが,それもこれもAppleIIのトラブルが解決しないことにありました。そう,SuperSerialCardです。

 もともとSuperSerialCardの自作は某オークションでうっかり落札の期日を忘れてしまって入手を逃してしまったことから,なら自作するかで始めたものでした。

 前回の日誌では,それが完成したというところで止まっていたかと思うのですが,本来の目的である「ADTPro」という,AppleIIのディスクイメージを実際のフロッピーディスクに書き戻したり,その逆であるフロッピーディスクをイメージにするソフトを動作させることに,なかなか成功しませんでした。

 ADTProは世界中で使われている定番ソフトで,イメージを持っておくサーバーはPC側に,フロッピーディスクの読み書きは実機にクライアントソフトを動かしておいて,双方で通信をすることで動作します。

 通信はカセットインターフェースを用いたオーディオを使うもの,SuperSerialCarsを用いたシリアルポートを使うもの,そしてイーサーネットを使うものの3つから選ぶ事が出来るのですが,オーディオは遅い上に信頼性も低く,非現実な手段でしょう。

 イーサーネットは純正のカードがないので基本的には自作するしかありませんし,そこまで大げさなことをしなくてもと思っていたので, シリアルポートをp使う人が大半だろうと思います。

 これがAppleIIcやAppleIIGSなどのシリアルポートが内蔵された機種ならなにも問題はないのですが,AppleIIPlusやAppleIIeでは,クライアントソフトがサポートするSuperSerialCardを手に入れなければなりません。

 どうも,そういう事情もあってか,アメリカではSuperSerialCardの中古価格が高騰しているそうで,入手も難しくなっていると聞きます。

 私の場合,AppleIIPlusですので,なにがなんでもSuperSerialCardを手に入れるしかないわけですが,貴重な機会を逃してしまい,その後手に入る目処も立っていません。

 だから,自作するという選択肢は間違いではなかったはず,でした。

 完成までの顛末は前回書きましたが,シリアルポートとしては動いてるという前提で,ADTProを動かしてみるも,全然動いてくれません。

 最新の2.1.0では,まずBootに失敗します。Bootというのは,クライアントを実機に転送して起動させるフェイズで,実機のモニタでサーバー側から転送されるProDOSを読み込み,ProDOSで再起動させます。その後ProDOS上で受信ソフトが自動起動し,クライアントソフトがサーバーから転送されるという仕組みです。

 これが全く動きません。Bootloaderの読み込みまでは問題なく進むのですが,ProDOSとADTProを読み込むBootloaderが沈黙したままで転送が始まりません。

 ならばと別の方法でフロッピーディスクに書き込み済みのクライアントソフトを手に入れて,これでADTProを起動させてみたのですが,やっぱりサーバーとの通信が全く行われず,タイムアウトします。

 この場合の多くは,ケーブルの問題だとADTProの開発者も世界中の親切な人も言っていますので,先人達の知恵には従おうと,様々なクロスケーブルの結線を試してみました。しかし結果は惨敗。以下,やってみたことです。

(1)様々なクロスケーブルの結線を試す。手持ちのケーブルは全滅だったので,自由に結線を変更出来るようブレッドボードを間に挟んで考えつく限り試したがどれもダメ。どうもクライアント側から何度もデータを送り込んでいるが,PC側がそれを受け取っていないようだ。

(2)RS-232Cドライバが悪いのかと,ドライバを挟まずPCのUSB-シリアル基板に直結。結果はドライバを挟む場合と同じ。

(3)先人達は,USB-シリアルはFDTIだと失敗しないというので,FDTIのチップが載っているUSB-シリアル変換ケーブルを秋月で調達。しかし状況は全く変わらず。

(4)バージョンを戻して変化が出ればと,2.1.0->2.0.3->2.0.2->1.3->1.0とバージョンを遡ってみた。1.3まで遡るとBootには成功するが,その後がダメ。しかし,何回かに1回はDirectoryコマンドだけ動くことがある。

(5)サーバーはJavaで書かれているので,先人達はJavaのバージョンにもこだわるべきと忠告。そこでJDKやらJREやらVer8やらなんやら,言われたままに様々なものを試してみるがさっぱりだめ。

(6)2.0.3以前は,Java用のシリアルドライバが必要だそうで,それも入れてみる。でもだめ。

(7)Windowsが悪いのかと,RaspberryPiを引っ張り出す。Linuxベースでサーバーを立ち上げてみるがWindowsと全く同じ。ただし,2.0.3のBootはなぜか爆速。

(8)もちろんボーレートも試せるものはすべて試すが全部だめ。

(9)こうなってくるとハードウェアだろうと,SuperSerialCardを疑い始める。まずCMOSで用意されたロジックICをLS-TTLに置き換えるが,むしろ動かなくなることがある。電圧レベルで考えると,Highの入力がCMOSでは3.5V以上必要だが,TTLでは2.4Vですむ。出力もHighがCMOSはほぼ電源電圧で出てくるが,TTLだと4Vを切るくらいなので,実はCMOSで受けるのは結構まずいはずなのに。

(10)バスのドライブ能力が足りなくて安定しないのかもと,オリジナルには入っていたバスバッファを入れて見る。といっても基板面積から面実装品の74AHCT245を選ぶしかなく,これを挟んでみるが結果は変わらず。

(11)モニタからアドレスを直接叩いてみるも問題なし。うーん・・・

(12)しかし,気になる事も。W65C51の初期バージョンにはエラッタがあり,送信バッファが空っぽになったときにフラグが立たない。オリジナルの6551とは挙動が異なる。この問題はW65C51を使う上ではよく知られた話らしい。このエラッタは後に「仕様」と割り切られたあげくに,後期バージョンではしれっと修正されているらしい。
 で,ADTProでエラッタが問題となるかについては不明。ソースを見る元気もない。ただし,初期バージョンでクローンをADTProを目的に作っている人がいるので,おそらく動作しているんじゃないかと思う。

(13)さらに気がかりなこと。実はApple側から8bitで通信が出来ていない。PCのTeraTermからAppleに8bitで文字を送り込むときちんと表示される。しかし,Apple側からTeraTermへは文字化けする。TeraTermを7bitにすると正しく表示されるので,Apple側が7bitで送信しているのは間違いない。
 波形をみると確かに7bit。8bitに設定しても7bitに設定しても波形に変化がない。SuperSerialCardのROMのソースが公開されているので解析をしてもいいのだが,すでにこの段階でもう力尽きつつある。

(14)ADTProでは,SuperSerialCardに搭載されたROMは使わない。SuperSerialCardの回路がややこしいのは実はROMのサポートのためなので,ROMを抜いてしまえばW65C51をそのままバスにぶら下げただけ。これで配線ミスの可能性はぐっと減るはずだが,やっぱりADTProでは動作してくれない。

(15)ADTProのクライアント側から出てくるコマンドやデータをPCのサーバー側でログを取ると,どうも正しいコマンドがクライアントから送られていない事がわかった。データの送信はW65C51のレジスタに書き込んで送信するだけなので,ここに至って万策尽きた。


 確かに,W65C51への書き込みタイミングがあやしくて,連続のアクセスで上手く書き込めていないのかも知れませんし,そういうタイミングの検証は真面目にやってはいません。だけど,1.3では115200bpsでBoot出来ているので,ちょっと違うかなと思っています。

 試せていないことは4つ。1つはシリアルポートが内蔵されたPCで試すこと。なかにはUSB-シリアルではどうにも解決せず,内蔵のシリアルポートでようやく動いたという先人もいらっしゃるようです。

 もう1つは,別のApple2で試すこと。特にAppleIIeと自作のSuperSerialCardの組み合わせです。実は,ADTProでの動作例はほとんどがAppleIIeで,Plusで動かしてる人って少ないのです。

 3つめは,W65C51を交換すること。交換と言っても,昔のNMOSの6551にです。チップの差分による差を確かめてみたいものです。

 最後は,純正のSuperSerialCardを入手すること。これで動いてしまえば自作に失敗した事になりますし,動かないようなら自作の意味が最初からなかったことになるので,どっちに転んでも負けです。

 

 そもそも,PlusではProDOSがそのままでは動きません。16KBのRAMを増設してようやく動き出しますので,そこまでしてPlusでADTProを試す人がいるのかと,そういう話です。一応ADTProの対象機種にPlusは含まれていますが,もしかするともともと動かないものであった可能性もありますし,いわゆる相性の問題があったりするのかも知れません。AppleIIeと自作SuperSerialCardで試せれば一歩進めるんですがねぇ。

とまあ,考えつく限りのことを1ヶ月近くもかけてやってみましたが解決に至りませんでした。残念ながら敗北です。

 一応,シリアルポートとしては機能しているので,無駄にはならないと思います。しかし具体的な使い道もないので,複雑な気分です。

 さて,このままでは最初の目的であったディスクイメージとフロッピーディスクを行き来すること,すなわちADTProを動かす事が出来ずに足踏みです。残念ですがSuperSerialCardにこだわっていても時間ばかりが過ぎてしまうので,違う方法を考えることにします。

 そう,イーサーネットです。続きは次回。

 

手作り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つ潰していくしかないのですが,まだ動かせていません。

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

 

AppleIIのCPUをW65C02に換装

20220620160618.JPG

 AppleIIを触っているのは,とても楽しいです。特にすることがなくても,特にトラブルが起きていなくても,とりあえず電源を入れて動いていることを確認することすら,楽しいです。

 そうなると,このAppleIIが壊れてしまうことがなにより恐ろしいわけですが,私の場合,修理をするだけの根気と知識はありますので,部品が手に入らないことが一番困った事になるわけです。

 それでもAppleIIはTTLで構成されているので,最悪今でも手に入る74HCシリーズで代用が可能でしょう。ROMは今でも入手可能なEPROMで代用も出来そうです。

 怖いのはCPUで,実は6502って,CPU単体ではなかなかお目にかかれません。というのも,オリジナルのMOS TECHNOLOGYは早々にCommodorに買収され,今は消滅していますし,セカンドソースはRockwellとかSynertekとか,ちょっとマイナーな所ばかりが手がけていました。

 数をばらまくのが得意な日本のメーカーでは,リコーや三菱が知られていましたが,これらは6502単品と言うよりもカスタムICのコアとしてや,ワンチップマイコンとして互換性のない形で作られていました。

 そんなわけで,随分早くに製造が打ち切られていますし,流通在庫も少ないですから,NMOSの6502というのはなかなか入手が難しいのです。

 先日,その6502を触ってみると,やけどしそうなくらいに熱くなっていることに不安を覚えました。まあ,バイポーラやNMOSの時代のCPUなんてのはこのくらいの発熱は当たり前だった(いや,CMOSでも現在のCPUは空冷が必要なくらい発熱するわけですが)ので気にしなければいいのですが,熱はトラブルの原因だけに,壊れた時のために予備が欲しいなと思うのは,自然な事でしょう。

 実のところ,かつて実家にはAppleIIのコンパチボードがあって,部品取りにしてあったのですが,実家の片付けに伴い処分してしまったのです。ここに6502やNE558などのICも乗っかっていたので,惜しいことをしたと悔やんでいます。

 悔やんでいても仕方がありません。

 AppleIIには世界中にユーザーがいます。きっと彼らがなんとかしているに違いない,そう思って調べてみると,やはりなんとかなりそうな情報が手に入りました。

 まず,6502ですが,CMOS版の65C02なら,現在も新品が手に入ります。

 WesternDesignCenterというメーカーから,W65C02という品名で売られていて,全世界で購入可能です。ついでにいうとACIAやPIAも手に入るからすごいです。お値段も良心的な,日本円で八百円から1000円ほどです。

 問題は65C02に差し替えることが出来るのかどうかです。まず,後期のAppleIIeやAppleIIcは65C02ですので,ソフト互換はあるでしょう。となると電気的もしくは物理的な互換性です。

 調べてみると,WDC自らが,AppleIIで使う方法を正式なドキュメントにまとめていました。半導体のメーカーが,アプリケーションノートとして,趣味のコンピュータのために置き換え方法を検証して公開するというのは,なかなか粋なことをするものです。

 このドキュメントによると,パッケージもピン配置も互換性があるということ,ただし一部のピンの非互換なものがあるので修正せよ,とあります。

 具体的には,まず1ピンです。6502ではここはVSS(GND)となっていますが,W65C02ではVPBという出力信号になっています。このまま繋いでしまうと壊れてしまうので,ここを浮かせて取り付けます。

 次に36ピンです。6502ではNCですが,W65C02ではBEという入力端子になっています。このBEという端子ですが,Lowにするとバスがハイインピーダンスになるので,Highにしなければなりません。

 最後に5ピンです。オリジナルはNCですが,W65C02はMLBという出力端子になっています。ゆえに浮かせなければなりません。

 一応,これで動くようになるんだそうですが,ドキュメントにはAppleIIeでは検証済み,AppleIでは未検証だ,とかいてあります。AppleIで未検証って・・・

 さて,実際の作業ですが,まさかappleIIの基板を改造するわけにはいきませんので,変換ソケットを作りましょう。先日デジットのジャンクで買った40ピンの激安丸ピンソケットが役に立ちます。

 まず,20ピンのヘッダピンを2列用意して,1ピンと5ピンと36ピンの片側のピンを切ってしまいます。そしてソケットのピンとハンダ付けすれば,基板に改造も,W65C02のピンを曲げたり切ったりすることなく,ピンを浮かせることが出来ました。

 そしてW65C02の36ピンをVDDに繋ぐため,8ピンと導線で繋ぎます。これで完成。

 W65C02をソケットに差し込み,AppleIIの基板の6502を抜き取って,代わりにこの変換ソケットを差し込んでみます。

 電源を入れてみると,ピピピとおかしな音がしたかと思ったら,画面がぐちゃぐちゃです。起動していません。失敗です。

 配線間違いをしたかなと確認しましたが,間違いはなし。何時間か悩んだのですが動いてくれません。google先生に聞いてみても,頼もしいはずの世界中のマニアも,AppleIIeでは試していても,私のようなAppleIIやAppleIIplusでの動作報告をしてくれていません。

 うーん,そもそもAppleIIplusではダメなのか?

 AppleIIとAppleIIeの回路図を比べて見ましたが,CPUの周辺で問題になるような特に差はありません。ますますおかしいです。

 こういう時は,波形を見るのが解決の早道です。

 まず,目星を付けていたクロックを確認。

 20220620160620.PNG

 むむ,これはやばそうです。

 実は,NMOSの6502では,2.4V以上ならHighと認識してくれますが,W65C02ではなんと3.5V以上でないとHighと認識してくれません。CMOSなら当たり前のことなのですが,実はこの点において電気的な互換性が難しくなっていたのです。

 波形の黄色い線は3.5Vのラインです。ここから上しかHighとして認識されないのですが,この波形ではちょうど3.5Vあたりで立ち上がってくるという,嫌な感じになっています。

 いや,結局5Vまでスイングさせれば関係ないでしょ,と思うなかれ。この時代の主流だったTTLというロジックICは,Highレベルを電源電圧ギリギリまd目一杯振ることが出来ず,3.5V位で頭打ちになることも多いのです。CMOS時代の今では考えられない制限ですよね。

 なので,この波形でもNMOSなら動くでしょうが,W65C02は動かないのです。

 こういう事例で有名なのは,Z80のクロックです。Z80はNMOSですので2.4V以上ならHighなのですが,クロックだけは4.4V以上でないとダメという,非常に厳しい条件が課せられていました。Z80ではよく知られたお話です。

 この時,対策として行われていたのが330Ωによるプルアップです。330Ωなんていう低い抵抗でプルアップしても大丈夫なんかと思いますが,TTL時代ならいいのです。

 ということで,早速37ピンのクロックの端子を330Ωでプルアップしてみます。

 20220620160619.PNG

 おー,綺麗な波形になりました。もちろんちゃんと動いています。ディスクアクセスも問題ありませんし,丸一日動かしてもコケません。

 ちなみに,データバズも不安だったのですが,こちらはなんとか3.5V以上を確保出来ています。面倒ですし,副作用も怖いですから,これはこのままでいきます。


 ということで,W65C02はAppleIIplusでも動きます。AppleIIeでの動作報告が多いのは,どうもクロックを供給するICがCPUの近くにあり,波形のなまりが少ないせいではないかと思います。AppleIIplusでは,CPUから結構遠いところにクロックのICがいて,そのせいで波形がなまっているんじゃないかと思います。

 ということで,W65C02でAppleIIplusが動いた数少ない事例になりました。

 とまあ,書いてしまえば簡単なのですが,実は途中でキーボードが動かなくなったりして,CPUのせいかと焦ったりしていました。調べてみるとキーボードとマザーボードを繋ぐフラットケーブルの不良があったり,キーボードとエンコーダー基板を継ぐコネクタに接触不良があったりして,なかなかすんなり動いてくれなかったのです。

 最終的にはそれらもすべて解決して,今の私のAppleIIplusは完調です。いやー,気分がよいものです。

 さて,交換したW65C02ですが,さすがCMOSだけあって,ちっとも熱くなりません。これだけ電気を食わないなら,他の部品,特にRAMとROMをCMOSにするだけで随分消費電力が減るんじゃないかと思いますが,ホカホカするのもオリジナルならではの趣ですし,これはそのままにしておきましょう。

 CPUは,壊れてしまうのが怖いですから,当面W65C02でいきましょう。出来ればもう1つくらい予備があると安心です。

 

ユーティリティ

2026年04月

- - - 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 - -

検索

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

ユーザー

新着画像

過去ログ

Feed