HotC51宏彙編數組HotWC3演示包(V2.00)之Week函數

/*----------------------------------------------------------------------------

HotC51宏彙編數組定義頭文件(hotmacro.h V2.00)

最初建立時間: 2009.2.18

最近修改時間: 2009.3.12 (植樹節)

增 添原 因: 為全面支持裸奔式實時操作系統HotTask51做準備

HotWC3發佈並正式參戰彙編數組,逆向世界開始昏暗。

“宏C”計劃開始, 支持帶參數輸入輸出的"數組函數"。

繼續增添HotC51彙編數組擴展指令集

應 用: 可以用COM接口技術對HotC51彙編數組進行封裝

-----------------------------------------------------------------------

函數CRCR8(macro_U8_arg1, macro_U8_arg2, macro_U8_arg3)

入口:

macro_U8_arg1 初值

macro_U8_arg2 權

macro_U8_arg3 明文

出口:

macro_U8_Result CRCR8結果

-----------------------------------------------------------------------

U8_Function_Arg3 (CRCR8, macro_U8_arg1, macro_U8_arg2, macro_U8_arg3)

begin

#define CRCR8_LOOP -15

#define CRCR8_NEXT size_XRL_A_Rn()

asm_MOV_B(8),//設置8位計數器

//CRCR8_LOOP:

asm_MOV_A_Rn(macro_U8_arg3),//取明文

asm_XRL_A_Rn(macro_U8_arg1),//異或初值

asm_RRC_A(),//右移CRC8一位,注意ACC.0移入CY

asm_MOV_A_Rn(macro_U8_arg1),//再取初值

asm_JNC(CRCR8_NEXT),//CY為0不異或權,跳過下句

asm_XRL_A_Rn(macro_U8_arg2),//異或權

//CRC8R_NEXT:

asm_RRC_A(),//將CY移入ACC.7

asm_MOV_Rn_A(macro_U8_arg1),//保存本次結果

asm_MOV_A_Rn(macro_U8_arg3),//再取明文

asm_RR_A(),//準備下一位

asm_MOV_Rn_A(macro_U8_arg3),//保存明文,注意已改變

asm_DJNZ_B(CRCR8_LOOP),//未完繼續到CRCR8_LOOP

---------------------------------------------

//將初值安排在Arg1可節省下面2句

// asm_MOV_A_Rn(macro_U8_arg1),//取結果

// asm_MOV_Rn_A(macro_U8_Result),//送返回值

----------------------------------------------

U8_return_result()//結果已在macro_U8_Result中

end;

未 來計 劃: 首先將HotC51彙編數組做成比宏彙編更好用的接近C習慣.

逐步完善,最終全面到達“宏C”之目標。

菜農[email protected] 2008.3.12 18:58 植樹節 於西安大雁塔村農會

-----------------------------------------------------------------------------*/

/*-----------------------------------------------------------------------

函數Week(macro_U16_arg1, macro_U8_arg2, macro_U8_arg3)

入口:

macro_U16_arg1 年(0x00~0x9999)BCD碼

macro_U8_arg2 月(0x01~0x12)BCD碼

macro_U8_arg3 日(0x01~0x31)BCD碼

出口:

macro_U8_Result 星期(0~6)

長度: 82字節

-----------------------------------------------------------------------*/

U8_Function_Arg3 (Week, macro_U16_arg1, macro_U8_arg2, macro_U8_arg3)

begin

#define Week_LOOP -20

asm_MOV_R1(4),//將百年、年、月、日的BCD碼換成二進制數

//Week_LOOP:

asm_MOV_A(0x4f),//DataBuffer偏移,程序長度

//分別取出macro_U16H_arg1,macro_U16L_arg1macro_U8_arg2, macro_U8_arg3

asm_MOVC_A_aDPTR(),

asm_MOV_R0_A(),

asm_MOV_A_iR0(),

asm_ANL_A(0x0f),

asm_XCH_A_iR0(),

asm_SWAP_A(),

asm_ANL_A(0x0f),

asm_MOV_B(10),

asm_MUL_AB(),

asm_ADD_A_iR0(),

asm_MOV_iR0_A(),

asm_INC_DPTR(),

asm_DJNZ_R1(Week_LOOP),//四次未完繼續

//(星期=百年%4*5+年+年/4+(13*月+8)/5+日)%7,特別注意1月2月的年為"去年"

asm_CJNE_Rn(macro_U8_arg2, 0x03, 0),//判斷月

asm_JNC(size_MOV_A_Rn() + size_ORL_A() + size_MOV_Rn_A() \\

+ size_DEC_Rn() + size_CJNE_Rn() + size_DEC_Rn()),//月

//月<=2

asm_MOV_A_Rn(macro_U8_arg2),

asm_ORL_A(0x04),//1月2月同5月六月表

asm_MOV_Rn_A(macro_U8_arg2),

asm_DEC_Rn(macro_U16L_arg1),//1月2月的年為"去年"

asm_CJNE_Rn(macro_U16L_arg1, 0xff, size_DEC_Rn()),//Week_Start

asm_DEC_Rn(macro_U16H_arg1),

//Week_Start:

//百年%4*5

asm_MOV_A_Rn(macro_U16H_arg1),//百年

asm_ANL_A(0x03),

asm_MOV_Rn_A(macro_U16H_arg1),//百年%4

asm_CLR_C(),

asm_RLC_A(),

asm_CLR_C(),

asm_RLC_A(),//百年%4*4

asm_ORL_A_Rn(macro_U16H_arg1),//百年%4*5

asm_MOV_Rn_A(macro_U16H_arg1),//保存(百年%4*5),最大值3*5=15

//年+年/4

asm_MOV_A_Rn(macro_U16L_arg1),//年

asm_CLR_C(),

asm_RRC_A(),

asm_CLR_C(),

asm_RRC_A(),

asm_ADD_A_Rn(macro_U16L_arg1),//年+年/4

asm_MOV_Rn_A(macro_U16L_arg1),//保存(年+年/4),最大值99+25=124

asm_MOV_A_Rn(macro_U8_arg2),//月

asm_MOV_B(13),

asm_MUL_AB(),//13*月->A

asm_MOV_B(8),

asm_ADD_A_B(),//13*月+8

asm_MOV_B(5),

asm_DIV_AB(),//(13*月+8)/5 商->A

asm_MOV_Rn_A(macro_U8_arg2),//保存((13*月+8)/5)最大值33

//日

asm_ADD_A_Rn(macro_U8_arg3),//日,最大值31

asm_ADDC_A_Rn(macro_U16H_arg1),//(百年%4*5),最大值15

asm_ADDC_A_Rn(macro_U16L_arg1),//(年+年/4),最大值99+25=124

/*

此時ACC最大為15+124+33+31=203,

注意,蔡勒公式內無203.-2*C可能會越界,菜農給出的蔡勒公式完整表述:

W = (203+C/4-2*C+Y+Y/4+(13*M+8)/5+D)%7

菜農星期公式:

W = ( C%4*5+Y+Y/4+(13*M+8)/5+D)%7

*/

asm_MOV_B(7),//取餘數%7

asm_DIV_AB(),

asm_XCH_A_B(),

U8_return_A(),//送返回值(星期)

//數據區DataBuffer

asm_DB(macro_U16H_arg1),

asm_DB(macro_U16L_arg1),

asm_DB(macro_U8_arg2),

asm_DB(macro_U8_arg3)

end;


分享到:


相關文章: