CPU実験室

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

ブートローダ

最初に動かしてみるコードは出来上がりました。普通ならこれをROMにそのまま焼いて電源ONとなるのですが、今回のADSP-2101はブートシーケンスの仕組みがあるのでちょっと下準備が必要です。

まず電源ONで最初に実行されるプログラムはブートメモリ空間にある8ビット幅のROMに格納されています。電源ONでその内容がDSP内蔵のRAMの先頭番地へ転送されそこに制御が移されます。

f:id:O3I:20210614091955j:plain

ブートメモリは8ビット幅なのに対しDSPのプログラム空間は24ビット幅なのでROMには上位・中位・下位・(空き)の順番で詰めていきます。ただし最初の(空き)にはページレングス(プログラムワード長/8-1)を入れておきます。

こうしてDSPの2kワードのプログラム空間を埋めるのにブートROM8kバイト/ページあれば十分ですがDSP内蔵レジスタSystem Control Resgisterでページを8枚切替えてリブートができます。結果ROMは8k×8ページ=64kバイト・・・512kビットの27C512でフルフルですがここでは1MビットROMをつかったので最上位A16をジャンパポストで設定し最大16ページ持てるようにしてあります。

 

永久ループのコード「18000F」が入ったブートROMの内容は以下になります。アドレス0003に入った「00」がページレングスを示していてプログラムワード長は8になります。プログラムの実体は1ワードしかありませんが残りはダミーで「00」でフィルしておきます

f:id:O3I:20210614093101j:plain

 

この内容を焼いたROMをボードに差し、今度こそ電源ON。先ずブートシーケンスの状況を確認しました。

上からch1:/RD、ch2:A0、ch3:/BMS(Boot Memory Select)です

f:id:O3I:20210614092029j:plain

/BMSがLになってブートROMをイネーブルにして/RDが25回パルスを出して確かに25バイト(=3*8+1)分コードを読み出しているようです。アドレスバスA0は16回しか変化していませんが、これは上位、下位、中位の順番でアクセスしているからのようです

このブートシーケンスは約10usで完了しました。

 

このあとはDSP内蔵RAM内で永久ループのプログラムが走っているはずでそれを観察するため時間軸を延したのですが・・・・あらら?

f:id:O3I:20210614092108j:plain

/BMSが1回こっきりなのはいいとして、メモリを読み出しているはずの/RDもそれっきり変化しません。アドレスバスA0に至っては放電波形になっていてバスが切り離されてHi-Z状態になっているようです。

つまり内部メモリで動いているときは外部バスは一切アクセスされないと。前の疑問がこのデバイスに関しては解決しました。

しっかし、これでは本当にプログラムが動いているかがわかりません(もっとも外部が全くアクセスされていないというのが内部でループしている証左でもありますが)