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

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

X68000(10)

「式の計算電卓コマンド版」、「かけ算・わり算計算機コマンド版」は X68000 エミュレーターで動かすことができました。「昔ながらの BASIC」もX68000 エミュレーターで動かすことはできましたが、間違っているところがあるのでまだ使えません。ファイルサイズが1MB以上になっているので小さくなるように検討した方が良いかもしれません。

「円の面積」の ChatGPT で作った X-BASIC 版はエミュレーターの X-BASIC で読み込ませると「ファイル構造が異常です」となって読み込ませることができませんでした。これについては調査中です。

「ぺけ‐BASIC」で読み込ませてみようと思いましたが「指定された外部関数のファイルが無い」となってしまいました。

「円の面積」の X-BASIC 版に関して、Windows 上で動作確認をするため ChatGPT で Visual Basic に書き換えてもらいました。「円の面積」は Visual Basic 版もあったのでこれと比較してみました。点を追加するとき順番になるように追加する処理が入っていなかったのですが、この関数を Visual Basic 版の「円の面積」から追加すると Visual Basic 版と同様に動きました。

Windows 上で動作確認したプログラムを X68000 エミュレーター用に変換したいのですが、まだ何も方法がありません。

Windows 上でこのプログラムを動かすことはできますか

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

とても良い質問です!
結論から言うと、そのままではWindows上で直接実行することはできません
X-BASICはX68000という独自のハードウェア上で動作するBASICインタプリタなので、そのままWindowsで実行することはできません。
でも、いくつか方法がありますので、順番に解説しますね。

❌ なぜ動かないの?

X-BASICは:

  • X68000のハードウェア(グラフィック、マウス、サウンド)に依存
  • X68000のOS(Human68k)上で動作

だから、Windows上でそのまま「.BAS」ファイルを実行するわけにはいきません。

✅ どうすれば動かせる?

1️⃣ エミュレータを使う

X68000エミュレータXM6 TypeGWinX68k)を使えば、Windows上でX68000の環境を再現できます。

手順(簡易版)

1. XM6 TypeG(またはWinX68k)をダウンロードしてセットアップ。
2. X68000のシステムROM(IPL-ROM)を用意(実機から吸い出すか合法的に入手)。
3. Human68k(OSイメージ)をマウント。
4. BASICディスク(またはX-BASICのイメージ)を用意して実行。
5. あなたのプログラムをロードして実行。

こうすれば、ほぼ実機と同じ感覚で動作させられます。

2️⃣ Windows用に書き換える

もしWindowsネイティブで動かしたい場合は:

  • X-BASICの構文を参考に

VB.NETC#、Processing、Python(Pygame)などで書き換える。

  • グラフィック描画(PSET, CIRCLE, LINEなど)

WindowsGUIライブラリ(例えばWinForms、WPFPygame、p5.jsなど)に置き換え。

  • マウスイベント取得

Windowsのマウスイベントハンドラを使う(例: MouseDownイベントなど)。

ただしこれは実質的に新しいアプリを書くのに近いです。

🖥️ 3️⃣ 具体例(VB.NET簡易イメージ)

もしWindowsネイティブで簡易的に試したいなら、例えばVB.NETWindowsフォームアプリで書き換える例もできます:

  • フォームのPaintイベントで円を描画
  • MouseDownイベントで座標取得
  • 点をリストに追加して多角形を描画
  • Shoelace formulaで面積計算

こうした書き換え例もお手伝いできますよ!

📝 結論

方法 内容
エミュレータ(XM6など) X68000環境を再現してそのまま動かす。
Windows移植(VB.NETなど) コードを書き換えてWindowsネイティブで動かす。

もしご希望があれば、どちらかの方法で手順を詳しくお手伝いしますので、ぜひ教えてくださいね! 🚀

Visual Basic に書き換えてください

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

了解です!
先ほどのX-BASICのロジックをVisual BasicVB.NETWindowsフォームアプリケーションに書き換えますね。
以下は、クリックした位置を単位円に正規化して円周上に配置し、その点を結んで多角形を描画し、面積を計算して表示するVB.NETコード例です。

📄 Visual BasicVB.NET)コード例

Imports System.Drawing.Drawing2D

