• R/O
  • HTTP
  • SSH
  • HTTPS

提交

標籤
無標籤

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

BASIC compiler/interpreter for PIC32MX/MZ-80K


Commit MetaInfo

修訂bbe0f316f5abe78d24138d9a0e865d67dd4f20fc (tree)
時間2019-04-15 14:01:51
作者Katsumi <kmorimatsu@sour...>
CommiterKatsumi

Log Message

Update help.txt. Fast Field for Zoea/Protozoea.

Change Summary

差異

--- a/mips/megalopa/help.txt
+++ b/mips/megalopa/help.txt
@@ -789,6 +789,13 @@ OPTION NOLINENUM
789789 グラムサイズを小さくして実行速度を増加する効果が見込める。ただし、エラーが発
790790 生した場合に、どの行でのエラーかは分からなくなる。
791791
792+OPTION FASTFIELD
793+ クラスを2つ以上使っている時、パブリックフィールド名の重複がない場合に、
794+ フィールドへのアクセスを高速化する。ただし、存在しないオブジェクトのフィール
795+ ドにアクセスしてもエラーにならない場合があるため、予めBASICコードにエラーが
796+ ない事を確認してから用いる事が望ましい。なお、クラスを一つだけしか使っていな
797+ い場合は、指定しなくてもこのオプションは有効になっている。
798+
792799 <クラス・オブジェクト関連機能>
793800 クラスとオブジェクトの利用方法について、詳しくはclass.txtを参照して下さい。
794801 以下は、関連する命令と関数です。
--- a/mips/protozoea/class.c
+++ b/mips/protozoea/class.c
@@ -33,6 +33,14 @@ static int* g_class_structure;
3333 record[1]: field/method name as integer
3434 record[2]: pointer to method
3535 */
36+/*
37+ CMPDATA_FASTFIELD structure
38+ type: CMPDATA_FASTFIELD
39+ len: 2
40+ data16: number of position of public field in object
41+ 0 for multiple usage of the same public field name
42+ record[1]: field name as integer
43+*/
3644
3745 /*
3846 CMPDATA_STATIC structure
@@ -62,6 +70,24 @@ static int* g_class_structure;
6270 */
6371
6472 /*
73+ About fast field access
74+ When a public field name used only once with a class,
75+ the address of this field of an object is defined quickly when compiling.
76+ This logic is always true when there is only a class.
77+
78+ However, if there are more than two classes and the field name is used
79+ by only a class, this logic is true only when the BASIC code does not have
80+ error. If there is an error in BASIC code, this type of error cannot be
81+ found by compiler and when executing.
82+
83+ Therefore, only use this logic when the number of class is one, and/or
84+ OPTION FASTFIELD is defined.
85+
86+ This logic is useless for public method, because library must be always called
87+ before calling public method.
88+*/
89+
90+/*
6591 Local prototyping
6692 */
6793 char* obj_method(int method);
@@ -259,10 +285,36 @@ char* construct_class_structure(int class){
259285
260286 void delete_cmpdata_for_class(int class){
261287 int* record;
288+ int i;
289+ short pos;
262290 // Delete field/method data
263291 cmpdata_reset();
292+ pos=0; // # of position of public field
264293 while(record=cmpdata_find(CMPDATA_FIELD)){
265- cmpdata_delete(record);
294+ if ((record[0]&0xffff)==CMPTYPE_PUBLIC_FIELD) {
295+ pos++;
296+ i=record[1]; // Field name
297+ cmpdata_delete(record);
298+ // Construct or disable CMPDATA_FASTFIELD
299+ // Note that the sequence of public fields here is the same
300+ // as that in the function, construct_class_struction().
301+ cmpdata_reset();
302+ while(record=cmpdata_find(CMPDATA_FASTFIELD)){
303+ if (record[1]==i) break;
304+ }
305+ if (record) {
306+ // Multiple definition of field name
307+ // Clear data16 if the position is different
308+ if (pos!=(record[0]&0xffff)) record[0]&=0xffff0000;
309+ } else {
310+ // Previous CMPDATA_FASTFIELD not found
311+ // Create now one for fast field implementation
312+ g_temp=i;
313+ cmpdata_insert(CMPDATA_FASTFIELD,pos,&g_temp,1);
314+ }
315+ } else {
316+ cmpdata_delete(record);
317+ }
266318 cmpdata_reset();
267319 }
268320 // Delete longvar data
@@ -488,6 +540,8 @@ char* _obj_field(char mode){
488540 // $v0 contains the address of object.
489541 int i;
490542 char* err;
543+ int* record;
544+ char fastfield;
491545 do {
492546 i=check_var_name();
493547 if (i<65536) return ERR_SYNTAX;
@@ -506,11 +560,38 @@ char* _obj_field(char mode){
506560 // This is a string field. Raise 31st bit.
507561 i|=0x80000000;
508562 }
509- check_obj_space(2);
510- g_object[g_objpos++]=0x3C050000|((i>>16)&0x0000FFFF); // lui a1,xxxx
511- g_object[g_objpos++]=0x34A50000|(i&0x0000FFFF); // ori a1,a1,xxxx
512- // First and second arguments are address of object and field name, respectively.
513- call_quicklib_code(lib_obj_field,ASM_ADDU_A0_V0_ZERO);
563+ // Check if Fast Field Access can be used.
564+ cmpdata_reset();
565+ while(record=cmpdata_find(CMPDATA_FASTFIELD)){
566+ if (record[1]==(i&0x7FFFFFFF)) break;
567+ }
568+ if (!record) {
569+ // Record wasn't found
570+ fastfield=0;
571+ } else if (1!=g_num_classes && !g_option_fastfield) {
572+ // No fast field option
573+ fastfield=0;
574+ } else if (!(record[0]&0xffff)) {
575+ // The same field name used twice at the different positions
576+ fastfield=0;
577+ } else {
578+ // All requirements passed
579+ fastfield=1;
580+ }
581+ // Generate code here
582+ if (fastfield) {
583+ // Get field value in $v0 and address in $v1
584+ i=(record[0]&0xffff)*4;
585+ check_obj_space(2);
586+ g_object[g_objpos++]=0x24430004|i; // addiu v1,v0,xxxx
587+ g_object[g_objpos++]=0x8C620000; // lw v0,0(v1)
588+ } else {
589+ check_obj_space(2);
590+ g_object[g_objpos++]=0x3C050000|((i>>16)&0x0000FFFF); // lui a1,xxxx
591+ g_object[g_objpos++]=0x34A50000|(i&0x0000FFFF); // ori a1,a1,xxxx
592+ // First and second arguments are address of object and field name, respectively.
593+ call_quicklib_code(lib_obj_field,ASM_ADDU_A0_V0_ZERO);
594+ }
514595 // Check if "." follows
515596 if (g_source[g_srcpos]=='.') {
516597 // "." found. $v0 is adress of an object. See the field.
--- a/mips/protozoea/class.txt
+++ b/mips/protozoea/class.txt
@@ -56,9 +56,6 @@ METHOD命令で宣言されたメソッドは、すべてパブリックです
5656 メソッドが指定された場合、オブジェクト作成時に、このメソッドが呼ばれます。INIT
5757 メソッドに引数を与える事も可能です(引数は必須ではありません)。
5858
59-クラス中でオブジェクトへのポインターが必要な場合は、ARGS(-2)で取り出す事が出来
60-ます。
61-
6259 記述例(CLASS1.BASの名前で保存):
6360  FIELD PUBLIC TEST1,TEST2
6461  FIELD PRIVATE TEST3
--- a/mips/protozoea/compiler.c
+++ b/mips/protozoea/compiler.c
@@ -163,7 +163,7 @@ char* compile_line(void){
163163 printstr(resolve_label(g_line));
164164 return ERR_MULTIPLE_LABEL;
165165 }
166- if (!g_nolinenum) {
166+ if (!g_option_nolinenum) {
167167 check_obj_space(1);
168168 g_object[g_objpos++]=0x34160000|g_line; //ori s6,zero,xxxx;
169169 }
--- a/mips/protozoea/compiler.h
+++ b/mips/protozoea/compiler.h
@@ -213,7 +213,7 @@ extern int g_var_mem[ALLOC_BLOCK_NUM];
213213 extern unsigned short g_var_pointer[ALLOC_BLOCK_NUM];
214214 extern unsigned short g_var_size[ALLOC_BLOCK_NUM];
215215 extern char g_temp_area_used;
216-extern char g_nolinenum;
216+extern char g_option_nolinenum;
217217 extern int* g_heap_mem;
218218 extern int g_max_mem;
219219 extern char g_disable_break;
@@ -225,6 +225,8 @@ extern int g_long_name_var_num;
225225 extern char g_music_active;
226226 extern int g_class;
227227 extern int g_compiling_class;
228+extern unsigned char g_num_classes;
229+extern char g_option_fastfield;
228230 extern int g_temp;
229231
230232 /* Prototypes */
@@ -412,13 +414,14 @@ char* interrupt_statement();
412414 #define ERR_NO_INIT (char*)(g_err_str[28])
413415
414416 /* compile data type numbers */
415-#define CMPDATA_RESERVED 0
416-#define CMPDATA_USEVAR 1
417-#define CMPDATA_CLASS 2
418-#define CMPDATA_FIELD 3
419-#define CMPDATA_STATIC 4
420-#define CMPDATA_UNSOLVED 5
421-#define CMPDATA_TEMP 6
417+#define CMPDATA_RESERVED 0
418+#define CMPDATA_USEVAR 1
419+#define CMPDATA_CLASS 2
420+#define CMPDATA_FIELD 3
421+#define CMPDATA_STATIC 4
422+#define CMPDATA_UNSOLVED 5
423+#define CMPDATA_TEMP 6
424+#define CMPDATA_FASTFIELD 7
422425 // Sub types follow
423426 #define CMPTYPE_PUBLIC_FIELD 0
424427 #define CMPTYPE_PRIVATE_FIELD 1
--- a/mips/protozoea/debug.c
+++ b/mips/protozoea/debug.c
@@ -228,32 +228,28 @@ static const char initext[]=
228228 "#PRINT\n";
229229
230230 static const char bastext[]=
231+"USECLASS CLASS1,CLASS2\n"
232+"OPTION FASTFIELD\n"
231233 "CLS\n"
232-"LABEL TEST_:i=0/0\n"
233-"\n"
234-"\n"
234+"o=new(CLASS1)\n"
235+"o.T1=123\n"
236+"print o.T2()\n"
235237 "\n"
236238 "\n"
237239 "\n"
238240 "\n";
239241
240242 static const char class1text[]=
241-"STATIC T1\n"
242-"useclass CLASS2\n"
243-"method T3\n"
244-" return CLASS2::T2\n"
245-"method T5\n"
246-" return T1\n"
243+"FIELD T1\n"
244+"method T2\n"
245+" return T1+100\n"
247246 "\n"
248247 "\n";
249248
250249 static const char class2text[]=
251-"STATIC T2\n"
252-"useclass CLASS1\n"
253-"method T4\n"
254-" return CLASS1::T1\n"
250+"FIELD T3\n"
255251 "method T6\n"
256-" return T2\n"
252+" return T3+100\n"
257253 "\n"
258254 "\n"
259255 "\n"
--- a/mips/protozoea/file.c
+++ b/mips/protozoea/file.c
@@ -124,7 +124,8 @@ int compile_and_link_file(char* buff,char* appname){
124124 }
125125
126126 // Option initialization(s)
127- g_nolinenum=0;
127+ g_option_nolinenum=0;
128+ g_option_fastfield=0;
128129
129130 // Compile the file
130131 err=compile_file();
@@ -181,6 +182,7 @@ int compile_and_link_class(char* buff,int class){
181182 int data[2];
182183 unsigned short cwd_id;
183184 int* record;
185+ g_num_classes++;
184186 while(1){
185187 // Begin compiling class
186188 err=begin_compiling_class(class);
@@ -250,7 +252,10 @@ int compile_and_link_class(char* buff,int class){
250252
251253 int compile_and_link_main_file(char* buff,char* appname){
252254 int i;
255+ // Reset parameters
253256 g_compiling_class=0;
257+ g_num_classes=0;
258+ // Compile the file
254259 i=compile_and_link_file(buff,appname);
255260 if (i) return i;
256261 return 0;
--- a/mips/protozoea/globalvars.c
+++ b/mips/protozoea/globalvars.c
@@ -56,7 +56,7 @@ unsigned short g_var_size[ALLOC_BLOCK_NUM];
5656 char g_temp_area_used;
5757
5858 // Flag to use option nolinenum
59-char g_nolinenum;
59+char g_option_nolinenum;
6060
6161 // Heap area
6262 int* g_heap_mem;
@@ -88,8 +88,12 @@ char g_music_active;
8888
8989 // Class name being compiled
9090 int g_class;
91-// Flag to compile class file
91+// Flag (and class name) to compile class file
9292 int g_compiling_class;
93+// Number of classes used
94+unsigned char g_num_classes;
95+// OPTION FASTFIELD
96+char g_option_fastfield;
9397
9498 // General purpose integer used for asigning value with pointer
9599 int g_temp;
--- /dev/null
+++ b/mips/protozoea/help.txt
@@ -0,0 +1,847 @@
1+<BASIC言語の書式>
2+BASICプログラムの記述は、行番号式、ラベル式、その混合、いずれの方法でも構
3+いません。以下、仕様について述べます。
4+
5+<利用可能な変数型>
6+利用できる変数の型は、32ビット符号付整数(-2147483648 以上 +2147483647 以
7+下)と、文字列型の2種類です。文字列の末端部には0x00が付加されます。
8+
9+A-Zの26個の整数型変数が利用可能です。文字列として扱う場合はA$のように記
10+述します。ただし、A(整数型)とA$(文字列型)を同時に使用することは出来ま
11+せん。
12+
13+USEVARなどのステートメントで指定すると、6文字までの長い名前の変数を使用出
14+来ます。名前の最初の一文字は英字(A-Z)とアンダースコアー(_)で、二文字目から
15+はそれらに加えて数字(0-9)も使う事が出来ます。
16+
17+整数型の定数は、10進法で記述します。16進法を使う場合、「$1200」のよう
18+に、頭に「$」を付加するか、「0x1200」の様に表記して下さい。
19+
20+文字列型の定数は、「"」で囲って記述してください。「"」を使用する場合は、
21+「CHR$($22)」のように記述することが出来ます。
22+
23+<一般命令>
24+以下、x, y, z等は整数値を、x$, y$, z$は文字列を、x#, y#, z#は浮動
25+小数点型実数値を指します。xxx, yyy, zzz, www等は任意のステートメントを
26+指します。[ ]は省略可能である事を示します。
27+
28+命令同士を「:」で区切ることにより、一行で複数のコマンドを処理すること
29+が出来ます。
30+
31+BGCOLOR r,g,b
32+ 背景色指定。
33+BREAK
34+ FOR-NEXT, DO-LOOP, WHILE-WENDループから抜け出す。
35+CDATA x[,y[,z[...]]]
36+ データー列を8ビット整数値で指定する。
37+CLEAR
38+ すべての文字列型変数と整数型配列を破棄し、整数値を0とする。また、
39+ PCGの使用をやめ、表示キャラクターをリセットする。
40+CLS
41+ スクリーン消去。
42+COLOR x
43+ テキスト色指定。
44+CONTINUE
45+ FOR-NEXT, DO-LOOP, WHILE-WENDループ中で、以降のコードをスキップす
46+ る。
47+CURSOR x,y
48+ カーソル位置指定。
49+CDATA xxx[,yyy[,zzz[...]]]
50+ データー列を8ビット整数値で指定する。
51+DATA xxx[,yyy[,zzz[...]]]
52+ データー列を整数値もしくは文字列で指定する。
53+DIM xxx [, yyy [, zzz [, ... ]]]
54+ 整数型もしくは浮動小数点型の配列を割り当てる。
55+ xxx,yyy,zzzは、例えば「A(10)」のように記述する。この場合、A(0)から
56+ A(10)までの11個の整数型変数が確保される。浮動小数点型配列の場合は、
57+ 「A#(10)」の様に記述する。多次元配列も、宣言することが出来る。
58+DO WHILE x
59+LOOP
60+ x が0以外の場合、DO文からLOOP文までのステートメントを繰り返し実行する。
61+DO UNTIL x
62+LOOP
63+ x が0の場合、DO文からLOOP文までのステートメントを繰り返し実行する。
64+DO
65+LOOP WHILE x
66+ DO文からLOOP文までのステートメントを実行し、x が0以外の場合、繰り返す。
67+DO
68+LOOP UNTIL x
69+ DO文からLOOP文までのステートメントを実行し、x が0の場合、繰り返す。
70+DRAWCOUNT
71+ DRAWCOUNT値を指定する。DRAWCOUNT値に付いては、DRAWCOUNT()関数を
72+ 参照。
73+END
74+ BASICプログラムを停止する。
75+EXEC x[,y[,z[...]]]
76+ 機械語を実行する。ただし、x,y,zは32ビット整数値。
77+FOR x=yyy TO zzz [ STEP www ]
78+NEXT
79+ yyyで示された計算結果をxに代入し、xの値がzzzになるまで次のNEXT文
80+ までのステートメントを、繰り返し実行する。繰り返しのたび、xの値は
81+ wwwずつ増加する(省略された場合は1ずつ)。「NEXT」の次に何も記述
82+ しないことに注意。
83+GOSUB xxx [, yyy [, zzz [, ... ]]]
84+ 現在の実行位置を記憶し、xxx行目(もしくはラベル)に移動する。yyy, zzz
85+ 等は、サブルーチンに引き継がれる引数(ARGS()関数を参照)。
86+GOTO xxx
87+ xxx行目(もしくはラベル)に移動する。
88+IF xまたはx# THEN yyy [ ELSE zzz ]
89+ xが0以外のとき、yyyを、0のときzzzを実行。yyyおよびzzzは、複数のステート
90+ メントを「:」で挟んで記述可能。
91+IF xまたはx# THEN
92+xxx
93+[ELSEIF yまたはy# THEN
94+yyy]
95+[ELSE
96+zzz]
97+ENDIF
98+ xが0以外の時xxxを、それ以外で且つyが0以外の時(記述された場合)yyyを、
99+ それ以外の場合にzzzを実行。ELSEIFステートメントは、複数記述可。各行で、
100+ THENステートメントの次には何も記入しないことに注意。
101+LABEL xxx
102+ GOTO/GOSUBのジャンプ先を登録する。xxxは、英数字6文字以内の文字列。
103+[LET] x=yyy
104+ yで示された計算結果を、x(整数型変数)に代入する。「LET」は省略可。
105+[LET] x#=yyy
106+ yで示された計算結果を、x(浮動小数点型変数)に代入する。「LET」は省略可。
107+[LET] x$=yyy
108+ yyyで示された文字列(もしくは連結結果;連結演算子は「+」)を、x$に
109+ 代入する。「LET」は省略可。
110+MUSIC x$[,y]
111+ BGMを演奏する。詳細は、下記<MUSIC>の項を参照。Type Mでは、y=1の時右側だけ、
112+ y=2の時左側だけ、y=3もしくは省略した場合に両方から音が出る。
113+PLAYWAVE x$[,y]
114+ 音楽用のWAVEファイル(ファイル名をx$で指定)を演奏する。WAVEのフォーマットは、
115+ Type Mの場合はステレオもしくはモノラル(Type Zではモノラルのみ)、ビット長
116+ は8、サンプリング周波数が15700 Hzの物を指定する。16000 Hzでも再生出来るが、
117+ 音程と再生速度が少しずれる。yを指定した場合、指定の箇所から再生される(1秒
118+ 目から再生したい場合は、15700を指定)。x$に長さ0の文字列を指定すると、現在
119+ 再生中の音楽が停止する。
120+PALETTE n,r,g,b
121+ パレット指定。
122+PCG x,y,z
123+ ASCIIコードがxの文字の表示キャラクターを変更する。y,zは、キャラク
124+ ターデーター。詳細は、下記<PCG>の項を参照。
125+POKE x,y
126+ xで示される物理的アドレスに、yで示される値(1バイト値)を書き込む。
127+PEEK16 x,y
128+ xで示される物理アドレスに、yで示される値(16ビット値)を書き込む。xが奇数値の
129+ 場合、例外停止するので注意。
130+PEEK32 x,y
131+ xで示される物理アドレスに、yで示される値(32ビット値)を書き込む。xが4の倍数で
132+ 無い場合、例外停止するので注意。
133+PRINT [ xまたはx$またはx# [ ,または; [ yまたはy$またはy# [ ... ]]]]
134+ ディスプレイに、整数値または文字列を表示する。「;」を使用した場
135+ 合、次の表示が続けて行われる。「,」を使用した場合、10文字ずつ
136+ に区切って表示される。どちらも使用しない場合、次の表示は行を変え
137+ て行われる。
138+REM xxx
139+ 何も実行しない
140+RESTORE xxx
141+ DATA読み出し開始位置を指定。xxxは行番号もしくはラベル。
142+RETURN
143+ 最後に実行されたGOSUB文の次のステートメントに移動する。戻り値を指
144+ 定することがができる。この場合の戻り値はGOSUB()関数にて取得が可能。
145+SCROLL x,y
146+ 画面を横方向、もしくは縦方向(斜めも可)に動かす。動かす方向と大きさ
147+ は、x, yでそれぞれ、横方向の移動度、縦方向の移動度として指定する。
148+SOUND xxx[,y]
149+ 効果音を再生する。詳細は、下記<SOUND>の項を参照。xxxは行番号もしく
150+ はラベル。Type Mでは、y=1の時右側だけ、y=2の時左側だけ、y=3もしくは
151+ 省略した場合に両方から音が出る。
152+USEPCG [x]
153+ PCGを使用、もしくは使用停止する。x=0で使用停止、x=1で使用、x=2で
154+ キャラクターをリセットして使用。xを省略した場合は、x=1と同じ。
155+USEVAR xxx [, yyy [, zzz [, ... ]]]
156+ 英数字とアンダースコアー(_)で最大6文字までの変数名を使用できるようにする。
157+ このステートメント以降でxxx, yyy等の長い変数名が使用可能となる。
158+VAR xxx [, yyy [, zzz [, ... ]]]
159+ サブルーチン内で使う、ローカル変数を指定する。xxx, yyy等は、A-Zの
160+ アルファベットで指定する。
161+WAIT x
162+ xで示された時間、プログラムの実行を停止する。xが60の場合、約1秒間
163+ 停止。
164+WHILE x
165+WEND
166+ x が0以外の場合、WHILE文からWEND文までのステートメントを繰り返し実行する。
167+WIDTH x
168+ キャラクターディスプレイの横幅を文字数で指定。xは30、36、40、48、
169+ もしくは80。
170+
171+<整数型関数>
172+以下、x, y, zは整数値を、x$, y$, z$は文字列を指します。[ ]は省略可能である事
173+を示します。
174+
175+ABS(x)
176+ xの絶対値を返す。
177+ARGS(x)
178+ サブルーチン中で、GOSUBもしくはメソッドに渡されたx番目の引数を整数値として取
179+ り出す。但し、
180+ ARGS(0)は、引数の数を返す。
181+ ARGS(-1)は、一つ前に使われた引数を格納する配列へのポインターを返す。
182+ ARGS(-2)は、クラスで用いられた場合、オブジェクトへのポインターを返す。
183+ASC(x$)
184+ 文字列の最初の一文字の、アスキーコードを返す。
185+CREAD()
186+ DATA文の後から、一つずつデーター(8ビット整数値)を読み出す。「READ()」
187+ 関数も参照。
188+DRAWCOUNT()
189+ DRAWCOUNT値を得る。DRAWCOUNTは16ビット整数値で、1/60秒ごとに1ずつ
190+ 増える。
191+GOSUB(xxx [, y [, z [, ... ]]])
192+ GOSUB命令と同じだが、戻り値(RETURNを参照)を得ることが出来る。xxxは、
193+ ラベルもしくは行番号。。yyy, zzz 等は、サブルーチンに引き継がれる引数(
194+ ARGS()関数を参照)。
195+INKEY([x])
196+ xを指定しない場合、現在押されているキーのASCII値を返す。押されていな
197+ い場合は、0。ASCII値でxを指定した場合、そのキーが押されているかどう
198+ かを返す。
199+INT(x#)
200+ 実数値x#を整数値に変換して返す。
201+KEYS([x])
202+ キー入力を得る。xの値は以下の通り。xを指定しない場合は、x=63と同じ。
203+ KEYUP: 1
204+ KEYDOWN: 2
205+ KEYLEFT: 4
206+ KEYRIGHT: 8
207+ KEYSTART: 16
208+ KEYFIRE: 32
209+LEN(x$)
210+ 文字列の長さを返す。
211+MUSIC()
212+ BGMの演奏の残り数を返す。
213+NOT(x)
214+ x=0の場合に1を、そうでない場合に0を返す。
215+PEEK(x)
216+ xで示される物理アドレスから1バイト読み取り、返す。
217+PEEK16(x)
218+ xで示される物理アドレスから2バイト読み取り、16ビット値で返す。xが奇数値の場
219+ 合、例外停止するので注意。
220+PEEK32(x)
221+ xで示される物理アドレスから4バイト読み取り、32ビット値で返す。xが4の倍数で
222+ 無い場合、例外停止するので注意。
223+PLAYWAVE([x])
224+ xを指定しない場合、もしくは0を指定した場合、再生中のWAVEファイルの残りサン
225+ プリング数を返す。1を指定した場合、現在再生中のサンプリング番号を、2を指
226+ 定した場合、WAVEファイルの総サンプリング数を返す。
227+READ()
228+ DATA文の後から、一つずつデーター(32ビット整数値)を読み出す。「CREAD()」
229+ 関数も参照。
230+RND()
231+ 0から32767までの擬似乱数を返す。
232+SGN(x)
233+ xの符号(-1, 0, または1)を返す。
234+STRNCMP(x$,y$,z)
235+ 2つの文字列のうちz文字分を比較し、結果を返す。同じ文字列の場合は0。
236+TVRAM([x])
237+ ビデオRAMのx番目の内容を、バイト値で返す。xを省略した場合、ビデオ
238+ RAMの開始位置の物理アドレスを返す。
239+VAL(x$)
240+ 10進数もしくは16進数文字列としてのx$の値を、整数値で返す。
241+
242+<浮動小数点型関数>
243+ACOS#(x#)
244+ x# の逆余弦を実数値で返す。
245+ARGS#(x)
246+ サブルーチン中で、GOSUBもしくはメソッドに渡されたx番目の引数を実数値として取
247+ り出す。
248+ASIN#(x#)
249+ x# の逆正弦を実数値で返す。
250+ATAN#(x#)
251+ x# の逆正接を実数値で返す。
252+ATAN2#(y#,x#)
253+ y#/x# の逆正接を実数値で返す。
254+CEIL#(x#)
255+ x# 以上の最小の整数を実数値で返す。
256+COS#(x#)
257+ x# の余弦を実数値で返す。
258+COSH#(x#)
259+ x# の双曲線余弦を実数値で返す。
260+EXP#(x#)
261+ eを底とする x# の指数関数値を実数値で返す。
262+FABS#(x#)
263+ x# の絶対値を実数値で返す。
264+FLOAT#(x)
265+ 整数値 x を浮動小数点型実数値に変換して返す。
266+FLOOR#(x#)
267+ x# 以下の最大の整数を実数値で返す。
268+FMOD#(x#,y#)
269+ x# を y# で割った剰余を実数値で返す。
270+GOSUB#(xxx [, y [, z [, ... ]]])
271+ GOSUB命令と同じだが、戻り値(RETURNを参照)を得ることが出来る。xxxは、
272+ ラベルもしくは行番号。。yyy, zzz 等は、サブルーチンに引き継がれる引数(
273+ ARGS()関数を参照)。
274+LOG#(x#)
275+ x# の自然対数を実数値で返す。
276+LOG10#(x#)
277+ x# の常用対数を実数値で返す。
278+MODF#(x#)
279+ x# の小数部を実数値で返す。
280+PI#
281+ 3.141593を返す。
282+POW#(x#,y#)
283+ x# の y# 乗を実数値で返す。
284+SIN#(x#)
285+ x# の正弦を実数値で返す。
286+SINH#(x#)
287+ x# の双曲線正弦を実数値で返す。
288+SQRT#(x#)
289+ x# の平方根を実数値で返す。
290+TAN#(x#)
291+ x# の正接を実数値で返す。
292+TANH#(x#)
293+ x# の双曲線正接を実数値で返す。
294+VAL#(x$)
295+ 10進数文字列としてのx$の値を、実数値で返す。
296+
297+<文字列型関数>
298+A$(x [,y])など
299+ xの値が0の場合、文字列全体を返す。
300+ xの値が正の場合、xで示される位置より右側の文字列を返す。
301+ xの値が負のとき、文字列の右側x文字を返す。
302+ yが指定された場合、y文字分の文字列を返す。
303+ARGS$(x)
304+ サブルーチン中で、GOSUBもしくはメソッドに渡されたx番目の引数を文字列として取
305+ り出す。
306+CHR$(x)
307+ xをアスキーコードとする文字を返す。
308+DEC$(x)
309+ xの値を、10進数の文字列として返す。
310+FLOAT$(x#)
311+ 実数値x#を、10進数の文字列として返す。
312+GOSUB$(xxx [, y [, z [, ... ]]])
313+ GOSUB命令と同じだが、戻り値(RETURNを参照)を文字列として得ることが出来る。
314+ xxxは、ラベルもしくは行番号。。yyy, zzz 等は、サブルーチンに引き継がれる引数
315+ (ARGS()関数を参照)。
316+HEX$(x [,y])
317+ xの値を、16進数の文字列として返す。yが指定された場合、yバイト長の
318+ 文字列になる。
319+INPUT$()
320+ 文字列入力状態になり、入力が終了すると(Enterが押されると)文字列を返す。
321+SPRINTF$(x$,y#)
322+ x$で示される書式に従って、実数y#の内容を文字列として返す。
323+READ$()
324+ DATA文の後から、一つずつ文字列データーを読み出す。
325+
326+<整数演算子>
327+&x
328+ 変数xの格納アドレス(ポインター)
329+-x
330+ 符号を反転
331+x + y
332+ 整数加算
333+x - y
334+ 整数減算
335+x * y
336+ 整数乗算
337+x / y
338+ 整数除算
339+x % y
340+ 整数剰余
341+x >> y
342+ xの値をyビット右シフト
343+x << y
344+ xの値をyビット左シフト
345+x = y
346+ 2つの整数値が等しい場合に1、そうでないときに0
347+x != y
348+ 2つの整数値が等しい場合に0、そうでないときに1
349+x < y
350+ xがyより小さい場合に1、そうでないときに0
351+x <= y
352+ xがyより小さいか等しい場合に1、そうでないときに0
353+x > y
354+ xがyより多きい場合に1、そうでないときに0
355+x >= y
356+ xがyより多きいか等しい場合に1、そうでないときに0
357+x AND y
358+ xとyの値のビットごとの AND(論理積でないことに注意)
359+x OR y
360+ xとyの値のビットごとの OR
361+x XOR y
362+ xとyの値のビットごとの XOR
363+
364+なお、整数演算子の優先順位は、優先度が高いものから以下の順です。
365+
366++ - (単項演算子) &
367+* / %
368++ - (加算・減算)
369+<< >>
370+< <= > >=
371+= !=
372+XOR
373+AND
374+OR
375+
376+<文字列演算子>
377+x$ + y$
378+ 文字列の連結
379+
380+<浮動小数点型演算子>
381+-x#
382+ 符号を反転
383+x# + y#
384+ 実数加算
385+x# - y#
386+ 実数減算
387+x# * y#
388+ 実数乗算
389+x# / y#
390+ 実数除算
391+x# = y#
392+ 2つの実数値が等しい場合に1、そうでないときに0
393+x# != y#
394+ 2つの実数値が等しい場合に0、そうでないときに1
395+x# < y#
396+ xがyより小さい場合に1、そうでないときに0
397+x# <= y#
398+ xがyより小さいか等しい場合に1、そうでないときに0
399+x# > y#
400+ xがyより多きい場合に1、そうでないときに0
401+x# >= y#
402+ xがyより多きいか等しい場合に1、そうでないときに0
403+x# AND y#
404+ xとyの値の論理積(ビットごとの AND でないことに注意)
405+x# OR y#
406+ xとyの値の論理和(ビットごとの OR でないことに注意)
407+
408+なお、実数演算子の優先順位は、優先度が高いものから以下の順です。
409+
410++ - (単項演算子)
411+* /
412++ - (加算・減算)
413+< <= > >=
414+= !=
415+AND
416+OR
417+
418+<特殊命令・関数>
419+IDLE
420+ アイドルモード("wait"アセンブリー)に入る。ビデオ信号作製やタイマーなどの割
421+ り込みがかかるまで、CPUが停止する。
422+OPTION x[,y[,z ... ]]]
423+ 各種オプションを指定する。オプションについては、下記<オプション>の項を参照。
424+SYSTEM x , y
425+ 様々なシステム値の設定を行なう。<SYSTEM>の項を参照。
426+SYSTEM(x)
427+ 様々なシステム値を、整数値で返す。<システム変数>の項を参照。
428+SYSTEM$(x)
429+ 様々なシステム値を、文字列で返す。<システム変数>の項を参照。
430+
431+<グラフィック関連命令と関数>
432+
433+BOXFILL [x1,y1],x2,y2[,c]
434+ 座標(x1,y1),(x2,y2)を対角線とするカラーcで塗られた長方形を描画。
435+CIRCLE [x,y],r[,c]
436+ 座標(x,y)を中心に、半径r、カラーcの円を描画。
437+CIRCLEFILL [x,y],r[,c]
438+ 座標(x,y)を中心に、半径r、カラーcで塗られた円を描画。
439+GCLS
440+ 画面クリアー。
441+GCOLOR c
442+ それぞれの命令で、cを省略した場合の色を指定。
443+GPALETTE n,r,g,b
444+ パレット指定。
445+GPRINT [x,y],c,bc,s$
446+ 座標(x,y)にカラーcで文字列s$を表示、bc:背景色(負数の場合背景色指定なし)。
447+LINE [x1,y1],x2,y2[,c]
448+ 座標(x1,y1)から(x2,y2)にカラーcで線分を描画。
449+POINT x,y
450+ グラフィック現在位置を、設定する。
451+PSET [x,y][,c]
452+ 座標(x,y)の位置にカラーcで点を描画。
453+PUTBMP [x,y],m,n,bbb
454+ 横m*縦nドットのキャラクター(bbbで指定)を座標(x,y)に表示。
455+ サイズm*nの配列bmpに、単純にカラー番号を並べる。
456+ ただし、カラーが0の部分は透明色として扱う。ただし、bbbはラベル名もし
457+ くは配列へのポインター。
458+USEGRAPHIC [x]
459+Type Mの場合
460+ グラフィックディスプレイを使用、もしくは使用停止する。x=0で使用停止、
461+ x=1, 5, 9で使用、x=2, 6, 10で画面とパレットをクリアーして使用、x=3,7,
462+ 11でグラフィック領域を確保するが表示はキャラクターディスプレイのまま。
463+ ただし、グラフィックディスプレイ未使用の状態でx=0, 4, 8の場合は、領域
464+ を確保する。xを省略した場合は、x=1と同じ。
465+ ただし、xの値が0-3の場合はType-Z互換グラフィック、4-7の場合は標準グラ
466+ フィック、8-11の場合はワイドグラフィック。
467+Type Zの場合
468+ グラフィックディスプレイを使用、もしくは使用停止する。x=0で使用停止、
469+ x=1で使用、x=2で画面とパレットをクリアーして使用、x=3でグラフィック領
470+ 域を確保するが表示はキャラクターディスプレイのまま。ただし、グラフィッ
471+ クディスプレイ未使用の状態でx=0の場合は、領域を確保する。xを省略した場
472+ 合は、x=1と同じ。
473+
474+
475+GCOLOR(x,y)
476+ グラフィック座標(x,y)の表示中パレット番号を返す。
477+
478+<ファイル関連命令と関数>
479+ファイルは、最大2つまで同時に開く事が出来ます。
480+
481+FCLOSE [x]
482+ ファイルを閉じる。引数(x)がある場合は、そのファイルハンドルで指定されたファ
483+ イルを閉じる。
484+FGET x,y
485+ バッファー(xに配列として指定)にyバイト読み込む。関数として呼ばれた場合は、
486+ 読み込みに成功したバイト数を返す。
487+FILE x
488+ アクティブなファイルハンドル(1もしくは2)をxに指定する。
489+FOPEN x$,y$[,z]
490+ x$で示される名前のファイルを、y$で示されたモードで開く。同時に開けるファイ
491+ ルの数は、2つまで。関数として呼ばれた場合は、ファイルハンドルを返す。y$と
492+ しては、次のものが有効。
493+ "r" :ファイルを読み込みモードで開く。
494+ "r+" :"r"と同じだが書き込みも可能。
495+ "w" :ファイルを書き込みモードで開く。同名のファイルが在る場合は、
496+ 以前のファイルは消去される。
497+ "w+" :"w"と同じだが、読み込みも可能。
498+ "a" :ファイルを書き込みモードで開く。同名のファイルが在る場合は、
499+ ファイルは消去されず、ファイルの最後尾から書き込まれる。
500+ "a+" :"a"と同じだが、読み込みも可能。
501+ zには、割り当てたいファイルハンドル(1もしくは2)を指定する。省略した場
502+ 合、1が指定される。
503+FPRINT [ xまたはx$またはx# [ ,または; [ yまたはy$またはy# [ ... ]]]]
504+ PRINT命令と同じだが、画面ではなくファイルに情報が書き込まれる。
505+FPUT x,y
506+ バッファー(xに配列として指定)のyバイト分を書き込む。関数として呼ばれた場合
507+ は、書き込みに成功したバイト数を返す。
508+FPUTC x
509+ xで示される1バイトのデーターをファイルに書き込む。関数として呼ばれた場合
510+ は、書き込みに成功したバイト数(1もしくは0)を返す。
511+FREMOVE x$
512+ x$で示される名前のファイルを、SDカードから削除する。関数として呼ばれた場合
513+ は、削除に成功したか(0)、失敗したか(-1)を返す。
514+FSEEK x
515+ xで示されるファイル位置に移動する。
516+SETDIR x$
517+ カレントディレクトリーをx$に移動する。関数として呼ばれた場合、成功すれば0を、
518+ エラーが有れば0以外を返す。
519+FEOF()
520+ FOPENで開いたファイルの現在のファイル位置が、末端に到達しているかどうか
521+ を返す。1で末端に到達、0で未到達。
522+FGETC()
523+ FOPENで開いたファイルから1バイト読み込み、整数値として返す。ファイル
524+ 末端に到達しているなどで読み込みに失敗した場合、-1を返す。
525+FLEN()
526+ FOPENで開いたファイルのファイル長を、バイト数で返す。
527+FSEEK()
528+ FOPENで開いたファイルの、現在のファイル位置を返す。
529+FINPUT$([x])
530+ FOPENで開いたファイルから、xで示された長さの文字列を読み込む。xが省略された
531+ 場合は、行の最後まで読み込む(改行コードが含まれる)。
532+GETDIR$()
533+ カレントディレクトリーを文字列として返す。
534+
535+<タイマー関連命令と関数>
536+タイマーは、通常タイマーとコアタイマーの2つがあります。通常タイマーは速度の設定
537+や値の変更など出来る、汎用タイマーです。コアタイマーは、CPUクロックと同期した特
538+殊なタイマーで、値を読む事は出来るが設定する事は出来ません。
539+
540+CORETIMER
541+ コアタイマーを用いた割り込みの時期を設定する。コアタイマーの値を変更するわけ
542+ ではない事に注意。
543+USETIMER x
544+ タイマーを開始する。xはタイマーの速度を、μ秒で指定(175769以下の値)。
545+TIMER x
546+ 現在のタイマー値を32ビット整数(x)で設定する。
547+CORETIMER()
548+ 現在のコアタイマーの値を、32ビット整数値として返す。
549+TIMER()
550+ タイマーの現在値を、32ビット整数値として返す。
551+
552+<割り込み命令>
553+INTERRUPT xxx,yyy[,z1[,z2 ... ]]
554+ 割り込みを設定する。xxxは割り込みの種類、yyyは割り込み時のサブルーチンをラベ
555+ ルで指定。z1, z2等を指定すると、割り込み用サブルーチンの引数となる。使用可能
556+ な割り込みの種類は以下の通り。
557+ TIMER
558+ タイマー割り込み。タイマー値が1増えるごとに割り込みがかかる。
559+ DRAWCOUNT
560+ 1/60秒毎の割り込み。
561+ KEYS
562+ ボタンの押下状態が変化した時。
563+ INKEY
564+ キーボード押下時。
565+ MUSIC
566+ 音楽再生の時、最後の音の再生時に割り込み。
567+ WAVE
568+ WAVEファイル再生終了時。
569+ CORETIMER
570+ コアタイマーの値がCORETIMER命令で設定した値と一致した時。
571+INTERRUPT STOP xxx
572+ 割り込みを停止する。xxxは割り込みの種類。
573+
574+<MUSIC>
575+MUSIC命令では、BGM用のデーターを文字列で指定します。文字列の書式は、ABC
576+notationに準拠しています。ただし、すべての記法が使えるわけではありません。
577+なお、キーや速度などのデフォルト設定値は以下の通りです。
578+
579+Q: 1/4=90
580+L: 1/8
581+K: C
582+
583+BGM演奏時に一度に設定できる音の数は、31迄です。これを超えて音楽を再生したい
584+場合は、MUSIC()関数の戻り値を調べ、その値が十分小さくなってから、次のMUSIC命
585+令を実行するようにします。
586+
587+添付のmusic.basに、使い方に関するサンプルがありますので、参考にして下さい。
588+
589+<SOUND>
590+SOUND命令では、DATA列のデーターを、行番号もしくはラベルで指定します。SOUND命
591+令による効果音再生中は、BGMは再生されません。また、前の効果音が終わる前に次
592+のSOUND命令を実行すると、前の効果音の再生は停止し、新しい効果音がすぐに再生
593+されます。
594+
595+DATA列では、32ビット整数値として、交換音を表現します。この整数値の下位16
596+ビットは周波数の指定です。2048が440Hz(ラの音)に対応します。値が大きくなるほ
597+ど、より低い音が出ます。上位16ビットは、音の長さです。1が、1/60秒に相当し
598+ます。最後に、65535以下の値で、効果音の繰り返し回数を指定します。これらのデー
599+ターの数は、32を超えないようにして下さい。
600+
601+添付のsound.basに、使い方に関するサンプルがありますので、参考にして下さい。
602+
603+<PCG>
604+PCG(Programmable Character Generator)を用いると、ASCIIコードごとにフォント
605+を指定して、疑似グラフィックスとして表示させることが出来ます。使用する場合
606+は、まず
607+
608+USEPCG
609+
610+とします。フォントの変更は、PCGステートメントを用いて、
611+
612+PCG 0x80,0x80402010,0x08040201
613+
614+の様に設定します。この例では、ASCIIコード0x80の文字のフォントを設定してい
615+て、バックスラッシュの様な記号(左上から右下に向かう斜め線)が表示されるよう
616+になります。PCGの利用を停止し、オリジナルのフォントに戻す場合は、
617+
618+USEPCG 0
619+
620+とします。再度PCGを使用したい場合は、
621+
622+USEPCG
623+
624+として下さい。先に設定したフォントデーターが、復活します。なお、先に設定し
625+たフォントデーターを破棄してPCGの使用を始めたい場合は、
626+
627+USEPCG 2
628+
629+として下さい。
630+
631+<システム変数>
632+SYSTEM関数及びSYSTEMステートメントを用いて、各種システム情報をやりとりするこ
633+とが出来ます。
634+
635+SYSTEM$(0)
636+ MachiKania バージョン文字列、"Zoea"等を返す。
637+SYSTEM$(1)
638+ MachiKania バージョン文字列、"1.2"等を返す。
639+SYSTEM$(2)
640+ BASIC バージョン文字列、"KM-1208"等を返す。
641+SYSTEM$(3)
642+ 現在実行中のHEXファイル名、"ZOEA.HEX"等を返す。
643+SYSTEM(4)
644+ 現在実行中のCPUのクロック周波数を返す。
645+SYSTEM(20)
646+ キャラクターディスプレイ横幅を返す。
647+SYSTEM(21)
648+ キャラクターディスプレイ縦幅を返す。
649+SYSTEM(22)
650+ グラフィックディスプレイ横幅を返す。
651+SYSTEM(23)
652+ グラフィックディスプレイ横幅を返す。
653+SYSTEM(24)
654+ キャラクターディスプレイ用の指定色を返す。
655+SYSTEM(25)
656+ グラフィックディスプレイ用の指定色を返す。
657+SYSTEM(26)
658+ キャラクターディスプレイの、現在のX位置を返す。
659+SYSTEM(27)
660+ キャラクターディスプレイの、現在のY位置を返す。
661+SYSTEM(28)
662+ グラフィックディスプレイの、現在のX位置を返す。
663+SYSTEM(29)
664+ グラフィックディスプレイの、現在のY位置を返す。
665+SYSTEM(40)
666+ PS/2キーボードを使用中かどうかを返す。
667+SYSTEM(41)
668+ PS/2キーボード情報、vkeyを返す。
669+SYSTEM(42)
670+ PS/2キーボード情報、lockkeyを返す。
671+SYSTEM(43)
672+ PS/2キーボード情報、keytypeを返す。
673+SYSTEM(100)
674+ 変数格納領域(g_var_mem)へのポインターを返す。
675+SYSTEM(101)
676+ 乱数シードへのポインターを返す。
677+SYSTEM(102)
678+ キャラクターディスプレイ領域(TVRAM)へのポインターを返す。
679+SYSTEM(103)
680+ フォント領域へのポインターを返す。
681+SYSTEM(104)
682+ PCGフォント領域へのポインターを返す。
683+SYSTEM(105)
684+ グラフィックディスプレイ領域へのポインターを返す。
685+SYSTEM 200,x
686+ ディスプレイの表示を停止(xが0のとき)、もしくは開始(xが0以外の時)する。
687+
688+<入出力命令・関数>
689+入出力機能は、Type Mでのみ使えます。
690+
691+ANALOG(x)
692+ PORTBの下位からxビット目のアナログ入力値(10ビット値;0-1023の値)を返す。但
693+ し、x=16, 17, 18の場合は、PORTE5, 6, 7がそれぞれ指定される。
694+IN(x)
695+ PORTBの下位からxビット目の入力値(1ビット値;1か0)を返す。但し、x=16, 17,
696+ 18の場合は、PORTE5, 6, 7がそれぞれ指定される。入力はPIC内部でプルアップされ
697+ る。
698+IN8H()
699+ PORTBの上位8ビットの入力値(8ビット値)を返す。入力はPIC内部でプルアップされ
700+ る。
701+IN8L()
702+ PORTBの下位8ビットの入力値(8ビット値)を返す。入力はPIC内部でプルアップされ
703+ る。
704+IN16()
705+ PORTBの入力値(16ビット値)を返す。入力はPIC内部でプルアップされる。
706+PWM x[,y[,z]]
707+ PWM出力を行なう。z=1の場合PORTD10に、z=2の場合PORTD11に出力される。zを省略し
708+ た場合は、PORTD10。xにはデューティー比を、0-1000の値で指定する。yはパルスの
709+ 周波数を、Hzで指定する(省略した場合は、1000;有効値は6-95454)。
710+SERIAL x[,y[,z]]
711+ シリアル通信を開始する。xにはボーレートを指定する(シリアル通信の使用を終了す
712+ る場合は、x=0を指定)。y=0の場合パリティ無し、y=1の場合偶数パリティ、y=2の場
713+ 合奇数パリティ、y=3の場合9ビットパリティ無し。yを省略した場合は、y=0と同じ。
714+ zには受信バッファーの文字数を指定する。zを省略した場合、1/60秒の連続受信が
715+ 保証される大きさのバッファーを確保する。
716+SERIALIN([x])
717+ シリアル通信で、一文字受信する。受信が無い場合は、-1を返す。x=1を指定すると、
718+ 受信バッファーの文字数を返す。パリティ有り8ビットの受信の場合は、パリティ
719+ エラーが起きた場合、0x100以上の値を返す。
720+SERIALOUT x
721+ シリアル通信で、一文字送信する。
722+OUT x,y
723+ PORTBの下位からxビット目に、yで示された値(1ビット値;1か0)を出力する。但
724+ し、x=16, 17, 18の場合は、PORTE5, 6, 7がそれぞれ指定される。PORTE5, 6, 7は、
725+ オープンドレイン出力であることに注意。
726+OUT8H x
727+ PORTBの上位8ビットに、xで示された値(8ビット値)を出力する。
728+OUT8L x
729+ PORTBの下位8ビットに、xで示された値(8ビット値)を出力する。
730+OUT16 x
731+ PORTBに、xで示された値(16ビット値)を出力する。
732+I2C [x]
733+ I2C利用をマスターモードで開始する。xは、クロック数をkHz単位で指定(有効値は、
734+ 12-3409)。省略した場合は、X=100。
735+I2CWRITE x[,y[,z[, ... ]]
736+ I2C固定長送信を行なう。xは7ビットのスレーブアドレス。y, z等はオプションの送
737+ 信コードで、バイト値で指定。
738+I2CREAD(x[,y[,z[, ... ]])
739+ I2C固定長送信の後、1バイトの受信を行なう。xは7ビットのスレーブアドレス。y, z
740+ 等はオプションの送信コードで、バイト値で指定。成功した場合に8ビット値を返す。
741+ エラーの場合、-1を返す。
742+I2CWRITEDATA x,y,z1[,z2[,z3...]]
743+ I2C複数バイト送信を行なう。xは7ビットのスレーブアドレス。yは送信する内容を含
744+ むバッファーへのポインター。z1はバッファーのバイト数。z2, z3等はオプションの送
745+ 信コードで、これらのバイト値がまず送信され、続けてバッファーyの内容がz1バイト
746+ に渡って送信される。
747+I2CREADDATA x,y,z1[,z2[,z3...]]
748+ I2C複数バイト受信を行なう。xは7ビットのスレーブアドレス。yは受信する内容を格
749+ 納するバッファーへのポインター。z1は受信するバイト数。z2, z3等はオプションの送
750+ 信コードで、これらのバイト値がまず送信され、続けてz1バイトのデーターを受信して
751+ バッファーyに格納する。
752+I2CERROR()
753+ 直前のI2C送受信でエラーが在った場合に0以外を、なければ0を返す。
754+SPI x[,y[,z1[,z2]]]
755+ SPI利用をマスターモードで開始する。xは、クロック数をkHz単位で指定(有効値は、
756+ 93-47727)。yは、1ワードのビット数を8/16/32で指定(省略した場合は、8)。z1は、
757+ SPIクロックの取り扱い方を指定(省略した場合は、0)。詳細は、下記に。z2は、CS
758+ ラインにどのポートを使用するかを指定する。省略した場合は、0x39(PORTD9)。他の
759+ ポートを使う場合、例えばPORTB5なら0x15、PORTB3なら0x13とする。
760+ z1=0:アイドル時にL、データー変更はLに変化する時(CKP=0,CKE=1)
761+ z1=1:アイドル時にL、データー変更はHに変化する時(CKP=0,CKE=0)
762+ z1=2:アイドル時にH、データー変更はHに変化する時(CKP=1,CKE=1)
763+ z1=3:アイドル時にH、データー変更はLに変化する時(CKP=1,CKE=0)
764+SPIWRITE x[,y[,z[, ... ]]
765+ SPI固定長送信を行なう。x, y, z等は送信コード。
766+SPIREAD([x[,y[,z[, ... ]]])
767+ SPI固定長送信(オプション)の後、1ワードの受信を行ない、返す。x,y,z等は、受信
768+ 前に送信するコード。
769+SPIWRITEDATA x,y[,z1[,z2[,z3...]]]
770+ SPI複数ワード送信を行なう。xは送信する内容を含むバッファーへのポインター。yは
771+ バッファーのワード数。z1,z2,z3等はオプションの送信コードで、これらがまず送信
772+ され、続けてバッファーxの内容がyワードに渡って送信される。
773+SPIREADDATA x,y[,z1[,z2[,z3...]]]
774+ SPI複数ワード受信を行なう。xは受信する内容を格納するバッファーへのポインター。
775+ yは受信するワード数。z1,z2,z3等はオプションの送信コードで、これらがまず送信さ
776+ れ、続けてyワードのデーターを受信してバッファーxに格納する。
777+SPISWAPDATA x,y[,z1[,z2[,z3...]]]
778+ SPI複数ワード送受信を行なう。xは送受信する内容を格納するバッファーへのポイン
779+ ター。yは送受信するワード数。z1,z2,z3等はオプションの送信コードで、これらがま
780+ ず送信される。続けて、バッファーxの内容を送信した後にデーターを受信してバッ
781+ ファーxに格納しなおす動作を、yワードに渡って繰り返す。
782+
783+<オプション>
784+OPTIONステートメントを使って、コンパイル時もしくは実行時に色々なオプションを指定
785+する事が可能です。次のオプションが有ります。
786+
787+OPTION NOLINENUM
788+ コンパイル時に、行番号を指定する命令を挿入しない。このオプションにより、プロ
789+ グラムサイズを小さくして実行速度を増加する効果が見込める。ただし、エラーが発
790+ 生した場合に、どの行でのエラーかは分からなくなる。
791+
792+OPTION FASTFIELD
793+ クラスを2つ以上使っている時、パブリックフィールド名の重複がない場合に、
794+ フィールドへのアクセスを高速化する。ただし、存在しないオブジェクトのフィール
795+ ドにアクセスしてもエラーにならない場合があるため、予めBASICコードにエラーが
796+ ない事を確認してから用いる事が望ましい。なお、クラスを一つだけしか使っていな
797+ い場合は、指定しなくてもこのオプションは有効になっている。
798+
799+<クラス・オブジェクト関連機能>
800+クラスとオブジェクトの利用方法について、詳しくはclass.txtを参照して下さい。
801+以下は、関連する命令と関数です。
802+
803+USECLASS x[,y[,z[, ... ]]]
804+ クラスの利用を宣言する。x,y,z等は、クラス名を6文字以内の英数字で指定。
805+FIELD [PUBLIC] x[,y[,z[, ... ]]]
806+ クラスファイル中で、パブリックフィールドを宣言する。"PUBLIC"は省略可。
807+ x,y,z等はフィールド名を6文字以内の英数字で指定。
808+FIELD PRIVATE x[,y[,z[, ... ]]]
809+ クラスファイル中で、プライベートフィールドを宣言する。x,y,z等はフィールド
810+ 名を6文字以内の英数字で指定。
811+STATIC [PUBLIC] x[,y[,z[, ... ]]]
812+ クラスファイル中で、パブリックスなタティック変数を宣言する。"PUBLIC"は省略可。
813+STATIC PRIVATE x[,y[,z[, ... ]]]
814+ クラスファイル中で、プライベートなスタティック変数を宣言する。USEVARと同じ。
815+METHOD x
816+ クラスファイル中で、メソッドを宣言する。xは、メソッド名を6文字以内の英
817+ 数字で指定。
818+NEW(x[,y[,z[, ... ]]])
819+ クラスオブジェクトを作成し、オブジェクトへのポインターを返す。xはクラス名
820+ を指定。y,z等はコンストラクターがある際に利用される引数。
821+DELETE x[,y[,z[, ... ]]]
822+ 作成されたオブジェクトを破棄する。x,y,z等は、オブジェクトを格納する変数名。
823+CALL x
824+ xで指定されたオブジェクトのメソッドを呼び出す。「CALL」は省略可。
825+
826+<ヒント>
827+MachiKania ver 1.2 以降、FOR-NEXTループ、WHILE-WENDループ、DO-LOOPループの途中で、
828+RETURN文が使えるようになりました。ただし、GOTO文でループの外に飛ぶと、予期せぬ結
829+果(機器のリセット等)を引き起こします。また、GOSUB文でサブルーチンを呼んだり、別の
830+ループをネストして使う事は可能です。
831+
832+ON GOTO分やON GOSUB文はサポートしていません。ただし、例えば次のように記述す
833+ることで、同様の動作をさせることは可能です。
834+ GOSUB 10000+A
835+ ....
836+ 10000 PRINT "A=0" : RETURN
837+ 10001 PRINT "A=1" : RETURN
838+ 10002 PRINT "A=2" : RETURN
839+
840+一行中で連続して文字列を扱うと、"String too complexed"というエラーがでて、
841+停止することがあります。この場合は、文字列を扱う命令を独立した行するか、文
842+字列関連の演算を幾つかのステップに分けて、それぞれ1行ずつの記述にして試し
843+てみて下さい。
844+
845+<バージョン履歴>
846+・KM-1208 2019年?月公開。
847+ ・最初の公開バージョン。Type ZのKM-1208と基本的には同じ。
--- a/mips/protozoea/main.h
+++ b/mips/protozoea/main.h
@@ -5,7 +5,7 @@
55 http://hp.vector.co.jp/authors/VA016157/
66 */
77
8-#define SYSVER1 "Protozoa"
8+#define SYSVER1 "Protozoea"
99 #define SYSVER2 "1.3"
1010 #define BASVER "KM-1208"
1111
--- a/mips/protozoea/protozoea.mcp
+++ b/mips/protozoea/protozoea.mcp
@@ -67,6 +67,8 @@ file_039=.
6767 file_040=.
6868 file_041=.
6969 file_042=.
70+file_043=.
71+file_044=.
7072 [GENERATED_FILES]
7173 file_000=no
7274 file_001=no
@@ -111,6 +113,8 @@ file_039=no
111113 file_040=no
112114 file_041=no
113115 file_042=no
116+file_043=no
117+file_044=no
114118 [OTHER_FILES]
115119 file_000=no
116120 file_001=no
@@ -155,6 +159,8 @@ file_039=no
155159 file_040=no
156160 file_041=yes
157161 file_042=yes
162+file_043=yes
163+file_044=yes
158164 [FILE_INFO]
159165 file_000=args.c
160166 file_001=class.c
@@ -199,6 +205,8 @@ file_039=interface\libsdfsio.a
199205 file_040=App_32MX170F256B.ld
200206 file_041=reservednames.js
201207 file_042=sharedfiles.js
208+file_043=class.txt
209+file_044=help.txt
202210 [SUITE_INFO]
203211 suite_guid={62D235D8-2DB2-49CD-AF24-5489A6015337}
204212 suite_state=
--- a/mips/protozoea/statement.c
+++ b/mips/protozoea/statement.c
@@ -1568,7 +1568,9 @@ char* option_statement(){
15681568 while(1){
15691569 next_position();
15701570 if (nextCodeIs("NOLINENUM")) {
1571- g_nolinenum=1;
1571+ g_option_nolinenum=1;
1572+ } else if (nextCodeIs("FASTFIELD")) {
1573+ g_option_fastfield=1;
15721574 } else {
15731575 return ERR_SYNTAX;
15741576 }
--- a/mips/zoea/class.c
+++ b/mips/zoea/class.c
@@ -33,6 +33,14 @@ static int* g_class_structure;
3333 record[1]: field/method name as integer
3434 record[2]: pointer to method
3535 */
36+/*
37+ CMPDATA_FASTFIELD structure
38+ type: CMPDATA_FASTFIELD
39+ len: 2
40+ data16: number of position of public field in object
41+ 0 for multiple usage of the same public field name
42+ record[1]: field name as integer
43+*/
3644
3745 /*
3846 CMPDATA_STATIC structure
@@ -62,6 +70,24 @@ static int* g_class_structure;
6270 */
6371
6472 /*
73+ About fast field access
74+ When a public field name used only once with a class,
75+ the address of this field of an object is defined quickly when compiling.
76+ This logic is always true when there is only a class.
77+
78+ However, if there are more than two classes and the field name is used
79+ by only a class, this logic is true only when the BASIC code does not have
80+ error. If there is an error in BASIC code, this type of error cannot be
81+ found by compiler and when executing.
82+
83+ Therefore, only use this logic when the number of class is one, and/or
84+ OPTION FASTFIELD is defined.
85+
86+ This logic is useless for public method, because library must be always called
87+ before calling public method.
88+*/
89+
90+/*
6591 Local prototyping
6692 */
6793 char* obj_method(int method);
@@ -259,10 +285,36 @@ char* construct_class_structure(int class){
259285
260286 void delete_cmpdata_for_class(int class){
261287 int* record;
288+ int i;
289+ short pos;
262290 // Delete field/method data
263291 cmpdata_reset();
292+ pos=0; // # of position of public field
264293 while(record=cmpdata_find(CMPDATA_FIELD)){
265- cmpdata_delete(record);
294+ if ((record[0]&0xffff)==CMPTYPE_PUBLIC_FIELD) {
295+ pos++;
296+ i=record[1]; // Field name
297+ cmpdata_delete(record);
298+ // Construct or disable CMPDATA_FASTFIELD
299+ // Note that the sequence of public fields here is the same
300+ // as that in the function, construct_class_struction().
301+ cmpdata_reset();
302+ while(record=cmpdata_find(CMPDATA_FASTFIELD)){
303+ if (record[1]==i) break;
304+ }
305+ if (record) {
306+ // Multiple definition of field name
307+ // Clear data16 if the position is different
308+ if (pos!=(record[0]&0xffff)) record[0]&=0xffff0000;
309+ } else {
310+ // Previous CMPDATA_FASTFIELD not found
311+ // Create now one for fast field implementation
312+ g_temp=i;
313+ cmpdata_insert(CMPDATA_FASTFIELD,pos,&g_temp,1);
314+ }
315+ } else {
316+ cmpdata_delete(record);
317+ }
266318 cmpdata_reset();
267319 }
268320 // Delete longvar data
@@ -488,6 +540,8 @@ char* _obj_field(char mode){
488540 // $v0 contains the address of object.
489541 int i;
490542 char* err;
543+ int* record;
544+ char fastfield;
491545 do {
492546 i=check_var_name();
493547 if (i<65536) return ERR_SYNTAX;
@@ -506,11 +560,38 @@ char* _obj_field(char mode){
506560 // This is a string field. Raise 31st bit.
507561 i|=0x80000000;
508562 }
509- check_obj_space(2);
510- g_object[g_objpos++]=0x3C050000|((i>>16)&0x0000FFFF); // lui a1,xxxx
511- g_object[g_objpos++]=0x34A50000|(i&0x0000FFFF); // ori a1,a1,xxxx
512- // First and second arguments are address of object and field name, respectively.
513- call_quicklib_code(lib_obj_field,ASM_ADDU_A0_V0_ZERO);
563+ // Check if Fast Field Access can be used.
564+ cmpdata_reset();
565+ while(record=cmpdata_find(CMPDATA_FASTFIELD)){
566+ if (record[1]==(i&0x7FFFFFFF)) break;
567+ }
568+ if (!record) {
569+ // Record wasn't found
570+ fastfield=0;
571+ } else if (1!=g_num_classes && !g_option_fastfield) {
572+ // No fast field option
573+ fastfield=0;
574+ } else if (!(record[0]&0xffff)) {
575+ // The same field name used twice at the different positions
576+ fastfield=0;
577+ } else {
578+ // All requirements passed
579+ fastfield=1;
580+ }
581+ // Generate code here
582+ if (fastfield) {
583+ // Get field value in $v0 and address in $v1
584+ i=(record[0]&0xffff)*4;
585+ check_obj_space(2);
586+ g_object[g_objpos++]=0x24430004|i; // addiu v1,v0,xxxx
587+ g_object[g_objpos++]=0x8C620000; // lw v0,0(v1)
588+ } else {
589+ check_obj_space(2);
590+ g_object[g_objpos++]=0x3C050000|((i>>16)&0x0000FFFF); // lui a1,xxxx
591+ g_object[g_objpos++]=0x34A50000|(i&0x0000FFFF); // ori a1,a1,xxxx
592+ // First and second arguments are address of object and field name, respectively.
593+ call_quicklib_code(lib_obj_field,ASM_ADDU_A0_V0_ZERO);
594+ }
514595 // Check if "." follows
515596 if (g_source[g_srcpos]=='.') {
516597 // "." found. $v0 is adress of an object. See the field.
--- a/mips/zoea/class.txt
+++ b/mips/zoea/class.txt
@@ -56,9 +56,6 @@ METHOD命令で宣言されたメソッドは、すべてパブリックです
5656 メソッドが指定された場合、オブジェクト作成時に、このメソッドが呼ばれます。INIT
5757 メソッドに引数を与える事も可能です(引数は必須ではありません)。
5858
59-クラス中でオブジェクトへのポインターが必要な場合は、ARGS(-2)で取り出す事が出来
60-ます。
61-
6259 記述例(CLASS1.BASの名前で保存):
6360  FIELD PUBLIC TEST1,TEST2
6461  FIELD PRIVATE TEST3
--- a/mips/zoea/compiler.c
+++ b/mips/zoea/compiler.c
@@ -163,7 +163,7 @@ char* compile_line(void){
163163 printstr(resolve_label(g_line));
164164 return ERR_MULTIPLE_LABEL;
165165 }
166- if (!g_nolinenum) {
166+ if (!g_option_nolinenum) {
167167 check_obj_space(1);
168168 g_object[g_objpos++]=0x34160000|g_line; //ori s6,zero,xxxx;
169169 }
--- a/mips/zoea/compiler.h
+++ b/mips/zoea/compiler.h
@@ -213,7 +213,7 @@ extern int g_var_mem[ALLOC_BLOCK_NUM];
213213 extern unsigned short g_var_pointer[ALLOC_BLOCK_NUM];
214214 extern unsigned short g_var_size[ALLOC_BLOCK_NUM];
215215 extern char g_temp_area_used;
216-extern char g_nolinenum;
216+extern char g_option_nolinenum;
217217 extern int* g_heap_mem;
218218 extern int g_max_mem;
219219 extern char g_disable_break;
@@ -225,6 +225,8 @@ extern int g_long_name_var_num;
225225 extern char g_music_active;
226226 extern int g_class;
227227 extern int g_compiling_class;
228+extern unsigned char g_num_classes;
229+extern char g_option_fastfield;
228230 extern int g_temp;
229231
230232 /* Prototypes */
@@ -412,13 +414,14 @@ char* interrupt_statement();
412414 #define ERR_NO_INIT (char*)(g_err_str[28])
413415
414416 /* compile data type numbers */
415-#define CMPDATA_RESERVED 0
416-#define CMPDATA_USEVAR 1
417-#define CMPDATA_CLASS 2
418-#define CMPDATA_FIELD 3
419-#define CMPDATA_STATIC 4
420-#define CMPDATA_UNSOLVED 5
421-#define CMPDATA_TEMP 6
417+#define CMPDATA_RESERVED 0
418+#define CMPDATA_USEVAR 1
419+#define CMPDATA_CLASS 2
420+#define CMPDATA_FIELD 3
421+#define CMPDATA_STATIC 4
422+#define CMPDATA_UNSOLVED 5
423+#define CMPDATA_TEMP 6
424+#define CMPDATA_FASTFIELD 7
422425 // Sub types follow
423426 #define CMPTYPE_PUBLIC_FIELD 0
424427 #define CMPTYPE_PRIVATE_FIELD 1
--- a/mips/zoea/debug.c
+++ b/mips/zoea/debug.c
@@ -228,32 +228,28 @@ static const char initext[]=
228228 "#PRINT\n";
229229
230230 static const char bastext[]=
231+"USECLASS CLASS1,CLASS2\n"
232+"OPTION FASTFIELD\n"
231233 "CLS\n"
232-"LABEL TEST_:i=0/0\n"
233-"\n"
234-"\n"
234+"o=new(CLASS1)\n"
235+"o.T1=123\n"
236+"print o.T2()\n"
235237 "\n"
236238 "\n"
237239 "\n"
238240 "\n";
239241
240242 static const char class1text[]=
241-"STATIC T1\n"
242-"useclass CLASS2\n"
243-"method T3\n"
244-" return CLASS2::T2\n"
245-"method T5\n"
246-" return T1\n"
243+"FIELD T1\n"
244+"method T2\n"
245+" return T1+100\n"
247246 "\n"
248247 "\n";
249248
250249 static const char class2text[]=
251-"STATIC T2\n"
252-"useclass CLASS1\n"
253-"method T4\n"
254-" return CLASS1::T1\n"
250+"FIELD T3\n"
255251 "method T6\n"
256-" return T2\n"
252+" return T3+100\n"
257253 "\n"
258254 "\n"
259255 "\n"
--- a/mips/zoea/file.c
+++ b/mips/zoea/file.c
@@ -124,7 +124,8 @@ int compile_and_link_file(char* buff,char* appname){
124124 }
125125
126126 // Option initialization(s)
127- g_nolinenum=0;
127+ g_option_nolinenum=0;
128+ g_option_fastfield=0;
128129
129130 // Compile the file
130131 err=compile_file();
@@ -181,6 +182,7 @@ int compile_and_link_class(char* buff,int class){
181182 int data[2];
182183 unsigned short cwd_id;
183184 int* record;
185+ g_num_classes++;
184186 while(1){
185187 // Begin compiling class
186188 err=begin_compiling_class(class);
@@ -250,7 +252,10 @@ int compile_and_link_class(char* buff,int class){
250252
251253 int compile_and_link_main_file(char* buff,char* appname){
252254 int i;
255+ // Reset parameters
253256 g_compiling_class=0;
257+ g_num_classes=0;
258+ // Compile the file
254259 i=compile_and_link_file(buff,appname);
255260 if (i) return i;
256261 return 0;
--- a/mips/zoea/globalvars.c
+++ b/mips/zoea/globalvars.c
@@ -56,7 +56,7 @@ unsigned short g_var_size[ALLOC_BLOCK_NUM];
5656 char g_temp_area_used;
5757
5858 // Flag to use option nolinenum
59-char g_nolinenum;
59+char g_option_nolinenum;
6060
6161 // Heap area
6262 int* g_heap_mem;
@@ -88,8 +88,12 @@ char g_music_active;
8888
8989 // Class name being compiled
9090 int g_class;
91-// Flag to compile class file
91+// Flag (and class name) to compile class file
9292 int g_compiling_class;
93+// Number of classes used
94+unsigned char g_num_classes;
95+// OPTION FASTFIELD
96+char g_option_fastfield;
9397
9498 // General purpose integer used for asigning value with pointer
9599 int g_temp;
--- a/mips/zoea/help.txt
+++ b/mips/zoea/help.txt
@@ -10,13 +10,17 @@ A-Zの26個の整数型変数が利用可能です。文字列として扱
1010 述します。ただし、A(整数型)とA$(文字列型)を同時に使用することは出来ま
1111 せん。
1212
13+USEVARなどのステートメントで指定すると、6文字までの長い名前の変数を使用出
14+来ます。名前の最初の一文字は英字(A-Z)とアンダースコアー(_)で、二文字目から
15+はそれらに加えて数字(0-9)も使う事が出来ます。
16+
1317 整数型の定数は、10進法で記述します。16進法を使う場合、「$1200」のよう
1418 に、頭に「$」を付加するか、「0x1200」の様に表記して下さい。
1519
1620 文字列型の定数は、「"」で囲って記述してください。「"」を使用する場合は、
1721 「CHR$($22)」のように記述することが出来ます。
1822
19-<命令>
23+<一般命令>
2024 以下、x, y, z等は整数値を、x$, y$, z$は文字列を、x#, y#, z#は浮動
2125 小数点型実数値を指します。xxx, yyy, zzz, www等は任意のステートメントを
2226 指します。[ ]は省略可能である事を示します。
@@ -81,9 +85,6 @@ GOSUB xxx [, yyy [, zzz [, ... ]]]
8185 等は、サブルーチンに引き継がれる引数(ARGS()関数を参照)。
8286 GOTO xxx
8387 xxx行目(もしくはラベル)に移動する。
84-IDLE
85- アイドルモード("wait"アセンブリー)に入る。ビデオ信号作製やタイマーなどの割
86- り込みがかかるまで、CPUが停止する。
8788 IF xまたはx# THEN yyy [ ELSE zzz ]
8889 xが0以外のとき、yyyを、0のときzzzを実行。yyyおよびzzzは、複数のステート
8990 メントを「:」で挟んで記述可能。
@@ -106,16 +107,16 @@ LABEL xxx
106107 [LET] x$=yyy
107108 yyyで示された文字列(もしくは連結結果;連結演算子は「+」)を、x$に
108109 代入する。「LET」は省略可。
109-MUSIC x$
110- BGMを演奏する。詳細は、下記<MUSIC>の項を参照。
111-OPTION x[,y[,z ... ]]]
112- 各種オプションを指定する。オプションについては、下記<オプション>の項を参照。
110+MUSIC x$[,y]
111+ BGMを演奏する。詳細は、下記<MUSIC>の項を参照。Type Mでは、y=1の時右側だけ、
112+ y=2の時左側だけ、y=3もしくは省略した場合に両方から音が出る。
113113 PLAYWAVE x$[,y]
114114 音楽用のWAVEファイル(ファイル名をx$で指定)を演奏する。WAVEのフォーマットは、
115- ステレオもしくはモノラル、ビット長は8、サンプリング周波数が15700 Hzの物を
116- 指定する。16000 Hzでも再生出来るが、音程と再生速度が少しずれる。yを指定した
117- 場合、指定の箇所から再生される(1秒目から再生したい場合は、15700を指定)。
118- x$に長さ0の文字列を指定すると、現在再生中の音楽が停止する。
115+ Type Mの場合はステレオもしくはモノラル(Type Zではモノラルのみ)、ビット長
116+ は8、サンプリング周波数が15700 Hzの物を指定する。16000 Hzでも再生出来るが、
117+ 音程と再生速度が少しずれる。yを指定した場合、指定の箇所から再生される(1秒
118+ 目から再生したい場合は、15700を指定)。x$に長さ0の文字列を指定すると、現在
119+ 再生中の音楽が停止する。
119120 PALETTE n,r,g,b
120121 パレット指定。
121122 PCG x,y,z
@@ -123,10 +124,10 @@ PCG x,y,z
123124 ターデーター。詳細は、下記<PCG>の項を参照。
124125 POKE x,y
125126 xで示される物理的アドレスに、yで示される値(1バイト値)を書き込む。
126-PEEK16(x)
127+PEEK16 x,y
127128 xで示される物理アドレスに、yで示される値(16ビット値)を書き込む。xが奇数値の
128129 場合、例外停止するので注意。
129-PEEK32(x)
130+PEEK32 x,y
130131 xで示される物理アドレスに、yで示される値(32ビット値)を書き込む。xが4の倍数で
131132 無い場合、例外停止するので注意。
132133 PRINT [ xまたはx$またはx# [ ,または; [ yまたはy$またはy# [ ... ]]]]
@@ -144,24 +145,15 @@ RETURN
144145 SCROLL x,y
145146 画面を横方向、もしくは縦方向(斜めも可)に動かす。動かす方向と大きさ
146147 は、x, yでそれぞれ、横方向の移動度、縦方向の移動度として指定する。
147-SOUND xxx
148+SOUND xxx[,y]
148149 効果音を再生する。詳細は、下記<SOUND>の項を参照。xxxは行番号もしく
149- はラベル。
150-SYSTEM x , y
151- 様々なシステム値の設定を行なう。<SYSTEM>の項を参照。
152-USEGRAPHIC [x]
153- グラフィックディスプレイを使用、もしくは使用停止する。x=0で使用停止、
154- x=1, 5, 9で使用、x=2, 6, 10で画面とパレットをクリアーして使用、x=3,7,
155- 11でグラフィック領域を確保するが表示はキャラクターディスプレイのまま。
156- ただし、グラフィックディスプレイ未使用の状態でx=0, 4, 8の場合は、領域
157- を確保する。xを省略した場合は、x=1と同じ。
158- ただし、xの値が0-3の場合はType-Z互換グラフィック、4-7の場合は標準グラ
159- フィック、8-11の場合はワイドグラフィック。
150+ はラベル。Type Mでは、y=1の時右側だけ、y=2の時左側だけ、y=3もしくは
151+ 省略した場合に両方から音が出る。
160152 USEPCG [x]
161153 PCGを使用、もしくは使用停止する。x=0で使用停止、x=1で使用、x=2で
162154 キャラクターをリセットして使用。xを省略した場合は、x=1と同じ。
163155 USEVAR xxx [, yyy [, zzz [, ... ]]]
164- 英数字で最大6文字までの変数名を使用できるようにする。
156+ 英数字とアンダースコアー(_)で最大6文字までの変数名を使用できるようにする。
165157 このステートメント以降でxxx, yyy等の長い変数名が使用可能となる。
166158 VAR xxx [, yyy [, zzz [, ... ]]]
167159 サブルーチン内で使う、ローカル変数を指定する。xxx, yyy等は、A-Zの
@@ -176,107 +168,6 @@ WIDTH x
176168 キャラクターディスプレイの横幅を文字数で指定。xは30、36、40、48、
177169 もしくは80。
178170
179-<グラフィック関連命令>
180-
181-BOXFILL [x1,y1],x2,y2[,c]
182- 座標(x1,y1),(x2,y2)を対角線とするカラーcで塗られた長方形を描画。
183-CIRCLE [x,y],r[,c]
184- 座標(x,y)を中心に、半径r、カラーcの円を描画。
185-CIRCLEFILL [x,y],r[,c]
186- 座標(x,y)を中心に、半径r、カラーcで塗られた円を描画。
187-GCLS
188- 画面クリアー。
189-GCOLOR c
190- それぞれの命令で、cを省略した場合の色を指定。
191-GPALETTE n,r,g,b
192- パレット指定。
193-GPRINT [x,y],c,bc,s$
194- 座標(x,y)にカラーcで文字列s$を表示、bc:背景色(負数の場合背景色指定なし)。
195-LINE [x1,y1],x2,y2[,c]
196- 座標(x1,y1)から(x2,y2)にカラーcで線分を描画。
197-POINT x,y
198- グラフィック現在位置を、設定する。
199-PSET [x,y][,c]
200- 座標(x,y)の位置にカラーcで点を描画。
201-PUTBMP [x,y],m,n,bbb
202- 横m*縦nドットのキャラクター(bbbで指定)を座標(x,y)に表示。
203- サイズm*nの配列bmpに、単純にカラー番号を並べる。
204- ただし、カラーが0の部分は透明色として扱う。ただし、bbbはラベル名もし
205- くは配列へのポインター。
206-(GCOLOR()関数も参照のこと)
207-
208-<ファイル関連命令>
209-FCLOSE [x]
210- ファイルを閉じる。引数(x)がある場合は、そのファイルハンドルで指定されたファ
211- イルを閉じる。
212-FGET x,y
213- バッファー(xに配列として指定)にyバイト読み込む。関数として呼ばれた場合は、
214- 読み込みに成功したバイト数を返す。
215-FILE x
216- アクティブなファイルハンドル(1もしくは2)をxに指定する。
217-FOPEN x$,y$[,z]
218- x$で示される名前のファイルを、y$で示されたモードで開く。同時に開けるファイ
219- ルの数は、2つまで。関数として呼ばれた場合は、ファイルハンドルを返す。y$と
220- しては、次のものが有効。
221- "r" :ファイルを読み込みモードで開く。
222- "r+" :"r"と同じだが書き込みも可能。
223- "w" :ファイルを書き込みモードで開く。同名のファイルが在る場合は、
224- 以前のファイルは消去される。
225- "w+" :"w"と同じだが、読み込みも可能。
226- "a" :ファイルを書き込みモードで開く。同名のファイルが在る場合は、
227- ファイルは消去されず、ファイルの最後尾から書き込まれる。
228- "a+" :"a"と同じだが、読み込みも可能。
229- zには、割り当てたいファイルハンドル(1もしくは2)を指定する。省略した場
230- 合、1が指定される。
231-FPRINT [ xまたはx$またはx# [ ,または; [ yまたはy$またはy# [ ... ]]]]
232- PRINT命令と同じだが、画面ではなくファイルに情報が書き込まれる。
233-FPUT x,y
234- バッファー(xに配列として指定)のyバイト分を書き込む。関数として呼ばれた場合
235- は、書き込みに成功したバイト数を返す。
236-FPUTC x
237- xで示される1バイトのデーターをファイルに書き込む。関数として呼ばれた場合
238- は、書き込みに成功したバイト数(1もしくは0)を返す。
239-FREMOVE x$
240- x$で示される名前のファイルを、SDカードから削除する。関数として呼ばれた場合
241- は、削除に成功したか(0)、失敗したか(-1)を返す。
242-FSEEK x
243- xで示されるファイル位置に移動する。
244-(FEOF(), FGETC(), FINPUT$(), FLEN(), FSEEK()関数も参照のこと)
245-SETDIR x$
246- カレントディレクトリーをx$に移動する。関数として呼ばれた場合、成功すれば0を、
247- エラーが有れば0以外を返す。
248-(FEOF(), FGETC(), FINPUT$(), FLEN(), FSEEK(), GETDIR$()関数も参照のこと)
249-
250-<タイマー及び割り込み関連命令と関数>
251-USETIMER x
252- タイマーを開始する。xはタイマーの速度を、Hzで指定(4以上の値)。
253-
254-TIMER x
255- 現在のタイマー値を32ビット整数(x)で設定する。
256-
257-TIMER()
258- タイマーの現在値を、32ビット整数値として返す。
259-
260-INTERRUPT xxx,yyy[,z1[,z2 ... ]]
261- 割り込みを設定する。xxxは割り込みの種類、yyyは割り込み時のサブルーチンをラベ
262- ルで指定。z1, z2等を指定すると、割り込み用サブルーチンの引数となる。使用可能
263- な割り込みの種類は以下の通り。
264- TIMER
265- タイマー割り込み。タイマー値が1増えるごとに割り込みがかかる。
266- DRAWCOUNT
267- 1/60秒毎の割り込み。
268- KEYS
269- ボタンの押下状態が変化した時。
270- INKEY
271- キーボード押下時。
272- MUSIC
273- 音楽再生の時、最後の音の再生時に割り込み。
274- WAVE
275- WAVEファイル再生終了時。
276-
277-INTERRUPT STOP xxx
278- 割り込みを停止する。xxxは割り込みの種類。
279-
280171 <整数型関数>
281172 以下、x, y, zは整数値を、x$, y$, z$は文字列を指します。[ ]は省略可能である事
282173 を示します。
@@ -297,18 +188,6 @@ CREAD()
297188 DRAWCOUNT()
298189 DRAWCOUNT値を得る。DRAWCOUNTは16ビット整数値で、1/60秒ごとに1ずつ
299190 増える。
300-FEOF()
301- FOPENで開いたファイルの現在のファイル位置が、末端に到達しているかどうか
302- を返す。1で末端に到達、0で未到達。
303-FGETC()
304- FOPENで開いたファイルから1バイト読み込み、整数値として返す。ファイル
305- 末端に到達しているなどで読み込みに失敗した場合、-1を返す。
306-FLEN()
307- FOPENで開いたファイルのファイル長を、バイト数で返す。
308-FSEEK()
309- FOPENで開いたファイルの、現在のファイル位置を返す。
310-GCOLOR(x,y)
311- グラフィック座標(x,y)の表示中パレット番号を返す。
312191 GOSUB(xxx [, y [, z [, ... ]]])
313192 GOSUB命令と同じだが、戻り値(RETURNを参照)を得ることが出来る。xxxは、
314193 ラベルもしくは行番号。。yyy, zzz 等は、サブルーチンに引き継がれる引数(
@@ -354,8 +233,6 @@ SGN(x)
354233 xの符号(-1, 0, または1)を返す。
355234 STRNCMP(x$,y$,z)
356235 2つの文字列のうちz文字分を比較し、結果を返す。同じ文字列の場合は0。
357-SYSTEM(x)
358- 様々なシステム値を、整数値で返す。「<システム変数>」の項を参照。
359236 TVRAM([x])
360237 ビデオRAMのx番目の内容を、バイト値で返す。xを省略した場合、ビデオ
361238 RAMの開始位置の物理アドレスを返す。
@@ -430,13 +307,8 @@ CHR$(x)
430307 xをアスキーコードとする文字を返す。
431308 DEC$(x)
432309 xの値を、10進数の文字列として返す。
433-FINPUT$([x])
434- FOPENで開いたファイルから、xで示された長さの文字列を読み込む。xが省略された
435- 場合は、行の最後まで読み込む(改行コードが含まれる)。
436310 FLOAT$(x#)
437311 実数値x#を、10進数の文字列として返す。
438-GETDIR$()
439- カレントディレクトリーを文字列として返す。
440312 GOSUB$(xxx [, y [, z [, ... ]]])
441313 GOSUB命令と同じだが、戻り値(RETURNを参照)を文字列として得ることが出来る。
442314 xxxは、ラベルもしくは行番号。。yyy, zzz 等は、サブルーチンに引き継がれる引数
@@ -448,8 +320,6 @@ INPUT$()
448320 文字列入力状態になり、入力が終了すると(Enterが押されると)文字列を返す。
449321 SPRINTF$(x$,y#)
450322 x$で示される書式に従って、実数y#の内容を文字列として返す。
451-SYSTEM$(x)
452- 様々なシステム値を、文字列で返す。「<システム変数>」の項を参照。
453323 READ$()
454324 DATA文の後から、一つずつ文字列データーを読み出す。
455325
@@ -545,6 +415,162 @@ x# OR y#
545415 AND
546416 OR
547417
418+<特殊命令・関数>
419+IDLE
420+ アイドルモード("wait"アセンブリー)に入る。ビデオ信号作製やタイマーなどの割
421+ り込みがかかるまで、CPUが停止する。
422+OPTION x[,y[,z ... ]]]
423+ 各種オプションを指定する。オプションについては、下記<オプション>の項を参照。
424+SYSTEM x , y
425+ 様々なシステム値の設定を行なう。<SYSTEM>の項を参照。
426+SYSTEM(x)
427+ 様々なシステム値を、整数値で返す。<システム変数>の項を参照。
428+SYSTEM$(x)
429+ 様々なシステム値を、文字列で返す。<システム変数>の項を参照。
430+
431+<グラフィック関連命令と関数>
432+
433+BOXFILL [x1,y1],x2,y2[,c]
434+ 座標(x1,y1),(x2,y2)を対角線とするカラーcで塗られた長方形を描画。
435+CIRCLE [x,y],r[,c]
436+ 座標(x,y)を中心に、半径r、カラーcの円を描画。
437+CIRCLEFILL [x,y],r[,c]
438+ 座標(x,y)を中心に、半径r、カラーcで塗られた円を描画。
439+GCLS
440+ 画面クリアー。
441+GCOLOR c
442+ それぞれの命令で、cを省略した場合の色を指定。
443+GPALETTE n,r,g,b
444+ パレット指定。
445+GPRINT [x,y],c,bc,s$
446+ 座標(x,y)にカラーcで文字列s$を表示、bc:背景色(負数の場合背景色指定なし)。
447+LINE [x1,y1],x2,y2[,c]
448+ 座標(x1,y1)から(x2,y2)にカラーcで線分を描画。
449+POINT x,y
450+ グラフィック現在位置を、設定する。
451+PSET [x,y][,c]
452+ 座標(x,y)の位置にカラーcで点を描画。
453+PUTBMP [x,y],m,n,bbb
454+ 横m*縦nドットのキャラクター(bbbで指定)を座標(x,y)に表示。
455+ サイズm*nの配列bmpに、単純にカラー番号を並べる。
456+ ただし、カラーが0の部分は透明色として扱う。ただし、bbbはラベル名もし
457+ くは配列へのポインター。
458+USEGRAPHIC [x]
459+Type Mの場合
460+ グラフィックディスプレイを使用、もしくは使用停止する。x=0で使用停止、
461+ x=1, 5, 9で使用、x=2, 6, 10で画面とパレットをクリアーして使用、x=3,7,
462+ 11でグラフィック領域を確保するが表示はキャラクターディスプレイのまま。
463+ ただし、グラフィックディスプレイ未使用の状態でx=0, 4, 8の場合は、領域
464+ を確保する。xを省略した場合は、x=1と同じ。
465+ ただし、xの値が0-3の場合はType-Z互換グラフィック、4-7の場合は標準グラ
466+ フィック、8-11の場合はワイドグラフィック。
467+Type Zの場合
468+ グラフィックディスプレイを使用、もしくは使用停止する。x=0で使用停止、
469+ x=1で使用、x=2で画面とパレットをクリアーして使用、x=3でグラフィック領
470+ 域を確保するが表示はキャラクターディスプレイのまま。ただし、グラフィッ
471+ クディスプレイ未使用の状態でx=0の場合は、領域を確保する。xを省略した場
472+ 合は、x=1と同じ。
473+
474+
475+GCOLOR(x,y)
476+ グラフィック座標(x,y)の表示中パレット番号を返す。
477+
478+<ファイル関連命令と関数>
479+ファイルは、最大2つまで同時に開く事が出来ます。
480+
481+FCLOSE [x]
482+ ファイルを閉じる。引数(x)がある場合は、そのファイルハンドルで指定されたファ
483+ イルを閉じる。
484+FGET x,y
485+ バッファー(xに配列として指定)にyバイト読み込む。関数として呼ばれた場合は、
486+ 読み込みに成功したバイト数を返す。
487+FILE x
488+ アクティブなファイルハンドル(1もしくは2)をxに指定する。
489+FOPEN x$,y$[,z]
490+ x$で示される名前のファイルを、y$で示されたモードで開く。同時に開けるファイ
491+ ルの数は、2つまで。関数として呼ばれた場合は、ファイルハンドルを返す。y$と
492+ しては、次のものが有効。
493+ "r" :ファイルを読み込みモードで開く。
494+ "r+" :"r"と同じだが書き込みも可能。
495+ "w" :ファイルを書き込みモードで開く。同名のファイルが在る場合は、
496+ 以前のファイルは消去される。
497+ "w+" :"w"と同じだが、読み込みも可能。
498+ "a" :ファイルを書き込みモードで開く。同名のファイルが在る場合は、
499+ ファイルは消去されず、ファイルの最後尾から書き込まれる。
500+ "a+" :"a"と同じだが、読み込みも可能。
501+ zには、割り当てたいファイルハンドル(1もしくは2)を指定する。省略した場
502+ 合、1が指定される。
503+FPRINT [ xまたはx$またはx# [ ,または; [ yまたはy$またはy# [ ... ]]]]
504+ PRINT命令と同じだが、画面ではなくファイルに情報が書き込まれる。
505+FPUT x,y
506+ バッファー(xに配列として指定)のyバイト分を書き込む。関数として呼ばれた場合
507+ は、書き込みに成功したバイト数を返す。
508+FPUTC x
509+ xで示される1バイトのデーターをファイルに書き込む。関数として呼ばれた場合
510+ は、書き込みに成功したバイト数(1もしくは0)を返す。
511+FREMOVE x$
512+ x$で示される名前のファイルを、SDカードから削除する。関数として呼ばれた場合
513+ は、削除に成功したか(0)、失敗したか(-1)を返す。
514+FSEEK x
515+ xで示されるファイル位置に移動する。
516+SETDIR x$
517+ カレントディレクトリーをx$に移動する。関数として呼ばれた場合、成功すれば0を、
518+ エラーが有れば0以外を返す。
519+FEOF()
520+ FOPENで開いたファイルの現在のファイル位置が、末端に到達しているかどうか
521+ を返す。1で末端に到達、0で未到達。
522+FGETC()
523+ FOPENで開いたファイルから1バイト読み込み、整数値として返す。ファイル
524+ 末端に到達しているなどで読み込みに失敗した場合、-1を返す。
525+FLEN()
526+ FOPENで開いたファイルのファイル長を、バイト数で返す。
527+FSEEK()
528+ FOPENで開いたファイルの、現在のファイル位置を返す。
529+FINPUT$([x])
530+ FOPENで開いたファイルから、xで示された長さの文字列を読み込む。xが省略された
531+ 場合は、行の最後まで読み込む(改行コードが含まれる)。
532+GETDIR$()
533+ カレントディレクトリーを文字列として返す。
534+
535+<タイマー関連命令と関数>
536+タイマーは、通常タイマーとコアタイマーの2つがあります。通常タイマーは速度の設定
537+や値の変更など出来る、汎用タイマーです。コアタイマーは、CPUクロックと同期した特
538+殊なタイマーで、値を読む事は出来るが設定する事は出来ません。
539+
540+CORETIMER
541+ コアタイマーを用いた割り込みの時期を設定する。コアタイマーの値を変更するわけ
542+ ではない事に注意。
543+USETIMER x
544+ タイマーを開始する。xはタイマーの速度を、μ秒で指定(175769以下の値)。
545+TIMER x
546+ 現在のタイマー値を32ビット整数(x)で設定する。
547+CORETIMER()
548+ 現在のコアタイマーの値を、32ビット整数値として返す。
549+TIMER()
550+ タイマーの現在値を、32ビット整数値として返す。
551+
552+<割り込み命令>
553+INTERRUPT xxx,yyy[,z1[,z2 ... ]]
554+ 割り込みを設定する。xxxは割り込みの種類、yyyは割り込み時のサブルーチンをラベ
555+ ルで指定。z1, z2等を指定すると、割り込み用サブルーチンの引数となる。使用可能
556+ な割り込みの種類は以下の通り。
557+ TIMER
558+ タイマー割り込み。タイマー値が1増えるごとに割り込みがかかる。
559+ DRAWCOUNT
560+ 1/60秒毎の割り込み。
561+ KEYS
562+ ボタンの押下状態が変化した時。
563+ INKEY
564+ キーボード押下時。
565+ MUSIC
566+ 音楽再生の時、最後の音の再生時に割り込み。
567+ WAVE
568+ WAVEファイル再生終了時。
569+ CORETIMER
570+ コアタイマーの値がCORETIMER命令で設定した値と一致した時。
571+INTERRUPT STOP xxx
572+ 割り込みを停止する。xxxは割り込みの種類。
573+
548574 <MUSIC>
549575 MUSIC命令では、BGM用のデーターを文字列で指定します。文字列の書式は、ABC
550576 notationに準拠しています。ただし、すべての記法が使えるわけではありません。
@@ -607,13 +633,15 @@ SYSTEM関数及びSYSTEMステートメントを用いて、各種システム
607633 とが出来ます。
608634
609635 SYSTEM$(0)
610- MachiKania バージョン文字列、"Zoea"を返す。
636+ MachiKania バージョン文字列、"Zoea"等を返す。
611637 SYSTEM$(1)
612- MachiKania バージョン文字列、"1.0"等を返す。
638+ MachiKania バージョン文字列、"1.2"等を返す。
613639 SYSTEM$(2)
614- BASIC バージョン文字列、"KM-1200"等を返す。
640+ BASIC バージョン文字列、"KM-1208"等を返す。
615641 SYSTEM$(3)
616642 現在実行中のHEXファイル名、"ZOEA.HEX"等を返す。
643+SYSTEM(4)
644+ 現在実行中のCPUのクロック周波数を返す。
617645 SYSTEM(20)
618646 キャラクターディスプレイ横幅を返す。
619647 SYSTEM(21)
@@ -657,6 +685,101 @@ SYSTEM(105)
657685 SYSTEM 200,x
658686 ディスプレイの表示を停止(xが0のとき)、もしくは開始(xが0以外の時)する。
659687
688+<入出力命令・関数>
689+入出力機能は、Type Mでのみ使えます。
690+
691+ANALOG(x)
692+ PORTBの下位からxビット目のアナログ入力値(10ビット値;0-1023の値)を返す。但
693+ し、x=16, 17, 18の場合は、PORTE5, 6, 7がそれぞれ指定される。
694+IN(x)
695+ PORTBの下位からxビット目の入力値(1ビット値;1か0)を返す。但し、x=16, 17,
696+ 18の場合は、PORTE5, 6, 7がそれぞれ指定される。入力はPIC内部でプルアップされ
697+ る。
698+IN8H()
699+ PORTBの上位8ビットの入力値(8ビット値)を返す。入力はPIC内部でプルアップされ
700+ る。
701+IN8L()
702+ PORTBの下位8ビットの入力値(8ビット値)を返す。入力はPIC内部でプルアップされ
703+ る。
704+IN16()
705+ PORTBの入力値(16ビット値)を返す。入力はPIC内部でプルアップされる。
706+PWM x[,y[,z]]
707+ PWM出力を行なう。z=1の場合PORTD10に、z=2の場合PORTD11に出力される。zを省略し
708+ た場合は、PORTD10。xにはデューティー比を、0-1000の値で指定する。yはパルスの
709+ 周波数を、Hzで指定する(省略した場合は、1000;有効値は6-95454)。
710+SERIAL x[,y[,z]]
711+ シリアル通信を開始する。xにはボーレートを指定する(シリアル通信の使用を終了す
712+ る場合は、x=0を指定)。y=0の場合パリティ無し、y=1の場合偶数パリティ、y=2の場
713+ 合奇数パリティ、y=3の場合9ビットパリティ無し。yを省略した場合は、y=0と同じ。
714+ zには受信バッファーの文字数を指定する。zを省略した場合、1/60秒の連続受信が
715+ 保証される大きさのバッファーを確保する。
716+SERIALIN([x])
717+ シリアル通信で、一文字受信する。受信が無い場合は、-1を返す。x=1を指定すると、
718+ 受信バッファーの文字数を返す。パリティ有り8ビットの受信の場合は、パリティ
719+ エラーが起きた場合、0x100以上の値を返す。
720+SERIALOUT x
721+ シリアル通信で、一文字送信する。
722+OUT x,y
723+ PORTBの下位からxビット目に、yで示された値(1ビット値;1か0)を出力する。但
724+ し、x=16, 17, 18の場合は、PORTE5, 6, 7がそれぞれ指定される。PORTE5, 6, 7は、
725+ オープンドレイン出力であることに注意。
726+OUT8H x
727+ PORTBの上位8ビットに、xで示された値(8ビット値)を出力する。
728+OUT8L x
729+ PORTBの下位8ビットに、xで示された値(8ビット値)を出力する。
730+OUT16 x
731+ PORTBに、xで示された値(16ビット値)を出力する。
732+I2C [x]
733+ I2C利用をマスターモードで開始する。xは、クロック数をkHz単位で指定(有効値は、
734+ 12-3409)。省略した場合は、X=100。
735+I2CWRITE x[,y[,z[, ... ]]
736+ I2C固定長送信を行なう。xは7ビットのスレーブアドレス。y, z等はオプションの送
737+ 信コードで、バイト値で指定。
738+I2CREAD(x[,y[,z[, ... ]])
739+ I2C固定長送信の後、1バイトの受信を行なう。xは7ビットのスレーブアドレス。y, z
740+ 等はオプションの送信コードで、バイト値で指定。成功した場合に8ビット値を返す。
741+ エラーの場合、-1を返す。
742+I2CWRITEDATA x,y,z1[,z2[,z3...]]
743+ I2C複数バイト送信を行なう。xは7ビットのスレーブアドレス。yは送信する内容を含
744+ むバッファーへのポインター。z1はバッファーのバイト数。z2, z3等はオプションの送
745+ 信コードで、これらのバイト値がまず送信され、続けてバッファーyの内容がz1バイト
746+ に渡って送信される。
747+I2CREADDATA x,y,z1[,z2[,z3...]]
748+ I2C複数バイト受信を行なう。xは7ビットのスレーブアドレス。yは受信する内容を格
749+ 納するバッファーへのポインター。z1は受信するバイト数。z2, z3等はオプションの送
750+ 信コードで、これらのバイト値がまず送信され、続けてz1バイトのデーターを受信して
751+ バッファーyに格納する。
752+I2CERROR()
753+ 直前のI2C送受信でエラーが在った場合に0以外を、なければ0を返す。
754+SPI x[,y[,z1[,z2]]]
755+ SPI利用をマスターモードで開始する。xは、クロック数をkHz単位で指定(有効値は、
756+ 93-47727)。yは、1ワードのビット数を8/16/32で指定(省略した場合は、8)。z1は、
757+ SPIクロックの取り扱い方を指定(省略した場合は、0)。詳細は、下記に。z2は、CS
758+ ラインにどのポートを使用するかを指定する。省略した場合は、0x39(PORTD9)。他の
759+ ポートを使う場合、例えばPORTB5なら0x15、PORTB3なら0x13とする。
760+ z1=0:アイドル時にL、データー変更はLに変化する時(CKP=0,CKE=1)
761+ z1=1:アイドル時にL、データー変更はHに変化する時(CKP=0,CKE=0)
762+ z1=2:アイドル時にH、データー変更はHに変化する時(CKP=1,CKE=1)
763+ z1=3:アイドル時にH、データー変更はLに変化する時(CKP=1,CKE=0)
764+SPIWRITE x[,y[,z[, ... ]]
765+ SPI固定長送信を行なう。x, y, z等は送信コード。
766+SPIREAD([x[,y[,z[, ... ]]])
767+ SPI固定長送信(オプション)の後、1ワードの受信を行ない、返す。x,y,z等は、受信
768+ 前に送信するコード。
769+SPIWRITEDATA x,y[,z1[,z2[,z3...]]]
770+ SPI複数ワード送信を行なう。xは送信する内容を含むバッファーへのポインター。yは
771+ バッファーのワード数。z1,z2,z3等はオプションの送信コードで、これらがまず送信
772+ され、続けてバッファーxの内容がyワードに渡って送信される。
773+SPIREADDATA x,y[,z1[,z2[,z3...]]]
774+ SPI複数ワード受信を行なう。xは受信する内容を格納するバッファーへのポインター。
775+ yは受信するワード数。z1,z2,z3等はオプションの送信コードで、これらがまず送信さ
776+ れ、続けてyワードのデーターを受信してバッファーxに格納する。
777+SPISWAPDATA x,y[,z1[,z2[,z3...]]]
778+ SPI複数ワード送受信を行なう。xは送受信する内容を格納するバッファーへのポイン
779+ ター。yは送受信するワード数。z1,z2,z3等はオプションの送信コードで、これらがま
780+ ず送信される。続けて、バッファーxの内容を送信した後にデーターを受信してバッ
781+ ファーxに格納しなおす動作を、yワードに渡って繰り返す。
782+
660783 <オプション>
661784 OPTIONステートメントを使って、コンパイル時もしくは実行時に色々なオプションを指定
662785 する事が可能です。次のオプションが有ります。
@@ -664,11 +787,16 @@ OPTIONステートメントを使って、コンパイル時もしくは実行
664787 OPTION NOLINENUM
665788 コンパイル時に、行番号を指定する命令を挿入しない。このオプションにより、プロ
666789 グラムサイズを小さくして実行速度を増加する効果が見込める。ただし、エラーが発
667- 生した場合に、どの行でのエラーかは分からなくなる。また、一時領域を使うような
668- 場合(主に文字列操作)は、該当箇所にLABELステートメントを入れること。
790+ 生した場合に、どの行でのエラーかは分からなくなる。
669791
670-<クラス・オブジェクト関連機能>
792+OPTION FASTFIELD
793+ クラスを2つ以上使っている時、パブリックフィールド名の重複がない場合に、
794+ フィールドへのアクセスを高速化する。ただし、存在しないオブジェクトのフィール
795+ ドにアクセスしてもエラーにならない場合があるため、予めBASICコードにエラーが
796+ ない事を確認してから用いる事が望ましい。なお、クラスを一つだけしか使っていな
797+ い場合は、指定しなくてもこのオプションは有効になっている。
671798
799+<クラス・オブジェクト関連機能>
672800 クラスとオブジェクトの利用方法について、詳しくはclass.txtを参照して下さい。
673801 以下は、関連する命令と関数です。
674802
@@ -693,12 +821,12 @@ NEW(x[,y[,z[, ... ]]])
693821 DELETE x[,y[,z[, ... ]]]
694822 作成されたオブジェクトを破棄する。x,y,z等は、オブジェクトを格納する変数名。
695823 CALL x
696- xで指定されたオブジェクトのメソッドを呼び出す。
824+ xで指定されたオブジェクトのメソッドを呼び出す。「CALL」は省略可。
697825
698826 <ヒント>
699-KM-1207以降、FOR-NEXTループ、WHILE-WENDループ、DO-LOOPループの途中で、
827+MachiKania ver 1.2 以降、FOR-NEXTループ、WHILE-WENDループ、DO-LOOPループの途中で、
700828 RETURN文が使えるようになりました。ただし、GOTO文でループの外に飛ぶと、予期せぬ結
701-果(機器のリセット等)を引き起こします。ただし、GOSUB文でサブルーチンを呼んだり、別の
829+果(機器のリセット等)を引き起こします。また、GOSUB文でサブルーチンを呼んだり、別の
702830 ループをネストして使う事は可能です。
703831
704832 ON GOTO分やON GOSUB文はサポートしていません。ただし、例えば次のように記述す
@@ -716,8 +844,10 @@ ON GOTO分やON GOSUB文はサポートしていません。ただし、例え
716844
717845 <バージョン履歴>
718846 ・KM-1208 2019年?月公開。
719- ・タイマー機能(USETIMER,TIMERステートメントとTIMER()関数)を追加。
847+ ・タイマー機能(USETIMER,TIMER, CORETIMERステートメントとTIMER(), CORETIMER()関
848+  数)を追加。
720849  ・割り込み機能(INTERRUPTステートメント)を追加。
850+ ・オプション機能(OPTIONステートメント)を追加。
721851  ・アイドル機能(IDLEステートメント)を追加。
722852 ・KM-1207 2019年3月公開。
723853  ・PUTBMPの第5引数に長い名前の変数が使えなかったバグの修正
--- a/mips/zoea/statement.c
+++ b/mips/zoea/statement.c
@@ -1568,7 +1568,9 @@ char* option_statement(){
15681568 while(1){
15691569 next_position();
15701570 if (nextCodeIs("NOLINENUM")) {
1571- g_nolinenum=1;
1571+ g_option_nolinenum=1;
1572+ } else if (nextCodeIs("FASTFIELD")) {
1573+ g_option_fastfield=1;
15721574 } else {
15731575 return ERR_SYNTAX;
15741576 }