【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が利用可能か)の判定
その1
ON ERROR GOTO xxx
CALL IOTINIT()
ON ERROR GOTO 0
CALL IOTINITはMSX0 Stackと接続された各種デバイスの初期化を行う拡張命令です。MSX0 StackのIoT BASICが利用できない場合はエラーを発生しますので、ON ERROR GOTO xxxの行番号ジャンプ先で処理の分岐(IoT BASICの有り無し)を行うことができます。
その2
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はMSX-DOS2の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べーしっ君説明書の
— うにの助うに太郎(うにスキー with 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以上であることが仕様で確定しています。
【参考】RAM容量に関連するワークエリア
| ラベル名 | アドレス | バイト数 | 内訳 |
|---|---|---|---|
| EXPTBL | FCC1h | 4 | 基本スロットの拡張の有無(下記参照) |
| FCC1h | 1 | メインROMのスロット番号 | |
| FCC2h | 1 | スロット1の拡張の有無(YES: 80h, NO: 00h) | |
| FCC3h | 1 | スロット2の拡張の有無(YES: 80h, NO: 00h) | |
| FCC4h | 1 | スロット3の拡張の有無(YES: 80h, NO: 00h) | |
| RAMAD0 | F341h | 1 | ページ0(0000h~3FFFh)のRAMのスロット番号 ※Disk BASICで利用可。ROM BASICは利用不可 |
| RAMAD1 | F342h | 1 | ページ1(4000h~7FFFh)のRAMのスロット番号 ※Disk BASICで利用可。ROM BASICは利用不可 |
| RAMAD2 | F343h | 1 | ページ2(8000h~BFFFh)のRAMのスロット番号 ※Disk BASICで利用可。ROM BASICは利用不可 |
| RAMAD3 | F344h | 1 | ページ3(C000h~FFFFh)のRAMのスロット番号 ※Disk BASICで利用可。ROM BASICは利用不可 |
【参考】64KBか否かの判定の議論ログ
Tablacus DISK ROM LiteはRAM16KBや8KBの機種でもHIMEMの外にRAMAD0~RAMAD3があるから値が不用意に書き換わらなくて良いですね。0以外ならどこかのスロットにRAMがある、でも本当に基本スロット0に存在するページ3は0になる(ややこしい)。64KBか否かの判別でRAMAD0を見るというのも一つの手ですね。 pic.twitter.com/UJ5bSWBhid
— ニューファンキー小林 (@nf_ban) 2023年8月9日
スロット0にRAMがある場合に0になって見分けが付かないのは罠ですね。
— Gaku (@tablacus) 2023年8月9日
スロット0の件(100点ではないが思いつきで)
— TKZ80 (@TKZ80) 2023年8月9日
MainROMとページ0RAMの同居はあり得ないので
EXPTBL(FCC1H) = RAMAD0 の時は ページ0RAMなし
と(追加で)判定したらいかがでしょう?
※Disk有りに限る
※原則MainROMはスロット0、例外でMSX2バージョンアップアダプタを追加したらRAMも64kのハズ。
EXPTBL=RAMAD0でRAM無し判定、確かにおっしゃる通りです。Disk BASICやTablacus DISK ROM LiteではRAMAD0~が使える…はまぁ枝葉の話で、元々はRAMAD0~が使えないROM BASIC上でRAMの容量(特に64KBか否か)を調べるにはどうすれば…という話をしていました。BOTTOM(FC48h)では役不足なんですよね…
— ニューファンキー小林 (@nf_ban) 2023年8月10日
MSX史上「RAM48KB(4000h~FFFFh)」は存在しない(はずな)のでEXPTBL=RAMAD0であれば32KB以下という判定で良いかと。
— ごりぽん (@goripon_tw) 2023年8月10日
引用ポスト間違えたので再度。
— ごりぽん (@goripon_tw) 2025年12月7日
この件、実はRAMAD0=EXPTBLでのRAM不存在チェックは、公式に使われてる技だったことが判明。
以下DOS1カーネルの該当部分のコード。
ページ1のRAM不存在チェックもRAMAD1=EXPTBLですな。 https://t.co/Bu3PfYgwVM pic.twitter.com/FCAXf1BaQi
BASICからMSX-DOSへ移行する
POKE &HF346,1:CALL SYSTEM
※先にMSX-DOS(1)を起動した状態でBASICへ移行している場合は、POKE命令は必要ありません。
※MSX-DOS2ではPOKE命令は必要ありません。
VDP
画面表示・禁止の切り替え
VDP(1)=VDP(1) AND 191 :'display off
VDP(1)=VDP(1) OR 64 :'display on
R#1のbit6が0で非表示、1で表示。画面表示を禁止するとBASICの処理速度が向上するとの噂。画面表示禁止中も背景色と周辺色は有効になってて、しかも色を変えられる不思議。
192ラインモード・212ラインモード(Y方向ドット数)の切り替え
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フリーエリアが減って戻せなくなるため。












