Gigamix Online

懐かしの8bitおもちゃPC「MSX」を骨までしゃぶり尽くそう。MSXの最新ニュース、ブログ、自作ソフトの配布など。

やりたいことをサッと短く!MSX BASICプロンプトのおまじない的逆引き辞典

【2024.02.07更新】 カラーパレット0番の色も更新する(透明色不使用) 追加

【2023.07.11更新】もろもろ追加

【2023.05.22更新】初版公開

https://p.gigamix.jp/devmsx/cg/basic-tips_title.png

 思いつき次第随時追加。忘れやすい性分で…

MSXのバージョンナンバーを得る

A=PEEK(&H2D)

BASICから種類判別。V=PEEK(&H002D)のVの値を見る 0: MSX1 1: MSX2 2: MSX2+ 3: MSXturboR  turboR の場合、OUT &HE4,6:M=INP(&HE5) bit5 = 0: R800 , 1: Z80 bit6 = 0: DRAMモード, 1: ROMモード (BIOSの置き場) これで判別できまする。MSX0 の場合、設定画面で MSX1/2/2+ のどれを選んだかで V… — HRA! (@thara1129) 2023年3月30日

 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 の処理へ。

 そんな方法があるの!?

キーバッファのクリア

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扱いとすることで無効化する方法。

あえて調べず記憶だけで。ワークエリアのFBB1に1を書き込むんでしたっけ、CTRL+STOP抑制。 — Jun Nishikawa (@JunNishikaw) 2023年5月23日
こういうときは不精がらずにとっとと解決するに限る。というわけで、自宅の荷物地層の奥深く(めそらし)からデータパックを発掘しました。結果、・FBB1 BASROM 0以外はBASICのテキストがROMにある ・FCC1 EXPTBL 各スロットの拡張の有無を示すフラグテーブルということでした。 — まぬ (@koike_manu) 2023年5月23日

その2

ON STOP GOSUB XXXX

 プログラムで制御する方法。

やりたいことをサッと短く!MSX BASICプロンプトのおまじない的逆引き辞典 - Gigamix Online https://t.co/bGz78AqbmU Ctrl+STOPの無効化が調査中となっていたので...方法1 ON STOP GOSUB で無効化する(BASIC正規手段) 方法2 POKE &HFBB1,1 (ROM扱いで無効化) — qajinMSX(小島英彰) (@QajinMSX) 2023年5月23日

本体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エラーが発生します。

BASICからMSX-DOSへ移行する

POKE &HF346,1:CALL SYSTEM

※先にMSX-DOS(1)を起動した状態でBASICへ移行している場合は、POKE命令は必要ありません。
MSX-DOS2ではPOKE命令は必要ありません。

_systemはpoke&hf346,1でしたっけ。若い頃の記憶はわりと出てきますね…。 — おまんじゅう・エポキシ(epoxy) (@drepoxy) 2023年5月23日

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モードの切り替え

Z80R800モード(MSX turbo R)

その1

DEFUSR=&H416:A=USR(0)

MSXturboRは、起動後R800関連の初期化をした後に416Hにジャンプするので、高速モードでBASICを立ち上げてROMを後差ししてから DEFUSR=&H416:A=USR(0) とやれば高速モードのままソフトリセットがかかり、ROMのタイトルも高速で遊べます。 — TINY野郎 (@tiny_yarou) 2021年1月20日

その2

DEFUSR=&H180:A=USR(0)

ついでにZ80モードでBASICを起動した後で高速モードに切り替える技としてDEFUSR=&H180:A=USR(0)というものがあります。tR仕様的には、Aレジスタを2にして180Hを呼ぶとR800モードに切り替わるのですが、USR関数に整数型の引数を与えるとAレジスタが2になるのでたまたま使えます。A=USR(0.5)はダメです笑 — TINY野郎 (@tiny_yarou) 2021年1月20日
Aレジスタのbit7を1にしていないので高速モードランプは消灯のままですが(苦笑)。&h3E,&h82,&hC3,&h80,&h01の5バイトをメモリに書き込んで実行です!(笑)たまにPOKE文で5バイト書いて実行してたな自分。 https://t.co/QOGDWdPNin — ごりぽん (@goripon_tw) 2021年1月20日

 ファッ!?

Z80←→R800相互切り替え(MSX turbo R)

その1

1 DEFUSR=&H8016:A=USR(0):'>♠テ♠π
RUN

 コメント以降がZ80マシン語になっている、変態コード。1文字目のスペード(♠)をクラブ(♣)にするとR800モードになる。MSXPenでこの1行テキストが流し込めます!

また、つまらぬものを創ってしまった…。😩 ちなみに1文字めのスペード♠をクラブ♣にするとR800モード切替です。 pic.twitter.com/j6FXA80wKj — ごりぽん (@goripon_tw) 2023年5月23日

その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が適切かは各自で修正してください。

R800モード→Z80モードは真面目にやるか… A=&HD800:DEFUSR=A:FOR I=0 TO 4:POKE A+I,VAL(

その3

8728 DEFUSR=39+PEEK(-2385)+PEEK(-2384)*256:IFUSR(0)THENLINE>1COPY0&H80F6OR384ALLYOURBASEAREBELONGTOUS!

 …これ動くの!?😅

Check this awesome one liner of NYYRIKKI to switch between Z80 and R800: https://t.co/mOIevKqfcq :) you can even use it in DOS when saving the program as a .com file 🤔 — Sandy Pleyte (@sndpl) 2023年5月23日

Z80 1.5倍速(5.37MHz)モード(パナソニックMSX2+

OUT &H41,154

Panasonic A1-WXでOUT &H41,154 を打ち込んでからカセット刺してソフトリセットをよくやっていました。PSGの音程が上がりますがw バッテリーバックアップなS-RAM入りのWiz1とかでやるのもアレですが、ゲーム中にカセットを抜いてもフロア移動しなければ動くのが驚きでした。 — 龍咲ぎるく (@umix68k) 2021年1月21日

 等速に戻す方法は不明。

MSX2の登場以降にリリースされた各種アプリがMSX1で動くかも!?

 MSX2以降のVDPの機能(SCREEN4以降やスプライトモード2等)を用いるアプリは無理ですが…1バイト書き換えるだけで動くかも!?

POKE &HFFF7,PEEK(&HFCC1)

↓ 詳しくはこちらのページで解説しています ↓ gigamix.hatenablog.com

拡張デバイス

漢字ROMの有無チェック

 調査中

FM音源MSX-MUSIC)の有無チェック

 調査中 ※CALL MUSICを実行しないで確認する方法を模索しています。実行してしまうとBASICフリーエリアが減って戻せなくなるため。