博工房

MSX-BASIC裏技辞典
BASICプログラムで役に立つかもしれない裏技コマンドや高速化テクニックを紹介。


エスケープシーケンス
エスケープコード CRH$(27)に続けて置く文字によって、いろいろな画面制御が可能になる。
上下のスクロールがお勧め。


エスケープシーケンス表
書式機能同機能
CHR$(27)+"A"カーソルを1つ上に移動。CHR$(30)
CHR$(27)+"B"カーソルを1つ下に移動。CHR$(31)
CHR$(27)+"C"カーソルを1つ右に移動。CHR$(28)
CHR$(27)+"D"カーソルを1つ左に移動。CHR$(29)
CHR$(27)+"H"カーソルをLOCATE 0,0に移動。CHR$(11)
CHR$(27)+"Y"+CHR$(32+y)+CHR$(32+x)カーソルをLOCATE x,yに移動。
CHR$(27)+"j"画面を消去してカーソルをLOCATE 0,0へ移動。CHR$(12)
CHR$(27)+"E"画面を消去してカーソルをLOCATE 0,0へ移動。CHR$(12)
CHR$(27)+"l"
(Lの小文字)
カーソルのある横1行を全て消去。
CHR$(27)+"K"カーソル位置からその行の終わりまでを消去。
CHR$(27)+"J"カーソル位置から画面の終わりまでを消去。
CHR$(27)+"L"カーソルのある行以降を下に1行分スクロールする。
CHR$(27)+"M"カーソルのある行より下を、上に1行分スクロール。
CHR$(27)+"x4"カーソルの形を■にする。
CHR$(27)+"x5"カーソルを消す。LOCATE ,,0
CHR$(27)+"y4"カーソルの形を_にする。
CHR$(27)+"y5"カーソルを表示する。LOCATE ,,1




ワークエリア
アドレス初期値内容
F3B029テキスト画面の1行の幅
F3B124テキスト画面の行数
F6A3 - F6A40READ文で読まれたDATA文の行番号
FB40-PLAY文のキューの数
FC9E - FC9F-PLAY用の1/60秒カウンタ


ゲーム中にBGMが鳴るようにする場合、FB40番地を参照するとよい。
(例)
IF PEEK(&HFB40)=0 THEN PLAY"T120V15L8O4CDEFG"
PLAY演奏の予約数が0の時に予約を入れます。予約を入れすぎたり、長時間演奏を予約
するとプログラムが中断してしまう。

BGMを止める場合、BEEPかBIOSルーチンを使う。
(例)
DEFUSR=&H90 あらかじめPSGの初期化ルーチンがあるアドレスを定義しておく。
A=USR(0) これで演奏が止まる。




MSX-BASIC高速化ウラ技集

@変数
頻繁に使う変数を先に宣言しておくと全体のパフォーマンスが良くなります。
配列変数も同様に重要なのを先頭に置くと良い。
(例)
A=0:B=0:C=0:D$="*"
DIM X(3),Y(3),C(7)




@PRINTとセミコロン「;」
PRINT"TEST"; 最後に;を付けると速い。スコアのような頻繁に更新するものに有効。
(例) PRINT USING"#####0";SC;


PRINT"TEST" セミコロンが無いとカーソルが改行される分だけ遅くなるが、それを利用し
てLOCATE文を使わず、連続して表示する方法もある。




@NEXT
NEXT J,I → NEXT:NEXT と展開した方が速い。




@IF THEN ELSE
IF X THEN Y=0 変数Xが0なら偽、0以外なら真でY=0が実行されます。
IF X<>0 THEN Y=0 上の式と同じ処理が行われるが、Xに <, >, = が付くと遅くなる。




@比較演算子
X=(Y=1)
Yが1の時はXに-1が入る。それ以外はXに0が入る。コードが短いので1画面プログラムに
多用された。処理速度は遅い。IF文にすると、IF Y=1 THEN X=-1 ELSE X=0 となる。




@カッコ ()
無駄なカッコを取り除く。たまに見落とします。
(例)
(X*2)\2 → X*2\2
(X AND 3) OR 1 → X AND 3 OR 1


演算の優先順位
1.カッコで囲まれたもの
2.関数 (ABS, STICK, RND など)
3.べき乗 (^)
4.負記号 (-)
5.乗算 (*)、除算 (/)
6.整数の除算 (\)
7.剰余 (MOD)
8.加算 (+)、減算 (-)
9.関係演算子 (< > = など)
10.NOT (論理演算子)
11.AND
12.OR
13.XOR
14.EQV
15.IMP
おなじ優先順位の場合は左から実行される。




@PUT SPRITEの省略形を使う
1:PUT SPRITE 0,(80,120),15,1 赤部は省略可能で、省略した分だけ速くなる。
(例)
PUTSPRITE 0,,9 色だけ変更
PUTSPRITE 0,,,2 パターンだけ変更
PUTSPRITE 0,(0,8),,5


2:相対座標指定を使う。2枚以上のスプライトを重ねるときに有効。
(例)
PUTSPRITE 0,(X,Y):PUTSPRITE 1,STEP(0,0)




@ランダム関数 RND
ランダム関数は遅いので別の方法を考える。

1:プレイ文用の1/60秒カウンター値(FC9E番地)を利用する。
(例) R=PEEK(&HFC9E)
Rに0から255のいずれかの数値が入る。


2:配列変数を使う。あらかじめ配列変数に数値を入れてシャッフルしておき、順に取り出
す。この場合、数値を取り出すためのカウンター用変数が要る。
(例)
DIM R(20)
FOR I=0 TO 20:R(I)=I:NEXT
FOR I=0 TO 20:SWAP R(I),R(RND(1)*21):NEXT
FOR I=0 TO 20:PRINT R(I):NEXT




SCREEN1のVRAM


パターンジェネレーターテーブル
8x8ドットのパターンデータの格納領域。
(例) VPOKE ASC("V")*8,255 Vの形を変える。


パターン名称テーブル
パターンの表示位置を指定する領域。
(例) VPOKE BASE(5),ASC("0") 画面左上に0を表示。


カラーテーブル
表示するパターンの色を指定する領域。
(例) VPOKE BASE(6)+6,&H7D 数字の色が変わる。


スプライトジェネレーターテーブル
スプライトパターンの格納領域。
(例) VPOEK BASE(9),255


スプライト属性テーブル
表示するスプライトの座標、色などを指定する領域。
(例) VPOEK BASE(8),100


ディスプレイページの切り換え
VDP(2) = ページ番号 (初期値は6で、0から15までの全16ページある)
(例) VDP(2)=0 パターンジェネレーターテーブルの中身が見える。


アクティブページの切り換え
POKE &HF923, ページ番号 x 4 (名称テーブルのアドレスを変える)
(例) POKE &HF923,20:CLS:VDP(2)=5 ページ5が名称テーブルになる。




スプライト属性テーブルの構造


ECビット
このビットを1にするとスプライト面が左に32ビット分シフトする。





MSX-BASIC裏技辞典
博工房