エクスプレススペシャリスト

最初のコンピューターを覚えていますか? 覚えています。 ZX互換のPC Spectrumでした。 それは'89年でした。 父がそれを買ったのか、何かのために変えたのかはわかりませんが、PCが家に現れてすべてが始まりました。 私が最初のプログラムを書き、BASICをマスターしたのはその上でした。 その後、私が7〜9年生のときに、PK-01 LvivとVector 06Cもありました。



グレード11では、Orion-128を組み立てる試みがありました。 放課後、私はトムスクで勉強に行きました。そのとき私がやることができたのは、穴を開けて塗料でパスをペイントすることだけでした。 ボードのエッチングには至りませんでした。 大学ではすでにPC互換のPCがあり、古いコンピューターは一般的に不要になりました。 しかし、独自のPCを構築するというアイデアは、ほぼ14年間空を飛び続けました。 その考えは、オリオンの父親との議論によって促進されました。 どうやら私を構築する動機付けにするために、彼はそれを組み立てることはできないだろうと言った。



2014年の秋、Arduinoで別の構造を組み立てる際に、たとえば同じOrion-128、またはより単純にRadio 86RKを組み立てることができるかどうか疑問に思いました。 この考えを熟考して、彼は古い学校の夢-自分で組み立てたPCを実現することにしました。 すぐに言ってやった。 Alexei Morozovの古いコンピューターの修復に関するビデオや、さまざまなレトロPCフォーラムの記事で自信が与えられました。 これらのフォーラムには、レトロなPCを絶えず収集する人々がいました。



そして、詳細をほとんど持たない適切な回路を探し始めました-理想的には、小さなロジック、プロセッサ、および入出力ポートのみです。 最初はPCレニングラードを見ていましたが、街でZ80を見つけることができませんでしたが、注文するのに長い時間がかかりました。 その結果、スペシャリストエクスプレスPCサーキットに立ち寄りました。 このスキームは、最小限の部品で構成されており、組み立てや試運転が簡単なので、初心者には理想的だと思います。



非常に高品質な図がサイトwww.spetsialist-mx.ruで見つかりました。これは、 Fifanというニックネームを持つ男が書き直したもので、多くの人に感謝しています。



次の問題は、80年代のほとんどのファンが行っていたように、LUT技術を使用してプリント基板を作成するか、過去に突入し、MGTFワイヤを使用して壁に取り付けて組み立てるかです。 主要なアイデアは、デバイスを組み立てることであり、生産性が低いため、優れた実用的なアプリケーションを見つけることではなかったため、2番目のオプションに決めました。



組み立て用のすべての部品のコストは約4000テンゲ(約1000ルーブル)です。 すべてのマイクロチップをソケットに入れることにしました。







初日、クロックジェネレーターとカウンターを組み立てました。 MGTFを使用したはんだ付けは非常に簡単であることがわかりました。 誰かがあなたが端をきれいにする必要があるとインターネットに書いています、私はワイヤーカッターでワイヤーを噛んで、その後、少量のロジンをチップに適用し、錫の滴を含むはんだごてでそれを加熱しました。 同時に、編組は0.5 mmほどスライドしました。これは、はんだ付けするのにちょうど十分です。



手に傷を付けて電力を供給し、発電機とメーターが機能していることを確認します。 しかし、周波数計もオシロスコープも手元になかったため、インストールを完了してからデバッグすることにしました。



2番目のセッションは、1週間後の週末に概説されました。 2日間の休みのために、同期ジェネレーター、画像形成用のレジスター、マルチプレクサー、およびRAMを追加しました。







さらに1週間働いた後、彼は再びはんだ付けのために座った。 週末にかけて、私はほぼ全体のスキームを吹き替えました。 キーボードとテープレコーダーのポートのみがはんだ付けされていません。 また、プロセッサへの電源接続に問題があり、図に矛盾する情報がありました。



