CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

V53

ターゲット/ホストプログラム

これでUSB通信の準備が整ったわけですが実際の電文のやり取りのためには ターゲット(ボード)側、ホスト側でそれぞれプログラムを作る必要があります。 まずターゲット側。 パイプ1を通して受信したときに起動される処理で受信バッファの内容をシリアルコ…

ホスト側ドライバインストール

この状態でホスト側デバイスドライバ 柏野 政弘氏作の「汎用USBドライバ」のインストールを行います。 http://www.otto.to/~kasiwano/newpage17.htm あらかじめデバイス情報ファイルuusbd.infにボード側デバイスプログラムに埋め込まれた ベンダID、プロダク…

ドライバ見直し

USBN9603というのは1バイトデータをハード的に送受信してくれるだけでトランザクション、 プロトコルそのものはソフトウェアで組立てなければならないということに今になって気づきました。 一応、ハードが正常動作しているのでシーケンスが正常に流れるよう…

ハンダ不良修正

外部データバスのD6ラインを点検するも他の信号線とショートしているような様子はありません。 もしショートがあればメモリアクセスにも影響が出るわけですが・・・ よくよく考えてみると、USBN9603から読み出す時にデータレベルが安定していないで 入出力…

USBコントローラの配線ミス?

コントロールレジスタへの書込みがうまく行かずプログラミングに失敗している とも考えられます。 まずI/Oとしてレジスタを正常に読み書きできるかどうかですが既にRIDとCCONF は正常にアクセスできることは見ました。 ところがこれは下4ビット…

通信フロー割込み化

USBコネクタを接続した状態です 基本的にUSBコントローラで何か処理すべきイベントが発生したらレジスタを読みに行って それぞれの処理に分岐させます。 分岐処理の本体をusb_int()という関数にまとめ、ハード割込みで起動するようにしました void far usb_i…

USB初期化

先ずUSBN9603を初期化しなくてはなりませんが、H8-USB基板の初期化ルーチンを拝借してきて 各レジスタにパラメータをセットだけするプログラムを作成しました。 ホストのWindowsマシンとV53基板をUSBケーブルで接続しこの初期化プログラムを起動させると 次…

USBテスト開始

V53ボードにはUSBインターフェースを載せていましたが動作確認することも無く完全に放置していました。 OSに面倒見てもらって挿せばつながるというお手軽さがどうも気に入らず、食わず嫌い感があったのですが さすがに今のテクノロジから取り残されている危…

NTP実装(3)

ならば、1900年1月1日午前0時から1970年1月1日午前0時までの経過時間を 差し引けば良いんではないかと。 この70年間の秒数はと・・・うるう年も入れて、おっと1900年はうるう年でないな。 すると25567日、2208988800秒となりました。これをNTP時刻から差し引…

NTP実装(2)

