RCX CODE命令一覧


ロボコン

このページについて

このページではRCX CODE(RISに付属の言語)で使える命令一覧を書きまーす。
書く順番はコマンドブロックビン
(RISでプログラミングしているときに画面左側にある、
コマンドを引っ張り出す場所)に出てくる順番です。
命令はRCX CODE2.0準拠、の筈。Ver.1.0とはかなり違うので、要注意。
基本的にはRIS付属のプログラミング画面から呼び出せる
ヘルプファイルに則っています。

ちょっとだけ用語解説

下に良く出てくる
"○○の指定方法は即値変数乱数の何れか。"
即値はつまり数字でという意味です。
3.0とか1.2とか4.7とか345.6みたいなのです。
対して変数はどこかに自分が保存した値のことです。
変数についての解説は、LEGO MINDSTORMSの為のプログラミング初歩?
のページに書いてあります。まだでーす。
乱数は指定範囲内でランダムな値が適用されます。
一般には、実行する度に違う値になります。
またしばしば出てくるスタックとは、
一繋がりになったプログラムブロック群のことです。
(厄介なことに、一般のプログラミングではスタックは
このような意味で使われる言葉ではありません。)
内部的には、この単位で管理が行われているようです。
そのため、実行されるプログラム部分に繋がっていない
宙ぶらりんのブロック群でも最大で159個までしか繋げられません。
メインルーチンの始めに置いてあるブロックや、
センサーウォッチャー自体にも大きさがあるので、
実際に動かすプログラムには、どうやっても実質1738個(=9×(158-1))の
ブロックしか含めないことになります。
これはRCX本体の記憶+実行に使われるメモリ容量を余裕を持って
使う為に設けれられた制約だと思います。

ビッグ・ブロック(Big Blocks)

これについては詳細省略。え?趣味だって?
概略だけ書くか…。

すべてのロボットに使用できるビッグ・ブロック

ローヴァーボット、アクロボット、およびアートボット専用のビッグ・ブロック


インベンタボット専用のビッグ ブロック

リフリッジ フレッド専用のビッグ ブロック

ロボット アーム専用のビッグ ブロック

キャンディー ソーター専用のビッグ ブロック

セキュリティボット専用のビッグ ブロック


デリバリボット専用のビッグ ブロック

でもタイトルだけだったりして。そのうち書き足しますよ。

スモール・ブロック(Small Blocks)

こっちが本題。サイズは全て1。つまり一つのスタックに159個まで入れられる。

電源ブロック(Power Blocks)

出力をコントロールするブロック群。動作は殆んどこれで決まる。

オン(On)

どの出力ポートに電源を入れるかを選択。
方向の設定はなされないので注意すること! 普通、下に出てくるウェイト、更にオフと併用する。

一定時間オン(OnFor?)

オンと基本的には同じ。但しオンになる時間を指定可能。
時間の指定方法は即値変数乱数の何れか。


オフ(Off)

どの出力ポートの電源を切るかを選択。
しかしオンとは違い、ブレーキ滑降かを選択可能。
でも体感的な差は殆んどない。一応ブレーキの方が安全か?

パワーの設定(SetPower?)

出力を設定する。出力の範囲は1〜8の整数。多分電圧。
電圧の指定方法は即値変数乱数の何れか。

方向の設定(SetDirection?)

出力の方向(どっちの線が+か)を設定する。
出力ポートを選択し、その出力の方向を設定する。

逆方向(ReverseDirection?)

選択した出力ポートの方向を反転する。
便利は便利だが、ちょっとややこしい。

サウンド・ブロック(Sound Blocks)

ロボコンするにはオマケみたいな機能。
あるとちょっと評価があがるかな?


ビープ(Beep)

6種の音から一つを選択。音は1〜6までの即値で指定。
同時に鳴らせる音は(トーンとビープ合わせて)8つまで。
鳴らし始めると終わるまでは鳴り続ける。
途中で止める方法はない。
(もしかしたら他に8つ音を出すと一番最初に出した音が消えるかも?)

トーン(Tone)

周波数持続時間を指定すると、その通りの音がそれだけの時間発される。
周波数(31〜20000)は即値ないし変数ないし乱数で指定、
持続時間は0.1〜2.5秒の範囲で即値指定。

