福野泰介の一日一創

こども起業家が活躍する社会を創ろう - KidsVenture夏休みスペシャル at 新宿

2016/08/24 23:55:00
#IchigoJam #tokyo 

さくらインターネット、ビットスター、ナチュラルスタイル、jig.jp、4社共同で主催する「KidsVenture」は、電子工作・プログラミングを通じてつくる楽しさを学び挑戦意欲溢れる次世代の創出に貢献します!


東京新宿開催、夏休みスペシャルな2日間のイベントの初日、IchigoJam Tのはんだづけとロボットpaprikaのギアボックス組み立てに取り組んでいるところでした。


大人でもなかなか難しい、2つのモーターを多数のギアで減速するギアボックスの組み立てに果敢に挑戦する子供達の姿!チャレンジ精神を引き出すポイントは、おもしろそうなゴールと、手が届きそうな難しさ。簡単すぎては飽きられ、難しすぎては嫌になる。チャレンジの先に見える光が力になる。


会場のさくらインターネット会議室、2日目はロボットを完成させ、みんなで協調動作するロボットのプログラミングに挑戦とのこと!


シールと裏面に秘密の暗号付きの名刺、もらいました!


みかかコンバーター
日本のキーボードならではの古の暗号、みかか。自分たちだけの暗号づくりも楽しそうですね!

クラウド、IoT、ブロックチェーン、次々登場するおもしろ技術へのはじめのいっぽ、ひとりでも多くの子供に踏み出してもらいましょう!

参考リンク
- 【対談】さくらインターネット田中邦裕社長 ブロックチェーンは破壊的イノベーションであり、社会は既に変化し始めている | ビットコインの最新情報 BTCN|ビットコインニュース
- さくらインターネット、ビットスター、ナチュラルスタイル、jig.jpが、子供向けプログラミング教室を主催する非営利団体「KidsVenture」を設立 |EdTech Media
- KidsVenture

IchigoJamでキーボードが動かない!? IchigoJam TとU、キーボードとビデオケーブルの選び方・つなぎ方

2016/08/23 23:55:00
#IchigoJam 

テレビも、DVDプレイヤーも、ゲーム機も、実はコンピューター、CPUが入っていていろいろ計算しています。昔、赤白黄のケーブルでビデオデッキ、ゲーム機、テレビをつなぐのが好きだったのは、コンピューター間のネットワークを作る作業そのものだったからかもしれません。

ケーブルがHDMI一本になったり、無線化したりで、楽になった反面、この類の悩む楽しみと解決できた喜びが減っています。


IchigoJamを使う際に、本体の他に準備するものは3つ。
1. PS/2キーボード
2. テレビとテレビにつなぐビデオケーブル
3. microUSBケーブルと電源(ACアダプターまたはモバイルバッテリー)

IchigoJamに、なくてはならない、プログラミングする(=コンピューターと話す)ための手段、キーボード。現在のIchigoJamが、対応しているPS/2キーボードを用意します(USBキーボードは実験中)。電気屋産さん、リサイクルショップ、通販で手に入ります。

キーボードの中身はたくさんのスイッチと、それをデジタル信号にするコンピューターからできています。押したり離したりの信号の使い方(=プロトコル)には2種類、古い規格のPS/2(丸い端子)と、新しいUSB(四角い端子)があります。両対応するものと合わせて、3種類のキーボード、IchigoJam TとUとの対応をまとめました。

PS/2・USB両対応と書かれたキーボードは普通の電気屋産さんでも置いてあります(比較的安価です)。両対応のキーボードは、キーボードの中にあるコンピューターがPS/2で接続しているか、USBで接続しているかを自動的に判別して、送る信号を切替えています。IchigoJam Uに接続する場合は、キーボードに付属するUSBの形状をPS/2の形状に変換アダプターを使って接続します。

IchigoJam Tに接続する場合は、変換コネクターを使わず、USBの形状のまま接続します。使用している端子はUSBですが、流れている信号はPS/2信号です。変換アダプターを使う必要がない分すっきりします。USB端子は、上下しか悩む点がないため、子供にとっても差し込みにやすく、頑丈なのが特徴です。PS/2端子は、差し込みが固いことが多く、ぐりぐりひねりながら差し込むと壊れるのも何度か目撃しました。

続いて、リサイクルショップなどで見かけたり、昔からとってあった、PS/2専用キーボードの場合です。丸い端子PS/2は、IchigoJam Uへはそのまま接続できます。

IchigoJam Uに接続するためには、PS/2の丸い形状からUSBの四角い形状へと変える、変換アダプターが別途必要になります(Amazon / aitendoで購入可)。流れる信号はPS/2信号です。PS/2キーボードやマウスをUSB信号に変換して接続する変換器(中にコンピューターが入っているもの)を使ってしまうと、流れる信号がUSBになってしまって、IchigoJamでは使えません。

最後にUSBキーボードですが、こちらはIchigoJam Uに形状は合いますが、信号がUSBなため使えません。もちろん、変換アダプターを使ってIchigoJam Uに接続しても使えません。USB信号をPS/2へと信号を変える変換器があればいけるはずですが、該当する商品は見つかっていません。

