page0045
の編集
http://osecpu.osask.jp/wiki/?page0045
[
トップ
] [
編集
|
差分
|
バックアップ
|
添付
|
リロード
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
-- 雛形とするページ --
BracketName
FormattingRules
FrontPage
Fulyn
Fulyn-v2
Fulyn_Samples
Help
InterWiki
InterWikiName
InterWikiSandBox
K
KOR_PIT8254
KWVM.NET
Liva
MANA
MenuBar
OSECPU_FPGA
PG_MANA
PHP
PukiWiki
PukiWiki/1.4
PukiWiki/1.4/Manual
PukiWiki/1.4/Manual/Plugin
PukiWiki/1.4/Manual/Plugin/A-D
PukiWiki/1.4/Manual/Plugin/E-G
PukiWiki/1.4/Manual/Plugin/H-K
PukiWiki/1.4/Manual/Plugin/L-N
PukiWiki/1.4/Manual/Plugin/O-R
PukiWiki/1.4/Manual/Plugin/S-U
PukiWiki/1.4/Manual/Plugin/V-Z
RecentDeleted
SandBox
WikiEngines
WikiName
WikiWikiWeb
YukiWiki
hikalium
hikarupsp
hikarupsp_ELCHNOS
hikarupsp_ELCHNOS_IDE
hikarupsp_FrontEndCode
hikarupsp_WebCPU-VM
hikarupsp_WebCPU-VM_internal
hikarupsp_study_hh4
impressions
impressions0000
jpag0000
jpag0001
jpag0002
jpag0003
jpag0004
jpag0005
lambdalice
mandel59
members
memo0000
memo0001
memo0002
memo0003
memo0004
memo0005
memo0006
memo0007
memo0008
memo0009
memo0010
osask
osecpu4android
page0000
page0001
page0002
page0003
page0004
page0005
page0006
page0007
page0008
page0009
page0010
page0011
page0012
page0013
page0014
page0015
page0016
page0017
page0018
page0019
page0020
page0021
page0022
page0023
page0024
page0025
page0026
page0027
page0028
page0029
page0030
page0031
page0032
page0033
page0034
page0035
page0036
page0037
page0038
page0039
page0040
page0041
page0042
page0043
page0044
page0045
page0046
page0047
page0048
page0049
page0050
page0051
page0052
page0053
page0054
page0055
page0056
page0057
page0058
page0059
page0060
page0061
page0062
page0063
page0064
page0065
page0066
page0067
page0068
page0069
page0070
page0071
page0072
page0073
page0074
page0075
page0076
page0077
page0078
page0079
page0080
page0081
page0082
page0083
page0084
page0085
page0086
page0087
page0088
page0089
page0090
page0091
page0092
page0093
page0094
page0095
page0096
page0097
page0098
page0099
page0100
page0101
page0102
page0103
page0104
page0105
page0106
page0107
page0108
page0109
pagenames
populars
seccamp2013
seccamp2014
seccamp2017
ttwilb
ttwilb-asmi
yao
* OSECPU-ASKA入門 #0005 -(by [[K]], 2013.06.24) ** (0) はじめに -以下の記事はver.0.49のWindows版を前提にしています。他の版を使っている場合は適宜読み替えてください。 --たとえば osecpu049d.zip とかのことです ~ -もくじ --[[page0036]]: #0000 --[[page0037]]: #0001 --[[page0038]]: #0002 --[[page0039]]: #0003 --[[page0044]]: #0004 --[[page0045]]: #0005 ** (1) drawString -junkApi_drawString(mode, xsiz, ysiz, x0, y0, color, string); : --グラフィクス描画用のウィンドウの中に文字を書きます。modeは毎度の数値で、drawPointなどと同じです。 --xsizやysizは1以上の整数を指定します。両方が1のとき、1文字は8x16ピクセルです。 --x0とy0は1文字目の左上の座標を指定します。 --(例) #include "osecpu_ask.h" junkApi_drawString(4, 1, 1, 0, 0, 7, 'abcd'); junkApi_drawString(4, 8, 8, 0, 20, 7, 'abcd'); --現状で表示できるのはASCIIキャラクタだけです。'\n'や'\t'などの制御文字は指定できません。 --拡大するとぎざぎざが非常に目立ちますが、それは仕様です。美しいフォントなどを提供する予定は今のところありません。 ---どうしてもきれいに描きたい場合は、アプリが自前で描画すればよい、というスタンスです。 ** (2) リリースモード -OSECPUアプリは小ささが自慢と言うか取り柄なのですが、ここまではそのための話をほとんどしてきませんでした。 -最初の[[page0036]]の(1)で紹介したアプリのビルド方法は、実はデバッグモードで、全然小さくならない、つまらないものでした。・・・まあでもそれが一番簡単なビルド方法なのでありますが。 -しかしもうデバッグも終了して、リリースするだけとなれば、過剰なデバッグ情報はただの無駄です。必要最低限にさせましょう。 --註:すべてのデバッグ情報を簡単に取り除く手段は用意していません。ある程度の規模になれば、絶対にバグがないプログラムなんて、そうそう作れないと思うのです。だから保険のためにも、最低限度のデバッグ情報は残しています。 ~ -まず、デバッグ情報の過剰な生成をやめさせる必要があります。 prompt>amake app0038 -DNODBGINFO0 --これはちょっと分かりにくいですが、NO DBG INFO 0 です。最後の文字は「オー」ではなくてゼロです。デバッグインフォ0というものがあって、それを「ノー」するわけです。そういう識別子をdefineするスイッチです。 --もっとわかりやすいスイッチにすればよかったと、数週間前から反省しているので、許してください。 -これでたいていのプログラムは結構小さくなります。これで200バイト未満になるようであれば、たぶん次のステップは必要ありません。 ~ -さらに小さくしたい場合は、OSECPU標準のパッカーを使います。 prompt>osectols tool:appack flags:8 in:app0038.ose out:app0038.tk5 --ただしこれをやる場合は、ext_tolsにあるbim2binとt5lzmaをosectolsと同じフォルダにコピーしておく必要があります。 --[2013.07.30追記] OSECPU ver.0.64以降では、flags:8にしてください。0.63まではflags:2でした。 -そうすると例えばこういう表示が出ます。 org:34 tk5:48 -これはパッキングしたほうが大きくなってしまったことを意味してます。もともとのオリジナルは34バイトで、パック版は48バイトですよ、と。この場合はパックなんてしないほうがいいので、このtk5ファイルは捨てて、app0038.oseをそのままリリースします。 -しかしアプリによっては、tk5のほうが小さくなることがあります。そんなときは、oseのほうを捨てて、.tk5を.oseにリネームしちゃってください。 ~ -これで完成です。めでたしめでたし! ** (3) 複数の関数を作る例 -細かいことは書きませんが、複数の関数を宣言して使いたい場合の冒頭部分はきっとこんな感じになります。 #define L_func1 LOCAL(0) #define L_func2 LOCAL(1) #define L_func3 LOCAL(2) LOCALLABELS(3); #define func1() CALL(L_func1) #define func2() CALL(L_func2) #define func3() CALL(L_func3) -参考にしてください。 ** (4) sleepのmodeについて -[[page0039]]の(1)でsleepを紹介しましたが、その際にmodeの使い方を説明しませんでした。今回はそれを説明します。 -modeはビットごとに意味を持っています。したがって以下を加算して組み合わせることができます。 --1: グラフィックス画面の自動全画面flushを抑制する。 ---これを指定しなければ、sleepが呼ばれるたびに全画面flushが行われるので、アプリがflush処理を意識する必要はほとんどなくなります。その代わり負荷は増えます。 ---とはいえ、現状ではまだ説明してないのでflushって何?状態ですよね。そうです、分からなくても構わないので、この1を指定しないようにしてください。それで万事解決です。 ---しいて言えば、前回のsleepから一切画面を書き換えていないときには、この指定をしてもいいです。そうすればCPU負荷が下がってCPUにやさしいアプリになれます。まあでもこれを気にして処理が複雑になるくらいなら、何も考えずに0をしてしておく方がずっといいです。 --2: sleepし終わった時にinkeyバッファをチェックし、もし空であればもう一度指定された時間のsleepを実行する。 ---つまりこれを指定すれば、inkeyバッファが空の状態で戻ってくることはありません。 ** (5) inkeyのmodeについて -[[page0039]]の(5)でinkeyを紹介しましたが、その際にmodeの使い方を説明しませんでした。今回はそれを説明します。 -modeはビットごとに意味を持っています。したがって以下を加算して組み合わせることができます。 ---とはいえ、現状では1しかないので組み合わせようがないですが。 --1: 非peekモードにする。 ---これを0にしてpeekモード指定すると、inkeyバッファの先頭のものを取ってはきますが、バッファから削除しません。たぶんあまり使わない機能だとは思います。(2013.07.30 誤記修正 thanks: ?さん) ** (6) グラフィックスで[[page0044]]の(4)をやってみよう! #include "osecpu_ask.h" #define L_drawDec LOCAL(0) LOCALLABELS(1); #define drawDec(mode, xsiz, ysiz, x1, y0, col, i) R30=mode; R31=xsiz; R32=ysiz; R33=x1; R34=y0; R35=col; R36=i; CALL(L_drawDec) #define XSIZ 16 #define YSIZ 16 // main do { SInt32 i:R00; for (i = 111; i != -100; i--) { junkApi_fillRect(0, 8*XSIZ*3, 16*YSIZ, 0, 0, 0x000000); drawDec(4, XSIZ, YSIZ, 8*XSIZ*3, 0, 7, i); // (x, y)の指定が左上ではなくて右上なところに注意. junkApi_sleep(0, 1000); } } junkApi_sleep(0, -1); beginFunc(L_drawDec); do { SInt32 mode:R08, xsiz:R02, ysiz:R09, x1:R01, y0:R0A, col:R0B, i:R00, flag:R03, ii:R04; mode = R30; xsiz = R31; ysiz = R32; x1 = R33; y0 = R34; col = R35; i = R36; flag = 0; if (i < 0) { flag = -1; i *= -1; } do { ii = (i % 10) + '0'; i /= 10; x1 -= xsiz * 8; junkApi_drawChar(mode, xsiz, ysiz, x1, y0, col, ii); if (i > 0) continue; } if (flag != 0) { x1 -= xsiz * 8; junkApi_drawChar(mode, xsiz, ysiz, x1, y0, col, '-'); } } endFunc(); -特に説明しなくてもわかりますよね、きっと。 ** (7) for構文 #1 -[[page0038]]の(1)でforの説明をしましたが、その続きです。 -まず、 for (;;) { ... } という構文があります。これは無限ループで、breakかgotoでなければ抜け出せません。 -次に for (;0;) { ... } という構文があります。これは1回しか実行しないループ(?)で、主に関数などの変数スコープを限定するために使われます。・・・ for (;0;) と書くのはみっともないしよく忘れるので、 do で代用できるようになっています。 - do は1回しか実行しない、スコープ制限くらいにしか役に立たないと書きましたが、少々裏技も可能で、まずbreakすることができます。breakすればdoの中かっこ閉じのところまで処理を飛ばすことができます。 --if - else if - else if ...などができないOSECPUにとっては、これは使い道があります。 do { if (i < 0) { ...; break; } if (i < 10) { ...; break; } if (i < 20) { ...; break; } ... } // 上記は以下の代用になっています. if (i < 0) { ... } else if (i < 10) { ... } else if (i < 20) { ... } else { ... } -do の裏技その2。continueができるのです。上記の(6)でもやっています。continueすれば、もちろん do のところに戻るのでループができます。(6)の使い方はまさにdo-whileですね。 ** つづく -[[page0048]]につづく * こめんと欄 #comment
タイムスタンプを変更しない
* OSECPU-ASKA入門 #0005 -(by [[K]], 2013.06.24) ** (0) はじめに -以下の記事はver.0.49のWindows版を前提にしています。他の版を使っている場合は適宜読み替えてください。 --たとえば osecpu049d.zip とかのことです ~ -もくじ --[[page0036]]: #0000 --[[page0037]]: #0001 --[[page0038]]: #0002 --[[page0039]]: #0003 --[[page0044]]: #0004 --[[page0045]]: #0005 ** (1) drawString -junkApi_drawString(mode, xsiz, ysiz, x0, y0, color, string); : --グラフィクス描画用のウィンドウの中に文字を書きます。modeは毎度の数値で、drawPointなどと同じです。 --xsizやysizは1以上の整数を指定します。両方が1のとき、1文字は8x16ピクセルです。 --x0とy0は1文字目の左上の座標を指定します。 --(例) #include "osecpu_ask.h" junkApi_drawString(4, 1, 1, 0, 0, 7, 'abcd'); junkApi_drawString(4, 8, 8, 0, 20, 7, 'abcd'); --現状で表示できるのはASCIIキャラクタだけです。'\n'や'\t'などの制御文字は指定できません。 --拡大するとぎざぎざが非常に目立ちますが、それは仕様です。美しいフォントなどを提供する予定は今のところありません。 ---どうしてもきれいに描きたい場合は、アプリが自前で描画すればよい、というスタンスです。 ** (2) リリースモード -OSECPUアプリは小ささが自慢と言うか取り柄なのですが、ここまではそのための話をほとんどしてきませんでした。 -最初の[[page0036]]の(1)で紹介したアプリのビルド方法は、実はデバッグモードで、全然小さくならない、つまらないものでした。・・・まあでもそれが一番簡単なビルド方法なのでありますが。 -しかしもうデバッグも終了して、リリースするだけとなれば、過剰なデバッグ情報はただの無駄です。必要最低限にさせましょう。 --註:すべてのデバッグ情報を簡単に取り除く手段は用意していません。ある程度の規模になれば、絶対にバグがないプログラムなんて、そうそう作れないと思うのです。だから保険のためにも、最低限度のデバッグ情報は残しています。 ~ -まず、デバッグ情報の過剰な生成をやめさせる必要があります。 prompt>amake app0038 -DNODBGINFO0 --これはちょっと分かりにくいですが、NO DBG INFO 0 です。最後の文字は「オー」ではなくてゼロです。デバッグインフォ0というものがあって、それを「ノー」するわけです。そういう識別子をdefineするスイッチです。 --もっとわかりやすいスイッチにすればよかったと、数週間前から反省しているので、許してください。 -これでたいていのプログラムは結構小さくなります。これで200バイト未満になるようであれば、たぶん次のステップは必要ありません。 ~ -さらに小さくしたい場合は、OSECPU標準のパッカーを使います。 prompt>osectols tool:appack flags:8 in:app0038.ose out:app0038.tk5 --ただしこれをやる場合は、ext_tolsにあるbim2binとt5lzmaをosectolsと同じフォルダにコピーしておく必要があります。 --[2013.07.30追記] OSECPU ver.0.64以降では、flags:8にしてください。0.63まではflags:2でした。 -そうすると例えばこういう表示が出ます。 org:34 tk5:48 -これはパッキングしたほうが大きくなってしまったことを意味してます。もともとのオリジナルは34バイトで、パック版は48バイトですよ、と。この場合はパックなんてしないほうがいいので、このtk5ファイルは捨てて、app0038.oseをそのままリリースします。 -しかしアプリによっては、tk5のほうが小さくなることがあります。そんなときは、oseのほうを捨てて、.tk5を.oseにリネームしちゃってください。 ~ -これで完成です。めでたしめでたし! ** (3) 複数の関数を作る例 -細かいことは書きませんが、複数の関数を宣言して使いたい場合の冒頭部分はきっとこんな感じになります。 #define L_func1 LOCAL(0) #define L_func2 LOCAL(1) #define L_func3 LOCAL(2) LOCALLABELS(3); #define func1() CALL(L_func1) #define func2() CALL(L_func2) #define func3() CALL(L_func3) -参考にしてください。 ** (4) sleepのmodeについて -[[page0039]]の(1)でsleepを紹介しましたが、その際にmodeの使い方を説明しませんでした。今回はそれを説明します。 -modeはビットごとに意味を持っています。したがって以下を加算して組み合わせることができます。 --1: グラフィックス画面の自動全画面flushを抑制する。 ---これを指定しなければ、sleepが呼ばれるたびに全画面flushが行われるので、アプリがflush処理を意識する必要はほとんどなくなります。その代わり負荷は増えます。 ---とはいえ、現状ではまだ説明してないのでflushって何?状態ですよね。そうです、分からなくても構わないので、この1を指定しないようにしてください。それで万事解決です。 ---しいて言えば、前回のsleepから一切画面を書き換えていないときには、この指定をしてもいいです。そうすればCPU負荷が下がってCPUにやさしいアプリになれます。まあでもこれを気にして処理が複雑になるくらいなら、何も考えずに0をしてしておく方がずっといいです。 --2: sleepし終わった時にinkeyバッファをチェックし、もし空であればもう一度指定された時間のsleepを実行する。 ---つまりこれを指定すれば、inkeyバッファが空の状態で戻ってくることはありません。 ** (5) inkeyのmodeについて -[[page0039]]の(5)でinkeyを紹介しましたが、その際にmodeの使い方を説明しませんでした。今回はそれを説明します。 -modeはビットごとに意味を持っています。したがって以下を加算して組み合わせることができます。 ---とはいえ、現状では1しかないので組み合わせようがないですが。 --1: 非peekモードにする。 ---これを0にしてpeekモード指定すると、inkeyバッファの先頭のものを取ってはきますが、バッファから削除しません。たぶんあまり使わない機能だとは思います。(2013.07.30 誤記修正 thanks: ?さん) ** (6) グラフィックスで[[page0044]]の(4)をやってみよう! #include "osecpu_ask.h" #define L_drawDec LOCAL(0) LOCALLABELS(1); #define drawDec(mode, xsiz, ysiz, x1, y0, col, i) R30=mode; R31=xsiz; R32=ysiz; R33=x1; R34=y0; R35=col; R36=i; CALL(L_drawDec) #define XSIZ 16 #define YSIZ 16 // main do { SInt32 i:R00; for (i = 111; i != -100; i--) { junkApi_fillRect(0, 8*XSIZ*3, 16*YSIZ, 0, 0, 0x000000); drawDec(4, XSIZ, YSIZ, 8*XSIZ*3, 0, 7, i); // (x, y)の指定が左上ではなくて右上なところに注意. junkApi_sleep(0, 1000); } } junkApi_sleep(0, -1); beginFunc(L_drawDec); do { SInt32 mode:R08, xsiz:R02, ysiz:R09, x1:R01, y0:R0A, col:R0B, i:R00, flag:R03, ii:R04; mode = R30; xsiz = R31; ysiz = R32; x1 = R33; y0 = R34; col = R35; i = R36; flag = 0; if (i < 0) { flag = -1; i *= -1; } do { ii = (i % 10) + '0'; i /= 10; x1 -= xsiz * 8; junkApi_drawChar(mode, xsiz, ysiz, x1, y0, col, ii); if (i > 0) continue; } if (flag != 0) { x1 -= xsiz * 8; junkApi_drawChar(mode, xsiz, ysiz, x1, y0, col, '-'); } } endFunc(); -特に説明しなくてもわかりますよね、きっと。 ** (7) for構文 #1 -[[page0038]]の(1)でforの説明をしましたが、その続きです。 -まず、 for (;;) { ... } という構文があります。これは無限ループで、breakかgotoでなければ抜け出せません。 -次に for (;0;) { ... } という構文があります。これは1回しか実行しないループ(?)で、主に関数などの変数スコープを限定するために使われます。・・・ for (;0;) と書くのはみっともないしよく忘れるので、 do で代用できるようになっています。 - do は1回しか実行しない、スコープ制限くらいにしか役に立たないと書きましたが、少々裏技も可能で、まずbreakすることができます。breakすればdoの中かっこ閉じのところまで処理を飛ばすことができます。 --if - else if - else if ...などができないOSECPUにとっては、これは使い道があります。 do { if (i < 0) { ...; break; } if (i < 10) { ...; break; } if (i < 20) { ...; break; } ... } // 上記は以下の代用になっています. if (i < 0) { ... } else if (i < 10) { ... } else if (i < 20) { ... } else { ... } -do の裏技その2。continueができるのです。上記の(6)でもやっています。continueすれば、もちろん do のところに戻るのでループができます。(6)の使い方はまさにdo-whileですね。 ** つづく -[[page0048]]につづく * こめんと欄 #comment
テキスト整形のルールを表示する