非専門的シンギュラリティー研究所

無限に動き続けるシステムを表す方法を AI なども使って考えていきます。

X68000(9)

円の面積」と同様のものを ChatGPT に X-BASIC で作ってもらいました。

X68000 の X-BASIC の機能について教えてください

と入力すると以下のような回答が返されました。

もちろんです!X68000X-BASIC は、シャープのX68000シリーズ(1987年発売の日本製パソコン)向けに用意されたBASIC言語の一種です。以下のような特徴や機能があります。

🔹 X-BASIC の概要

X-BASICは、X68000のグラフィカルな機能を活かすために設計されたインタプリタ型のBASIC言語で、GUIアプリやゲーム開発の入門にも適していました。MSX-BASICやPC-8801のN88-BASICとも似ていますが、X68000ならではの機能が充実していました。

🔸 主な機能

1️⃣ グラフィック機能

  • 4096色(または65,536色)のグラフィックモードをBASICから直接制御できます。
  • `LINE`, `CIRCLE`, `PAINT`, `PSET` などの描画命令が豊富。
  • スプライトの扱いも可能(ただし、より本格的なスプライト処理はアセンブリで行うことが多かった)。

2️⃣ サウンド機能

  • FM音源(YM2151)をサポートしていて、BGMや効果音を鳴らすことができます。
  • `SOUND`, `PLAY` などの命令でメロディ演奏が可能。
  • PCM再生機能もあり、WAVEデータのようなサウンドも扱えます。

3️⃣ マウス・ジョイスティック対応

  • `MOUSE` や `STICK` 命令でマウス座標やボタン状態、ジョイスティック入力の取得が可能です。

4️⃣ ファイル入出力

  • ディスクファイルの読み書き(BASIC標準の `OPEN`, `INPUT`, `PRINT`, `CLOSE` など)。
  • X68000ファイルシステム(HUMAN68K)上のファイル操作が可能。

5️⃣ 演算・制御構造

  • FOR/NEXT, WHILE/WEND, IF/THEN/ELSE, SELECT CASE などの制御構造。
  • 変数・配列、ユーザー定義関数(DEF FN)など、標準的なBASIC文法に準拠。

🔸 拡張性・実用面

  • 組み込みアセンブリ(CALL文でアセンブリルーチンを呼び出す)も可能なので、高速処理を組み込めます。
  • 外部ライブラリ(拡張モジュール)をロードして機能を増やすこともできました。
  • X68000特有の独自周辺機器(SCSIMIDI、プリンタ)なども、アドレス直叩きやCALLで扱えました。

🔹 まとめ

X-BASICはX68000を手軽にプログラムするのにとても便利で、特にグラフィックやサウンド機能を直感的に利用できる点が強みでした。ただし、本格的なゲームやアプリ開発では速度の面からCやアセンブリが選ばれることも多かったです。

もし、特定の命令やサンプルコードが知りたい場合は教えてくださいね!例えば、`SCREEN`や`SOUND`命令の例、マウスの使い方なども具体的に説明できますよ。 😊

グラフィックス機能とマウスの機能について教えてください

と入力すると以下のような回答が返されました。

いいですね!X68000X-BASIC の「グラフィックス機能」と「マウス機能」について詳しく説明しますね。

🎨 1️⃣ グラフィックス機能

X-BASIC では、X68000 の強力なグラフィック機能を簡単に使えるようになっています。主に以下のような機能が用意されています。

🔸 画面モード

X68000 では「グラフィックモード」を指定して画面解像度や色数を決めます(例:4096色、512x512など)。

`SCREEN n`: グラフィック画面を開く命令(例:`SCREEN 5`)。

🔸 描画命令

いくつか代表的な命令を紹介しますね。

命令 説明
`PSET` 点を描画する(例: `PSET (100,100),15`)。
`LINE` 線を描画(例: `LINE (50,50)-(150,150),3`)。
`CIRCLE` 円や弧を描く(例: `CIRCLE (200,200),50,5`)。
`PAINT` 塗りつぶし(例: `PAINT (100,100),2`)。
`COLOR` 描画色を設定(例: `COLOR 3`)。
`CLS` 画面消去(例: `CLS`)。

🔸 パレット

X68000 では4096色(RGB各4bit)や65536色(RGB各5bit)を扱えます。

  • `PALETTE n,r,g,b`: パレット番号`n`に色を割り当てます。

例:

PALETTE 0,15,0,0   ' 赤
PALETTE 1,0,15,0   ' 緑
PALETTE 2,0,0,15   ' 青

🖱️ 2️⃣ マウス機能

X-BASICではマウス操作も比較的簡単に使えます。

🔸 マウスの座標取得

  • `MOUSE X,Y,B`
    • `X`と`Y`: マウスカーソルの座標(画面上の位置)。
    • `B`: ボタン状態(ビット列で表現)。

例:

DIM MX,MY,MB
MOUSE MX,MY,MB
PRINT "X=";MX," Y=";MY," Buttons=";MB

