2022/10/24(月) [n年前の日記]
#1 [z80] CP/Mエミュレータ上で画面クリア
_昨日、
CP/Mエミュレータ + Mbasic 5.21 (Microsoft BASIC CP/M版、BASIC-80)で画面クリアの方法が分からなくて悩んでいたけれど、エスケープシーケンスなるものを使えば実現できそうと分かってきたのでメモ。
環境は以下。
画面クリアは、PRINT CHR$(&H1B);"[2J" で実現できるらしい。以下が参考になった。
_エスケープシーケンス
_エスケープシーケンス - Wikipedia
_ワンボードマイコンを作ろう!(8080、Z80マシン語からBASICまでこれ1台でこなせます)
ちなみに、Mbasic のマニュアルに書いてあった、「CHR$(12) で画面クリアできるよ」という話は、どの CP/Mエミュレータ上でも動いてくれなかった。
_BASIC-80 (MBASIC) Reference Manual - BASIC-80_MBASIC_Reference_Manual_text.pdf
実機なら動くのだろうか…? それとも、特定のレトロPCに限った話なのだろうか…?
以下で紹介されてる方法も試してみたけど、どれもダメだった…。これらも実機なら違う動作になるんだろうか…。
_Clear screen command in CP/M BASIC?
環境は以下。
- Windows10 x64 21H2 + YAZE-AG 2.51.2 64bit + CP/M 3.1
- Windows10 x64 21H2 + Altair 8800 simulator 4.0.0 + CP/M 2.2
- Ubuntu Linux 20.04 LTS + YAZE-AG 2.51.3 64bit + CP/M 3.1
- Ubuntu Linux 20.04 LTS + Altair 8800 simulator 4.0.0 + CP/M 2.2
- MBasic 5.21
画面クリアは、PRINT CHR$(&H1B);"[2J" で実現できるらしい。以下が参考になった。
_エスケープシーケンス
_エスケープシーケンス - Wikipedia
_ワンボードマイコンを作ろう!(8080、Z80マシン語からBASICまでこれ1台でこなせます)
- Mbasic で16進数を指定したい時は、&Hxx と記述する。
- CHR$(xx) で、ASCIIコード xx の文字を出力できる。
- PRINT "hoge";"fuga" のように「;」(セミコロン)で繋ぐと、改行せずに続けて表示ができる。
ちなみに、Mbasic のマニュアルに書いてあった、「CHR$(12) で画面クリアできるよ」という話は、どの CP/Mエミュレータ上でも動いてくれなかった。
_BASIC-80 (MBASIC) Reference Manual - BASIC-80_MBASIC_Reference_Manual_text.pdf
実機なら動くのだろうか…? それとも、特定のレトロPCに限った話なのだろうか…?
以下で紹介されてる方法も試してみたけど、どれもダメだった…。これらも実機なら違う動作になるんだろうか…。
_Clear screen command in CP/M BASIC?
◎ カーソル位置を指定。 :
Mbasic上で、エスケープシーケンスとやらを使ってカーソル位置の指定ができそうかどうか試してみた。
ファイル名 : ESCSEQ.BAS
STR$() で先頭に空白が入る問題については、以下が参考になった。
_N88互換BASIC
さておき。前述のプログラムを、run で実行。以下のような見た目になった。
たしかに表示位置を変更することができた。しかし、毎回こんなの書いてられないよなあ…。cursor や locate 文が欲しくなる。
指定する値は、左上が (1, 1) のように見えるのだけど…。(0, 0) ではないの…?
ファイル名 : ESCSEQ.BAS
10 PRINT CHR$(&H1B);"[2J"; 20 FOR Y=1 TO 10 30 X=Y*4 40 Y$=RIGHT$(STR$(Y), LEN(STR$(Y))-1) 50 X$=RIGHT$(STR$(X), LEN(STR$(X))-1) 60 C$="["+Y$+";"+X$+"H" 70 PRINT CHR$(&H1B);C$;C$ 80 NEXT Y
- 10行目で画面クリア。
- 10回ループして、文字列の表示位置を変えている。
- 「ESC[y;xH」を出力すれば、(x, y) にカーソル位置を変更することができるらしい。上記ソースでは、C$ の中に「[y;xH」を格納している。
- STR$(y) で、数値が入った変数 y の値を、文字列に変換することができる。
- STR$(y) は、先頭に空白が入った文字列を返してしまうので、RIGHT$() と LEN() を使って先頭の空白を除去している。
- RIGHT$() は、指定された文字数分、右から数えて文字列を返す。
- LEN() は、与えられた文字列の文字数を返す。
STR$() で先頭に空白が入る問題については、以下が参考になった。
_N88互換BASIC
y=15 Ok print str$(y) 15 Ok print right$(str$(y), len(str$(y))-1) 15 Ok
さておき。前述のプログラムを、run で実行。以下のような見た目になった。
たしかに表示位置を変更することができた。しかし、毎回こんなの書いてられないよなあ…。cursor や locate 文が欲しくなる。
指定する値は、左上が (1, 1) のように見えるのだけど…。(0, 0) ではないの…?
[ ツッコむ ]
以上です。