パソコンサンデーしてみる。

バイナリにパッチまでしてようやくDOSでBASICが使えるようになったのにそれを使わないのはもったいない。QBasicもそれなりに便利だけど、教育上良くないとも言われる旧来のBASICにもそれなりの趣がある、と思う。

関連
IBM DOS (PC DOS)のBASIC

使えるようになったものの別売のBASICのマニュアルが無いからなんとなくしか使えない。自分が知らない世界の8ビットだとか16ビットだとか言ってた当時のBASICといえばMS-BASICベースかそれ準拠の古典的BASICだというところまでは推測がついても、このころのBASICは機種依存の「方言」が多くて共通項だけではいまいちおもしろいプログラムを作れない。

使えると楽しくなるステートメントを探ってみた。

・テキストカラー
テキストと背景の色指定ができないとBASICの魅力が半減する。趣があるIBM 5550のグリーンディスプレイを再現するのも一興。標準のスクリーンモード(カラーテキスト)でカラー表示ができる。アトリビュート指定はできないっぽい。

COLOR 前景色[,背景色] 0黒、1青、2緑、3水色、4赤、5紫、6橙、7白 +8で明るい色

CLSすると背景色で塗りつぶされる。

・グラフィック
ぎざぎざなグラフィックが使えないとBASICの魅力が半減する。640×480×16色パレットが使える。

スクリーンモード
SCREEN 0 テキスト
SCREEN 11 モノクログラフィック
SCREEN 12 カラーグラフィック


※COLORステートメントとの関連
SCREEN 11では使用不可
SCREEN 12では背景色が指定不可


描画命令
よくあるLINEやCIRCLEの他にもDRAWステートメントが使える。これは引数にテキスト形式でタートルグラフィックスで描画内容を指定できる。

IBM 5550ステーションのサンプルを移植した。

・サウンド
矩形波の音が出ないとBASICの魅力が半減する。固定のビープ音と1chのPCGが使える。PCGはPLAYステートメントで引数にテキストで演奏内容を指定すると同期/非同期で実行される。

例:
・BEEP
・PLAY "MB T172O3L16DEF#GABO4C#L4D"
MB バックグラウンド再生 / MF同期再生
Tnnn テンポ nnn=32~255
On オクターブ n=0~6
Lnn 音価 nn=1~64
A~G 音名 #、+ / -を後に付けると半音上げ/下げ

IBM 5550のサンプルを無理矢理動かしてみた。一応鳴る。

・シリアル通信
BASICは割と初期からデバイスをファイルとして扱う慣習が確立されている。これができるとIPネットワークに頼らずとも外界のデバイスを制御できて応用範囲が圧倒的に広がる。

OPEN “デバイス名:パラメータ” AS #n でデバイスを開くとファイル番号で入出力ができる。

動作サンプル

シリアルをパイプで接続してputtyと通信した。

・マウス入力
マウスも使えると何かと便利だけどIBM BASIC本体では扱えないのでデバイスドライバの支援が必要。DOSでMOUSEドライバを読み込んでおいてからINT 33Hをコールする。

参考
https://github.com/mbirth/gwbasic/blob/master/MOUSE.BAS

100 DEFINT A,B,C,D
110 SCREEN 12:CLS:LOCATE 1,1,0
120 DEF SEG=0
130 MSEG=&H100*PEEK(&H33*4+3)+PEEK(&H33*4+2)
140 MOUSE=&H100*PEEK(&H33*4+1)+PEEK(&H33*4)+2
150 IF MSEG=0 AND (MOUSE-2)=0 THEN 190
160 DEF SEG=MSEG
170 IF PEEK(MOUSE-2)=&HCF THEN 190
180 GOTO 200
190 PRINT "Mouse driver not found.":END
200 AX%=0
210 CALL MOUSE(AX%, BX%, CX%, DX%)
220 IF AX=-1 THEN 240
230 PRINT "Mouse driver not enabled.":END
240 PRINT "Mouse driver status=";BX
250 AX=10:BX=1:CX=2:DX=5
260 CALL MOUSE(AX%, BX%, CX%, DX%)
270 AX=1
280 CALL MOUSE(AX%, BX%, CX%, DX%)
290 AX=3
300 CALL MOUSE(AX%, BX%, CX%, DX%) 
310 LOCATE 2,1,0:PRINT USING "X=###   Y=###   BTN=#";CX,DX,BX
320 IF BX=1 THEN P=INT(RND(1)*16):CIRCLE(CX-10,DX-10),10,P:PAINT(CX-10,DX-10),P
330 IF INKEY$="" THEN 270
340 END
クリックしたところに円を描く。

見直したらなんかまとまりが無い。もうちょっとちゃんと調べよう。

コメントを残す