CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

68040プラットホーム

GCCで68000ボードで正常動作するコードが生成できたので、まあ問題ないと思いますが68040環境でも確認しておきます
 
以前作った68040ボードは基板上にRTCを持っているのでそのレジスタを読み出し整形してLCDに表示するだけのテストプログラムを用意しました
 
イメージ 1
 
ビルド用のスクリプトはほとんど同じで、プロセッサオプションに-m68040を指定し
リンク時のスタートアドレスとハードウェア固有ののドライバを含むライブラリが変わるだけです
 
イメージ 4

RTCのレジスタを読み出し、time.hで定義されるtm構造体にセットするgettime()、
tm構造体のメンバをRTCのレジスタにセットするsettime()のみ自作してやればあとはANSI-C標準の時間管理関数が使えるので楽・・・と思ったら
tm構造体を可読文字列にするasctime()、time_t型変数を可読文字列にするctime()は下請けにsprintf系関数を呼ぶようでリンクエラーのため使えません。
ここも手作りで文字列整形してやり、プログラムをビルド。ボード上で問題なく動作しました
 
中央の冷却ファンの下にMC68040が鎮座しています
 
イメージ 2

RTCから取り出した現時刻をmktime()でtime_t型変数に変換して合わせて表示していますがよくよくみると何か変。
現在のtime_t型のUNIX時刻(1970/1/1 0時からの秒数)は14億秒を超えているはず。
微妙に足りません
 
怪しいのが自作のgettime関数です。
RTCに2桁分しかない年のレジスタ値を西暦年に拡張するため2000を足して
tm構造体のtm_yearメンバにセットしていましたがこれが間違い。
 
イメージ 5

tm_yearメンバは「1900年からの年数」が正解のようです。補正値は+100にしなければなりません
もっともこの基板内でクローズしている変数なので何だろうと一向にかまわないのですがいちおう修正後は正しいUNIX時刻を表示しています
 
 
イメージ 3