N-BASIC プログラムを、数倍速で動くマシン語プログラムに変換できます。
README.TXT
を読んでください。FOR
で単精度実数変数を使用すると、DEF USR0
で定義したアドレスを破壊する不具合を修正。PRINT USING
を使用した際、アセンブルエラーが出ることがある不具合を修正。3D ダンジョンをコンパイルしてみました。
以前に作った 3D ダンジョン、N-BASIC 版とコンパイル後の比較。実用的な速度になったかと。 pic.twitter.com/oYmor84CQp
— ぜび (@xevixevi) March 23, 2023
N-BASIC を解析していて気付いたことをいくつか。
PSET,PRESET,LINE,GET@,PUT@
は、実行時に毎回カーソル OFF 処理をしている。この処理で V-BLANK
待ちをしているため、1 秒間に 60
回程度しか実行できない。特に PSET,PRESET
では致命的(NBCL では改良済み)。LINE,GET@,PUT@
は、なぜか CONSOLE
で設定したスクロール範囲(の下側)の影響を受ける。PSET,PRESET
ではファンクションキー表示有無の影響しか受けないので、おそらく参照ワークエリアを間違えている。MID$
で同じ文字列に置き換えるとバグるケースがある。
10 A$="123456":MID$(A$,3)=A$:PRINT A$
run
121212 (121234 が正しい)
Ok
PRINT
の数値表示は、おそらく改行条件の計算を間違えてる。10 FORI=0TO2:PRINT TAB(34+I);12345:NEXT run 12345 1234 5 12345 Ok
INPUT
のプロンプトが出ないことがある。このツイートを参照。$1C
は符号付き 2 バイト整数 -32768~32767
を表せるが、負数はプログラム入力時に
-($F4
)と数値に分けられてしまう。特に 32768
は範囲外なので、単精度実数($1D
と 4
バイト)になってしまう。$1B
は数値 10 を表すが、10
はプログラム入力時に中間言語 $0F
(と符号無し 1
バイト整数)に変換されるため、結局使われていない。PRINT
のパラメータは、PRINT"hoge";A$;B PRINT"hoge"A$B
USING
の後は不可)。LINE
は LINE@
と記述することもできる。IF
の THEN
(もしくは
GOTO
)の前にカンマを挿入することができる。IF A=B,THEN~
自分用メモ。間違いあるかも。