BASIC compiler/interpreter for PIC32MX/MZ-80K
修訂 | bbe0f316f5abe78d24138d9a0e865d67dd4f20fc (tree) |
---|---|
時間 | 2019-04-15 14:01:51 |
作者 | Katsumi <kmorimatsu@sour...> |
Commiter | Katsumi |
Update help.txt. Fast Field for Zoea/Protozoea.
@@ -789,6 +789,13 @@ OPTION NOLINENUM | ||
789 | 789 | グラムサイズを小さくして実行速度を増加する効果が見込める。ただし、エラーが発 |
790 | 790 | 生した場合に、どの行でのエラーかは分からなくなる。 |
791 | 791 | |
792 | +OPTION FASTFIELD | |
793 | + クラスを2つ以上使っている時、パブリックフィールド名の重複がない場合に、 | |
794 | + フィールドへのアクセスを高速化する。ただし、存在しないオブジェクトのフィール | |
795 | + ドにアクセスしてもエラーにならない場合があるため、予めBASICコードにエラーが | |
796 | + ない事を確認してから用いる事が望ましい。なお、クラスを一つだけしか使っていな | |
797 | + い場合は、指定しなくてもこのオプションは有効になっている。 | |
798 | + | |
792 | 799 | <クラス・オブジェクト関連機能> |
793 | 800 | クラスとオブジェクトの利用方法について、詳しくはclass.txtを参照して下さい。 |
794 | 801 | 以下は、関連する命令と関数です。 |
@@ -33,6 +33,14 @@ static int* g_class_structure; | ||
33 | 33 | record[1]: field/method name as integer |
34 | 34 | record[2]: pointer to method |
35 | 35 | */ |
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 | +*/ | |
36 | 44 | |
37 | 45 | /* |
38 | 46 | CMPDATA_STATIC structure |
@@ -62,6 +70,24 @@ static int* g_class_structure; | ||
62 | 70 | */ |
63 | 71 | |
64 | 72 | /* |
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 | +/* | |
65 | 91 | Local prototyping |
66 | 92 | */ |
67 | 93 | char* obj_method(int method); |
@@ -259,10 +285,36 @@ char* construct_class_structure(int class){ | ||
259 | 285 | |
260 | 286 | void delete_cmpdata_for_class(int class){ |
261 | 287 | int* record; |
288 | + int i; | |
289 | + short pos; | |
262 | 290 | // Delete field/method data |
263 | 291 | cmpdata_reset(); |
292 | + pos=0; // # of position of public field | |
264 | 293 | 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 | + } | |
266 | 318 | cmpdata_reset(); |
267 | 319 | } |
268 | 320 | // Delete longvar data |
@@ -488,6 +540,8 @@ char* _obj_field(char mode){ | ||
488 | 540 | // $v0 contains the address of object. |
489 | 541 | int i; |
490 | 542 | char* err; |
543 | + int* record; | |
544 | + char fastfield; | |
491 | 545 | do { |
492 | 546 | i=check_var_name(); |
493 | 547 | if (i<65536) return ERR_SYNTAX; |
@@ -506,11 +560,38 @@ char* _obj_field(char mode){ | ||
506 | 560 | // This is a string field. Raise 31st bit. |
507 | 561 | i|=0x80000000; |
508 | 562 | } |
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 | + } | |
514 | 595 | // Check if "." follows |
515 | 596 | if (g_source[g_srcpos]=='.') { |
516 | 597 | // "." found. $v0 is adress of an object. See the field. |
@@ -56,9 +56,6 @@ METHOD命令で宣言されたメソッドは、すべてパブリックです | ||
56 | 56 | メソッドが指定された場合、オブジェクト作成時に、このメソッドが呼ばれます。INIT |
57 | 57 | メソッドに引数を与える事も可能です(引数は必須ではありません)。 |
58 | 58 | |
59 | -クラス中でオブジェクトへのポインターが必要な場合は、ARGS(-2)で取り出す事が出来 | |
60 | -ます。 | |
61 | - | |
62 | 59 | 記述例(CLASS1.BASの名前で保存): |
63 | 60 | FIELD PUBLIC TEST1,TEST2 |
64 | 61 | FIELD PRIVATE TEST3 |
@@ -163,7 +163,7 @@ char* compile_line(void){ | ||
163 | 163 | printstr(resolve_label(g_line)); |
164 | 164 | return ERR_MULTIPLE_LABEL; |
165 | 165 | } |
166 | - if (!g_nolinenum) { | |
166 | + if (!g_option_nolinenum) { | |
167 | 167 | check_obj_space(1); |
168 | 168 | g_object[g_objpos++]=0x34160000|g_line; //ori s6,zero,xxxx; |
169 | 169 | } |
@@ -213,7 +213,7 @@ extern int g_var_mem[ALLOC_BLOCK_NUM]; | ||
213 | 213 | extern unsigned short g_var_pointer[ALLOC_BLOCK_NUM]; |
214 | 214 | extern unsigned short g_var_size[ALLOC_BLOCK_NUM]; |
215 | 215 | extern char g_temp_area_used; |
216 | -extern char g_nolinenum; | |
216 | +extern char g_option_nolinenum; | |
217 | 217 | extern int* g_heap_mem; |
218 | 218 | extern int g_max_mem; |
219 | 219 | extern char g_disable_break; |
@@ -225,6 +225,8 @@ extern int g_long_name_var_num; | ||
225 | 225 | extern char g_music_active; |
226 | 226 | extern int g_class; |
227 | 227 | extern int g_compiling_class; |
228 | +extern unsigned char g_num_classes; | |
229 | +extern char g_option_fastfield; | |
228 | 230 | extern int g_temp; |
229 | 231 | |
230 | 232 | /* Prototypes */ |
@@ -412,13 +414,14 @@ char* interrupt_statement(); | ||
412 | 414 | #define ERR_NO_INIT (char*)(g_err_str[28]) |
413 | 415 | |
414 | 416 | /* 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 | |
422 | 425 | // Sub types follow |
423 | 426 | #define CMPTYPE_PUBLIC_FIELD 0 |
424 | 427 | #define CMPTYPE_PRIVATE_FIELD 1 |
@@ -228,32 +228,28 @@ static const char initext[]= | ||
228 | 228 | "#PRINT\n"; |
229 | 229 | |
230 | 230 | static const char bastext[]= |
231 | +"USECLASS CLASS1,CLASS2\n" | |
232 | +"OPTION FASTFIELD\n" | |
231 | 233 | "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" | |
235 | 237 | "\n" |
236 | 238 | "\n" |
237 | 239 | "\n" |
238 | 240 | "\n"; |
239 | 241 | |
240 | 242 | 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" | |
247 | 246 | "\n" |
248 | 247 | "\n"; |
249 | 248 | |
250 | 249 | 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" | |
255 | 251 | "method T6\n" |
256 | -" return T2\n" | |
252 | +" return T3+100\n" | |
257 | 253 | "\n" |
258 | 254 | "\n" |
259 | 255 | "\n" |
@@ -124,7 +124,8 @@ int compile_and_link_file(char* buff,char* appname){ | ||
124 | 124 | } |
125 | 125 | |
126 | 126 | // Option initialization(s) |
127 | - g_nolinenum=0; | |
127 | + g_option_nolinenum=0; | |
128 | + g_option_fastfield=0; | |
128 | 129 | |
129 | 130 | // Compile the file |
130 | 131 | err=compile_file(); |
@@ -181,6 +182,7 @@ int compile_and_link_class(char* buff,int class){ | ||
181 | 182 | int data[2]; |
182 | 183 | unsigned short cwd_id; |
183 | 184 | int* record; |
185 | + g_num_classes++; | |
184 | 186 | while(1){ |
185 | 187 | // Begin compiling class |
186 | 188 | err=begin_compiling_class(class); |
@@ -250,7 +252,10 @@ int compile_and_link_class(char* buff,int class){ | ||
250 | 252 | |
251 | 253 | int compile_and_link_main_file(char* buff,char* appname){ |
252 | 254 | int i; |
255 | + // Reset parameters | |
253 | 256 | g_compiling_class=0; |
257 | + g_num_classes=0; | |
258 | + // Compile the file | |
254 | 259 | i=compile_and_link_file(buff,appname); |
255 | 260 | if (i) return i; |
256 | 261 | return 0; |
@@ -56,7 +56,7 @@ unsigned short g_var_size[ALLOC_BLOCK_NUM]; | ||
56 | 56 | char g_temp_area_used; |
57 | 57 | |
58 | 58 | // Flag to use option nolinenum |
59 | -char g_nolinenum; | |
59 | +char g_option_nolinenum; | |
60 | 60 | |
61 | 61 | // Heap area |
62 | 62 | int* g_heap_mem; |
@@ -88,8 +88,12 @@ char g_music_active; | ||
88 | 88 | |
89 | 89 | // Class name being compiled |
90 | 90 | int g_class; |
91 | -// Flag to compile class file | |
91 | +// Flag (and class name) to compile class file | |
92 | 92 | int g_compiling_class; |
93 | +// Number of classes used | |
94 | +unsigned char g_num_classes; | |
95 | +// OPTION FASTFIELD | |
96 | +char g_option_fastfield; | |
93 | 97 | |
94 | 98 | // General purpose integer used for asigning value with pointer |
95 | 99 | int g_temp; |
@@ -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と基本的には同じ。 |
@@ -5,7 +5,7 @@ | ||
5 | 5 | http://hp.vector.co.jp/authors/VA016157/ |
6 | 6 | */ |
7 | 7 | |
8 | -#define SYSVER1 "Protozoa" | |
8 | +#define SYSVER1 "Protozoea" | |
9 | 9 | #define SYSVER2 "1.3" |
10 | 10 | #define BASVER "KM-1208" |
11 | 11 |
@@ -67,6 +67,8 @@ file_039=. | ||
67 | 67 | file_040=. |
68 | 68 | file_041=. |
69 | 69 | file_042=. |
70 | +file_043=. | |
71 | +file_044=. | |
70 | 72 | [GENERATED_FILES] |
71 | 73 | file_000=no |
72 | 74 | file_001=no |
@@ -111,6 +113,8 @@ file_039=no | ||
111 | 113 | file_040=no |
112 | 114 | file_041=no |
113 | 115 | file_042=no |
116 | +file_043=no | |
117 | +file_044=no | |
114 | 118 | [OTHER_FILES] |
115 | 119 | file_000=no |
116 | 120 | file_001=no |
@@ -155,6 +159,8 @@ file_039=no | ||
155 | 159 | file_040=no |
156 | 160 | file_041=yes |
157 | 161 | file_042=yes |
162 | +file_043=yes | |
163 | +file_044=yes | |
158 | 164 | [FILE_INFO] |
159 | 165 | file_000=args.c |
160 | 166 | file_001=class.c |
@@ -199,6 +205,8 @@ file_039=interface\libsdfsio.a | ||
199 | 205 | file_040=App_32MX170F256B.ld |
200 | 206 | file_041=reservednames.js |
201 | 207 | file_042=sharedfiles.js |
208 | +file_043=class.txt | |
209 | +file_044=help.txt | |
202 | 210 | [SUITE_INFO] |
203 | 211 | suite_guid={62D235D8-2DB2-49CD-AF24-5489A6015337} |
204 | 212 | suite_state= |
@@ -1568,7 +1568,9 @@ char* option_statement(){ | ||
1568 | 1568 | while(1){ |
1569 | 1569 | next_position(); |
1570 | 1570 | if (nextCodeIs("NOLINENUM")) { |
1571 | - g_nolinenum=1; | |
1571 | + g_option_nolinenum=1; | |
1572 | + } else if (nextCodeIs("FASTFIELD")) { | |
1573 | + g_option_fastfield=1; | |
1572 | 1574 | } else { |
1573 | 1575 | return ERR_SYNTAX; |
1574 | 1576 | } |
@@ -33,6 +33,14 @@ static int* g_class_structure; | ||
33 | 33 | record[1]: field/method name as integer |
34 | 34 | record[2]: pointer to method |
35 | 35 | */ |
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 | +*/ | |
36 | 44 | |
37 | 45 | /* |
38 | 46 | CMPDATA_STATIC structure |
@@ -62,6 +70,24 @@ static int* g_class_structure; | ||
62 | 70 | */ |
63 | 71 | |
64 | 72 | /* |
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 | +/* | |
65 | 91 | Local prototyping |
66 | 92 | */ |
67 | 93 | char* obj_method(int method); |
@@ -259,10 +285,36 @@ char* construct_class_structure(int class){ | ||
259 | 285 | |
260 | 286 | void delete_cmpdata_for_class(int class){ |
261 | 287 | int* record; |
288 | + int i; | |
289 | + short pos; | |
262 | 290 | // Delete field/method data |
263 | 291 | cmpdata_reset(); |
292 | + pos=0; // # of position of public field | |
264 | 293 | 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 | + } | |
266 | 318 | cmpdata_reset(); |
267 | 319 | } |
268 | 320 | // Delete longvar data |
@@ -488,6 +540,8 @@ char* _obj_field(char mode){ | ||
488 | 540 | // $v0 contains the address of object. |
489 | 541 | int i; |
490 | 542 | char* err; |
543 | + int* record; | |
544 | + char fastfield; | |
491 | 545 | do { |
492 | 546 | i=check_var_name(); |
493 | 547 | if (i<65536) return ERR_SYNTAX; |
@@ -506,11 +560,38 @@ char* _obj_field(char mode){ | ||
506 | 560 | // This is a string field. Raise 31st bit. |
507 | 561 | i|=0x80000000; |
508 | 562 | } |
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 | + } | |
514 | 595 | // Check if "." follows |
515 | 596 | if (g_source[g_srcpos]=='.') { |
516 | 597 | // "." found. $v0 is adress of an object. See the field. |
@@ -56,9 +56,6 @@ METHOD命令で宣言されたメソッドは、すべてパブリックです | ||
56 | 56 | メソッドが指定された場合、オブジェクト作成時に、このメソッドが呼ばれます。INIT |
57 | 57 | メソッドに引数を与える事も可能です(引数は必須ではありません)。 |
58 | 58 | |
59 | -クラス中でオブジェクトへのポインターが必要な場合は、ARGS(-2)で取り出す事が出来 | |
60 | -ます。 | |
61 | - | |
62 | 59 | 記述例(CLASS1.BASの名前で保存): |
63 | 60 | FIELD PUBLIC TEST1,TEST2 |
64 | 61 | FIELD PRIVATE TEST3 |
@@ -163,7 +163,7 @@ char* compile_line(void){ | ||
163 | 163 | printstr(resolve_label(g_line)); |
164 | 164 | return ERR_MULTIPLE_LABEL; |
165 | 165 | } |
166 | - if (!g_nolinenum) { | |
166 | + if (!g_option_nolinenum) { | |
167 | 167 | check_obj_space(1); |
168 | 168 | g_object[g_objpos++]=0x34160000|g_line; //ori s6,zero,xxxx; |
169 | 169 | } |
@@ -213,7 +213,7 @@ extern int g_var_mem[ALLOC_BLOCK_NUM]; | ||
213 | 213 | extern unsigned short g_var_pointer[ALLOC_BLOCK_NUM]; |
214 | 214 | extern unsigned short g_var_size[ALLOC_BLOCK_NUM]; |
215 | 215 | extern char g_temp_area_used; |
216 | -extern char g_nolinenum; | |
216 | +extern char g_option_nolinenum; | |
217 | 217 | extern int* g_heap_mem; |
218 | 218 | extern int g_max_mem; |
219 | 219 | extern char g_disable_break; |
@@ -225,6 +225,8 @@ extern int g_long_name_var_num; | ||
225 | 225 | extern char g_music_active; |
226 | 226 | extern int g_class; |
227 | 227 | extern int g_compiling_class; |
228 | +extern unsigned char g_num_classes; | |
229 | +extern char g_option_fastfield; | |
228 | 230 | extern int g_temp; |
229 | 231 | |
230 | 232 | /* Prototypes */ |
@@ -412,13 +414,14 @@ char* interrupt_statement(); | ||
412 | 414 | #define ERR_NO_INIT (char*)(g_err_str[28]) |
413 | 415 | |
414 | 416 | /* 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 | |
422 | 425 | // Sub types follow |
423 | 426 | #define CMPTYPE_PUBLIC_FIELD 0 |
424 | 427 | #define CMPTYPE_PRIVATE_FIELD 1 |
@@ -228,32 +228,28 @@ static const char initext[]= | ||
228 | 228 | "#PRINT\n"; |
229 | 229 | |
230 | 230 | static const char bastext[]= |
231 | +"USECLASS CLASS1,CLASS2\n" | |
232 | +"OPTION FASTFIELD\n" | |
231 | 233 | "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" | |
235 | 237 | "\n" |
236 | 238 | "\n" |
237 | 239 | "\n" |
238 | 240 | "\n"; |
239 | 241 | |
240 | 242 | 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" | |
247 | 246 | "\n" |
248 | 247 | "\n"; |
249 | 248 | |
250 | 249 | 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" | |
255 | 251 | "method T6\n" |
256 | -" return T2\n" | |
252 | +" return T3+100\n" | |
257 | 253 | "\n" |
258 | 254 | "\n" |
259 | 255 | "\n" |
@@ -124,7 +124,8 @@ int compile_and_link_file(char* buff,char* appname){ | ||
124 | 124 | } |
125 | 125 | |
126 | 126 | // Option initialization(s) |
127 | - g_nolinenum=0; | |
127 | + g_option_nolinenum=0; | |
128 | + g_option_fastfield=0; | |
128 | 129 | |
129 | 130 | // Compile the file |
130 | 131 | err=compile_file(); |
@@ -181,6 +182,7 @@ int compile_and_link_class(char* buff,int class){ | ||
181 | 182 | int data[2]; |
182 | 183 | unsigned short cwd_id; |
183 | 184 | int* record; |
185 | + g_num_classes++; | |
184 | 186 | while(1){ |
185 | 187 | // Begin compiling class |
186 | 188 | err=begin_compiling_class(class); |
@@ -250,7 +252,10 @@ int compile_and_link_class(char* buff,int class){ | ||
250 | 252 | |
251 | 253 | int compile_and_link_main_file(char* buff,char* appname){ |
252 | 254 | int i; |
255 | + // Reset parameters | |
253 | 256 | g_compiling_class=0; |
257 | + g_num_classes=0; | |
258 | + // Compile the file | |
254 | 259 | i=compile_and_link_file(buff,appname); |
255 | 260 | if (i) return i; |
256 | 261 | return 0; |
@@ -56,7 +56,7 @@ unsigned short g_var_size[ALLOC_BLOCK_NUM]; | ||
56 | 56 | char g_temp_area_used; |
57 | 57 | |
58 | 58 | // Flag to use option nolinenum |
59 | -char g_nolinenum; | |
59 | +char g_option_nolinenum; | |
60 | 60 | |
61 | 61 | // Heap area |
62 | 62 | int* g_heap_mem; |
@@ -88,8 +88,12 @@ char g_music_active; | ||
88 | 88 | |
89 | 89 | // Class name being compiled |
90 | 90 | int g_class; |
91 | -// Flag to compile class file | |
91 | +// Flag (and class name) to compile class file | |
92 | 92 | int g_compiling_class; |
93 | +// Number of classes used | |
94 | +unsigned char g_num_classes; | |
95 | +// OPTION FASTFIELD | |
96 | +char g_option_fastfield; | |
93 | 97 | |
94 | 98 | // General purpose integer used for asigning value with pointer |
95 | 99 | int g_temp; |
@@ -10,13 +10,17 @@ A-Zの26個の整数型変数が利用可能です。文字列として扱 | ||
10 | 10 | 述します。ただし、A(整数型)とA$(文字列型)を同時に使用することは出来ま |
11 | 11 | せん。 |
12 | 12 | |
13 | +USEVARなどのステートメントで指定すると、6文字までの長い名前の変数を使用出 | |
14 | +来ます。名前の最初の一文字は英字(A-Z)とアンダースコアー(_)で、二文字目から | |
15 | +はそれらに加えて数字(0-9)も使う事が出来ます。 | |
16 | + | |
13 | 17 | 整数型の定数は、10進法で記述します。16進法を使う場合、「$1200」のよう |
14 | 18 | に、頭に「$」を付加するか、「0x1200」の様に表記して下さい。 |
15 | 19 | |
16 | 20 | 文字列型の定数は、「"」で囲って記述してください。「"」を使用する場合は、 |
17 | 21 | 「CHR$($22)」のように記述することが出来ます。 |
18 | 22 | |
19 | -<命令> | |
23 | +<一般命令> | |
20 | 24 | 以下、x, y, z等は整数値を、x$, y$, z$は文字列を、x#, y#, z#は浮動 |
21 | 25 | 小数点型実数値を指します。xxx, yyy, zzz, www等は任意のステートメントを |
22 | 26 | 指します。[ ]は省略可能である事を示します。 |
@@ -81,9 +85,6 @@ GOSUB xxx [, yyy [, zzz [, ... ]]] | ||
81 | 85 | 等は、サブルーチンに引き継がれる引数(ARGS()関数を参照)。 |
82 | 86 | GOTO xxx |
83 | 87 | xxx行目(もしくはラベル)に移動する。 |
84 | -IDLE | |
85 | - アイドルモード("wait"アセンブリー)に入る。ビデオ信号作製やタイマーなどの割 | |
86 | - り込みがかかるまで、CPUが停止する。 | |
87 | 88 | IF xまたはx# THEN yyy [ ELSE zzz ] |
88 | 89 | xが0以外のとき、yyyを、0のときzzzを実行。yyyおよびzzzは、複数のステート |
89 | 90 | メントを「:」で挟んで記述可能。 |
@@ -106,16 +107,16 @@ LABEL xxx | ||
106 | 107 | [LET] x$=yyy |
107 | 108 | yyyで示された文字列(もしくは連結結果;連結演算子は「+」)を、x$に |
108 | 109 | 代入する。「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もしくは省略した場合に両方から音が出る。 | |
113 | 113 | PLAYWAVE x$[,y] |
114 | 114 | 音楽用の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 | + 再生中の音楽が停止する。 | |
119 | 120 | PALETTE n,r,g,b |
120 | 121 | パレット指定。 |
121 | 122 | PCG x,y,z |
@@ -123,10 +124,10 @@ PCG x,y,z | ||
123 | 124 | ターデーター。詳細は、下記<PCG>の項を参照。 |
124 | 125 | POKE x,y |
125 | 126 | xで示される物理的アドレスに、yで示される値(1バイト値)を書き込む。 |
126 | -PEEK16(x) | |
127 | +PEEK16 x,y | |
127 | 128 | xで示される物理アドレスに、yで示される値(16ビット値)を書き込む。xが奇数値の |
128 | 129 | 場合、例外停止するので注意。 |
129 | -PEEK32(x) | |
130 | +PEEK32 x,y | |
130 | 131 | xで示される物理アドレスに、yで示される値(32ビット値)を書き込む。xが4の倍数で |
131 | 132 | 無い場合、例外停止するので注意。 |
132 | 133 | PRINT [ xまたはx$またはx# [ ,または; [ yまたはy$またはy# [ ... ]]]] |
@@ -144,24 +145,15 @@ RETURN | ||
144 | 145 | SCROLL x,y |
145 | 146 | 画面を横方向、もしくは縦方向(斜めも可)に動かす。動かす方向と大きさ |
146 | 147 | は、x, yでそれぞれ、横方向の移動度、縦方向の移動度として指定する。 |
147 | -SOUND xxx | |
148 | +SOUND xxx[,y] | |
148 | 149 | 効果音を再生する。詳細は、下記<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 | + 省略した場合に両方から音が出る。 | |
160 | 152 | USEPCG [x] |
161 | 153 | PCGを使用、もしくは使用停止する。x=0で使用停止、x=1で使用、x=2で |
162 | 154 | キャラクターをリセットして使用。xを省略した場合は、x=1と同じ。 |
163 | 155 | USEVAR xxx [, yyy [, zzz [, ... ]]] |
164 | - 英数字で最大6文字までの変数名を使用できるようにする。 | |
156 | + 英数字とアンダースコアー(_)で最大6文字までの変数名を使用できるようにする。 | |
165 | 157 | このステートメント以降でxxx, yyy等の長い変数名が使用可能となる。 |
166 | 158 | VAR xxx [, yyy [, zzz [, ... ]]] |
167 | 159 | サブルーチン内で使う、ローカル変数を指定する。xxx, yyy等は、A-Zの |
@@ -176,107 +168,6 @@ WIDTH x | ||
176 | 168 | キャラクターディスプレイの横幅を文字数で指定。xは30、36、40、48、 |
177 | 169 | もしくは80。 |
178 | 170 | |
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 | - | |
280 | 171 | <整数型関数> |
281 | 172 | 以下、x, y, zは整数値を、x$, y$, z$は文字列を指します。[ ]は省略可能である事 |
282 | 173 | を示します。 |
@@ -297,18 +188,6 @@ CREAD() | ||
297 | 188 | DRAWCOUNT() |
298 | 189 | DRAWCOUNT値を得る。DRAWCOUNTは16ビット整数値で、1/60秒ごとに1ずつ |
299 | 190 | 増える。 |
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)の表示中パレット番号を返す。 | |
312 | 191 | GOSUB(xxx [, y [, z [, ... ]]]) |
313 | 192 | GOSUB命令と同じだが、戻り値(RETURNを参照)を得ることが出来る。xxxは、 |
314 | 193 | ラベルもしくは行番号。。yyy, zzz 等は、サブルーチンに引き継がれる引数( |
@@ -354,8 +233,6 @@ SGN(x) | ||
354 | 233 | xの符号(-1, 0, または1)を返す。 |
355 | 234 | STRNCMP(x$,y$,z) |
356 | 235 | 2つの文字列のうちz文字分を比較し、結果を返す。同じ文字列の場合は0。 |
357 | -SYSTEM(x) | |
358 | - 様々なシステム値を、整数値で返す。「<システム変数>」の項を参照。 | |
359 | 236 | TVRAM([x]) |
360 | 237 | ビデオRAMのx番目の内容を、バイト値で返す。xを省略した場合、ビデオ |
361 | 238 | RAMの開始位置の物理アドレスを返す。 |
@@ -430,13 +307,8 @@ CHR$(x) | ||
430 | 307 | xをアスキーコードとする文字を返す。 |
431 | 308 | DEC$(x) |
432 | 309 | xの値を、10進数の文字列として返す。 |
433 | -FINPUT$([x]) | |
434 | - FOPENで開いたファイルから、xで示された長さの文字列を読み込む。xが省略された | |
435 | - 場合は、行の最後まで読み込む(改行コードが含まれる)。 | |
436 | 310 | FLOAT$(x#) |
437 | 311 | 実数値x#を、10進数の文字列として返す。 |
438 | -GETDIR$() | |
439 | - カレントディレクトリーを文字列として返す。 | |
440 | 312 | GOSUB$(xxx [, y [, z [, ... ]]]) |
441 | 313 | GOSUB命令と同じだが、戻り値(RETURNを参照)を文字列として得ることが出来る。 |
442 | 314 | xxxは、ラベルもしくは行番号。。yyy, zzz 等は、サブルーチンに引き継がれる引数 |
@@ -448,8 +320,6 @@ INPUT$() | ||
448 | 320 | 文字列入力状態になり、入力が終了すると(Enterが押されると)文字列を返す。 |
449 | 321 | SPRINTF$(x$,y#) |
450 | 322 | x$で示される書式に従って、実数y#の内容を文字列として返す。 |
451 | -SYSTEM$(x) | |
452 | - 様々なシステム値を、文字列で返す。「<システム変数>」の項を参照。 | |
453 | 323 | READ$() |
454 | 324 | DATA文の後から、一つずつ文字列データーを読み出す。 |
455 | 325 |
@@ -545,6 +415,162 @@ x# OR y# | ||
545 | 415 | AND |
546 | 416 | OR |
547 | 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 | + | |
548 | 574 | <MUSIC> |
549 | 575 | MUSIC命令では、BGM用のデーターを文字列で指定します。文字列の書式は、ABC |
550 | 576 | notationに準拠しています。ただし、すべての記法が使えるわけではありません。 |
@@ -607,13 +633,15 @@ SYSTEM関数及びSYSTEMステートメントを用いて、各種システム | ||
607 | 633 | とが出来ます。 |
608 | 634 | |
609 | 635 | SYSTEM$(0) |
610 | - MachiKania バージョン文字列、"Zoea"を返す。 | |
636 | + MachiKania バージョン文字列、"Zoea"等を返す。 | |
611 | 637 | SYSTEM$(1) |
612 | - MachiKania バージョン文字列、"1.0"等を返す。 | |
638 | + MachiKania バージョン文字列、"1.2"等を返す。 | |
613 | 639 | SYSTEM$(2) |
614 | - BASIC バージョン文字列、"KM-1200"等を返す。 | |
640 | + BASIC バージョン文字列、"KM-1208"等を返す。 | |
615 | 641 | SYSTEM$(3) |
616 | 642 | 現在実行中のHEXファイル名、"ZOEA.HEX"等を返す。 |
643 | +SYSTEM(4) | |
644 | + 現在実行中のCPUのクロック周波数を返す。 | |
617 | 645 | SYSTEM(20) |
618 | 646 | キャラクターディスプレイ横幅を返す。 |
619 | 647 | SYSTEM(21) |
@@ -657,6 +685,101 @@ SYSTEM(105) | ||
657 | 685 | SYSTEM 200,x |
658 | 686 | ディスプレイの表示を停止(xが0のとき)、もしくは開始(xが0以外の時)する。 |
659 | 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 | + | |
660 | 783 | <オプション> |
661 | 784 | OPTIONステートメントを使って、コンパイル時もしくは実行時に色々なオプションを指定 |
662 | 785 | する事が可能です。次のオプションが有ります。 |
@@ -664,11 +787,16 @@ OPTIONステートメントを使って、コンパイル時もしくは実行 | ||
664 | 787 | OPTION NOLINENUM |
665 | 788 | コンパイル時に、行番号を指定する命令を挿入しない。このオプションにより、プロ |
666 | 789 | グラムサイズを小さくして実行速度を増加する効果が見込める。ただし、エラーが発 |
667 | - 生した場合に、どの行でのエラーかは分からなくなる。また、一時領域を使うような | |
668 | - 場合(主に文字列操作)は、該当箇所にLABELステートメントを入れること。 | |
790 | + 生した場合に、どの行でのエラーかは分からなくなる。 | |
669 | 791 | |
670 | -<クラス・オブジェクト関連機能> | |
792 | +OPTION FASTFIELD | |
793 | + クラスを2つ以上使っている時、パブリックフィールド名の重複がない場合に、 | |
794 | + フィールドへのアクセスを高速化する。ただし、存在しないオブジェクトのフィール | |
795 | + ドにアクセスしてもエラーにならない場合があるため、予めBASICコードにエラーが | |
796 | + ない事を確認してから用いる事が望ましい。なお、クラスを一つだけしか使っていな | |
797 | + い場合は、指定しなくてもこのオプションは有効になっている。 | |
671 | 798 | |
799 | +<クラス・オブジェクト関連機能> | |
672 | 800 | クラスとオブジェクトの利用方法について、詳しくはclass.txtを参照して下さい。 |
673 | 801 | 以下は、関連する命令と関数です。 |
674 | 802 |
@@ -693,12 +821,12 @@ NEW(x[,y[,z[, ... ]]]) | ||
693 | 821 | DELETE x[,y[,z[, ... ]]] |
694 | 822 | 作成されたオブジェクトを破棄する。x,y,z等は、オブジェクトを格納する変数名。 |
695 | 823 | CALL x |
696 | - xで指定されたオブジェクトのメソッドを呼び出す。 | |
824 | + xで指定されたオブジェクトのメソッドを呼び出す。「CALL」は省略可。 | |
697 | 825 | |
698 | 826 | <ヒント> |
699 | -KM-1207以降、FOR-NEXTループ、WHILE-WENDループ、DO-LOOPループの途中で、 | |
827 | +MachiKania ver 1.2 以降、FOR-NEXTループ、WHILE-WENDループ、DO-LOOPループの途中で、 | |
700 | 828 | RETURN文が使えるようになりました。ただし、GOTO文でループの外に飛ぶと、予期せぬ結 |
701 | -果(機器のリセット等)を引き起こします。ただし、GOSUB文でサブルーチンを呼んだり、別の | |
829 | +果(機器のリセット等)を引き起こします。また、GOSUB文でサブルーチンを呼んだり、別の | |
702 | 830 | ループをネストして使う事は可能です。 |
703 | 831 | |
704 | 832 | ON GOTO分やON GOSUB文はサポートしていません。ただし、例えば次のように記述す |
@@ -716,8 +844,10 @@ ON GOTO分やON GOSUB文はサポートしていません。ただし、例え | ||
716 | 844 | |
717 | 845 | <バージョン履歴> |
718 | 846 | ・KM-1208 2019年?月公開。 |
719 | - ・タイマー機能(USETIMER,TIMERステートメントとTIMER()関数)を追加。 | |
847 | + ・タイマー機能(USETIMER,TIMER, CORETIMERステートメントとTIMER(), CORETIMER()関 | |
848 | + 数)を追加。 | |
720 | 849 | ・割り込み機能(INTERRUPTステートメント)を追加。 |
850 | + ・オプション機能(OPTIONステートメント)を追加。 | |
721 | 851 | ・アイドル機能(IDLEステートメント)を追加。 |
722 | 852 | ・KM-1207 2019年3月公開。 |
723 | 853 | ・PUTBMPの第5引数に長い名前の変数が使えなかったバグの修正 |
@@ -1568,7 +1568,9 @@ char* option_statement(){ | ||
1568 | 1568 | while(1){ |
1569 | 1569 | next_position(); |
1570 | 1570 | if (nextCodeIs("NOLINENUM")) { |
1571 | - g_nolinenum=1; | |
1571 | + g_option_nolinenum=1; | |
1572 | + } else if (nextCodeIs("FASTFIELD")) { | |
1573 | + g_option_fastfield=1; | |
1572 | 1574 | } else { |
1573 | 1575 | return ERR_SYNTAX; |
1574 | 1576 | } |