NERD HPC 命令一覧
これらの命令は鈴木哲哉著の「タイニーBASICをCで書く」のGNU General Public Licenseプログラム「豊四季タイニーBASIC」の命令を拡張したものです。このプログラムなしにはNERD HPCを完成させることは出来なかったでしょう。本書により自身のアイデアを実現できたこと、この場にて御礼申し上げます。
NERD HCPの画面はテキスト画面とグラフィック画面という2つの画面が重なっており、テキスト画面は主にプログラムの実行結果などを表示し、グラフィック画面は点や線などを描画するのに使われます。命令の名前の冒頭にGが付くものはグラフィック画面に対する命令となっています。
LIST [行番号]
概要: 指定の行番号からプログラムを表示する。
行番号を指定しない場合、全プログラムを表示する。
使用例: 全プログラム・20行目からのプログラムを表示する。
>LIST
>LIST 20
~v1.6.0以降~LIST [行番号|ALL]
概要: 指定の行番号からプログラムを表示する。
矢印の上下で表示行移動。LIST ALLで全行一括で表示。EscでLIST命令モードを抜ける。
使用例: 全プログラムを表示する。
>LIST ALL
NEW
概要: 現在入力されているプログラムを削除する。
一からプログラムを始める場合に使用する。
使用例: プログラムを削除してからプログラムの入力を始める。
>NEW
>10 PRINT 'HELLO, WORLD'
>RUN
RUN
概要: プログラムを実行する。
行番号の順にプログラムを実行する。
使用例: 入力したプログラムを実行する。
>NEW
>10 PRINT 'HELLO, WORLD'
>20 PRINT 2*3
>RUN
PRINT [文字列|#桁数|式][,文字列|#桁数|式...]
概要: 文字列・式の値を表示する。
桁数を指定することで右詰めで表示可能。末尾が[,]だと改行しない。
使用例: 様々なPRINT文。
>PRINT 'HELLO, WORLD'
>PRINT 'Say "ok" to Nakata.'
>LET A=3;LET B=14
>PRINT "PAT=",A,"."B
>PRINT #2,123,#5,456,7890
>PRINT (1+2)/3-4*2
>PRINT 0<1=(A#B)
INPUT [文字列][変数|配列][,[文字列][変数|配列]...]
概要: 端末上で変数に定数を入力する。
入力は数字と符号と改行のキーだけを受け付ける。変数または配列の前に文字列を記述するとそれをプロンプトとして表示する。
使用例: 様々なINPUT文。
>INPUT A,B,@0
>INPUT "YEAR="A
[LET] 変数|配列=式
概要: 変数または配列に式の値を代入する。
LETは省略可能。
使用例: Aに数値や式を代入して表示する。
>LET A=2; PRINT A
>A=A+2; PRINT A
REM [コメント]
概要: 行末までの記述を無効にする。
実行時間はかかるので少し間を置くために使うことがある。
使用例: REMの実行時間を体感する。
>10 REM Delay
>20 FOR D=-32767 TO 32766
>30 REM No operation
>40 REM No operation
>50 NEXT D
IF 式 [文]
概要: 式の値が0以外のとき後ろの文を実行する。
式以外にも定数、変数、配列、関数、計算式も記述可能。
使用例: IF文を使う。論理積や論理和も判定。
>A=16
>IF A> PRINT "A>10"
>IF A PRINT "A#0"
>IF (A>10)*(A<20) PRINT "A>10 AND A<20"
>IF (A>10)+(A<20) PRINT "A>10 OR A<20"
GOTO 式
概要: 式が表す行番号へ分岐する。
1~32767が指定可能。
使用例: 入力した数値によって分岐する。
>10 INPUT "INPUT(1-3):"J
>20 IF (J<1)+(J>3)STOP
>30 GOTO (J+3)*10
>40 PRINT "ONE"; GOTO 10
>50 PRINT "TWO"; GOTO 10
>60 PRINT "THREE, TERMINATE"
GOSUB 式、RETURN
概要: 式が表す行番号のサブルーチンを呼び出す。RETURNはサブルーチンを終了して呼び出し元へ復帰する。
呼び出したサブルーチンから別のサブルーチンを呼び出すのは3重が上限。
使用例: サブルーチンを3回呼び出す。
>10 GOSUB 110; GOSUB 110; GOSUB 110
>20 STOP
>100 REM Subroutine
>110 LET N=N+1
>120 PRINT "Called ",N," times."
>130 RETURN
FOR 変数=開始値TO終了値[STEP増分]、 NEXT 変数
概要: 変数をカウンタにして繰り返す。
3重が上限。上限はファームウェアのカスタマイズで変更可。STEP増分を省略すると1ずつ変数を増やす。変数は-32768~32767の範囲で必要がある(終了の時点で超えてもいけない)。
使用例:
>10 FOR I=2 TO -2 STEP -1
>20 PRINT I
>30 NEXT I
STOP
概要: プログラムの実行を終了する。
メインルーチンに続いてサブルーチンがある場合、メインルーチンとサブルーチンの間にSTOPを置くことで意図しないサブルーチンの実行を防ぐといった使い方ができる。
使用例:
>10 GOSUB 110; GOSUB 110; GOSUB 110
>20 STOP
>100 REM Subroutine
>110 LET N=N+1
>120 PRINT "Called ",N," times."
>130 RETURN
SIZE()
概要: プログラムの保存領域の残りをバイト数で返す。
プログラム上にも記述可能。保存領域の大きさはファームウェアのカスタマイズで変更可。
使用例:
>PRINT SIZE()
ABS(式)
概要: 式の値の絶対値を返す。
全て正の数にする。
使用例:
>PRINT ABS(-30)
RND(式)
概要: 1~式の値の範囲でランダムな値を返す。
式の値は1~32767の範囲でなければならない。
使用例:
>PRINT RND()
CLS
概要: テキスト画面を消去する。
テキスト画面を白で埋め尽くす。
使用例: プログラム実行前に画面を消去する。
10 CLS
20 PRINT 'hello, world'
GCLS
概要: グラフィック画面を消去する。
グラフィック画面を白で埋め尽くす。
使用例: プログラム実行前に画面を消去する。
10 GCLS
20 GPSET 10,20,1
GPSET X座標,Y座標,0|1
概要: X座標、Y座標にドットを打つ
0で白色のドット、1で黒色のドットを打つ。
使用例: 画面にドットを打つ。
10 LET X=64
20 LET Y=48
30 GPSET X,Y,1
(調整中)GPLAYNM "ファイル名"
概要: NERD Movieファイル(後述)を再生する。
NERD Movieファイルの仕様: 初めの1byteで横のドット数、次の1byteで縦のドット数を指定する。以降のデータは1bit=1ドットとして左上から右下にかけて画面データを記述する。mp4ファイルからの変換ツールを配信予定。
使用例: .NMファイルを再生する
GPLAYNM "TEST.NM"
GETKEY(index) : index=0~7
概要: 命令実行時に押下しているキーコードを取得する。
8個まで同時押しに対応しており、押下しているキーコードを保存している配列よりindexで指定した番号のキーコードを取得する。キーマトリクス回路上同時押しすると意図しないキーコードに化けるものもあるので注意(修正予定)。
使用例: 押されたキーのキーコードを画面に出力する。
10 A=GETKEY(0)
20 PRINT A
30 GOTO 10
SLEEPMS 定数
概要: ミリ秒処理を待つ。
ミリ秒処理を待つ。
使用例:
SLEEPUS 定数
概要: マイクロ秒処理を待つ。
マイクロ秒処理を待つ。
使用例:
VSYNC
概要: 画面の更新まで待機する。
画面は60fpsで更新されている。
SAVE "ファイル名"
概要: 現在入力されているプログラムをSDカードに保存する。
txtファイル形式にするとPCで読み書きできるので便利。
使用例: txtファイル形式で保存する。
SAVE "SAMPLE.TXT"
LOAD "ファイル名"
概要: SDカードに保存されているプログラムを読み出す。
使用例:
LOAD "SAMPLE.TXT"
+、-、*、/
概要: 加減乗除。
=、#
概要: 一致、不一致。
>=、>、<=、<
概要: 大小関係
-32767~32767
概要: 定数
A~Z
概要: 変数
@(0)~@(31)
概要: 配列
"文字列"、'文字列'
概要: 文字列
,
概要: 引数の区切り
;
概要: 文の区切り
~v1.1.0追加~
GLINE X0座標,Y0座標,X1座標,Y1座標,色(0=白|1=黒)
概要: X0座標、Y0座標からX1座標、Y1座標に線を描画する。
0で白色のドット、1で黒色のドットを打つ。
使用例: 画面に線を描画する。
GLINE 0,0,127,47,1
GCIRCLE X座標,Y座標,半径,色(0=白|1=黒),塗りつぶし(0=塗りつぶさない|1=塗りつぶす)
概要: 指定のX座標、Y座標に円を描画する。
0で白色のドット、1で黒色のドットを打つ。
使用例: 画面に円を描画する。
GCIRCLE 64,24,5,1,0
GCIRCLE 10,24,5,1,1
~v1.2.0追加~
PLYSND 周波数,ミリ秒
概要: 指定の周波数の音を出す。
ミリ秒を0にすると音を鳴らし続ける
使用例: ドレミファソラシドを鳴らす。
10 PLYSND 262,1000
20 PLYSND 294,1000
30 PLYSND 330,1000
40 PLYSND 349,1000
50 PLYSND 392,1000
60 PLYSND 440,1000
70 PLYSND 494,1000
80 PLYSND 523,1000
STPSND 周波数,ミリ秒
概要: 現在鳴っている音を止める。
PLYSNDでミリ秒を0に指定し、鳴らし続けた音を止めるのに有効
使用例: 1秒間音を鳴らす。
10 PLYSND 262,1000
20 STPSND
~v1.3.0追加~
GRECT X0座標,Y0座標,X1座標,Y1座標,色(0=白|1=黒),塗りつぶし(0=塗りつぶさない|1=塗りつぶす)
概要: 画面に四角を描画する
0で白色のドット、1で黒色のドットを打つ。
使用例: 四角を描画する
GRECT 10,20,30,40,1,0
GRECT 50,20,80,40,1,1
~v1.4.0追加~
IOSD IO番号(1~4),入出力(0=出力|1=入力)
概要: IO1~4を入力または出力に設定する。
IOPUT, IOGETを使用する前に一度設定する必要あり。
使用例: IOPUT, IOGETを使用する前に入出力を設定する。
IOSD 1,0
IOPUT 1,1
IOSD 1,1
IOPU 1
PRINT IOGET(1)
IOPU IO番号(1~4)
概要: IO1~4に対し内蔵プルアップ抵抗を有効にする。
プルアップ抵抗を有効にすることでHi,Loどちらも入力されていないときの入力が安定する。
使用例: IOGETを使用する前に内蔵プルアップ抵抗を有効にする。
IOSD 1,1
IOPU 1
PRINT IOGET(1)
IOPD IO番号(1~4)
概要: IO1~4に対し内蔵プルダウン抵抗を有効にする。
プルダウン抵抗を有効にすることでHi,Loどちらも入力されていないときの入力が安定する。
使用例: IOGETを使用する前に内蔵プルダウン抵抗を有効にする。
IOSD 1,1
IOPD 1
PRINT IOGET(1)
IODP IO番号(1~4)
概要: IO1~4に対し内蔵プルアップ・プルダウン抵抗を無効にする。
内蔵プルアップ・プルダウン抵抗を無効にする。
使用例: IO1の内蔵プルアップ・プルダウン抵抗を無効にする。
IOPD 1
IOPUT IO番号(1~4),出力(0=0v|1=3.3v)
概要: IO1~4の電圧を変更する。
ショートさせないように注意。
使用例: IO1の出力を3.3vに変更する。
IOSD 1,0
IOPUT 1,1
IOGET(IO番号)
概要: IO1~4に0vが入力されているか3.3vが入力されているか判定する。
0=0v,1=3.3v
使用例: IO1~4の状態を表示する。
10 GCLS
20 CLS
30 IOSD 1,1
40 IOSD 2,1
50 IOSD 3,1
60 IOSD 4,1
70 IOPU 1
80 IOPU 2
90 IOPU 3
100 IOPU 4
110 CLS
120 PRINT IOGET(1),IOGET(2),IOGET(3),IOGET(4)
130 SLEEPMS 100
140 GOTO 110
~v1.5.0追加~
GKOPT Shift有効(0=無効|1=有効),Esc有効(0=無効|1=有効)
概要: GETKEYで得られるキーコードにShiftを押した状態を加味するか設定する。プログラム動作中にEscによるプログラムの中断を有効にするか設定する。
Shiftが有効だと、Shift+aを押した際にGETKEYでAのキーコードが得られる。Shiftが無効だと、Shift+aを押した際にGETKEYでaのキーコードが得られる。Escを無効にすることでEscを使うプログラムでプログラムが中断しないようにできる。デフォルトだとShiftもEscも有効。
SNDKCD HIDキーコード1,HIDキーコード2,HIDキーコード3,HIDキーコード4,HIDキーコード5,HIDキーコード6,
概要: パソコンに指定のHIDキーコードを送る。
同時に6つまでHIDキーコードを送れる。
使用例: NERD HPCをキーボードとして動作させる。
10 CLS
20 GCLS
30 GKOPT 0,0
40 FOR I=0 TO 5
50 A=0
60 @(I)=GETKEY(I)
70 IF (97<=@(I))*(@(I)<=122) A=@(I)-93; REM a~z
80 IF (49<=@(I))*(@(I)<=57) A=@(I)-19; REM 1~9
90 IF @(I)=48 A=39; REM 0
100 IF @(I)=45 A=45; REM _/-
110 IF @(I)=61 A=46; REM +/=
120 IF @(I)=96 A=53; REM ~/`
130 IF @(I)=91 A=47; REM {/[
140 IF @(I)=93 A=48; REM {/[
150 IF @(I)=92 A=49; REM |/\
160 IF @(I)=59 A=51; REM :/;
170 IF @(I)=39 A=52; REM "/'
180 IF @(I)=44 A=54; REM </,
190 IF @(I)=46 A=55; REM >/,
200 IF @(I)=47 A=56; REM ?//
210 IF @(I)=249 A=79; REM right
220 IF @(I)=250 A=80; REM left
230 IF @(I)=251 A=81; REM down
240 IF @(I)=252 A=82; REM up
250 IF @(I)=14 A=225; REM L-Shift
260 IF @(I)=15 A=229; REM R-Shift
270 IF @(I)=13 A=40; REM Enter
280 IF @(I)=9 A=43; REM Tab
290 IF @(I)=27 A=41; REM Esc
300 IF @(I)=254 A=57; REM Caps
310 IF @(I)=32 A=44; REM Space
320 IF @(I)=247 A=224; REM L-Ctrl
330 IF @(I)=248 A=230; REM R-Alt
340 IF @(I)=8 A=42; REM BS
350 IF @(I)=246 A=73; REM Ins
360 IF @(I)=245 A=227; REM NERD
370 @(I)=A
380 NEXT I
390 SNDKCD @(0),@(1),@(2),@(3),@(4),@(5)
400 GOTO 40