スキップしてメイン コンテンツに移動

投稿

MZ-80でお馴染みの アレのクロスコンパイラを作ってみた。

そうだ、「tank-defender(I/O ’81/08:TANK-DEFENDER)」やりてー とか思いたち 掲載されてるI/Oは持ってる、MZ-700も有る。FORMも持ってる。 過去に一度 打ち込んだんだが、その時のデータはMZ-1500を 知人に譲るときに一緒に付けたカセットに入っていて手元にはない。 ダンプリストから打ち込むしかない、だが今更 老体に鞭打ってMZ-700のキーボードで ポチポチ打ち込んでなどいられない。 前に打ち込んだときは、MZ-80KE2のキーボードで10インチのモニタの前で 眠い目擦りながらの打ち込みだった。若かったからやれたが今となっては無理筋だ。 そこで21世紀の未来技術(笑)を使おうじゃないか まず、FORMの逆アセンブル解析データは以前作ったものが有るので これを、chatGPTさんにみせて、runtimeとcompilerとエディタ類に分けてもらい。 欲しいのは、runtimeとcompiler部分 これを、gcc用に書き換えともらう。 当初はruntimeまでC言語に書き換えようとしてたが、 runtimeは z80のアセンブラソースとしてインクルードすることにした。 コンパイラ内部で z80のニーモニックを扱う部位を極力マクロにパラメータ渡す形にして runtime部の修正で他機種への移植が可能なように心がけたつもり。 ※MZTファイルヘッダの組み込み部とか有るから 移植が簡単とは言い辛い。 とはいえ、アセンブラのソースの形で出してくれるので中で何をやってるかの 参考にはなるとは思う。残念ながら オリジナルのFORMでコンパイルしたものより オブジェクトサイズが大きくなる。これは オリジナルがループ処理部で  ステップ数のマイナス値への対応などを一切考慮してないのを、 開始値、終値、ステップ値 それぞれの 大小関係をその都度監視するようにしたのが 大きく影響してる。 詳しくはruntimea.asmの「end_do」マクロを参照して欲しい。 気に食わないようなら、この部分をオリジナルのランタイムと同じ動作になるように 削ればオブジェクトサイズの削減くらいにはなるかも知れない。 ただ、オリジナルと同じようにし続ければ、”オリジナルで十分では?”って話になるので 私からはやるつもりはない。 今回のクロスコンパイラに...
最近の投稿

gcc6809の修正箇所に関する対話録

以前話したgcc6809のビルドに潜んでるバグについてのchatGPTとの 会話ログがダウンロードできたのでそこから該当部分を抜粋して上げる。 まず、会話の概要は SBC6809用の一文字出力関数を作って、「hell world」させるだけのものを作ろうとしたのだが まともに動かない、ステップトレースして putch関数を呼び出すだけ呼び出して、戻って来ることなく PCが際限なくカウントされ続け、想定外の位置でフォールトする。 で、調べて判ったのが関数の始点(prolog)はあるが、終点(epilog)が出てない。 その事について、該当ビルドフォルダの精査などについて相談した chatGPTとの会話が以下になる。 -------------------------------------------------------------- # 今回の症状をコードと対応させると `_putch` では、 ```asm pshs u leas -1,s leau ,s ``` が出ているので、 ```c emit_prologue_insns() ``` は動いています。 一方、 ```asm leas 1,s puls u,pc ``` が全く出ていないので、 ```c emit_epilogue_insns() ``` が動いていない可能性が高いです。 **これはかなり強い状況証拠です。** 次に `TARGET_EXPAND_EPILOGUE` 周辺の grep 結果を見れば、どこが抜けているかを具体的に特定できます。 特にこの結果をください。 ```bash grep -R -n -A8 -B8 \   -E 'TARGET_EXPAND_PROLOGUE|TARGET_EXPAND_EPILOGUE|TARGET_ASM_FUNCTION_PROLOGUE|TARGET_ASM_FUNCTION_EPILOGUE' \   gcc/config/m6809 ``` ここで**プロローグを呼ぶフックはあるのに、エピローグのフックだけ未登録**なら、今回の症状を直接説明できます。 user $ grep -n -E 'emit_prologue_insns|emit_epilogue_insns|prologue_epilogue_requi...

SBC6809用のlibgcc関係の改変ソース

先日のgcc6809用の libgcc関係の 改変ソースを上げる  毎度おなじみ 4shared のサーバです。 前回と変わったのは、tek4010関係のtek40.cの形で 丸ごと インクルードしてたのを lib化して 使う 関数だけリンクするようにしました。 libgccなどの元ソースは gcc6809に含まれるモノの中から借りたものを 適当に端折ったり簡略化したものになります。どこをどう改変したかはソースを丸ごと上げてるのでそちらを参照して欲しいとしか言えません。float関係は 内部演算は単精度限定に、表示のみ小数点以下3桁までに限定。三角関数は90度までのデータを32分割でテーブル化して簡略化してます。ですので、計算精度を求めるものには不向きです。自分的には今どきSBC6809にそれを求めることはまず無いと切り捨てました。

SBC6809用に実数演算のできるコンパイラが欲しい

SBC6809でBASICインタプリタとGAME09が使えるようにはなったが、それ以外だとプログラム言語はアセンブラになる。実数演算の必要なものはBASIC一択しか無い。SBC6809(ESP32)でもSDカードからBASIC読み込んで、その後BASテキストロードして実行ってのを毎回やるのは面倒くさい。そこで扱いやすいC言語あたりが欲しくなる。FM-8/7系とかで動くKコンパイラやFORTRANなんかも有るけど それらも、FBASICのROM内ルーチンありきの構造になってる。海外のだとsmall-cなんかも有るが、やはりTRS-cocoのROM内ルーチンがある前提だったりする。それ以外だとflexやOS-9上で動作するC-compilerがあるが、SBC6809の様なROM/RAM 32Kの狭い領域では使い物にならない。gcc6809も四苦八苦しながらビルドしてhelpとversion表示が出るまでは持っていったことが有るが いざ"hello world" とか 表示させようとすると 標準のライブラリがまともに揃っていない。ファイル上は それらしきlibgcc.aとかあるのだが どこに 表示データ送ってるのか? FLEXかOS-9前提のオブジェクト吐いてくるのかと予想している。 m6809-unknown-elf-gcc hello.c とかやっても、linux の gccなら a.outとか吐き出して。仮に実行できたりするんだが gcc6809では まず できない。ビルトインのライブラリ類を一切当てにしてはいけない。gcc6809のビルドの為のソースに 大体の必要なライブラリソースが含まれてるので それらを流用してsbc6809用のサブセットライブラリを作ってやることにする。 m6809-unknown-elf-gcc -O2 -S -fno-builtin -DFLOAT -DFLOAT_ONLY $1.c -o $1.asm 今使ってる オプションは こんな感じ。 -fno-builtin     :ビルトイン関数は使わない -DFLOAT -DFLOAT_ONLY :実数演算が必要な場合、単精度のみ -S      :アセンブルソースを出力するだけにする。 あと、  -nostdlib  ...

