📄 spline.s
字号:
ldd R24,z+0
ldd R25,z+1
adiw R24,1
std z+1,R25
std z+0,R24
.dbline 126
L23:
.dbline 114
movw R24,R14
adiw R24,1
movw R14,R24
L25:
.dbline 114
movw R30,R6
ldd R2,z+24
ldd R3,z+25
cp R2,R14
cpc R3,R15
brlt X2
xjmp L22
X2:
.dbline -2
L19:
adiw R28,20
xcall pop_gset5
adiw R28,2
.dbline 0 ; func end
ret
.dbsym r Y 10 I
.dbsym r X 12 I
.dbsym l h 12 D
.dbsym l g 8 D
.dbsym l f 4 D
.dbsym r i 14 I
.dbsym l t 0 D
.dbsym r PointCount 20 pI
.dbsym r points 22 pX
.dbsym l y 34 D
.dbsym l x 30 D
.dbsym r cl 6 pX
.dbend
.dbfunc e SPLINE_SetSpline _SPLINE_SetSpline fV
; i -> R20,R21
; np -> y+6
; pt -> R22,R23
; sl -> R10,R11
.even
_SPLINE_SetSpline::
xcall push_gset3
movw R22,R18
movw R10,R16
.dbline -1
.dbline 144
; { t = 1.0f / (float)cl->Ndiv * (float)i;
; f = t * t * (3.0f - 2.0f * t);
; g = t * (t - 1.0f) * (t-1.0f);
; h = t * t * (t-1.0f);
;
; X = (int)(x + cl->Ax*f + cl->Bx*g + cl->Cx*h);
; Y = (int)(y + cl->Ay*f + cl->By*g + cl->Cy*h);
;
; points[*PointCount].x = X;
; points[*PointCount].y = Y;
; (*PointCount)++;
; }
; }
;
;
;
; /***************************************************************************/
;
;
; /****************************************************************************
; * 名称:SPLINE_Spline()
; * 功能:样条曲线初始化函数,将特征点输入到样条曲线对象中。
; * 入口参数:sl 要操作的样条曲线对象,SPLINE结构
; * pt 特征点数据
; * np 特征点个数
; * 出口参数:无
; * 说明:
; ****************************************************************************/
; void SPLINE_SetSpline(SPLINE *sl, PointXY pt[], int np)
; { int i;
.dbline 146
;
; sl->Np = np;
movw R30,R10
ldd R0,y+6
ldd R1,y+7
subi R30,72 ; addi 440
sbci R31,254
std z+1,R1
std z+0,R0
.dbline 149
;
; /* 将点数据复制到sl对象 */
; for(i=0; i<sl->Np; i++)
clr R20
clr R21
xjmp L33
L30:
.dbline 150
.dbline 150
ldi R16,4
ldi R17,0
movw R18,R20
xcall empy16s
movw R2,R16
movw R30,R2
add R30,R22
adc R31,R23
ldd R4,z+0
ldd R5,z+1
ldi R16,<L34
ldi R17,>L34
xcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
movw R16,R4
lsr R17
ror R16
xcall int2fp
st -y,R19
st -y,R18
st -y,R17
st -y,R16
xcall empy32fs
movw R16,R4
andi R16,1
andi R17,0
xcall int2fp
st -y,R19
st -y,R18
st -y,R17
st -y,R16
xcall add32f
movw R30,R2
add R30,R10
adc R31,R11
std z+0,R16
std z+1,R17
std z+2,R18
std z+3,R19
.dbline 151
ldi R16,4
ldi R17,0
movw R18,R20
xcall empy16s
movw R2,R16
movw R30,R2
add R30,R22
adc R31,R23
ldd R4,z+2
ldd R5,z+3
ldi R16,<L34
ldi R17,>L34
xcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
movw R16,R4
lsr R17
ror R16
xcall int2fp
st -y,R19
st -y,R18
st -y,R17
st -y,R16
xcall empy32fs
movw R16,R4
andi R16,1
andi R17,0
xcall int2fp
st -y,R19
st -y,R18
st -y,R17
st -y,R16
xcall add32f
movw R24,R10
adiw R24,40
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 152
L31:
.dbline 149
subi R20,255 ; offset = 1
sbci R21,255
L33:
.dbline 149
movw R30,R10
subi R30,72 ; addi 440
sbci R31,254
ldd R2,z+0
ldd R3,z+1
cp R20,R2
cpc R21,R3
brge X3
xjmp L30
X3:
.dbline -2
L29:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r i 20 I
.dbsym l np 6 I
.dbsym r pt 22 pX
.dbsym r sl 10 pX
.dbend
.dbfunc e SPLINE_MatrixSolve _SPLINE_MatrixSolve fV
; j -> R10,R11
; Work -> y+40
; WorkB -> y+0
; i -> R12,R13
; B -> R14,R15
; sl -> y+90
.even
_SPLINE_MatrixSolve::
xcall push_arg4
xcall push_gset5
movw R14,R18
sbiw R28,63
sbiw R28,17 ; offset = 80
.dbline -1
.dbline 166
; { sl->Px[i] = (float)pt[i].x;
; sl->Py[i] = (float)pt[i].y;
; }
; }
;
;
;
; /****************************************************************************
; * 名称:SPLINE_MatrixSolve()
; * 功能:求解矩阵。
; * 入口参数:sl 要操作的样条曲线对象,SPLINE结构
; * B 需操作B点数据(数组)
; * 出口参数:无
; * 说明:由SPLINE_Generate()调用,计算值保存在B返回。
; ****************************************************************************/
; void SPLINE_MatrixSolve(SPLINE *sl, float B[])
; { float Work[NPMAX];
.dbline 170
; float WorkB[NPMAX];
; int i, j;
;
; for(i=0; i<=(sl->Np-1); i++)
clr R12
clr R13
xjmp L39
L36:
.dbline 171
.dbline 171
ldi R16,4
ldi R17,0
movw R18,R12
xcall empy16s
movw R2,R16
movw R30,R2
add R30,R14
adc R31,R15
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
; stack offset 4
movw R30,R28
subi R30,162 ; addi 94
sbci R31,255
ldd R24,z+0
ldd R25,z+1
subi R24,152 ; offset = 360
sbci R25,254
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 div32f
movw R24,R28
adiw R24,40
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 172
ldi R16,4
ldi R17,0
movw R18,R12
xcall empy16s
movw R24,R28
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
movw R24,R28
movw R30,R16
add R30,R24
adc R31,R25
std z+0,R2
std z+1,R3
std z+2,R4
std z+3,R5
.dbline 173
L37:
.dbline 170
movw R24,R12
adiw R24,1
movw R12,R24
L39:
.dbline 170
movw R26,R28
subi R26,166 ; addi 90
sbci R27,255
ld R30,x+
ld R31,x
subi R30,72 ; addi 440
sbci R31,254
ldd R24,z+0
ldd R25,z+1
sbiw R24,1
cp R24,R12
cpc R25,R13
brlt X4
xjmp L36
X4:
.dbline 175
; { Work[i] = B[i] / sl->Mat[1][i];
; WorkB[i] = Work[i];
; }
;
; for(j=0; j<10; j++)
clr R10
clr R11
L40:
.dbline 176
; { Work[0] = (B[0] - sl->Mat[2][0] * WorkB[1]) / sl->Mat[1][0];
.dbline 176
movw R30,R14
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
; stack offset 4
movw R26,R28
subi R26,162 ; addi 94
sbci R27,255
ld R30,x+
ld R31,x
subi R30,112 ; addi 400
sbci R31,254
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
movw R30,R28
; stack offset 8
ldd R2,z+12
ldd R3,z+13
ldd R4,z+14
ldd R5,z+15
st -y,R5
st -y,R4
st -y,R3
st -y,R2
xcall empy32fs
xcall sub32fs
; stack offset 4
movw R26,R28
subi R26,162 ; addi 94
sbci R27,255
ld R30,x+
ld R31,x
subi R30,152 ; addi 360
sbci R31,254
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 div32f
movw R30,R28
std z+40,R16
std z+41,R17
std z+42,R18
std z+43,R19
.dbline 177
; for(i=1; i<(sl->Np-1); i++ )
ldi R24,1
ldi R25,0
movw R12,R24
xjmp L48
L45:
.dbline 178
.dbline 178
ldi R16,4
ldi R17,0
movw R18,R12
xcall empy16s
movw R2,R16
movw R30,R2
add R30,R14
adc R31,R15
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
; stack offset 4
movw R30,R28
subi R30,162 ; addi 94
sbci R31,255
ldd R24,z+0
ldd R25,z+1
subi R24,192 ; offset = 320
sbci R25,254
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,R28
; stack offset 8
adiw R24,4
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 empy32fs
xcall sub32fs
; stack offset 4
movw R30,R28
subi R30,162 ; addi 94
sbci R31,255
ldd R24,z+0
ldd R25,z+1
subi R24,112 ; offset = 400
sbci R25,254
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,R28
; stack offset 8
adiw R24,12
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 empy32fs
xcall sub32fs
; stack offset 4
movw R30,R28
subi R30,162 ; addi 94
sbci R31,255
ldd R24,z+0
ldd R25,z+1
subi R24,152 ; offset = 360
sbci R25,254
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 div32f
movw R24,R28
adiw R24,40
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 179
L46:
.dbline 177
movw R24,R12
adiw R24,1
movw R12,R24
L48:
.dbline 177
movw R26,R28
subi R26,166 ; addi 90
sbci R27,255
ld R30,x+
ld R31,x
subi R30,72 ; addi 440
sbci R31,254
ldd R24,z+0
ldd R25,z+1
sbiw R24,1
cp R12,R24
cpc R13,R25
brge X5
xjmp L45
X5:
.dbline 180
; { Work[i] = (B[i] - sl->Mat[0][i] * WorkB[i-1] - sl->Mat[2][i] * WorkB[i+1]) / sl->Mat[1][i];
; }
; Work[sl->Np-1] = (B[sl->Np-1] - sl->Mat[0][sl->Np-1] * WorkB[sl->Np-2]) / sl->Mat[1][sl->Np-1];
movw R26,R28
subi R26,166 ; addi 90
sbci R27,255
ld R30,x+
ld R31,x
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
movw R24,R2
sbiw R24,4
movw R4,R24
movw R30,R24
add R30,R14
adc R31,R15
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
; stack offset 4
movw R30,R28
subi R30,162 ; addi 94
sbci R31,255
ldd R24,z+0
ldd R25,z+1
subi R24,192 ; offset = 320
sbci R25,254
movw R30,R4
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 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
xcall sub32fs
; stack offset 4
movw R30,R28
subi R30,162 ; addi 94
sbci R31,255
ldd R24,z+0
ldd R25,z+1
subi R24,152 ; offset = 360
sbci R25,254
movw R30,R4
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 div32f
movw R24,R28
adiw R24,36
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 182
;
; for(i=0; i<=(sl->Np-1); i++)
clr R12
clr R13
xjmp L56
L53:
.dbline 183
.dbline 183
ldi R16,4
ldi R17,0
movw R18,R12
xcall empy16s
movw R24,R28
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
movw R24,R28
movw R30,R16
add R30,R24
adc R31,R25
std z+0,R2
std z+1,R3
std z+2,R4
std z+3,R5
.dbline 184
L54:
.dbline 182
movw R24,R12
adiw R24,1
movw R12,R24
L56:
.dbline 182
movw R26,R28
subi R26,166 ; addi 90
sbci R27,255
ld R30,x+
ld R31,x
subi R30,72 ; addi 440
sbci R31,254
ldd R24,z+0
ldd R25,z+1
sbiw R24,1
cp R24,R12
cpc R25,R13
brlt X6
xjmp L53
X6:
.dbline 185
L41:
.dbline 175
movw R24,R10
adiw R24,1
movw R10,R24
.dbline 175
cpi R24,10
ldi R30,0
cpc R25,R30
brge X7
xjmp L40
X7:
.dbline 187
; { WorkB[i] = Work[i];
; }
; }
;
; for(i=0; i<=(sl->Np-1); i++)
clr R12
clr R13
xjmp L60
L57:
.dbline 188
.dbline 188
ldi R16,4
ldi R17,0
movw R18,R12
xcall empy16s
movw R24,R28
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
movw R30,R16
add R30,R14
adc R31,R15
std z+0,R2
std z+1,R3
std z+2,R4
std z+3,R5
.dbline 189
L58:
.dbline 187
movw R24,R12
adiw R24,1
movw R12,R24
L60:
.dbline 187
movw R26,R28
subi R26,166 ; addi 90
sbci R27,255
ld R30,x+
ld R31,x
subi R30,72 ; addi 440
sbci R31,254
ldd R24,z+0
ldd R25,z+1
sbiw R24,1
cp R24,R12
cpc R25,R13
brge L57
.dbline -2
L35:
adiw R28,63
adiw R28,17 ; offset = 80
xcall pop_gset5
adiw R28,4
.dbline 0 ; func end
ret
.dbsym r j 10 I
.dbsym l Work 40 A[40:10]D
.dbsym l WorkB 0 A[40:10]D
.dbsym r i 12 I
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -