lcc1802 <CDP1802用Cコンパイラ>
以前書いた記事(CDP1802 (15/10/11))のコメントにCDP1802用のCコンパイラの質問があったので調べてみた。
結論は、出力されるバイナリが大きいので、RAMを十分載せておけば使える。
lcc1802
CDP1802は入手したがまだ動かしていない。 (^^;
SBCを作ったとしても、おそらくtinyBASICでも動かしたら満足するのだろう。というわけで、CDP1802用のCコンパイラは調べていなかった。
調べてみるとlcc1802が見つかった。
lccはOpen SourceのコンパイラでターゲットCPUはAlpha,SPARC,MIPS,x86に対応している。 lcc1802はlccをCDP1802に対応させたもので、COSMAC ELF Membersip Cardのアドオンシールドにarduinoを持たせた 1802 olduino 用に作られたもののようだ。
https://sites.google.com/site/lcc1802/downloadsからダウンロードできる。
インストール
lcc42judy.zipをインストールしてみた。
zipを解凍して現れるlcc42ディレクトリをCドライブ直下(C:\)にコピーしろと書いてある。
開発系は C:\Devzにインストールしているので、ここにインストールした。 コンパイル・ドライバ(lcc)が呼び出すコマンドは同じディレクトリを探すので問題はないだろうと考えたのだが、cppが見付からないと怒られた。(^^;
どうやら、プリプロセッサ(cpp.exe)、コンパイラ(rcc.exe)、アセンブラ(asw.exe)のパスは"C:\lcc42\bin"がハードコードしてあるようだ。 仕方がないので、C:\からinkを張っておいた。
エミュレータ
まだSBCを作っていないのでCOSMACエミュレータ Emma 02で試してみた。
Emma 02はCDP1802が使われている数々のボードやシステムのエミュレーションができる。 その中でシンプルな VELFで試してみた。
COSMAC ELFはシリアル・インタフェースを持っていない。Q(#4)をTXD、EF2(#23)をRXDに使ってソフトウェアで実装してある。
シンプルな COSMAC ELFで試しておけばSBCを作るときにシリアルインタフェースを載せなくて良い。
サンプル
lcc1802にはサンプルが用意されている。 これらのサンプルはolduino用なので、これを変更してVELFで動くようにする。
まずはお約束の hello worldから。 examples/helloworldディレクトリにある。
↓helloworld.c
/* |
ライブラリ
4行目の #include <nstdlib.h>は良いが、最終行の #include <nstdlib.c>は何?である。
lcc1802はライブラリはなくて、最低限の関数がinclude/nstdlib.cに書いてある。printf()もあるが、最低限の機能だけで出力幅指定はできない。
文字列出力関数のprintstr()は1文字出力にout(5,d)を呼んでいるが、VELFでは動作しないのでputc()を使うように変更しておく。
↓nstdlib.c内のprintstr()
void printstr(char *ptr){ |
nstdlib.cにはfloatを扱う関数がある。 sdccは賢いので必要な関数だけリンクしてくれるがlcc1802ではnstdlib.cはいつでもコンパイルされるので使わない関数でもオブジェクトに含まれる。float関係の部分だけは "nofloats"が宣言されているとコンパイルしないようになっている。 コマンドラインオプションで -Dnofloatsとすれば良い。
ランタイムライブラリ
ランタイムライブラリは、include/lcc1802Prolo??.incとinclude/lcc1802Epiloxx.inc。
これらはのライブラリは、コンパイル済のライブラリをlinkerがリンクするのではなく、ソースに展開している。ソース中にnsddlib.cをインクルードし、アセンブラソース中でlcc1802Prolo??.incとlcc1802Epiloxx.incをインクルードしている。
入出力ルーチン
IOルーチンは、include/IO1802.incに書いてある。 printf()は1文字出力にputc()を呼んでいる。 lcc1802が想定しているolduinoの1文字出力はout(5,d)を使っているので、VELFでは出力できない。
IO1802.incに1文字出力(putc())と1文字入力(getc())を書けば良さそうだ。
ここでハタと困った。CDP1802のアセンブラは書いたことが無い。
とりあえず、Emma02にVELFのモニタソース(Emma02\data\Velf\VELFbios-v3.1.LST)があったので、この中の1文字入出力ルーチンを参考に(ほぼコピペ)、Cから引数を渡す部分と戻り値を返す部分を付け加えて、テンポラリ変数をreからrt1に変えた。
↓IO1802.inc
;********************************************************************** |
コンパイル
この変更でIntelHexフォーマットの a.hexが作られるようになる。
C:\Users\user> lcc -Dnofloats helloworld.c |
しかし、hellowroldだけで3,609byteとは。
8Queen
8Queen問題を解くプログラムをコンパイルしてみる。 再帰を使っているのでちゃんと動くだろうか?
/* |
コンパイルすると、4,542byteだった。
↓実行結果
ちゃんと実行されるようだ。
まとめ
SBCを作るときはRAMをケチらないで載せておけばlcc1802は使える。今時、32kのRAMを積んでも大した出費ではない。
残念ながら、オリジナルのCOSMAC ELFではRAMが少ないので使えないだろう。もっともオリジナルのCOSMAC ELFを忠実に作るなら、ハンドアセンブルして、8個のスイッチでプログラムを入力する覚悟が必要だ。
rcc.exeがASxxxxアセンブラを吐くようにするとSDCCのライブラリが使えるようになる。そして、aslinkを使うと出力がもう少しコンパクトになると思う。 興味はあるが、そこまでやるか...
【最近の投稿】【2017の投稿】【2016の投稿】【2015の投稿】【最近のCOSMAC/CDP1802】
« 漫画村騒動 <Napsterの二の舞> | トップページ | あ、「やりがい」とかいらないんで、とりあえず残業代ください。 »
「CPUボード」カテゴリの記事
- 久々の物欲(2022.05.21)
- stcgal <質問に答える>(2021.02.21)
- micro:bitで跳び上がると表示する名札 <ウケ狙い>(2020.11.18)
- micro:bit <BLEが乗った低価格マイコンボード>(2020.09.15)
- Google日本語モールス入力(2020.05.01)
「CDP1802/COSMAC」カテゴリの記事
- lcc1802 <CDP1802用Cコンパイラ>(2018.04.24)
- CDP1802(2015.10.11)
「プログラミング」カテゴリの記事
- GMC-4で動く3連ナイトライダー(2022.12.30)
- プログラミング言語ランキング(2022.11.19)
- AWSでサービス構築(2022.05.29)
- Excelの配列式(2022.01.06)
- ローコード・プログラミング(2021.11.07)
コメント
« 漫画村騒動 <Napsterの二の舞> | トップページ | あ、「やりがい」とかいらないんで、とりあえず残業代ください。 »
lcc1902 ?
インストールの方法ありがとうございます
随分と長いコードを吐く様ですが今時は32kB載せるのは簡単なので、問題無いと言えば問題無いですね
NASAは開発ツールの開発に失敗したとか書いて有るページを見つけてしまい、こう言うものは無いのかと思ってしまいました
投稿: やすい | 2018年4月25日 (水) 06時38分
やすいさんコメントありがとうございます。
lcc1802EplroFL.incをちょっと読んでみたのですが、関数コール/リターンがすごく面倒ですね。
C言語に向いていないCPUということでしょうか。でも、Cで書けるのと書けないのでは雲泥の差なので、少々効率が悪くてもありがたいです。
投稿: Yoshi | 2018年4月25日 (水) 23時58分
そもそもハードウェアスタックが無い時点でCコンパイラには向いてないかと思いました。
とは言え、あの簡素な?システムは使ってみたいと思ってしまいます。Forthをインプリした方も苦労して居たみたいで。Forthシミュレーターは200倍速いとか笑えました。
投稿: やすい | 2018年5月 2日 (水) 20時54分
スタックを使わないでレジスタだけで書けるくらいのサイズなら楽しいかなと思います。(AT90S1200のような感じ)
基本インデックアドレッシングでインデクスレジスタの指定も間接というのは戸惑いますね。
投稿: Yoshi | 2018年5月 3日 (木) 12時52分