プログラマー考古学





先週の土曜日、私は「サブボトニック」を開催し、最終的に棚とキャビネットを掃除することにしました。



古い箱では、あらゆる種類の異なる機器、異なるボード、クジラの開発者、古いディスクのパックが、デバイスのいくつかの興味深いインスタンスを発見しました。まさに古代の遺物です。 ストーリー全体がこれらのアーティファクトに関連しているので、伝えたいと思います。



そんな感じでした。 遠い、遠い年に、サイプレスCY7C63723チップのファームウェアを開発するための注文を受けました。 それはそのようなPS / 2-USBマイクロコントローラーでした。 タスク:このチップのファームウェアを書き込みます。 しかし、1つの警告がありました。 このチップは、プロトコルをPS / 2からUSBに変換するように設計されていますが、2つのPS / 2デバイスを接続する必要がありました。つまり、そのようなUSBコンバーターチップを使用してPS / 2マウスとPS / 2キーボードを接続する必要があります。 チップはJetwayマザーボードにインストールする必要があります(メモリが変更されない場合)。



もっと正確に言えば、それは次のようなものでさえありました。このタスクはすでに一部の開発者によって実行されましたが、彼にとってはうまくいかなかったものです。 ソースコードは私たちに与えられ、彼らはそれを修正してやり直すことは緊急だが、それが機能するためだと彼らは言った。 失敗した前任者のソースコードに加えて、これを取得しました...







これは、プログラミングする必要があったTwo-PS / 2-to-USBコンバーターのプロトタイプです。 実際、これは単なるモックアップであり、チップをマザーボードに直接インストールして、追加のマウスとキーボードを提供しました。 これは、2人のユーザーが同時に使用できるマルチユーザーコンピューターのマザーボードであると想定されていました。







サイプレスCY7C63723エミュレーター! このような小さなチップとこのような大きなエミュレーター。 これが技術です。 チップは一度だけであり、単一のファームウェア(OTP-One Time Programmable)であったため、ファームウェアを取得して開発することは不可能です。 すぐに縫って試着することはできません-長すぎて無駄です。 そのため、サイプレスは開発者にこのような奇妙なデバイス-チップエミュレーターを提供しました。 プログラムをコンパイルし、マイクロサーキットをエミュレーターにロードすると、マイクロサーキットシミュレーターがループを介して将来のデバイスのボード上のソケットに挿入されます。 今はわかりませんが、インサーキットプロセッサデバッガさえあったようです。







これが普遍的なプログラマーです。 彼は数十個のきれいなサイプレスチップも持っていましたが、今はどこにありますか?



古い箱でこれらの鉄片を発見したとき、好奇心が現れました。 これらのプログラムのソースを見つけることができますか? これはどれくらいですか?



今ではすべて簡単です。 私は今、すべての新しいラップトップが以前のものよりもかなり大きなハードドライブを持っています。 ラップトップを購入し、古い小さなディスク全体を大きなディスクに書き換えることがわかりました。 最初のラップトップは90 GB、2番目は320 GB、最後のラップトップは1 TBでした。 繰り返しますが、今は「クラウド」とGITがあります。 そして、アーカイブはCDに保存されました。 時には、念のために、彼らは確かにいくつかのディスクを記録しました。







古いディスク上の古いプログラムを見つけることは、本当に難しい作業です。 しかし-見つかった! 2003年にさかのぼります-約13年前です。 まあ、時々、私の当時のアドバイス:「現在のバージョンというフレーズでディスクに署名しないでください。」



だから...このタスクのためにチームに2人がいました。USBやサイプレスのマイクロ回路については全く知りませんでしたが、私たちは熱心に取り組みました。



何が起こっているかの本質を説明するために、CY7C63723チップについて少しお話しします。 このマイクロコントローラでは、次のように機能していました。





そして、それはほとんどすべてです...もちろん、さまざまなアドレス指定方法は理解できます。 当然、アセンブラーで記述する必要があります。 もちろん、マイクロコントローラーの内部には、マイクロコントローラーの伝統的な周辺機器がすべて残っています。タイマー、GPIO、およびそれらからの割り込み、USB機能などです。



このマイクロサーキットの古いドキュメント(ディスクで見つけた)を考えると、これが私です。このプロジェクトを思い出し、この奇跡に驚きました。 マイクロコントローラーの能力を十分に感じられるように、コマンドのリストの断片を示します。



NOP-4つの対策

INC A-4つの対策

INC X-4小節

INC [EXPR]-7つの対策

INC [X + EXPR]-8メジャー

ADD A、EXPR-4メジャー

ADD A、[EXPR]-6メジャー

ADD A、[X + EXPR]-7メジャー

...



12 MHzのマイクロコントローラーのクロック周波数にもかかわらず、実際には、まったく高速ではないことが判明しました-すべてのメガヘルツはコマンドごとのビートを食べました。



最も興味深いのは、どのように動作するかをすばやく把握し、すべてをすばやく修正し、最初のチップをフラッシュし、テストし、キーボードとマウスが動作し、CAPS、NUM、LOCKキーボードのLEDが動作することです。 やれやれ、すべてが元気です、みんなが幸せで幸せです!



しかし、ありません。 1、2週間後、顧客は仕事をしていないと言います。 私たちは見つけようとしています-本当に理解できるものは何もありません。 私たちと最終顧客の間には仲介者がいます。 つまり、ドイツの会社が私たちを注文し、台湾の会社が私たちを注文します。 台湾からのメールはほとんど読むことができません。 彼らは「Chinglish」で書かれています-これは人が中国語で考え、英語で書くときです-解読することは困難です。 最終的に、PS / 2-USBコンバーターが機能しないプログラムを送信することに同意しました。 彼らはそれがすべてのプログラムで動作すると言いますが、特にこのプログラムで動作します-いいえ。



さて、我々は彼らのテストプログラムを収縮させようとしています。 2003年、私たちはまだダイヤルアップモデムを使用しています。接続は常に切断され、非常に大きなプログラムはダウンロードできません。 そこにN回目の試行があり、ポンプアウトします...(ドラムロール)Doom2。 でも何? なんで? どうして?



すべてが非常にシンプルであることがわかります。多くの場合、押して、キーボードのキーを押して移動し、実行してジャンプし、同時に回転してマウスで撮影する必要があります。 そして、私たちは決してしませんでした。 結局のところ、私たちはすべての普通の人と同じように試してみました:キーボードのキーを試してみました-エディターで文字を入力してから、マウスを試してみました-それは行きます。 しかし、それは起こります...



マイクロコントローラープログラムを完全に修正しなければなりませんでした。 詳細な分析により、両方のPS / 2デバイスから同時に飛行するキャラクターでは、2つのポートでDATAおよびCLK信号を処理することが非常に困難であることが明らかになりました。 ここでは、信号の波形は提供しませんが、少なくともここではmarsohod.org/11-blog/56-ps2でインターネット上で簡単に見つけることができます。 PS / 2のCLK信号周波数は最大18KHzです。 頻度は非常に低いようですが、数えるとまったく面白くないことがわかります。 PS / 2 CLK周波数とマイクロコントローラープロセッサの周波数の比:12000000/18000 = 666(ホラー)。 5クロックサイクルの平均コマンド長では、PS / 2ブロックの2つのエッジ間で実行できるマイクロコントローラーコマンドは130を超えないことがわかります。 そして、2つのPS / 2ポートからの4つの信号(DATA0から、CLK0から、DATA1から、CLK1から)の割り込みが構成されています。 最悪のケースは、いくつかの信号のエッジが偶然一致した場合です。ポートは非​​同期です。 連続して異なるポートから2つの割り込みがある場合、通常60サイクルの割り込みが残ります...



一般的に、私は文字通り各チームの期間を考慮する必要がありました。 割り込みハンドラーのアセンブラーコードのフラグメントを提供します。ここでは、コマンドにかかるクロックサイクルの数が何行もかかる場合があります。



