中学入学1か月 近況

娘の中学入学からちょうど1か月がたちました。まだ日能研のWebにはアクセスできるのですが、寂しい感じで、夏には過去の成績にもアクセスできなくなって卒業、になるのかな?と思っているところです。

結構学校は遠いので、母親は5時過ぎには起きて、弁当作りを今のところがんばっているところです。娘も5時半には起きて準備を、最初のうちは、かなりできていなかったが、少しずつ自分で起きられるようになったようです。とはいえ、行きの電車の中で、本を読んだりするほど余裕はまだなくって、ぼーっとしているとのこと。

母娘が早起きをするので、私もつられて早起きをするようになりました。そのため、寝るのは家族全員かなり早くなりました。受験の時は11時を過ぎて娘が起きていることもあったけど、今は10時前には寝ちゃってます。

毎日学校であったことを話してくれるのが喜ばしいですが、各教科とも課題がそれなりに出るので相当忙しそうです。今日も理科の課題で花粉を採取して学校で見るらしく、外の花をいろいろ探しに行っていました。地理なんかも、プレートテクトニクスの話をしつつ、地図帳で海溝、山脈、地溝帯など楽しく調べものしてました。

英語は、春休みに宿題もなく、ぱっと見には、スロースタートに見えるのですが、発音、発話を中心にall English でやっているようで、楽しそうに学んでいます。入学前は特にどういう勉強をするか、知る機会がほとんどない学校でしたが、公立出身の親から見ると、うらやましくなるぐらい、いい英語学習環境だね、と思います。

国語も多読、作文の課題、漢字の小テストもあり、国語の入試問題が割合難しめだったと思いますが、これだけの課題をこなすためには、入試があれでちょうどいいんだろうな、と納得しました。また、礼拝の説教集その他の配布物を眺める限りでは、いろいろと良い話を聞く機会が日常的にあるように思えます。

また、毎日の礼拝、英語、音楽、放課後の部活等、音楽に触れる機会が多く、気のせいかもしれませんが、入学後、娘の歌が上達したような気がします。これは、入学前にはあまり思っていなかったことですが、いいよねこれ、って思ってみています。

総じて、いろいろと感性を刺激するアクティビティも多く、今のところ、娘をここに入学させて、正解だったのでは?と早合点しているところ。

受験生に学校生活を知らせるイベントが少なく、他の学校ではいろいろと受験生向けの行事をしているのに、って思っていましたが、無用な心配でした。

今週あたりからは、部活動にも参加することができるようになるそうで、一層忙しくなるね、と横目で娘を眺める父親です。

 

8080A I2C EEPROM 読み込み

連休は結局8080Aのマイコンボードをいじって終わってしまった。娘は学校の宿題を済ました(らしい)のに、なんてこった!

でも、8080のアセンブラ記述もだいぶ慣れたので、ま、いっか。EEPROM のダンプができるところまで来たので、記録しておこう。

ichigojam でEEPROMにセーブしてあったデータを1ページ(128bytes)ごとダンプしたところ。

I2Cの読み取り手順に問題があるようで、最初の読み取った1バイトは多分ダミーで、そのままではいけないけど修正をしてない。この問題はRTCの読み込みをした時点で気が付くべきだったが、節穴でした。

8080Aボードのモニターも、先にアップロードしたものは、outコマンドでちゃんと書き込みができていないので、それもバグ。一応直したつもりだけど、まだテストしていない。

アセンブラはこれまでは、zasm のオンラインコンパイラーを使っていたけど、今日ubuntuでzasm を動かして、スクリプトでアセンブルとintel hexファイルの整形を一発でやるようにワークフローを変えてみた。まあまあ快適。

I2CインターフェースICへ与えるクロックが低すぎる問題は、pic12F1822で8251へ与えるボーレートクロックと4MHzを同時に生成するようにしようと思っているが、これもまだテストしていない。

いろいろと半端だなあ。

例によってバグがいろいろ入っているであろうプログラムリストを恥ずかしいけど下に置いておく。

i2ctest_8080_lst (2)

(5/8) pic12F1822 で生成するボーレートクロックを309kHz (19200bps)にし、OSC/4 = 8MHz も出力するようにした。8MHz はI2C インターフェースのCLKとして入力してみたが、動かない。何がいけないのだろう。。。とりあえず、元の2MHz に戻して、プログラムをいろいろいじくってみた。I2C のダミー読み取りは汚いやり方ですが、直してみた。まあ、いいかな。

(5/8終わり)

8080A I2C RTC読み出し動く

8080Aマイコンボードの開発環境が落ち着いたので、I2C接続のRTCを読み出すプログラムを書いて遊びました。I2C接続のRTCは、DS3231のモジュールがアマゾンの通販で安く売ってますので、それを使ってます。レジスタを読み出してHEXで表示するだけでOKなので、ラクチン。

前にmicrosoft basic でテストしていた内容を下敷きに、アセンブラでRTCの読み出し表示プログラム(要は時計)を実装しました。

テスト中。いい感じ。

こちらに、作成したプログラムを貼っておきます。

i2ctest_8080_lst

I2Cの初期化がうまくいかない(?)ことがたまにあり、これはbasicで試していた時もそうだったのですが、なぜかよくわかっていません(多分STOPコンディションなど半端な状態のまま、終わったりした影響が次に実行するときに出るんだと思う)。

ま、後でよく考えよう。

