* OSECPU-ASKA入門 #0000 -(by [[K]], 2013.06.06) ** (0) はじめに -以下の記事はver.0.46のWindows版を前提にしています。他の版を使っている場合は適宜読み替えてください。 --たとえば osecpu046a.zip とかのことです --これは[[memo0005]]などを読めば最新版が見つかります。 --たとえば osecpu046a.zip とかのことです。 //--これは[[memo0005]]などを読めば最新版が見つかります。 --これは[[page0074]]を読めばrev1の最新版が見つかります。 ** (1) ASKAは意外に難しくない? -いきなりですが、以下のプログラムを見てください。ちなみにapp0038.askそのものです。 #include "osecpu_ask.h" junkApi_fillRect(4, 640, 480, 0, 0, 7); junkApi_fillOval(4, 300, 300, 320-150, 240-150, 1); -実質3行です。中の数字の意味はとりあえず全く分かりません。それどころか英語の部分だってよく分かりません。とりあえずそのことは気にしないことにします。とにかく重要なことは、3行しか書いていないということです。 -これをosecpuの入ったフォルダにテキストファイルとして保存して(ここではとりあえずapp0038.askとする)、Windowsのコマンドプロンプトで、 prompt>amake app0038 -と入力すると、app0038.oseというアプリケーションファイルができます(もともとあった場合には問答無用で上書きされます)。 -次に prompt>osecpu app0038.ose -とすればこれは直ちに実行されて、以下のような画面が見えると思います。 http://osecpu.osask.jp/download/app0038.png -どうですか、つまり3行書くだけでこの程度の画像が表示できるというわけです。これは結構すごいと思うのですがどうでしょうか。CやC++でMFCとか使ってやったら、こんなに手軽にはできません。 ~ -もう一つ例を示そうと思います。 #include "osecpu_ask.h" int32s xsiz:R00, ysiz:R01, x0:R02, y0:R03, col:R04, i:R05; for (i = 0; i != 128; i++) { xsiz = ysiz = (144 - i) * 2; x0 = (320 - 144) + i; y0 = (240 - 144) + i; col = i * 0x020201; junkApi_fillOval(0, xsiz, ysiz, x0, y0, col); } -これは実質9行です。でもたったこれだけでも、こんな画面が出てきます。 http://osecpu.osask.jp/download/app0039.jpg -いろいろと意味の分からない英語や数字が出ていることは確かですが、しかしとにかく、たくさん書かなくてもある程度のことができるということをまずは分かってほしいです。 ~ -さらにもう一例を。 #include "osecpu_ask.h" int32s x:R00, y:R01, c:R02; junkApi_openWin(256, 256); c = 0; for (x = 0; x != 256; x++) { for (y = 0; y != 256; y++) { junkApi_drawPoint(0, x, y, c); c += 0x100; // 00xxyy00 } } -これは実質10行です。でもたったこれだけでも、こんな画面が出てきます。 http://osecpu.osask.jp/download/app0006a.png ~ -ASKAは高級言語ではなくアセンブラという低級言語に分類されますが、しかし一般的なアセンブラとは大きく異なり、プログラムをそれなりに短く書くことが可能です。この節ではまずそれを分かってもらいたいと思います。 --ちなみに世間の普通のアセンブラはC言語の3倍以上の行数になります。 -命令の細かい意味は、以降の節で説明します。 ** (2) openWinとfillRect -(1)では、junkApi_で始まるいくつかの命令がありました。それについて紹介します。 ~ -まずは junkApi_openWin(xsiz, ysiz); です。これは画面にグラフィックス用のウィンドウを準備するための命令で、すべての描画命令に先立って1度だけ実行できます。したがって複数のウィンドウを持つことはできませんし、ウィンドウのサイズを後から変更することもできません。 -xsizにはx軸方向のピクセル数を、ysizにはy軸方向のピクセル数を入れます。これらの値はウィンドウの外側の大きさではなく、描画可能な領域の大きさを示しています。xsiz, ysizともゼロや負の値を指定してはいけません。 -openWinは省略して、いきなり描画命令を実行させることもできます。この場合自動で junkApi_openWin(640, 480); が実行されます。ですからこの大きさでかまわないときはわざわざopenWinする必要はありません。でもあえてやりたければもちろんやってもいいです。 -描画域は必ず黒で初期化されます。描画命令で指定できる座標の範囲は、0~(xsiz-1), 0~(ysiz-1)になります。 ~ -次は junkApi_fillRect(mode, xsiz, ysiz, x0, y0, color); です。これは画面に塗りつぶした長方形を描きます。modeは通常0を指定します。xsizとysizは長方形の辺の長さです。x0, y0は長方形の左上の座標を指定します。colorは色です。長方形の一部もしくは全部が描画域をはみ出すとエラーです。 -colorについてですが、こんなふうに指定します。 0x000000 : 黒、いわゆる #000000 0xffffff : 白、いわゆる #ffffff 0xff0000 : 赤、いわゆる #ff0000 -書いているときりがないので、 http://www.finitojapan.com/cltable.html とかを見て自分のほしい色を探してください。 -これで基本的にはどんな色でも使えるわけですが、色数が少なくていいから、もっと簡単に色を指定したいときがたまにあります(みなさんはないかもしれませんが、[[K]]にはあった)。そんなときは、modeに4を指定してください。そうすると、colorは0から7までしか指定できなくなって、こんなに単純になります。 0:0x000000 1:0xff0000 2:0x00ff00 3:0xffff00 4:0x0000ff 5:0xff00ff 6:0x00ffff 7:0xffffff ~ -これらの関数名がなぜjunkApi_で始まるかですが、[[K]]はOSECPUの実装に当たってAPIの仕様をていねいに検討する時間がなく、かといってAPIなしだと画面に何も出せなくて動作チェックすら困難なので、まあ適当に作ったのです。だからjunkなAPIということで、junkApiという接頭語が付いています。 ** つづく -[[page0037]]につづく *** もくじ -[[page0036]]: #0000 --(1) ASKAは意外に難しくない? --(2) openWinとfillRect -[[page0037]]: #0001 --(1) drawPointとfillOvalとdrawLine(ついでにmodeについて) --(2) とりあえずここまでで --(3) 整数型変数 -[[page0038]]: #0002 --(1) for構文 #0 --(2) コメントについて --(3) できそうでできないこと --(4) 色の指定と16進数について -[[page0039]]: #0003 --(1) sleep --(2) アニメーション --(3) if文 --(4) exit --(5) inkey --(6) アニメーション+キー入力=ゲーム -[[page0044]]: #0004 --(1) 関数の作り方、呼び出し方 --(2) 1桁の数字を表示できる関数の例 --(3) 4桁の数字を表示できる関数の例 --(4) %dみたいな数字を表示できる関数の例 -[[page0045]]: #0005 --(1) drawString --(2) リリースモード --(3) 複数の関数を作る例 --(4) sleepのmodeについて --(5) inkeyのmodeについて --(6) グラフィックスでpage0044の(4)をやってみよう! --(7) for構文 #1 -[[page0048]]: #0006 --(1) rand --(2) putString2 * こめんと欄 #comment