【2024.02.07更新】 カラーパレット0番の色も更新する(透明色不使用) 追加
【2023.07.11更新】もろもろ追加
【2023.05.22更新】初版公開
思いつき次第随時追加。忘れやすい性分で…
- MSXのバージョンナンバーを得る
- MSX0 Stackかどうか(IoT BASICが利用可能か)の判定
- MSX-DOS2が利用可能かの判定
- 日本語BASIC(漢字BASIC)が利用可能かの判定
- MSXべーしっ君(BASICコンパイラ)が利用可能かの判定
- MSXべーしっ君(BASICコンパイラ)が実行中かの判定
- キーバッファのクリア
- キークリック音のON/OFF
- Ctrl+STOPの無効化/有効化
- 本体RAM容量のチェック
- BASICからMSX-DOSへ移行する
- VDP
- CPUモードの切り替え
- 拡張デバイス
MSXのバージョンナンバーを得る
A=PEEK(&H2D)
MSX0 Stackの場合、MSXのバージョンナンバーはエミュレータが起動しているMSXのバージョンナンバーとなります。
MSX0 Stackかどうか(IoT BASICが利用可能か)の判定
ON ERROR GOTO xxx
CALL IOTGET("msx/me/id",A)
ON ERROR GOTO 0
CALL IOTGETはセンサーなどMSX0 Stackと接続されたデバイスへのリクエスト命令で、このリクエストの場合戻り値の変数Aに 0 または 1 が返ります。MSX0 StackのIoT BASICが利用できない場合はエラーを発生しますので、ON ERROR GOTO xxxの行番号ジャンプ先で処理の分岐(IoT BASICの有り無し)を行うことができます。
MSX-DOS2が利用可能かの判定
ON ERROR GOTO xxx
CALL RAMDISK(0)
ON ERROR GOTO 0
CALL RAMDISKはRAMディスク(H:)を確保・削除する命令で、パラメータ 0 を指定すると削除となります。MSX-DOS2が利用できない場合はエラーを発生しますので、ON ERROR GOTO xxxの行番号ジャンプ先で処理の分岐(DOS2の有り無し)を行うことができます。
RAMディスクを使用していない段階でCALL RAMDISK(0)を実行しても元々存在していないのですから問題ありません。
日本語BASIC(漢字BASIC)が利用可能かの判定
ON ERROR GOTO xxx
CALL ANK
ON ERROR GOTO 0
CALL ANKは日本語が表示可能な「漢字モード」になっているコンソール画面を通常のコンソール画面(いわゆる「ANKモード」)へ戻す命令です。日本語BASICが利用できない場合はエラーを発生しますので、ON ERROR GOTO xxxの行番号ジャンプ先で処理の分岐(日本語BASICの有り無し)を行うことができます。
日本語BASICの漢字モードを使用する(CALL KANJIを実行する)とBASICのフリーエリアが減少しますが、漢字モードを一度も使用していない段階でCALL ANKを実行してもフリーエリアは減少しないのですから問題ありません。
MSXべーしっ君(BASICコンパイラ)が利用可能かの判定
ON ERROR GOTO xxx
CALL TURBO OFF
ON ERROR GOTO 0
CALL TURBO OFFは、BASICコンパイラによって機械語されたプログラムから脱出しBASICへ戻る命令です。MSXべーしっ君が利用できない場合はエラーを発生しますので、ON ERROR GOTO xxxの行番号ジャンプ先で処理の分岐(MSXべーしっ君の有り無し)を行うことができます。
CALL TURBO OFFは、機械語化を開始する「CALL TURBO ON」と対になっています。TURBO ONの実行前にTURBO OFFを実行すると結果的に何も起きないため問題ありません。
MSXべーしっ君(BASICコンパイラ)が実行中かの判定
IF 1E-40 THEN XXXXX ELSE YYYYY
MSXべーしっ君の実行中でない場合は XXXXX の処理へ。実行中の場合は YYYYY の処理へ。
MSXべーしっ君説明書の
— うにの助うに太郎(うにスキー) (@uniskie2) 2023年10月19日
サンプルプログラム「天体」
での、
通常BASICとTURBOモードの面白い判定方法https://t.co/qCBhUHFRlC
340 IF 1E-40 THEN 350 ELSE IF INKEY$=CHR$(13) THEN END
IF 1E-40 THEN
変則的な3byte浮動小数点数までしか扱えないので、1e-40 が0になることを利用しているみたい。
そんな方法があるの!?
キーバッファのクリア
DEFUSR=&H156:A=USR(0)
キークリック音のON/OFF
POKE &HF3DB,0 :'key click sound off
POKE &HF3DB,1 :'key click sound on
Ctrl+STOPの無効化/有効化
その1
POKE &HFBB1,1 :'Ctrl+STOP disable
POKE &HFBB1,0 :'Ctrl+STOP enable
ROM扱いとすることで無効化する方法。
その2
ON STOP GOSUB XXXX
プログラムで制御する方法。
本体RAM容量のチェック
BASICの利用においては8kB・16kB・32kB(以上)の3通りを判定できます。
A=(PEEK(&HFC49)*256+PEEK(&HFC48)) :'check BOTTOM
IF A<16384 THEN :'require 16KB RAM or higher
IF A<32768 THEN :'require 32KB RAM or higher
変数AにRAM容量である8192・16384・32768のいずれかが代入されます。なお変数Aが整数型になっている(DEFINT A-Z等を実行している)場合はOverflowエラーが発生します。
なおMSX1に限り、32kB or 64kBをBASICでサクっと判定できる方法はありません(BASIC上からいわゆる裏RAMへのアクセスが必要となるため)。MSX2以降は64kB以上であることが仕様で確定しています。
BASICからMSX-DOSへ移行する
POKE &HF346,1:CALL SYSTEM
※先にMSX-DOS(1)を起動した状態でBASICへ移行している場合は、POKE命令は必要ありません。
※MSX-DOS2ではPOKE命令は必要ありません。
VDP
画面表示・禁止の切り替え
VDP(2)=VDP(2) OR 64 :'display off
VDP(2)=VDP(2) AND 191 :'display on
R#1のbit6が0で非表示、1で表示。画面表示を禁止するとBASICの処理速度が向上するとの噂。画面表示禁止中も背景色と周辺色は有効になってて、しかも色を変えられる不思議。
192ラインモード・212ラインモードの切り替え
VDP(10)=VDP(10) AND 127 :'192 lines mode
VDP(10)=VDP(10) OR 128 :'212 lines mode
R#9のbit7が0で192ライン、1で212ライン。
スプライトの初期化
DEFUSR=&H69:A=USR(0)
初期化=スプライトの定義を全部0にする=消える、という処理。BSAVE画像のロード時に意図しないスプライトのゴミが表示されるような場面で特に便利。
スプライトの表示・非表示の切り替え
VDP(9)=VDP(9) OR 2 :'sprite off
VDP(9)=VDP(9) AND 253 :'sprite on
R#8のbit1が0で非表示、1で表示。非表示=初期化、ではありません。スプライトの表示を禁止するとBASICの処理速度が若干向上するとの噂。
カラーパレット0番の色も更新する(透明色不使用)
VDP(9)=VDP(9) OR 32
COLOR=RESTORE使用時に特に便利。
CPUモードの切り替え
Z80→R800モード(MSX turbo R)
その1
DEFUSR=&H416:A=USR(0)
その2
DEFUSR=&H180:A=USR(0)
ファッ!?
Z80←→R800相互切り替え(MSX turbo R)
その1
1 DEFUSR=&H8016:A=USR(0):'>♠テ♠π
RUN
コメント以降がZ80のマシン語になっている、変態コード。1文字目のスペード(♠)をクラブ(♣)にするとR800モードになる。MSXPenでこの1行テキストが流し込めます!
その2
A=&HD800:DEFUSR=A:FOR I=0 TO 4:POKE A+I,VAL("&H"+MID$("3E82C38001",I*2+1,2)):NEXT:A=USR(0) :'R800 DRAM mode
A=&HD800:DEFUSR=A:FOR I=0 TO 4:POKE A+I,VAL("&H"+MID$("3E81C38001",I*2+1,2)):NEXT:A=USR(0) :'R800 ROM mode
A=&HD800:DEFUSR=A:FOR I=0 TO 4:POKE A+I,VAL("&H"+MID$("3E80C38001",I*2+1,2)):NEXT:A=USR(0) :'Z80 mode
真面目にBIOSを叩いて実行する方法。長~い!開始アドレスのD800hが適切かは各自で修正してください。
その3
8728 DEFUSR=39+PEEK(-2385)+PEEK(-2384)*256:IFUSR(0)THENLINE>1COPY0&H80F6OR384ALLYOURBASEAREBELONGTOUS!
…これ動くの!?😅
Z80 1.5倍速(5.37MHz)モード(パナソニック製MSX2+)
OUT &H41,154
等速に戻す方法は不明。
MSX2の登場以降にリリースされた各種アプリがMSX1で動くかも!?
MSX2以降のVDPの機能(SCREEN4以降やスプライトモード2等)を用いるアプリは無理ですが…1バイト書き換えるだけで動くかも!?
POKE &HFFF7,PEEK(&HFCC1)
↓ 詳しくはこちらのページで解説しています ↓ gigamix.hatenablog.com
拡張デバイス
漢字ROMの有無チェック
調査中
FM音源(MSX-MUSIC)の有無チェック
調査中 ※CALL MUSICを実行しないで確認する方法を模索しています。実行してしまうとBASICフリーエリアが減って戻せなくなるため。