- 打卡等级:以坛为家I
- 打卡总天数:312
- 最近打卡:2025-03-11 13:20:13
荣誉版主
- 积分
- 5395
|
发表于 2023-2-12 15:05:24
|
显示全部楼层
本帖最后由 LAOXU 于 2023-2-12 15:07 编辑
至于 MDU32库, 除了64位定点整数运算及数制转换, 还顺带加了 int_to_bcd, long_to_bcd, bcd_to_int, bcd_to_long.
请同学们帮忙看一下, 基本的库程序功能, 还有什么可以加入
/*--------------------------------------------------------------------------
DLONG.H
Prototypes for mathematic functions for C251 Version 4.
Copyright (c) 1995-2004 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
--------------------------------------------------------------------------*/
#pragma SAVE
#pragma PARM251
// 双长字整数(64位),使用说明:
// 数据格式, 双长字HEX码: 分无符号整型数(原码)和有符号整型数(补码); 双长字BCD码: 无符号整型数(原码)
// 三长字BCD码: 分无符号整型数(原码)和有符号整型数(原码+最高位为符号位)
// 双长字整型数,分无符号整型数和有符号整型, 存储格式: 高位长字在先, 低位长字在后
// 双长字型BCD码无符号整型数, 存储格式: 高位长字在先, 低位长字在后
// 三长字BCD码整型数, 带有符号位(原码), 存储格式: 高位长字在先, 中位长字在后, 最后是扩展的最高位长字(符号位在最高Bit)
// 四长字商和余数(指针先指向商,后紧跟余数), 存储格式: 商:高位长字在先, 低位长字在后, 后面紧跟余数:高位长字在先, 低位长字在后
extern void add64 (long aH, long aL, long bH, long bL, long far *cp);
extern void sub64 (long aH, long aL, long bH, long bL, long far *cp);
extern void mul64 (long aH, long aL, long bH, long bL, long far *cp);
// c=1,返回商; c=2,返回余数; c=3,返回商 和 余数(指针先指向商,后紧跟余数);
extern void sdiv64 (long aH, long aL, long bH, long bL, char c, long far *cp);
// c=1,返回商; c=2,返回余数; c=3,返回商 和 余数(指针先指向商,后紧跟余数); c=0,堆栈返回商 和 余数(汇编专用);
extern void udiv64 (unsigned long aH, unsigned long aL, unsigned long bH, unsigned long bL, char c, long far *cp);
// c=0,输出双长整型BCD; c=1,输出三长整型无符号BCD; c=2,输出三长整型有符号BCD;
// c=3,输出三长整型有符号BCD(最高长字为补码,仅供调试时,显示监控变量);
extern void hex_bcd64 (unsigned long aH, unsigned long aL, char c, long far *cp);
extern void bcd_hex64 (unsigned long aH, unsigned long aL, long far *cp); // 双长字无符号整型数(BCD),转双长字整型数(HEX)
extern void AtoL64 (char far *s, long far *cp);
// c=0,输入HEX; c=1,输入双长整型BCD; c=2,输入三长整型BCD;
extern void uLtoA64 (unsigned long aH, unsigned long aL, char c, long far *cp); // 指针返回BCD的 ASCII码串
// c=0,输入HEX; c=1,输入双长整型BCD; c=2,输入三长整型BCD;
extern void sLtoA64 (unsigned long aH, unsigned long aL, char c, long far *cp); // 指针返回BCD的 ASCII码串
// c=1,返回补码; c=0,不返回(汇编专用);
extern void neg64 (unsigned long aH, unsigned long aL, char c, long far *cp);
extern unsigned int int_bcd16 (unsigned int a, unsigned char b); // 溢出位存ACC,可紧跟一条指令读出最高位ACC(例如: Ca=ACC;)
extern unsigned long long_bcd32 (unsigned long a, unsigned char b); // 溢出位存ACC,可紧跟一条指令读出最高位ACC(例如: Ca=ACC;)
extern unsigned int bcd_int16 (unsigned int a);
extern unsigned long bcd_long32 (unsigned long a);
#define LADD64(a,b,c) do{ add64 (a##.##h, a##.##l, b##.##h, b##.##l, (long far *)&##c##.##h); }while(0) // 返回和
#define LSUB64(a,b,c) do{ sub64 (a##.##h, a##.##l, b##.##h, b##.##l, (long far *)&##c##.##h); }while(0) // 返回差
#define LMUL64(a,b,c) do{ mul64 (a##.##h, a##.##l, b##.##h, b##.##l, (long far *)&##c##.##h); }while(0) // 返回积
#define ULDIV64(a,b,c) do{ udiv64 (a##.##h, a##.##l, b##.##h, b##.##l, 1, (long far *)&##c##.##h); }while(0) // 返回商 和 余数(指针先指向商,后紧跟余数);
#define SLDIV64(a,b,c) do{ sdiv64 (a##.##h, a##.##l, b##.##h, b##.##l, 1, (long far *)&##c##.##h); }while(0) // 返回商 和 余数(有符号数);
#define SLMOD64(a,b,c) do{ sdiv64 (a##.##h, a##.##l, b##.##h, b##.##l, 2, (long far *)&##c##.##h); }while(0) // 返回商 和 余数(指针先指向商,后紧跟余数);
#define ULMOD64(a,b,c) do{ udiv64 (a##.##h, a##.##l, b##.##h, b##.##l, 2, (long far *)&##c##.##h); }while(0) // 返回商 和 余数(指针先指向商,后紧跟余数);
#define SLDIVm64(a,b,c) do{ sdiv64 (a##.##h, a##.##l, b##.##h, b##.##l, 3, (long far *)&##c##.##h); }while(0) // 返回商 和 余数(指针先指向商,后紧跟余数);
#define ULDIVm64(a,b,c) do{ udiv64 (a##.##h, a##.##l, b##.##h, b##.##l, 3, (long far *)&##c##.##h); }while(0) // 返回商 和 余数(指针先指向商,后紧跟余数);
#define HEXtoBCD64(a,c) do{ hex_bcd64 (a##.##h, a##.##l, 0, (long far *)&##c##.##h); }while(0) // 返回双长字无符号整型数(BCD)
#define UHEXtoBCD64H(a,c) do{ hex_bcd64 (a##.##h, a##.##l, 1, (long far *)&##c##.##h); }while(0) // 返回三长字无符号整型数(BCD);
#define SHEXtoBCD64H(a,c) do{ hex_bcd64 (a##.##h, a##.##l, 2, (long far *)&##c##.##h); }while(0) // 返回三长字有符号整型数(BCD);
#define WATCHtoUBCD64H(a,c) UHEXtoBCD64H(a,c) // 返回三长字无符号整型数(BCD,最高长字为原码,可供调试时,显示监控变量);
#define WATCHtoSBCD64H(a,c) do{ hex_bcd64 (a##.##h, a##.##l, 3, (long far *)&##c##.##h); }while(0) // 返回三长字有符号整型数(BCD,最高长字为补码,仅供调试时,显示监控变量);
#define BCDtoHEX64(a,c) do{ bcd_hex64 (a##.##h, a##.##l, 0, (long far *)&##c##.##h); }while(0) // 双长字整型数(BCD),转双长字整型数(HEX)
#define BCDHtoHEX64(a,c) do{ bcd_hex64 (a##.##h, a##.##l, 1, (long far *)&##c##.##h); }while(0) // 三长字整型数(BCD),转双长字整型数(HEX)
#define ASCIItoL64(a,c) do{ AtoL64 ((char far *)a, (long far *)&##c##.##h); }while(0) // ASCII码(BCD),转双长字整型数(HEX)
#define UL64toASCII(a,c) do{ AtoL64 ((char far *)a, 0, (long far *)&##c##.##h); }while(0) // 双长字无符号整型数(HEX),转ASCII码(BCD)
#define SL64toASCII(a,c) do{ AtoL64 ((char far *)a, 1, (long far *)&##c##.##h); }while(0) // 双长字有符号整型数(HEX),转ASCII码(BCD)
#define LNEG64(a,c) do{ neg64 (a##.##h, a##.##l, 1, (long far *)&##c##.##h); }while(0) // 双长字有符号整型数(HEX),求补码
#define UINTtoBCD16(a) do{ int_bcd16 (a, 0); }while(0) // 无符号整型数(HEX),转BCD码,溢出位存ACC,可紧跟一条指令读出最高位ACC(例如: Ca=ACC;)
#define SINTtoBCD16(a) do{ int_bcd16 (a, 1); }while(0) // 有符号整型数(HEX),转BCD码,溢出位存ACC,可紧跟一条指令读出最高位ACC(例如: Ca=ACC;)
#define ULONGtoBCD32(a) do{ int_bcd32 (a, 0); }while(0) // 无符号长整型数(HEX),转BCD码,溢出位存ACC,可紧跟一条指令读出最高位ACC(例如: Ca=ACC;)
#define SLONGtoBCD32(a) do{ int_bcd32 (a, 1); }while(0) // 有符号长整型数(HEX),转BCD码,溢出位存ACC,可紧跟一条指令读出最高位ACC(例如: Ca=ACC;)
#pragma RESTORE
|
|