SBC6809モドキを作ろうとしたら、MZ-6809が出来ていた件 その5

 予てより取り組んできたSBC6809エミュの関係ファイルを 書庫にして公開 する。 とは言え、未だ 完全な完成には程遠いので恥ずかしい限りではある。 書庫サイズは390キロバイト弱になる、以下の文書は その中に収めた 但し書きの写しになる。  ----------------------------------------------------------  EXBASICから USING命令を削除した軽量版 タイマ割り込みを利用した簡易時計機能付き BASIC9.asm BASIC9.hex BASIC9.lst BASIC9.mot BASIC9.sym DBDC 12               BAWMST  NOP hotstart : $DBDC ExBASIC 気になる部分のバグ修正したのみ。ほぼ原版 BasROM.asm BasROM.hex BasROM.lst BasROM.mot BasROM.sym DBCB 12               BAWMST    NOP  ;NOP REQ-D FOR WARM START hotstart : $DBCB HD6309チェッカ 現時点での このエミュレータでは無意味 CHK309.asm CHK309.lst CHK309.sym EXBASICソース構造参考.txt GAME09.asm GAME09.hex GAME09.lst GAME09インタプリタ COLD :$9000 HOT :$9003 これにはリセットベクタ情報は含まていないので、ロード後の初期起動時もVsetでベクタ設定が必要。 BASIC,GAME09 共通で ロード後 一度コールドスタートさせて CTRL+Dで CCPに戻り loadでソースをロード vsetで ホットスタートアドレスを設定、GOでインタプリタに戻り プログラムの確認、実行という手順です。 コンパイル済みのGAMEバイナリは 共通で$2000が実行アドレスです。 マンデルブロ集合 アスキアート表示デモ ascart.bas...

SBC6809モドキを作ろうとしたら、MZ-6809が出来ていた件 その4

 GAME-CCのやらかしバグについて まず、問題のファイルは ランタイムパッケージに相当する 「gamecc.asm」の中の W82            RMB        6+1            ; DIVIDE BINDEC/WORK ;            FCB        0 この箇所、これ gamecc.asmの終わりの方の、ほとんどRMBの並んでる中、ただ1バイト分 0をメモリに書き込んでる。 そこだけピンポイントで0格納するようにHEXファイルが生成されれば無駄もないんだが、 アセンブラの種類によっては前後のRMBブロックもゼロフィルして無駄に大きなHEXファイルになる。 W82は6バイト確保だったのを7バイト確保にしてFCBを消したんだが、一見これでも 動作はする。 メモリというものが、電源入れた直後に全てゼロになる前提なら。今回のエミュはそうはいかない。 メモリの確保イコールゼロで初期化まではやっていない。実機でもSRAMにしろDRAMにしろ電源投入直後は電気的には不確定なのが通常で ROMから起動したモニタがメモリをゼロフィルしてメモリの正常動作を確認するのが一般的な初期動作になる。 これまでにテストで使ったlinux上のエミュはメモリのゼロフィルが当たり前だったのが災いした形になる。 この6バイトは、数値の左詰め表示のための結果格納バッファで符号のための1バイト、1から32767までの5桁を入れる5バイトの合計6バイトになる。 そして、GAMEの内部処理では文字列は0終端の集合として扱って表示しているので、数値文字列の終わりのための0を入れる7バイト目が必要になる。 これを端折ったため、maze.hexのオブジェクトのエスケープシーケンスでカーソル位置指定する計算式で 結果が正しく出されずに謎文字列の羅列が爆発するバグにエミュレータ作成初期に悩まされた。 BYNDECルーチンのリターン直前に W82+7の位置に0を書き込むコードを挿入して回避するように修正。 エミ...

77AVEMUのGUIを使いたい

 githubで公開されてる、FM-7/77/AV系のエミュレータでlinux環境でも直で使える エミュとして唯一あるのが 77AVEMUであるが、ビルドの為のライブラリ導入のため目的のエミュ本体よりデカいTOWNSEMUを必要としたり、GUIが使えますと案内するが肝心のGUIのビルド方法については全く説明がないとか 謎仕様の塊で なかなか敷居の高いエミュなんだが 決して完成度の低いわけではないので ターミナルからCUIで使うか、pythonでも使って自前でフロントエンドでも作るかすれば済む話ではあるが、せっかく作者の方が用意してくれたのに使わないのはストレージの肥やしとしても勿体なさ過ぎるので、chatGPTとアレコレ対話しながら悪戦苦闘して 何をどう修正したとか 細かく説明したり、diffとってパッチファイルにするとかとてもじゃないが面倒なので、必要なファイル放り込んだフォルダごとZIPにしたので約240Mとデカいファイルだが 必要なら各自で ダウンロード して試してみて。最低限やった内容はHowToってテキストに書いてるけど あとは 各自でchatGPTにでも相談して解決して。