オマケの周波数リスト
音階低音中間高音
13126252310472093
ド#13927755411092217
14729458711752349
レ#15631162212452489
16533066013202640
ファ17535069913982797
ファ#18537074114822963
19639278515703140
ソ#20841683216633326
22044088017603520
23346693218653729
シ#24749498819763951

右側から左側に行くにつれて周波数がおよそ2倍ずつになっていることに注目!
また#が付いているのが黒鍵、付いていないのが白鍵の音に相当。

サウンドのミュート(MuteSounds?)

このブロックを置いた後、サウンドのミュート解除が置かれるまで、
全ての発音ブロック(ビープとトーンと楽器音?)は無視される。

サウンドのミュート解除(Un-Mute)

このブロックの後、再び発音ブロックが有効になる。

通信ブロック(Communication Blocks)

他のRCXとの赤外線通信及び液晶画面への値の表示に関する命令群。


IRメッセージの送信(SendIRMessage)

赤外線を使って、他のRCXに1〜255(つまり8bit。但し0を除く)までの数値を送る。
送る値は即値変数で指定する。

IRメッセージのクリア(ClearIRMessage)

他のRCXから送られてきたIRメッセージを消去する。
明示的にIRメッセージのクリアを行わないと次のメッセージは読み込まれないので注意!!
内部的にはメモリの一部にメッセージが保存されていて、
値が非ゼロならば上書きをしないようになっている様だ。
読んでいないうちに新しいメッセージが来て過去のメッセージが消えると困るからだろう。

値の表示(DisplayValue?)

正負4桁の10進数を表示可能。
即値の場合は、-9999〜+9999の整数か、-999.9〜+999.9の固定小数点数(つまり0.1刻みの数)のいずれかが表示可能。
変数(ないしセンサー類の値)は、-999.9〜+999.9の範囲の固定小数点数(同上)が表示可能。
デバッグなどに便利。

クロックの表示(DisplayClock?)

組み込みカウンタの数値が表示される。00.00の書体で左側は分、右側は秒を表示している。
普通にプログラムを実行すると画面はこの状態になる。
何かの値を表示した後、元の表示に戻したい場合にどうぞ。
あまり使い道はない。

変数ブロック(Variables)

使用可能な値の範囲は-3276.8〜+3276.7まで。
二進数で書けば、-0b100000000000000/(10)〜+0b11111111111111/(10)
あ、(10)は10進数ね。つまり16b(=2B)の二進数の範囲。
16進数で書けば、0x0000〜0xFFFFまでが記録できて、
0x0000〜0x7FFFまでが正数、0x8000〜0xFFFFまでが負数として扱われる。
(それを十分の一にした物が表示される)
つまり、変数aに1.0を設定することは、
0b000000000001010即ち10を設定している訳デス。
名前に使えるのは所謂ASCII。
つまり半角英数。でも数字が先頭ではいけない。


設定(Set)

一般的に言われるところの宣言代入
ある変数を確保し、それに特定の値を入れる。
代入には定数(直接数値を入れる)、変数(他の変数の名前を指定する)が使える。

追加(Add)

加算。ある変数に、別の数を加算する。
加算された変数の内容は変化するので注意が必要。
つまり、小文字a,b,cを変数名とすると、
a=a+ba=a+cは出来るが、a=b+cはできない。
a=b+cをしたければ、a=0,→a=a+b,→a=a+cをしなければならない。
また数値の範囲の都合上、3276.0+1.0=-3277.0(=0x7FF8+0x000A=0x8002)とか
(-3276.8)+(-0.1)=+3276.7なんて現象が発生する(多分)。
加算に使用できるもの(a=a+bのbに当たる部分)は、
定数値(3.0など)、(それ自身も含む)変数、カウンタ、センサーの値、IRメッセージの値。

引算(Subtract)

減算。加算とほぼ同じ。なので略。

乗算(Multiply)

乗算もやはり、a=a\times\!bのスタイルしかできない。
もちろん、3276.7×2=-0.2(=0x7FFF+0x7FFF=0x8000+0x8000-2=0x10000-2)
なんて現象が起きる。

除算(Divide)

除算も…、a=a\div\!bのスタイルしかできない。
ただし、0で割ってはいけない。

正にする(MakePositive?)

