mieki256's diary



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?

カーソル位置を指定。 :

Mbasic上で、エスケープシーケンスとやらを使ってカーソル位置の指定ができそうかどうか試してみた。

ファイル名 : 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 で実行。以下のような見た目になった。

ss_esc_seq_bas.png

たしかに表示位置を変更することができた。しかし、毎回こんなの書いてられないよなあ…。cursor や locate 文が欲しくなる。

指定する値は、左上が (1, 1) のように見えるのだけど…。(0, 0) ではないの…?

以上、1 日分です。

過去ログ表示

Prev - 2022/10 - Next
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project