仮想ゲームコンソールであなただけのレトロゲームを作ってみよう。プログラムは古典 BASIC 言語で、スプライト、タイルマップ、サウンドとミュージックは付属ツールで作成します。初心者さんはシンプルなテキストゲームの開発方法やスプライトをタイルマップに初めて表示する方法をすぐに理解できるようになります。老練なるプログラマはレトロハードウェアの魔術的潜在能力を完全に引き出せます!
LowRes NX は引き出し可能なタッチスクーンの下部に小型キーボード (キートップはゴム成形)、十字キーと二個の操作ボタンを搭載した携帯型ゲームコンソールであると考えてください。LowRes NX は実在の 8 bit と 16 bit システムに影響を受けているため、グラフィックス、サウンドと I/O チップを疑似処理します。これにより、実在する古典的なハードウェアと同じように動作します。ハードウェア実装のパララックス・スクロールと同様にハードウェア実装のスプライトをサポートしており、さらに垂直帰線消去 (Vertical Blank, V-Blank, VBL) とラスター割り込み機能などによる本物のレトロエフェクトを扱えます。
LowRes NX のプログラミング言語は第二世代の構造化 BASIC をお手本にしたものです。古典的なコマンドはすべて使えますが、行番号はありません。その代わり、ラベル、ループとサブプログラムに対応しています。グラフィックスとサウンドは拡張コマンドでサポートしています。さらに PEEK と POKE で仮想ハードウェアへ直接アクセスすることもできます。プログラムの流れに関する完全な制御ができるため、標準的な更新処理関数の実装は不要です。
LowRes NX には開発に必要なツールがすべて付属しています。Gfx Designer (グラフィックスデザイナー) でスプライト、タイル、フォントとマップの編集を行います。また、 Sound Composer (サウンドコンポーザー) ではミュージックとサウンドの編集を行います。付属のツール全体は BASIC プログラムとして記述されています。変更や改良をするだけでなく、独自のカスタムエディタを開発することも可能です。
仲間にゲームをそのまま送付したり、ウェブサイトで共有してみましょう。プログラム全体はオープンソースであるため、遊ぶ、学ぶ、だけでなく編集ができます。アートやミュージックを作るほうがお好きですか? アセットとして創作物を共有することで、ほかのプログラマがプロジェクトで創作物を使えるようになります。
LowRes NX でデキることを確かめるには付属プログラムを試してみてください。アクションゲーム LowRes Galaxy 2、テキストアドベンチャー LowRes Adventure、そしてデモ Star Scroller を試してみてください。
思う存分遊び終えたら、はじめてのプログラムを作成してみましょう。
以下のプログラムを入力します。
PRINT "ようこそ!" PRINT "あなたの名前は?" INPUT ">";N$ PRINT "こんにちわ ";N$;"!"
このプログラムを実行します。こちらはキーボードを用いた簡単な用例です。ゲームパッドでなにかしてみましょう。もうひとつプログラムを新規作成します。以下を入力します。
GAMEPAD 1 X=76 Y=60 DO IF UP(0) THEN Y=Y-1 IF DOWN(0) THEN Y=Y+1 IF LEFT(0) THEN X=X-1 IF RIGHT(0) THEN X=X+1 SPRITE 0,X,Y,225 WAIT VBL LOOP
このプログラムを実行するとゲームパッドで移動できる "A" の文字がスクリーンに表示されます。
プログラムファイルは完全なゲーム、またはアプリケーション本体であり、関連データ一式も含めた通常のテキスト形式で構成されます。最初の部分は BASIC ソースコードです。詳しい解説はプログラミングの章をお読みください。
第二の部分はカートリッジ ROM エントリです。これらはあらゆる種類のデータを保存できる最大 16 枚の番号付きデータブロックです。例えば、グラフィックス、レベルマップ、ミュージックなどです。プログラムの実行中、 ROM エントリ全体はメモリの先頭 32KB にアクセス可能です。
ツールを使うと手軽に ROM エントリの作成と編集ができます。ツールは標準的な NX プログラムですが、データの編集に特化して作成されています。NX ファイルは「仮想ディスク」としてアクセス可能であり、その ROM エントリはファイルのように扱えます。
ツールには二通りの使いかたがあります。
早速試してみましょう。移動できる "A" ("はじめよう" の章に掲載) のプログラムを開き、 Tools メニューから "Gfx Designer" を選択します。
キャラクタ #1 番 (#0 番は未使用のままにしてください) に何か描いた後、 "File" をタップしてファイル 2 ("主人公") としてセーブしてください。さて、ソースコードエディタに戻るとプログラムの下部に十六進数データが表示されていると思います。これがイメージ (画像) です!確認するには、以下の行を
SPRITE 0,X,Y,225
へ変更してから
SPRITE 0,X,Y,1
プログラムを実行します。見ての通りです!
付属のツールは自動的にセーブしないことに留意してください。したがって、必要であれば終了前に必ずセーブすることを習慣にしてください。
始めやすくするために以下のテーブルに記載されている ROM エントリ番号をお使いください。関連データを使用するために ROM エントリは自動的に準備します。
#0 | デフォルトのフォントでは空のままにします |
#1 | カラーパレット |
#2 | キャラクタ (スプライト、タイル) |
#3 | 背景 (タイルマップ) |
#15 | サウンドとミュージック |
カートリッジの ROM エントリ 0 番はプログラムで使いません。この領域にはコンパイラがキャラクタデータからデフォルトのフォントを追加します。この領域は 192 ~ 255 のキャラクタで使用します。また、プログラムの開始時にビデオ RAM へ自動的にコピーされます。デフォルトのフォントを使う場合は、 ROM エントリ 0 番は未使用のままにしておいてください。
グラフィックスデザイナーはキャラクタ (スプライト、タイル、フォント)、背景のデザイン (タイルマップ、スクリーンレイアウト) およびカラーパレットの編集で使います。
右下には異なる役割を持つ三種類のタブがあります: キャラクタエディタ、パレットエディタ、および背景エディタです。LowRes NX をコンピュータで実行する場合は 1 (キャラクタ), 2 (パレット) と 3 (背景) キーでタブを切り替えられます。
グラフィックデザイナーはメインパレット (ファイル 1)、キャラクタ (ファイル 2)、および背景 (ファイル 3) をロードしますが、自動的にセーブしないことに留意してください。
下部の領域には 256 キャラクタを 4 ページで分割したものが表示されます。この表示領域で現在の編集対象を選択します。デフォルトのフォントを使うならば、最終ページは空のままにします。また、キャラクタ #0 番は無垢の背景として使われるため未使用のままにしてください。
左上の領域には選択したカラーで現在のキャラクタを描画します。
FILE | キャラクタのファイルメニューへ移動します。 |
MOV | 現在のキャラクタに関するピクセルを移動します。 |
16*16 | 16x16 ピクセル編集スクリーンへ移動します。 |
FLIP | 現在のキャラクタを水平、または垂直方向へ反転します。 |
SPIN | 現在のキャラクタを回転します。 |
CLR | 選択したカラーで現在のキャラクタを消去します。 |
CUT | 現在のキャラクタをコピーと消去します。 |
COP | 現在のキャラクタをコピーします。 |
PAS | コピーしたキャラクタを貼り付けます。 |
SEL | 選択範囲のサイズを変更します。 |
サイズの選択は、背景エディタの描画も含む、このスクリーンにある編集ツール全体の動作に影響します。
後半部分はキャラタエディタと全く同じです。
現在のカラーパレットは左枠から選択します。
右枠にある RGB スライダーで現在のパレットにある各カラーの編集ができます。スクリーンの背景カラーとして使われるパレット 0 番にある最初のカラーを除き、通常時において最初のカラーは透明色であるため未使用です。
FILE | パレットのファイルメニューへ移動します。 |
こちらのエディタでは現在選択されているキャラクタとカラーパレットを用いて専用スクリーンへ背景を描画します。
FILE | 背景のファイルメニューへ移動します。 |
Pan | 可視状態のマップ領域をドラッグします。 |
Draw | 現在のモードで描画します |
Erase | 属性も併せてセルを消去します。 |
FLIP | X/Y 軸における反転属性を切り替えます。 |
PRI | 優先度の属性を切り替えます。 |
LowRes NX をコンピュータで実行する場合は、矢印、または WASD キーでマップをスクロールできます。Z, X, C, V と B キーでツールを選択します。
描画ツールには様々なモードがあります。ツールの選択後に、ボタンを再タップすることで、モードを変更可能です。
Draw | セル単体を編集します。 |
Fill | ドラッグにより領域を編集します。 |
Character | 選択した反転と優先度の属性を用いて、選択したキャラクタとカラーパレットで描画します。 |
Palette | カラーパレットのみ変更します。 |
Priority | 優先度のみ変更します。優先度 1 のセルは緑色、それ以外はすべて赤色で表示されます。 |
Stamp | ドラックで領域を選択したものを描画します (コピーと貼り付け)。 |
このメニューから個別にキャラクタ、カラーパレット、および背景のロードとセーブをします。データ全体を一括セーブするオプションは用意されていません。
現在の仮想ディスクに存在する全 15 ファイル、あるいは言い換えると編集中のプログラムに関する ROM エントリをリスト表示します。対象の選択後に Load または Save をタップします。
NEW | すべてのキャラクタを消去します。 |
FON | 現在のページへ標準フォントをコピーします。 |
PAG | 選択したファイルから現在のページへ 1 ページだけロードします。別のファイルからフォントを取り込むときに便利です。例えば、 |
NEW | デフォルトカラーへリセットします。 |
NEW | 背景を完全に消去します (サイズはそのままです)。 |
SIZE | SIZE メニューでは、セルの寸法 (8x8 または 16x16 ピクセル) も含む、背景の幅と高さ (セル単位) を選択します。 |
Sound Composer はサウンドプリセット、シーケンス ("トラック") および完成版のソングを作成します。
なお、起動時にメインサウンドデータ (ファイル 15 番) をロードしますが、自動的にセーブしないことに留意してください。サウンドファイルにはすべてのサウンドとミュージックデータが収録されています。
サウンドには利用可能なサウンドパラメータ全般 (波形、エンベロープ、 LFO など) をプリセットします。サウンドはプログラムの PLAY コマンド、またはトラックやソングのインスツルメントとしてそのまま使用可能です。
トラックはシングルボイスで使う 32 ステップのシーケンスです。ステップごとに音符の再生やサウンドの変更が可能です。これは TRACK コマンドによりプログラムで複雑な効果音 (例えばレベルアップ) や短いメロディーで使えます。トラックはソングの作成でも使われます。
パターンはミュージックのブロックであり、 4 ボイスごとにどのトラックを割り当てて演奏するか定義します。以下の場合を除き、パターンは連続的に再生されます: 後続するパターンが空ならばソングの再生は停止します。現在のパターンの完了後に "loop end" (ループ終了) フラグが見つかれば、プレイヤーは "loop start" (ループ開始) フラグのある以前のパターンへ戻るために移動します。パターンの完了後に "stop" (停止) フラグが見つかれば、プレイヤーの再生は停止します。
ゲームで使うミュージックを作曲したい、あるいは効果音を追加することを考えているのであれば、最低でも 1 ボイスは未使用のままにしてください。
64 パターンは長めの単独ソング、または複数の短いソングで使えます。"loop" と "stop" フラグを使うことでソングを分割できます。指定のソングを再生するには、最初のパターンから開始してください。プログラムでソングを再生するには MUSIC コマンドを使います。
Sound Composer の右上角には異なる役割を持つ三種類のタブがあります: パターンエディタ、トラックエディタ、およびサウンドエディタです。これは「トラッカー」スタイルのプログラムです。つまり、タイムラインは左側から右側ではなく、上側から下側へ進行します。つまり、トラックに内在するステップは列 (rows) とも呼ばれます。通常の値は 0 ~ 15 までの範囲を十六進数形式 (0-F) で表したものです。
LowRes NX をコンピュータで実行する場合は、キーボードをサポートします: 矢印キーはカーソルの移動、キーの横列は 2 オクターブの鍵盤楽器に見立てたものであり音符を入力するために使います。Enter キーは休符の入力、Backspace キーは現在の音符を削除、および Space キーは再生 (パターン、トラック) と停止を切り換えます。
こちらのスクリーンではパターンの選択、ボイスを割り当てるトラック全体の選択、および選択したトラックごとに音符をそのまま編集できます。また、現在のパターンに関する "loop" と "stop" フラグを切り換えるためのボタンもあります。トラックを指定せずにボイスに音符を書き込むと、自動的に未使用のトラックを選択します。トラックの音符を停止・減衰したければ、鍵盤楽器部分にある星印をお使いください。
こちらのスクリーンではトラックを選択して追加パラメータを編集できます。
S | サウンド |
V | 音量 |
C | サウンドコマンド |
P | パラメータ |
ここではサウンドの定義とテストを行います。現在選択中のサウンドは、ほかのエディタでは新しい音符で使われます。
以下のコマンドは再生中におけるパラメータの動的変更が可能です。以下はトラックエディタで使用できるコマンドです。
C | P | 用途 |
---|---|---|
0 | 0 | コマンドなし |
0 | x | 定位 (1=左側, 2=右側, 3=中央・両側) |
1 | x | アタックタイム |
2 | x | ディケイタイム |
3 | x | サステインレベル |
4 | x | リリースタイム |
5 | x | LFO レート |
6 | x | LFO 周波数量 |
7 | x | LFO 音量 |
8 | x | LFO パルス振幅 |
9 | x | パルス幅 |
D | x | 減速 (E と同じですが、 +16 になります) |
E | x | 再生速度 (列あたりのティックであり、デフォルトは 8 です) |
F | 0 | トラック、パターンの分割 |
F | 1 | 音符の分割・音量 0 |
LowRes NX のプログラミング言語は第二世代の構造化 BASIC をお手本にしたものです (1985 年風)。
この取扱説明書は、以前にプログラミングの経験がある方々向けのリファレンスとして想定してあります。プログラミング初心者さんは、 LowRes NX ウェブサイトの入門記事を読了後に、この取扱説明書の詳細情報を確認してください。
値の型として利用できるものは文字列と数値 (浮動小数点数) です。
変数名には、文字 (A-Z)、および数字、アンダースコア (_) を使えますが、先頭は数字で書き始めることはできません。予約語 (コマンド、関数) は変数名として使えませんが、変数名の一部として使うことはできます。予約語のリストは "予約語" の章に掲載してあります。
有効な変数名の用例:
X A1 LONG_VARIABLE_NAME PRINTER
無効な変数名の用例:
2B PRINT
文字列変数名の末尾には $ 記号を付けます。例えば、
A$ NAME$
変数は明示的に宣言しないものの、読み取り前に値を代入して初期化する必要があります。変数へ値を代入するには等号記号を使います。
NAME$="LOWRES NX" LIVES=3
十六進数と二進数表記は数値で使われます。
$FF02 %11001011
DIM [GLOBAL] 変数リスト
次元ごとに最上位インデックスから成る配列を定義します。
DIM A(100) DIM MAP(31,23,1),NAMES$(9),SCORES(9)
配列から要素にアクセスする場合、インデックスは 0 が起点となります。
DIM SCORES(9) SCORES(0)=100 SCORES(9)=5 PRINT SCORES(0),SCORES(9)
配列の要素全体はゼロ (0)、または空文字 ("") で自動的に初期化されます。
オプションの GLOBAL キーワードを指定した配列はサブプログラム全体からアクセス可能になります。
UBOUND(var[,dimension])
配列 var における次元数の上限 (最上位のインデックス) を返します。
dimension パラメータは多次元配列のとき、配列の次元を指定するためにオプションの数値として使われます。 デフォルト値は 1 です。
DIM SCORES(9) FOR I=0 TO UBOUND(SCORES) PRINT SCORES(I) NEXT I
ラベルはプログラム内の任意位置に目印をつけるものであり、 GOTO などでのコマンドで使われます。ラベルの構成は、変数と同じ規則を用いており、名前の後に続けてコロンを記述します。
TESTLABEL:
記号 | 用例 | 用途 |
---|---|---|
- | -B | 負数 |
^ | X^3 | 指数 |
* | 2*Y | 乗算 |
/ | X/2 | 除算 |
\ | X\2 | 整数の除算 |
+ | C+2 | 加算 |
- | 100-D | 減算 |
MOD | X MOD 2 | 剰余 |
演算は数学上の評価順位で行われます。例えば、乗算と除算は加算と減算より前に行われます。
PRINT 10+2*5-8/4+5^2
評価順位は丸括弧を使うことで明示的に指定可能です。例えば、
PRINT (3+4)*5
記号 | 用例 | 用途 |
---|---|---|
= | A=10 | 等しい |
<> | A<>100 | 等しくない |
> | B>C | 大なり |
< | 5<X | 小なり |
>= | X>=20 | 大なりか等しい |
<= | X<=30 | 小なりか等しい |
関係演算子の式は true (-1) または false (0) の値を返します。
記号 | 用例 | 用途 |
---|---|---|
NOT | NOT (X=15) | 論理否定 |
AND | A=1 AND B=12 | 論理積 |
OR | X=10 OR Y=0 | 論理和 |
XOR | A XOR B | 排他的論理和 |
演算子全般は数値で利用可能です。また、関係演算子と加算演算子は文字列でも利用可能です。
SUM=1+3 IF SUM<5 THEN PRINT "5 以下" NAME$="LOWRES NX" GREET$="こんにちわ "+NAME$+"!" IF NAME$>"LOWRES" THEN PRINT GREET$ IF SUM=4 AND NAME$<>"" THEN PRINT "OK"
REM 注釈 ' 注釈
プログラムにコメントを記述できるようにします。REM の行は実行されません。REM 語の代わりアポストロフィ (') を使えます。
REM これはテストプログラムです REM 開発者は TIMO KLOSS (ティモ・クロス) PRINT "HELLO" 'テキストの続きを表示... PRINT "さようなら"
IF 式 THEN コマンド [ELSE コマンド]
指定された式が true か false であるか確認します。true ならば、 THEN の後に続くコマンドを、そうでなければ ELSE の後に続くコマンドが実行されます。必要に応じて ELSE 節を記述します。
INPUT "番号 A:";A INPUT "番号 B:";B PRINT "同じですか?"; IF A=B THEN PRINT "はい" ELSE PRINT "いいえ" IF A<B THEN PRINT "B 以下" IF A>B THEN PRINT "A は B 以上"
複数のコマンドを実行 (あるいは長行回避) したいならば、 IF コマンドのブロック版を使えます。その場合は、必ず END IF で閉じてください。
IF 式 THEN コマンド [ELSE IF 式 THEN] コマンド [ELSE] コマンド END IF
この用例のようにブロックは入れ子にできます。
PRINT "NUMBER OF PLAYERS" INPUT "1-4: ";N IF N<1 OR N>4 THEN PRINT "WRONG INPUT" PRINT "RESTART!" ELSE IF N=1 THEN PRINT "シングルプレイヤー" ELSE PRINT "マルチプレイヤー" IF N=4 THEN PRINT "MAXIMUM" END IF END IF
GOTO ラベル
指定されたラベルへ移動後に、その移動先からプログラムの実行を継続します。
PRINT "スタート" GOTO GAMELEVEL GAMEOVER: PRINT "ゲームオーバー" END GAMELEVEL: PRINT "プレイ中" GOTO GAMEOVER
GOSUB ラベル
現在のプログラムに関する位置をスタックへ追加後に指定されたラベルへ移動します。ラベルからサブルーチンを呼び出した後に RETURN でプログラムを完了します。
FOR I=1 TO 5 GOSUB SHOWNUMBER NEXT I END SHOWNUMBER: PRINT "番号",I RETURN
備考: サブルーチンがある主な理由は歴史的な都合です。より強力で安全性の高いサブプログラムを推奨します。
RETURN
最後に GOSUB を呼び出した位置へ戻るために移動した後、その位置をスタックから削除します。
RETURN ラベル
GOTO と同じ動作ですが、スタック全体を消去します。ほかの場所でプログラムを続行したいならば、これでサブルーチンを終了してください。
FOR I=1 TO 5 GOSUB SHOWNUMBER NEXT I END SHOWNUMBER: IF I=4 THEN RETURN GAMEOVER PRINT "番号",I RETURN GAMEOVER: PRINT "ゲームオーバー"
END
位置を問わずプログラムを停止します。プログラムはコードの最終行でも自動停止します。
PRINT "なんからの処理" END PRINT "ここではなにもしない"
WAIT VBL
次のフレームまで待機します。このコマンド (または WAIT n) はゲームのメインループなどでアニメーションや入力のハンドルを扱うために、ループ全体の最後に記述してください。
DO PAL RND(3) TEXT RND(19),RND(15),"*" WAIT VBL LOOP
WAIT n
n フレーム (n/60 秒) 待機します。なお、 n の最小値は 1 です。サブプログラムは割り込み中 (ON VBL/RASTER, MUSIC) に実行するため、この期間は通常のプログラムとして動作を継続します。
WAIT 1 は WAIT VBL に相当します。では WAIT VBL と書くのですか? なぜなら、すっきりしてデキるヒトっぽく見えますので。些細な指針: 円滑なアニメーションと入力処理では WAIT VBL を、本当にしばらく待機したければ WAIT n を使います。
PRINT "わんこユーティリティーズ" PRINT "提供..." WAIT 60 PRINT "体重プログラム!"
FOR var=a TO b [STEP s] コマンド NEXT var
ループ内に記述されたコマンドの列を指定回数実行します。FOR コマンドはカウンタとして var 変数を使います。開始値は a です。コマンド全体は NEXT に到達するまで実行された後に、カウンタは s (または STEP の省略時は 1) で加算されますこの判定はカウンタが b よりも大きいか調べるために行われます。条件を満たしていなければ、処理は繰り返されます。大きければ、プログラムは NEXT 以降の行から継続します。
FOR I=1 TO 8 PRINT I NEXT I
FOR I=2 TO 16 STEP 2 PRINT I NEXT I
STEP s が負数ならば、ループのカウンタは b 以下の値まで実行されます。
FOR I=8 TO 1 STEP -1 PRINT I NEXT I
ほかのステートメントの内側にループを記述できます。
FOR P=0 TO 3 PAL P FOR N=1 TO 4 PRINT N NEXT N NEXT P
DO コマンド LOOP
無限ループを行うコマンドです。GOTO または EXIT で抜け出せます。
DO PAL RND(3) PRINT "FOREVER" LOOP
REPEAT コマンド UNTIL 式
指定された式が true になるまでコマンドをループで実行します。最低でも一回はループが実行されます。
REPEAT A=RND(9) PRINT A UNTIL A=0
WHILE 式 コマンド WEND
指定された式が true の間はコマンドをループで実行します。
A=4 WHILE A<10 PRINT A A=A+1 WEND
EXIT
FOR...NEXT, REPEAT...UNTIL, WHILE...WEND, または DO...LOOP コマンドで作成したループから直ちに抜け出します。
DO INPUT "E を入力すると終了します:";A$ IF A$="E" THEN EXIT PRINT "実行中..." LOOP PRINT "終了"
SUB 名前 [(パラメータのリスト)] コマンド END SUB
名前を付けてサブプログラムを定義します。オプションのパラメータリストは二種類のエントリを指定できます。つまり、通常の変数と配列の変数です (続けて空の丸括弧ペア)。エントリはカンマで書き分けます。デフォルトでは、サブプログラムの内側で宣言された変数はすべてローカルスコープとなります。
注意: サブプログラムから抜け出すために GOTO や GOSUB は使用禁止です!
CALL 名前 [(引数のリスト)]
指定された名前のサブプログラムを実行後に現在の位置へ復帰します。引数リストは SUB 定義のパラメータと必ず一致させてください。通常の変数、配列の要素単体と配列全体 (続けて空の丸括弧ペア) はサブプログラムへ参照渡しされます。それ以外の式は値渡しとなります。
CALL GREET("LOWRES NX",3) CALL GREET("YOU",1) CALL BYE SUB BYE PAL 1 PRINT "BYE" END SUB SUB GREET(N$,A) FOR I=1 TO A PAL RND(3) PRINT "HELLO",N$ NEXT I END SUB
EXIT SUB
END SUB の到達前にサブプログラムを終了します。
GLOBAL 変数リスト
サブプログラム全体で利用可能な変数をメインプログラムで作成します。変数のリストには通常の変数のみ指定してください。配列では DIM GLOBAL をお使いください。このコマンドはサブプログラムの内側で使用できません。
GLOBAL SCORE,TRIES TRIES=3 CALL WIN(10) CALL WIN(20) SUB WIN(N) SCORE=SCORE+N PRINT "スコア:",SCORE,"挑戦回数:",TRIES END SUB
PRINT 式のリスト
現在のウィンドウへテキストを出力します。式にはカンマやセミコロンで書き分けた文字列、または数値を指定できます。カンマで書き分けるとスペースを出力しますが、セミコロンであればスペースを出力しません。カーソルを出力の末尾に置いたままにするには、リストの末尾にカンマやセミコロンを記述してください。無ければ改行で始まります。
PRINT "こんにちは世界" PRINT 42 PRINT 1+3 PRINT "スコア:",100 PRINT "ひとり "; PRINT "ライン"
INPUT ["プロンプト";]var
キーボードからテキストや数値の入力をユーザに求めた後に、その結果を変数 var へ代入します。オプションとして入力を求める前にテキストを表示できます (プロンプトに変数は指定できません)。
INPUT は自動的にキーボードを有効化します。
INPUT "名前:";N$ INPUT "年齢:";AGE PRINT "こんにちは ";N$;"!" PRINT "そろそろ誕生日ですね ";AGE+1
LOCATE cx,cy
現在のウィンドウと関連するテキストカーソルを列 cx と行 cy へ移動します。
LOCATE 2,4 PRINT "HELLO"
CURSOR.X CURSOR.Y
現在のウィンドウと関連するテキストカーソルの列 (X) と行 (Y) を返します。
WINDOW cx,cy,w,h,b
テキストの出力ウィンドウへセル座標として cx,cy の設定、およびサイズとして w 列と h 行を設定します。テキストは背景 b (0 または 1) に書き込まれます。
WINDOW 6,4,8,4,0 PRINT "長文テキストを狭小ウィンドウで表示"
CLW
ウィンドウをスペースで消去後にテキストのカーソル位置をリセットします。
PRINT "こんにちは" CLW PRINT "さようなら"
GAMEPAD n
n (1 または 2) プレイヤーのゲームパッドを有効化します。ゲームパッドを有効にすると、プログラムでタッチスクリーンやマウスへ入力機器を変更できなくなります。
UP(p) DOWN(p) LEFT(p) RIGHT(p)
プレイヤー p (0/1) により十字キーが指定された方向に現在押されていれば true を返します。
UP TAP(p) DOWN TAP(p) LEFT TAP(p) RIGHT TAP(p)
オプションの TAP キーワードを指定すると、この関数は最初のフレームでボタンが押された場合に限り true を返します。
GAMEPAD 1 DO IF UP(0) THEN PRINT "UP" IF DOWN(0) THEN PRINT "DOWN" IF LEFT TAP(0) THEN PRINT "TAP <" IF RIGHT TAP(0) THEN PRINT "TAP >" WAIT VBL LOOP
BUTTON(p[,n])
プレイヤー p (0/1) によりボタン A (n=0) または B (n=1) が現在押されていれば true を返します。パラメータ n の省略時、 両方のボタン (A と B) が確認されます。
BUTTON TAP(p[,n])
オプションの TAP キーワードを指定すると、この関数は最初のフレームでボタンが押された場合に限り true を返します。
GAMEPAD 1 DO IF BUTTON(0,0) THEN PRINT "A" IF BUTTON TAP(0,1) THEN PRINT "TAP B" WAIT VBL LOOP
PAUSE ON PAUSE OFF
自動 PAUSE 処理を有効化・無効化します。デフォルトでは有効であり、 PAUSE ボタンを押したときに、 "PAUSE" をスクリーンへ表示後に PAUSE ボタンが再び押されるまでプログラムは一時停止します。
PAUSE
自働一時停止処理が無効であるかに関わらず、プログラムの一時停止とデフォルトの "PAUSE" スクリーンを表示します。
PAUSE
PAUSE ボタンが押されたときは true を、押されていなければ false を返します。この関数の呼び出し後に値は消去されるため、ボタンごとのタップ状況を返すのは一度だけです。この関数では自働一時停止処理を無効化する必要があります。
GAMEPAD 1 PAUSE OFF DO IF PAUSE THEN PRINT "PAUSE が押された" WAIT VBL LOOP
無論、コンピュータにマウスが正常に接続されていると考えられる場合に限り、タッチスクリーン機能をお使いください。スクリーンにゲームのボタンを実装する場合、キーボードや物理ゲームパッドに対応していない環境では、コンピュータでゲームを操作できなくなる恐れがあることを念頭においてください。必ず標準ゲームパッド関数の利用を考慮してください。
TOUCHSCREEN
タッチスクリーンとマウスのサポートを有効化します。有効化すると、プログラムでゲームパッドへ入力機器を変更できなくなります。
TOUCH.X TOUCH.Y
ユーザがスクリーンにタッチしたか最後にタッチした現在の X または Y のピクセル座標を返します。
TOUCH
直前にスクリーンを触れた場合は true を返します。
TOUCHSCREEN DO IF TOUCH THEN PRINT TOUCH.X,TOUCH.Y WAIT VBL LOOP
TAP
直前にスクリーンに触れているが最後のフレームでは触れていなければ true を返します。
TOUCHSCREEN DO IF TAP THEN PRINT TOUCH.X,TOUCH.Y WAIT VBL LOOP
KEYBOARD ON KEYBOARD OFF
キーボードの有効・無効化を指定します。キーボードの有効時、ゲームパッドによる操作はできません。
KEYBOARD OPTIONAL
キーボードを有効化しますが、タッチスクリーンデバイスにはスクリーンキーボードを表示しません。このモードを使うプログラムはゲームパッド、またはタッチ操作の双方を使えるようにしてください。この場合、キーボードは代替入力手段としてのみ扱います。
INKEY$
最後に押されたキーを文字列として返します。なにも押されていなければ、空文字列 ("") を返します。この関数の呼び出し後は値が消去されるため、キーを押すたびに一度だけ結果を返します。この関数を使うにはキーボードを有効化する必要があります。
KEYBOARD ON DO I$=INKEY$ IF I$<>"" THEN PRINT I$ WAIT VBL LOOP
LowRes NX のグラフィックス機構全体はキャラクタベースです。キャラクタは 3 色と透明色から成る 8x8 ピクセルのイメージです。調色可能な 8 本のカラーパレットを同時に表示可能です。
プログラムの起動時に ROM エントリ 2 番からキャラクタ全体をビデオ RAM へコピーされるため、すぐに使えます。
ディスプレイは背面から前面に重なった三層 (3 layers) で構成されています。
スプライトと背景セルごとに「優先度」と呼ばれる属性があります。優先度の設定時、セルやスプライトは上層のディスプレイレイヤーに表示します。その実体は背景から前景の順に重なる六枚のレイヤーです。
スプライトは独立したオブジェクトであり、スクリーンを自由に移動できます。複数のキャラクタをグループとしてまとめて扱うことで 8x8 ピクセル (キャラクタ単体)、または最大 32x32 ピクセルのサイズを使用可能です。スプライトごとに標準キャラクタ属性 (カラーパレット、X/Y 座標の反転、優先度) に加えてサイズの情報があります。
SPRITE n,[x],[y],[c]
スプライト n (0-63) の座標(x,y) とキャラクタ (c) を設定します。パラメータはすべて省略可能であり、その場合は現在の設定を維持します。
SPRITE n [PAL pal] [FLIP fx,fy] ... [PRIO pri] [SIZE s]
一枚、またはそれ以上のスプライト n (0 - 63) に関する属性を設定します。
pal | パレット番号 (0-7) |
fx | 水平反転 (0/1) |
fy | 垂直反転 (0/1) |
pri | 優先度 (0/1) |
s | 寸法 (0-3): 0: 1 キャラクタ (8x8 ピクセル) 1: 2x2 キャラクタ (16x16 ピクセル) 2: 3x3 キャラクタ (24x24 ピクセル) 3: 4x4 キャラクタ (32x32 ピクセル) |
SPRITE 0,32,64,193 SPRITE 1,64,64,193 SPRITE 1 PAL 1 SIZE 3 FOR X=64 TO 128 SPRITE 1,X,, IF X=96 THEN SPRITE 1 FLIP 1,0 WAIT VBL NEXT X
SPRITE.A n,a
スプライト n (0-63) の全属性を 8bit 単体値で設定します。詳細情報は "スプライトレジスタ" を参照してください。
備考: 関連する属性値の設定は SPRITE コマンドのシンタックスでしたほうが簡単です。
SPRITE OFF [n] SPRITE OFF a TO b
一枚、またはそれ以上のスプライトを非表示にします。パラメータの省略時、すべてのスプライト (0 ~ 63) が非表示となります。パラメータを単体指定した場合は指定されたスプライトが非表示となります。最後のオプションは a から b までスプライトを非表示にする範囲を指定します。
SPRITE.X(n) SPRITE.Y(n)
スプライト n の座標を返します。
SPRITE.C(n)
スプライト n のキャラクタを返します。
SPRITE.A(n)
スプライト n の属性を 8-bit 値で返します。詳細情報は "スプライトレジスタ" を参照してください。
SPRITE HIT(n[,a [TO b]])
スプライト n が別のスプライトと衝突 (つまり、ピクセルが重なった) したならば true を返します。パラメータの省略時は、可視状態である他のスプライト全部との衝突を確認します。a パラメータの指定時、スプライト a のみを確認します。パラメータの全指定時、 a 番から b 番までのスプライトをすべて確認します。
SPRITE 0,32,64,225 SPRITE 1,96,68,226 FOR X=32 TO 128 SPRITE 0,X,, IF SPRITE HIT(0,1) THEN SPRITE 0 PAL 1 ELSE SPRITE 0 PAL 0 END IF WAIT VBL NEXT X
HIT
SPRITE HIT を最後に呼び出してから衝突を検出したスプライトに関するスプライト番号を返します。
背景はテキストとタイルベースのマップやイメージとして使われる 32x32 のサイズから成るキャラクタセルのマップです。セルごとにキャラクタのデータに関する情報と拡張属性 (カラーパレット、X/Y反転座標、優先度) があります。
キャラクタのサイズを 8x8 ピクセルにすると、背景のサイズは 256x256 ピクセルとなります。これはスクリーンのサイズ (160x128 ピクセル) よりも大きいです。背景のスクロールオフセットを変更すると、可視領域の移動ができます。
背景の範囲外に可視領域を移動する場合は、四隅を折り返して表示します。これは無限スクロールを実現するために使われます。
このモードは 16x16 ピクセルのセルで使います。有効時は、巨大スプライトと同じく、セルごとに 2x2 キャラクタを表示します。また、このモードは背景のサイズを 512x512 ピクセルへ拡張します。有効化するには CELL SIZE コマンドを使います。
セル座標として背景にアクセスするコマンドと関数の大部分は、背景サイズの範囲外 (32x32) を扱えます。これにより四隅を折り返します。例えば、キャラクタを座標 34,-2 に描画すると、その実体は座標 2,30 へ表示されます。
CLS
表裏の背景をキャラクタ 0 番で消去後に現在のウィンドウをデフォルト設定でリセットします。
CLS b
背景 b をキャラクタ 0 で消去します。
PAL p
CELL と TEXT コマンドで使うパレット番号の属性を設定します (0-7)。
PRINT "こんにちは" PAL 1 PRINT "LOWRES NX!"
FLIP fx,fy
CELL と TEXT コマンドで使う水平 (fx) と垂直 (fy) の反転属性値を設定します (0 または 1)。
PRINT "LOWRES NX" FLIP 0,1 PRINT "LOWRES NX" FLIP 1,0 PRINT "XN SERWOL"
PRIO p
CELL と TEXT コマンドで使う優先度の属性を設定します (0 または 1)。
ATTR a
CELL と TEXT コマンド全体の属性を 8bit 単体値で設定します。詳細情報は "BG データ" を参照してください。
備考: PAL, FLIP および PRIO コマンドを使うほうが簡単です。
BG n
CELL と TEXT コマンドで使う現在の背景を設定します (0 または 1)。
CELL cx,cy,c
現在の属性を用いたキャラクタ c を現在の背景に関するセル座標 cx,cy へ設定します。
PAL 2 CELL 1,1,225 CELL 2,1,226 PAL 1 CELL 3,1,227
CELL.C(cx,cy)
現在の背景におけるキャラクタのセル座標 cx,cy を返します。
CELL.A(cx,cy)
現在の背景におけるキャラクタのセル座標 cx,cy に関する属性を 8-bit 値で返します。詳細情報は "BG データ" を参照してください。
BG FILL cx1,cy1 TO cx2,cy2 CHAR c
現在の属性を用いたキャラクタ c において現在の背景に関する領域 cx1,cy1 から cx2,cy2 までをセル全体へ設定します。
PAL 2 BG FILL 2,2 TO 17,13 CHAR 225 PAL 1 BG FILL 10,8 TO 17,13 CHAR 226
TINT cx,cy [PAL pal] ... [FLIP fx,fy] [PRIO pri]
現在の背景におけるキャラクタのセル座標 cx,cy に関するパレットやそれ以外の属性を変更します。セルのキャラクタと省略された属性は無変更のままとなります。
BG FILL 2,2 TO 17,13 CHAR 225 TINT 10,8 PAL 1 FLIP 0,1
BG TINT cx1,cy1 TO cx2,cy2 ... [PAL pal] [FLIP fx,fy] [PRIO pri]
現在の背景の cx1,cy1 から cx2,cy2 までの領域にあるセル全体のパレットやその他属性を変更します。セルのキャラクタと省略された属性は無変更のままとなります。
BG FILL 2,2 TO 17,13 CHAR 225 BG TINT 10,8 TO 15,11 PAL 1
BG SOURCE a[,w,h]
BG COPY コマンドで使う現在の転送元を設定します。二次元マップの開始メモリアドレスは a であり、セルの幅 w と高さ h があります。
サイズ (w, h) パラメータの省略時、 Gfx Designer の背景データ形式であるものとして扱われます: 幅はアドレス a+2、高さはアドレス a+3、そしてマップデータの実体に関する開始アドレスは a+4 から読み取ります。
デフォルトでは、 ROM エントリ 3 番は転送元として使われます。
'ROM エントリ 4 番のマップを使用 BG SOURCE ROM(4) '作業用 RAM のマップを使用 BG SOURCE $A000,32,32
BG COPY cx1,cy1,w,h TO cx2,cy2
現在の転送元にある二次元部分を背景へコピーします。
'グラフィックスデザイナーからスクリーンを表示します BG COPY 0,0,20,16 TO 0,0
BG SCROLL cx1,cy1 TO cx2,cy2 STEP dx,dy
セルの水平 dx と垂直dy に従い、cx1,cy1 から cx2,cy2 までの範囲内にあるセル全体の内容を移動します。
DO BG SCROLL 0,0 TO 19,15 STEP -1,0 CELL 18,RND(15),193+RND(62) WAIT 5 LOOP
MCELL.C(cx,cy)
MCELL.A(cx,cy)
CELL.C と CELL.A 関数の動作と類似性はありますが、現在の背景ではなく転送元のマップ (BG SOURCE) にセルを設定します。マップの範囲外に座標が指定された場合は、この関数は -1 を返します。
MCELL cx,cy,c
CELL コマンドの動作と類似性はありますが、現在の背景ではなく転送元のマップ (BG SOURCE) にセルを設定します。転送元となるセルは作業用 RAM に必ず存在する必要があります。さもなければ、 "Illegal Memory Access" (不正なメモリアクセス) のエラーになります。
TEXT cx,cy,s$
現在の属性を用いて現在の背景にあるセル座標 cx,cy に文字列 s$ を出力します。
PAL 3 TEXT 15,15,"HELLO"
NUMBER cx,cy,n,d
現在の属性を用いて現在の背景にあるセル座標 cx,cy に数値 n を出力します。数値は必ず d 桁の形式で表示されます。数値を文字列へ変換する手間はないため、数値を表示するときは TEXT コマンドではなく、このコマンドがお勧めです。
NUMBER 15,0,321,5
FONT c
テキストの出力で使われる現在のキャラクタ範囲を設定します。c はキャラクタにおけるフォントの開始位置 (スペース) です。
利用可能ならば、標準フォントでの位置に関するデフォルト値は 192 です。
SCROLL b,x,y
背景のスクロールオフセット b (0/1) へピクセル座標 x,y を設定します。
TEXT 0,7,"背景のスクロール" FOR I=0 TO 256 SCROLL 0,I,0 WAIT VBL NEXT I
SCROLL.X(b) SCROLL.Y(b)
背景 b のスクロールオフセットを返します。
SPRITE VIEW ON
SPRITE VIEW OFF
スプライトの設定を一切変更せずにスプライトのレイヤー全体を表示、または非表示にします。
BG VIEW ON n
BG VIEW OFF n
背景 n の表示・非表示 (0 または 1)。
CELL SIZE b,s
背景 b のセルサイズを設定します (0 または 1)。 s に指定可能な値は、
0 | 1 キャラクタ (8x8 ピクセル) |
1 | 2x2 キャラクタ (16x16 ピクセル) |
PALETTE n,[c0],[c1],[c2],[c3]
パレット n (0-7) の 4 色全体を設定します。カラー 0 番はパレット 0 番専用であり、スクリーンの背景カラーとして表示されます。カラーパラメータはすべて省略可能であり、その場合は現在の設定を維持します。有効なカラーの値は 0 ~ 36 です。以下の計算式で求めることができます。
有効値 = 赤色 * 16 + 緑色 * 4 + 青色
赤色、緑色、および青色は 0 ~ 63 の値です。
デフォルトでは、すべてのパレットは ROM エントリ 1 番から読み込みます。
PRINT "カラー!" WAIT 30 PALETTE 0,48,63,63,0 WAIT 30 PALETTE 0,3,,, WAIT 30 PALETTE 0,12,,,8
COLOR(p,n)
パレット p (0-7) から n (0-3) のカラー値を返します。赤色、緑色、青色の値は以下の式で算出できます。
赤色 = INT(値 / 16) 緑色 = INT(値 / 4) MOD 4 青色 = 値 MOD 4
ON RASTER CALL 名前
スクリーンラインごとの描画前に実行されるサブプログラムを設定します。通常、カラーパレットの変更やグラフィックエフェクトを得るためにスクロールのオフセット計算で使われます。ラスターのサブプログラムの処理時間は短時間にしてください ("CPU サイクル" を参照)。
ON RASTER OFF
現在のサブプログラムを削除します。
ON RASTER CALL RAINBOW PRINT "RAINBOW WRITER" INPUT A$ SUB RAINBOW PALETTE 0,(RASTER+TIMER) MOD 64,,, END SUB
RASTER
現在のスクリーンラインを返します (y 座標)。これはラスター処理用のサブプログラムで使います。
ON VBL CALL 名前
フレームごとに実行されるサブプログラムを設定します。メインプログラムが WAIT や INPUT で待機状態であっても、アニメーションやサウンドの更新で使えます。VBL サブプログラムの処理時間は長時間占有しないでください ("CPU サイクル" を参照)。
ON VBL OFF
現在のサブプログラムを削除します。
ON VBL CALL BLINK PRINT "BLINK WRITER" INPUT A$ SUB BLINK PALETTE 0,TIMER MOD 64,,, END SUB
TIMER
LowRes NX 起動直後からの表示フレーム数を返します。値が 5184000 (約 24 時間) になったときは 0 へ巻き戻します。
LowRes NX は 4 基の独立したサウンド生成器 (ボイス) が搭載されています。ボイスごとに、のこぎり波、三角波、パルスとノイズの波形を再生可能であり、周波数、音量、パルス幅の設定ができます。ボイスごとに拡張エンベロープジェネレータと LFO を割り当てることができるため、表現力の高いサウンドとインスツルメントが実現できます。
"Sound Composer" (または互換プログラム) のツールでミュージック、トラックとサウンドプリセットを作成できます。
MUSIC [p]
パターン p からソングを再生開始します。パラメータ p の省略時は、パターン 0 から再生開始します。
TRACK n,v
トラック n をボイス v で即時再生します。ボイスごとに独立したトラックを再生できるため、これはミュージックの再生中であっても、サウンドエフェクトの再生で使えます。
PLAY v,p[,len] [SOUND s]
ボイス v (0-3) でサウンドを再生します。p は音調です。
音符 | 音調 (オクターブ別) | |||||||
---|---|---|---|---|---|---|---|---|
C | 1 | 13 | 25 | 37 | 49 | 61 | 73 | 85 |
C# | 2 | 14 | 26 | 38 | 50 | 62 | 74 | 86 |
D | 3 | 15 | 27 | 39 | 51 | 63 | 75 | 87 |
D# | 4 | 16 | 28 | 40 | 52 | 64 | 76 | 88 |
E | 5 | 17 | 29 | 41 | 53 | 65 | 77 | 89 |
F | 6 | 18 | 30 | 42 | 54 | 66 | 78 | 90 |
F# | 7 | 19 | 31 | 43 | 55 | 67 | 79 | 91 |
G | 8 | 20 | 32 | 44 | 56 | 68 | 80 | 92 |
G# | 9 | 21 | 33 | 45 | 57 | 69 | 81 | 93 |
A | 10 | 22 | 34 | 46 | 58 | 70 | 82 | 94 |
A# | 11 | 23 | 35 | 47 | 59 | 71 | 83 | 95 |
B | 12 | 24 | 36 | 48 | 60 | 72 | 84 | 96 |
オプションのパラメータ len は 1/60 秒単位によるサウンドの再生長です。最大値は 255 です。 0 を指定すると、サウンドは自動的に停止しなくなります。パラメータの省略時、現在のボイス値を保持します。
デフォルトは、サウンドで使われている現在のサウンド設定となります。SOUND パラメータで使うサウンド番号 s は Sound Composer ツールで追加します。
PLAY 0,49,20 WAIT 30 PLAY 0,53,20 WAIT 30 PLAY 0,56,40 WAIT 60
STOP [v]
ボイス v で再生中の現在のサウンドとトラックを停止します。パラメータの省略時、すべてのボイス、トラックとミュージックは停止されます。ボイスのエンベロープにリリースタイムが設定されている場合は、サウンドは即時停止せずに、フェードアウトします。
VOLUME v,[vol],[mix]
ボイス n (0-3) の音量 vol (0-15) と出力先の定位 mix (0-3) を設定します。
0 | 消音 |
1 | 左側 |
2 | 右側 |
3 | 左側と右側 (中央) |
パラメータはすべて省略可能であり、その場合は現在の設定を維持します。
SOUND v,[w],[pw],[len]
ボイス v (0-3) の基本サウンドパラメータを設定します。
w は波形です。
0 | のこぎり波 |
1 | 三角波 |
2 | パルス波 |
3 | ノイズ |
pw はパルス波 (0-15) です。値に 8 を指定すると矩形波になります。このパラメータはパルス波形のみ影響を与えます。
len は 1/60 秒単位によるサウンドの再生長です。最大値は 255 です。 0 を指定すると、サウンドは自動的に停止しなくなります。このコマンドで再生長を指定した場合、 PLAY では length パラメータを省略可能です。
パラメータはすべて省略可能であり、その場合は現在の設定を維持します。
ENVELOPE v,[a],[d],[s],[r]
ボイス v (0-3) の音量エンベロープジェネレータ (包絡線発生器) を設定します。
a はアタックタイム、 d はディケイタイム、そして r はリリースタイムです。タイム全般は非線形であり、指定可能範囲は 0 (2 ミリ秒) ~ 15 (12 秒) です。
s はサステインレベル (0-15) です。つまり、ディケイタイムの後とサウンドのリリース前の音量です。
パラメータはすべて省略可能であり、その場合は現在の設定を維持します。
ENVELOPE 0,1,6,8,8 PLAY 0,49,20 WAIT 30 PLAY 0,53,20 WAIT 30 PLAY 0,56,40 WAIT 120
LFO v,[r],[fr],[vol],[pw]
ボイス v (0-3) の LFO (低周波発振器) を設定します。
r は LFO レートであり、有効範囲は 0 (0.12 Hz) ~ 15 (18 Hz) までの非線形方式です。
そのほかのパラメータは様々なサウンドパラメータに対応するエフェクトの適用量を設定します: fr は周波数・音調、 vol は音量、そして pw はパルス幅です。値の範囲は 0 ~ 15 までです。
パラメータはすべて省略可能であり、その場合は現在の設定を維持します。
LFO 0,12,4,0,0 PLAY 0,49,20 WAIT 30 PLAY 0,53,20 WAIT 30 PLAY 0,56,40 WAIT 120
LFO WAVE v,[w],[i],[e],[t]
ボイス v (0-3) の LFO 波形オプションを設定します。パラメータはすべて省略可能であり、その場合は現在の設定を維持します。
w | 波形 (0-3): 0: 三角波 1: のこぎり波 2: 矩形波 3: ランダム |
i | 反転 (0/1) |
e | env モードの有効化 (0/1) |
t | トリガーの有効化 (0/1) |
デフォルトでは、標準サウンドパラメータの出力に LFO を付加します。反転有効時は、減算モードとなります。env モードを有効化すると、 LFO は 1 サイクル後に停止します。これにより、拡張エンベロープジェネレータとして使用することも可能です。トリガーの有効時、 LFO はサウンドを再生するたびに再起動します。さもなくば連続的に実行します。env モードにおいて、トリガーは暗黙的に有効化されます。
SOUND SOURCE a
メモリアドレス a に PLAY, MUSIC と TRACK コマンドで使う現在のデータソースを設定します。関連コマンドの次回呼び出し以降に限り影響を与えるため、すでに再生開始したデータ本体の転送元には保持します。使用できるデータ形式は Sound Composer で作成したものになります。
デフォルトでは、 ROM エントリ 15 番がデータの転送元として使われます。
MUSIC(n)
再生中のミュージックに関するステータスを返します。n には取得したい情報を指定します。
0 | 現在のパターン |
1 | 現在の行 |
2 | 現在のティック |
3 | 現在の再生速度 (0 = 停止) |
DATA 定数リスト
READ コマンドでアクセスされるカンマで書き分けた数値と文字列 (変数や式ではなく値) の定数を割り当てます。DATA コマンドは実行対象外であり、プログラムのどこでも記述可能です。
READ コマンドは プログラムの先頭から末尾まで、 DATA を順にアクセスします。DATA コマンド全体のすべての定数は連続的なアイテムのリストとして読み取ります。
READ var-list
DATA コマンドの値を読み取り後にカンマで書き分けられた値を変数 var-list へ代入します。プログラムには現在の DATA 値を指すために内部処理専用のポインタが存在します。値を読み取るたびに、次の DATA 値へポインタを移動します。
FOR I=0 TO 3 READ TYPE$,POWER PRINT TYPE$;":",POWER NEXT I DATA "LASER",10,"BLASTER",15 DATA "PLASMA",20,"FUSION",30
RESTORE [ラベル]
READ の内部ポインタを別の位置へ変更します。これは特定のデータを選択することでデータを再読み取りできるようにします。ラベルパラメータの省略時、 READ はプログラムの先頭から再開します。そうでなければ、ポインタはジャンプラベルへ設定します。
RESTORE SHIELDS FOR I=0 TO 1 READ TYPE$,POWER PRINT TYPE$;":",POWER NEXT I DATA "LASER",10,"BLASTER",15 SHIELDS: DATA "SIMPLE",30,"ADVANCED",60
グラフィックス、サウンドと I/O、カートリッジ ROM、作業用 RAM と不揮発性 RAM のチップを疑似処理します。アクセス可能なメモリマップ全体は 64 KB です。詳しくは "ハードウェアリファレンス" の章で解説してあります。
PEEK(a)
メモリアドレス a から単バイト値 (0 ~ 255) を返します。
TOUCHSCREEN PRINT "TOUCH!" DO IF PEEK($FF75) AND %10 THEN PRINT PEEK($FF72),PEEK($FF73) END IF WAIT VBL LOOP
POKE a,v
メモリのアドレス a へ値 v を設定します。v は 0 ~ 255 までの数値表現です。この範囲外の数値表現は 8 bit に丸め込みます。
POKE $9000,232 POKE $9002,233
PEEKW(a)
メモリアドレス a から 2 バイト値 (-32768 ~ 32767) を返します。
POKEW a,v
メモリアドレス a へ 2 バイト値を書き込みます。v は -32768 ~ 32767 までの数値表現です。この範囲外の数値表現は 16 bit に丸め込みます。
PEEKL(a)
メモリアドレス a から 4 バイト値 (-2147483648 ~ 2147483647) を返します。
POKEL a,v
メモリアドレス a へ 4 バイト値を書き込みます。v は -2147483648 ~ 2147483647 までの数値表現です。この範囲外の数値表現は 32 bit に丸め込みます。
'不揮発性 RAM の用例 HI=PEEKL($E000) PRINT "ハイスコア:" PRINT HI INPUT "スコア:";SC IF SC>HI THEN POKEL $E000,SC PRINT "リスタート!"
COPY a,n TO d
転送元のメモリアドレス a を起点とした n バイトを転送先のアドレス d へコピーします。転送元と転送先の領域は重複しても問題はありません。
'ROM エントリ 4 番からビデオ RAM へ 'キャラクタをコピーします COPY ROM(4),SIZE(4) TO $8000
FILL a,n[,v]
値 v (パラメータの省略時は 0) を開始メモリアドレス a から n バイト設定します。
ROL a,n
アドレス a をバイト単位として扱い、そのビットを n 桁により左側へ循環します。
ROR a,n
アドレス a をバイト単位として扱い、そのビットを n 桁により右側へ循環します。
ROM(n)
ROM エントリ n のメモリアドレスを返します。
SIZE(n)
ROM エントリ n のバイト数を返します。
ファイルコマンドは最大で 16 ファイルを扱える仮想ディスクのデータを記録するために使われます。この形式は ROM エントリのプログラムファイル部分と同じです。これによりNX プログラムをそのまま仮想ディスクとして扱う事でデータの編集が可能になります。
仮想ディスクはイメージとマップエディタ、あるいはミュージックプログラムなどの開発ツール専用機能として設計されています。なお、ゲームでは不揮発性メモリをお使いください。標準構成の LowRes NX コンソールにおいてディスクドライブは未搭載であると考えてください。
LOAD f,a[,n[,o]]
現在の仮想ディスクからファイル番号 f をメモリの開始アドレス a へロードします。
オプションのパラメータ n はロードする最大バイト数の指定で使われます。0 は無制限であることを意味します。オプションのパラメータ o でファイルのオフセットを設定可能です。
LOAD はツールでのみ使用することを想定しています。ゲームデータでは ROM エントリを、あるいはゲームステートでは不揮発性メモリをお使いください。
SAVE f,c$,a,n
メモリアドレスの先頭 a から n バイトまでを現在の仮想ディスクのファイル番号 f (0-15) へコメント c$ (最大 31 文字) を付けてセーブします。
このファイルを以前にロードしていれば、オリジナルのコメントを保持するか、あるいはセーブ前にユーザが編集できるようにしてください。新規作成したファイルの場合は、最低でもコメントとしてデータ型を記述してください。例えば "CHARACTERS" または "MUSIC" です。
SAVE はツールでのみ使用することを想定しています。不揮発性メモリはゲームステートの記録で使います。
FILES
FILE$ を用いて現在のディレクトリからファイルをロードします。
FILE$(f)
ファイル番号 f のコメント文字列を返します。ファイルの情報を更新するには、ファイルのあるディレクトリへアクセスする前に FILES の呼び出し、または LOAD や SAVE の呼び出し直後に FILE$ を使います。
FILES FOR I=0 TO 15 PRINT I,FILE$(I) NEXT I
FSIZE(n)
ファイル番号 n のバイト数を返します。ファイルの情報を更新するには、ファイルのあるディレクトリへアクセスする前に FSIZE の呼び出し、または LOAD や SAVE の呼び出し直後に FILE$ を使います。
PI
PI は円周率です: 3.1415926535...
SIN(x)
x の正弦です。なお、 x はラジアン単位です。
COS(x)
x の余弦です。なお、 x はラジアン単位です。
TAN(x)
x の正接です。なお、 x はラジアン単位です。
ASIN(x)
x の逆正弦です。なお、 x の範囲は必ず -1 ~ +1 までにしてください。関数の範囲は -(PI/2) <= ASIN(x) <= (PI/2) です。
ACOS(x)
x の逆余弦です。なお、 x の範囲は必ず -1 ~ +1 までにしてください。関数の範囲は 0 <= ACOS(x) <= PI です。
ATAN(x)
ラジアン表記による x のアークタンジェントです。すなわち、タンジェントは x の角度です。関数の範囲は -(PI/2) <= ATAN(x) <= (PI/2) です。
HSIN(x)
x の双曲線正弦です。
HCOS(x)
x の双曲線余弦です。
HTAN(x)
x の双曲線正接です。
ABS(x)
x の絶対値です。
SGN(x)
x の正負符号です。 x < 0 ならば -1 を、 x = 0 ならば 0 を、そして x > 0 ならば +1 となります。
INT(x)
x よりも小さい最大整数です。すなわち、 INT(1.3) = 1 や INT(-1.3) = -2 です。
EXP(x)
x の指数です。すなわち、 x を累乗した自然対数 (e = 2,71828...) を底とする値です。
LOG(x)
x の自然対数です。 x は必ず 0 以上になります。
SQR(x)
負数ではない x の平方根です。 x は非負数を指定してください。
RND
これは 0 <= RND < 1の範囲内による一様分布の乱数列です。
RND(n)
この異種シンタックスは 0 ~ n までの整数により乱数を包括的に生成します。
RANDOMIZE x
乱数のシード値 x を整数で指定します。デフォルトではプログラム開始時のシード値は 0 であるため、乱数列は必ず同じ値になります。
RANDOMIZE TIMER
プログラムの実行ごとに違う乱数が必要ならば、この行を先頭に挿入してください。
RANDOMIZE TIMER FOR I=1 TO 16 PRINT RND(1000) NEXT I
MIN(x,y)
MIN 関数は互いの式における最小値を返します。
MAX(x,y)
MAX 関数は互いの式における最大値を返します。
SWAP 変数1,変数2
同一型の変数同士でデータを交換します。
A=10 B=40 SWAP A,B PRINT A PRINT B
INC 変数
変数の値を 1 増やします。INC A は A=A+1 相当ですが、 CPU サイクルのコストは少なくて済みます。
DEC 変数
変数の値を 1 減らします。DEC A は A=A-1 相当ですが、 CPU サイクルのコストは少なくて済みます。
ADD 変数,x
値 x を変数へ加算します。 x には正数、または負数を使用可能です。ADD A,X は A=A+X 相当ですが、 CPU サイクルのコストは少なくて済みます。
ADD var,x,base TO top
ADD の第二シンタックスはカウンタの繰り返しで便利です。
A=0 DO ADD A,2,0 TO 10 PRINT A LOOP
は以下と同じです。
A=0 DO A=A+2 IF A>10 THEN A=0 IF A<0 THEN A=10 PRINT A LOOP
とはいえ、それでも ADD コマンドは CPU サイクルのコストは少なくて済みます。
LEFT$(s$,n)
s$ の先頭から n 文字を新規文字列として返します。
PRINT LEFT$("LOWRES NX",3)
LEFT$(s$,n)=a$
a$ の先頭 n 文字で変数 s$ の先頭文字を上書きします。
A$="FOORES NX" LEFT$(A$,3)="LOWER" PRINT A$
RIGHT$(s$,n)
s$ の末尾から n 文字を新規文字列として返します。
RIGHT$(s$,n)=a$
a$ の末尾 n 文字で変数 s$ の末尾文字を上書きします。
MID$(s$,p,n)
p 文字を起点することで、 s$ の n 文字を新規文字列として返します。最初の文字の位置は 1 です。
PRINT MID$("LOWRES NX",4,3)
MID$(s$,p,n)=a$
a$ の先頭 n 文字により指定されたテキストの範囲で変数 s$ を上書きします。
A$="LOWFOO NX" MID$(A$,4,3)="RESTAURANT" PRINT A$
INSTR(d$,s$[,p])
d$ 内にある s$ と最初に一致するものを検索後に、その開始位置を返します。見つからなければ、関数は 0 を返します。通常、この関数は文字列の先頭から検索開始します。オプションとして検索開始位置 p を指定可能です。
PRINT INSTR("LOWRES NX","RES")
CHR$(n)
文字列にある文字の ASCII コード n を返します。
FOR I=32 TO 90 PRINT CHR$(I) NEXT I
ASC(a$)
ASCII コードで a$ の先頭文字を指定します。
PRINT ASC("L")
LEN(a$)
a$ の文字数を返します。
VAL(a$)
a$ に記述した数値表現の文字列を数値へ変換します。
STR$(n)
数値 n を文字列へ変換します。
BIN$(n[,len])
最低 len 桁から成る二進数形式の文字列へ数値 n を変換します。
HEX$(n[,len])
最低 len 桁から成る十六進数形式の文字列へ数値 n を変換します。
システムコマンドは仮想コンソールと LowRes NX アプリケーションを接続します。
TRACE 式のリスト
デバッグウィンドウへテキストを出力します。式にはカンマで書き分けた文字列、または数値を指定できます。デバッグモードの無効時、このコマンドは無視されます。
'デバッグモードで実行 A=13 B$="GO" TRACE "TEST",A,B$
SYSTEM n,v
システムステータス n へ値 v を設定します。現在、利用可能な唯一のステータスは、
0 | 省電力モード: 有効化は v に 0 以外を指定します。このモードはユーザの入力がない時は必ず非常に低いリフレッシュレートで動作します。仮想 CPU には一切影響しないため、コードは実行速度無制限のまま実行します。 |
LowRes NX は簡易的な方法で CPU サイクルを疑似処理します。フレームごとにサイクルの固定制限値があります。これはすべてのデバイスでプログラムの同一実行速度を保証します。これにより、お使いのデバイスでプログラムを円滑に動作するよう最適化すると、ほかのデバイスでも同じ動作を得られます。
変数や定数のアクセスと同じく、コマンド、関数または演算子を実行するたびに 1 サイクルのカウントをします。一部処理には追加コストが発生します。
フレームごとの合計サイクル | 17556 |
VBL 割り込みごとのサイクル | 1140 |
ラスター割り込みごとのサイクル | 51 |
メインプログラムは大量のサイクルを消費しますが、 WAIT VBL や WAIT 以前にサイクルの限界に達すると、次回のフレームへその処理を持ち越します。割り込みサイクルの制限を超過した場合は、スクリーンに黒色の走査線が表示されます。
$0000 - カートリッジ ROM (32 KB) $8000 - キャラクタデータ (4 KB) $9000 - BG0 データ (2 KB) $9800 - BG1 データ (2 KB) $A000 - 作業用 RAM (16 KB) $E000 - 不揮発性 RAM (4 KB) $FE00 - スプライトレジスタ (256 B) $FF00 - カラーレジスタ (32 B) $FF20 - ビデオレジスタ $FF40 - オーディオレジスタ $FF70 - I/O レジスタ
キャラクタはピクセルごとに 2 ビットの 8x8 ピクセルイメージであるため、サイズは 16 バイトとなります。ビデオ RAM は 256 キャラクタの容量があります。
キャラクタに関する最初の 8 バイトはピクセル全体の下位ビットに関する情報を、後続する 8 バイトはピクセル全体の上位ビットに関する情報です。
背景は 32x32 キャラクタのセルから成るマップです。セルごとに 2 byte を使用します。
- キャラクタ番号 - 属性: ビット 用途 0-2 パレット番号 3 X 方向の反転 4 Y 方向の反転 5 優先度 6-7 未使用
ゲームカートリッジに内蔵されたバッテリバックアップ方式の RAM であると考えられます。ゲーム内の位置やハイスコア表などのデータで使います。不揮発性 RAM の内容はプログラムの終了時に自動セーブされます。その後、プログラムを起動するとロードされます。プログラムごとに独立した不揮発 RAM のセーブ領域があります。
64 枚のスプライトが利用可能であり、スプライトごとに 4 バイトを使用します。
- X 座標 - Y 座標 - キャラクタ番号 - 属性: ビット 用途 0-2 パレット番号 3 X 方向の反転 4 Y 方向の反転 5 優先度 6-7 寸法: 0: 1 キャラクタ (8x8 ピクセル) 1: 2x2 キャラクタ (16x16 ピクセル) 2: 3x3 キャラクタ (24x24 ピクセル) 3: 4x4 キャラクタ (32x32 ピクセル)
注意: X および Y スプライト座標レジスタにはオフセットが 32 あります。そのため、負数を使わずに上側・左側のスクリーンの範囲外へ移動可能です。BASIC コマンドの使用時、このオフセットは利便性の観点から撤廃されています。
パレット × 8 (パレットあたり 4 色)。カラー単体は 1 バイトです。
ビット 成分 0-1 青色 2-3 緑色 4-5 赤色
$FF20 - 属性: ビット 用途 0 スプライトの有効化 1 BG0 の有効化 2 BG1 の有効化 3 BG0 のセル寸法、 4 BG1 のセル寸法: 0: 1 キャラクタ (8x8 ピクセル) (BG 256x256 ピクセル) 1: 2x2 キャラクタ (16x16 ピクセル) (BG 512x512 ピクセル) $FF21 - BG0 におけるスクロールのオフセット X $FF22 - BG0 におけるスクロールのオフセット Y $FF23 - BG1 におけるスクロールのオフセット X $FF24 - BG1 におけるスクロールのオフセット Y $FF25 - スクロールのオフセット - MSB (最上位ビット) 巨大なセルの寸法に限り使用されます: ビット 用途 0 BG0 X+256 1 BG0 Y+256 2 BG1 X+256 3 BG1 Y+256 $FF26 - ラスターライン
以下は 4 ボイスのレジスタです。
$FF40 - ボイス 0 $FF4C - ボイス 1 $FF58 - ボイス 2 $FF64 - ボイス 3
ボイスごとに 12 バイトを使用します。
- 周波数 (下位バイト) - 周波数 (上位バイト) - ステータス: ビット 用途 0-3 音量 4 左側の定位 5 右側の定位 6 初期化 7 ゲート - ピークメーター (読み取り専用) - 属性: ビット 用途 0-3 パルス幅 4-5 波形: 0: のこぎり波 1: 三角波 2: パルス波 3: ノイズ 6 タイムアウトの有効化 - 長さ (タイムアウト) - エンベロープのバイト 1: ビット 用途 0-3 アタック 4-7 ディケイ - エンベロープのバイト 2: ビット 用途 0-3 サステイン 4-7 リリース - LFO の属性: ビット 用途 0-1 波形: 0: 三角形 1: のこぎり波 2: 矩形波 3: ランダム 2 反転 3 Env モードの有効化 4 トリガーの有効化 - LFO 設定バイト 1: ビット 用途 0-3 LFO レート 4-7 周波数量 - LFO 設定バイト 2: ビット 用途 0-3 音量 4-7 パルス振幅 - 予約済み
備考: 周波数は 16-bit 値です: f = hertz * 16
$FF70 - ゲームパッド 0 のステータス $FF71 - ゲームパッド 1 のステータス ゲームパッドのステータス: ビット 用途 0 上 1 下 2 左 3 右 4 ボタン A 5 ボタン B $FF72 - 最後にタッチした X 座標 $FF73 - 最後にタッチした Y 座標 $FF74 - 最後に押されたキー (ASCII コード) $FF75 - ステータス: ビット 用途 0 Pause ボタン 1 タッチ $FF76 - 属性: ビット 用途 0-1 ゲームパッドの有効化: 0: 無効化 1: 1 プレイヤー 2: 2 プレイヤー 2 キーボードの有効化 3 タッチスクリーンの有効化
この形式は PLAY, MUSIC および TRACK コマンドで使われます。有効なサウンドプリセットのみ保存可能です。このデータは MUSIC または TRACK コマンドが無いときに使われます。トラックが利用可能であれば、すべてのパターンを保存する必要があります。空トラックの後に使われるものは保存する必要はありません。
オフセット - 内容 0 - 16 サウンドプリセット 128 - 64 パターン 384 - 64 トラック
サウンドプリセットごとに 8 バイトを使用します。これは先頭の 4 バイトを除き、オーディオレジスタの構成と一致します。
パターンごとに 4 バイトを使用します。
- ボイス 0: ビット 用途 0-6 トラックのインデックス (64 = ボイスは未使用) 7 ループ開始フラグ - ボイス 1: ビット 用途 0-6 トラックのインデックス (64 = ボイスは未使用) 7 ループ終了フラグ - ボイス 2: ビット 用途 0-6 トラックのインデックス (64 = ボイスは未使用) 7 ソング停止フラグ - ボイス 3: ビット 用途 0-6 トラックのインデックス (64 = ボイスは未使用)
トラックごとに 96 バイト (32 エントリ × エントリあたり 3 バイトの構成) を使用します。
- 音符の音調 (0 = 空) - データ (音符が 0 の場合は無視): ビット 用途 0-3 音量 4-7 サウンド - 制御: ビット 用途 0-3 パラメータ 4-7 コマンド
以下のコマンド、関数とシンタックスの使用は非推奨であり将来のバージョンで廃止予定です。
SPRITE.A n,(pal,fx,fy,pri,s)
代替品として SPRITE (新型シンタックス) または SPRITE.A (単体値のみ) をお使いください。
ATTR (pal,fx,fy,pri,s)[,m]
ATTR a,m
代替品として PAL, FLIP, PRIO または ATTR (単体値のみ) をお使いください。属性マスクの置換では TINT および BG TINT をお使いください。
DISPLAY (s,b0,b1,c0,c1)
DISPLAY a
代替品として BG VIEW ON/OFF, SPRITE VIEW ON/OFF および CELL SIZE をお使いください。
DISPLAY
代替品として PEEK($FF20) をお使いください。
LFO.A v,(w,r,e,t)
代替品として LFO WAVE をお使いください。
以下は LowRes NX BASIC で使われている予約語の一覧です。下記の予約語を変数名として使うと、シンタックスエラーになります。
アスタリスクの付いたものはキーワードです。 FUNCTION は未実装ですが、将来のバージョンのために予約されています。
ABS, ACOS, ADD, AND, ANIM*, ASC, ASIN, ATAN, ATTR, BG, BIN$, BUTTON, CALL, CELL, CELL.A, CELL.C, CHAR, CHR$, CLOSE*, CLS, CLW, COLOR, COPY, COS, DATA, DEC, DECLARE*, DEF*, DIM, DISPLAY, DO, DOWN, ELSE, END, ENVELOPE, EXIT, EXP, FILE$, FILES, FILL, FLASH*, FLIP, FN*, FONT, FOR, FSIZE, FUNCTION*, GAMEPAD, GLOBAL, GOSUB, GOTO, HCOS, HEX$, HIT, HSIN, HTAN, IF, INC, INKEY$, INPUT, INSTR, INT, KEYBOARD, LBOUND*, LEFT$, LEFT, LEN, LET, LFO, LFO.A, LOAD, LOCATE, LOG, LOOP, MAX, MCELL, MCELL.A, MCELL.C, MID$, MIN, MOD, MUSIC, NEXT, NOT, NUMBER, OFF, ON, OPEN*, OPTIONAL, OR, OUTPUT*, PAL, PALETTE, PAUSE, PEEK, PEEKL, PEEKW, PI, PLAY, POKE, POKEL, POKEW, PRINT, PRIO, RANDOMIZE, RASTER, READ, REM, REPEAT, RESTORE, RETURN, RIGHT$, RIGHT, RND, ROL, ROM, ROR, SAVE, SCROLL, SCROLL.X, SCROLL.Y, SGN, SHARED*, SIN, SIZE, SOUND, SOURCE, SPRITE, SPRITE.A, SPRITE.C, SPRITE.X, SPRITE.Y, SQR, STATIC*, STEP, STOP, STR$, SUB, SWAP, SYSTEM, TAN, TAP, TEMPO*, TEXT, THEN, TIMER, TINT, TO, TOUCH, TOUCH.X, TOUCH.Y, TOUCHSCREEN, TRACE, TRACK, UBOUND, UNTIL, UP, VAL, VBL, VIEW, VOICE*, VOLUME, WAIT, WAVE, WEND, WHILE, WINDOW, WRITE*, XOR