このパケットモニタは優れものでNTPのデータグラムを解析して表示までしてしまいます。 実際に返送される時刻情報は整数部32ビット、小数部32ビットの計64ビットで表現されています。 [パケット情報] (Request 210.173.160.57 -> 192.168.0.10) [MAC層] (EtherI…

NTP実装(1)

ネットワーク関係はいったん完結させたのですがちょったやって見たいことがあるので再び。 いままでのプログラムはサーバとして動作してクライアントからのコマンドに対して レスポンスを返すものでしたが、こんどはクライアントとして動作させてみます。 で…

アプリケーション実装(3) - ほぼ完結

リモートIOのうち、入力側すなわちボード上の状態を読みこんで それをクライアント側に送信する部分が無かったのでこれを追加。 ボード上で入力デバイスはDIPスイッチしかないので、これを読みとって WEBページのHTML文におり込んでしまえばいいと思うのでペ…

アプリケーション実装(2)

HTTPサーバのアプリケーションとしてI/Oリモート制御のプログラムのつづき 動作としては、まずボード上のプログラムアクセスすると タイトルやテキストボックスなどで構成されたWEBページを返します。 パソコン側でこのページにテキストを入力したりチェック…

アプリケーション実装(1)

プロトコル部分の動作が問題無くなったのでアプリケーション部分を切り離して 別モジュールでリンクしたところ、いきなり動作しなくなってしまいました。 実行させるといきなり暴走するという感じです。 少しずつコードを削って動作していたときの状態に近づ…

HTTP実装(5)

ブラウザ画面上にINPUTフォームを表示させることができたので 今度は、そこに入力したパラメータをサーバに送り、アプリケーションに引き渡す処理を 作ります。 上図のようなフォームで「送信」をクリックしたとき、どのようなパケットが送られるか モニタし…

HTTP実装(4)

ブラウザに表示はできるようになりましたが、リロードで再表示させようとすると 通信不能の状態になってしまいました。 パケットモニタで調べると、最初の1回目の表示が完了し接続を切ったとき、 クライアントからFINコマンドが連続して再送されてきていま…

HTTP実装(3)

HTTP実装のつづき さてボード上でHTTPサーバの走らせて、WEBブラウザのアドレス欄に 「http://192.168.0.10/」を入力すると・・ ボードのシリアルモニタでTCPコネクション完了、「G」コマンド受信、HTML送信・・ とまで行くのですがブラウザのステータスラ…

HTTP実装(2)

こうして出来上がったHTTPサーバ処理の中心部分が以下です。 TCPで受け取った文字列の先頭が(GETの)「G」ならば(←えらい手抜き) 「HTTP~」以下の固定文字列を送り出すだけです。 if(user_data[0]=='G'){ /* GETメソッド */ strcpy(user_data,"HTTP/1.0 …

HTTP実装(1)

TCPができたのでHTTPの実装に移ります。 PICNICの実装例もありますがHTTPがあればクライアント側に特別な制御ソフトを用意しなくてもWEBブラウザで制御できるということですね。 最終的には家の外からパソコンや携帯電話でエアコンなどの家電製品を制御・・…

TCP実装(5) TCP通信成功

TCP実装つづき。 これまでに接続要求、切断要求はOKになりました。 次に接続中にクライアント(PC)からデータを送ると本来ならばサーバ(V53ボード)は ACKを返して完了するはずですがクライアントから何度も同じ電文を再送してくるという現象になります。 サ…

TCP実装(4) TCPコネクション成功

TCP実装のつづき。 TCP通信中にパケットモニタを起動して、相互のデータの内容をログしてみました。 これはかなり強力なデバッグ方法でプログラム内で変数モニタしなくても良くわかります。 ボードから送り出されるパケットのデータをよくよく見てみるといろ…

TCP実装(3)

TCP実装のつづき。 ボードの内部状態がLISTENからSYN_RCVDに移り、ボードからSYN/ACKを返送するところまでできたのですが、ここからがうまく行きません。本来であればクライアントからACKを送ってきてそれでTCPコネクション完了なのですが、実際には再度SYN…

TCP実装(2)

V53ボードにTCPサーバ機能を実装しようというつづき。 入手したTCP処理の構造体を、現状のプロトコルの構造体に置き換えていく作業をしています。 IP層でデータがコピーされていないためにTCP層で動作がおかしいなんてことがありますが、プロトコルが階層化…

TCP実装中

IP層の上にTCP層を乗せようとしているのですがこれが難しい。 ターゲットが計測目的の場合、UDPはリアルタイムで処理できる利点があるということで実装例がみられますが、TCPの実装となると市販のミドルウェアを使用する例が多いようです。 それでも見つけて…

UDPでリモートIO

「UDPはIPにポート番号の薄い皮をかぶせたもの・・」なんて書きましたが、 これは間違いでパケット構造からいうとポート番号はアプリケーションデータに直接かぶっている一番内側の皮ですね。栗でいうと渋皮か。 UDPの上にアプリケーション層を乗せました。…

UDP通信実験

ところで、プロトコルが上位に上がってくると(つまりアプリケーションに近くなると)動作確認にはそのプロトコルを利用したアプリケーションが必要になります。 本来ならばVBやVCで制御アプリを作るところですが、取り急ぎVectorで探してみたところちょうど…

UDP実装

つづいてUDPトランスポート層を実装しました。 これはIP層のパケットにポート番号という非常に薄い皮をかぶせただけで特に制御が有るわけで無く、簡単な処理です。 メインのループの方も受け取ったIPパケットがUDPであればUDP入力処理を行うだけです while(1…

割込みでパケット受信

タイマ出力での割込みの動作が確認できたので、LANコントローラの受信割込みで受信処理を行います。 ところがしばらくぶりに元々のポーリングによるパケット受信処理プログラムを動かしてみたところ、どうもうまく動きません。パケットを受信したところでプ…

割込みテスト 続き

あとはプログラム内で ICUに割込みベクタ番号を設定 outp(IIW2,0x80); /* int no base:x80 */ 割込みベクタに割込みルーチンのアドレスをセット void set_vect(int no, void (far *func)()) { long far *vector; vector=(long far *)0x00000000+no; *vector=…

割込みテスト

受信完了で割込みを発生させるためV53内蔵割込みコントローラ(ICU)のテスト。 V53に内蔵されているICUは昔からあるi8259のサブセット(というか不要な8085モードを削除しただけ)でこれは使った経験はあります。 8259はアドレス空間が2つしかないのにここ…