キーボードまとめ:「PS/2」と書かれたキーボードを入手してください。
入手性がよく、打ち心地も良く、値段も手頃な、おすすめの日本語キーボードはこちらです。
サンワサプライ PS/2キーボード SKB-L1BK」530円
ELECOM 有線ミニキーボード Windows用 メンブレン式 USB-PS/2変換コネクタ付 ブラック TK-FCM077PBK」1315円 コンパクト!

次にビデオコード、100均、DAISOでも売っているコンポジットケーブルというものを使います。

わかりやすさのため白赤黄と三色ありますが、いずれもただの2芯(信号線とGND線)ケーブルなので、音声を音声に、映像を映像にそれぞれ接続すればケーブルは何色を使っても構いません。手で簡単に裂くこともでき、100円でIchigoJam、3台分のケーブルとして使えます。

IchigoJamのビデオ出力(黄色の端子)をテレビのビデオ入力(黄色の端子)へと、何色のケーブルを使ってもいいので接続してください。(つまり、自宅に余っている白赤の音声のみのケーブルでOKです!)

ケーブルの長さが足りない場合、同じくDASIOで売っている変換プラグを使うと、延長することができます。200円で、1.5m x 3の4.5mまで届く、IchigoJam用ケーブルのできあがり、大型テレビでも使えます!

microUSBケーブルは、100均でよく売っているものや、スマホ(Android)の充電用に使っているものでOKです。100均、Seriaの単三乾電池2本使ったモバイルバッテリーもおすすめです。充電式のモバイルボッテリーでも動きますが、消費電力が低すぎるため、途中で給電を停止してしまうものがあるので、長いプログラムを消されてしまう前にチェックしておきましょう。

工学社から新しいIchigoJam&Pancake本がでました!
「IchigoJam」/「PanCake」ではじめる電子工作&プログラミング」 by Natural Style

IchigoJamを使ったプログラミングの基本から、フローチャートを使ったもぐらたたきゲームの作り方、拡張ボードPanCakeを使ったカラー化と豪華な効果音バージョンへのステップアップが丁寧に解説されてます。

はんだづけしない、ブレッドボード版PanCakeの組み立て方も掲載!

(ブレッドボード版IchigoJamの組み立て解説本は前作「「IchigoJam」ではじめる電子工作&プログラミング」を参照ください)

楽しい工作&ゲームができたら、ぜひPCNこどもプロコンに応募してください!
第5回の締め切りは、9/11!


PCNこどもプロコン2016夏

はじめのいっぽは「LED1」

ゲーム作りがわかってきたら、IchigoJamを無線LANにつなぐ「MixJuice」で作品をアップロード!

PCNチャンネル on YouTube
IchigoJam-FAN on Facebook

広がる多様性、高専インターンスタート&アフリカインターン見学、IchigoJamカラバリ

2016/08/22 23:55:00
#kosen #IchigoJam #jig #intern 

夏恒例、高専インターンがスタート!2016年は13高専から16名が鯖江に集結!
サンダーバードで降り損ねて京都まで行ってしまったり、財布をなくしたりと些細なトラブルはあったみたいですが、無事初日のガイダンスを終えて、福井名物「やきとりの名門 秋吉」で歓迎会。
16人の高専インターン生など (big photo) 「jigインターンブログ2016」もスタート!

午前中はアフリカ9カ国からの鯖江インターン中の人たちの会社訪問もあり、オープンデータ/IoT/電脳メガネを使ったデータシティ鯖江の取り組みの紹介とその裾野を広げるIchigoJamこどもプログラミングを体験してもらいました。

はじめてプログラミングをする人も楽しんでくれました!世界中のこどもにITという道具を届けましょう!

5つ星オープンデータの違いや、IchigoJamライセンスに関してなど、積極的な質問、こちらも勉強になりました。

訪問ありがとうございました! (big photo)

IchigoJam T の各色基板の試作が届きました。

オリンピックは日本につながる閉会式、まさかのマリオ登場!
【NHKリオ】2020へ期待高まる!トーキョーショー - YouTube


それぞれ厚さが違います、上から1.2mm/1.0mm/0.8mm/0.6mm。とっても軽い0.6mmでもしっかり硬い印象。とはいえ、曲げや捻りに強いのは厚い基板かも。


IchigoJam black edition、つくってみました。
white editionも合わせて「PCNフラッグシップ秋葉原 by Assemblage」にて販売予定!

日本中、世界中、いろんな人がいろんなコトでつながる21世紀。
楽しくいろいろ創りましょう!

Let's make Game! My first programming by IchigoJam

2016/08/21 23:55:00
#IchigoJam #KidsIT #english 

What is a different from Computer and Robot?
No differences, it's same!

The Computer with a face and hands something, people said it's a Robot.
So you have lived with many robots already.
The TV, the airconditioner, the refrigerator ... they robots support you.

Programming is communication to the Robot / Computer.
Let's talk to Computer! Let's start programming!


But basically, Computer can not understand your words.
You need to speak with computer language.
Don't worry, it's not difficult.
Just you type in 'L' 'E' 'D' '1' and 'enter' key to light up the LED!


This is a slide to guide the first programming with tiny computer IchigoJam.


This is a goal rafting game program.


You can become to create original games and tools after learning some commands of IchigoJam.
Try the contest if you are under 15! "PCN kids programming contest"

After you got some prize, you can step up to another computer programming.
iPhone, Android, IoT, Windows, Mac and cloud computer world is very very wide.

Get the Computer as your good parter!

related links
- $15 tiny computer IchigoJam
- PCN / Programming Club Network - You can buy IchigoJam on the web
- PCN Flagship Akihabara - You can build the IchigoJam in this store
- Let's Start Programming! How to build an IchigoJam, your first computer

IchigoJam 小学生向け、はじめてのプログラミング「かわくだりゲーム」1時間コース用スライド

2016/08/20 23:55:00
#IchigoJam #KidsIT #saitama 

埼玉県越谷市、イオンレイクタウンにて、フジテレビKIDSPCN東京 presents「プログラミングワークショップ」を開催。小学生の親子約60組にIchigoJamを使ったはじめてのプログラミング体験&ゲームづくりを紹介。全3回、それぞれの子供の反応を元に更新した、はじめてワークショップのスライド、1時間コース用ができました!(on Speaker Deck / PDFkeynote


LEDをつけてとコンピューターに伝える手段は「キーボード」
はじめて使う小1の子もアルファベット大文字なら間違い探し感覚でがんばります!
4文字打てたら、エンターキーで光る!


LED1とLED0でLEDコマンドはクリア!レベルアップ!
次は画面をきれいにするCLSコマンド、「待て」を伝えるWAITコマンド、体験しながらだとすぐに吸収。
キーボードの左下にある[ALT]キーを押しながら[C]を押すと登場するネコに盛り上がる!


短いプログラムにゲームとプログラムの基本が詰まった「かわくだりゲーム」を1行ずつ、実行結果を確かめながら一緒に進めていきます。 速くできた子には、数や文字をいじっていてもらうと「出来る子の手持ち無沙汰問題」もありません。子供ばかりの場合、子供同士でサポートしあうことを促すのも効果的。


適度な難しさがおもしろいのは、ゲームもプログラミングも一緒。
ゲームは、自分でつくるともっと楽しい。


7行のプログラムで「かわくだりゲーム」はできあがり!
流れをざっと復習してプログラミング体験は終了。

15行は INKEY() と IF K=RIGHT や K=LEFT で判定する方法などもありますが、キーボード慣れていない子が多く、方程式に馴染みのない小学生には短縮形を使って、まずは速く作ることを優先するのが良さそうです。


ワークショップ後も、自分でかいぞうしたゲームを交換しながら遊ぶこどもたち。


興味もった子向けにに、家庭でできる教材「IchigoJamプリント」や、書籍雑誌も充実してきました。


大盛況!


お隣では、幼児からはじめるプログラミング ビスケットパーティ!
(VISCUIT(ビスケット)〜コンピュータを粘土のように〜)

プログラミングで広がる可能性、すべてのこどもにプログラミングを!
ぜひこのスライドをご家庭や、近所でもワークショップなどいかがでしょう?
はんだづけを含む、2時間〜3時間コースもおすすめです!


スライド&PDFダウンロード「ゲームをつくろう!IchigoJamはじめてのプログラミング // Speaker Deck
keynoteファイルIchigoJamフォント TrueType by ふうせん Fu-sen 使用)

参考リンク
- こどもパソコンIchigoJam
- PCN プログラミングクラブネットワーク
- IchigoJam-FAN Facebookグループ

日本人が創ったCPUの歴史、MacのCPU Intel 64 マシン語はじめのいっぽ

2016/08/19 23:55:00
#asm 

今使ってるMacBook ProのCPUは、Intel Core i5 2.7GHz コア数:2、64bitの汎用レジスタが15個ある64bit CPU、Intel 64というマシン語が使える。

Macのコンソールに定番の「Hello World!」と表示させるマシン語のプログラムは、このようなアセンブリ言語を使って作る。

SECTION .data MESSAGE db `Hello World!\n` MESSAGE_LEN equ $-MESSAGE SECTION .text global start start: mov rax, 0x2000004 ; syscall 4: write mov rdi, 1 ; fd = stdout mov rsi, MESSAGE ; buffer mov rdx, MESSAGE_LEN ; size syscall mov rax, 0x2000001 ; syscall 1: exit mov rdi, 0 ; retcode syscall

アセンブリ言語をアセンブラというソフトを使ってマシン語を生成することをアセンブルと呼ぶ。

nasm-2.12.02/nasm -f macho64 hello.s ld -o hello hello.o ./hello

アセンブラは、NASMというオープンソースなソフトを使う。
Macに入っているバージョンは 0.98.40 と古くIntel 64に非対応だったので、最新版 2.12.02 をダウンロード。

画面の表示は、raxなどレジスタに画面表示用のコマンド番号や、データのメモリの位置、文字数をセットしてシステムコール(syscall)というOS側に処理を依頼することで実現。プログラムの終了もシステムコールを使ってOSに伝える。