与えられた数を正にする。元の値が正でも負でも構わない。
(想像だけど)内部的には以下のような動作をしている。

  1. 0bxxxxxxxxxxxxxxxxの、先頭ビットは1か?(0ならば終わる)
  2. 全ての桁の数を反転する。(ビット反転。0を1に、1を0に変える)
  3. そうして出来た数字に1を足す。
    具体的には-1を正にするときには以下の様になっていると思われる。
  4. -1→0xFFFF→先頭は1
  5. 0xFFFFを0x0000に変える
  6. 0x0000に1を加える→0x0001

負にする(MakeNegative?)

「正にする」と極めてよく似ている。

  1. 0bxxxxxxxxxxxxxxxxの、先頭ビットは0か?(1ならば終わる)
  2. 1を引く
  3. 全ての桁の数を反転する

リセット・ブロック(Reset Blocks)

類似のブロックに通信ブロックに分類されている、
IRメッセージのリセットも類似のブロックなので要チェック。

ライトのリセット(ResetLight?)

ライトセンサーの既定値を現在のライトセンサー値に変更する。
但し、ライトセンサーの既定値を使っていない場合には特に意味がない。
どのポートにライトセンサーが接続されているかを選択する必要がある。

温度のリセット(ResetTemperature?)

温度センサーの既定値を現在の温度センサー値に変更する。
どのポートに温度センサーが接続されているかを選択する必要がある。

回転センサーのリセット(ResetRotation?)

選択したポートにつながれた回転センサーの値を強制的に0にする
上記の二つのリセットブロックとは動作が違うので注意。

タイマーのリセット(ResetTimer?)

選択したタイマーの値を強制的に0にする
1〜3までのタイマーのいずれかを選ぶ。
特定時点からの時間を計りたい(ラップタイム等)時に便利。

詳細ブロック(Advanced Blocks)

優先順位の設定(SetPriority?)

センサーウォッチャーの優先順位を変更する為のブロック。
既定の優先順位は以下の通り。

  1. 一番高い優先順位(当初設定されているスタックはない)
  2. 変数ウォッチャー
  3. タッチセンサーウォッチャー
  4. ライトセンサーウォッチャー
  5. 温度センサーと回転センサーウォッチャー
  6. IR センサーウォッチャー
  7. タイマーセンサーウォッチャー
  8. メインのスタック 優先順位が低いものは、優先順位の高いモノが実行中に割り込みを掛けられない。
    等位の場合にどうなるかは不明。要確認。

電源接続(ConnectPower?)

下記の電源切断のブロックで切断された電源を復旧する為のブロック。
電源切断を使わない場合は無意味。

電源切断(DisconnectPower?)

選択した出力ポートの出力を切るブロック。
このブロックで出力を切断された後、
上記の電源接続ブロックで電源を元に戻すまでは、
そのポートへの一切の出力が無視される
ので、他のモーターの出力が邪魔で問題のモーターの出力がよく分らない時に、
邪魔なモーターの出力をカットするのに使う。

グローバル・リバース(GlobalReverse?)

出力の極性を調整する為のブロック。
反転する出力ポートを一つだけ選ぶ。
本質的には方向の設定と変わらない。
しかし方向の設定の矢印と、モーターの回転方向を分かり易いよう揃えるのに
別のブロックを使うと見易いぞ、ということだろう。
するとこのブロックでの設定以後、設定されたポートは完全に極性が反転する。
(つまり、方向の設定で同じ方向が設定されていても
このブロックの前後ではモーターの回転方向が逆転する)
普通はプログラム開始時に1度だけ使う。

グローバルな方向設定(ResetDirection?)

上記グローバルリバースと本質的に変わらない。
出力ポートの極性を反転するポートを選択し、
反転するものだけ↓を選択するのだと思う。
詳しい動作は確認して下さい
何故こんなに似た様なブロックがあるのかはよく分からない…。

プログラムの終了(EndProgram?)

プログラムの実行を終了する為のブロック。
このブロックに達すると、プログラムは終了し、
以後センサーウォッチャーからの割り込みは実行されない
タイマー系などはモーターの動作が終了した後にも、
勝手に作動する可能性があるので注意!!
ので、センサーウォッチャーを使うプログラムでは
動作終了時に一応これを使ったほうが安全。

マイ・ブロック(My Blocks)

マイブロック自体(間に入るブロックをのぞいた分)のサイズは2。
つまり一つのスタックに79個まで入れられる。
(中身が空のマイブロックを79個入れてどーなるなんて聞かないで)

ウェイト(Wait Blocks)

サイズは全て1。つまり一つのスタックに159個まで入れられる。
まぁウェイトだけじゃ何も出来んが。

ウェイト(WaitFor?)

待ち時間を0.01〜327.67秒までの0.01秒刻みで指定。
指定法は、即値ないし変数ないし乱数のいずれか。

ウェイト期限(WaitUntil?)

指定したイベントが起きるまで待つ。
監視できるイベントの種類は基本的にはセンサーウォッチャーやIFと同じで、

  1. タッチ
  2. ライト
  3. 回転
  4. IRメッセージ
  5. 変数
  6. 温度
    の6種。タイマーは抜けている。そういう目的では普通のウェイトを使え、ということだろう。

リピート(Repeat Blocks)

間に含まれるブロック群を繰り返し実行するのに使う。
リピート系ブロック自体(間に入るブロックをのぞいた分)のサイズは2。 つまり一つのスタックに79個まで入れられる。 (中身が空のリピートを79個で何するんでしょうね)

リピート(RepeatFor?)

リピートの回数を2〜32767の間で指定する。
指定法は即値変数乱数のいずれか。

リピート無限(RepeatForever?)

間に挟まれたブロック群を永久に繰り返し実行し続ける。
但しセンサーウォッチャー内で使った場合は、別のセンサーウォッチャーに処理が移動した後再びイベントが起こるとリピート無限は止まるので注意が必要。

分かり難い文章なので具体例を。

  1. 本体ルーチン(RCXの写真つきブロックの下)
  2. センサーウォッチャーA(例えばライトセンサーウォッチャーで黒い線を感知すると作動)
  3. センサーウォッチャーB(例えばタイマーウォッチャーでAに入って20秒を超えると作動)

で、Aの中にリピート無限ブロックが使われていたとする。
するとこのプログラムは大体こんな動作をする(多分)。

  1. 最初は本体のプログラムが実行される
  2. 黒い線が見つかったらAが実行される
  3. Aを実行し続けて20秒たったらBが実行される

Bが実行されている最中に黒い線を見つけたら、Aが実行されるが、
このときリピート無限の実行が停止される。…らしい。
誰か確認してくれ。

リピート期間(RepeatWhile?)

予め指定した条件が満たされている間、リピート期間ブロックの間に挟まれたブロック群を実行する。
リピート期間条件が満たされている間実行するのに対し、
リピート期限条件が満たされると実行を終えると動作が反対なので注意すること。
但し、条件は間に挟まれたブロック群を実行し終わるごとにしか判定されない
条件はウェイトやIF、センサーウォッチャーと同じく

  1. タッチ
  2. ライト
  3. 回転
  4. IRメッセージ
  5. 変数
  6. 温度
  7. タイマー

の7種で指定可能。これも具体例を挙げる。
例えば本体プログラム(RCXの写真つきブロックの下)の中身が

  • リピート期間ブロック(タイマーが30秒以下なら実行)
  • リピート期間の中のブロック群(5秒前進した後6秒右回転)
    ↑長いので以下中のブロック群と略記。

だったとすると、プログラムは以下のように進む。
最初タイマーは0秒だとする。

  1. とにかく「中のブロック群」が実行される
  2. リピートの終わりに到達し、条件が調べられる
    • この時点でタイマーは11秒(5秒+6秒)で、これは条件を満たす(≦30秒)ので、ループは続く
  3. 「中のブロック群」が実行される
  4. リピートの終わりに到達し、条件が調べられる
    • この時点のタイマーは22秒(11秒+5秒+6秒)で、これは条件を満たすので、ループは続く
  5. 「中のブロック群が実行される」
    • このループの実行中に時間は30秒を越えるが、それでもループの終わりまで行く
  6. リピートの終わりに到達し、条件が調べられる
    • この時点のタイマーは33秒(22秒+5秒+6秒)で、これは条件を満たさないので、ループは終わる。

リピート期限(RepeatUntil?)

