SHENZHEN I/O

SHENZHEN I/O

309 ratings
Shenzhen I/O 日本語リファレンス・マニュアル
By himatchi
Shenzhen I/Oの公式リファレンスpdfを日本語訳したものです
翻訳対象はゲームを進めるのにあたって必要な基本的なものに留まります
Shenzhen I/O Reference for Japanese.
18
2
   
Award
Favorite
Favorited
Unfavorite
はじめに
このマニュアルは私個人がShenzhen I/Oを楽しむために作成する日本語マニュアルであり、技術的な物に関してのみ翻訳いたします。メールやビザなどのストーリーテリングについては翻訳しません。
このマニュアルは英語を読めなくてもゲームが進められる様に書かれたものであり、ゲームを買わなくても楽しめるもので或ってはならないと考えたからです。

その為、ゲームの購入者はこのガイドと合わせて公式pdfを読むことを強く推奨します。

また、理解の助けのために一部分に於いてこのマニュアル独自の記載を施していますが、概ねは公式マニュアルに則った形で書かれています。

文中にオペランドという言葉が頻出します。これはプログラミング用語で被演算子を意味し、処理の対象となるものです。
プログラムは命令とオペランドのセットで構成されます。
つまり、"何に"、"何を"するかを書くのがプログラムです。この場合"何に"がオペランド、"何を"が命令にそれぞれ相当します。頻出語句なので確認しておいてください。

最後に、ご意見のある方はコメントをよろしくお願いします。皆様のお陰でこのマニュアルの質が向上することでしょう。
非公式日本語化について
Bird Man氏によって日本語化用ファイルが公開されています。
詳細は以下を参照してください。

Bird Man氏のレビュー
https://steamcommunity.com/id/IkioiShota/recommended/504210/
アプリケーションノート268 2種類の入出力、無限の可能性
Shenzhen I/Oには2種類の入出力ピンがあります。Simple I/OとXBusです。それらは相互運用性がなく、同じ種類同士のピンにのみ接続可能です。

Simple I/O
Simple I/Oの値は0から100までの連続的な値です。Simple I/Oのピンには何も書かれていません。
Simple I/Oはマイコンのシンプルな入力(例えばボタンやスイッチ、マイクなど)への接続のために用いられます。
また他の装置へのシンプルな出力(例えばLEDやスピーカー、モーターなど)にも使われます。

XBus
XBusの値は-999から999までのデジタル信号です。
XBusのピンには黄色いドットの印があります。
XBusは通常、マイコン間のデータ転送や複雑な入出力(例えばキーパッドや数値ディスプレイなど)に用いられます。

Simple I/OとXBusの振る舞いの違い
Simple I/Oのピンは繋がれたデバイスの状態にかかわらずいつでも読み書きが可能です。
(訳註:Simple I/Oのピンに対して書き込んだ場合、新たに上書きされるまで書き込まれた値を保持して出力します。またSimple I/Oのピンに対して読み取りを行った場合、読み取った瞬間の入力値が得られます。また、複数の入力がある場合は最も高い入力値が得られます。しかしピンが出力している値を、そのピン自身が読み取る事はできません。これによりSimple I/Oピンを簡易的なレジスタとして使用することはできません。)

XBusはしかし、同期プロトコルです。XBusを流れるデータは送信者と受信者の両方が通信準備状態になった時のみ送信されます。もし片方が通信準備状態でない場合に送受信を行おうとした場合、送受信エラーにより処理がブロックされ、動かなくなります。
(訳註:同じTU内でお互いに通信準備状態になれば多少のズレは問題なく、エラーは発生しません。しかしいずれかのマイコンが通信準備状態のままTUを終了するとブロックが発生し、処理が続行できません。)
(訳註2:1本のバスに対して複数のマイコンから出力を行ってもXBusはある程度適切な処理が可能です。しかし1本のバスから複数のマイコンが入力を得ようとした場合、その解決順序はある程度一定の規則があるものの予測不能であり、不安定なシステムとなってしまいます。)
アプリケーションノート393 十分なSleepを取ろう!
  • CPUは一般的に読み書きする信号よりも早く動作します。
  • CPUは1時間単位(以下1TU)に非常に大量の処理が行なえます。
  • 次の処理へ進むまでの間に、CPUはスリープ状態になれます。
  • CPUをスリープ状態にするには、slp命令を用い、スリープさせたいTUを整数値でオペランドにします。
サンプル回路
矩形波発生器
以下のプログラムはpin1のSimple I/OのON(100)とOFF(0)を3TU毎に切り替え、矩形波を生成します。

加筆説明(蛇足)