その頃には、アレクセイ・モロゾフ(VINXRU)とアンドレイ・アニシュチェコに会いました。 Alekseyは、プロセッサの結論に対処するのに役立ちました。 今後は、PCの構築とデバッグのプロセスで、多くの人が助けてくれたと言います。 本当にありがとうございます!



この時点で、コンピューターの外観はほぼ完成しました。







手に傷をつけるのではなく、オンにします。 したがって、安定剤がはんだ付けされるとすぐに、-5ボルトの形成を確認することにします。 これを行うために、ソケットの155LA3にクロックジェネレーター、カウンター、インバーターをインストールしました。 彼は電源を入れました、そして、ここで、彼らは正直なところ、マイクロプロセッサーの足で-5.6ボルトです! その日の喜びは際限がありませんでした。







ほんの一瞬だけ-私は考えた-7805スタビライザー(ラジエーターに搭載されたものも)が触れられないように暖められた。 そして、これらは電源回路内のわずか4マイクロチップです。



2番目の安定化オプションはオリジナルではありませんでした。 大きなラジエーターに2つの7805ケースを並行して植えました。 彼らはあまり沈むことを始めませんでしたが、それでも10分間の仕事の後、彼らに触れることは不可能でした。 この状況により、+ 5V(4A)および+ 12V(1A)の外部電源を購入せざるを得ませんでした。 この後、12Vの電圧が存在するために7812スタビライザーが放棄されることを除いて、電力の問題は発生しなくなりました。



回路全体を組み立てた後、ROMにローダーとモニターを書き込む必要があります。 以前ほど簡単ではありませんでした。



プログラマーがいませんでした。 私はハンドヘルドプログラマーを組み立て始めましたが、もう一度ブートローダーとモニターのコードを見た後、80年代には多くの人がこのようにしていたにもかかわらず、この不幸な仕事をやめることにしました。 アルマトイでそのような古代ROMのプログラマを見つけることはできませんでしたが、私は注文して1か月を失いたくありませんでした。 そのため、彼はArduinoの実験を始めました。 まず、シールドをはんだ付けし、ROMの内容を読み取ることを学びました。 両方のチップは空ではありませんでした。 また、コードから判断すると、発信者IDからのファームウェアである可能性が最も高くなります。 別の問題が発生しました-それらは消去されなければなりません。 学齢期に、父は光がROMクリスタルに乗ることは不可能であると絶えず言っていました。 両方のROMを数日間太陽の下に置きました。 週末に内容を再度確認しました-少しの情報も消去されませんでした。



フォーラムのメッセージとAlexey Morozovは、2つの消去方法について話しました。これは、DRLランプの内側の電球で、チョークが付いており、大量の有害なオゾンを放出し、紫外線殺菌医療ランプです。 DRLのコイを消去するのに約3時間、UVランプで約15分間かかりますが、特に家が寒いのでOUFK-09-1を2回考えずに購入しました。 両方のチップは10分で洗浄されました。 ここで、何らかの方法でシールドにROMの書き込みを教える必要があります。 もう少し時間がかかりました。 最初は、COMポートを介してArduinkaにデータを送信するVisual Basicのプログラマープログラマーを作成する予定でしたが、この考えを1、2日歩きながら、スキームを単純化すること、つまり、必要なファームウェアを含むシールドをSDカードをArduinkaに接続することを決めました読み取りと書き込みの2つのボタンがあります。 プログラムの進行状況はCOMポートに表示され、PCのポートモニターに表示されました。



結果はそのようなシールドでした:







ブートローダーとモニターをROMにダウンロードしました。これらはFifan-aサイトにもあります。 電源を入れたが、コンピューターが機能しなかった。 まあ、これは予想されることでした。 その時までに、周波数カウンターがすでに見つかっていて、RAS信号が正しく形成されていないことがすぐに明らかになりました。その周波数は約2 MHz、または6または4であるはずでした.IR12からのパネルのはんだ付けは結果を与え、信号は正しく形成され始めました。 この問題には約1週間かかりました。 しかし、まだイメージはありませんでした。



アンドレイのアドバイスで、ROMのテストプログラムをリクエストすると、スピーカーから音が聞こえ始めました。 これは、プロセッサ、バッファ、ROM、およびI / Oポートが正常に機能していたことを意味します。



短い試行の後、出力トランジスタがテレビが動作する必要がなかった信号レベルを与えることが判明しました。 このノードの回路に小さな変更を加えると、画像がついに登場しました! しかし、画面は6つのセクションに分割され、画像は3つのセクションにのみ表示されました。







マルチプレクサに疑念が生じました。 しかし、それらをどのように再配置しても、イメージは変わりませんでした。 テスターはボードに電話をかけませんでした。すべての接続が整っていました。 この問題にさらに数日を費やし、さらにいくつかのオプション(分周回路のコンデンサとプロセッサのSYNCの選択)を整理した後、私はその理由を見つけました-それにもかかわらず、マルチプレクサの1つの接点のはんだ付けがありませんでした。 画像は出ましたが、垂直線の形で干渉があり、さらに2 RAMが欠陥として輝いていました。







場所でのマイクロサーキットの再配置は結果を与えませんでした、それは別の非飲酒を意味します。 そしてそれが判明した。 食べ物はありませんでした。 平滑コンデンサをはんだ付けすると、はんだが溶けたようです。



その後、絵は本来あるべき姿になりました。 テストプログラムは、すべてが正常であることを示しました-画像が形成され、RAMが正常です。







次のステップはキーボードです。 最も簡単な方法は、PS / 2インターフェースを備えたキーボードを使用し、AVRコントローラーを介して接続することです。 しかし、このアイデアで作業週の終わりまで歩いていたので、私は元のスキームに従ってキーボードを組み立てることに決めました。 その結果、PCの最終的な外観は次のようになりました。







そして、インストール側からの眺め:







それを人間のケースに入れて、キーボードコネクタを作り直します(25フィートのコネクタのアイデアは面倒だったので、あまり成功しませんでした)。組み立ては完了したと思います。 コンピューターは、古いZX-Spectrum、PK01-Lviv、Vector-06C、およびMikroshaの隣に棚スペースを取ります。これは最近提示されたもので、少し修理が必要です。



一方では、1つの古い夢が少なくなっているのは悲しいことですが、他方では、それらが実現するために必要です。 父が議論を失った瞬間まで生きていなかったことも悲しいです。



結論は? かゆみ、または手がかゆいとき-それのために行く、それは価値がある!



付録1.プログラマー
プログラマー回路を図に示します。





さまざまな種類のROM向けにユニバーサルプログラマを作成しようとはしませんでしたが(これは簡単ですが)、ファームウェアコードを最適化しようとはしませんでした。 このシールドのタスクはROMの読み取りと書き込みであり、彼はそれらに対処します。

25V電源として、私はユニバーサルラップトップ電源を使用しました。 12Vまたは110-220Vの入力電圧で、12から24ボルトの電圧を提供します。 録音には24 Vで十分でした。

Arduino MegaはUSB経由でコンピューターに接続します。 Arduino開発環境の一部として、ユーティリティ-ポートモニターがあります。 プログラマーのプロセス全体が表示されます。

ROMに書き込むためのプログラムコードは、code.hexという名前でSDカードのルートフォルダーに保存する必要があります。

電源をオンにした後、プログラマはコマンドの入力を提案します-読み取りまたは書き込み。

ROMからデータを読み取る例(モニター記録)





レコードは同じように見えます。 [記録]ボタンをクリックすると、アドレスと記録されたデータがポートモニターに表示されます。



