?? start12.c
字號(hào):
LDY 2,X+ //裝載目的地址
#endif //FAR_DATA
#if defined(__HCS12X__) && defined(FAR_DATA)
#if defined(__OPTIMIZE_FOR_SIZE__) // -os, 默認(rèn)
Copy: PSHA
LDAA 1,X+
GSTAA 1,Y+ //從ROM中移出一個(gè)字節(jié)數(shù)據(jù)到數(shù)據(jù)域
PULA
__FEED_COP_IN_HLI() //如果有必要就喂COP
DBNE D,Copy //復(fù)制字節(jié)的循環(huán)
#else
LSRD //除以2并且保存位0到標(biāo)志Carry中
BEQ Copy1 //我們復(fù)制了多于一個(gè)字節(jié)嗎?
Copy: PSHD
LDD 2,X+
GSTD 2,Y+ //從ROM中移出一個(gè)字?jǐn)?shù)據(jù)到數(shù)據(jù)域
PULD
__FEED_COP_IN_HLI() //如果有必要就喂COP
DBNE D,Copy //復(fù)制字的循環(huán)
Copy1:
BCC NextBlock //處理最后一個(gè)字節(jié)?
LDAA 1,X+
GSTAA 1,Y+ //從ROM中移出一個(gè)字節(jié)數(shù)據(jù)到數(shù)據(jù)域
#endif
#elif defined(__OPTIMIZE_FOR_SIZE__) // -os, 默認(rèn)
Copy: MOVB 1,X+,1,Y+ //從ROM中移出一個(gè)字節(jié)數(shù)據(jù)到數(shù)據(jù)域
__FEED_COP_IN_HLI() //如果有必要就喂COP
DBNE D,Copy //復(fù)制字節(jié)的循環(huán)
#else //__OPTIMIZE_FOR_TIME__
LSRD //除以2并且保存位0到標(biāo)志Carry中
BEQ Copy1 //我們復(fù)制了多于一個(gè)字節(jié)嗎?
Copy: MOVW 2,X+,2,Y+ //從ROM中移出一個(gè)字?jǐn)?shù)據(jù)到數(shù)據(jù)域
__FEED_COP_IN_HLI() //如果有必要就喂COP
DBNE D,Copy //復(fù)制字的循環(huán)
Copy1:
BCC NextBlock //處理最后一個(gè)字節(jié)
MOVB 1,X+,1,Y+ //復(fù)制最后一個(gè)字節(jié)
#endif //__OPTIMIZE_FOR_SIZE__/__OPTIMIZE_FOR_TIME__
BRA NextBlock
funcInits: //在C++需要的時(shí)候調(diào)用全局構(gòu)造函數(shù)
#if defined(__cplusplus)
#if defined(__ELF_OBJECT_FILE_FORMAT__)
#if defined( __BANKED__) || defined(__LARGE__)
LDY _startupData.nofInitBodies//裝載cpp的數(shù)量
BEQ done //如果cppcount == 0, 跳轉(zhuǎn)到 done
LDX _startupData.initBodies //裝載第一個(gè)模塊的地址來初始化
nextInit:
LEAX 3,X //進(jìn)行下一個(gè)模塊的初始化
PSHX //保存下一個(gè)功能函數(shù)的地址來初始化
PSHY //保存cpp計(jì)數(shù)器
CALL [-3,X] //使用雙重間接調(diào)用來裝載頁(yè)寄存器
PULY //恢復(fù)cpp計(jì)數(shù)器
PULX //恢復(fù)實(shí)際地址
DEY //cpp計(jì)數(shù)器自減
BNE nextInit
#else //defined( __BANKED__) || defined(__LARGE__)
LDD _startupData.nofInitBodies//裝載cpp的數(shù)量
BEQ done //如果cppcount == 0, 跳轉(zhuǎn)到 done
LDX _startupData.initBodies //裝載第一個(gè)模塊的地址來初始化
nextInit:
LDY 2,X+ //裝載第一個(gè)模塊的地址來初始化
PSHD
PSHX //保存實(shí)際地址
JSR 0,Y //調(diào)用初始化函數(shù)
PULX //恢復(fù)實(shí)際地址
PULD //恢復(fù)cpp計(jì)數(shù)器
DBNE D, nextInit
#endif //defined( __BANKED__) || defined(__LARGE__)
#else //__ELF_OBJECT_FILE_FORMAT__
LDX _startupData.mInits //裝載第一個(gè)模塊的地址來初始化
#if defined( __BANKED__) || defined(__LARGE__)
nextInit: LDY 3,X+ //裝載初始化函數(shù)的地址
BEQ done //當(dāng)?shù)刂?== 0時(shí)停止
//在通常情況下這個(gè)功能函數(shù)的偏移地址為非0,
//因此可以不需要進(jìn)行這個(gè)測(cè)試
#ifdef __InitFunctionsMayHaveOffset0__
BRCLR -1,X, done, 0xff //當(dāng)?shù)刂?== 0時(shí)停止
#endif //__InitFunctionsMayHaveOffset0__
PSHX //保存下一個(gè)功能函數(shù)的地址來初始化
CALL [-3,X] //使用雙重間接調(diào)用來裝載頁(yè)寄存器
#else //defined( __BANKED__) || defined(__LARGE__)
nextInit:
LDY 2,X+ //裝載第一個(gè)模塊的地址來初始化
BEQ done //停止當(dāng)函數(shù)地址 == 0
PSHX //保存實(shí)際地址
JSR 0,Y //調(diào)用初始化函數(shù)
#endif //defined( __BANKED__) || defined(__LARGE__)
PULX //恢復(fù)實(shí)際地址
BRA nextInit
#endif //__ELF_OBJECT_FILE_FORMAT__
done:
#endif //__cplusplus
}
}
#endif //__ONLY_INIT_SP
//調(diào)用主函數(shù)不支持返回任何值
#if defined( __ELF_OBJECT_FILE_FORMAT__) && defined(__cplusplus ) && 0
#if !defined(FAR_DATA) && (defined( __BANKED__) || defined(__LARGE__))
static void __far Fini(void)
#else
static void Fini(void)
#endif
{
// 目的: 1) 在C++中調(diào)用全局構(gòu)造
__asm {
#if defined( __BANKED__) || defined(__LARGE__)
LDY _startupData.nofFiniBodies//裝載cpp的數(shù)量
BEQ done //如果cppcount == 0, 跳轉(zhuǎn)到done
LDX _startupData.finiBodies //裝載第一個(gè)模塊地址來完成操作
nextInit2:
LEAX 3,X //增加下一個(gè)init
PSHX //保存下一個(gè)功能函數(shù)的地址來完成操作
PSHY //保存cpp計(jì)數(shù)器
CALL [-3,X] //使用雙重間接調(diào)用來裝載頁(yè)寄存器
PULY //恢復(fù)cpp計(jì)數(shù)器
PULX //恢復(fù)實(shí)際地址
DEY //cpp計(jì)數(shù)器自減
BNE nextInit2
#else //defined( __BANKED__) || defined(__LARGE__)
LDD _startupData.nofFiniBodies//裝載cpp的數(shù)量
BEQ done //如果cppcount == 0, 跳轉(zhuǎn)done
LDX _startupData.finiBodies //裝載第一個(gè)模塊地址來完成操作
nextInit2:
LDY 2,X+ //裝載第一個(gè)模塊地址來完成操作
PSHD
PSHX //保存實(shí)際地址
JSR 0,Y //調(diào)用完成的功能函數(shù)
PULX //恢復(fù)實(shí)際地址
PULD //恢復(fù)cpp計(jì)數(shù)器
DBNE D, nextInit2
#endif //defined(__BANKED__) || defined(__LARGE__)
done:;
}
}
#endif
#include "non_bank.sgm"
#pragma MESSAGE DISABLE C12053 //在調(diào)試信息中,堆棧指針不會(huì)改變
#pragma NO_FRAME
#pragma NO_ENTRY
#if !defined(__SMALL__)
#pragma NO_EXIT
#endif
//_Startup函數(shù)必須被調(diào)用是為了初始化全局變量和來調(diào)用main函數(shù)
//你可以修改這個(gè)函數(shù)或者在你的啟動(dòng)代碼中調(diào)用它來實(shí)現(xiàn)一個(gè)不同的啟動(dòng)功能
//你應(yīng)該創(chuàng)建需要的IO寄存器作為WINDEF(僅HC12A4)或者COP寄存器來運(yùn)行在硬件上
//為了設(shè)置復(fù)位中斷,下面的幾個(gè)方法是可能的:
//1.復(fù)位中斷函數(shù)使用中斷號(hào)0
//2.加以下的代碼到你的prm文件:VECTOR ADDRESS 0xfffe _Startup
//當(dāng)然,甚至有更多可能性存在
//復(fù)位中斷必須設(shè)置為了讓應(yīng)用程序有一個(gè)定義的入口點(diǎn)
#if defined(__SET_RESET_VECTOR__)
__EXTERN_C void __interrupt 0 _Startup(void) {
#else
__EXTERN_C void _Startup(void) {
#endif
//目的: 1)初始化堆棧
// 2)初始化內(nèi)存,復(fù)制初始化數(shù)據(jù)等等(初始化)
// 3)調(diào)用主函數(shù):
//參數(shù):無
//調(diào)用者:由連接器生成的預(yù)啟動(dòng)代碼
// 或者由復(fù)位中斷直接調(diào)用
//初始化堆棧指針
INIT_SP_FROM_STARTUP_DESC(); //HLI宏定義在hidef.h 中
#if defined(_HCS12_SERIALMON)
//為了支持EB386,需要監(jiān)視在內(nèi)存和EEPROM中的基本軟件,
//這是通過編輯內(nèi)存和EEPROM區(qū)域來實(shí)現(xiàn)的。
___INITRG = 0x00; // 鎖定寄存器塊在0x0000
___INITRM = 0x39; // 鎖定RAM結(jié)束地址在0x3FFF
___INITEE = 0x09; // 鎖定EEPROM結(jié)束地址在0x0fff
#endif
//這里用戶定義代碼可以被插入,堆棧能被使用
#if defined(_DO_DISABLE_COP_)
_DISABLE_COP();
#endif
//例子:設(shè)置WinDef寄存器來允許分配頁(yè)
#ifdef HC812A4 //HC12 A4 需要WINDEF來配置哪些頁(yè)面是可變的
#if (__ENABLE_EPAGE__ != 0 || __ENABLE_DPAGE__ != 0 \
|| __ENABLE_PPAGE__ != 0)
WINDEF= __ENABLE_EPAGE__ | __ENABLE_DPAGE__ | __ENABLE_PPAGE__;
#endif
#endif
#if defined(__DO_SET_MMCTL1__)
//設(shè)置MMCTL1字節(jié)。請(qǐng)使用HCS12XE并且根據(jù)你的配置改變相應(yīng)的位
//注意:MMCTL1只能寫一次因此請(qǐng)?jiān)谶@兒改寫這些初始化
//這個(gè)應(yīng)該在調(diào)用初始化之前被完成
#define _MMCTL1_ADR (0x00000013)
#define _MMCTL1_BIT_TGMRAMON (1<<7) //EEE Tag RAM and FTM SCRATCH RAM
//在內(nèi)存中可見
#define _MMCTL1_BIT_EEEIFRON (1<<5) //EEE IFR在內(nèi)存空間中可見
#define _MMCTL1_BIT_PGMIFRON (1<<4) //在內(nèi)存空間中編寫IFR可見
#define _MMCTL1_BIT_RAMHM (1<<3) //RAM僅在內(nèi)存的高半塊中
#define _MMCTL1_BIT_EROMON (1<<2) //使得內(nèi)存中仿效的Flash或者ROM有效
#define _MMCTL1_BIT_ROMHM (1<<1) //Flash或者ROM僅在內(nèi)存的高半塊中
#define _MMCTL1_BIT_ROMON (1<<0) //使得Flash或者ROM在內(nèi)存空間中有效
#define _MMCTL1_SET(value) ((*(volatile unsigned char*)_MMCTL1_ADR)=(value))
_MMCTL1_SET(_MMCTL1_BIT_ROMON | _MMCTL1_BIT_EROMON | _MMCTL1_BIT_RAMHM \
| _MMCTL1_BIT_ROMHM);
#endif
#ifndef __ONLY_INIT_SP
Init();
#endif
//這兒用戶定義的代碼能被插入,所有的全局變量已經(jīng)被被初始化
#if defined(_DO_ENABLE_COP_)
_ENABLE_COP(1);
#endif
//調(diào)用main()
main();
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -