2022-02-01 22:40 — asano
プリント基板化したROMエミュレータのハードウェアが無事動作したので次はソフトウェアです。
マイコンをAT90S2313からATtiny2313に移行するためにはソフトウェアの変更が必要になります。
まず確認のためにHDD内に残っていたソースを再アセンブルして新しいAT90S2313に書き込んで試したところ動作しませんでした。動いたAT90S2313から読み出してバイナリを比較してみたところ一致せず、長らく真のソースだと思っていたものは開発途上の未完成品かもしれません。タイムスタンプによると20年ほど経っているので最終版を探すのは難しそうです。
救いは動いているバイナリが存在することで、これを逆アセンブルすればソースが復元できそうです。
以前INS8073のROMを読むででっち上げた簡易逆アセンブラをAVR用に改造して読んでみました。すると大半は共通で以下の機能が追加されているようです。
- F(ill), M(ove)コマンド
- 頻繁なリセット対策
どちらも必須機能ではないのにと思いつつバイナリが同じになるようソースを修正していきます。
コードエリアが終わって文字列領域にとりかかったときに原因に気付きました。
最初に書いていた時と使用アセンブラが異なるのですが、疑似命令の書式などはエラーのたびに修正していました。実は文字列の扱いが異なっているのですが、それはエラーにならないのでうっかり忘れていたのです。
現在使っているアセンブラはPACKING ON
を指示しないと文字列をパッキングしてくれません。コードは文字列がパッキングされていることを前提にしているので1文字ごとに00(終端マーク)を見つけてしまい文字列が表示されなくなってしまっていたのでした。
最初に気付いていれば...
逆アセンブルなどしなくても動作していたのかもしれません。まぁ機能も追加されたので無駄ではなかったと思うことにしましょう。
とにかくAT90S2313で動作するソースが手に入りました。今度はこれをATtiny2313用に変更していきます。tinyに置き換えるのには理由があります。
- セラミック振動子が省略できる→I/Oピンが2本増やせる
- ROM容量の大きいATtiny4313への布石
このエミュレータは32k×8ですが128k×8や128k×16を考えたときにI/Oピン(すでに全部使用中)とROM(残り3ワード)の増加は避けて通れないポイントです。
ATtiny2313対応のためにはUART関係とタイマ初期化に変更が必要です。
この変更で初期化コードが増えてしまいROMに入りきらなくなってしまいました。幸い使われていないコードの削除と、(レジスタの初期値を信じて)初期化の一部を省略することで何とかROMに収めることが出来ました。現在空きは0ワードです。
ATtiny2313は初期状態で内蔵発振器が有効になっています。外部の振動子を使うにはフューズビットを書き換えなければなりませんが、どうせ書き換えるなら内蔵発振器を試してみることにします。データシートによると出荷状態では8MHzのRC発振器が有効で、CKDIV8(1/8プリスケーラ)が有効になっているようです。
ならCKDIV8だけ切れば8MHzで動くはずと試しましたがシリアル出力が文字化けしています。TXDの波形を見ると9600bpsのはずが4800bpsになっています。とりあえずターミナル設定を切り替えてビットレート以外の問題が無いことを確認します。
さて問題はクロックです。フューズビットを読み出してみるとCKDIV8="1"(プリスケーラは1/1で意図通り)、CKSEL3..0=”0010”でなんと4MHz設定でした。間違えて変更してしまったのかと新品を取り出して読んでみましたがこれも"0010"でした。データシートには初期値は"0100"とあるのですが、どこかの時点で変更になったのでしょうか?
もっと新しいATtiny2313とメモリ容量の大きいATtiny4313も届いているので近いうちに初期値を確認してみるつもりです。
2023年3月9日 追記:
ASの文字列の扱いの話、AVRAからASへで書いていましたね。
どうしてこんな中途半端なソース残していたんだろう?
コメントを追加