📄 spline.s
字号:
add R30,R24
adc R31,R25
ldd R6,z+0
ldd R7,z+1
ldd R8,z+2
ldd R9,z+3
st -y,R9
st -y,R8
st -y,R7
st -y,R6
movw R24,R28
; stack offset 12
adiw R24,8
movw R30,R2
add R30,R24
adc R31,R25
ldd R6,z+0
ldd R7,z+1
ldd R8,z+2
ldd R9,z+3
st -y,R9
st -y,R8
st -y,R7
st -y,R6
xcall empy32fs
movw R30,R2
add R30,R4
adc R31,R5
ldd R4,z+0
ldd R5,z+1
ldd R6,z+2
ldd R7,z+3
st -y,R7
st -y,R6
st -y,R5
st -y,R4
xcall empy32fs
xcall add32fs
xcall empy32f
movw R24,R12
subi R24,56 ; offset = 200
sbci R25,255
movw R30,R2
add R30,R24
adc R31,R25
std z+0,R16
std z+1,R17
std z+2,R18
std z+3,R19
.dbline 236
L81:
.dbline 233
movw R24,R10
adiw R24,1
movw R10,R24
L83:
.dbline 233
movw R30,R12
subi R30,72 ; addi 440
sbci R31,254
ldd R24,z+0
ldd R25,z+1
sbiw R24,2
cp R24,R10
cpc R25,R11
brlt X11
xjmp L80
X11:
.dbline 237
; { sl->Bx[i] = 3.0f*(sl->Ax[i-1] + k[i-1] * k[i-1] * sl->Ax[i]);
; sl->By[i] = 3.0f*(sl->Ay[i-1] + k[i-1] * k[i-1] * sl->Ay[i]);
; }
; sl->Bx[0] = 3.0f * sl->Ax[0];
ldi R16,<L27
ldi R17,>L27
xcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
movw R30,R12
subi R30,176 ; addi 80
sbci R31,255
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
st -y,R5
st -y,R4
st -y,R3
st -y,R2
xcall empy32f
movw R30,R12
subi R30,96 ; addi 160
sbci R31,255
std z+0,R16
std z+1,R17
std z+2,R18
std z+3,R19
.dbline 238
; sl->By[0] = 3.0f * sl->Ay[0];
ldi R16,<L27
ldi R17,>L27
xcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
movw R30,R12
subi R30,136 ; addi 120
sbci R31,255
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
st -y,R5
st -y,R4
st -y,R3
st -y,R2
xcall empy32f
movw R30,R12
subi R30,56 ; addi 200
sbci R31,255
std z+0,R16
std z+1,R17
std z+2,R18
std z+3,R19
.dbline 239
; sl->Bx[sl->Np-1] = 3.0f * sl->Ax[sl->Np-2];
movw R30,R12
subi R30,72 ; addi 440
sbci R31,254
ldd R18,z+0
ldd R19,z+1
ldi R16,4
ldi R17,0
xcall empy16s
movw R2,R16
ldi R16,<L27
ldi R17,>L27
xcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
movw R24,R12
subi R24,176 ; offset = 80
sbci R25,255
movw R30,R2
sbiw R30,8
add R30,R24
adc R31,R25
ldd R4,z+0
ldd R5,z+1
ldd R6,z+2
ldd R7,z+3
st -y,R7
st -y,R6
st -y,R5
st -y,R4
xcall empy32f
movw R24,R12
subi R24,96 ; offset = 160
sbci R25,255
movw R30,R2
sbiw R30,4
add R30,R24
adc R31,R25
std z+0,R16
std z+1,R17
std z+2,R18
std z+3,R19
.dbline 240
; sl->By[sl->Np-1] = 3.0f * sl->Ay[sl->Np-2];
movw R30,R12
subi R30,72 ; addi 440
sbci R31,254
ldd R18,z+0
ldd R19,z+1
ldi R16,4
ldi R17,0
xcall empy16s
movw R2,R16
ldi R16,<L27
ldi R17,>L27
xcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
movw R24,R12
subi R24,136 ; offset = 120
sbci R25,255
movw R30,R2
sbiw R30,8
add R30,R24
adc R31,R25
ldd R4,z+0
ldd R5,z+1
ldd R6,z+2
ldd R7,z+3
st -y,R7
st -y,R6
st -y,R5
st -y,R4
xcall empy32f
movw R24,R12
subi R24,56 ; offset = 200
sbci R25,255
movw R30,R2
sbiw R30,4
add R30,R24
adc R31,R25
std z+0,R16
std z+1,R17
std z+2,R18
std z+3,R19
.dbline 242
;
; SPLINE_MatrixSolve(sl, sl->Bx);
movw R18,R12
subi R18,96 ; offset = 160
sbci R19,255
movw R16,R12
xcall _SPLINE_MatrixSolve
.dbline 243
; SPLINE_MatrixSolve(sl, sl->By);
movw R18,R12
subi R18,56 ; offset = 200
sbci R19,255
movw R16,R12
xcall _SPLINE_MatrixSolve
.dbline 245
;
; for(i=0 ; i<=sl->Np-2 ; i++ )
clr R10
clr R11
xjmp L91
L88:
.dbline 246
.dbline 246
ldi R16,4
ldi R17,0
movw R18,R10
xcall empy16s
movw R2,R16
movw R24,R28
movw R30,R2
add R30,R24
adc R31,R25
ldd R4,z+0
ldd R5,z+1
ldd R6,z+2
ldd R7,z+3
st -y,R7
st -y,R6
st -y,R5
st -y,R4
movw R24,R12
subi R24,92 ; offset = 164
sbci R25,255
movw R30,R2
add R30,R24
adc R31,R25
ldd R4,z+0
ldd R5,z+1
ldd R6,z+2
ldd R7,z+3
st -y,R7
st -y,R6
st -y,R5
st -y,R4
xcall empy32f
movw R24,R12
subi R24,16 ; offset = 240
sbci R25,255
movw R30,R2
add R30,R24
adc R31,R25
std z+0,R16
std z+1,R17
std z+2,R18
std z+3,R19
.dbline 247
ldi R16,4
ldi R17,0
movw R18,R10
xcall empy16s
movw R2,R16
movw R24,R28
movw R30,R2
add R30,R24
adc R31,R25
ldd R4,z+0
ldd R5,z+1
ldd R6,z+2
ldd R7,z+3
st -y,R7
st -y,R6
st -y,R5
st -y,R4
movw R24,R12
subi R24,52 ; offset = 204
sbci R25,255
movw R30,R2
add R30,R24
adc R31,R25
ldd R4,z+0
ldd R5,z+1
ldd R6,z+2
ldd R7,z+3
st -y,R7
st -y,R6
st -y,R5
st -y,R4
xcall empy32f
movw R24,R12
subi R24,232 ; offset = 280
sbci R25,254
movw R30,R2
add R30,R24
adc R31,R25
std z+0,R16
std z+1,R17
std z+2,R18
std z+3,R19
.dbline 248
L89:
.dbline 245
movw R24,R10
adiw R24,1
movw R10,R24
L91:
.dbline 245
movw R30,R12
subi R30,72 ; addi 440
sbci R31,254
ldd R24,z+0
ldd R25,z+1
sbiw R24,2
cp R24,R10
cpc R25,R11
brlt X12
xjmp L88
X12:
.dbline -2
L61:
adiw R28,63
adiw R28,1 ; offset = 64
xcall pop_gset4
.dbline 0 ; func end
ret
.dbsym l AMagOld 44 D
.dbsym l AMag 40 D
.dbsym l k 0 A[40:10]D
.dbsym r i 10 I
.dbsym r sl 12 pX
.dbend
.dbfunc e SPLINE_GetCurveCount _SPLINE_GetCurveCount fI
; count -> R20,R21
; curve_bak -> y+22
; i -> R22,R23
; sl -> R10,R11
.even
_SPLINE_GetCurveCount::
xcall push_gset3
movw R10,R16
sbiw R28,48
.dbline -1
.dbline 263
; { sl->Cx[i] = k[i] * sl->Bx[i+1];
; sl->Cy[i] = k[i] * sl->By[i+1];
; }
; }
;
;
;
;
;
; /****************************************************************************
; * 名称:SPLINE_GetCurveCount()
; * 功能:取得样条曲线上端点个数值。
; * 入口参数:sl 要操作的样条曲线对象,SPLINE结构
; * 出口参数:返回值即是样条曲线各个端点个数
; * 说明:sl要先使用SPLINE_SetSpline()设置各个特征点。
; ****************************************************************************/
; int SPLINE_GetCurveCount(SPLINE *sl)
; { CURVE curve_bak;
.dbline 264
; int count = 0;
clr R20
clr R21
.dbline 267
; int i;
;
; for(i=0; i<(sl->Np - 1); i++) // 历遍所有特征点
clr R22
clr R23
xjmp L96
L93:
.dbline 268
.dbline 269
ldi R16,4
ldi R17,0
movw R18,R22
xcall empy16s
movw R24,R10
subi R24,232 ; offset = 280
sbci R25,254
movw R30,R16
add R30,R24
adc R31,R25
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
std y+18,R2
std y+19,R3
std y+20,R4
std y+21,R5
movw R24,R10
subi R24,16 ; offset = 240
sbci R25,255
movw R30,R16
add R30,R24
adc R31,R25
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
std y+14,R2
std y+15,R3
std y+16,R4
std y+17,R5
movw R24,R10
subi R24,56 ; offset = 200
sbci R25,255
movw R30,R16
add R30,R24
adc R31,R25
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
std y+10,R2
std y+11,R3
std y+12,R4
std y+13,R5
movw R24,R10
subi R24,96 ; offset = 160
sbci R25,255
movw R30,R16
add R30,R24
adc R31,R25
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
std y+6,R2
std y+7,R3
std y+8,R4
std y+9,R5
movw R24,R10
subi R24,136 ; offset = 120
sbci R25,255
movw R30,R16
add R30,R24
adc R31,R25
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
std y+2,R2
std y+3,R3
std y+4,R4
std y+5,R5
movw R24,R10
subi R24,176 ; offset = 80
sbci R25,255
movw R30,R16
add R30,R24
adc R31,R25
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
std y+0,R4
std y+1,R5
movw R18,R2
movw R16,R28
subi R16,234 ; offset = 22
sbci R17,255
xcall _CURVE_SetCurve
.dbline 274
movw R16,R28
subi R16,234 ; offset = 22
sbci R17,255
xcall _CURVE_GetCount
add R20,R16
adc R21,R17
.dbline 275
L94:
.dbline 267
subi R22,255 ; offset = 1
sbci R23,255
L96:
.dbline 267
movw R30,R10
subi R30,72 ; addi 440
sbci R31,254
ldd R24,z+0
ldd R25,z+1
sbiw R24,1
cp R22,R24
cpc R23,R25
brge X13
xjmp L93
X13:
.dbline 277
; { /* 设置样条曲线(三点)curve_bak */
; CURVE_SetCurve(&curve_bak,
; sl->Ax[i], sl->Ay[i],
; sl->Bx[i], sl->By[i],
; sl->Cx[i], sl->Cy[i]);
; /* 取得曲线curve_bak上端点的个数 */
; count += CURVE_GetCount(&curve_bak);
; }
;
; return(count);
movw R16,R20
.dbline -2
L92:
adiw R28,48
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r count 20 I
.dbsym l curve_bak 22 X
.dbsym r i 22 I
.dbsym r sl 10 pX
.dbend
.dbfunc e SPLINE_GetCurve _SPLINE_GetCurve fV
; curve_bak -> y+22
; i -> R20,R21
; PointCount -> R22,R23
; points -> R10,R11
; sl -> R12,R13
.even
_SPLINE_GetCurve::
xcall push_gset4
movw R10,R18
movw R12,R16
sbiw R28,48
ldd R22,y+56
ldd R23,y+57
.dbline -1
.dbline 293
; }
;
;
;
; /****************************************************************************
; * 名称:SPLINE_GetCurve()
; * 功能:取出样条曲线上各个端点,以便于使用GUI_Line()函数画出曲线。
; * 入口参数:sl 要操作的样条曲线对象,SPLINE结构
; * points 用于接收曲线点的缓冲区,PointXY数组
; * PointCount 用于接收曲线点个数的指针
; * 出口参数:无
; * 说明:接收曲线点由points返回,曲线点个数由PointCount返回;
; * sl要先使用SPLINE_SetSpline()设置各个特征点。
; ****************************************************************************/
; void SPLINE_GetCurve(SPLINE *sl, PointXY points[], int *PointCount)
; { CURVE curve_bak;
.dbline 296
; int i;
;
; *PointCount = 0; // 初始化点计数器为0
clr R2
clr R3
movw R30,R22
std z+1,R3
std z+0,R2
.dbline 297
; for(i=0; i<(sl->Np-1); i++) // 历遍所有特征点
clr R20
clr R21
xjmp L101
L98:
.dbline 298
.dbline 299
ldi R16,4
ldi R17,0
movw R18,R20
xcall empy16s
movw R24,R12
subi R24,232 ; offset = 280
sbci R25,254
movw R30,R16
add R30,R24
adc R31,R25
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
std y+18,R2
std y+19,R3
std y+20,R4
std y+21,R5
movw R24,R12
subi R24,16 ; offset = 240
sbci R25,255
movw R30,R16
add R30,R24
adc R31,R25
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
std y+14,R2
std y+15,R3
std y+16,R4
std y+17,R5
movw R24,R12
subi R24,56 ; offset = 200
sbci R25,255
movw R30,R16
add R30,R24
adc R31,R25
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
std y+10,R2
std y+11,R3
std y+12,R4
std y+13,R5
movw R24,R12
subi R24,96 ; offset = 160
sbci R25,255
movw R30,R16
add R30,R24
adc R31,R25
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
std y+6,R2
std y+7,R3
std y+8,R4
std y+9,R5
movw R24,R12
subi R24,136 ; offset = 120
sbci R25,255
movw R30,R16
add R30,R24
adc R31,R25
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
std y+2,R2
std y+3,R3
std y+4,R4
std y+5,R5
movw R24,R12
subi R24,176 ; offset = 80
sbci R25,255
movw R30,R16
add R30,R24
adc R31,R25
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
std y+0,R4
std y+1,R5
movw R18,R2
movw R16,R28
subi R16,234 ; offset = 22
sbci R17,255
xcall _CURVE_SetCurve
.dbline 305
std y+9,R23
std y+8,R22
std y+7,R11
std y+6,R10
ldi R16,4
ldi R17,0
movw R18,R20
xcall empy16s
movw R24,R12
adiw R24,40
movw R30,R16
add R30,R24
adc R31,R25
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
std y+2,R2
std y+3,R3
std y+4,R4
std y+5,R5
movw R30,R16
add R30,R12
adc R31,R13
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
std y+0,R4
std y+1,R5
movw R18,R2
movw R16,R28
subi R16,234 ; offset = 22
sbci R17,255
xcall _CURVE_GetCurve
.dbline 309
L99:
.dbline 297
subi R20,255 ; offset = 1
sbci R21,255
L101:
.dbline 297
movw R30,R12
subi R30,72 ; addi 440
sbci R31,254
ldd R24,z+0
ldd R25,z+1
sbiw R24,1
cp R20,R24
cpc R21,R25
brge X14
xjmp L98
X14:
.dbline -2
L97:
adiw R28,48
xcall pop_gset4
.dbline 0 ; func end
ret
.dbsym l curve_bak 22 X
.dbsym r i 20 I
.dbsym r PointCount 22 pI
.dbsym r points 10 pX
.dbsym r sl 12 pX
.dbend
.dbfunc e GUI_Spline _GUI_Spline fV
; sl_points -> y+444
; sl -> y+2
; color -> y+768
; no -> y+766
; points -> R20,R21
.even
_GUI_Spline::
st -y,r19
st -y,r18
xcall push_gset1
movw R20,R16
sbiw R28,63
sbiw R28,63
sbiw R28,63
sbiw R28,63
sbiw R28,63
sbiw R28,63
sbiw R28,63
sbiw R28,63
sbiw R28,63
sbiw R28,63
sbiw R28,63
sbiw R28,63
sbiw R28,8 ; offset = 764
.dbline -1
.dbline 321
; { /* 设置样条曲线(三点)curve_bak */
; CURVE_SetCurve(&curve_bak,
; sl->Ax[i], sl->Ay[i],
; sl->Bx[i], sl->By[i],
; sl->Cx[i], sl->Cy[i]);
;
; /* 取得样条曲线curve_bak的端点数据及个数 */
; CURVE_GetCurve(&curve_bak,
; sl->Px[i], sl->Py[i],
; points,
; PointCount);
; }
; }
;
;
; /****************************************************************************
; * 名称:GUI_Spline()
; * 功能:作出多个特征点(3个以上)样条曲线。
; * 入口参数
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -