SAVEするのを諦め、まるっと残り7KB使ったプログラムづくりも可能です。BASICで自在に扱える国産パソコンIchigoJamは、現在バージョン1.4調整中。10オシャレな模様をランダム模様が表示されます!こちら先週末の永平寺イベントで活躍した、WS2812Bを16x16、256コ並べた、大型ディスプレイ。WS.LEDコマンドは配列にRGBやGRBの順に入った値を使って最大34コのWS2812BなどのLEDを制御できる1.4新設コマンド。台二パラメータでリピート設定すれば、何千個ものフルカラーLEDも制御できます!16x16、256コを個別に制御するには?ちょっと背伸びしてマシン語を使いましょう。10進数の数を打ち込むだけで使えます。RTNこちらが1.4で対応するAPIを呼び出す、マシン語部分のプログラム、asm15でアセンブルすると、10行の数の並び、マシン語が生成されます。#50010004ただ、32byteもあって、APIを使っている割にはちょっと長い。使うレジスタを破壊してOKなR3までにできればGOTOで呼び出しでき、PUSH/POPが不要になりそう。R3APIづくりは、利用者想いが大事!まずは自分で使うことだと、身にしみました。<>近々バージョンアップします。作って、C言語版も作ってみました。いうファイル名のファイルの中身をまるっと取り込んでくれます。何なのかが書いてあります。中身はこのような感じ。IDを覚えていなくても、分かりやすい名前で呼び出せて、コンパイルする際、間��った使い方は警告してくれるなど、いたれりつくせり。20%ほどコード量が増えてしまってますが、十分に小さいのでOKですね。使える容量は、#700-#7FFまでで256byte、変数を使わないことにすれば512byteまで。プログラム領域#C00以降にPOKEコマンドで書き込むように変更すると、1KB近くまで使えます。すると、マシン語コードを表示します。コンパイラがどのようなマシン語にするか辿って、どこに無駄があるか読んでみるもまたおもしろいですよ。某高専生の某高専生による高専生のための...」ただ、C言語、初めてプログラミングとしていきなり学ぶのはオススメしません。BASIC、JavaScript、Python、Ruby、Unity、何でもいいので、サクッと簡単に楽しいゲームが作れることを体験しましょう。便利なツールを使って、実現したいことを最短で実現し、もっとやってみたい!と興味を持つことが何より大事です。コンピューターの気持ちが気になったら、コンピューターの構造(アーキテクチャ)、マシン語、C言語、現代言語の順に学ぶのがオススメです。マシン語を触ってコンピューターの真の力を体感し、ちょっとしたプログラムを作るのに苦労してもらった上で、C言語のコンパイラに触れると、もう一度コンピューターってすごい!となれます。楽しく、もっと速く作りたい!という思いが、Python、Ruby、JavaScript、Go、Javaなどの言語を産みました。C言語を学ぶのか、それは、それらのモダン言語と言われている言語自体を作った言語がC言語だからです。#asmすごいゲームを作りたい!が、マシン語を学ぶ原点でした。体験して、興味を持った状態での座学が効率的!オールマシン語の「かわくだりゲーム」アドレスを書き換えて、WAITの値を0にすると、超高速!当然、即死するので、当たり判定を無効化して無敵モード!マシン語なので、ESCは効きません。機能追加:SWITCHの第二パラメータで液晶の濃さを指定可能(0:デフォルト=14、1:最も薄い、63:最も濃い)マシン語レベルで眺めてみれば、まだまだ見つかる最適化の余地。IchigoJam!引き続き、ご要望、お待ちしています。APIテーブル(β)オールマシン語かわくだりの作り方。APIはIDで2byteの値をメモリから読み出し、そのアドレスへGOSUBする。{R7,PC}ハンドアセンブルするか、asm15などでアセンブルして、BASICで実行してみましょう。{R4-R7,PC}で、OK。この調子でひとつひとつ作っていく感じは、BASICでもどんな言語でも一緒です。マシン語はひとつひとつの命令の粒度が小さいので、プログラムが長くなりがちです。コンパイラが作りたくなる気持ちがわかりますね。{R4-R7,PC}asm15でアセンブルして、動かしてみましょう。上書きして、当たり判定を無効化して、無敵モード。「かわくだり」をC言語で書いてみた。#kosen高専の情報系の学科にはOSを学ぶ授業があります。自分で使って作って遊んでみるのが近道です。OSの外での実装を検討中。その手段として、マシン語やmrubyなどからの呼び出しに便利なAPI提供を行う予定にしています。公開時はAPIテーブルとして固定のアドレスに置くことになりますが、先行してAPI直接呼び出しする実験方法を紹介します。example)ゲームでは欠かせないランダム(rnd)はこんな風に呼び出せます。Thumbマシン語として呼び出します。返り値はR0に格納されるので、マシン語はシンプルにGOTOするだけ。R0inkeyは#A15、clsは#196D、wait1は#219です。パラメーターを渡すAPI、画面表示のputcは、こんな風に使います。R1パラメータを一つ受け取るAPIとして、数を出力するputnum(#18E1)もおもしろいです。12345RNDを使った応用例として画面をランダムに埋め続けるプログラムを、ステップバイステップで解説します。?USR(#700,65)Aが画面左上(#900)に表示されます。USRの第二パラメータに表示したいキャラクターコード、レジスタR0として使えます。rndを使って、ランダムなキャラを出します。{PC,R4}関数内で更に関数を呼び出す場合、戻り先LRをPUSHで保存しておき、POPで戻しましょう。?USR(#700,0)ランダムな場所に出します。{PC,R4-R6}R3の割り算を使って、%(32*24)を実現して画面全体ランダム表示。捨て身の無限ループなので、電源を切るまで停止することはできません。戻ってこないのでPUSHもなし。#asmアルゴリズムの工夫や、マシン語化で速くなることを体験しました。今回、それぞれ実測してみましょう。シンプルに引き算を続けるBASIC版から、CLTとTICK()を使って計測します。コンピューターくんへの課題は「10000/7」とします。1428...4BASICでは369、TICK()は1秒間に60進むので、6.1秒です。(IchigoJam上で10倍して60で割ると小数1位まで計算できます。1428...4なんと、0.08秒(5/60秒)。73倍も速くなってます。アルゴリズムって大事ですね。続いて、マシン語の単純ループ版。00、つまり1/60秒未満。この時点で単純ループ版でもBASIC筆算版を上回る速度がでていることがわかります。0ではどのくらい速いかわからないので、ループを使います。2831000回で283、4.7秒でした。・・・が、待ってください。BASICの処理で時間がかかっているかもしれません。#4770)でも測ります。19やはり、ほとんどがBASICの処理時間でした。差分は19、0.31秒/1000回。1回あたり310マイクロ秒(=0.31ミリ秒)、BASIC版の2万倍も速いことがわかります。次に、マシン語筆算版を計測してみます。0速すぎて、差分が0になってしまいました。ループ回数を10倍の10000回にして比較します。8310000回で0.083秒。1回あたり8.3マイクロ秒。ループ版から37倍、速くなりました。BASIC筆算版の約1万倍速と、高速化具合は似たようなものですね。遅いアルゴリズムでも言語や環境を変えるとなんとかなってしまう(力技)いくらコンピューターが高速化しようとも、同じ環境上でいかにアルゴリズムの工夫で高速化できるかが、電気代やサーバー台数など、かかる費用に直結します。これが流行る流行らないの決定的な差になったりします。アルゴリズムなど理論ばかり見ていてもどう使えるのかイメージが沸かずつまらないし、プログラミング言語の文法だけ学んでもアルゴリズムが弱いとせっかくのパワーが活かせません。BASICのスピードは、アルゴリズム変更が人間にとってリアルにコンピューターを体感できる速度域。入門時の学習がむしろ、手軽で速いはず。アルゴリズムやコンピューターを学ぶコツをさえ身に着けたら、数億倍速い環境が待ってます。Cortex-M0のマシン語には、割り算命令がありません。R(A:商、R:あまり、ただしNもMも正の整数とする)という割り算をする場合、割り算記号を使わずに作成できればOKです。何か、得意な言語で作ってみましょう。・・・としてもいいのですが、割られる数が大きくて、割る数が小さい時、何万回もループすることになって遅そうです。30000/1を計算する場合、1ループ5cycle3万回で15万cycle。0.63ミリ秒かかります。足し算引き算かけ算の15万倍も遅いとなると、高速処理が命のゲームで使うには厳しいこともありそうです。そこで登場、アルゴリズム(問題解決手法)!ひとまず簡単に思いつくところで、2進数を使った筆算アルゴリズムで高速化してみます。割り算を手で計算するときに筆算を使うように、大きな桁からかけ算して引いてを繰り返して答を求めます。2進数の筆算は0か1かしかないので、とってもシンプル。何か書きやすいプログラミング言語でアルゴリズムを確かめます。BASIC桁溢れ防止のため10bitシフトからスタート)前の手法に比べて速くなったことが体感できましたね?では、こちらをマシン語にします。{PC,R4}ループ回数が16回にまで劇的に減り、先の最悪の場合と比較し、約1000倍高速です!ただし、その代償として、マシン語の量が32byteと16byte増えてました。これが多いか少ないかは状況次第です。割る数と割られる数が近い場合は毎回150cycleかかる今回の手法と違って、単純ループの実装の方が速かったりします。状況によって使い分けましょう。OSとしてのIchigoJamとしては、汎用的に使われることを想定して、あまりに遅い除算は残念なので、第二案でいきたいです。容量は極力小さくしたいので、かけ算が1cycleで動くことを利用して、もうひと工夫縮めてみます。{PC,R4}2byte縮み、引き算する場合のcycleが2減りました!たった2byteと笑うかもしれませんが、その2byteを削るのに結構苦労したりするんです。42実は、まだ落とし穴があります。マイナスの値で割り算の計算をさせてみてください。割る数に0を指定した時にどんな動きをしてほしいですか?すべては、あなたの思い次第!より高速で効率良いアルゴリズムを探してみるのも楽しそうです。Wikipediaの「除算」を見てみると、懐かしの割り算バグありPentiumの話がでてました。試行錯誤の積み重ねで、今のコンピューター社会ができていることがわかります。#asmプログラミングしていると自分言語が作りたくなる時期が来ます。BASICでコンパイラを作りたくなった時、書かれた数式を評価できたら便利です。実は数式を解釈するINPUTコマンドとキーバッファ操作を組み合わせれば実現できます。261計算してくれました!変数も関数も実は使えます。15あとはエンターキーを押せば、Nに数式を評価した結果が入ります。#12)を使って、行頭へカーソルを移動させておくこともできます。15あとは、メモリ内、キーバッファを直接操作して、入力したことにすれば自動化できます。32メモリマップを見ると、#1003がキーバッファの数、その後がキーバッファとなっています。POKEコマンドで、キーバッファの数を1、キー入力の値としてエンターを表す10をいれておくと、INPUTを呼び出した瞬間、帰ってきます。(INPUTあとに空文字列指定で、?非表示に)これを活用して、R0レジスタに数をいれるだけのコンパイラを作ってみます。マシン語表を見ると、32(=1<<5)とレジスタ番号を足したものに、値と並べることがわかります。Cortex-M0は、下位が先に来る、リトルエンディアンなので、N,32の順番にメモリに書き込んでコンパイル完了!Armマシン語を生成されました。1036おや、Nの値はちゃんと計算されているのに、コンパイルしたプログラムはおかしいですね。マシン語表を見ると、u8、つまり8bitまでしか対応していないわけです。R0+=N&#FFと、コンピューターくんに分かるように噛み砕いてあげましょう。マシン語表を見ながらメモリに書くマシン語にします。OKこんな調子で、自分だけのアセンブラ、自分だけのコンパイラを作っていきます。4.0」の下に提供されています。