リピート期限ブロックは、予め指定した条件が真になるまで
間に挟んだブロック群(以降「中のブロック群」と略記)を実行する。
つまり繰り返しを終える条件を指定する。
リピート期限条件が満たされると実行を終えるのに対し、
リピート期間条件が満たされている間実行すると動作が反対なので注意すること。
また条件は常に監視されていて、真になったら即、実行が終わることにも注意。
具体例を書くと、本体ブロック(RCXの写真つきのブロック)の下に、

  1. リピート期限ブロック(タイマーが30秒を越えたら実行終了)
  2. リピート期限ブロックの中のブロック群(5秒前進+6秒右回転)

のブロックがあるとする。また、タイマーは最初0であるとする。
するとプログラムは以下のように実行される(と、思われる)。

  1. 「中のブロック群」の実行が始まる
    • 実行中、30秒に辿り着くことは無い(0秒〜11秒まで)ので無事実行される
  2. 再び、「中のブロック群」の実行が始まる
    • こちらも無事実行される(11秒〜22秒まで)。
  3. 3回目の実行が始まる
    • 3度目の右回転の途中でタイマーが30秒に達するので、「中のブロック群」の実行は終わってしまう
  4. ひたすら右回転を続ける(モーター停止の命令がないため)

誰か試してね。

はい、またはいいえ(Yes or No Blocks)

はい、またはいいえ(YesorNo?)

プログラム中の特定の箇所で、条件分岐を行う為のブロック。
このブロック自体(間に入るブロックをのぞいた分)のサイズは2。
つまり一つのスタックに79個まで入れられる。
(YesorNo?だけ79個入れ子にしても何も出来んが)
はい、またはいいえというブロックの名前通り、
条件は「はい」か「いいえ」で答えられる形でしか設定できないことに注意すること。
はい」である(条件が満たされている)場合は左側に挟まれたブロック群(以後「左群」と略記)が、
いいえ」である(条件が満たされない)場合は右側に挟まれたブロック群(以後「右群」と略記)が、
それぞれ実行される。
条件の指定に使えるのは、タイマーやセンサーウォッチャーなどと同じく

  1. タッチ
    1. 押した場合
    2. 離した場合
      クリックは使えず
  2. ライト
    1. 明るい
    2. 暗い
    3. 範囲
      ブリンクは使えず
  3. 回転
    1. 時計回り
    2. 反時計回り
    3. 範囲
  4. IRメッセージ
    1. 等しい
    2. より小さい
    3. より大きい
    4. 中間(なぜか範囲ではないことに注意)
  5. 変数
    1. 等しい
    2. より小さい
    3. より大きい
    4. 中間(なぜか範囲ではないことに注意)
  6. 温度
    1. 温かい
    2. 冷たい
    3. 範囲
  7. タイマー

の7種類。

センサー(Sensors)

条件が満たされたかどうかを常時監視するセンサーウォッチャーを使う為のブロック群。
センサーウォッチャーを使えると、プログラムの幅が大きくふくらむ。
但しクセが多く、特に各センサー毎に優先順位が違ったりするので注意が必要。
また強力だがメモリを食うらしく、
センサーウォッチャーは一つのプログラムの中で8個までしか使えない
という大きな制約がある。 センサーウォッチャー自体(間に入るブロックをのぞいた分)のサイズは1。
つまり一つのセンサーウォッチャーの下には最大で158個のブロックしかぶら下げられない。
もちろん、ハイまたはイイエマイブロックを使えば、
当然もっと少ない数のブロックしか入れられない。

タッチ(SensorsTouch?)

既定の優先順位は3。
タッチセンサーイベント各種に反応するセンサーウォッチャーを作成できる。
イベントは

  1. プレス(押された時に作動)
  2. リリース(離された時に作動)
  3. クリック(押された後0.25秒以内に離された時に作動)

の三つが選べる。

ライト(SensorsLight?)

既定の優先順位は4。
ライトセンサーイベント各種に反応するセンサーウォッチャーを作成できる。
イベントは

  1. 明るい(プログラム実行時に決まる既定値か、即値か、変数値より明るさが大きくなると作動)
  2. 暗い(既定値か、即値か、変数値より明るさが小さくなると作動)
  3. ブリンク(点滅した時、と書いてあるが詳細不明)
  4. 範囲(明るさが指定した上限と下限の間に入ったら作動)

の4つから選べる。

温度(SensorsTemperature?)

回転(SensorsRotation?)