RTCの読み出しと表示を合わせて3ms程度で終わります。basic と比べるとやっぱり圧倒的に速い。ロジアナでデータとアドレスのバスを観測すると、一つずつ命令を実行している様子が楽しめて、可愛らしく感じるものがあります。ビットもえー、って感じ?

I2Cのクロックは63kHz程度になってます。マニュアルによると、PCF8584に12MHz クロックを入れたときに90kHzになる設定にしているのですが、8080Aなので、実際に入れているのは、2MHz クロックなんだけど、何となく動いている。どないやねん(これが初期化に失敗する理由?)。設定値を変更して遊ぼう。

(追記)設定を変えて試そうとしてみたら、設定を間違えていることに気づき、直したら全く動かない。いろいろやってみたけど、間違った設置値でしか動かせてない。やっぱりちゃんとしたクロックを送ってあげないとダメなのかな?(追記終わり)

最初はおっかなびっくりアセンブラを書いていましたが、パターンに慣れてくると、気軽に手が動くようになってきた。生成される機械語もアセンブラだと短いし、結構楽しくなってきました。

smallc は変数の受け渡しがいまだによくわからなくって勉強中。smallcでめちゃくちゃ冗長なコードが生成されるのを見てしまうと、やっぱり遊ぶのには、アセンブラの方がいいかも、と思える。

次は、I2C接続のeepromの読み書きをしてみようと思っているところです。

8080 モニタープログラム

intel 8080A 搭載のマイコンボードですが、非常にゆっくりとではありますが、ちょこちょこ遊んでいます。microsoft basic で搭載したI2Cポートをたたいて、RTCを動かせることは確認したのですが、やはり機械語で読み取りをしたいな、ということで、このマイコンボードでのアセンブラやCのプログラミング環境を整えることにしました、(ら、はまってかなり時間が経ってしまった・・・)。

ハードウェアは、こんな感じで、

256kbit SRAMを、8000H-FFFFH, 256kbit EEPROM を0000H-7FFFH に配置しています。IOは0C0H に8251を、0E0HにPCF8574 (I2C interface)を配置しています。あとで、CP/Mを動かそうと思っているのですが、下位のROMをRAMに変更できないといけないんですが、どうやるかはこれから考えるところ。

(写真は、上に書いたもののどれも写ってない!)

CP/Mの開発環境を使うことを念頭に、下記のようなプログラム開発フローを作ろうと考えました。

1) こちらで紹介されているCP/M エミュレーターで、最初のテストを行う。

2) 開発環境は、CP/Mのツールを使う。(smallc など)

3) コンパイル等は、windowsで行い、エミュレーターでテストする。

4) コンパイルは、CP/M のバイナリーを生成するのと同時に、CP/Mと互換のBDOSをROMに書いた8080ボードでも動くようにバイナリーを生成し、Intel Hexをtera term でボードに送り込んで動かす。

このとき、4)のCP/M 互換のBDOSを8080CPUボードで動かすのは、こちらの8085モニターを8080で動くように変更してやることにしました。これは、8080のアセンブラ、逆アセンブラが付いていますので、8080のアセンブラを覚えていない私にとってはちょうどいい感じなので、これで。

このモニタープログラムを8080で動くようにするには、シリアル通信を受信割り込みをかけてやっているので、それをRST7の割り込みで行うように変更するだけでOKなんですが、元のプログラムですと、タイミング悪く受信割り込みがかかると、シリアル受信バッファーのインデックスがずれてしまう問題があったので、修正をしました。

また、私のボードは、割り込みがかかると、必ずRST7に飛んでしまう仕様になっているので、割り込み先をユーザープログラムで乗っ取ることができるようにするために、一旦RAMのアドレスに飛んで、そちらから割り込みハンドラー(シリアルデータ受信ルーチン)にJMPするようにしました。

それから、もとのモニタープログラムでは、Intel Hexのロードはできるようにはなっていませんので、モニタープログラムのsmallcのソースを変更して、load コマンドでIntel Hexの読み込みができるようにしました。

さらに、I2Cインターフェースのチェックなどに便利?と、モニターにIOポートの読み書きコマンド(out, inp) を実装しました。これを実装するときに、Z80と8080の違いを勉強したんですが、8080は、IO関係の命令でレジスタ間接アドレッシングができないので、ROMに命令を置くと、読み書きするIOアドレスが変えられないとわかって、ちょっと不便だな、と思いました。相対ジャンプ命令もないし・・・

プログラム開発環境整備を試行錯誤しつつ、モニタープログラムを書きつつ、デバッグしつつ、で結構時間がかかってしまいましたが一応動くようになりました。

ROMに書き込むプログラムのアセンブルは、zasm オンラインアセンブラーでやっています。8080の命令以外を使っていないかチェックできるし、8080の二モニックに対応しているし、Intel Hexを吐けるしで、結構便利。

ということで、一応できたので、ここにモニターのアセンブラコードをおいておきます。っと思ったんだけど、添付の仕方がわからん・・・

MON80_ASM

これでいいかな?

これはIntel Hexをロードしているところ。チェックサムは一応見ていて、おかしな行が出てきたらアボートし、メモリのどこをいじくったかわかるようにしてます。XON/XOFFのフロー制御は一応うまく動いているようで、エラーは出ませんけど(処理に無駄が多く、速度が200bytes/secぐらいしか出ませんが!)。

 

これは、IO input, output を試しているところ。