プログラムソース
#include <SD.h> int nMode = 0; //0- , 1-, 2- void WriteByte(int adr, int data){ int i; String sAdr, sData; //  digitalWrite(42, LOW); pinMode(24, OUTPUT); pinMode(25, OUTPUT); pinMode(26, OUTPUT); pinMode(27, OUTPUT); pinMode(28, OUTPUT); pinMode(29, OUTPUT); pinMode(30, OUTPUT); pinMode(31, OUTPUT); //      sAdr = ""; sData = ""; for (i = sizeof(adr) * 8 - 1; i >= 0; --i) { sAdr = sAdr + (String)((adr >> i) & 1); } for (i = sizeof(data) * 8 - 1; i >= 0; --i) { sData = sData + (String)((data >> i) & 1); } //   if (sAdr.substring(15) == "1") digitalWrite(39, HIGH); else digitalWrite(39, LOW); if (sAdr.substring(14, 15) == "1") digitalWrite(38, HIGH); else digitalWrite(38, LOW); if (sAdr.substring(13, 14) == "1") digitalWrite(37, HIGH); else digitalWrite(37, LOW); if (sAdr.substring(12, 13) == "1") digitalWrite(36, HIGH); else digitalWrite(36, LOW); if (sAdr.substring(11, 12) == "1") digitalWrite(35, HIGH); else digitalWrite(35, LOW); if (sAdr.substring(10, 11) == "1") digitalWrite(34, HIGH); else digitalWrite(34, LOW); if (sAdr.substring(9, 10) == "1") digitalWrite(33, HIGH); else digitalWrite(33, LOW); if (sAdr.substring(8, 9) == "1") digitalWrite(32, HIGH); else digitalWrite(32, LOW); if (sAdr.substring(7, 8) == "1") digitalWrite(43, HIGH); else digitalWrite(43, LOW); if (sAdr.substring(6, 7) == "1") digitalWrite(41, HIGH); else digitalWrite(41, LOW); if (sAdr.substring(5, 6) == "1") digitalWrite(40, HIGH); else digitalWrite(40, LOW); //    if (sData.substring(15) == "1") digitalWrite(24, HIGH); else digitalWrite(24, LOW); if (sData.substring(14, 15) == "1") digitalWrite(25, HIGH); else digitalWrite(25, LOW); if (sData.substring(13, 14) == "1") digitalWrite(26, HIGH); else digitalWrite(26, LOW); if (sData.substring(12, 13) == "1") digitalWrite(27, HIGH); else digitalWrite(27, LOW); if (sData.substring(11, 12) == "1") digitalWrite(28, HIGH); else digitalWrite(28, LOW); if (sData.substring(10, 11) == "1") digitalWrite(29, HIGH); else digitalWrite(29, LOW); if (sData.substring(9, 10) == "1") digitalWrite(30, HIGH); else digitalWrite(30, LOW); if (sData.substring(8, 9) == "1") digitalWrite(31, HIGH); else digitalWrite(31, LOW); //  10    delay(10); // digitalWrite(42, HIGH); digitalWrite(44, HIGH); delay(60); //     60    digitalWrite(44, LOW); digitalWrite(42, LOW); } void writeChip() { nMode = 0; int adr, dat; adr = 0; //      File myFile = SD.open("code.hex"); if (myFile) { //     : while (adr < 2048 && myFile.available()) { dat = myFile.read(); Serial.print((String)adr+" - "+(String)dat+" - "); Serial.println(dat, HEX); WriteByte(adr, dat); adr++; } //  : myFile.close(); } else { //    ,   : Serial.println("No file code.hex found!!!"); } } void readChip() { int r, i, adr = 0; String sAdr, sData; //  digitalWrite(42, LOW); pinMode(24, INPUT); pinMode(25, INPUT); pinMode(26, INPUT); pinMode(27, INPUT); pinMode(28, INPUT); pinMode(29, INPUT); pinMode(30, INPUT); pinMode(31, INPUT); adr = 0; while (adr < 2048) { //    sAdr = ""; sData = ""; for (i = sizeof(adr) * 8 - 1; i >= 0; --i) { sAdr = sAdr + (String)((adr >> i) & 1); } //   if (sAdr.substring(15) == "1") digitalWrite(39, HIGH); else digitalWrite(39, LOW); if (sAdr.substring(14, 15) == "1") digitalWrite(38, HIGH); else digitalWrite(38, LOW); if (sAdr.substring(13, 14) == "1") digitalWrite(37, HIGH); else digitalWrite(37, LOW); if (sAdr.substring(12, 13) == "1") digitalWrite(36, HIGH); else digitalWrite(36, LOW); if (sAdr.substring(11, 12) == "1") digitalWrite(35, HIGH); else digitalWrite(35, LOW); if (sAdr.substring(10, 11) == "1") digitalWrite(34, HIGH); else digitalWrite(34, LOW); if (sAdr.substring(9, 10) == "1") digitalWrite(33, HIGH); else digitalWrite(33, LOW); if (sAdr.substring(8, 9) == "1") digitalWrite(32, HIGH); else digitalWrite(32, LOW); if (sAdr.substring(7, 8) == "1") digitalWrite(43, HIGH); else digitalWrite(43, LOW); if (sAdr.substring(6, 7) == "1") digitalWrite(41, HIGH); else digitalWrite(41, LOW); if (sAdr.substring(5, 6) == "1") digitalWrite(40, HIGH); else digitalWrite(40, LOW); //  10       delay(10); r = 0; if (digitalRead(24) == HIGH){ sData = "1" + sData; r = r + pow(2, 0); } else sData = "0" + sData; if (digitalRead(25) == HIGH){ sData = "1" + sData; r = r + pow(2, 1); } else sData = "0" + sData; if (digitalRead(26) == HIGH){ sData = "1" + sData; r = r + pow(2, 2); } else sData = "0" + sData; if (digitalRead(27) == HIGH){ sData = "1" + sData; r = r + pow(2, 3); } else sData = "0" + sData; if (digitalRead(28) == HIGH){ sData = "1" + sData; r = r + pow(2, 4); } else sData = "0" + sData; if (digitalRead(29) == HIGH){ sData = "1" + sData; r = r + pow(2, 5); } else sData = "0" + sData; if (digitalRead(30) == HIGH){ sData = "1" + sData; r = r + pow(2, 6); } else sData = "0" + sData; if (digitalRead(31) == HIGH){ sData = "1" + sData; r = r + pow(2, 7); } else sData = "0" + sData; Serial.print(sAdr+" - "); Serial.print(sData+" - "); Serial.println(r, HEX); adr++; } nMode = 0; } void setup() { nMode = 0; Serial.begin(9600); pinMode(4, INPUT); pinMode(5, INPUT); pinMode(53, OUTPUT); if (!SD.begin(53)) { Serial.println("Card failed, or not present"); return; } Serial.println("start..."); pinMode(44, OUTPUT); digitalWrite(44, LOW); pinMode(42, OUTPUT); digitalWrite(42, LOW); pinMode(39, OUTPUT); pinMode(38, OUTPUT); pinMode(37, OUTPUT); pinMode(36, OUTPUT); pinMode(35, OUTPUT); pinMode(34, OUTPUT); pinMode(33, OUTPUT); pinMode(32, OUTPUT); pinMode(43, OUTPUT); pinMode(41, OUTPUT); pinMode(40, OUTPUT); Serial.println("Init...done!"); Serial.println("Waiting command..."); } void loop() { if (digitalRead(4) == LOW && nMode == 0){ delay(20); //     if (digitalRead(4) == LOW && nMode == 0){ Serial.println("Start writing chip..."); nMode = 2; writeChip(); Serial.println("Writing complete!!!"); delay(5000); } } if (digitalRead(5) == LOW && nMode == 0){ delay(20); //     if (digitalRead(5) == LOW && nMode == 0){ Serial.println("Start reading chip..."); nMode = 1; readChip(); Serial.println("Reading complete!!!"); delay(5000); } } delay(100); }
      
      










All Articles