📄 spline.lis
字号:
.module spline.c
.area text(rom, con, rel)
0000 .dbfile G:\IccPro\mega128_lcd\ZLG_GUI\spline.c
0000 .dbfunc e max _max fI
0000 ; b -> R18,R19
0000 ; a -> R16,R17
.even
0000 _max::
0000 .dbline -1
0000 .dbline 19
0000 ; /****************************************************************************************
0000 ; * 文件名:SPLINE.C
0000 ; * 功能:二次参数样条曲线生成程序。
0000 ; * 作者:黄绍斌
0000 ; * 日期:2003.09.09
0000 ; ****************************************************************************************/
0000 ; #include "config.h"
0000 ; #include "math.h"
0000 ;
0000 ;
0000 ; /****************************************************************************
0000 ; * 名称:max()
0000 ; * 功能:求两个整数中最大的整数值。
0000 ; * 入口参数:a 整数1
0000 ; * b 整数2
0000 ; * 出口参数:返回最大的整数值
0000 ; ****************************************************************************/
0000 ; int max(int a, int b)
0000 ; { if(a>b) return(a);
0000 .dbline 19
0000 2017 cp R18,R16
0002 3107 cpc R19,R17
0004 0CF4 brge L8
0006 .dbline 19
0006 01C0 xjmp L7
0008 L8:
0008 .dbline 20
0008 ; else return(b);
0008 8901 movw R16,R18
000A .dbline -2
000A L7:
000A .dbline 0 ; func end
000A 0895 ret
000C .dbsym r b 18 I
000C .dbsym r a 16 I
000C .dbend
000C .dbfunc e abs _abs fI
000C ; a -> R16,R17
.even
000C _abs::
000C .dbline -1
000C .dbline 30
000C ; }
000C ;
000C ; /****************************************************************************
000C ; * 名称:abs()
000C ; * 功能:求一个整数的绝对值。
000C ; * 入口参数:a 取绝对值的数据
000C ; * 出口参数:返回a的绝对值
000C ; ****************************************************************************/
000C ; int abs(int a)
000C ; { if(a>0) return(a);
000C .dbline 30
000C 2224 clr R2
000E 3324 clr R3
0010 2016 cp R2,R16
0012 3106 cpc R3,R17
0014 0CF4 brge L11
0016 .dbline 30
0016 04C0 xjmp L10
0018 L11:
0018 .dbline 31
0018 ; else return(-a);
0018 0095 com R16
001A 1095 com R17
001C 0F5F subi R16,0xFF
001E 1F4F sbci R17,0xFF
0020 .dbline -2
0020 L10:
0020 .dbline 0 ; func end
0020 0895 ret
0022 .dbsym r a 16 I
0022 .dbend
0022 .dbfunc e CURVE_SetCurve _CURVE_SetCurve fV
0022 ; cy -> y+22
0022 ; cx -> y+18
0022 ; by -> y+14
0022 ; bx -> y+10
0022 ; ay -> y+6
0022 ; ax -> y+2
0022 ; cl -> R20,R21
.even
0022 _CURVE_SetCurve::
0022 3A93 st -y,r19
0024 2A93 st -y,r18
0026 0E940000 xcall push_gset1
002A A801 movw R20,R16
002C .dbline -1
002C .dbline 63
002C ; }
002C ;
002C ;
002C ;
002C ; /* 曲线类变量及相关函数 */
002C ; typedef struct
002C ; { float Ax, Ay; // 定义A、B、C点坐标变量
002C ; float Bx, By;
002C ; float Cx, Cy;
002C ;
002C ; int Ndiv; // 定义曲线平滑参数变量
002C ; } CURVE;
002C ;
002C ; #define DIV_FACTOR 8.0 /* 平滑控制参数 */
002C ; /****************************************************************************
002C ; * 名称:CURVE_SetCurve()
002C ; * 功能:设置三点曲线参数。
002C ; * 入口参数: cl 要操作的曲线对象,CURVE结构
002C ; * ax a点x坐标值
002C ; * ay a点y坐标值
002C ; * bx b点x坐标值
002C ; * by b点y坐标值
002C ; * cx c点x坐标值
002C ; * cy c点y坐标值
002C ; * 出口参数:无
002C ; * 说明:
002C ; ****************************************************************************/
002C ; void CURVE_SetCurve(CURVE *cl,
002C ; float ax, float ay,
002C ; float bx, float by,
002C ; float cx, float cy)
002C ; { cl->Ax = ax;
002C .dbline 63
002C FE01 movw R30,R28
002E 2280 ldd R2,z+2
0030 3380 ldd R3,z+3
0032 4480 ldd R4,z+4
0034 5580 ldd R5,z+5
0036 FA01 movw R30,R20
0038 2082 std z+0,R2
003A 3182 std z+1,R3
003C 4282 std z+2,R4
003E 5382 std z+3,R5
0040 .dbline 64
0040 ; cl->Ay = ay;
0040 FE01 movw R30,R28
0042 2680 ldd R2,z+6
0044 3780 ldd R3,z+7
0046 4084 ldd R4,z+8
0048 5184 ldd R5,z+9
004A FA01 movw R30,R20
004C 2482 std z+4,R2
004E 3582 std z+5,R3
0050 4682 std z+6,R4
0052 5782 std z+7,R5
0054 .dbline 65
0054 ; cl->Bx = bx;
0054 FE01 movw R30,R28
0056 2284 ldd R2,z+10
0058 3384 ldd R3,z+11
005A 4484 ldd R4,z+12
005C 5584 ldd R5,z+13
005E FA01 movw R30,R20
0060 2086 std z+8,R2
0062 3186 std z+9,R3
0064 4286 std z+10,R4
0066 5386 std z+11,R5
0068 .dbline 66
0068 ; cl->By = by;
0068 FE01 movw R30,R28
006A 2684 ldd R2,z+14
006C 3784 ldd R3,z+15
006E 4088 ldd R4,z+16
0070 5188 ldd R5,z+17
0072 FA01 movw R30,R20
0074 2486 std z+12,R2
0076 3586 std z+13,R3
0078 4686 std z+14,R4
007A 5786 std z+15,R5
007C .dbline 67
007C ; cl->Cx = cx;
007C FE01 movw R30,R28
007E 2288 ldd R2,z+18
0080 3388 ldd R3,z+19
0082 4488 ldd R4,z+20
0084 5588 ldd R5,z+21
0086 FA01 movw R30,R20
0088 208A std z+16,R2
008A 318A std z+17,R3
008C 428A std z+18,R4
008E 538A std z+19,R5
0090 .dbline 68
0090 ; cl->Cy = cy;
0090 FE01 movw R30,R28
0092 2688 ldd R2,z+22
0094 3788 ldd R3,z+23
0096 408C ldd R4,z+24
0098 518C ldd R5,z+25
009A FA01 movw R30,R20
009C 248A std z+20,R2
009E 358A std z+21,R3
00A0 468A std z+22,R4
00A2 578A std z+23,R5
00A4 .dbline 70
00A4 ;
00A4 ; cl->Ndiv = (int)(max( abs((int)ax), abs((int)ay) ) / DIV_FACTOR);
00A4 FE01 movw R30,R28
00A6 0281 ldd R16,z+2
00A8 1381 ldd R17,z+3
00AA 2481 ldd R18,z+4
00AC 3581 ldd R19,z+5
00AE 0E940000 xcall fp2int
00B2 ACDF xcall _abs
00B4 1801 movw R2,R16
00B6 FE01 movw R30,R28
00B8 0681 ldd R16,z+6
00BA 1781 ldd R17,z+7
00BC 2085 ldd R18,z+8
00BE 3185 ldd R19,z+9
00C0 0E940000 xcall fp2int
00C4 2F92 push R2
00C6 3F92 push R3
00C8 A1DF xcall _abs
00CA 3F90 pop R3
00CC 2F90 pop R2
00CE 9801 movw R18,R16
00D0 8101 movw R16,R2
00D2 96DF xcall _max
00D4 0E940000 xcall int2fp
00D8 3A93 st -y,R19
00DA 2A93 st -y,R18
00DC 1A93 st -y,R17
00DE 0A93 st -y,R16
00E0 00E0 ldi R16,<L15
00E2 10E0 ldi R17,>L15
00E4 0E940000 xcall lpm32
00E8 3A93 st -y,R19
00EA 2A93 st -y,R18
00EC 1A93 st -y,R17
00EE 0A93 st -y,R16
00F0 0E940000 xcall div32f
00F4 0E940000 xcall fp2int
00F8 FA01 movw R30,R20
00FA 118F std z+25,R17
00FC 008F std z+24,R16
00FE .dbline -2
00FE L14:
00FE 0E940000 xcall pop_gset1
0102 2296 adiw R28,2
0104 .dbline 0 ; func end
0104 0895 ret
0106 .dbsym l cy 22 D
0106 .dbsym l cx 18 D
0106 .dbsym l by 14 D
0106 .dbsym l bx 10 D
0106 .dbsym l ay 6 D
0106 .dbsym l ax 2 D
0106 .dbsym r cl 20 pX
0106 .dbend
0106 .dbfunc e CURVE_GetCount _CURVE_GetCount fI
0106 ; cl -> R16,R17
.even
0106 _CURVE_GetCount::
0106 .dbline -1
0106 .dbline 82
0106 ; }
0106 ;
0106 ;
0106 ; /****************************************************************************
0106 ; * 名称:CURVE_GetCount()
0106 ; * 功能:取出平滑参数Ndiv+1的值。
0106 ; * 入口参数:cl 要操作的曲线对象,CURVE结构
0106 ; * 出口参数:返回Ndiv+1的值
0106 ; * 说明:若Ndiv为0,则先设置其为1。
0106 ; ****************************************************************************/
0106 ; int CURVE_GetCount(CURVE *cl)
0106 ; { if(0 == cl->Ndiv) cl->Ndiv=1;
0106 .dbline 82
0106 F801 movw R30,R16
0108 208C ldd R2,z+24
010A 318C ldd R3,z+25
010C 2220 tst R2
010E 39F4 brne L17
0110 3320 tst R3
0112 29F4 brne L17
0114 X0:
0114 .dbline 82
0114 81E0 ldi R24,1
0116 90E0 ldi R25,0
0118 F801 movw R30,R16
011A 918F std z+25,R25
011C 808F std z+24,R24
011E L17:
011E .dbline 84
011E ;
011E ; return(cl->Ndiv+1);
011E F801 movw R30,R16
0120 008D ldd R16,z+24
0122 118D ldd R17,z+25
0124 0F5F subi R16,255 ; offset = 1
0126 1F4F sbci R17,255
0128 .dbline -2
0128 L16:
0128 .dbline 0 ; func end
0128 0895 ret
012A .dbsym r cl 16 pX
012A .dbend
012A .dbfunc e CURVE_GetCurve _CURVE_GetCurve fV
012A ; Y -> R10,R11
012A ; X -> R12,R13
012A ; h -> y+12
012A ; g -> y+8
012A ; f -> y+4
012A ; i -> R14,R15
012A ; t -> y+0
012A ; PointCount -> R20,R21
012A ; points -> R22,R23
012A ; y -> y+34
012A ; x -> y+30
012A ; cl -> R6,R7
.even
012A _CURVE_GetCurve::
012A 3A93 st -y,r19
012C 2A93 st -y,r18
012E 0E940000 xcall push_gset5
0132 3801 movw R6,R16
0134 6497 sbiw R28,20
0136 6EA1 ldd R22,y+38
0138 7FA1 ldd R23,y+39
013A 48A5 ldd R20,y+40
013C 59A5 ldd R21,y+41
013E .dbline -1
013E .dbline 100
013E ; }
013E ;
013E ;
013E ; /****************************************************************************
013E ; * 名称:CURVE_GetCurve()
013E ; * 功能:增加曲线点到points。
013E ; * 入口参数:cl 要操作的曲线对象,CURVE结构
013E ; * x 新增点的x坐标值
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -