SkyBootを中途半端に解析
とりあえずSMACで通信は出来るようになったわけですが、公式サンプルのSerialProjectをBDMで動かすとやっぱり動かない。
SCIとかは動いているけど、マイコンのクロックがちゃんと設定されていようでボーレートがおかしい。
クロックの設定は、SkyBoot側でやってるんじゃないのか?と思いデバッガで解析してます。
「SkyBootのバイナリーコードをSS-1に書き込むためのプロジェクトと説明マニュアル」で、SkyBootを書きこめるのですが、書き込んだ後そのままデバッガで実行すればいいわけですね。
一応SPIやICG(クロックジェネレータ)の設定するっぽいとこは見つけたのですが、まだ解決せず。
とりあえず現状解析した結果を載せときます。
【凡例】
→ ジャンプ
⇒ コール (RTSでリターン)
(mmmm) = nn メモリmmmm番地へnnを書き込む(nnnnの場合は16bit)
(mmmm.b) = n メモリmmmm番地のbit bにnを書き込む
(mmmm:label) = dd labelはポート名とか
● メモリマップ0000-007F DIRECT PAGE REGISTRES
0080-107F RAM
042B IQRSCの内容書いてた
1035〜 フックテープル
(デフォルトのハンドラ:E946)1080-17FF FLASH (1920BYTE)
1800-182B HIGH PAGE REGISTERS
182C-FFFF FLASH (59348BYTE)
1A00- ユーザープログラム
E000- SkyBoot● モデム関連IO
(MODEM) (マイコン)
~M_REST ← PTD3
~M_IRQ → IRQ
~ATTN ← PTD0
RXTXEN ← PTD1Out_of_idle → PTD1
CRC_Valid → PTE6MOSI ← PTE4/MOSI1
MISO → PTE3/MISO1
SPICLK ← PTE5/PSPCK1
~CT ← PTE2/~SS1
● SkyBoot解析
▼ START
E000 START
SP = 1035
→ E7DDE7DD INIT START
SRS(1800)を読んでリセット理由チェック(大抵は0x80 = POR か 0x40 = PINだな)
→ E820 PORか (0100)=0x00の場合 (ワークがクリアされてるかチェックか?)
そうじゃなかったら、E7ED〜の初期化っぽい処理E820
0008をPUSH
→E907E907
(0FA8-0000) をクリアしているのか?
→E82BにRTSでジャンプ (このアドレスはいつスタックにつんだ?)E82B この辺から Main()かな
(0111)=00 (1028)の値
(0108)=FFFF (FFC2)の値
(0106)=FFFF (FFC0)の値⇒E948 MPUInit
⇒EBAC SetTimer
⇒F1A1 SCIInit
⇒F505 WorkInit
⇒ED77 ModemNanika
⇒E937 SetICG
(その後、初期化ルーチンコールが続く)
E87D JMP 1A00 ★アプリ開始 (1A00)=0xCCの場合 ※プログラムが存在することを確認しているようだ
E880
モニタプロンプトとかの処理だと思われる
:
▼ サブルーチン的な
【MPUInit】
E948 MPUInitとかそんな感じの
E948-E96C フックテープル初期化
E96E-
SOPT=0x73 (COP無効化)
(0030)=0x0D ※TPM1をセットして、カウンタが0x80になるまで待つ
(0028)=0x50,(0029)=0x00,(002A)=0x00 ※SPI初期化
(000F.3)=1 なら →E9B9 ※通過
⇒E924
(0014)=0x14 IRQSC (書き込み後は0x10になった) ※IRQPE=1
(000C.3)=1 PTD3(~M_REST)=1
→E9B4E9B4
→E993 ※ (X+2)が0の場合
E993
(0014.3;IRQSC.IRQF)=0 なら →E9B4
↓IRQキター
⇒ED32
A=(X+2) (1027+2) ※A=0x24になった
A&=0x3F
A|=0x80
(002D;SPI1D)=A (A4)
(002B.7;SPI1S.7)=0になるまで待つ
⇒ED32
E99B
(ループ E993へ) そのうち抜けるかな
E9AF
(0014.2;IRQSC.IRQACK)=1
(0014:IRQSC)=16
(1820;FCDIV)=0x27
(0000.0;PTAD0)=0
(0003.0;PTADD0)=0
(000C.2;PTDD2)=1
(000F.2;PTDDD2)=1
(0005.4;PTBPE4)=1
F9CD RTS
ED32 SPIに値を書き込むルーチン (3回書いてる)
(002B;SPI1S)を読む
(002D;SPI1D)を読む
(0014;IRQSC)を読む(0x18)
(042B)に書く(0x18)
0x18 &= 0xF9 ※IRQSCの Bit1,2を0に。(IRQIE,IQRACK)
(0010.2)=0 ※ PTED.2=0 (~CT)
ED67 RTS
E924 GPIO初期化 ※モデム関連
(000D.3)=0 PTDPE
(0010.2)=1 PTED
(000C.0)=1 PTDD
(000C.1)=0
(000C.3)=0
(0013.2)=1 ETEDD
(000F.0)=1 PTDDD
(000F.1)=1
(000F.3)=1
RTS
E909
E909-E91F どこかメモリークリア?
→ E95B なぜかE95B
【SetTimer】
EBAC
⇒E9D0
EBAF
(0428)=A (0x27)
EBB3 RTSE9D0 TPMセット
(0033;TPM1MODH)=0x01
(0034;TPM1MODL)=0xF4
(0031;TPM1CNTH)=0
(0030;TPM1SC)=0x0b
(0030.7)=0
RTS
【SCIInit】
F1A1
(省略)
F1F9 RTS
【WorkInit】
F505 メモリー上のワークを初期化しているようだ
【ModemNanika】
ED77
(なにかメモリー上の処理)
⇒ECF7 SPIでモデムになにかセット
ECF7
(SPIでモデムと通信)※送信/受信どちらかはみていない
ED31 RTS
【SetICG】
E937
(0048;ICGC1)=0x50 ※RANGE=1,CLKS=10 FLL bypassed, external reference
(004A.1)=0の間待つ ※シミュレーターだとすすまない・・・(クリスタルついてないからか)
(0048.4)=1
(0049)&=0x8F
E945 RTS※ここでクロック設定している
※これだけを抜き出して、自分のソースに組み込むと、そこでDBMとの接続が途切れる(0MHzっていわれる)
※SkyBootを焼いたROMでも、デバッガでいきなりこの番地にジャンプすると同様に途切れる
※外部のクリスタルを有効にするための手順がなにかあるのかもしれない
● 参考URL
・クロック変更で参考になりそうなソース
http://rcrblog.blogspot.com/2006_01_01_archive.html
・ColdFire V1 のクロック設定 - オーバークロックへの道
・デバッガから周波数を変更する
・プログラムでクロック設定を切り替える
・良い子はマネしてはいけない、オーバークロックの実験
noritanさんのブログから。
逆アセンブルした結果を取得する方法あったんですね。しらなくて、手で入力してました。
フォーラムでも解析してくださっているので期待age。
→SS-1のワイアレス・シリアル・ケーブルプロジェクトを読む