=========================================================================   これは Wilcox、Fotland氏の"Standard Go Modem Protocol Rev.1.0"の   日本語要約です。前書きやサンプルプログラムは省略しています。                       1996.01.30 須永 sunaga@ibm.net ========================================================================= Standard Go Modem Protocol - Revision 1.0 (日本語要約) [1]通信条件    8データビット、1ストップビット、パリティ無し。 ボーレート 両対局者の合意による。 [2]メッセージフォーマット     メッセージは次の4バイト構成でパケット化する。 第1バイト.   スタートバイト 第2バイト.   チェックサム 第3、4バイト.  コマンド  2.1 Start Byte- 0000 00hy スタートバイトは6個の固定ビット、相手のシーケンスビット(h)と自分の シーケンスビット(y)を持つ。このシーケンスビットによって相手の受信状 況、相手からの新しいコマンドの有無等の判断を行い適切な処置ができる。 完全な4バイトパケットを読まないうちに新たにスタートバイトを読んだなら、 古いバイトは捨てる。  2.2 Checksum Byte − 1sss ssss   最上位ビットは常に1。Checksum (s)は符号なし正数として第1,3,4番 バイトの下位の7ビットの合計値とする.間違った checksum を受け取ったら、 そのメッセージは捨てる。  2.3 Command 2-byte - 1ccc rvvv 1vvv vvvv 各バイトの最上位ビットは常に1。 ccc は3ビットのコマンド(8個の基本 コマンド)を示す。vvv vvv vvvv はコマンドに付随する10ビット値である. 予約された(r)ビットが二つのフィールドを分離する. [3]コマンド ccc 3.1 ccc = 0. OK - 1000 0111 1111 1111 値 v はすべて1。OK は相手のコマンドを了解したことを示す.相手はこれを 受け取ることにより、新しいコマンドを送信することができる。 相手からコマンド受信したら必ず OK を送る。 またはこれを省略して自分のシーケンスビット(y)を反転し相手のシーケンス ビット(h)はそのままとし、次の自分のコマンドを送ってもよい。(OK と コマンドを同時に送ったものとみなす)。この省略方式は Query-Answer プロ トコルで使用する。 OK は実際にはコマンドではないのでこれに対しては何も応答しない。 QUERY コマンドに対しては OK ではなくANSWER コマンドを送る。 3.2 ccc = 1. DENY command - 1001 0000 1000 0000 相手の不正なコマンドを拒絶するときは OK の代わりに DENY で応答する。 DENY を受け取った側は OK を返送し, CONFLICT が発生したとみなして自分 のコマンドを取り消す。DENY に対して DENY で応答してはならない。 3.3 ccc = 2. NEWGAME command - 1010 0000 1000 0000 プログラムを初期状態にする。このコマンドを送信した側は標準値で対局準備 ができていることを保証する。 NEWGAME に対しては OK の代わりに QUERY を使って対局条件を得ることを基 本とする。OUERY を送らなければ対局条件が既に設定されているとみなされる。 NEWGAME に対して、または一連の QUERY-ANSWER 交換での最後の ANSWER に 対して OK を認識したら Black 側は自分の最初の手を送信する。 startup 時 BLACK 側が NEWGAME を送るものとする。しかし受取側は NEWGAME だから自分が WHITE 側であるとみなさず、QUERY-ANSWER プロトコルを使うこ とが望ましい。 WHITE 側は NEWGAME を受け取るまでコマンドを送らないこと。   3.4 ccc = 3. Query command- 1011 0sqq 1qqq qqqq QUERYコマンドはオプションである。必ずしも QUERY を実行しなくてもよい。 QUERYを受けた時は OK でなく ANSWER で答える。質問側は ANSWER を受け取る 毎に OK でそれを認める。もし質問側が得た答えが受け入れられないなら、OK の代わりに DENY を送る。 (1) QUERY コマンドの内容 ()内の数値は Answer の標準値 ビットs=1 Do you support extended command q ? Answer: 15 - Yes 0 - No (0) ビットs=0    qq..qq = 0 What game are you playing? Answer; 0 = unknown 1 = Go 2 = Chess 3 = Othello (1) qq..qq = 1 How big is your modem buffer ? Answer: n 実際のバッファサイズは 4+16*n (0) qq..qq = 2 What version of the protocol do you understand? Answer: n バージョンNo. (0) qq..qq = 3 How many stones on your board? Answer: 0 = no answer n = 盤上の石の数 qq..qq = 4 How much time has Black spent ? Answer: 0 = no answer n = 黒の考慮時間(分単位) qq..qq = 5 How much time has White spent ? Answer: 0 = no answer n = 黒の考慮時間(分単位) qq..qq = 6 What character set do you use ? Answer: 0 = unKnown 1 = English 2 = Japanease (1) qq..qq = 7 What rules are you using ? Answer: 0 = unknown 1 = 日本ルール 2 = 中国ルール (1) qq..qq = 8 What handicap are you set for ? Answer: 0 = unknown 1 = 互戦 n = 置石の数 (1) qq..qq = 9 What is the board size ? Answer: 0 = unknown N = (N 路盤)      qq..qq = 10 What is time limit per player ? Answer: 0 = unknown N>0 制限時間(分単位) qq..qq = 11 What color is the computer playing on your side ? Answer: 0 = unknown 1 = white 2 = black qq..qq = 12 Who are you ? Answer: n プログラム ID 番号   (2) セットアップパラメータ セットアップパラメーターは QUERY-ANSWER プロトコルを使用して設定 する。もし質問側が 0 の回答を受けたら、それを default 値とみなす。 3.5 ccc = 4.Answer comand − 1100 0aaa 1aaa aaaa  QUERY コマンドに対しては最低限 値 0 で応答する。a..a の値は3.4項を 参照すること。 ANSWER を受信したらその値を正しく認識して OK で送信す ること。 3.6 ccc = 5. Move comand − 1101 0pii 1iii iiii value のトップビット(p)は白の手番なら1、黒の手番なら0とする。 9ビットの値(i..i)は碁盤上の位置(0以外)または pass(0) を表す。 碁盤の位置は左下端を 1 とし右へ 2,3,4... と数え、盤端にきたら上に1行 上がって続けて数える。19路盤では右上端が361となる。 プログラムは現在までのすべての手を記憶しておくこと。相手からの不正な手 を検出したら DENY で応答する。 ハンディキャップ(置碁) 日本ルールでは定められた位置にあらかじめセットする。この位置は送信しない。 中国式ル−ルでは置石の数だけ move command を送る。白側は pass は送らない。 3.7 ccc = 6.Takeback command - 1110 0ttt 1ttt tttt 値(t..t) が示す分だけ手数を戻す。対局プログラムはこれに対応して手を戻せること。 3.8 ccc = 7.Extended command − 1111 0mmm 1mmm mmmm 1nnn nnnn 1sss ssss   拡張コマンド m..m:付加バイト数 n..n:拡張コマンド名 s..s:拡張部のチェックサム(bytes 5,7..4+m) n = 0 STRING 1000 0000 テキストを後ろに付加する.必要なら2バイトコードも可. n = 1 REPLAY 1000 0001 1nnn nnnn 1nnn nnnn TAKE BACK MOVE の逆 n..n は手数 n = 2 MULTIPLE 1000 1111    複数のコマンドを送る [4]CONFLICT もし両方のプレーヤーが同時にコマンドを送ると、CONFLICT が発生する。OK 待ち状態の時,相手から新たにコマンドを受信し,そのコマンドが自分のシーケ ンス番号と異なっていた場合 CONFLICT が発生したとみなす。 [5]自動チェックと時間合わせ QUERY コマンドを対局プログラム同士の石の数の確認,考慮時間の調整に利用 できる. [6]会話文 パケットの外のバイトはトップビットが 0 なので 7 bit ascii コードの テキストとみなし,これを適当な表示エリヤに表示してコンピュータ同士の 会話に利用することができる. この機能を持つことは強制しない.単に読み捨てても良い. [7]初期条件 1.シーケンスID 双方とも 0 で始める. 2.OK 以外の新しいコマンドを送るときは自分のシーケンスID を反転させて メッセージに組み込む。よって最初のメッセージのスタートバイトは 0000 0001 となる.(相手のID=0 自分のID=1) 3.どちらから最初のコマンドを送っても良い. 4.相手の シーケンス ID は受信したコマンドから判定する. 5.OK 以外のコマンドを送ったら,OK を受信するまで次のコマンドを送らない. 6.数秒経っても応答がなければ同じコマンドを再送する.シーケンス ID は 変えない. [8]メッセージ解析 入力するバイトは テキスト,スタートバイト,その他 の3つに分類される. テキストはスタートバイト以外のトップビットが 0 のバイトである. メッセージフォーマットに合わないその他のバイトは読み捨てる。 [9]状態遷移 プログラムは次の二つの動作モードを持つ (a)ニュートラル アイドル状態.未処理のコマンドはない.コマンドを発行できる. (b) OK 待ち 自分の発行したコマンドの応答を待っている. 相手から新しいメッセージを受信したとき,その時の動作モードと受信した スタートバイト内のシーケンスビットにより対応する処置を行う。 現在の シーケンスビット h ,y 受信した シーケンスビット h',y' とすると自分自身は次の意味を持つ. h != h' 相手から新しいコマンドが来た STATUS (1) h == h' 相手から新しいコマンドはない STATUS (2) y != y 自分のコマンドは受け付けられていない STATUS (A) y == y' 自分のコマンドは受け付けられた STATUS (B) 9.1 ニュートラル : (アイドル状態、未処理のコマンドを持っていない)  OK を受信 +----------+-------------------------------+--------------------------+ | STATUS | 意味 | 処置 | +----------+-------------------------------+--------------------------+ | A1,A2,B1 | ありえない状態 | | +----------+-------------------------------+ メッセージを捨てる | | B2 | 不要な OK  | | +----------+-------------------------------+--------------------------+ コマンドを受信 +----------+-------------------------------+--------------------------+ | STATUS | 意味 | 処置 | +----------+-------------------------------+--------------------------+ | A1,A2 | 自分のコマンドを受け | | | | 付けていないのに新たな | メッセージを捨てる | | | コマンドを送ってきた | | +-----------+------------------------------+--------------------------+ | B1 | 正常なコマンド | OK を送って | | | | コマンドを実行 | +----------+-------------------------------+--------------------------+ | B2 | 相手は自分の OK をまだ | 最後に送った OK または | | | 受付けていない | コマンドを再送する | +----------+-------------------------------+--------------------------+ 9.2 OK 待ち : (OK を受け取るまで n 秒ごとにコマンドを送っている状態) OK を受信 +----------+-------------------------------+--------------------------+ | STATUS | 意味 | 処置 | +----------+-------------------------------+--------------------------+ | A1,A2,B1 | ありえない状態 | メッセージを捨てる | +----------+-------------------------------+--------------------------+ | B2 | 正常な OK | NUETRAL にもどす | +----------+-------------------------------+--------------------------+ コマンドを受信 +----------+----------------------------------------------------------+ | STATUS | 意味 | 処置 | +----------+----------------------------------------------------------+ | A1 | 新たなコマンドを受信したが | 自分のコマンドを取り消す | | | 相手は自分のコマンドをまだ | 自分のシーケンスidを反転 | | | 受付ていない.(CONFLICT) | させて NEUTRAL にする | +----------+----------------------------------------------------------+ | A2 | 古いコマンドを受信 | 自分のコマンドを再送する | | | 相手は自分のコマンドを受付て | | | | いない | | +----------+----------------------------------------------------------+ | B1 | 新たなコマンドを受信 | NEUTRAL にする | | | 相手は自分のコマンドを受付て | OK を送ってコマンドを | | | いる。相手からの OK を取り損 | 実行する | | | ねた可能性がある | | +----------+----------------------------------------------------------+ | B2 | ありえない状態 | メッセージを捨てる | +-----------+---------------------------------------------------------+ [10]タイミング このプロトコルではコマンドあるいは OK をいつ送ってもかまわないことに なってるが,最も確実な方法はコマンドを送ったら相手の OK を待ち,それから 自分のコマンドを実行することである。また正常なコマンドを受信したら直ちに OK を送って、それからそのコマンドに対応する処理を行う。こうすると両方の コンピュータが同時にそのコマンドを処理していることになる。 受信したコマンドを実行した後、 OK を送ると、相手はその間待ち状態となり 効率的ではない. OK を待たずに自分のコマンドを実行する場合は、CONFLICT が起きたときその コマンドを取消し元に戻せるようにしておく必要がある。 両方のプログラムが startup 時に自動的に QUERY あるいは NEWGAME を発する ようになっていると,2つのプログラムは CONFLICT を起こす可能性がある。 プログラムを再スタートしても、再び CONFLICT を起こす。プロトコルはこの ような無限ループを避けらないので、CONFLICTを起こして、再トライするときは ランダムに遅れを入れることを勧める。 CONFLICT が何回か続いたら送信を止めてユーザに通知しても良い。一方は適当 に再初期化 できるべきである。黒側が最初に NEWGAME コマンドを送ることを 勧める。受信側は対局パラメーターを設定するために QUERY コマンドを発する、 そして次に 黒側(置碁の場合は白側)が 最初の手を送る。 [日本語補足]大会での自動対局 ・ボーレート 2400 bps とする。 ・プログラム ID 番号は大会参加者にあらかじめ与えられる。 ・Query Command の使用 対局条件はあらかじめ決定しているので省略してもよい。ただし相手から の Query Command に対しては少なくとも 0 で応答すること。 ・Extended Command は使用しない。 ・Takeback Command コンピュータプログラム同士の対局では基本的にないはずである。これは 通信機能を持たないプログラムのために人間が操作する代替え機を使った ときに打ち間違いを修正するために発するものである。