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

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    :標準ライブラリは使わない。
も入れても 良いかも?
gccが吐き出した .asmファイルを

as6809 -glos $1.asm

で、アセンブラコードからリローケータブルコードにする。

as6809が出した .relを

aslink -i -m -b .text=0x2000 $1 ~/.local/lib/crt0.rel $1.rel ~/.local/lib/libfloat.lib ~/.local/lib/libgcc.lib ~/.local/lib/libsbc09.lib

で、インテルhexファイルにする。
.ihxファイルになるので .hexファイルにリネームするのを忘れない。

crt0.relに sbc6809のACIAアクセスルーチン、スタックの初期化と main関数へのジャンプ命令が組み込まれてるのでリンクの際の先頭に配置するように
libgcc.libは主だった基本関数群
libsbc09.libは sbc6809用の 文字 入出力関数群
libfloat.libは 単精度実数演算関数群、平方根、sin,cos,tan、ほかは 基本の加減乗除など実数演算を使わないのなら リンクから外せば 出来上がりのHEXファイルが少しは小さくなる。

libsbc09にprintf関数があるが、サブセットなので 実数の表示機能はない。

     char buf[20];
     s = sinf(x);

    ftoa_s(s, buf, 3);
    printf("sin(x) :");
    printf("%s\n", buf);

のように、一旦 ftoa_s関数で 実数から文字列に変換して 表示する。


wave_demo.c
 


mountain.c

gcc.zip 4sharedのリンク

gcc6809の公開ライセンスに限りなく抵触してると思うので、同梱してるgccやas6809などは 参考程度に、なんせビルドの環境毎上げようとすると6Gくらいの塊になるんで
gcc6809は、自前でビルドすることを薦める。結構四苦八苦するけどchatGPTと相談しながらやればなんとかなります。フリープランのchatGPTでも十分こなせるので頑張って。

アドバイスとしては、関数の戻り処理がバグってるので(rtsが組み込まれない) キーワード「epilog」で探せば見つかる。
実数演算関係で、整数-実数変換の終端処理にバグが有る。細かなchatGPTの対話ログが消えてしまったので 残念ながら 細かくを解答できない。

こちらで用意した、lib類は 後日ソース類をまとめて上げます。
今回挙げた書庫はお試し用のセットくらいに思っていただければ。
 
 
 
 
 
 
 
 
 
 
 
 

 

コメント

このブログの人気の投稿

screen コマンドでの コピーペースト転送の実現について

 以前、GAME言語のあれこれについての中で、GAME80ICなどでZ80-MBC2とのscreenコマンドでのシリアル接続中にソーステキストのコピーペースト転送ができない事に触れていたが、単に使ってる環境に依存した所謂「おまかん」なのだが、回避したければ、素直にwindowsで使うか 若しくは linuxでもwine上でteratermを使えば済む話ではある。だが、我が家に於いては普段使いにできるwindows機など無い。棚の奥を探せばwin7の入った古PCが有るとは思うがボードマイコンとの接続の為だけに引っ張り出してきたいとまでは思わない。そこで ふと考えるにteratermにあってscreenやcu,minicomにないものはと、teratermには、テキスト転送中に行単位、文字単位でミリセカンドのディレイを挟む設定がある。対してlinux系のシリアル接続コマンドにそういった類のモノを知らない(単に自分が知らないだけの可能性もある) 。そこで、duckduckgo検索のサービスである「Duck.AI」に聞いてみた。自分の思いついた革新的なアイデアは大概は先人が既に思いついてる当たり前過ぎるモノというのはいつもの事であっさりと解決策を教えてくれた。

一部の関西の人にしか通じないネタ

たぶん「30年モノ」くらいだと思う?  拡大 値札に注目! ちなみに、ATMEGA32へのファーム書込用のアダプタを作るのに使用。

GAME言語 あれこれ

 MZ-700用にSDカードからMZTファイルの読み書きが出来る基板を入手して以降、MZ用のインタープリタやコンパイラの打ち込みをやってた延長でZ80-MBC2上のCPMで動作するGAMEインタープリタとコンパイラをいくつか発見。GAME-MZは国会図書館のコピーサービスで当時のアスキー誌の記事を入手済で打ち込みMZT化は済んでいるが動作の確認はしてない。 CP/M-80で動作するGAME80言語を3点ほど紹介する。 まず、動作環境は実機としては8Mhz動作のZ80-MBC2にXMODEMでPCからのファイル転送 PC側はFedora40の端末から「screen」コマンドでの接続、比較用に同じくFedora40の端末上で動作するCPMエミュレータ2種類。エミュレータで動作確認がとれたモノを実機に転送して最終動作させてみる流れ。    skyriverさんのGameOnCpm80 端末のエミュレータ上ではコピーペーストによるソースの転送もできるが ファイル読み書き用のコマンドが組み込まれているので、なぜか実機の方ではコピペに転送が出来ないのでありがたい。コンパイラも組み込まれているのでインタプリタで実行確認後、コンパイルもできる。 難点は、コンパイルの際にソース格納アドレスやデータエリア、オブジェクト格納エリアの指定をする必要がある。GAME-MZでもコンパイルの際は普通に必要な事ではあるが、自分の頭の中でシステムのメモリマップを把握しておくのが意外と面倒くさい。 コンパイルで 出来たオブジェクトをCOMファイルにするのにDDTなんかの別ツールでメモリ上に残ってるデータをCOMファイルとして保存するしかない。 COMファイル化とかを視野に入れずインタープリト、コンパイル、実行だけなら使いやすくお薦め。   ファイル操作コマンド例 files ファイル一覧表示 :\\ *.g 拡張子 .g のファイルの表示      \\のみ、\\ *.* での表示は出ない模様(単に自分の使い方が悪いだけかも?)  save(¥>FileName)とload(¥<FileName) 詳細は https://piclabo.blog.ss-blog.jp/CPM80GameCompiler...