SHENZHEN I/O ゲームの紹介


あなたは中国深センのとある電子機器メーカーに仕事を得た。

 

最初の仕事としてセキュリティカメラの機能の一部を任された。前の担当者が途中で放り投げて会社を去ったらしい。ただセキュリティカメラといってもこれは偽物のハリボテだ。なるほど手始めにあなたの「適性」を測りたいらしい。

 

既にボスからメールで仕様書とも思えない説明書きが届いている。それによると開発は専用のCADを使いシミュレーション結果を期待値と一致させることがゴールのようだ。

 

古参の同僚から「マニュアルをよく読むこと」と重要マーク付きでメールが届いている。「マニュアルすら読めずにクビになった前任者のようにはなるな」と釘を刺された。なるほど、デスクトップに50ページ弱のPDFがあるがこれのことだろう。

 

あなたがマニュアルを開くと中には製品の中核となるマイクロコントローラーを始め様々なメーカー製デバイスのデータシートが綴じ込まれていた。まずはマイクロコントローラーの仕様を把握すべきだろう。すでにアセンブラで組み込み開発経験があるあなたに理解できないワードは無いはずだ。さっそく自分専用のチートシートを作る作業から入るといい。それがあなたのいつものスタイルだ。

 

こんにちは、OGISHIです。

今回はゲームの紹介です。

ジャンルはパズルゲームですが、解くには電子デバイスのマニュアルをよく理解した上でお題の「仕様」を把握しアセンブラでプログラムを組む必要があります。

マイクロコントローラーにはポート数やレジスタ数そしてプログラムの最大ステップ数の異なるバリエーションがあります。「仕様」を満足するようにデバイスをCAD上でつなげてプログラムを書き、シミュレーション結果が期待値と一致するとクリアとなります。クリアしたあともよりコストを抑えた組み合わせが存在する場合があり、満足がいくまで何度もチャレンジすることができます。

 

私が駆け出しエンジニアだったころに先輩が作成されたZ80基盤のプログラムをアセンブラで書いていたことを思い出しました。CPUの性能もメモリ容量も潤沢な現在、アセンブラではなくモダンなシンタクスの言語で書けるなんていい時代です(ノスタルジーに浸る以外は特段過去には戻りたくないです)

 

興味がある方はSteamで1500円程度で配信中なのでぜひお試しください。

以下に私専用のチートシートを載せますのでご参考まで。

 

----

 

 

诚尚Micro

(シェイアン シェーン マイクロ)

MCxxxx ファミリー 言語リファレンス

 

言語構造:

LABEL CONDITION INSTRUCTION COMMENT

 

それぞれの要素は省略可能だが、順序は守らなければならない。

 

コード例:

# This line is a comment.
loop: # until ACC is ten
  teq acc 10
+ jmp end
  mov 50 x2
  add 1
  jmp loop
end:
  mov 0 acc # reset counter
  • LABEL の書式は ^[a-zA-Z].[0-9a-zA-Z_]*:$
    jmp 命令の飛び先を表す
  • CONDITION は + または -
    直前のテスト命令の結果が'+'有効か'-'無効かによって続く命令を実行する。
    条件が一致すれば命令が実行され、一致しなければ命令はスキップされ電力消費も無い。
    すべての条件付き命令は無効状態から始まる。条件付き命令を有効にするにはテスト命令を実行しなければならない。
    ?'-'シンボルをつけると無効状態で実行するという認識で正しいか?
  • INSTRUCTION は後述
  • COMMENT は # から行末まで
  • レジスタ
    acc - プライマリ汎用アキュムレータ
    dat - セカンダリ汎用アキュムレータ(いくつかのMCxxxxファミリで使える)
      acc が許可されているほとんどのコンテキストで使用できる。
    ※これら内部レジスタは 0 に初期化される。
    p0, p1, x0, x1, x2, x3 - ピンレジスタはMCのピンを読み書きする。
      ピンには シンプルI/O または XBusインタフェースの2種類がある(後述)
    null - 疑似レジスタ。読み取りは常に 0。書き込んでも何も起こらない。

 

命令:

 

表記

意味

R

レジスタ

I

整数 -999 ~ 999

R/I

レジスタまたは整数

P

ピンレジスタ

L

ラベル(プログラム中で必ず定義しなければならない)

 

基本命令:

 

nop

No Operation

mov R/I R

1番目のオペランドを2番めのオペランドに代入
つまり代入先はレジスタのみ

jmp L

指定ラベルへジャンプ

slp R/I

指定時間単位スリープする

slx P

XBusピンのデータがリード可能になるまでスリープする

 

演算命令:

acc レジスタに対する演算の結果を acc に格納する。

レジスタが保持できる値の範囲は -999 ~ 999。演算結果が範囲を超えた場合、有効範囲に一番近い値が acc に格納される。つまり acc が 800 のとき、add 400 の結果 acc には 999 がストアされる。

 

add R/I

加算

sub R/I

減算

mul R/I

乗算

not

否定
acc が 0 なら 100 を acc に格納する。それ以外なら 0 を acc に格納する。

dgt R/I

acc の値からオペランドで指定した桁の値を acc に格納する。
例:

acc

Instruction

acc’

596

dgt 0

596

dgt 1

9

596

dgt 2

5

dst R/I R/I

acc の値のうち第1オペランドで指定した桁の値を第2オペランドの値に置換した結果を acc に格納する。
例:

acc

Instruction

acc’

596

dst 0 7

597 

596

dst 1 7

576

596

dst 2 7

796

 

テスト命令:

 

teq R/I R/I

teq A B

Condition

'+'

'-'

A == B

有効

無効

A != B

無効

有効

tgt R/I R/I

tgt A B

Condition

'+'

'-'

A > B

有効

無効

A <= B

無効

有効

tlt R/I R/I

tlt A B

Condition

'+'

'-'

A < B

有効

無効

A >= B

無効

有効

tcp R/I R/I

tcp A B

Condition

'+'

'-'

A > B

有効

無効

A == B

無効

無効

A < B

無効

有効

 

 

 

 

  お問い合わせ  - お気軽にお問い合わせください - 

  • 株式会社 パブリックリレーションズ
  • 〒064-0807
  • 北海道札幌市中央区南7条西1丁目13番地 弘安ビル5階
メールでのお問い合わせはこちら

  • この記事をシェアする