jsskさんの調査によれば、appliletでシステムの「オンチップディバグ設定」タブのオンチップディバグ設定を「使用する」に変更することで、デバッガが使えるコードを生成することができます。この変更を行わないと「F0c34: オンチップ・デバッグで使用する予約領域への書き込みはできません。(address 0000)」というエラーが出てデバッガを動かすことができません。
appliletを使えば、デバッガの動くコードと動かないコードが作れるので、違いを調べてみました。方法は、オンチップデバッガ設定を「使用する」と「使用しない」の2種類の設定で生成されたコードの差分を取りました。フォルダーの名前が違うと差分が多くなるので、最初に作ったフォルダーは生成した後で別名に変えて、2番目に作るフォルダーは最初に作ったフォルダーと同じ名前にしました。
先に結論を言うと変更点はけっこう多いのでappliletでスケルトンを作る方がよっぽど楽です。さらに追い討ちをかけるように、実はオンチップデバッガを動かすための情報はユーザーズ・マニュアルの27章に全て書いてありました(先にマニュアル調べればよかった><)。
とりあえず、差分を載せておきます。
(1) オンチップデバッグモードを有効にする(crte.s)
(2) security id(system.s)
(3) ROMの予約領域とRAMの予約領域を確保する(inttab.s)
(4) デバッグ用の割り込みベクター(inttab.s)
(5) デバッグで使うUART0の割り込みベクター(inttab.s)
(6) デバッグで使うUART0を有効にする(port.c)
(7) リンク用ファイルへの追加(850.dir)
詳しくはユーザーズ・マニュアルの27.2 DCUを使用しない方法をご覧ください。ROMを2kバイト、RAMを16バイト、デバッグ用にとられてしまうようです。
4/18 追記 jsskさんに差分の抜けを教えていただきました。
(提供 jsskさん)
セキュリティIDについてはユーザーズ・マニュアルの27.3 ROMセキュリティ機能に載っています。system.incというのはアセンブラのincludeファイルです。
appliletを使えば、デバッガの動くコードと動かないコードが作れるので、違いを調べてみました。方法は、オンチップデバッガ設定を「使用する」と「使用しない」の2種類の設定で生成されたコードの差分を取りました。フォルダーの名前が違うと差分が多くなるので、最初に作ったフォルダーは生成した後で別名に変えて、2番目に作るフォルダーは最初に作ったフォルダーと同じ名前にしました。
先に結論を言うと変更点はけっこう多いのでappliletでスケルトンを作る方がよっぽど楽です。さらに追い討ちをかけるように、実はオンチップデバッガを動かすための情報はユーザーズ・マニュアルの27章に全て書いてありました(先にマニュアル調べればよかった><)。
とりあえず、差分を載せておきます。
(1) オンチップデバッグモードを有効にする(crte.s)
mov 0, r11 -- normal mode st.b r11, PRCMD[r0] st.b r11, OCDM[r0]
(2) security id(system.s)
.section "SECURITY_ID", text .byte CG_SECURITY0 -- Security ID head .byte CG_SECURITY1 .byte CG_SECURITY2 .byte CG_SECURITY3 .byte CG_SECURITY4 .byte CG_SECURITY5 .byte CG_SECURITY6 .byte CG_SECURITY7 .byte CG_SECURITY8 .byte CG_SECURITY9 -- Security ID tail
(3) ROMの予約領域とRAMの予約領域を確保する(inttab.s)
-- Secures 2 KB space for monitor ROM section .section "MonitorROM", const .space 0x800, 0xff -- Secures 12 byte space for monitor RAM section .section "MonitorRAM", bss .lcomm monitorramsym, 12, 4 -- defines monitorramsym symbol
(4) デバッグ用の割り込みベクター(inttab.s)
.section "DBG0" -- Secures DBG0 interrupt vector for debugging .space 4, 0xff
(5) デバッグで使うUART0の割り込みベクター(inttab.s)
.section "INTUA0R", text -- Secures interrupt vector for serial communication .space 4, 0xff .section "INTUA0T", text -- Secures interrupt vector for serial communication .space 4, 0xff
(6) デバッグで使うUART0を有効にする(port.c)
PMC3 |= 0x03;
(7) リンク用ファイルへの追加(850.dir)
MROMSEG : !LOAD ?R V0x03f800 { MonitorROM = $PROGBITS ?A MonitorROM; };
MRAMSEG : !LOAD ?RW V0x03ffeff4{ MonitorRAM = $NOBITS ?AW MonitorRAM; };
詳しくはユーザーズ・マニュアルの27.2 DCUを使用しない方法をご覧ください。ROMを2kバイト、RAMを16バイト、デバッグ用にとられてしまうようです。
4/18 追記 jsskさんに差分の抜けを教えていただきました。
(8)security id定義(system.inc) .set CG_SECURITY0, 0xff .set CG_SECURITY1, 0xff .set CG_SECURITY2, 0xff .set CG_SECURITY3, 0xff .set CG_SECURITY4, 0xff .set CG_SECURITY5, 0xff .set CG_SECURITY6, 0xff .set CG_SECURITY7, 0xff .set CG_SECURITY8, 0xff .set CG_SECURITY9, 0xff
(提供 jsskさん)
セキュリティIDについてはユーザーズ・マニュアルの27.3 ROMセキュリティ機能に載っています。system.incというのはアセンブラのincludeファイルです。
一点本質ではありませんが、以下差分も加えていただけると良いかと。
(8)security id定義(system.inc)
.set CG_SECURITY0, 0xff
.set CG_SECURITY1, 0xff
.set CG_SECURITY2, 0xff
.set CG_SECURITY3, 0xff
.set CG_SECURITY4, 0xff
.set CG_SECURITY5, 0xff
.set CG_SECURITY6, 0xff
.set CG_SECURITY7, 0xff
.set CG_SECURITY8, 0xff
.set CG_SECURITY9, 0xff