📄 插值算法.asm
字号:
;程序作者: 马 良 QQ:8297327 电话:13087664858
;功能: 两个点的线性插值定点数算法。
;入口:已知两个点,坐标分别为 P1[ R_x1H R_x1L , R_y1H R_y1L ]
; 和 P2[ R_x2H R_x2L , R_y2H R_y2L ] 。未知点的x坐标为 R_xH R_xL 。
; 注意:x、y坐标都是双字节数,高字节在前。
;出口:未知点的y坐标存放在 R_yH R_yL 中,高字节在前。
;资源:PSW、A、R0 ~ R7 。
;说明:1、基本公式 y=( y2-y1 ) ( x-x1 ) / ( x2-x1 ) + y1
; 2、根据直线斜率的正负、内插外插的不同,分为6种情况。
; 参见文件夹中的“插值算法的6种情况”一图。
LINE_INSERT:
clr R_FLAG2.B_CHR_ERR ;清错误标志。
mov A,R_x2L ;调整两点,使P1的x坐标为较小的数。 P1x - P2x 。
clr C
subb A,R_x1L
mov A,R_x2H
subb A,R_x1H
jnc LI10 ;如果现状不需要调整则继续。
mov A,R_x1H ;交换两点的坐标。
xch A,R_x2H
mov R_x1H,A
mov A,R_x1L
xch A,R_x2L
mov R_x1L,A
mov A,R_y1H
xch A,R_y2H
mov R_y1H,A
mov A,R_y1L
xch A,R_y2L
mov R_y1L,A
LI10: ;计算 x2 - x1 ==> x2 ,为各种情况公用的中间数据。
mov A,R_x2L
clr C
subb A,R_x1L
mov R_x2L,A
mov A,R_x2H
subb A,R_x1H
mov R_x2H,A
LI20: ;计算 y2 - y1 ,以区别正负斜率,分别处理。
mov A,R_y2L
clr C
subb A,R_y1L
mov A,R_y2H
subb A,R_y1H
jc LI60
LI30: ;正斜率,分图1~ 图3三种情况。
;先区别x和x1的大小。
mov A,R_xL
clr C
subb A,R_x1L
mov A,R_xH
subb A,R_x1H
jc LI50
LI40: ;x > x1 ,属于图1和图3的情况。
;y=( y2-y1 ) ( x-x1 ) / ( x2-x1 ) + y1
mov A,R_y2L ; y2-y1 ==> R2(H) R3(L)
clr C
subb A,R_y1L
mov R3,A
mov A,R_y2H
subb A,R_y1H
mov R2,A
mov A,R_xL ; x-x1 ==> R6(H) R7(L)
clr C
subb A,R_x1L
mov R7,A
mov A,R_xH
subb A,R_x1H
mov R6,A
lcall MUL22 ;( y2-y1 ) ( x-x1 ) ==> R2(H) R3 R4 R5(L)
mov R6,R_x2H
mov R7,R_x2L
lcall DIVDE42 ;( y2-y1 ) ( x-x1 ) / ( x2-x1 ) ==> R2(H) R3(L)
jnb OV,LI44
ljmp LI_ERR ;溢出错误。
LI44:
mov A,R_y1L ;y=( y2-y1 ) ( x-x1 ) / ( x2-x1 ) + y1
add A,R3
mov R_yL,A
mov A,R_y1H
addc A,R2
mov R_yH,A
jc LI48
ljmp LI_END ;图1和图3的情况处理结束。
LI48:
ljmp LI_ERR ;溢出错误。
LI50: ;x < x1 ,属于图2的情况 。
;y=y1 - ( y2-y1 ) ( x1-x ) / ( x2-x1 )
mov A,R_y2L ; y2-y1 ==> R2(H) R3(L)
clr C
subb A,R_y1L
mov R3,A
mov A,R_y2H
subb A,R_y1H
mov R2,A
mov A,R_x1L ; x1-x ==> R6(H) R7(L)
clr C
subb A,R_xL
mov R7,A
mov A,R_x1H
subb A,R_xH
mov R6,A
lcall MUL22 ;( y2-y1 ) ( x1-x ) ==> R2(H) R3 R4 R5(L)
mov R6,R_x2H
mov R7,R_x2L
lcall DIVDE42 ;( y2-y1 ) ( x1-x ) / ( x2-x1 ) ==> R2(H) R3(L)
jnb OV,LI54
ljmp LI_ERR ;溢出错误。
LI54:
mov A,R_y1L ;y= y1 - ( y2-y1 ) ( x1-x ) / ( x2-x1 )
clr C
subb A,R3
mov R_yL,A
mov A,R_y1H
subb A,R2
mov R_yH,A
jc LI58
ljmp LI_END ;图2的情况处理结束。
LI58:
ljmp LI_ERR ;溢出错误。
LI60: ;负斜率,分图4~ 图6三种情况。
;先区别x和x1的大小。
mov A,R_xL
clr C
subb A,R_x1L
mov A,R_xH
subb A,R_x1H
jc LI70
LI64: ;x > x1 ,属于图4和图6的情况。
;y= y1 - ( y1-y2 ) ( x-x1 ) / ( x2-x1 )
mov A,R_y1L ; y1-y2 ==> R2(H) R3(L)
clr C
subb A,R_y2L
mov R3,A
mov A,R_y1H
subb A,R_y2H
mov R2,A
mov A,R_xL ; x-x1 ==> R6(H) R7(L)
clr C
subb A,R_x1L
mov R7,A
mov A,R_xH
subb A,R_x1H
mov R6,A
lcall MUL22 ;( y1-y2 ) ( x-x1 ) ==> R2(H) R3 R4 R5(L)
mov R6,R_x2H
mov R7,R_x2L
lcall DIVDE42 ;( y1-y2 ) ( x-x1 ) / ( x2-x1 ) ==> R2(H) R3(L)
jnb OV,LI68
ljmp LI_ERR ;溢出错误。
LI68:
mov A,R_y1L ;y= y1 - ( y1-y2 ) ( x-x1 ) / ( x2-x1 )
clr C
subb A,R3
mov R_yL,A
mov A,R_y1H
subb A,R2
mov R_yH,A
jc LI6A
ljmp LI_END ;图4和图6的情况处理结束。
LI6A:
ljmp LI_ERR ;溢出错误。
LI70: ;x < x1 ,属于图5的情况 。
;y=y1 + ( y1-y2 ) ( x1-x ) / ( x2-x1 )
mov A,R_y1L ; y1-y2 ==> R2(H) R3(L)
clr C
subb A,R_y2L
mov R3,A
mov A,R_y1H
subb A,R_y2H
mov R2,A
mov A,R_x1L ; x1-x ==> R6(H) R7(L)
clr C
subb A,R_xL
mov R7,A
mov A,R_x1H
subb A,R_xH
mov R6,A
lcall MUL22 ;( y1-y2 ) ( x1-x ) ==> R2(H) R3 R4 R5(L)
mov R6,R_x2H
mov R7,R_x2L
lcall DIVDE42 ;( y1-y2 ) ( x1-x ) / ( x2-x1 ) ==> R2(H) R3(L)
jnb OV,LI74
ljmp LI_ERR ;溢出错误。
LI74:
mov A,R_y1L ;y= y1 + ( y1-y2 ) ( x1-x ) / ( x2-x1 )
add A,R3
mov R_yL,A
mov A,R_y1H
addc A,R2
mov R_yH,A
jc LI78
ljmp LI_END ;图5的情况处理结束。
LI78:
ljmp LI_ERR ;溢出错误。
LI_ERR: ;溢出错误。
setb R_FLAG2.B_CHR_ERR
LI_END:
ret
;功能:四字节二进制无符号数除以双字节无符号数。
;入口:被除数在 R2(H)、R3、R4、R5(L)中,除数在R6(H)R7(L)中。
;出口:OV=0 时,双字节商在 R2(H)、R3(L)中;OV=1 溢出。
;资源:PSW、A、B、R1 ~ R7。
DIVDE42:
CLR C ;比较被除数和除数
MOV A,R3
SUBB A,R7
MOV A,R2
SUBB A,R6
JC DVD1
SETB OV ;溢出。
RET
DVD1:
MOV B,#10H ;计算双字节商。
DVD2:
CLR C ;部分商和余数同时左移一位。
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
XCH A,R2
RLC A
XCH A,R2
MOV F0,C ;保存溢出位。
CLR C
SUBB A,R7 ;计算(R2R3-R6R7)。
MOV R1,A
MOV A,R2
SUBB A,R6
ANL C,/F0 ;结果判断。
JC DVD3
MOV R2,A ;够减,存放新的余数。
MOV A,R1
MOV R3,A
INC R5 ;商的低位置一。
DVD3:
DJNZ B,DVD2 ;计算完十联位商(R4R5)。
MOV A,R4 ;将商移到R2R3中。
MOV R2,A
MOV A,R5
MOV R3,A
CLR OV ;设立成功标志。
RET
;功能: 两个双字节二进制无符号数相乘。
;入口:被乘数在 R2(H)、R3(L)中,乘数在R6(H)R7(L)中。
;出口:乘数在R2(H)、R3、R4、R5(L)中。
;资源:PSW、A、B、R2 ~ R7。
MUL22:
push B
MOV A,R3 ;??R3?R7
MOV B,R7
MUL AB
MOV R4,B ;?????
MOV R5,A
MOV A,R3 ;??R3?R6
MOV B,R6
MUL AB
ADD A,R4 ;?????
MOV R4,A
CLR A
ADDC A,B
MOV R3,A
MOV A,R2 ;??R2?R7
MOV B,R7
MUL AB
ADD A,R4 ;?????
MOV R4,A
MOV A,R3
ADDC A,B
MOV R3,A
CLR A
RLC A
XCH A,R2 ;??R2?R6
MOV B,R6
MUL AB
ADD A,R3 ;?????
MOV R3,A
MOV A,R2
ADDC A,B
MOV R2,A
pop B
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -