1、;真正的万年历: 84 bytes 的 51 ASM;=SUB_WNL= 万年历 =* Deng Miao * 2004-06-01 * GuangZhou *SJ DATA 30H ; 世纪 BCD 00 TO 99 NH DATA 31H ; 年号 BCD 00 TO 99 0000 TO 9999 年YF DATA 32H ; 月份 BCD 01 TO 12org 000hMOV SP, #40HMOV SJ, #21H ;2004-05MOV NH, #01HMOV YF, #4H ACALL SUB_WNLSJMP $ ;=SUB_WNL=; 入口:; SJ DATA 30H ; 世
2、纪 BCD 00 TO 99 ; NH DATA 31H ; 年号 BCD 00 TO 99 0000 TO 9999 年; YF DATA 32H ; 月份 BCD 01 TO 12; 出口; ACC - 本月天数 BCD 28 to 31; B - 本月 1 日的星期数 1 to 6 = 星期 1 to 星期 6; 0 - 星期日; 使用 : ACC, B, R5, R6 ; STACK: 3 bytes (不包括调用)ORG 50HSUB_WNL:PUSH PSWMOV A, SJ ACALL BCD2BIN_MOD4 ; x 400 年 : (大周期) ; =146097 天 = 7
3、* 20871 + 0 天; x 100 年 : ; 000 年 = 7 * 0 + 0 + 1 - 1 1 = 0 * 2 + 1 *; 100 年 = 7 * 5217 + 7 + 1 - 2 2 = 1 * 2 ; 200 年 = 7 * 10435 + 7 + 1 - 4 4 = 2 * 2 ; 300 年 = 7 * 15653 + 7 + 1 - 6 6 = 3 * 2 ; 1,2,4,6 MOV A, R6 ; A=R6= SJ_BIN MOD 4RLC A ; A=A*2+C A = 1,2,4,6 *XRL A, #10000111B ; A = 87H - A ; 边界调整
4、MOV R5, A ; A = 86H, 85H, 83H, 81H ; R5: 星期 MOV A, NH JZ WNL_1ACALL BCD2BIN_MOD4XCH A, R5 SUBB A, R5 ; 0 年 ; 0 = 0 + 0 + 1 + (-1) *MOV R5, AWNL_1:MOV A, YFADD A, #(WNL_TAB-$-4)MOVC A, A+PCMOV R6, ASWAP AACALL WNL_F0; 大年对=3 月调整准备ADDC A, R5 ; 月调整MOV B, #7DIV AB ; B = A MOD 7MOV A, R6ACALL WNL_F0; 大年调整
5、准备ADDC A, #28POP PSWRETWNL_TAB:DB 3*2 + 5 * 32+0 ;1 BIT 0 : “2 月“ 标志DB 0*2+1+1 * 32+0 ;2 * BIT 12: 月大小DB 3*2 + 1 * 32+16 ;3 00:28 天 DB 2*2 + 4 * 32+16 ;4 01:- DB 3*2 + 6 * 32+16 ;5 10: 30 天 DB 2*2 + 2 * 32+16 ;6 11: 31 天DB 3*2 + 4 * 32+16 ;7 BIT 3: 0 - DB 3*2 + 7 * 32+16 ;8 BIT 4: 0: 1/2 月 DB 2*2 +
6、3 * 32+16 ;9 1: =3 月 WNL_F0: ; 6 BYTES ; 大年调整准备RRC A ;0AH ANL A, #07H ;0BH;0CH ANL C, F0 ;0DH;0EHRET ;0FHDB 3*2 + 5 * 32+16 ;10H BIT 57: 星期调整数 DB 2*2 + 1 * 32+16 ;11H 0:- DB 3*2 + 3 * 32+16 ;12H 1-7: 调整数 BCD2BIN_MOD4:; 功能: A. 1 BYTES BCD TO BIN; B. MOD 4; C. MUL 2 ; 入口:; A : SJ OR NH ; F0 : 大世纪; 出口;
7、 ACC - (BIN(A) 4) * 2 - (BIN(A) MOD 4) - F0; R6 - BIN(A) MOD 4; C - IIF( (BIN(A) MOD 4)=0, 1, 0 ); 使用 : ACC, B, R6, PSW ; STACK: 0 bytes (不包括调用)MOV R6, A ; BCD = BIN ANL A, #0F0H ; 16X+Y = 10X+Y SWAP AMOV B, #(256-6) ; (256-6)*X + (16X+Y) MUL AB ;ADD A, R6 ; = 256X + (10X+Y) MOV R6, A ; MOD4 ANL A,
8、#3XCH A, R6 ; R6 = BIN MOD 4 = 0,1,2,3; X 4 年:3 * 365 + 366 = 7*209 + (-2) *XRL A, R6 ; A = (BIN 4)RR A ; A = (BIN 4 ) * 2 *MOV C, F0 ; 大世纪调整SUBB A, R6 ;X 1 年: ;0 年 0 = 0 + 0 + 1 + (-1) * ;1 年 366 = 7*52 + 1 + 1;2 年 366 + 365 = 7*104 + 2 + 1;3 年 366 + 365 + 365 = 7*156+3 + 1; -1,1,2,3 CJNE R6, #1, $ + 3 ; C = IIF(R6=1, 0, 1)MOV F0, C ; C=1 为大年/大世纪 RET ;- END ;= END OF FILE