2025-07-01から1ヶ月間の記事一覧
仕様の変更 前回の仕様に、グローバル変数を定義する方法を追加します。 グローバル変数 グローバル変数を定義する方法を追加します。 var.l 初期値 var.w 初期値 var.b 初期値 array.l 個数 array.w 個数 array.b 個数 デバッグ用疑似命令 デバッグ用疑似命…
前回のオペランドに「-(レジスタ)」と「+(レジスタ)」が必要だったので追加します。 オペランド オペランドがアドレスを表す場合 ラベル → ラベルが表すアドレスを取得 数値 → その数値を取得 (レジスタ) → レジスタの値を取得 (数値,レジスタ) → レジスタの…
前回のプログラムを改造して 68000 アセンブリ言語のインタープリターを作ります。以下のような仕様とします。 デバッガーのコマンド exit 終了 step ステップ実行 continue 実行再開 breakpoint 行番号 ブレークポイント設定・解除 output デバッグ出力設定…
さらに ChatGPT で調べてみました。2025年でも ChatGPT で調べればなんとかなるようです。ここに書いた GCC が出力したアセンブリ言語のサブルーチンの中で呼び出されるサブルーチンを直接メモリーに書き込むように書き換えたいのですが、うまくいかなかった…
X68000 用のプログラムでスーパーバイザーモードの中にコンパイラが出力するアセンブリ言語のプログラムを書くのが目的なので、少しやり方を変えます。スタックの状態がよくわからないのが問題の一つと考えられます。まずそれを調べるために以下のようなこと…
「昔ながらの BASIC(1) - 非専門的シンギュラリティー研究所」では、「C++ の調査(8) - 非専門的シンギュラリティー研究所」から「C++ の調査(10) - 非専門的シンギュラリティー研究所」で作った簡単な BASIC インタープリターを改造して、アセンブリ言語の…
インラインアセンブラから参照するグローバル変数とそれを設定する関数を追加しました。これらの変数は スーパーバイザーモードで参照するとき IOCS コールでアドレスを渡すとき に使います。このような場合、グローバル変数で渡す以外の方法がわからないの…
「現在の位置から楕円の弧を描画する関数」の実行速度を改善するために三角関数を表から取得するように変更しました。 現在の位置から楕円の弧を描画する関数(インラインアセンブラ) asm( "drawarctox_a:\n\t" "lea (-20,%sp),%sp\n\t" "movem.l #7966,-(%sp…
さらにコンパイラの出力から関数を作成しました。 楕円の扇型を描画する関数(インラインアセンブラ) asm( "drawpiex_a:\n\t" "subq.l #4,%sp\n\t" "movem.l #7966,-(%sp)\n\t" "move.l 44(%sp),%d5\n\t" "move.l 48(%sp),%a6\n\t" "move.l 52(%sp),%d7\n\t" …
インラインアセンブラの中からグローバル変数を参照するように変更しました。楕円の弧を描画する関数を作成しました。これは実行速度が遅いので改善する必要があります。これは IOCS コールでもできるのですが、そのようなものは IOCS を使うものも作成しよ…
X68000 用の線を描画する関数をコンパイラの出力を使って書き直しました。コンパイラの出力と同じ呼び出しの形式にしておくと、この関数を使う関数をコンパイラの出力で書けるというメリットがあります。この関数を使う関数の中で浮動小数点のファンクション…
X68000 用の浮動小数点のファンクションコールをインラインアセンブラで書きました(sin 関数以外も同様です)。C++ から呼び出せる形になっているかどうかはまだ調査中です。塗りつぶした角が丸い四角形を描画する IOCS コールがないようなので作っておいた方…
X68000 版の線を描画する関数で使っている乗算・除算を浮動小数点のファンクションコール(この中に乗算・除算も含まれている)の呼び出しに変更しました。 乗算 asm( "sys_multiply_a:\n\t" "move.l %d1, -(%sp)\n\t" // スタックに d1 を保存 "move.l 8(%sp)…
乗算・除算をインラインアセンブラで記述した shiftasm.x を以下のように修正しました。 iostream と string を使わないように変更しました。実行ファイルのサイズは 98KB になりました。 実行方法を選択することができるようにしました。 乗算・除算をイン…
構文木を出力する機能についても ChatGPT で調べてみます。 GCC の構文木を出力する機能について教えてください と入力すると以下のような答えが返されました。 GCC(GNU Compiler Collection)には、C/C++ などのソースコードを解析して生成される構文木(…
C# のコードとして構文を書くとき、演算子再定義のほかに以下のような機能を使っていたので ChatGPT で調べてみます。これを C++ で実現するには、同じようにはできないのでやり方を考えないといけないようです。 C# のプロパティで、本体が単一の式であるも…
X68000 用に GCC のインラインアセンブラに書くためのプログラムを作るのが一つの目的だったのですが、コンパイルした結果を使って(やり方は変ですが)変数の値をいったん別の領域に入れておくように変更すれば動くことがわかったのであまり必要性はなくなり…
線を描画する関数をコンパイルした結果をインラインアセンブラに取り込んだものを作成しました。「関数電卓コマンド版(3) - 非専門的シンギュラリティー研究所」の乗算・除算のコードを使っています。そのままでは動かなかったので変数をスタックで渡さず変…
C++ のパーサーコンビネーターとしては Boost.Spirit というものがあるそうですが、検索してみたところ使うのは難しそうです。自力でパーサーコンビネーターを作っているような記事もありました。調べていないのですが簡単な構文を書くには向いていないのか…
『ふつうのコンパイラをつくろう 言語処理系をつくりながら学ぶコンパイルと実行環境の仕組み』という本を買ったのでコンパイラについて調べてみます。X68000 のプログラムを作っていたら C++ では書けないようなものを作る必要がある場合もあるので、そんな…
乗算・除算をインラインアセンブラで記述したものを作成しました。『独習アセンブラ 新版』に GCC のインラインアセンブラの書き方が説明されています。 #define USE_X68000 で X68000 版を作ることができます。最初は起動できなかったのですが、実行ファイ…
「昔ながらの BASIC(9) - 非専門的シンギュラリティー研究所」で作った乗算と除算の関数 multiply2 と divide1 をコンパイルした結果を見てみます。BITRANGE を以下のように定義します。 #define BITRANGE 16 乗算 int shift_multiply(int x, int y) { int c…
「関数電卓」をコマンドで実行できるように C++ で書き直したものを作成します。「関数電卓」は「関数のグラフ」の関数計算の部分を取り出したものです。X68000 で関数の計算をするサンプルとしても使えるようにします。使い方は「式の計算電卓コマンド版(1)…
ピクセルごとの描画を行う関数を作成しました。これをインラインアセンブラに書きたいのですが、どうやってやるか検討中です。スーパーバイザーモードへの切り替えを別の関数にするやり方は、うまく動作しませんでした。スーパーバイザーモードから戻るのが…
コンパイルした結果から取り込むのは難しいということがわかったので、とりあえず以下の関数はハンドコンパイルで作成しました。 point に対応する関数 int pointx(int x1, int y1) { uint16_t color = 0; __asm__ volatile ( "move.l %1, %%d1\n\t" "move.l…
『X68000マシン語プログラミング グラフィックス編』のサンプルを参考に pset の代わりに使う以下の psetx を作成しました。この psetx を使うように変更した FillRectangle を実行すると速度は遅いですが描画できました。 void psetx(int x1, int y1, int c…
Windows 版の SetPixel を使った四角形を描画する関数 DirectDrawRectangle と塗りつぶした四角形を描画する関数 DirectFillRectangle は以下のようになります。これらの関数の形式はできるだけ .NET Framework の関数に合わせるようにします。これは C# か…
Windows 版の SetPixel を使った直線を描画する関数 DirectDrawLine は以下のようになります。DirectDrawLineTo は連続した直線を描くときに使います。X68000 で直接メモリーに書き込む形で描画するには、スーパーバイザモードに切り替えなければいけません…