■全ての謎を解き明かすパソコンリンク
パソコンリンクはザウルス内の全てのドライブとファイルにアクセスできる方法なのですが、ここでは具体例としてアドインのダウンロードについて説明します。
◎パソコンリンク・プロトコルに関する注意
パソコンリンク・プロトコルはザウルス内の全てのファイルを操作できる強力なもので、使い方を誤ると内部ファイルを破壊する可能性と、ゴミファイルを内部に残す可能性がありますので、通信プログラムを実際に組まれてテストする際は事前にザウルスのデータを全てバックアップする等の自衛策を取って下さい。
なお、これまでZauBASE の転送試験で無茶してますが、ザウルス本体機能そのものに損傷を与えたことはないので(全初期化すれば元に戻るということです)神経質になる必要はないと思いますが(^_^;
■パソコンリンク・プロトコルの基礎要素
パソコンリンクはコマンド(CFV,CFF,CFD,CFU,CFC,CLE)リクエスト(RFV,RFF,RFD,RFU,RFC)アンサー(AFV,AFF,AFU,AEX,DOK,ANG)という3つの要素から成り立ちます。
コマンドを送りザウルスの応答準備を指示し、リクエストでザウルス内のドライブとファイル名を指定します。
そして、実行結果はアンサーとして返されます。
■パソコンリンクでできる操作
コマンド | レスポンス | リクエスト | アンサー | |
ファイルの確認 | CFV | DOK (ANG) | RFV | AFV (ANG) |
ファイル情報取得 | CFF | DOK (ANG) | RFF | AFV (ANG) |
ダウンロード | CFD | DOK (ANG) | RFD | AEX (ANG) |
アップロード | CFU | DOK (ANG) | RFU | AEX (ANG) |
削除 | CLC | DOK (ANG) | RFC | AEX (ANG) |
パソコンリンク解除 | CLE | DOK (ANG) |
■アドイン・ダウンロードのための手順
実際のアドイン転送処理
■CFV コマンド送信(RFV リクエストが使えるか確認)
パソコンからザウルスに"RFV"というリクエストが可能かという、"CFV"というコマンドを送信します。
"RFV"が可能なら、ザウルスからパソコンに対し"DOK"というレスポンスが返されます。
データは単方向通信で行われ、通信制御として、SOH,ACK,ENT,ENQが使われます。
方向 | 実データ | 意味 |
PC→ZAU | 01 | <SOH> |
01 FE | データブロック番号 | |
03 00 | データ長(0003hバイト) | |
43 46 56 | "CFV"(コマンド) | |
DF 00 | チェックサム | |
← | 06 | <ACK>(正常受信) |
→ | 04 | <ENT>(送信完了) |
← | 06 | <ACK>(正常受信) |
→ | 05 | <ENQ>(送信要求) |
← | 01 | <SOH> |
01 FE | データブロック番号 | |
03 00 | データ長 | |
44 4F 4B | 文字列"DOK" | |
DE 00 | チェックサム | |
→ | 06 | ACK |
← | 04 | ENT |
→ | 06 | ACK |
← | 05 | ENQ |
■RFV リクエスト(ファイルの存在確認)<アドイン機能搭載機種か?を確認>
このRFV で、NIFADR.BOX(NIFTY 接続先)ファイルが存在するかをチェック
存在するなら、この機種はPI4500以降(アドイン搭載機種)となります。
PC-ZAU | ||
→ | 01 | <SOH> |
01 FE | データブロック番号 | |
14 00 | データ長(0014hバイト) | |
52 46 56 0A 00 00 53 31 3A 4E 49 | RFV・・・S1:N | |
46 41 44 52 2E 42 4F 58 00 | FADR.BOX・・・ | |
81 04 | チェックサム |
◆参考:RFV におけるファイル名のフォーマット
"RFV" | 0A 00 00 | "S1:" | "NIFADR.BOX" | 00 |
リクエスト | 取得するデータバイト数 | ドライブ名 | ファイル名 | 00固定 |
■RFVリクエストに対するアンサー
PC-ZAU | ||
← | 06 | <ACK>(正常受信) |
→ | 04 | <ENT>(送信完了) |
← | 06 | <ACK>(正常受信) |
→ | 05 | <ENQ>(送信要求) |
← | 01 | <SOH> |
01 FE | データブロック番号 | |
0D 00 | データ長 | |
41 46 56 | "AFV" | |
FF 00 10 02 3F 00 00 11 00 00 | ファイルの先頭から0Aバイト | |
3E 02 | チェックサム | |
→ | 06 | ACK |
← | 04 | ENT |
→ | 06 | ACK |
← | 05 | ENQ |
◆正常応答 "AFV" (そのファイルは存在する)<アドイン機能あり
■CFF コマンド送信 (RFFリクエストが使えるか)
PC→ZAU | 01 | <SOH> |
01 FE | データブロック番号 | |
03 00 | データ長(0003hバイト) | |
43 46 46 | "CFF"(コマンド) | |
CF 00 | チェックサム | |
← | 06 | <ACK>(正常受信) |
→ | 04 | <ENT>(送信完了) |
← | 06 | <ACK>(正常受信) |
→ | 05 | <ENQ>(送信要求) |
← | 01 | <SOH> |
01 FE | データブロック番号 | |
03 00 | データ長 | |
44 4F 4B | 文字列"DOK" | |
DE 00 | チェックサム | |
→ | 06 | ACK |
← | 04 | ENT |
→ | 06 | ACK |
← | 05 | ENQ |
◆CFF に対する応答 "DOK" は正常応答
■RFF (ファイル情報取得)<PI4500識別>
このRFF で、"S7:"という内部ドライブ(本体Bに該当)にNIFADR.BOX(NIFTY接続先)ファイルが存在するかをチェックしましす。
存在するなら、この機種はPI5000以降となります。
もし存在しないなら、この機種はPI4500で、その場合は転送できるアドインサイズのチェックが必要になります。
PC-ZAU | ||
→ | 01 | <SOH> |
01 FE | データブロック番号 | |
11 00 | データ長(0011hバイト) | |
52 46 46 53 37 3A 4E 49 46 41 44 52 | RFFS7:NIFADR | |
2E 42 4F 58 00 | .BOX | |
6D 04 | チェックサム |
◆RFF におけるファイル名のフォーマット
"RFF" | "S1:" | "NIFADR.BOX" | 00 |
リクエスト | ドライブ名 | ファイル名 | 00固定 |
■AFF (ファイル情報応答)<S7:にNIFADR.BOXに関する情報があればPI5000以上>
PC-ZAU | ||
← | 06 | <ACK>(正常受信) |
→ | 04 | <ENT>(送信完了) |
← | 06 | <ACK>(正常受信) |
→ | 05 | <ENQ>(送信要求) |
← | 01 | <SOH> |
01 FE | データブロック番号 | |
0D 00 | データ長 | |
41 46 46 | "AFF" | |
4E 49 46 41 44 52 20 20 20 42 4F 58 | "NIFADR BOX" | |
20 20 20 20 36 38 32 38 20 20 20 20 20 | 6828(サイズ) | |
39 35 2D 31 30 2D 33 31 20 31 33 3A 33 32 | 95-10-31 13:32 | |
0D 0A | CR + LF | |
89 08 | チェックサム | |
→ | 06 | ACK |
← | 04 | ENT |
→ | 06 | ACK |
← | 05 | ENQ |
◆AFF におけるファイル情報のフォーマット ("s" は1バイトスペース)
"AFF" | ファイル名本体 | 空白 | 拡張子 | 空白 | ファイルサイズ | 空白 | 年月日 | 空白 | 時分 | CR | LF |
8文字 | .1BYTE | 3文字 | 1BYTE | 7桁 | 5BYTE | 5BYTE | |||||
AFF | NIFADR | BOX | 6828 | 95-10-31 | 13:32 | CR | LF |
■同一名アドインのチェック
RFF + "転送したいファイル名"のリクエストを実行して、もし、ファイル情報が取得できれば同名のアドインが既にザウルス内部に存在することになります。
情報が取得できない場合は、そのファイルはザウルス内部に無いことになります。
厳密に考えると、アドインを上書きで転送した場合、データファイルとの整合性が取れなくなるので、しない方が安全ですが、上書きしても問題ないよう、まずザウルス内部にある同名ファイルを削除してから転送する方法を採ることができます。
◆まずCFFでご機嫌取り
PC→ZAU | 01 | <SOH> |
→ | 01 FE | データブロック番号 |
03 00 | データ長(0003hバイト) | |
43 46 46 | "CFF"(コマンド) | |
CF 00 | チェックサム | |
← | 06 | <ACK>(正常受信) |
→ | 04 | <ENT>(送信完了) |
← | 06 | <ACK>(正常受信) |
→ | 05 | <ENQ>(送信要求) |
← | 01 | <SOH> |
01 FE | データブロック番号 | |
03 00 | データ長 | |
44 4F 4B | 文字列"DOK" | |
DE 00 | チェックサム | |
→ | 06 | ACK |
← | 04 | ENT |
→ | 06 | ACK |
← | 05 | ENQ |
◆ZTEST2.BAS というアドインがザウルス内に存在するか?
PC-ZAU | ||
→ | 01 | <SOH> |
01 FE | データブロック番号 | |
11 00 | データ長(0011hバイト) | |
52 46 46 53 31 3A 5A 54 45 53 54 32 2E 42 41 53 00 | "RFFS1:ZTEST2.BAS" | |
6C 04 | チェックサム |
■存在しない場合の応答 "ANG" (存在する場合は"DOK" が返る)
PC-ZAU | ||
← | 06 | <ACK>(正常受信) |
→ | 04 | <ENT>(送信完了) |
← | 06 | <ACK>(正常受信) |
→ | 05 | <ENQ>(送信要求) |
← | 18 | <CAN> |
01 | <SOH> | |
01 FE | データブロック番号 | |
06 00 | データ長 | |
41 4E 47 53 30 32 | "ANGS02" | |
8B 01 | チェックサム | |
← | 04 | <ENT> |
← | 05 | <ENQ> |
→ | 05 | <ENQ> |
→ | 06 | <ACK> |
→ | 06 | <ACK> |
◆ANG応答時の制御交換について(通常の制御交換に比べ特殊です)
"ANG" 等の異常応答が返る時は、制御コード<CAN(18h)>がまず、返ります。
その後、異常応答を示す"ANG" とその要因(エラーコート)が3バイトのデータとして、返されます。
PC-ZAU | 対応する制御コード | ||
← | 04 | <ENT> | |
← | 05 | <ENQ> | 通常のENQ |
→ | 05 | <ENQ> | <CAN>に対する<ENQ> |
→ | 06 | <ACK> | "ANGS02"への<ACK> |
→ | 06 | <ACK> | <ENT>への<ACK> |
プログラム組むときは応答を適切に行うか、<CAN>応答時は ACK-ENT-ACK-ENQ ではなくて、ENT:ENQ-ENQ:ACK:ACKで応答するようにすれば良いはずです。
■ファイルのダウンロード(パソコンからザウルスへ)
◆CFD コマンド(RFD が使えるか)
PC→ZAU | 01 | <SOH> |
→ | 01 FE | データブロック番号 |
03 00 | データ長(0003hバイト) | |
43 46 44 | "CFD"(コマンド) | |
CD 00 | チェックサム | |
← | 06 | <ACK>(正常受信) |
→ | 04 | <ENT>(送信完了) |
← | 06 | <ACK>(正常受信) |
→ | 05 | <ENQ>(送信要求) |
← | 01 | <SOH> |
01 FE | データブロック番号 | |
03 00 | データ長 | |
44 4F 4B | 文字列"DOK" | |
DE 00 | チェックサム | |
→ | 06 | ACK |
← | 04 | ENT |
→ | 06 | ACK |
← | 05 | ENQ |
■RFD (ダウンロードリクエスト)
◆RFD の場合は、まず、ファイル名を送信し、次に実際のデータ部分を転送
PC-ZAU | ||
→ | 01 | <SOH> |
01 FE | データブロック番号 | |
11 00 | データ長(0011hバイト) | |
52 46 44 53 31 3A 5A 54 45 53 54 32 2E 42 41 53 00 | "RFDS1:ZTEST2.BAS" | |
6A 04 | チェックサム |
◆RFD におけるファイル名のフォーマットは RFVと同じ
◆RFD における応答
正常にデータ転送できた場合はザウルスから<ACK>を返す。
この<ACK>を受けて次のデータブロックの送出に入る。
その際、<ACK> に対しては<ENT> ではなく、<SOH>
を返すことでデータが継続していることを通知します。
← | 06 | <ACK> |
◆次のデータブロック(ファイル本体)
→ | 01 | <SOH> 継続 |
02 FD | ブロック番号に注目 | |
2D 00 | データ長(2Dhバイト) | |
52 46 44 FF 00 00 00 34 00 00 4B | "RFD" + データ部 | |
00 00 00 00 00 00 00 00 00 00 0D 00 01 13 3A 27 | ・・・・・・・・・・・・・・:' | |
1E 10 41 42 43 44 45 46 47 61 62 63 64 65 66 67 | ・・ABCDEFGabcdefg | |
0D FF | ・・ | |
AE 08 | チェックサム |
◆最後のブロックまで転送完了したので、ACK-ENT-ACK-ENQ交換
← | 06 | <ACK>(正常受信) |
→ | 04 | <ENT>(送信完了) |
← | 06 | <ACK>(正常受信) |
→ | 05 | <ENQ>(送信要求) |
■AEX (ダウンロード正常終了応答)
ファイルが正しくザウルスに格納された場合"AEX"を返します。
← | 01 | <SOH> |
01 FE | ブロック番号 | |
03 00 | データ長 | |
41 45 58 | "AEX" | |
DE 00 | チェックサム |
◆正常終了のための、ACK-ENT-ACK-ENQ交換
→ | 06 | <ACK>(正常受信) |
← | 04 | <ENT>(送信完了) |
→ | 06 | <ACK>(正常受信) |
← | 05 | <ENQ>(送信要求) |
■次のファイル送信(同じパターンで送信)
アドインの場合重複ファイル名チェックはプログラム"*.BAS"だけで大丈夫です。
→SOH | ブロック番号 | →"CFD" | ||
←ACK | →ENT | ←ACK | →ENQ | |
←SOH | ←"DOK" | |||
→ACK | ←ENT | →ACK | ←ENQ | |
→SOH | →01 FE | →"RFDS1:ZTEST2.BAI" | ||
←ACK | ||||
→SOH | →02 FD | →"データブロック1" | ||
←ACK | ||||
→SOH | →03 FC | →"データブロック2" | ||
←ACK | →ENT | ←ACK | →ENQ | |
←SOH | ←"AEX" | |||
→ACK | ←ENT | →ACK | ←ENQ |
■全てのファイル転送終了後、パソコンリンクを解除します。
→SOH | →"CLE" | ||
←ACK | →ENT | ←ACK | →ENQ |
←SOH | ←"DOK" | ||
→ACK | ←ENT | →ACK | ←ENQ |
これで、アドインのダウンロード完了、ザウルス側はザウルスリンクが解除されます。