Sim's blog

電子工作はじめてみました

PSoC FirstTouch

2007-09-25 20:32:26 | PSoC
PSoC FirstTouchというUSB接続の小型マイコンボードが発売されているようです(日経の記事)。静電容量式タッチ・センサや近接センサ、光センサ、温度センサなんてことが書いてあります。

eZ340やくもちゃんのライバルということになるのでしょうか。センサがあるということだとMSP430入門セミナー2007で配っていた容量センサー付eZ430の方が本当のライバルっぽいです。

パステルマジックさんは4000円ですが売り切れています。

そういえばSTR9-comStickはどうなったんでしょう。


ICFP2007 (23) 画像修復(2)

2007-09-25 03:15:15 | ICFPプログラミングコンテスト
ICFP2007 (22) 画像修復(1)の続きです。

(13) river 左下の川

- 0x71c897をmkGoldfishR_adaptationにする (a)
- 0x71c9ffをmkGoldfishL_adaptationにする (b)
- 0x71cb67をmkGoldfishR_adaptationにする (c)
- 0x71cc3fを18にする (d)
- 0x71cd17をmkGoldfishL_adaptationにする (e)
- 0x71cec7をmkGoldfishL_adaptationにする (f)
- 0x71cf0fをmkGoldfishR_adaptationにする (g)

川を修正する必要はありませんが川の中の魚を修正します。魚はdrawGoldenFish_adaptationで描かれています。この中のgoldenFish_adaptationを修正することになります。adaptationについては修復ガイドのpage 9に書かれています。各adaptationについてはFuunDocに書かれています。

goldenFish_adaptationを逆アセンブルした結果です。段付けは手動です。パラメータで一段深くしています。最初の方はmkBeforeAbove(mkEmp(0x14, 0x14), mkBeforeAbove(...))のように解釈できます。

goldenFish_adaptation 71c66f 0008d0

71c66f 0008a0
    71c687 activateAdaptationTree
    71c69f mkBeforeAbove_adaptation
    71c6b7 0000c0
        71c6cf activateAdaptationTree
        71c6e7 mkEmp_adaptation
        71c6ff 000030
            71c717 intBox
            71c72f 000014
        71c747 000030
            71c75f intBox
            71c777 000014
    71c78f 000780
        71c7a7 activateAdaptationTree
        71c7bf mkBeforeAbove_adaptation
        71c7d7 000390
            71c7ef activateAdaptationTree
            71c807 mkAbove_adaptation
            71c81f 0001e0
                71c837 activateAdaptationTree
                71c84f mkBeforeAbove_adaptation
                71c867 000030
                    71c87f activateAdaptationTree
                    71c897 mkGoldfishL_adaptation ← (a) mkGoldfishR_adaptation
                71c8af 000150
                    71c8c7 activateAdaptationTree
                    71c8df mkBeforeAbove_adaptation
                    71c8f7 0000c0
                        71c90f activateAdaptationTree
                        71c927 mkEmp_adaptation
                        71c93f 000030
                            71c957 intBox
                            71c96f 7ffffe
                        71c987 000030
                            71c99f intBox
                            71c9b7 7fffff
                    71c9cf 000030
                        71c9e7 activateAdaptationTree
                        71c9ff mkGoldfishR_adaptation ← (b) mkGoldfishL_adaptation
            71ca17 000150
                71ca2f activateAdaptationTree
                71ca47 mkBeforeAbove_adaptation
                71ca5f 0000c0
                    71ca77 activateAdaptationTree
                    71ca8f mkEmp_adaptation
                    71caa7 000030
                        71cabf intBox
                        71cad7 00002d
                    71caef 000030
                        71cb07 intBox
                        71cb1f 000018
                71cb37 000030
                    71cb4f activateAdaptationTree
                    71cb67 mkGoldfishL_adaptation ← (c) mkGoldfishR_adaptation
        71cb7f 000390
            71cb97 activateAdaptationTree
            71cbaf mkBeforeAbove_adaptation
            71cbc7 0000c0
                71cbdf activateAdaptationTree
                71cbf7 mkEmp_adaptation
                71cc0f 000030
                    71cc27 intBox
                    71cc3f 000000 ← (d) 0x12
                71cc57 000030
                    71cc6f intBox
                    71cc87 000018
            71cc9f 000270
                71ccb7 activateAdaptationTree
                71cccf mkAbove_adaptation
                71cce7 000030
                    71ccff activateAdaptationTree
                    71cd17 mkGoldfishR_adaptation ← (e) mkGoldfishL_adaptation
                71cd2f 0001e0
                    71cd47 activateAdaptationTree
                    71cd5f mkBeforeAbove_adaptation
                    71cd77 0000c0
                        71cd8f activateAdaptationTree
                        71cda7 mkEmp_adaptation
                        71cdbf 000030
                            71cdd7 intBox
                            71cdef 000019
                        71ce07 000030
                            71ce1f intBox
                            71ce37 00001d
                    71ce4f 0000c0
                        71ce67 activateAdaptationTree
                        71ce7f threeFish_adaptation
                        71ce97 000030
                            71ceaf activateAdaptationTree
                            71cec7 mkGoldfishR_adaptation ← (f) mkGoldfishL_adaptation
                        71cedf 000030
                            71cef7 activateAdaptationTree
                            71cf0f emptyBox_adaptation ← (g) mkGoldfishR_adaptation
71cf27 00c662

(14) whale 鯨

- if文の条件を反転する (0x266585にIPPを書く)
- 座標を(410, 200)にする

噴水はwhaleより前に描く必要があります。またcupはwhaleより後に描く必要があります。噴水とcupについては後で記します。
whaleのパラメータは2つのboolです。1番目が表情でPで泣き顔、Fで笑顔です。2番目は使用されていません。if文の条件を反転することで笑顔にしています。ifを書き換えるかわりに呼び出し時の第1パラメータを書き換える手も考えられます。

(15) crater

- 不要なのでskipする

(16) bmu endoさん

- enableBiomorphをPにする (enableBiomorphはGZ+0x033963)
- weather判定と変なRNAをskip (0x0dafadにgoto 0x0db0fbを書く)
- 変なrnaとendocowをskip (0x0df476にgoto 0x0df78cを書く)
- cow-spot-middleの誤り訂正 (correctErrors(0x0d985b, 0x000b34, 0x0da3a7))
- cow-tailの復号 (crypt("9546", 0x4aa77d, 0x00145c))
- cow-tailの色修正 addOpaqueを7個、addTransparentを3個追加
- cow-tailのintegrity checkをskip

enableBiomorphはPにしなくても、ifをskipするだけでもいいです。次でweather判定をskipしているので統合した方がprefixが短くなります(0x0daee5にgoto 0x0db0fbを書く)。
cow-tailは復号しただけだと不透明です。0.3だけ透明にします。cow-tailの最初でbucketをemptyにするRNAコードがあるので、これをつぶしてやります。そうするとintegrity checkが通らなくなるので、integrity checkもskipします。今はintegrity checkの所に透明化用のRNA出力を上書きしています。integrity checkはそのままでcow-tailの途中に飛び込む手もありますが、透明化コードを置く場所に困ります。既存のコードで再利用できそうな部分を探すとよいかもしれません。このあたりはもうちょっと考えた方がよさそうです。

暗号化については修復ガイドのpage 4405829に書かれています(このページの復号結果はここです)。cow-tailの暗号鍵9546は力技で発見しました。どこかにヒントがありそうですが見つかっていません。完全数というわけでもなく謎です。もしかすると特徴のない最小の数かもしれません(笑)。
誤り訂正符号については修復ガイドのpage 84に書かれています(このページは暗号化されていて鍵は42でした)。

bmuはおおまかに以下のような流れになっています。
void bmu(void)
{
    if(enableBioMorph == P){
        if(weather == 1 || weather == 2){
            cowを描く
            endocow();
        } else if(ducksShown == P){
            superDuck();
        } else if(ocamlrules == P){
            ocaml();
        } else {
            mlephant();
        }
    } else {
        endo();
    }
}

各変数の初期値は
enableBioMorph(0x033963) = F
weather(0x03394b) = 0
ducksShown(0x033964) = F
ocamlrules(0x0c9228) = P
です。ducksShownはscenarioの中でmotherDuckWithChicksを呼び出す直前でPが代入されています。値を変えると色々な画像が見れます。

endocowにしたときの画像です。


superDuckです。


ocamlです。


mlephantです。


endoです。


長くなってきたので続きます。