既定の優先順位は5。1/16回転毎に数値が一つづつ変わる。
(要確認)回転の向きは、コードが生えている方を後ろ、生えていない方を前だとすると、
その状態でセンサーの軸にタイヤを付けた時に、
前進させると加算、後退させると減算される。
値の範囲は-32768〜+32767(16bit)まで。
監視できるイベントは

  • より大きい(設定値以上になった時。指定法は即値ないし変数)
  • より小さい(設定値以下になった時。指定法は即値ないし変数)
  • 等しい(設定値になった時。指定法は即値ないし変数)
  • 範囲(設定した上限と下限の範囲内に入った時。指定法は即値ないし変数)

の4種。何れにしろ値の範囲以内でないと指定不可。
条件が満たされたら一度条件が満たされなくなるまでは反応しないので注意すること。(要確認)
具体例を挙げる。

  1. 本体ルーチン
  2. 回転センサーウォッチャー(範囲8以上で反応)

だとする。そして30cm前進する毎にセンサが一回転すると仮定する。
すると、

  1. 15cm程進むとセンサーが8に達し、センサーウォッチャー下の命令が実行される
  2. センサーウォッチャー下の命令の実行が終わる
  3. 更に進んでも条件は満たされたままだがセンサーウォッチャー下の命令は実行されない
  4. 後退したとすると、回転センサーの値は8未満に戻る。
  5. 後退した後に再び前進すると、回転センサーの値も再び8以上になり、センサーウォッチャー下の命令が実行される

IRメッセージ(SensorsIRMessage)

既定の優先順位は6。
IRメッセージに反応する各種センサーイベントが作成できる。
イベントは

  1. 等しい(即値ないし変数と一致した時)
  2. より小さい(即値ないし変数より小さい時)
  3. より大きい(即値ないし変数より大きい時)
  4. 中間(二つの即値ないし変数の間の時)

の4種。IRメッセージは一度に一つしか保持できないことに注意。
しかも自動での上書きはされないので、
一々IRメッセージのクリアを行わないといけない。

タイマー(SensorsTimer?)

既定の優先順位は7。
タイマーは3つ存在するが、監視できるイベントは

  1. タイマー1と等しい
  2. タイマー2と等しい
  3. タイマー3と等しい

の三つ。値の指定法は即値または変数。
値の範囲は0.1〜3276.7。値は0.1秒に0.1ずつ増加する。
タイマー値は自由に変更することはできないが、
リセットすることは出来る。

変数(SensorsVariable?)

既定の優先順位は2。
監視できるイベントは、

  1. 等しい(変数値が即値又は変数と等しい時)
  2. より小さい(変数値が即値又は変数より小さい時)
  3. より大きい(変数値が即値又は変数より大きい時)
  4. 中間(変数値が2つの即値又は変数の間にある時)

の4種。他のセンサーウォッチャーと同じく、
条件が満たされるとその下にあるブロック群が実行されるが、
やはり同じく条件が満たされっ放しの時には
改めて実行されたりしない。

番外 プログラム・ブロック(Program_Block)

このブロックの下に繋がったブロック群が、先ず実行される。
保存後には、ファイルの名前がこのブロックの上部に表示される。
マニュアルなどでは、このブロック群のことを
しばしばメイン・スタックと呼んでいる。
このプログラムブロック自体にも1のサイズがあり、
下には最大でも158個のブロックしか繋げることはできない。

また、このブロックの右側のタブをクリックすると、
RCXの内部状態を確認することができる。
全ての入力ポートの状態と値、全ての出力ポートの方向と出力値、
そして最大で同時に3つの変数の状態を確認できる。
三つ以上の変数を使っている場合には、
"RCXの値"と書いてある欄の、表示されている各変数の左側にある
下向き矢印ボタンを押すことで、表示する変数を切り替えることが出来る。
バグ取りには貴重な機能。
但し、この機能を使用中は常にRCXとの赤外線通信が確立されている必要があること、
通信の維持の為にRCXの実行速度が遅くなることには注意が必要。
微妙なタイマー制御を使っているときなどは、
この機能を使ったせいで動作が変わってしまう、何てこともあるかも…。

最新の20件

2008-03-31
  • RCX CODE命令一覧
2014-07-25 2011-05-19 2010-02-08 2008-10-16 2008-06-06 2008-05-31 2008-04-16 2008-03-24 2008-01-11 2007-12-30

  • counter: 1184
  • today: 1
  • yesterday: 0
  • online: 1