CPUは高速に2進数のbitをあれこれいじる機械。いじり方によって足し算になったり掛け算になったり、比較したり、次に実行するプログラムを変えたりする。ARMマシン語入門で、机と表現したレジスタと、本棚をイメージすると近いRAM(メモリ)を使う設計自体は、世界初の商用マイクロプロセッサ Intel 4004(開発は、日本人、嶋正利さん!)から全く変わっていない。

Intel 4004は、45命令、レジスタは4bit、計算用のAレジスタとR0-R15の16レジスタ
Intel 8008は、68命令、レジスタは8bit、A,B,C,D,E,H,LとZ80とほぼおなじ構成
Intel 8086では、レジスタが16bitになり、AX,BX,CX,DX,SP,BP,SI,DIという構成(SI/DIはセグメント)

Intel 64はその直系で、レジスタが64bit、互換性を持ちつつ拡張された RAX,RBX,RCX,RDX,RSP,RBP,RSI,RDI にR8からR15の8レジスタが追加されている。SIMD命令などで命令数は数百(〜千オーバーかも?)と膨大だが、レジスタでいじってメモリなどに書くという基本は変わらない。

IchigoJamで使っているCortex-M0は、55命令、レジスタは32bit、R0-R15という4004に似たシンプルな設計。最新の64bit版ARM、ARM64もその延長線上にある。

エスケープシーケンスとシステムコールを使うとコンソールの画面で8色の色が使える。


座標をエスケープシーケンスで渡すためにはレジスタを10進数に変換する必要があるので、一度マシン語でつくってみると楽しい。楽しみを奪うといけないので、ソースは公開はまた後日。

PCでブートするIchigoJam PCをベースに、64bitをフルに使う特殊OSを作ってみるのもありかもしれない。

参考リンク
- Intel® 64 and IA-32 Architectures Software Developer Manuals (大元、Intelの資料)
- x64 アセンブリーの概要 | iSUS
- Tips IA32(x86)命令一覧 (32bit版だかイメージはつかめる)
- よく使うASM命令ベスト100位に説明つけてみた - おなかすいたWiki!

8/26 アフリカ留学生版 鯖江市地域活性化プラン発表会&VRアプリ勉強会! 1bit IoT「Soba or Not」デモ紹介

2016/08/18 23:55:00
#IoT #IchigoJam #africa #sabae 

SketchUpで編集可能な鯖江市商店街3Dオープンデータを鯖江市に提供した、株式会社JMとJICAによるアフリカ留学生のインターンプログラム、今年は鯖江を舞台に地域活性化プランを一週間かけてつくり、発表する企画。


本日、キャンプイン at 獏の棲む森!(big photo data


アルジェリア、エジプト、エチオピア、コートジボワール、タンザニア、プルキナファソ、モーリタニア、モザンビーク、モロッコ。アフリカ各国から日本へ留学中。東京、神戸、京都、講義にも行ったことがある新潟国際大学など、大学も様々。

プラン作成に使える、便利なオープンデータはこちら「データシティ鯖江」を探してみてください。
他に必要なデータあれば、鯖江市役所または Code for Sabae まで気軽にお声がけください!
"Feel free to request another open data about Sabae city! → Code for Sabae"


プランの発表は、8/26(金) 「アフリカ留学生版!鯖江市地域活性化プラン発表会」通訳アリ!
第9回目「鯖江市地域活性化プランコンテスト | 市長をやりませんか?」とひと味違った発表が聞けるはずっ


懇親会、アイデアのネタにともっていった、リアルタイムオープンデータの源泉であり最もシンプルな 1bit のデータをWebにつなげる IoT「Soba or Not - 1bit IoT」のデモ版です。大きなトルグスイッチをつないで、そばがまだあるか、切れたかをシンプルに伝えます。


Soba or Not - 1bit IoT demo
変化があった時だけ3GIMを使ってサーバーにデータを送る省電力仕様。リアルタイムオープンデータ(JSON)を使って、簡単に好きなアプリとしてデザインして伝えたり、他のアプリと連携したりできます。

10 BPS2400:OUT6,1:OUT3,-1:OUT1,1:OUT2,1 15 OUT2,0:B=IN(1):OUT2,1 20 OUT2,0:A=!IN(1):OUT2,1 23 ?A:IF A=B GOTO 70 30 OUT6,0:INPUT"",D:UART3 40 ?"$WG http://sabae.club/siot/1/?key=xxx&v="A 50 INPUT"",R:IF !R CONT 60 OUT 6,1 65 LED 1:WAIT5:LED0 66 OUT1,!A:B=A 70 WAIT 60*10,0 80 GOTO 20

プログラムは、IchigoJam BASIC なので、とってもシンプル。調整も仕様変更もその場でサクっとできます。欲しいものは自分でつくりましょう!(参考、3GIMミサイルスイッチ


お蕎麦屋さん、まだいけるかな?を解決します。

8/26の発表会の日、午後には私が副委員長務める、福井県情報システム工業会、オープンデータ委員会主催のアプリ勉強会も開催!

(↑3D鯖江市商店街データの紹介)

株式会社JM提供の鯖江市3Dオープンデータや、360度写真オープンデータとOculusを使った3Dプログラミング体験、初心者IoTプログラミング体験など、実際にものをプロトタイピングしながら、未来の定番アプリをデザインするイベントです。合わせてどうぞ!

未来の定番アプリを考える、IoT/VRアプリ勉強会

iPhoneインラインアセンブラ入門、64bit ARMマシン語はじめのいっぽ

2016/08/17 23:55:00
#ARM #swift 

IchigoJamもiPhoneも同じARMのCPU、IchigoJamでマシン語を覚えたらiPhoneでも使ってみましょう。今回の対象は、64bit化したARM64(ARMv8)対応のiPhone5s以降です。ネットや書籍での資料には32bit時代のものも混在しているので注意が必要です。(iPhone Wikipedia)。

Swiftにはインラインアセンブラ機能はまだないようなので、Objective-CでGameをテンプレートに選び、次の行を viewDidLoad の [super viedDidLoad]; の後に追加します。

__asm__ volatile ("mov x0, x0");

※__asm__ はインラインアセンブラ、volatile で最適化を停止
エミュレーター向けだとコンパイルエラーになります。(IntelがARMライセンス取得とのことなので、MacBookへのARMv8組み込みにも期待!まずはApple-Aの生産から?詳しい解説記事


iPhoneでARM64マシン語、動きました!
(3Dの飛行機はサンプルのままで、今回のアセンブラでの動作とは無関係です)

mov x0, x0 は、レジスタX0の内容をレジスタX0に入れる(つまり、ほぼ何もしない)というマシン語を生成します。やっかいなことにこのコードはMacのiPhoneエミュレーターでは動きません。iPhoneエミュレーターはARMのCPUまでは動かしてくれないようです。実機向けにコンパイルすると動きます。(ARM64では64bitになったレジスタをRではなくXで呼ぶようになった様子)

Objective-Cでの変数との足し算をやってみます。

long num = 1; __asm__ volatile ( "mov x1, #1 \n\t" "add %[n], %[n], x1 \n\t" : [n] "+r" (num) : : "x1" ); NSLog(@"res: %ld\n", n);

コンソールに結果として 2 と表示されます。mov x1,#1 でレジスタX1に1を入れ、add命令で%[n]というコンパイラ任せなレジスタX?にX1の値を加えます。IchigoJamマシン語入門では X1=1 と表記していました。

最初のコロンの後 [n] "+r" (num) で、Objective-Cの変数numを%[n]というレジスタに割り当てて、読み書き"+"するよと指定しています。

三番目のコロンの後の "x1" で、インラインアセンブラ内で X1 レジスタを使用すると宣言して、前後のプログラムと干渉しないようにコンパイラに指定します。

これで基本はOKですね!
より詳しい解説は、こちら「ARM GCC Inline Assembler Cookbook」など参照ください

せっかくなので、アセンブラならでは機能を使った便利な関数を作ってみます。

- (unsigned long)rbit:(unsigned long)n { __asm__ volatile ( "rbit %[n], %[n] \n\t" : [n] "+r" (n) ); return n; }

rbitというのは、64のbit列を反転する命令です。普通に計算すると結構手間ですが、マシン語なら1クロック、0.1nsecで計算します!(参照、Arm64(ARMv8) Assembly Programming (08) 分岐命令

iPhone(ARMv8)とIchigoJam(ARMv6-M)との比較です。

IchigoJamのCortex-M0のThumb命令とも互換性あるiPhone6sですが、浮動小数やSIMD命令など性能をフルに活かすならARM64マシン語プログラミングへのステップアップがオススメです!レジスタもたくさんあるので作るのも楽!

参考
- Arm64(ARMv8) Assembly Programming (00)(とっても詳しいRAM64解説)
- 連載、IchigoJamではじめる、ARMマシン語入門
- 連載、iPhoneゲームづくりからはじめる、Swift入門

掛け算もインクリメントも1クロック、BASICでカジュアルに使うインラインマシン語とツール紹介 - IchigoJamではじめるARMマシン語その7

2016/08/16 23:55:00
#IchigoJam #ARM 

じっくり取り組むマシン語も楽しいですが、手軽で便利なマシン語ならではの技を紹介します。

CPUには足し算、引き算、メモリアクセスなど基本的な機能の他に、CPUによってそれぞれ固有な機能があります。現代のパソコンやスマホに使われる高性能なCPUには、3Dグラフィックスや、音声、映像などの処理の高速化のために、4つの計算を同時に行うなどのSIMD命令が含まれます。ほとんどのスマホで使われているARMアーキテクチャー、Cortex-AにはNEONというSIMD機能が搭載されています。

電源が限られるモバイルにおいて、いかに無駄な電力消費を抑えつつ、サクサク軽快なアプリを提供するかが重要です。C、JavaScript、Swiftでは、CPU固有の機能を表現する方法がないので、マシン語を使って、コンピューターの性能をフルに引き出しましょう。誰かがつくった機能(ライブラリ)を使わせてもらうのもいいですが、自分でも作ってみたくもなるでしょう。(参考「iPhoneでのピクセル処理をNEON(ベクタ演算)を使って4倍高速化する」)

IchigoJamが使っている低電力CPU、LPC1114は、ARM Cortex-M0という、Cortex-Aと命令に互換性があるサブセット(一部)です。SIMD命令はありませんが、BASICやCでは扱えない特別な演算があるので、今回はそれらをカジュアルに使います。

Cortex-M0 マシン語表(抜粋)」に、特殊演算を追記しました。

※bic:ビットクリア、asr:符号付き右シフト、ror:右ローテート
※rev:byteオーダー反転、rev16:byteオーダー反転(2byteずつ)、revSH:符号付き16bitを反転32bit化
※abc:キャリー付き足し算、sbc:キャリー付き引き算

IchigoJam BASICには当てはまる演算子がないために、関数のような書き方にしていますが、これらの計算はすべて、通常の計算と同様、1サイクルで処理できます。IchigoJamの場合、48MHzで動作させているので1サイクルは約20ナノ秒で計算は終了します(iPhone6sは最大1.84GHzなので約40倍高速な0.1nsec)。

bic:指定したビット位置のみをクリアする。普通に書くと Rd = Rd & ~Rm と、2回の演算が必要。
ror:指定した数だけ右にビットシフトして、はみ出た分は上位ビットにセットする。
rev16:16bitの上位8bitと下位8bitを入れ替える(上位32bitも同様に)

I2Cで外部センサーから取得したビッグエンディアン(=最初に上位8bitがある)なデータの読み取りに便利そうな rev16 を実際使ってみます。

[0]=`1011101001 000 000 'R0=rev16(R0) [1]=#4770 ?USR(#800,1) 256 ?HEX$(USR(#800,#3412)) 1234

#4770は呼び出し元に戻るRETURNのマシン語です。(Z80でいう#C9)
同じコードをIchigoJam BASICで書くと、下記のように少し長くなるので、繰り返し使う場合に有利です。

N=#3412 ?N<<8&#FF00+N>>8

マシン語をいれておくメモリとして、PCG領域を借りて、下記のように書くこともできます。このように、別のプログラムでいろいろな便利な関数を用意しておき、メインのプログラムを呼び出すとメモリを有効に使えます。

10 POKE#700,#40,#BA,#70,#47:P=#700 20 ?HEX$(USR(P,#CDAB));HEX$(USR(P,#3412))

Cortex-M0 マシン語表(抜粋)」にサイクル数を追加しました。ほとんどの命令が1サイクルで終了することが分かります(LPC1114は掛け算も1クロック)。実行時間が正確に計算できるのもマシン語のいいところです!

ハンドアセンブルでコツをつかんだら、アドレス計算も自動でやってくれるARMアセンブラ搭載、Mac/Windows/Linux対応IchigoJam用ツール「IJUtilities」が便利です。C言語からIchigoJam BASIC用のコードを生成する「rohiniku/IchigoJam_bin2poke」の逆アセンブル機能を使った解析も勉強に便利!

ARMマシン語は、スマホでもそのまま活かせる究極の高速化テクニック。自分の書いたコードが実際どういうマシン語になるかだいたい想像できる程度には押さえておきましょう。

C言語やJavaScriptでお馴染みの「i++」という iに1足す演算子が、Swift3ではなくなってしまいます。MSXでZ80マシン語で1足す命令(INC)や1引く命令(DEC)を知っていたため、ごく自然に受け入れて今でもよく使っているだけにさみしいものがあります。Z80では2足すより1足す方が約倍高速(機械語の手帳 ステート数表)。ただ、近年使われるよくARMは1足すのも2足すのも255足すのも速度は一緒、演算子削減の一因かもしれません。

ゲーム、スマホ、ロボット、クラウド、IoT、AIなど、奥深いプログラミングの世界も第一歩から!
福井新聞主催、PCN共催「福井県小中学生プログラミング・フェス2016」参加者募集中!

- 連載、IchigoJamではじめる、ARMマシン語入門
1. はじめてのマシン語
2. ハンドアセンブルで超速計算!
3. マシン語メモリアクセスで画面超速表示!
4. マシン語でLEDを光らせよう!
5. 楽しさ広がるマルチバイトメモリアクセスとスタック
6. マシン語使いこなしTIPS
7. カジュアルに使うインラインマシン語

ハンドアセンブルで大きな文字を256倍速表示!マシン語使いこなしTIPS - IchigoJamではじめるARMマシン語その6

2016/08/15 23:55:00
#IchigoJam #ARM 

Twitterで蘇る懐かしい記憶。
実家の本棚探ってたら小学生の頃書いたZ80の機械語のノート出てきた。」 by @AoVAさん
そう、当時の中高校生が使いこなしていたZ80マシン語は小学生の憧れ、高速ゲームを夢見て、フリーズと戦った!
※フリーズ=暴走、リセットするしかない状態、マシン語を使うとよく起きる

ということで、ARMマシン語入門、その6はちょっと実用的なプログラムをTIPSと共に紹介します。

キャラクターパターンデータを使って、1文字を8x8のテキストキャラクターを使った8倍サイズにするBASICのプログラムはこんな感じ。

12 P="BIG SCRNTEST" 15 CLT:GOSUB 100 30 WAIT 120:?TICK():END 100 FOR I=0 TO 11 110 C=PEEK(S+I) 120 FOR J=0 TO 7 122 N=PEEK(C*8+J) 125 A=#900+I&3*8+(I>>2*8+J)*32 130 FOR K=0 TO 7 140 POKE A+K,N&(1<<(7-K))<>0 150 NEXT 160 NEXT 170 NEXT 180 RETURN

32x24の画面に、8x8の文字は12文字入ります。一文字ずつCで取り出すループ、文字コード*8から8byte分あるキャラクターパターンを取り出すループと、1ビットずつ表示するループの三重ループ構造でできます。描画に242tick(約4秒)もかかってしまうので、ゲームに使うのは厳しそう・・・。

このようにマシン語でいきなり作り始める前に、BASICで考え方(アルゴリズム)が間違ってないか、実際に動かして確認するといいです。(2進数のビット演算には慣れておきましょう

では、早速マシン語で高速化します!
ARMマシン語対応表(PDF版)」を片手に、BASICの変数の代わりにレジスタを使ってつくっていきます。この時、いきなり全部つくろうとせず、ループの内部の細かい部分から順に動作を確かめながらつくるのがコツです。問題は切り分ける!

1. 画面の左上にパラメータ(R0)として渡した数を表示しよう
2. 0ならCHR$(0)そうでなければCHR$(1)を表示しよう
3. 渡したパラメータの下位8bitでパターンを表示しよう(上位bitが左上になるように)
4. キャラクターコードを渡してキャラクターパターンを表示させよう
5. キャラクターコードが12コ連続してかかれたメモリ位置(=アドレス、C言語で言うポインタ)を渡して12コ表示しよう

つくりかたですが、いきなり2進数にしてしまうと読みづらいので、読みやすいプログラム(=アセンブリ言語)で先に書いて、変換(=ハンドアセンブル)するのがおすすめです。

'BIG SCREEN PROGRAM 'R0:param, address of 12 characters 'R1:virtual memory offset(RAM) 'R2:virtual memory offset(ROM) PUSH LR,R4,R5,R6,R7 R12=R2 'save to R12 R6=0 'offset 0-11 R7=R1+R0 'real memory address of 12 characters R3=9 R3=R3<<8 R1=R1+R3 loop0: R0=[R7+R6] R0=R0<<3 R2=R2+R0 R4=0 loop1: R3=[R2+R4] R5=#80 loop2: R0=R3 R0=R0&R5 IF 0 GOTO else1(2) R0=1 else1: [R1]=R0 R1=R1+1 R5=R5>>1 IF !0 GOTO loop2(-7) R1=R1+24 R4=R4+1 R4-8 IF !0 GOTO loop1(-13) R1=R1-24 R0=3 R0=R0&R6 R0-3 IF 0 GOTO eles2(2) R1=R1-224 else2: R2=R12 R6=R6+1 R6-12 IF !0 GOTO loop0(-27) end: POP PC,R4,R5,R6,R7

レジスタはR0からR3とR12以外を使う場合は、呼び出し元(この場合、IchigoJamの動き)を壊してしまう恐れがあるので、PUSH/POPを使って退避しておきます。この時LR(リンクレジスタ、戻り先のアドレスが入っている)をまとめてPUSHしておき、POPするタイミングでPC(プログラムカウンタ、現在実行中のアドレス)に戻すと、RET(=#4770)の代わりになって便利です。

今回使用したレジスタは破壊してOKなR12を含めて、R7までに収まったのでPUSH/POPは一組で済みましたが、足りなくなった場合は、適宜PUSH/POPをループ前に使いましょう。その都度、レジスタの使いみちを簡単にメモしておくと便利です。


ハンドアセンブルは、IchigoJamの2進数表記とビット演算などを使って少し楽できます。

10 [0]=`1011010 1 11110000 11 [1]=#4600+`1 0010 100 12 [2]=`00100 110<<8+0 14 [3]=`0001100 000 001 111 16 [4]=`00100 011<<8+9 18 [5]=`00000 01000 011 011 20 [6]=`0001100 001 011 001 22 [7]=`0101110 110 111 000 30 [8]=`00000 00011 000 000 40 [9]=`0001100 000 010 010 60 [10]=`00100 100<<8+0 70 [11]=`0101110 100 010 011 80 [12]=`00100 101<<8+#80 90 [13]=`0100011000 011 000 100 [14]=`0100000000 101 000 102 [15]=`11010000<<8+(2-2)&#FF 104 [16]=`00100 000<<8+1 106 [17]=`01110 00000 001 000 110 [18]=`00110 001<<8+1 120 [19]=`00001 00001 101 101 130 [20]=`11010001<<8+(-7-2)&#FF 140 [21]=`00110 001<<8+24 150 [22]=`00110 100<<8+1 160 [23]=`00101 100<<8+8 170 [24]=`11010001<<8+(-13-2)&#FF 180 [25]=`00111 001<<8+24 190 [26]=`00100 000<<8+3 200 [27]=`0100000000 110 000 205 [28]=`00101 000<<8+3 210 [29]=`11010000<<8+(2-2)&#ff 220 [30]=`00111 001<<8+(224) 225 [31]=#4600+`0 1100 010 230 [32]=`00110 110<<8+1 240 [33]=`00101 110<<8+12 250 [34]=`11010001<<8+(-27-2)&#ff 260 [35]=`1011110 1 11110000 RUN A=USR(#800,"IchigoJamASM"):WAIT120

GOTOなどのジャンプ先は、命令の数を相対的に数えます。例えば2つ先なら2、2つ戻るなら-2。その数を-2した数を5桁または11桁の2進数に変換します(例、13コ前に飛ばす場合、(-13-2)&#FF)。命令を追加、変更、削除したときにアドレスを計算し直す必要があるので注意!

PUSHとPOPの数が合わない、ループから抜け出さないなど、どこか間違った場合、保護する機能はないので、高確率でフリーズします。実行前には保存しておきましょう。 フリーズしても、リセットか電源入れ直しですぐに復帰するのがIchigoJamのいいところ!(MSX時代は、暴走時の謎のディスクアクセスに怯えました)

動作が確認できたら、BASICのプログラムに簡単に使えるように、短いコードにしておくのも便利です。(LRUNでつなげてももちろんOKです)

?"1 POKE#700,";:FOR I=0 TO 32:?PEEK(#800+i);",";:NEXT:?CHR$(8) ?"2 POKE#720,";:FOR I=0 TO 36*2-1-32:?PEEK(#820+i);",";:NEXT:?CHR$(8)

アドレスをすべて相対的に使っているため配置変更可能(=リロケータブル)です。このように#800(配列)の領域から#700のPCG領域へ移しておくと、BASICで配列が使えて便利です。

BASICと速度を比べてみましょう。

1 POKE#700,240,181,148,70,0,38,15,24,9,35,27,2,89,24,184,93,192,0,18,24,0,36,19,93,128,37,24,70,40,64,0,208,1 2 POKE#720,1,32,8,112,1,49,109,8,247,209,24,49,1,52,8,44,241,209,24,57,3,32,48,64,3,40,0,208,224,57,98,70,1,54,12,46,227,209,240,189 10 FOR I=0 TO 12*4-1:POKE#800+I,RND(256):NEXT 12 P="BIG SCRNTEST" 15 FOR S=#800 TO #800+12*3:IF !BTN() GOSUB 100 ELSE A=USR(#700,S) 17 WAIT 1:NEXT 20 S=P:IF !BTN() GOSUB 100 ELSE A=USR(#700,S) 22 WAIT 10 30 GOTO 15 100 FOR I=0 TO 11 110 C=PEEK(S+I) 120 FOR J=0 TO 7 122 N=PEEK(C*8+J) 125 A=#900+I&3*8+(I>>2*8+J)*32 130 FOR K=0 TO 7 140 POKE A+K,N&(1<<(7-K))<>0 150 NEXT 160 NEXT 170 NEXT 180 RETURN

ボタンでBASICとマシン語の速度差が体感できます!マシン語だと1tick(1/60秒)かかりません!
1行2行だけ流用すると、他のプログラムでも大きな文字表示、使えます。


動画 on Vine

作るのに手間がかかるけど、動作は高速なマシン語。
作るのは簡単・高速だけど、動作は遅いBASIC。
いろいろなプログラミング言語がある理由はここにあります。

面倒なアドレス計算や表からのピックアップを自動化したものをアセンブラといいます。

また、数式など分かりやすいプログラミング言語から、マシン語の生成してくれるソフトのことをコンパイラといって、C言語はその代表。 IchigoJam BASICは、BASIC言語のコマンドに合わせて対応するマシン語を順に呼び出すインタープリタ。 Ruby、JavaScript、Swift、Javaなど最近の言語はバーチャルマシンといって仮想的なマシンのマシン語を使ったり、適宜コンパイルしたりと、両方のいいとこ取りをしています。

マシン語が分かったら、IchigoJam BASICで実際にアセンブラやコンパイラを作って、プログラミング言語の自作にも挑戦してみてください! ARMマシン語は、Android/iPhoneでも使えます。他のマシン語も似たようなものなので、一つ使えるようになっておけば怖いものなし!(実際、小学生の頃のZ80マシン語の知識が活きました)

日本産の世界に広がるプログラミング言語、Rubyに続こう!

- 連載、IchigoJamではじめる、ARMマシン語入門
1. はじめてのマシン語
2. ハンドアセンブルで超速計算!
3. マシン語メモリアクセスで画面超速表示!
4. マシン語でLEDを光らせよう!
5. 楽しさ広がるマルチバイトメモリアクセスとスタック
6. マシン語使いこなしTIPS
7. カジュアルに使うインラインマシン語

- ARMマシン語表(PDF版)

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — 表示 4.0 国際 — CC BY 4.0」の下に提供されています。
CC BY 福野泰介 - Taisuke Fukuno / @taisukef / 高解像度プロフィール画像(和服)