🔸 ボタン判定

`MB`の値はビットで表され、例えば:

  • 1ビット目(1): 左ボタン
  • 2ビット目(2): 右ボタン
  • 3ビット目(4): 中央ボタン(機種により対応しない場合あり)

例:

IF (MB AND 1) <> 0 THEN PRINT "Left button pressed!"
IF (MB AND 2) <> 0 THEN PRINT "Right button pressed!"

🌟 まとめ

グラフィックス:`SCREEN`, `PSET`, `LINE`, `CIRCLE`, `PAINT`, `COLOR`, `PALETTE` など
マウス:`MOUSE`命令で座標・ボタン状態を取得

X68000 のX-BASICはこうした機能を活かしてGUIアプリやゲームの試作にも使われました。もし実際のコード例をもう少し詳しく見たいなら、ぜひ教えてくださいね! 📘✨

以下のような X-BASIC のプログラムを作ってください:

円が表示されていて、その円の円周上の点をマウスでクリックすると、点の場所を示すために小さい円が表示されます。
マウスのクリックを繰り返して円周上の点を追加していきます。
円周上の点が追加されると、それらの点を頂点とする多角形が表示されて、その多角形の面積(円の半径を1とする)が表示されます。

と入力すると以下のような回答が返されました。

了解です!とても面白い課題ですね!
X68000X-BASIC で、以下の要件を満たすプログラムを作成します。

✅ 円(半径R)を画面中央に表示
✅ マウスでクリックすると円周上の点を計算し、小さい円でその位置を表示
✅ クリックごとに点を追加し、それらの点を結んで多角形を描画
✅ 半径1の場合の正規化面積を計算して表示

🖥️ ポイント

  • 座標変換

画面座標(ピクセル) → 単位円(半径1) → 正規化面積

  • 面積計算

多角形の面積は符号付き面積公式(Shoelace formula)で求めます。

  • グラフィック描画

`LINE`, `CIRCLE`, `PSET` を使用。

📄 サンプルコード(X-BASIC)

' X-BASIC (X68000)
SCREEN 5  ' 512x512ドット, 16色

CONST CX = 256   ' 画面中心X
CONST CY = 256   ' 画面中心Y
CONST RADIUS = 200  ' 表示する円の半径(ピクセル)
CONST UNIT_RADIUS = 1.0  ' 単位円

DIM X(100), Y(100)
DIM MX, MY, MB
N = 0

CLS
CIRCLE (CX, CY), RADIUS, 2

PRINT "クリックで点を追加。右クリックで終了"

DO
    MOUSE MX, MY, MB
    IF (MB AND 1) <> 0 THEN
        ' マウスクリック
        DX = MX - CX
        DY = MY - CY
        DIST = SQR(DX*DX + DY*DY)
        IF DIST <> 0 THEN
            ' 円周上の座標に正規化
            NX = CX + RADIUS * (DX / DIST)
            NY = CY + RADIUS * (DY / DIST)
            N = N + 1
            X(N) = (DX / DIST)  ' 単位円でのX座標
            Y(N) = (DY / DIST)  ' 単位円でのY座標
            
            ' 描画
            CIRCLE (NX, NY), 5, 3
            
            ' 多角形描画
            IF N > 1 THEN
                CLS
                CIRCLE (CX, CY), RADIUS, 2
                FOR I = 1 TO N
                    IX1 = CX + RADIUS * X(I)
                    IY1 = CY + RADIUS * Y(I)
                    IX2 = CX + RADIUS * X( (I MOD N)+1)
                    IY2 = CY + RADIUS * Y( (I MOD N)+1)
                    LINE (IX1, IY1)-(IX2, IY2), 4
                    CIRCLE (IX1, IY1), 5, 3
                NEXT
            END IF
            
            ' 面積計算(Shoelace formula)
            AREA = 0
            IF N >= 3 THEN
                FOR I = 1 TO N
                    J = (I MOD N) + 1
                    AREA = AREA + (X(I)*Y(J) - X(J)*Y(I))
                NEXT
                AREA = ABS(AREA) / 2
                LOCATE 1, 25
                PRINT "面積(単位円換算):"; AREA
            END IF
            
            ' デバウンス(クリック離すまで待機)
            DO
                MOUSE MX, MY, MB
            LOOP WHILE (MB AND 1) <> 0
        END IF
    END IF
LOOP WHILE (MB AND 2) = 0  ' 右クリックで終了

🔍 ポイント解説

クリック検出:`MOUSE MX,MY,MB`で座標とボタン状態を取得
円周上に補正:クリック位置を中心からの方向ベクトルで正規化して円周上の点に
多角形描画:点同士を `LINE` で結ぶ(最後の点と最初の点も結ぶ)
面積:Shoelace公式で計算し、半径1の座標系で出力(正規化済みなのでそのままOK)

もしコードをステップバイステップで解説したり、改良(例:色指定、点数上限、バウンス処理、外部ファイル保存など)も可能なので、気軽にリクエストしてくださいね! 😊