今日の火星(20/10/25)

今日はよく晴れてた。月がだいぶ寄ってきたので明るくて星はあまり見えませんでしたが。今日はフォボス見えるか?と思って一生懸命見てみたけど、見えん。事前に予習が必要?

Mars 20/10/25 21:43 JST

今日の火星 2020/10/20

9月~10月は本当に晴れませんでしたね。朝起きたとき晴れていたことはあったけど、就寝前の夜は毎日ドン曇りでしたが、今日はひさーしぶりに晴天、ということで火星を見ました。

Mars 2020/10/20 20:23 JST

今日も気流はあまりよくありませんでしたが、たまーにdetail が見える瞬間が今日はあり、その瞬間を集めてスタッキングしてみました。カメラの設定はいまだによくわかってないですが、カメラのゲインを下げてある程度露光を入れたほうが結果がいい気がします。上のは、24ms/shot でゲインはかなり下げて撮影をしました。モーターフォーカサーをしばらく使わなかったらちゃんとArduinoが立ち上がらなくなってたので、手動で試行錯誤でピントは合わせました。

だんだんと火星も遠ざかりつつあるのかなあ。でもまだまだよく見えていますね。

Z80で遊ぶ

先日basic で動かしたマンデルブロー集合の描画でbasic が遅い、ということを痛感して、もう少し速く動かしたときどの程度差があるのかな、ということで、アセンブラでロジックを記述して動かそうと思いました。

問題は、このプログラム、浮動小数点演算を使っているので、ライブラリが必要ということ。で、最初はbasic の中の浮動小数点演算ルーチンを使わせてもらうことを考えていたのですが、まずもって、アセンブラで記述したプログラムをpokeなどでメモリに転送してusr関数で実行するということをやってくれるbasic のプログラムを作成するのが面倒です。

それでだんだん当初の趣旨から外れて、浮動小数点ライブラリを簡単に使えるプログラミングスタイルについてしらべてました。Z80のアセンブラもいろいろあり、cp/m で動作するもの、windows, linuxなどで動作するもの、Web(online)で動作するもの、いろいろありますが、アセンブラはニモニックはともかくも、疑似命令や、引数の計算ルールが様々で、なかなかまとまって、どこかから持ってきた演算ライブラリを引いて、すっきり実行できるものがありません。なかなか悩ましいところです。

それで、Cコンパイラも視野に調べたのですが、こちらも、cp/m で動作するBDS-Cがなかなか、と思いましたがこちらは浮動小数点がサポートされておらず、結局hi-tech-cぐらいでしょうか?Arduino的に簡単にソースコードを書いてZ80で何かするのに一番いいのは。

そんなことを調べて時間をずいぶんつぶしてしまいました。

現在のところ、CP/M program EXEcutor for Win32 を使い、hi-tech c を動かし、下記のソースをコンパイル、.com ファイルを前に作ったZ80-MBCがすでにCP/M Ver 2.2が動いているのでそちらのvirtual disk に.com ファイルを書き込んで動作させる、ということはできました。

Cのソースは、下記のような、もともとのBASICのプログラムそのまま、みたいな感じですが、浮動小数点ライブラリをリンクしてコンパイルしました。

#include <stdio.h>
#include <math.h>
main ()
{
	float ca,cb;
	int i;
	int y,x;
	float t,a,b;
	for (y=-12;y<=12;y++) {
		for (x=-39;x<=39;x++) {
			ca=x*0.0458;
			cb=y*0.08333;
			a=ca;
			b=cb;
			for (i=0;i<=15;i++) {
				t=a*a-b*b+ca;
				b=2.0*a*b+cb;
				a=t;
				if (a*a+b*b>4.0) goto l200;
			}
			printf(" ");
			goto l210;
		l200:
			if (i>9) i=i+7;
			printf("%c",48+i);
		l210:
			continue;
		}
	printf("\n");
	}
}

Z80-MBCで実行してみたところ、82秒ほどで絵を作成できました。CPUは4MHz でこれは動いているので、同じ条件で比較はできていませんが、1桁はいかないけど、ぐらい高速になる、と考えてよいかな。

これがまあまあ、調子よいので、SBCZ80の方も、CP/MのシリアルI/Oを実装してCP/Mのバイナリを動かすのが楽にいろいろできる方法かな、と思っているところです。

コンパイルしたバイナリーをPCでCP/M program executor で動かすと、最初はちょっと時間(1秒ぐらい?)かかるんですが、2回目からは、どこかのキャッシュが働くのか一瞬で結果が出ます。どういう仕組みが背景にあるのかななどちょっと興味深く思いました。