Public Class Form1
    Private Const RADIUS As Integer = 200
    Private Const UNIT_RADIUS As Double = 1.0

    Private centerX As Integer
    Private centerY As Integer
    Private points As New List(Of PointF)()

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.DoubleBuffered = True  ' チラつき防止
        centerX = Me.ClientSize.Width \ 2
        centerY = Me.ClientSize.Height \ 2
    End Sub

    Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
        Dim g As Graphics = e.Graphics
        g.SmoothingMode = SmoothingMode.AntiAlias

        ' 背景クリア
        g.Clear(Color.White)

        ' 大きな円
        g.DrawEllipse(Pens.Blue, centerX - RADIUS, centerY - RADIUS, RADIUS * 2, RADIUS * 2)

        ' 小さい点
        For Each p In points
            Dim px As Single = centerX + CSng(RADIUS * p.X)
            Dim py As Single = centerY + CSng(RADIUS * p.Y)
            g.FillEllipse(Brushes.Red, px - 5, py - 5, 10, 10)
        Next

        ' 多角形
        If points.Count >= 2 Then
            Dim polygon As PointF() = points.Select(
                Function(p) New PointF(centerX + CSng(RADIUS * p.X),
                                       centerY + CSng(RADIUS * p.Y))
            ).ToArray()
            g.DrawPolygon(Pens.Green, polygon)
        End If

        ' 面積計算
        If points.Count >= 3 Then
            Dim area As Double = CalculatePolygonArea(points)
            Dim str As String = $"面積(単位円換算): {area:F4}"
            g.DrawString(str, Me.Font, Brushes.Black, 10, Me.ClientSize.Height - 30)
        End If
    End Sub

    Private Sub Form1_MouseDown(sender As Object, e As MouseEventArgs) Handles Me.MouseDown
        If e.Button = MouseButtons.Left Then
            ' 中心からの相対座標
            Dim dx As Single = e.X - centerX
            Dim dy As Single = e.Y - centerY
            Dim dist As Double = Math.Sqrt(dx * dx + dy * dy)
            If dist <> 0 Then
                ' 単位円上に正規化
                Dim nx As Single = CSng(dx / dist)
                Dim ny As Single = CSng(dy / dist)
                points.Add(New PointF(nx, ny))
                Me.Invalidate()
            End If
        ElseIf e.Button = MouseButtons.Right Then
            ' 右クリックでリセット
            points.Clear()
            Me.Invalidate()
        End If
    End Sub

    Private Function CalculatePolygonArea(pts As List(Of PointF)) As Double
        ' Shoelace formula
        Dim area As Double = 0
        Dim n As Integer = pts.Count
        For i As Integer = 0 To n - 1
            Dim j As Integer = (i + 1) Mod n
            area += (pts(i).X * pts(j).Y) - (pts(j).X * pts(i).Y)
        Next
        Return Math.Abs(area) / 2.0
    End Function
End Class

🚀 使い方

1️⃣ Visual Studioで「Windowsフォームアプリケーション(VB.NET)」プロジェクトを新規作成します。
2️⃣ 上記コードを`Form1.vb`にペーストします。
3️⃣ 実行すると:

  • 青い大きな円が描画されます。
  • 左クリックで円周上の点を追加(円周上に補正されます)。
  • 右クリックでリセット(点を消去)。
  • 点を3個以上追加すると多角形と面積が表示されます。

📝 補足

  • 点を円周上に正規化:クリック位置を中心からのベクトルで割って、常に半径1(単位円)上に置きます。
  • 画面表示:`RADIUS`は単位円のスケール(ピクセル)です。
  • 面積:Shoelace公式(多角形の符号付き面積)をそのまま単位円座標で計算。

もし必要に応じて拡張(色分け、保存、複数多角形描画、点の削除)もできますので、気軽に言ってくださいね! 🌟

Visual Basic から X-BASIC に変換することはできますか

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

いい質問ですね!
結論から言うと、Visual BasicVB.NET)からX-BASIC(X68000用)へ直接「自動的」に変換するツールは存在しません
ただし、VB.NETのコードを人手でX-BASICの文法に書き換えることは可能です。
ここで、なぜそうなるのか、どこが難しいのか、そしてどうやって書き換えるのかを説明しますね!

✋ そもそも、VB.NET と X-BASIC は全く別物!

VB.NET X-BASIC
プラットフォーム Windows.NET Framework X68000(Human68k OS)
言語機能 イベントドリブン(Form1_MouseDownなど) 手続き型(メインループを自分で作る)
グラフィック描画 GDI+(Graphics.DrawEllipse, FillEllipse) X-BASICの`CIRCLE`, `LINE`, `PSET`
マウス入力 イベント(MouseDown) ポーリング(`MOUSE`関数で状態取得)
配列/データ型 ジェネリック、クラス、リスト 基本的に配列(DIM)と変数のみ

🔧 どうやって手動で変換するか?

例:VB.NET ➡ X-BASIC

以下のコード(VB.NET

Private Sub Form1_MouseDown(sender As Object, e As MouseEventArgs)
    Dim dx As Single = e.X - centerX
    Dim dy As Single = e.Y - centerY
    Dim dist As Double = Math.Sqrt(dx * dx + dy * dy)
    If dist <> 0 Then
        Dim nx As Single = CSng(dx / dist)
        Dim ny As Single = CSng(dy / dist)
        points.Add(New PointF(nx, ny))
        Me.Invalidate()
    End If
End Sub

これをX-BASICで書くとこんな感じ:

' 画面中央からの座標
DX = MX - CX
DY = MY - CY
DIST = SQR(DX*DX + DY*DY)
IF DIST <> 0 THEN
    NX = DX / DIST
    NY = DY / DIST
    N = N + 1
    X(N) = NX
    Y(N) = NY
END IF

✅ ポイント:

  • VB.NETのイベントはX-BASICではポーリング(`MOUSE`)で代用
  • List(Of PointF) はX-BASICの`DIM X(100), Y(100)`などの配列で代用
  • Graphicsオブジェクトは直接`CIRCLE`, `LINE`, `PSET`で代用
  • Form1_Paint → X-BASICではループの中で`CLS`して描き直す感じ

✍️ 結論

  • 自動変換ツールはない(手動で書き換えるしかない)
  • 人手で置き換えは可能(基本構造を理解して対応するX-BASIC文法に書き換え)
  • X-BASICはシンプルなので、マウス検出や描画は「ループ + ポーリング」でまとめればOK

もし具体的に「このVB.NETコードをX-BASICに書き換えてほしい!」という部分があれば、ぜひ教えてください!
ピンポイントで書き換えてみますので、お気軽にどうぞ。 🚀