page0037
の編集
http://osecpu.osask.jp/wiki/?page0037
[
トップ
] [
編集
|
差分
|
バックアップ
|
添付
|
リロード
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
-- 雛形とするページ --
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入門 #0001 -(by [[K]], 2013.06.06) ** (0) はじめに -以下の記事はver.0.46のWindows版を前提にしています。他の版を使っている場合は適宜読み替えてください。 --たとえば osecpu046a.zip とかのことです ~ -もくじ --[[page0036]]: #0000 --[[page0037]]: #0001 ** (1) drawPointとfillOvalとdrawLine(ついでにmodeについて) -junkApi_drawPoint(mode, x, y, color); : --画面に点を打ちます。xとyは座標です。colorは色です。modeの意味はfillRectと同じです。画面からはみ出しちゃいけないというルールも同じです。 --点の大きさを指定するパラメータはありません。大きな点を描きたいときは、fillOvalやfillRectで代用してください。 -junkApi_fillOval(mode, xsiz, ysiz, x0, y0, color); : --画面に円もしくは楕円(だえん)を描きます。このパラメータ、実はfillRectと全く同じです。ではどういう円が描かれるかですが、このパラメータで指定される長方形を想像して、そこから角を削って丸くしてください。そのような円もしくは楕円が描画されます。 --ということで、 x0, y0 は円の中心ではなく、円の端(はし)でもなく、仮想的な長方形の左上の座標です。分かりにくくてすみません! -junkApi_drawLine(mode, x0, y0, x1, y1, color); : --画面に線を引きます。 x0, y0 が始点で、 x1, y1 が終点です。水平な線、垂直な線ももちろんかけますが、斜めもOKです。 --線の太さなどを指定するパラメータはありません。太い線が引きたいときは、ずらしながら何本も引きましょう。 -modeについて: --グラフィックス系命令の最初にいつも付いてくるmodeパラメータですが、0と4以外にどんな意味があるかを紹介します。 --0: PSET描画モード: もとの画素の色が何色であるかに関係なく、上書きします。 --1: OR描画モード: たとえば赤の上に緑で描画すると、黄色になります(0xff0000と0x00ff00のOR演算の結果が0xffff00になるから)。 --2: XOR描画モード --3: AND描画モード --4: 色指定方法を8色モードに --16: 画面外への描画をエラーにしないで無視させる(ver.0.46時点では未実装) ** (2) とりあえずここまでで -とりあえずここまでで、日本の国旗を描いたこのプログラムについてはほぼ分かったと思います。 junkApi_fillRect(4, 640, 480, 0, 0, 7); junkApi_fillOval(4, 300, 300, 320-150, 240-150, 1); -ちなみに引き算しているのは、円の中心を(320,240)にしたくて、そこから円の半径を引いて左上の座標を計算しているのです。引き算などしないで、170や90と直接書いても全く同じ結果になります。 -ここまでの説明だけで、この絵の色を変えることも中心の丸の大きさを変えることも、楕円(だえん)にすることも、きっとできるでしょう。 -さらには円を何個も重ねてダーツの的(まと)みたいな絵も描けるでしょうし、楕円の中に楕円を書いて、眼みたいなものだって描けるでしょう。アイデア次第で何でもできます。 -点も描けますし線も引けます。 -分からないのは変数の使い方だけです。 ~ -どのプログラムに共通している最初の行の #include "osecpu_ask.h" は決まり文句みたいなものだと思ってください。 ** (3) 整数型変数 -C言語やそのほかの言語では整数型にたくさんの種類がありますが、OSECPUは単純化されていて一種類しかありません。int32sというものだけです。これで21億くらいまでの整数を表現できます。マイナスの数もOKです。 -OSECPUでは原則として変数をメモリに割り当てることはしません(ここが他の言語とは違う!)。必ずレジスタに割り当てます。レジスタというのはCPUが持っている演算用の記憶域のことで、DRAMとかにあるメモリとは違うものです。このような仕様なので、変数のアドレスという概念はありません(メモリ上にないものはポインタで指し示すことができない)。 -以下のような構文で変数を宣言することができます。 int32s i:R00; -これはiという変数を宣言しており、R00というレジスタに割り当てられます。要するに、iはR00の別名でしかないのです。 -変数名は大文字小文字を区別しますので、iとIを使い分けることができます。 -レジスタ名はR00~R3Fまでが有効ですが(後ろの2桁は16進数になっている)、とりあえずR00~R1Fまでを自由に使うのがいいと思います。・・・これは言い換えれば32個しかないということでもあります。変数は最大で32個しか作れないのです!これはつらい!! --でもx86のアセンブラの32bitモードとかだと8個しかなかったんです、だからOSECPUはこれでも相当に「リッチ」なのです。 --はい、そこの人、少ないとか嘆いていてはいけませんよ。[[page0035]]をよく読んでください。あなたのやりたいことのためには32個では不十分かもしれませんが、まずは32個で何か面白いことはできないかなと考えるのです。 --もちろんもっとたくさん使う方法はちゃんとありますが、いきなりそれを説明すると理解できないこと間違いなしので、まずは32個のレジスタを使いこなせるようになってからです。 -レジスタ名は必ず大文字でお願いします。r00では未定義の変数名だと思われてエラーになります。R0aもだめです。R0Aでお願いします。 -変数宣言ですが、コンマで区切って一文で複数を宣言することもできます。 int32s i:R00, j:R01, xyz:R02; -なお、同じレジスタを割り当ててしまうというひどい(?)こともできます。 int32s i:R00, j:R00, k:R00; -この場合、iに代入したらjやkの値も変わってしまうことになります。というかR00に3つの別名を与えているだけなんですけどね。 ~ -変数には整数を代入することができます。簡単な計算もできます。 i = 10; i = j + k; i *= -1; -基本的にC言語でかかれるような演算式はたいてい受け付けます。?演算子みたいな凝ったものはありません。割り算は、整数の割り算しかないので、答えは切り捨てになります。ゼロで割ってはいけません。 -関数の値を代入する、ということは現状ではできません。 i = junkApi_openWin(...); // こういうことはできない. --(将来的にはできるようにしたいと思っていて構文も設計したのですが、2013年内の実装予定はありません) -なお変数を使わずにいきなりレジスタ名を書いてしまうこともできますし、混在させることもできます。 R04++; R03 = i + 1; -まあなんというか、いろいろやっていると、あれ?これがうまく行かないんだけど・・・という例が出てくると思います。そういう時は迷わずこのwikiの[[impressions]]あたりで聞いてみてください。きっと未サポートか、バグです。バグだった場合は、貴重なバグ報告ですので、直したいと思います。 --なお報告の際は、長いプログラムを見せられても困ってしまいますので、再現に必要な最低限度のプログラムを用意してもらえると助かります。再現コードを作る過程は、報告者の勘違いだった、というケースを排除するためにも非常に有用です。 ~ -そうやって変数に狙った値が入れられるようになったら、それをAPIの呼び出しの際に利用することができます。 junkApi_drawPoint(0, x, y, c); -ええとここで注意なのですが、APIの呼び出しの際に変数を使うときは、できれば数式にならないようにしてほしいです。 junkApi_drawPoint(0, x - 1, y, c); // こういうのはつらい. -なんかもしかしたら数式入れても平気だったりするかもしれませんが、しかしそこはあまり得意じゃないことにかわりはないので、数式を入れる代わりに結果を一度別の変数に入れて、その変数を指定してもらえると助かります。 ** つづく -[[page0038]]につづく * こめんと欄 #comment
タイムスタンプを変更しない
* OSECPU-ASKA入門 #0001 -(by [[K]], 2013.06.06) ** (0) はじめに -以下の記事はver.0.46のWindows版を前提にしています。他の版を使っている場合は適宜読み替えてください。 --たとえば osecpu046a.zip とかのことです ~ -もくじ --[[page0036]]: #0000 --[[page0037]]: #0001 ** (1) drawPointとfillOvalとdrawLine(ついでにmodeについて) -junkApi_drawPoint(mode, x, y, color); : --画面に点を打ちます。xとyは座標です。colorは色です。modeの意味はfillRectと同じです。画面からはみ出しちゃいけないというルールも同じです。 --点の大きさを指定するパラメータはありません。大きな点を描きたいときは、fillOvalやfillRectで代用してください。 -junkApi_fillOval(mode, xsiz, ysiz, x0, y0, color); : --画面に円もしくは楕円(だえん)を描きます。このパラメータ、実はfillRectと全く同じです。ではどういう円が描かれるかですが、このパラメータで指定される長方形を想像して、そこから角を削って丸くしてください。そのような円もしくは楕円が描画されます。 --ということで、 x0, y0 は円の中心ではなく、円の端(はし)でもなく、仮想的な長方形の左上の座標です。分かりにくくてすみません! -junkApi_drawLine(mode, x0, y0, x1, y1, color); : --画面に線を引きます。 x0, y0 が始点で、 x1, y1 が終点です。水平な線、垂直な線ももちろんかけますが、斜めもOKです。 --線の太さなどを指定するパラメータはありません。太い線が引きたいときは、ずらしながら何本も引きましょう。 -modeについて: --グラフィックス系命令の最初にいつも付いてくるmodeパラメータですが、0と4以外にどんな意味があるかを紹介します。 --0: PSET描画モード: もとの画素の色が何色であるかに関係なく、上書きします。 --1: OR描画モード: たとえば赤の上に緑で描画すると、黄色になります(0xff0000と0x00ff00のOR演算の結果が0xffff00になるから)。 --2: XOR描画モード --3: AND描画モード --4: 色指定方法を8色モードに --16: 画面外への描画をエラーにしないで無視させる(ver.0.46時点では未実装) ** (2) とりあえずここまでで -とりあえずここまでで、日本の国旗を描いたこのプログラムについてはほぼ分かったと思います。 junkApi_fillRect(4, 640, 480, 0, 0, 7); junkApi_fillOval(4, 300, 300, 320-150, 240-150, 1); -ちなみに引き算しているのは、円の中心を(320,240)にしたくて、そこから円の半径を引いて左上の座標を計算しているのです。引き算などしないで、170や90と直接書いても全く同じ結果になります。 -ここまでの説明だけで、この絵の色を変えることも中心の丸の大きさを変えることも、楕円(だえん)にすることも、きっとできるでしょう。 -さらには円を何個も重ねてダーツの的(まと)みたいな絵も描けるでしょうし、楕円の中に楕円を書いて、眼みたいなものだって描けるでしょう。アイデア次第で何でもできます。 -点も描けますし線も引けます。 -分からないのは変数の使い方だけです。 ~ -どのプログラムに共通している最初の行の #include "osecpu_ask.h" は決まり文句みたいなものだと思ってください。 ** (3) 整数型変数 -C言語やそのほかの言語では整数型にたくさんの種類がありますが、OSECPUは単純化されていて一種類しかありません。int32sというものだけです。これで21億くらいまでの整数を表現できます。マイナスの数もOKです。 -OSECPUでは原則として変数をメモリに割り当てることはしません(ここが他の言語とは違う!)。必ずレジスタに割り当てます。レジスタというのはCPUが持っている演算用の記憶域のことで、DRAMとかにあるメモリとは違うものです。このような仕様なので、変数のアドレスという概念はありません(メモリ上にないものはポインタで指し示すことができない)。 -以下のような構文で変数を宣言することができます。 int32s i:R00; -これはiという変数を宣言しており、R00というレジスタに割り当てられます。要するに、iはR00の別名でしかないのです。 -変数名は大文字小文字を区別しますので、iとIを使い分けることができます。 -レジスタ名はR00~R3Fまでが有効ですが(後ろの2桁は16進数になっている)、とりあえずR00~R1Fまでを自由に使うのがいいと思います。・・・これは言い換えれば32個しかないということでもあります。変数は最大で32個しか作れないのです!これはつらい!! --でもx86のアセンブラの32bitモードとかだと8個しかなかったんです、だからOSECPUはこれでも相当に「リッチ」なのです。 --はい、そこの人、少ないとか嘆いていてはいけませんよ。[[page0035]]をよく読んでください。あなたのやりたいことのためには32個では不十分かもしれませんが、まずは32個で何か面白いことはできないかなと考えるのです。 --もちろんもっとたくさん使う方法はちゃんとありますが、いきなりそれを説明すると理解できないこと間違いなしので、まずは32個のレジスタを使いこなせるようになってからです。 -レジスタ名は必ず大文字でお願いします。r00では未定義の変数名だと思われてエラーになります。R0aもだめです。R0Aでお願いします。 -変数宣言ですが、コンマで区切って一文で複数を宣言することもできます。 int32s i:R00, j:R01, xyz:R02; -なお、同じレジスタを割り当ててしまうというひどい(?)こともできます。 int32s i:R00, j:R00, k:R00; -この場合、iに代入したらjやkの値も変わってしまうことになります。というかR00に3つの別名を与えているだけなんですけどね。 ~ -変数には整数を代入することができます。簡単な計算もできます。 i = 10; i = j + k; i *= -1; -基本的にC言語でかかれるような演算式はたいてい受け付けます。?演算子みたいな凝ったものはありません。割り算は、整数の割り算しかないので、答えは切り捨てになります。ゼロで割ってはいけません。 -関数の値を代入する、ということは現状ではできません。 i = junkApi_openWin(...); // こういうことはできない. --(将来的にはできるようにしたいと思っていて構文も設計したのですが、2013年内の実装予定はありません) -なお変数を使わずにいきなりレジスタ名を書いてしまうこともできますし、混在させることもできます。 R04++; R03 = i + 1; -まあなんというか、いろいろやっていると、あれ?これがうまく行かないんだけど・・・という例が出てくると思います。そういう時は迷わずこのwikiの[[impressions]]あたりで聞いてみてください。きっと未サポートか、バグです。バグだった場合は、貴重なバグ報告ですので、直したいと思います。 --なお報告の際は、長いプログラムを見せられても困ってしまいますので、再現に必要な最低限度のプログラムを用意してもらえると助かります。再現コードを作る過程は、報告者の勘違いだった、というケースを排除するためにも非常に有用です。 ~ -そうやって変数に狙った値が入れられるようになったら、それをAPIの呼び出しの際に利用することができます。 junkApi_drawPoint(0, x, y, c); -ええとここで注意なのですが、APIの呼び出しの際に変数を使うときは、できれば数式にならないようにしてほしいです。 junkApi_drawPoint(0, x - 1, y, c); // こういうのはつらい. -なんかもしかしたら数式入れても平気だったりするかもしれませんが、しかしそこはあまり得意じゃないことにかわりはないので、数式を入れる代わりに結果を一度別の変数に入れて、その変数を指定してもらえると助かります。 ** つづく -[[page0038]]につづく * こめんと欄 #comment
テキスト整形のルールを表示する