assembler やhi-tech-cでコンパイルしたバイナリ(COMファイル)をCP/Mに転送するのに毎回virtual disk を作ってたら日が暮れてしまうので、シリアルで転送する方法を試行錯誤していました。

xmodem がいいのではということで、いろいろと試していたんですが、うまくいっておらず、今のところ、.com をpython bin2hex.py –offset=0x100 hoge.COM > hoge.HEXのようにhexに変換し、pip hoge.HEX=con: でcp/m のディスクに保存し、 load hoge.HEXでcp/m のディスクにCOMファイルを作成するような確実だけど回りくどい方法を取っています。xmodemが上手くいかないのは、タイミングがPC側とあってないのかも。

SBCZ80をつくる

相変わらず台風で強い雨が降ってます。外に出かける気持ちになれないので、はんだ付けで遊びました。

SBCZ80はZ80をCPUとしたワンボードマイコンです。DRAMをワンボードマイコンボードながら使っているのと、シリアルIOに8251 ではなくZ80 SIOを使っているのが特徴です。

ということで、こちらもDRAMのM5M4416の入手に時間がかかった(結局eBay中華)のですが、今日形にしてみました。

CPUは由緒正しいSHARPのLH0080です。SIOはCMOSの10MHz Z80も入手してあるので、Z80B SIO/2 を乗せてありますが、ノスタルジックに標準速(2.4576MHz)で動かします。周辺のTTLは全部CMOSです。HC04は由緒正しいTOSHIBAの部品箱の底に沈んでいたものを使いましたが、例によって昔のDIPICをかなり捨ててしまったため、結局ほかのICは購入する必要がありました。

ということで、電源ONで、いきなりBASICが動きました。終わり。というのも何なので、配布されているデータパックに収録されているマンデルブロ集合を書くプログラムを動かしてみました。

これを計算するのに8分9秒=489秒を要しました。

このデモは8ビットPCとBASICが使われていた時代にはよく見かけたものですが、最近は見ないので、今のマイコンってどれぐらいでこれを計算できるのかな、とふと思い、手元のArduino Megaで同じプログラムを特に工夫もせず書いて実行してみたところ、2秒程度でした。

もちろん、Arduinoはコンパイラーなのですが、圧倒的(?)な速度差です。コンパイラーを使っていることに加え、クロック速度は6.4倍異なり、AVRはRISCで1命令1クロック(?)に対してZ80は1命令4-20+クロックを要すことを考えると当然とは思いますが。。。

ということで、倍速で動かすよりは、標準速で遅さとほんのり温かいCPUでノスタルジーを感じるのがこれの正しい楽しみ方と思いました。まあ、本当のところは私になじみのあるZ80って、標準速より速いZ80A(MSXで採用)なのですが、Z80Aを買ってなくって、CMOSのCPUではノスタルジーにはどうしても浸れませんので。

SBCZ8をつくる

火星最接近したのに曇天続きで、今晩に至っては台風接近。ということで、SBCZ8を作りました。部品は、だいたいオレンジピコさん、多少秋月さんで揃えましたが、案の定28C16 (EEPROM)と 6116 (SRAM)が見つからず、eBayで買いましたので、ちょっと時間がかかりました。とはいえ、9月下旬に国内の部品、eBayで買ったのは中国から黄色い封筒で今日届きましたのでそれほど時間がかかるわけではありませんでした。

Z8はよく知らないので、ノスタルジックな感慨もなく、CMOS版のZ86C911を、他の部品もCMOSで揃えました。6116は由緒正しいHM6116ALP-3(でも中国)。28C16も由緒正しいAtmel AT28C16です(でも中国)。

とりあえず必要部品を並べてみる。抵抗ジャンク箱をあさるのがめんどくさく1/8W抵抗が混じってしまった。

はんだ付けするだけだから秋の夜中のはんだ付けセラピーで完成。

28C16にZilog BASIC/Debug (TINYBASIC+モニタみたいなもの?)を書き込みテスト。

案の定28C16の不良品混じり。しかしこんなこともあろうかと、5個セットを購入したので、OK. 6116に至っては10個入りを買いました。

書き込んだEEPROMをソケットにさしてPWRON。あっさりプロンプトが出て動作確認。

これ使って何かをするわけではないですが。。。

ただ、これってI/Oが簡単に使えてターミナルから対話型でぱちぱちポートの状態を変更できるという意味では,結構尊い感じです。今だとmicropythonがそれ?って感じ?