Time Unit(TU)についてやや補足説明をすると、1TUとは入出力に於いて値が変化しうる最小単位です。
ゲーム画面の下側、Verificationでは入出力のお手本がグラフによって示されています。グラフは横軸が時間、縦軸が値です。
この入出力のグラフをよく見ると、時間軸が一定の幅で区切られています。その時間幅がTime Unitの正体です。
例えばslp 1と使用した場合、1TUだけCPUの処理が止まります。再開のタイミングは次のTUに入った瞬間です。
このslp命令を使わない場合、(正確な値ではありませんが)CPUは1秒間に1000回以上の命令を実行することが出来ます。しかしそれでは消費電力が膨大なものになってしまうため、slp命令を用いて意図的にCPUのクロックを抑制する必要があります。

以下の画像はゲーム画面の一部をTU毎に目盛り付けた画像です。視認性向上の為やや明るさを調整しています。
アプリケーションノート650 リファレンスデザイン:接触点灯ライト制御装置
以下の回路は触れた時に光るライトの制御装置のリファレンスデザインです。(訳註:リファレンスデザインとはマイコン使用例として示される設計図)
ユーザーが静電容量式スイッチに触った時、制御装置が立ち上がる波形を検知し、ライトの光量を変化させます。光量は0%、50%、100%と段階的に上がり、100%のときに触ると0%に戻ります。

この回路はXBusで繋がれた2つのMC4000マイコンで構成されています。

  • 1つ目のマイコンはSimple I/Oピンのp0に繋がれた静電容量式スイッチの値を読み取り、2つ目のマイコンに0または1の値を毎TU送っています。値が0のときはスイッチは触れられてない事を意味し、1のときは触れられた事を意味します。1つ目のマイコンは以前スイッチから読み取った値をaccレジスタに保存しておくことで、0から100への値の立ち上がりの変化を検知することが出来ます。
  • 2つ目のマイコンは現在の光量をaccレジスタへと保存しています。2つ目のマイコンはslx命令を用いて、1つ目のマイコンがXBusの値を送ってくるのを待機しています。そしてその値が1だった場合、accの値を50増加させます。もし増加させた後に100より大きければ、accの値を0に戻します。それらの計算の結果はsimple I/Oピンのp1を用いてライトへと伝達されます。
MCxxxx系 言語リファレンス
前書き
MCxxxx系マイコンはシステム設計をシンプルにするコモンプログラミングを採用しており、新たな製品を開発する時間を減らすことが出来ます。プログラムの記述はMCxxxx系マイコン内で共通であり、いずれの製品でもほとんど書き換えることなく、動作します。(それぞれの製品はモデル固有のデータシートに書かれている通り、様々な機能、ピン配置、プログラム空間の制約などが異なります。プログラムの移植はこれらの差異を考慮する必要があります。)

MCxxxxのプログラムは小さなアセンブル言語ですが多彩な演算子を持っています。MCxxxxのそれぞれの行には一つの命令のみ入ります。その構成は、命令名と0個もしくは1個以上のオペランドです。詳しい命令の説明と使い方は以下に書かれています。

MCxxxxマイコンは使用電力に制約がある環境やアプリケーションで使用されるように設計されており、MCxxxxプログラミングシステムは、それに応じて設計されています。MCxxxxマイコンがスリープ状態にある場合、マイコンは電力を消費しません。そうでなければ、消費電力は実行される命令の数に比例します。
プログラムの構造
MCxxxxのプログラムは毎行、以下の構造になっていなければなりません。
[ラベル:] [条件+/-] [命令] [#コメント]
全ての要素は省略可能ですが、存在する場合は必ずこの順序に従ってください。以下に構文的に有効な例を示します。
#This line is a comment.(この行はコメントです) loop: #until ACC is ten(ACCが10になるまで) teq acc 10 + jmp end mov 50 x2 add 1 jmp loop end: mov 0 acc # reset counter
コメント
"#"文字に続く文章はその行中では無視されます。コメントはプログラムの説明をプログラム中に書くことで開発者の作業効率を向上させることが出来ます。
ラベル
ラベルは必ず行の最初に書かなければなりません。ラベルを書くときは一番最後の文字を":"(コロン)にします。ラベルはjmp命令においてjump先を指定する際に用います。ラベル名は英字から始めなければなりません。ラベル名には英字の他に数字やアンダーバーが使えます。
条件付き実行
MCxxxxのプログラミング言語の全ての命令は条件付き実行が可能です。命令の前に"+"や"-"の文字を接頭辞としてつけると、その命令はそれ以前のテスト命令によって実行されるかどうかを切り替える事が可能です。
テスト命令によってその命令が無効になった場合、その命令はスキップされ電力は消費されません。
接頭辞が無い命令に対しては、テスト命令は効力を発揮せず、どの場合でも実行されます。
デフォルトでは接頭辞付きの命令は無効化され実行されません。接頭辞付きの命令を実行したい場合はテスト命令を用いて有効化する必要があります。
条件付き命令の使用例についてはアプリケーションノート650:接触点灯ライト制御装置を御覧ください。
レジスタ
レジスタはMCxxxxのデータ操作命令においてオペランドとして使用されます。使えるレジスタはMCxxxxのモデルによって異なります。もしそのマイコンで実装されていないレジスタをマイコンのプログラム中で使用しようとした場合はエラーになります。

accはメインの多目的レジスタであり、MCxxxx系マイコンでの内部計算に使用されます。全ての算術演算が暗黙的にaccを用いて計算し、accに結果を格納します。

datは副次的なレジスタであり、いくつかのMCxxxx系マイコンにおいて実装されています。datはaccが使用できる殆どの場面においてその代わりに使用できます。

accやdatなどの内部レジスタの初期化時の値は0です。

ピンレジスタ(p0,p1,x0,x1,x2,x3)はMCxxxx系マイコンのピンへの読み書きをするときに使われます。ピンを通しての読み書きによって、MCxxxxマイコンは他の互換性を持つ機器と同調し、通信できるようになります。MCxxxx系マイコンのそれぞれのピンはsimple I/OまたはXBusのどちらかとして機能します。各ピンの詳細な機能については該当するデータシートを参照してください。

nullレジスタは擬似レジスタです。nullレジスタを読み込むと0が帰ってきます。nullレジスタに書き込みを行ってもその値は破棄されます。
命令のオペランド
それぞれの命令には固有の数のオペランドが必要です。もしその命令にオペランドが必要な場合、命令名の後ろにスペース区切りでオペランドを書かなければなりません。複数のオペランドがある場合もスペースで区切ります。

命令のオペランドは次の説明において以下の様に省略されます
省略形
意味
R
レジスタ
I
整数値(-999~999)
R/I
レジスタまたは整数値(-999~999)
P
ピンレジスタ(p0,p1,他)
L
ラベル
なお、ラベルをオペランドとして使用する場合はそのラベルがプログラム中に存在しなければなりません。
基本的な命令
nop
この命令は何も行いません

mov R/I R
第1オペランドから値をコピーして第2オペランドへと格納します。

jmp L
指定されたラベルの次の命令へとジャンプします。

slp R/I
オペランドで指定されたTUだけスリープ状態にします。

slx P
オペランドで指定されたXBusピンが読み取り可能になるまでスリープします。
算術命令
レジスタの値は-999から999までの整数値として格納されます。
もし算術命令の結果、値があふれる場合は制限内に収まるよう丸めが発生します。つまり1000以上は999に、-1000以下は-999として格納されます。
例えばaccに800が格納されているときにadd 400命令を行った場合、accには結果的に999が格納されます。

add R/I
オペランドで指定された数とaccレジスタを加算し、その和をaccレジスタに格納します。

sub R/I
オペランドで指定された数をaccレジスタから減算し、その差をaccレジスタに格納します。

mul R/I
オペランドで指定された数とaccレジスタを乗算し、その積をaccレジスタに格納します。

not
もしaccレジスタに0が格納されていた場合、accレジスタに100を格納します。そうでない場合はaccレジスタに0を格納します。

dgt R/I
accレジスタからオペランドで指定された桁を抜き出し、それをaccレジスタに格納します。

使用例
acc
命令
結果(accに格納)
596
dgt 0
6
596
dgt 1
9
596
dgt 2
5

dst R/I R/I
accレジスタの第1オペランドで指定された桁を第2オペランドの値にします。

使用例
acc
命令
結果(accに格納)
596
dst 0 7
597
596
dst 1 7
576
596
dst 2 7
796
Test命令
条件付き実行や"+"や"-"の意味についての詳細な説明が必要ならば"条件付き実行"の項を御覧ください。

teq R/I R/I
第1オペランド(A)と第2オペランド(B)の値が同じかどうかテストする。
条件
+接頭辞付き命令
-接頭辞付き命令
AとBが等しい
実行
スキップ
AとBが等しくない
スキップ
実行

tgt R/I R/I
第1オペランド(A)が第2オペランド(B)より大きいかテストする。
条件
+接頭辞付き命令
-接頭辞付き命令
AがBより大きい
実行
スキップ
AがB以下
スキップ
実行

tlt R/I R/I
第1オペランド(A)が第2オペランド(B)より小さいかテストする。
条件
+接頭辞付き命令
-接頭辞付き命令
AがBより小さい
実行
スキップ
AがB以上
スキップ
実行

tcp R/I R/I
第1オペランド(A)と第2オペランド(B)を比較する。
条件
+接頭辞付き命令
-接頭辞付き命令
AがBより大きい
実行
スキップ
AとBが等しい
スキップ
スキップ
AがBより小さい
スキップ
実行
隠し命令
コメント欄より情報提供をいただきました。
ネタバレになるため、スポイルしております。

矩形波生成命令
gen P R/I R/I
 ピンレジスタPに対して矩形波を出力します。
 続く2つのオペランドは、それぞれON(100)とOFF(0)のTUの長さです。
 第一オペランド:出力対象のPin
 第二オペランド:ON(100)にする長さTU
 第三オペランド:OFF(0)にする長さTU

 以下の動きと同様になります。
Originally posted by sifue:
-------------
gen P X Y

以下と同等

mov 100 P
slp X
mov 0 P
slp Y
-------------
初回実行の接頭辞
@
+や-と同様に使用します。
その行は最初の一度のみ実行されます。
各パーツの仕様
この項は追記中です。未翻訳部については執筆者のゲーム進行をお待ち下さい。
Bridge ブリッジ
ブリッジはPDFに載っていない部品です。
ブリッジは回路上で線が混線するのを防ぐ為に使われます。

ブリッジのそれぞれの足は信号を伝達する事が出来ます。
それらをつなぐ線は絶縁されており、他の信号線と接続する事はありません。
ブリッジを用いることで信号線をまたいで通信を伝達する事ができます。

図はブリッジの使用例です。左の線ABはブリッジをまたいで右の線ABと対応するように接続されます。
MC4000
MC4000は最も基本的なマイコンであり、あなたが一番最初に触ることになるマイコンです。
MC4000は以下の機能を持っています。
  • 9行のプログラムスペース
  • 1つの汎用レジスタ
  • 2つのXBusピン
  • 2つのSimple I/Oピン

なお同型機としてMC4000Xがあります。
MC4000XはSimple I/Oのピンを廃止し、4つのXBusピンを持っています。
MC6000
MC6000はMC4000よりも優れた機能を持つマイコンですが、MC4000と比べて多少高額になります。
MC6000は以下の機能を持っています。
  • 14行のプログラムスペース
  • 2つの汎用レジスタ
  • 4つのXBusピン
  • 2つのSimple I/Oピン
DX300 デジタルI/O分配器
DX300はとてもシンプルな機能を持ちますが、やや理解のし難い動作をする部品です。
DX300はXBusのデジタル信号とSimple I/Oのアナログ信号を相互に変換する能力を持ちます。ただしXBusはSimple I/Oと違って連続的な通信でないため、その差を埋めるためにやや奇妙に見える挙動をします。


DX300は3つのXBusピンと3つのSimple I/Oピンを持ちます。
XBusピンはいずれも同様に用いることができ、それぞれのピンでの動作の違いはありません。
ただしSimple I/Oのピンはそれぞれ固有の桁番号を持っており、ピンによってその振る舞いが異なります。

XBusに値を書き込むとそれに対応したSimple I/Oピンが値を出力します。
入力されたXBusの値の内、
1の位が1以上であればp0から100を出力します。
10の位が1以上であればp1から100を出力します。
100の位が1以上であればp2から100を出力します。
そしてそれらの値は3つあるXBusピンのいずれかより新たに値が上書きされるまで保持されます。

またXBusの値を読み込むと、
Simple I/Oピンへの入力状態が0または1で表現されて返ってきます。
p0に50以上の入力があるならば1の位が1になります。
p1に50以上の入力があるならば10の位が1になります。
p2に50以上の入力があるならば100の位が1になります。

これらの動作で注意しなければならない事は、この部品が出力したSimple I/Oの値をそのままこの部品が読み取ることは出来ない点です。
つまりXBusピンに1を入力し、p0から100が出力される状態にあったとしても、その信号はp0に入力されてはいないためXBusの読み取りを行っても0しか帰ってきません。
そのためこの部品を簡易フラグメモリとして用いることは出来ません。

入出力例
XBus
p2
p1
p0
000
0
0
0
001
0
0
1
110
1
1
0
101
1
0
1
100P-14 RAM ランダムアクセスメモリ
100P-14は記憶装置です。14個までの整数値を保存できます。

  • 100P-14は14個のメモリセルを持ちます。
  • 100P-14は独立した2つのポインタを持ちます。
  • 100P-14はXBusのピンを4つ持っており、そのうち2つはアドレスピンであり、残りはデータピンです。
  • 全てのメモリセルは0として初期化されます。
  • 全てのポインタは0として初期化されます。
  • メモリポインタはアドレスピンを通して読み書きできます。
  • データはデータピンを通してポインタの指し示すメモリセルに対して読み書きできます。
  • データの読み書きを行った後に自動的にポインタが1つ増加します。

100P-14の改良型として100P-33があります。性質・使用方法はそのままにメモリセルが33個に増えています。ピンが6個に増えていますが、その内2つはダミーピンです。

.
.
.
以下は100P-14の振る舞いの詳細な説明ですが、やや冗長であるので蛇足とします。

100P-14は14個の記憶領域を持つランダムアクセスメモリです。
ランダムアクセスメモリとはマイコンによって読み書き可能なメモリです。
レジスタに格納しきれない大量のデータを扱う事に向いています。
またそのメモリセルは揮発性を持つため、予めデータを格納しておくことは出来ません。

100P-14のメモリセルは-999から999の整数値データを1つ格納可能です。
各々のメモリセルの位置をアドレスと呼び、その中でもアクセス対象になっているアドレスを特別にポインタと呼びます。
アドレスは0から始まり13まであります。

100P-14はポインタのメモリセルに対してのみ読み書きが可能です。ポインタで指し示していないメモリセルに対して読み書きを行いたいときはアドレスピンにアドレスを絶対値指定で書き込んでポインタを指定します。
アドレスピンに対して0~13のアドレス範囲を超える指定をした場合、ポインタは書き込んだ値を14で割った余りのアドレスを指します。

100P-14はメモリセルへの読み書きの後で自動でポインタを1つ加算します。ポインタが13の時に読み書きするとポインタは0に戻ります。
そのため100P-14は連続でデータを書き込んだり読み込んだりするのが得意です。
この性質のため、100P-14は固定長のキューとして用いる事ができます。ただしスタックとして用いるには不便です。

100P-14はアドレスピンとデータピンのセットを2つ持っています。d0とa0,d1とa1はセットであり、それらは完全に独立しています。

それらのセットは1つのポインタを持っています。2セットあるので100P-14は2つのポインタを持っています。それらのポインタは他方のポインタの振る舞いに関して影響を受けません。
つまり片方のセットで読み書きを行っても他方のポインタはインクリメントされません。
ただしメモリセルは2セット共に共有です。
200P-14 ROM 読み込み専用メモリ
200P-14は読み込み専用メモリです。メモリセルに対してマイコンによる書き込みが出来ませんが、設計者が予め値を設定する事が出来ます。

動的に値を書き込めないという点を除けばその他の振る舞いは100P-14と同じです。アドレスピンに対して書き込みを行いポインタを移動させることもできます。

200P-14の改良型として200P-33があります。性質・使用方法はそのままにメモリセルが33個に増えています。ピンが6個に増えていますが、その内2つはダミーピンです。
LX70GXX系 Simple I/O 論理回路
LX70GXX系 Simple I/O 論理回路はその名の通り単純な論理演算を可能とする部品です。
そして何より、マイコンよりも単価が安いというメリットがあります。

LC70Gxx系論理回路はSimple I/Oの信号強度により真と偽を判別します。
50未満の入力であれば偽、50以上であれば真と判定されます。
出力は偽が0、真が100になります。

なお、本説明では偽を0、真を1と表記します。


LC70G04 NOT回路
LC70G04はNOT回路です。否定回路とも呼びます。与えられた入力を反転して出力します。

真理値表
入力A
出力
0
1
1
0

LC70G08 AND回路
LC70G08はAND回路です。論理積回路とも呼びます。与えられた2つの入力が共に1の時のみ1を出力します。

真理値表
入力A
入力B
出力
0
0
0
0
1
0
1
0
0
1
1
1

LC70G32 OR回路
LC70G32はOR回路です。論理和回路とも呼びます。与えられた入力のうち、少なくともどちらかが1であれば1を出力します。

真理値表
入力A
入力B
出力
0
0
0
0
1
1
1
0
1
1
1
1

LC70G86 XOR回路
LC70G86はXOR回路です。排他的論理和回路とも呼びます。与えられた入力が、他方と異なっているならば1を出力します。

真理値表
入力A
入力B
出力
0
0
0
0
1
1
1
0
1
1
1
0
DT2415 数値増分時計
この時計は15分刻みで時間を取得できます。出力はSimple I/Oであり、午前0時を0として、15分経つ毎に出力が1増加します。
午後11時45分に出力は95に達し、日が変わると共に出力は0に戻ります。
バッテリーを内蔵しており、電源供給がなくとも時刻を保持することが出来ます。
C2S-RF901 無線データ送受信機
C2S-RF901はシンプルな機能を持った無線機です。
入出力にはXBusを用います。

この無線機はXBusを用いますが、いつでも送受信準備状態にあり、同期をとる必要はありません。

この無線機は外部と自動で無線通信を行い、データの送受信を行います。
受信信号は自動的にバッファへと蓄積され、マイコンからデータを求められた時に出力します。
もしバッファ内にデータがない場合、データが無いことを示すために-999を出力します。
LX700 2.5桁7セグディスプレイ
LX700は整数値をXBusで読み取り、画面に表示できるシンプルな7セグメント-ディスプレイです。

入力の値域は-199から199までです。それらの範囲を超える値が入力された場合、表示できる範囲で最も近い値を示します。
(例:250を入力すると199と表示する)
また、-999を入力する事でその表示を消すことが出来ます。
LX910C カスタムセグメントディスプレイ
LX910Cはサンドボックスモードに於いて設計者が用意した画像データを読み取り画面出力する事ができる高性能タッチディスプレイです。類似品としてLX900Cがありましたが、現在は削除されている模様です。なお、LX900CはShenzhen I/Oの公式Trailerでその姿を見ることが出来ます。

LX910Cは非常に強力な部品ですが、その分ゲーム外で画像データの用意が必要であり、扱いがやや難しいパーツです。
この項では画像データを自分で作り、ゲーム内でそれをどのように使うかまでを記載します。
使い道は設計者次第であり、無限の可能性を秘めています。

LX910Cが表示できるのは320x405の白黒画像です。カラー画像でも一部は反応しますが、ゲーム内では白黒で表現されるため推奨されません。
LX910Cは画像内の黒いピクセルを黒ピクセルと認識します。
画像の白い部分(#ffffff)は黒ピクセルとして認識されません。しかしそれ未満の値(#fefefe)は(画像内で殆ど見えなくとも)黒ピクセルとして認識されます。

LX910Cは白黒ですが濃淡をかなり精密に描画することができます。画像データ内の濃い黒色はゲーム内でも濃く表現され、やや淡い黒色は薄い黒色として表現されます。

ゲーム内において4近傍(縦横)により接続された黒ピクセルはセグメントと呼ばれるまとまりとして認識されます。8近傍(縦横斜め)としては接続されません。このセグメントという単位はゲーム内において表示・非表示を操作するときに用いられます。

セグメントには固有の番号が割り振られます。番号の割り振り規則は次のとおりです。
  • より上にあるセグメントが若い
  • 同じ高さにある場合、左にあるセグメントが若い
  • セグメント内の一番上の黒ピクセルが、同セグメントの位置となる。
  • 一番上の黒ピクセルが複数ある場合は一番左上の黒ピクセルがセグメントの位置となる。

なお画像を読み込ませた時、セグメント番号は設計画面内で分かりやすく表示されます。

LX910Cで用いる事のできる画像データはゲーム起動時にまとめて読み込まれます。ゲーム起動中に画像データを用意した場合、読み込ませるためにはゲームを再起動する必要があります。

画像データはpngで保存します。保存したpngは以下に設置します。扱えるファイル名は英数字のみです。
Windows:
C:\ユーザー\【ユーザー名】\ドキュメント\My Games\SHENZHEN IO\【乱数】\custom_screen\

正しく読み込まれた場合、LX910Cの下側にあるファイル名をクリックすることで入力画像を切り替えることが出来ます。



以下はゲーム内での操作の方法です。

LX910Cは3種類のピンを2セット持っています。以下はそれぞれのピンの説明です。

cピンは入力専用です。整数でセグメント番号を書き込む事で、任意のセグメントを表示状態にできます。また負値でセグメント番号を書き込むことで、任意のセグメントを非表示にできます。
また特別な入力値として999と-999があります。これらはそれぞれセグメントの全表示と全非表示です。

tピンは出力専用です。画面のタッチ状態をこのピンにより検出できます。画面がタッチされた場合、その場所のセグメント番号を正値として出力します。また指が離された場合、そのセグメント番号を負値として出力します。そのどちらでもない時に読み込まれた場合、-999を返します。

qピンはチェックピンです。セグメント番号が入力された時、そのセグメントがOnになっているかどうかを、1または0で表現して出力します。
KUJI-EK1 周易占い
なんとも胡散臭いこのパーツは占いを行う事ができます。
易経と呼ばれる書物による古代中国の古典的な占いでは、筮竹と呼ばれる竹ひごを2房に分け、その本数を数える事で八卦と呼ばれる基本図形を導き出します。
それを2回行い、下卦と上卦からなる記号パターン、六十四卦と呼ばれる図形を導き出し、それを読み取って現状を占い、未来へと目を向けるのです。

このKUJI-EK1はOracle Engine(託宣機関)より導かれた六十四卦を出力します。陰陽道で用いられる陰陽魚のボタンを押すと、Buttonより1TUだけ100が出力されます。それと同時にOracleより6TUかけて六十四卦のパターンが6ビットで出力されます。その信号は六十四卦の下から上へと順に線がつながっているかどうかを0または100で表現しています。

ユーザーへの表示には専用のディスプレイを用います。このディスプレイは六十四卦を表すことができ、6つのSimple I/Oピンはそれぞれの線の出力系に直結しています。

N4xx-1000系 スイッチ
N4xx-1000シリーズは公式pdfには載っていない部品です。
これらのスイッチはユーザーの操作をレスポンシブルに反映するシステムを構築するのに用いられます。
単純なスイッチからゲームコントローラーのような複雑なスイッチまであり、うまく組み合わせることで優れたゲームを作り出すことも不可能ではないでしょう。

N4PB-1000
N4PB-1000はプッシュボタンです。出力はSimple I/Oであり、ボタンを押している間だけ2つのピンから100が出力されます。

N4SW-1000
N4SW-1000は切り替えスイッチです。スイッチを切り替えることで出力のON/OFFを切り替える事ができます。
出力はSimple I/Oであり、倒れている方のピンから100が出力されます。

N4DL-1000
N4DL-1000はダイヤルスイッチです。ダイヤルを回すことで出力を1ずつ変化させることが出来ます。
出力はXBusであり、読み取るとダイヤルの表示通りの数字が返ってきます。
ただしこのスイッチが能動的に値を出力することはありません。
ダイヤルは0から99までの範囲で切り替えることが出来ます。

N4GP-1000
このパーツは現在(2016/10/30)ゲームから削除されている模様?
代替品としてN4PB-8000スイッチが実装されています。対応するキーが若干異なりますが、挙動は全く同じです。

N4GP-1000はゲームパッドです。4つの十字キーと3つのボタン、1つのスタートボタンより構成されます。出力はXBusです。
N4GP-1000はキーボードで操作することが出来ます。また各ボタンにはそれぞれスイッチ番号が割り振られています。その対応表は以下のとおりです。
役割
キーボード
番号
w
1
s
2
a
3
d
4
A
j
5
B
k
6
C
l
7
スタート
Enter
8

これらのボタンが押されたかどうかはXBusの値を読み取ることで分かります。
何も変化がない場合はN4GP-1000は-999を返します。ボタンが押された瞬間のみスイッチ番号に対応した数字が出力され、離された時にスイッチ番号の符号を反転した値が出力されます。

以下はこの複雑なスイッチの機能を調べる際に用いた回路です。2つのマイコンがXBusでつながれています。
1つ目のマイコンは読み取った値が-999でない時に2つ目のマイコンに値を通知します。
2つ目のマイコンは送られてきた値をaccに表示します。
この回路を用いることでN4GP-1000の出力の変化を視覚的に分かりやすく知ることが出来ます。

LX100 LEDディスプレイ
LX100シリーズは公式PDFには載っていないユニークな部品です。
LX100シリーズは1つの単色LEDを点灯させるだけのシンプルなディスプレイです。
使い方は設計者の工夫次第ですが、通常はエラーなどを使用者に知らせる為に用います。

LX100シリーズは赤、緑、黄色、白の4種類あり、それぞれに色を表す添字が割り振られています。
  • LX100R・・・赤
  • LX100G・・・緑
  • LX100A・・・黄色
  • LX100W・・・白

入力はSimple I/Oを用います。より高い値を入力する事でより明るく光らせることが出来ます。
入力ピンを4つ持っており、それらのいずれからも入力することが出来ます。
同時に複数の入力があった場合、その中で最も高い値が採用されます。


LX300RGB フルカラーLEDディスプレイ
LX300RGBディスプレイは公式PDFには載っていない部品です。
LX300RGBディスプレイは3つのLEDを持ち、それらを光らせることで100万通りの色を表現することが出来ます。
使い方は設計者の工夫次第です。

入力はSimple I/Oを用います。
6つのピンは3つあるLEDのそれぞれに割り当てられています。
1つのLEDはそれぞれ2つ入力ピンを持っており、それらのいずれからも入力することが出来ます。
LEDは赤、緑、青のいずれかに光ります。詳しい入力ピンの位置は図を御覧ください。
より高い値を入力することでより明るく光らせることが出来ます。
同時に複数の入力があった場合、その中で最も高い値が採用されます。


???????
この部品についてわかっている事は殆どありません。
刻字は掠れて読めず、公式pdfにもそれらしき記載はありません。

このパーツは単純な乱数発生器として用いることが出来ます。
出力はSimple I/Oであり、0から100までのランダムな値を三角の印が描かれたピンより出力します。
その他の入力の意味は不明ですが、入力している値が一定ならば出力値の変化も止まる事が実験に拠って示されています。

その他ヒント
この項では部品の仕様以外に、問題を解決する為に必要な情報、またはそれを得る方法を書き示します。
直接的な答えではなく、あくまで解くのに必須な情報を指し示すのみですが、一部ネタバレを含む可能性もあります。注意して御覧ください。

公式PDFの改定によりページ指定がずれる事がある様です。情報が見つからない場合は指定のページ付近をお探しください。

Q.Harmonic Maximization Algorithmって何?
A.公式PDFの35ページの『Incredible Sound at a Breakthrough Price.』を御覧ください。英語が読めない方は以下にスポイルしておきます。
入力値に以下の式を用いて値を変化させた後に出力します。
出力値 = (入力値 - 50) * 4 + 50


Q.Poseidon-779's Geometric Specificationsって何?xとyからpower求めるのどうやるの?
A.公式PDFの36ページの『POSEIDON-779』の図を御覧ください。
xとyの示す交点の座標によってパワーは0、30、50、80のいずれかになります。

Q.Carbine Target Illuminatorの解き方は?
A.公式PDFの38ページの『CARBINE TARGET ILLUMINATOR』の図を御覧ください。ライフル銃につけるライト/レーザーのスイッチの問題です。
この機械のレーダーはまずPingを発信し、跳ね返ってくるまでの時間によって距離を測定します。1~2TU以内では短距離、3~4TU以内では中距離、5~6TU以内であれば長距離に分類します。それぞれに対応した値を出力しましょう。
短距離ではレーザーはなくても良いのでスイッチを切ります。その代わりに短距離用の広範囲を照らせるライトを点灯します。
中距離ではレーザーはあったほうがいいですが、ライトとの電池との兼ね合いで50%のパワーで点灯させます。ライトは細めに設定し、無駄に居場所を悟られないようにします。
遠距離ではより遠くまで届かせるためにフルパワーでレーザーを点灯します。居場所をさとられないようにライトの電源はオフにします。


これ以降は執筆者のゲーム進行をお待ち下さい。
20 Comments
himatchi  [author] Aug 15, 2019 @ 5:39am 
sifueさんありがとうございます。
遅くなりましたがTest命令の下に追記しました。
sifue Apr 13, 2019 @ 8:16pm 
素晴らしいドキュメントありがとうございます。
ネタバレになるのでここに書かない方がいいかもなのですが、UNDOCUMENTED INSTRUCTION! という メールで判明する以下のコマンドとプリフィックスをいつもこのページを見るので、メモさせておいてください。



-------------
gen P X Y

以下と同等

mov 100 P
slp X
mov 0 P
slp Y
-------------
@ プリフィックス

起動時に一度だけ実行される命令となる


COLGO13 Apr 4, 2019 @ 3:00am 
とても、とても、参考に、なります。ありがとう。感謝。
himatchi  [author] Oct 31, 2016 @ 10:01am 
ご指摘ありがとうございます。早急に修正いたします。
どうやら公式PDFもしばしば改定が行われるらしく、ページ数がズレてしまうようです……。
なるべく気づけるよう、タイトルも合わせて記載する事にします。
trickart412 Oct 31, 2016 @ 7:55am 
「その他ヒント」欄の「Q.Harmonic Maximization Algorithmって何?」でP33となっていますがP34ではないでしょうか。
(P33が「dividerと入れ変えろ」となっていて10分ぐらい悩んだのは内緒)
goheimochi Oct 27, 2016 @ 5:53pm 
丁寧なレスありがとうございます!
slpの必要性が理解できました。
himatchi  [author] Oct 27, 2016 @ 8:40am 
疑問があるようなので、アプリケーションノート268に対して、各種ピンに対しての読み書きの具体的な動作を追記しました。(冗長な記述になってしまったので書き換えを検討しています)
himatchi  [author] Oct 27, 2016 @ 8:22am 
はい。その通りです。slp 3を入れないと即座に次の命令を実行します。
また、p1はSimple I/Oのピンです。
Simple I/Oはアナログ信号のような振る舞いをするため、他の値で上書きされない限り、書き込まれた値を保持して出力し続けます。
slp 3でCPUを3TU待たせる事で値の上書きを遅延させ、結果的にp1に3TUの間100を出力させています。
goheimochi Oct 27, 2016 @ 7:42am 
早速の補足ありがとうございます。
まだ理解できていない気がするのですが、アプリケーションノート393中の
mov 100 p1
slp 3
は、mov 100 p1を3TU分実行することではなく、slp 3を入れないと即座に次の命令に移ってしまうということでしょうか。
himatchi  [author] Oct 27, 2016 @ 6:01am 
slp命令の役割について、アプリケーションノート393に加筆しました。