org 0d00h snd_recv_tabl0: jmp recv_startbit0 jmp recv_bit0 jmp recv_bit1 jmp recv_bit2 jmp recv_bit3 jmp recv_bit4 jmp recv_bit5 jmp recv_bit6 jmp recv_bit7 jmp recv_parity0 jmp recv_stop0 jmp send_startbit0 jmp send_bit0 jmp send_bit1 jmp send_bit2 jmp send_bit3 jmp send_bit4 jmp send_bit5 jmp send_bit6 jmp send_bit7 jmp send_parity0 jmp send_stop0 jmp send_stop1 rise1: rise0: pop a reti capture_a_isr: ;here we service interrupts from ps2 port 0 ;we must make it as short as possible... push a ;[5] iord port0 ;[5] iord port0 ;[5] rrc ;[4] jc rise0 ;[4] mov a,[status0] ;[5] asl ;[4] jacc snd_recv_tabl0 ;[7+5] - 44 ticks ;------------------------------------------------------------------------------- recv_startbit0_: inc [status1] mov a,PS2_WD_TIMEOUT mov [ps2_wd_b],a pop a reti recv_bit0_: recv_bit1_: recv_bit2_: recv_bit3_: recv_bit4_: recv_bit5_: recv_bit6_: recv_bit7_: iord port1 rrc rrc ;now our strobed bit in flag C mov a,[sh_in_lo_reg_p1] rrc mov [sh_in_lo_reg_p1],a inc [status1] pop a reti recv_parity0_: inc [status1] pop a reti recv_stop0_: mov a,[flag_wait_fa_1] cmp a,1 jz filter_fa1 mov a,[sh_in_lo_reg_p1] ;[5] push x ;[5] mov x,[fifo_head_p1] ;[5] mov [x+fifo_p1],a ;[6] store our byte to fifo inc x ;[4] increment fifo head mov a,x ;[4] pop x ;[4] and a,00fh ;[4] fifo size is 16 byte? mov [fifo_head_p1],a ;[5] save new fifo ptr for future filter_fa1: mov a,0 ;[4] mov [status1],a ;[5] mov [flag_wait_fa_1],a mov [ps2_wd_b],a pop a ;[4] reti ;[8] - 63+44=107 ticks nop
      
      





もちろん、多くの詳細が記憶から消えていくので、多くの詳細を覚えていません。 深く再設計されたプログラムがDoom2でも正常に機能したことを知っています。 ライフカウントの対策は次のとおりです。



そして、あなたは何を知っていますか? 今でもこの古いプログラムをコンパイルすることができましたが、BATファイルを起動しました。







興味深いことに、この物語には続編もありました。 結局、PS / 2コードはHIDコードに変換されました(PS / 2プロトコル自体は非常に複雑でした。marsohod.org/ 11-blog / 57-ps2protoを参照)。 そして、顧客が東南アジアの国から来たとき、そこにあるいくつかのキーは私たちのものとまったく同じではありません。







私たちのオフィスでの考古学的発掘中に、当時の典型的なキーボードを見つけました-それはテストのために私たちに送られました。 他のエキゾチックなオプションがありましたが、すべてが生き残ったわけではありません。 追加のカタカナおよびひらがなキーを備えたキーボードがあったことを覚えています-それはどういう意味ですか? そして、顧客は彼らが働くことを要求します。 彼らはどのように働くべきですか? それらをクリックするとどうなりますか?



彼らはこれを行いました。2台の同一のコンピューターを同じPC-英語版Windows 2000にインストールし、2番目のPC-純粋な日本語版Windows 2000にすべてのOSをMSDNサブスクリプションから取得しました。 Windowsのインストール中にダイアログの質問に正しく答えるには、2台のコンピューターが必要です-読むことも翻訳することもできません。 2台のPCでの並行インストールはどういうわけか保存されました。 後に、キーボードは日本語WindowsがインストールされたPCに接続され、これらの論争の的となるキーを押して、押されたときに何が起こるかを理解しようとしました。 ここで何とか問題が解決しました。 それはどのくらいですか...



さて、何が起こったのか:結果として、棚で分解して整理することはできませんでした。 それどころか、彼は考古学者のための他の貴重で興味深いアーティファクトを求めてすべての箱と箱を照らしました...とても多くの興味深いものが見つかりました...



All Articles