WICS (Integer Interpreter and Compiler System) クイックリファレンス 変数,配列,式の定義 変数 変数は英字で始まり、英数字からなる任意の文字列です。 変数名の長さに制限はありません。また、変数名は全文字を識別します。 ただし、予約語で始まる文字列は変数とはみなしません。 変数は -32768〜+32767までの整数値をとることができます。 配列 配列は、通常のBASICのDIM文と異なり、ユーザーがメモリのフリーエリア上に 指定するようになっています。 1) 2バイト配列 変数名(式) : 例) A(10) 2バイト配列は(変数の内容+式の値*2)のメモリ番地の2バイト分の値に対応します。 A=$8000(Aという変数の値を$8000にする)として、 B=A(0) というのは、$8000,$8001番地の内容(正確には[$8000]+[$8001]*256)をBに代入 することを意味します。 A(1)=100 というのは、$8002,$8003番地のないように100を書き込むことを意味します。 2) 1バイト配列 変数名[式] : 例) C[5] 1バイト配列は(変数の内容+式の値)のメモリ番地の1バイトの値に対応します。 C=$D000として、 C[5]=10 というのは、$D005番地に10を書き込むことを意味します。 1バイト配列に対して255以上の整数を代入しようとすると、上位バイトが無視 されます。 3) 2バイト自動インクリメント [<変数>++]=<式> 2バイト配列、変数名(0)=<式>を行ったあと、その変数を+2します。 逆に[<変数名>++]という項の右辺に書いたときは2バイト配列変数名(0)の値が 評価されて、その直後にその変数が+2されます。 例) [A++]=B → A(0)=B : A=A+2 D=[E++] → D=E(0) : E=E+2 4) 1バイト自動インクリメント [<変数>+]=<式> 参照配列が1バイト型になり、参照後、その変数が+1されることを除けば2バイト 自動インクリメントと同じです。 例) [A+]=B → A[0]=B : A=A+1 D=[E+] → D=E[0] : E=E+1 定数 1) 10進定数 : -32768〜32767の範囲の整数 2) 16進定数 : $0000〜$FFFF 3) 文字定数 : "A"のようにダブルクォーテーションでくくられた1文字 項 変数,配列,定数のどれも項になることができます。 また、関数も式の中では見かけ上、項として扱われます。 式 <式> : <項> [<演算子> <項>] 式は、項と2項演算子より成り立っています。 2項演算子を、優先順位の低い順に示します。 1. 不等号,等号 : >=,=<,<=,=<,=,<>,<,> 2. 加減算 : +,-,OR 3. 乗除算 : *,/,AND,XOR ()「かっこ」を含む場合は、()の中が最優先されます。 等号,不等号演算子は、左項<演算子>右項 が成立すればその値は 1 (真) で、 不成立の場合は 0 (偽) の値をとります。 OR,AND,XORは、左項と右項の値を16ビットの2進数値とみなして、各ビットごとに OR,AND,XORをそれぞれ行い、16ビットにまとめて値とするものです。 コマンド コマンドはインタープリタモードでしか使用できません。 RUN [<行番号>] インタープリタプログラムを実行します。 行番号を省略すると CLRを実行したのち、プログラムのはじめから実行を開始します。 行番号をつけると、CLRを実行せずに、指定された行番号からプログラムを実行します。 LIST [<行番号>][,][<行番号>] プログラムを表示します。 LIST 全行表示 LIST m m行のみ表示 LIST m, m行以下表示 LIST m,n m行よりn行まで表示 LIST ,n 先頭よりn行まで表示 LIST実行中、SPACEキーを押している間表示を一時停止します。 また、BREAKキーの入力で表示を中断します。 DELETE <行番号>,<行番号> 指定された範囲のプログラムを削除します。 VLIST 使用された変数名とその値をすべて表示します。 表示中、SPACEキーを押している間表示を一時停止します。 また、BREAKキーの入力で表示を中断します。 NEW プログラムを消去します。 LOAD ["<ファイル名>"] テープに記録されているWICSのソースプログラムをTEXTエリアにロードします。 SAVE ["<ファイル名>"] TEXTエリアにあるWICSのソースプログラムをテープにセーブします。 VERIFY ["ファイル名"] テープに記録されているWICSのソースプログラムと、TEXTエリアにあるプログラムを 比較します。 SYSTEM 現在、TEXTの格納されている先頭番地,終了番地,メモリエンドを表示します。 APPEND ["<ファイル名>"] テープに記録されているWICSのソースプログラムを、TEXTエリアにあるプログラムに アペンドします。 ただし、元のプログラムも、アペンドしたプログラムも行番号は変化せず、 そのままなので注意してください。 LIMIT <番地> TEXTの格納される番地の上限を指定します。 番地は、$のあとに4桁の16進数を書きます。 TEXT <番地> TEXTの格納される先頭番地を指定します。 番地は、$のあとに4桁の16進数を書きます。 CLR 変数をすべてクリアします。 ステートメント IF <式> THEN <文> FOR <変数> = <初期値> TO <最終値> [STEP <変化幅>] 繰り返すプログラム NEXT [<変数>] REPEAT 繰り返すプログラム UNTIL <式> ON <式> GOTO <行番号1>,[<行番号2>,…,<行番号n>] ON <式> GOSUB <行番号1>,[<行番号2>,…,<行番号n>] GOTO <行番号> GOSUB <行番号> RETURN REM PRINT 1) / 改行する 2) "文字列" 文字列を出力 3) 式 式の値を定められた文字スペースで右づめ出力する 4) #2 式 式の値を16進2桁で出力 5) #4 式 式の値を16進4桁で出力 6) & 式 式の値のASCII文字を出力(1文字) 7) ! 式 式で示される番地に格納されている文字列を$0Dまで出力 8) % 式 文字スペースを式の値に定める 9) + 式 式の値を0〜65535までの10進数で出力する 以上の書式は「,」(コンマ)で区切れば、いくつでも並べることができます。 INPUT <変数名>[,<変数名>…] STOP END MON ランタイムパッケージ内のマシン語モニタ BYE ROMモニタ CALL <式> PUSH <式>[,<式>…] POP <変数名>[,<変数名>…] OUT ,<式> CURSOR <式1>,<式2> POKE <式1>,<式2> CURH <式1> CURV <式1> LINPUT <式> 1行入力を行い、入力された行の文字を式で指定されるアドレスに格納。 文字列の最後には$0Dが格納。 STA$(<式>,<"文字列">) 式のアドレスに文字列をASCIIコードで格納。 SPOKE <式X>,<式Y>,<式Z> 画面上のX,Yの位置にディスプレイコードZのキャラクタを書き込みます。 BELL MUSIC <"音楽データ"> SOUND <式1> 式の分周比の音を出力します。 音を止めるときはSOUND 0を実行します。 TEMPO <式> PRMODE <式> 0 : CRTのみ出力 1 : プリンタのみ出力 2 : 同時出力 PLOT <式X>,<式Y>,<式M> 式M 0 : リセット 1 : セット 2 : 反転 PUT@,,,,<式A> 画面上のX1,Y1とX2,Y2を頂点とする長方形に、式Aのアドレスから格納されている ディスプレイコードを書き込む。 GET@,,,,<式A> 画面上のX1,Y1とX2,Y2を頂点とする長方形のディスプレイコードを、 式Aのアドレスに格納する。 関数 GET INKEY MOD(<式1>,<式2>) ABS(<式>) RND(<式>) 1〜式の値までの乱数値 SGN(<式>) INP(<式>) ADRS(<変数>) 変数の格納されているアドレスを値とします。 PEEK(<式>) INC(<変数>) DEC(<変数>) USR(<式1>,<式2>) 式2の値をHLレジスタに代入した後に、式1のアドレスのマシン語サブルーチンをコールします。 リターン時のHLレジスタの値を値とします。 マシン語サブルーチンでは、IX,IYレジスタを変化させてはいけません。 SPEEK(<式X>,<式Y>) 画面上のX,Yの位置にあるキャラクタのディスプレイコード CP$(<式1>,<式2>,<式3>) 式1から格納されている文字列と、式2から格納されている文字列を比較します。 式1から格納されている文字列に式3のコードが現れたときに比較を終わります。 一致したとき 1、不一致のとき 0を値とします。 CPI(<式1>,"文字列") 式1から格納されている文字列と、ダブルクォーテーションで囲まれた文字列を比較します。 一致したとき 1、不一致のとき 0を値とします。 TIME 代入も可能。 単位は秒。 SQR(<式>) モニタコマンド WICSはランタイムパッケージの中にマシン語モニタを内蔵しています。 インタプリタからはMONコマンドでモニタに移ります。 ジャンプ Jnnnn セーブ S メモリダンプ Dnnnn SPACEキーを押している間表示を一時停止します。 BREAKキーの入力で表示を中断します。 メモリエディット E 戻る B インタプリタのホットスタート($1203)に戻ります。 コンパイラ 実行すると、 ソースプログラムの開始番地 (通常は$4000) オブジェクトプログラムの格納番地 コンパイラのワークエリアの開始番地 (通常はインタプリタのワーク $3400を指定) を聞いてくるので、それぞれ$をつけて16進数で入力します。 独立型オブジェクト(インタプリタ不要)の生成 オブジェクトプログラムを $1E00から生成し、モニタでセーブする際に$1200から オブジェクトの最終番地までを指定します。 実行アドレスは$1200にします。 メモリマップ $1200 ランタイムルーチン・マシン語モニタ $1C00 PUSH,POPスタック $1E00 インタプリタ本体 $3400 Hashテーブル $3800 ↓変数エリア ↑FOR NEXTスタック $4000 テキストとかオブジェクトとか $B000 コンパイラ $CEFF end of text