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