1、片内RAM初始化子程序
2、片外RAM初始化子程序
3、片外RAM初始化子程序(双字节个单元)
4、内部RAM数据复制程序
5、外部RAM数据复制程序
6、外部RAM数据复制程序
7、外部RAM数据复制到内部RAM程序
8、限幅滤波程序
9、中位值滤波程序
10、N点算术平均滤波
11、N点加权平均滤波
12、一阶加权滞后滤波程序
13、双字节取补程序
14、N节取补程序
15、双字节无符号数加法程序
16、N字节无符号数加法程序
17、双字节无符号数减法程序
18、N字节无符号数减法程序
19、单字节无符号数乘法程序
20、单字节无符号数乘法程序
21、单字节无符号数乘法程序
22、双字节无符号数乘法程序
23、双字节无符号数乘法程序
24、N字节无符号数乘法程序
25、单字节无符号除法程序
26、单字节无符号除法程序
27、双字节无符号除法程序
28、N字节无符号除法程序(组合)
29、N字节无符号除法程序
30、N字节数据左移程序
31、原码有符号双字节减法程序
32、原码有符号双字节加法程序
33、原码有符号双字节乘法程序
34、原码有符号双字节除法程序
35、单字节顺序查找程序
36、单字节顺序查找程序
37、双字节字符串顺序查找程序
38、双字节字符串顺序查找程序
39、N字节字符串顺序查找程序
40、单字节最值查找程序
41、浮点数顺序查找程序
42、浮点数最值查找程序
43、单字节折半查找程序
;片内RAM初始化子程序
IBCLR:MOVA,R0
MOVR1,A
CLRA
IBC1:MOV@R1,A
INCR1
DJNZR7,IBC1
RET
;片外RAM初始化子程序
EBCLR1:MOVA,ADDPL
MOVDPL,A
MOVA,ADDPH
MOVDPH,A
CLRC
EBC11:MOVX@DPTR,A
INCDPTR
DJNZR7,EBC11
RET
;片外RAM初始化子程序(双字节个单元)
EBCLR2:MOVA,ADDPL
MOVDPL,A
MOVA,ADDPH
MOVDPH,A
MOVA,R7
JZEBC21
INCR6
EBC21:CLRA
MOVX@DPTR,A
INCDPTR
DJNZR7,EBC21
DJNZR6,EBC21
RET
;内部RAM数据复制程序
;入口:R0,R7
;占用资源:A
;堆栈需求:2字节
;出口:R1
IBMOV:MOVA,R0
ADDA,R7
MOVR0,A
MOVA,R1
ADDA,R7
MOVR1,A
IBM1:DECR0
DECR1
MOVA,@R0
MOV@R1,A
DJNZR7,IBM1
RET
;外部RAM数据复制程序
;入口:ADDPH,ADDPL,R7
;占用资源:ACC
;堆栈需求:2字节
;出口:R0,R1
EBMOV1:MOVA,ADDPL
ADDA,R7
MOVDPL,A
CLRA
ADDCA,ADDPH
MOVDPH,A
MOVA,R7
ADDA,R1
XCHA,R0
ADDCA,#00H
MOVP2,A
EBM11:DECR0
CJNER0,#0FFH,EBM12
DECP2
EBM12:DECDPL
MOVA,DPL
CJNEA,#0FFH,EBM13
DECDPH
EBM13:MOVXA,@R0
MOVX@DPTR,A
DJNZR7,EBM11
RET
;外部RAM数据复制程序
;入口:ADDPH,ADDPL,R6,R7
;占用资源:ACC
;堆栈需求:2字节
;出口:R0,R1
EBMOV2:MOVA,ADDPL
ADDA,R7
MOVDPL,A
MOVA,R6
ADDCA,ADDPH
MOVDPH,A
MOVA,R7
ADDA,R1
XCHA,R0
ADDCA,R6
MOVP2,A
MOVA,R7
JZEBM21
INCR6
EBM21:DECR0
CJNER0,#0FFH,EBM22
DECP2
EBM22:DECDPL
MOVA,DPL
CJNEA,#0FFH,EBM23
DECDPH
EBM23:MOVXA,@R0
MOVX@DPTR,A
DJNZR7,EBM21
DJNZR6,EBM21
RET
;外部RAM数据复制到内部RAM程序
;入口:ADDPH,ADDPL,R7
;占用资源:ACC
;堆栈需求:2字节
;出口:R0
ITEMOV:MOVA,ADDPL
ADDA,R7
MOVDPL,A
MOVA,ADDPH
ADDCA,#00H
MOVDPH,A
MOVA,R0
ADDA,R7
MOVR0,A
ITEM1:DECR0
DECDPL
MOVA,DPL
CJNEA,#0FFH,ITEM2
DECDPH
ITEM2:MOVXA,@DPTR
MOV@R0,A
DJNZR7,ITEM1
RET
;限幅滤波程序
;入口:A,SDAT,DELTY
;占用资源:B
;堆栈需求:2字节
;出口:A
JUGFILT:MOVB,A
CLRC
SUBBA,SDAT
JNCJUGFT1
CPLA
INCA
JUGFT1:SETBA
SUBBA,#DELTY
JNCJUGFT3
MOVA,SDAT
RET
JUGFT3:MOVA,B
MOVSDAT,A
RET
;中位值滤波程序
;入口:ADDPH,ADDPL,N
;占用资源:ESELSORT
;堆栈需求:4字节
;出口:A
MEDFILT:LCALLESELSORT
MOVA,N
CLRC
RRCA
ADDA,ADDPL
MOVDPL,A
MOVA,ADDPH
MOVDPH,A
JNCMEDFT1
INCDPH
MEDFT1:MOVXA,@DPTR
RET
;N点算术平均滤波
;入口:ADDPH,ADDPL,N
;占用资源:B,R3,R4
;堆栈需求:2字节
;出口:A
AVFILT:MOVA,ADDPL
MOVDPL,A
MOVA,ADDPH
MOVDPH,A
CLRA
MOVR3,A
MOVR4,A
MOVR7,N
AVFT1:MOVXA,@DPTR
INCDPTR
ADDA,R4
MOVR4,A
JNCAVFT2
INCR3
AVFT2:DJNZR7,AVFT1
MOVR7,N
MOVR2,#00H
LCALLNDIV31
MOVA,R4
RET
;N点加权平均滤波
;入口:ADDPH,ADDPL,N
;占用资源:B,R3,R4
;堆栈需求:2字节
;出口:A
QAVFILT:CLRA
MOVR3,A
MOVR4,A
MOVR7,N
MOVP2,ADDPH
MOVR1,ADDPL
MOVDPTR,#QAVTAB
QAVFT1:MOVCA,@A+DPTR
MOVB,A
MOVXA,@R1
INCDPTR
INCR1
MULAB
ADDA,R4
MOVR4,A
MOVA,B
ADDCA,R3
MOVR3,A
DJNZR7,QAVFT1
MOVA,R4
JNBACC.7,QAVFT2
INCR3
QAVFT2:MOVA,R3
RET
QAVTAB:DB
;一阶加权滞后滤波程序
;入口:A,DELTY
;占用资源:B,R3,R4
;堆栈需求:2字节
;出口:A
BQFILT:MOVB,A
CLRA
MOVDPTR,#ABTAB
MOVCA,@A+DPTR
MULAB
MOVR4,A
MOVR3,B
MOVA,#01H
MOVCA,@A+DPTR
MOVB,DELTY
MULAB
ADDA,R4
MOVR4,A
MOVA,B
ADDCA,R3
MOVR3,A
MOVA,R4
JNBACC.7,FT1
INCR3
FT1:MOVA,R3
MOVDELTY,A
RET
BQTAB:DB80H,80H
;双字节取补程序 /(R3R4)=(R3R4)
;入口:R3,R4
;占用资源:ACC
;堆栈需求:2字节
;出口:R3,R4
CMPT:MOVA,R4
CPLA
ADDA,#01H
MOVR4,A
MOVA,R3
CPLA
ADDCA,#00H
MOVR3,A
RET
;N节取补程序 /([R0])=([R0])
;入口:R0,R7
;占用资源:ACC,B
;堆栈需求:2字节
;出口:R0
NCMPTN:MOVB,R0
SETBC
NCPT1:MOVA,@R0
CPLA
ADDCA,#00H
MOV@R0,A
INCR0
DJNZR7,NCPT1
MOVR0,B
RET
;双字节无符号数加法程序 (R3R4+R6R7)=(R3R4)
;入口:R3,R4,R6,R7
;占用资源:ACC
;堆栈需求:2字节
;出口:R3,R4,CF
NADD:MOVA,R4
ADDA,R7
MOVR4,A
MOVA,R3
ADDCA,R6
MOVR3,A
RET
;N字节无符号数加法程序 ([R0]+[R1])=([R0])
;入口:R0,R1,R7
;占用资源:ACC,B
;堆栈需求:2字节
;出口:R0,CF
NADDN:MOVB,R0
CLRC
NADN1:MOVA,@R0
ADDCA,@R1
MOV@R0,A
INCR0
INCR1
DJNZR7,NADN1
MOVR0,B
RET
;双字节无符号数减法程序 (R3R4-R6R7)=(R3R4)
;入口:R3,R4,R6,R7
;占用资源:ACC
;堆栈需求:2字节
;出口:R3,R4
NSUB:MOVA,R4
CLRC
SUBBA,R7
MOVR4,A
MOVA,R3
SUBBA,R6
MOVR3,A
RET
;N字节无符号数减法程序 ([R0]-[R1])=([R0])
;入口:R0,R1,R7
;占用资源:ACC,B
;堆栈需求:2字节
;出口:R0,CF
NSUBN:MOVB,R0
MOVR7,N
CLRC
NSUBN1:MOVA,@R0
SUBBA,@R1
MOV@R0,A
INCR0
INCR1
DJNZR7,NSUBN1
MOVR0,B
RET
;单字节无符号数乘法程序 (R3R4*R7)=(R2R3R4)
;入口:R3,R4,R7
;占用资源:ACC,B
;堆栈需求:2字节
;出口:R2,R3,R4
NMUL21:MOVA,R4
MOVB,R7
MULAB
MOVR4,A
MOVA,B
XCHA,R3
MOVB,R7
MULAB
ADDA,R3
MOVR3,A
CLRA
ADDCA,B
MOVR2,A
CLROV
RET
;单字节无符号数乘法程序 (R2R3R4*R7)=(R5R2R3R4)
;入口:R2,R3,R4,R6,R7
;占用资源:ACC,B
;堆栈需求:2字节
;出口:R5,R2,R3,R4
NMUL31:MOVA,R4
MOVB,R7
MULAB
MOVR4,A
MOVA,B
XCHA,R3
MOVB,R7
MULAB
ADDA,R3
MOVR3,A
CLRA
ADDCA,B
XCHA,R2
MOVB,R7
MULAB
ADDA,R2
MOVR2,A
CLRA
ADDCA,B
MOVR5,A
CLROV
RET
;单字节无符号数乘法程序 (R5R2R3R4*R7)=(R7R5R2R3R4)
;入口:R5,R2,R3,R4,R7
;占用资源:ACC,B
;堆栈需求:2字节
;出口:R7,R5,R2,R3,R4
NMUL41:MOVA,R4
MOVB,R7
MULAB
MOVR4,A
MOVA,B
XCHA,R3
MOVB,R7
MULAB
ADDA,R3
MOVR3,A
CLRA
ADDCA,B
XCHA,R2
MOVB,R7
MULAB
ADDA,R2
MOVR2,A
CLRA
ADDCA,B
XCHA,R5
MOVB,R7
MULAB
ADDA,R5
MOVR5,A
CLRA
ADDCA,B
MOVR7,A
CLROV
RET
;双字节无符号数乘法程序 (R3R4*R6R7)=(R5R2R3R4)
;入口:R3,R4,R6,R7
;占用资源:ACC,B
;堆栈需求:2字节
;出口:R5,R2,R3,R4
NMUL22:MOVA,R4
MOVB,R7
MULAB
XCHA,R4
MOVR5,B
MOVB,R6
MULAB
ADDA,R5
MOVR5,A
CLRA
ADDCA,B
MOVR2,A
MOVA,R3
MOVB,R7
MULAB
ADDA,R5
MOVR5,A
MOVA,B
ADDCA,R2
MOVR2,A
CLRA
ADDCA,#00H
XCHA,R3
MOVB,R6
MULAB
ADDA,R2
MOVR2,A
MOVA,B
ADDCA,R3
XCHA,R5
MOVR3,A
CLROV
RET
;双字节无符号数乘法程序 (R2R3R4*R6R7)=(R1R5R2R3R4)
;入口:R2,R3,R4,R6,R7
;占用资源:ACC,B
;堆栈需求:2字节
;出口:R1,R5,R2,R3,R4
NMUL32:MOVA,R4
MOVB,R7
MULAB
XCHA,R4
MOVR5,B
MOVB,R6
MULAB
ADDA,R5
MOVR5,A
CLRA
ADDCA,B
MOVR1,A
MOVA,R3
MOVB,R7
MULAB
ADDA,R5
MOVR5,A
MOVA,B
ADDCA,R1
MOVR1,A
CLRA
ADDCA,#00H
XCHA,R3
MOVB,R6
MULAB
ADDA,R1
MOVR1,A
MOVA,B
ADDCA,R3
XCHA,R5
MOVR3,A
MOVA,R2
MOVB,R7
MULAB
ADDA,R1
MOVR1,A
MOVA,B
ADDCA,R5
MOVR5,A
CLRA
ADDCA,#00H
XCHA,R2
MOVB,R6
MULAB
ADDA,R5
MOVR5,A
MOVA,B
ADDCA,R2
XCHA,R1
MOVR2,A
CLROV
RET
;N字节无符号数乘法程序 ([R0]*[R1])=([R0])
;入口:R0,R1,M,N
;占用资源:ACC,B,R2,R5,R6,R7,NCNT
;堆栈需求:2字节
;出口:R0
NMULMN:MOVA,M
ADDA,R0
MOVR5,A
XCHA,R1
XCHA,R5
ADDA,N
XCHA,R0
MOVR6,A
MOVB,M
MOVNCNT,B
NMLMN1:DECR0
DECR1
CLRA
XCHA,@R1
MOV@R0,A
DJNZNCNT,NMLMN1
MOVNCNT,B
NMLMN2:CLRA
XCHA,@R0
MOVR2,A
MOVA,R6
MOVR0,A
MOVA,R5
MOVR1,A
MOVR7,N
CLRC
NMLMN3:MOVA,R2
MOVB,@R1
INCR1
MULAB
ADDCA,@R0
MOV@R0,A
INCR0
MOVA,B
ADDCA,@R0
MOV@R0,A
DJNZR7,NMLMN3
INCR0
INCR6
DJNZNCNT,NMLMN2
MOVA,R0
CLRC
SUBBA,M
SUBBA,N
MOVR0,A
RET
;单字节无符号除法程序 (R2R3R4/R7)=(R2)R3R4 余数R7
;入口:R2,R3,R4,R7
;占用资源:ACC,B,F0
;堆栈需求:3字节
;出口:(R2),R3,R4,R7,OV
NDIV31:MOVA,R2
MOVB,R7
DIVAB
PUSHA
MOVR2,B
MOVB,#10H
NDV311:CLRC
MOVA,R4
RLCA
MOVR4,A
MOVA,R3
RLCA
MOVR3,A
MOVA,R2
RLCA
MOVR2,A
MOVF0,C
CLRC
SUBBA,R7
JBF0,NDV312
JCNDV313
NDV312:MOVR2,A
INCR4
NDV313:DJNZB,NDV311
POPA
CLROV
JZNDV314
SETBOV
NDV314:XCHA,R2
MOVR7,A
RET
;单字节无符号除法程序 (R5R2R3R4/R7)=(R5)R2R3R4 余数R7
;入口:R2,R3,R4,R7
;占用资源:ACC,B,F0
;堆栈需求:3字节
;出口:(R5),R2,R3,R4,R7,OV
NDIV41:MOVA,R5
MOVB,R7
DIVAB
PUSHA
MOVR5,B
MOVB,#18H
NDV411:CLRC
MOVA,R4
RLCA
MOVR4,A
MOVA,R3
RLCA
MOVR3,A
MOVA,R2
RLCA
MOVR2,A
MOVA,R5
RLCA
MOVR5,A
MOVF0,C
CLRC
SUBBA,R7
JBF0,NDV412
JCNDV413
NDV412:MOVR5,A
INCR4
NDV413:DJNZB,NDV411
POPA
CLROV
JZNDV414
SETBOV
NDV414:XCHA,R5
MOVR7,A
RET
;双字节无符号除法程序 (R5R2R3R4/R6R7)=(R2)R3R4 余数R6R7
;入口:R5,R2,R3,R4,R6,R7
;占用资源:ACC,B,F0
;堆栈需求:4字节
;出口:(R2),R3,R4,R6,R7,OV
NDIV42:MOVA,R1
PUSHA
MOVB,#00H
NDV421:MOVA,R2
CLRC
SUBBA,R7
MOVR1,A
MOVA,R5
SUBBA,R6
JCNDV422
MOVR5,A
MOVA,R1
MOVR2,A
INCB
SJMPNDV421
NDV422:PUSHB
MOVB,#10H
NDV423:CLRC
MOVA,R4
RLCA
MOVR4,A
MOVA,R3
RLCA
MOVR3,A
MOVA,R2
RLCA
MOVR2,A
XCHA,R5
RLCA
XCHA,R5
MOVF0,C
CLRC
SUBBA,R7
MOVR1,A
MOVA,R5
SUBBA,R6
JBF0,NCV424
JCNDV425
NCV424:MOVR5,A
MOVA,R1
MOVR2,A
INCR4
NDV425:DJNZB,NDV423
POPA
CLROV
JNZNDV426
SETBOV
NDV426:XCHA,R2
MOVR7,A
MOVA,R5
MOVR6,A
POPA
MOVR1,A
RET
;N字节无符号除法程序(组合) ([R0]/[R1])=([R0])
;入口:R0,R1,M,N
;占用资源:ACC,R2,R3,R4,R5,R7,NCNT,F0,NADDN,NSUBBN,NRLCN
;堆栈需求:4字节
;出口:R0
;NDIVMN:MOVA,M
CLRC
SUBBA,N
MOVNCNT,A
ADDA,R0
MOVR4,A
XCHA,R0
MOVR3,A
MOVA,R1
MOVR5,A
MOVR2,#00H
NDVMN1:MOVR7,N
LCALLNSUBN
MOVA,R5
MOVR1,A
JCNDVMN2
INCR2
SJMPNDVMN1
NDVMN2:MOVR7,N
LCALLNADDN
MOVA,NCNT
SWAPA
RRA
MOVNCNT,A
NDVMN3:MOVA,R3
MOVR0,A
MOVR7,M
LCALLNRLCN
MOVF0,C
MOVA,R4
MOVR0,A
MOVA,R5
MOVR1,A
MOVR7,N
LCALLNSUBN
JBF0,NDVMN4
JCNDVMN5
NDVMN4:MOVA,R3
MOVR0,A
INC@R0
SJMPNDVMN6
NDVMN5:MOVA,R5
MOVR1,A
MOVR7,N
LCALLNADDN
NDVMN6:DJNZNCNT,NDVMN3
MOVA,R4
MOVR1,A
MOVA,R2
MOV@R1,A
MOVA,R3
MOVR0,A
RET
;N字节无符号除法程序(集成) ([R0]/R[1])=([R0])
;入口:R0,R1,M,N
;占用资源:ACC,R2,R3,R4,R5,R7,F0
;堆栈需求:2字节
;出口:R0
NDIVMN:MOVA,M
CLRC
SUBBA,N
MOVB,A
ADDA,R0
MOVR4,A
XCHA,R0
MOVR3,A
MOVA,R1
MOVR5,A
MOVR2,#00H
NDVMN1:MOVR7,N
CLRC
NDVMN2:MOVA,@R0
SUBBA,@R1
MOV@R0,A
INCR0
INCR1
DJNZR7,NDVMN2
MOVA,R4
MOVR0,A
MOVA,R5
MOVR1,A
JCNDVMN3
INCR2
SJMPNDVMN1
NDVMN3:MOVR7,N
CLRC
NDVMN4:MOVA,@R0
ADDCA,@R1
MOV@R0,A
INCR0
INCR1
DJNZR7,NDVMN4
MOVA,#08H
MULAB
MOVB,A
NDVMN5:MOVA,R3
MOVR0,A
MOVR7,M
CLRC
NDVMN6:MOVA,@R0
RLCA
MOV@R0,A
INCR0
DJNZR7,NDVMN6
MOVF0,C
MOVA,R4
MOVR0,A
MOVA,R5
MOVR1,A
MOVR7,N
CLRC
NDVMN7:MOVA,@R0
SUBBA,@R1
MOV@R0,A
INCR0
INCR1
DJNZR7,NDVMN7
JBF0,NDVMNB
JCNDVMN8
NDVMNB:MOVA,R3
MOVR0,A
INC@R0
SJMPNDVMNA
NDVMN8:MOVR7,N
MOVA,R4
MOVR0,A
MOVA,R5
MOVR1,A
CLRC
NDVMN9:MOVA,@R0
ADDCA,@R1
MOV@R0,A
INCR0
INCR1
DJNZR7,NDVMN9
NDVMNA:DJNZB,NDVMN5
MOVA,M
CLRC
SUBBA,N
ADDA,R3
MOVR1,A
MOVA,R2
MOV@R1,A
MOVA,R3
MOVR0,A
RET
;N字节数据左移程序 RLC([R0])=(CF[R0])
;入口:R0,R7
;占用资源:ACC,B
;堆栈需求:2字节
;出口:R0,CF
NRLCN:MOVB,R0
CLRC
NRLN1:MOVA,@R0
RLCA
MOV@R0,A
INCR0
DJNZR7,NRLN1
MOVR0,B
RET
;原码有符号双字节减法程序 (R3R4-R6R7)=R3R4
;入口:R3,R4,R6,R7
;占用资源:ACC,DADD
;堆栈需求:6字节
;出口:R3,R4,OV
DSUB:MOVA,R6
CPLACC.7
MOVR6,A
LCALLDADD
RET
;原码有符号双字节加法程序 (R3R4+R6R7)=R3R4
;入口:R3,R4,R6,R7
;占用资源:ACC,SR0,NADD,NSUB,CMPT
;堆栈需求:4字节
;出口:R3,R4,OV
DADD:MOVA,R3
MOVC,ACC.7
MOVSR0,C
XRLA,R6
MOVC,ACC.7
MOVA,R3
CLRACC.7
MOVR3,A
MOVA,R6
CLRACC.7
MOVR6,A
JCDAB2
LCALLNADD
MOVA,R3
JBACC.7,DABE
DAB1:MOVC,SR0
MOVACC.7,C
MOVR3,A
CLROV
RET
DABE:SETBOV
RET
DAB2:LCALLNSUB
MOVA,R3
JNBACC.7,DAB1
LCALLCMPT
CPLSR0
SJMPDAB1
;原码有符号双字节乘法程序 (R3R4*R6R7)=(R5R2R3R4)
;入口:R3,R4,R6,R7
;占用资源:ACC,SR0,NMUL22
;堆栈需求:4字节
;出口:R5,R2,R3,R4
IMUL:MOVA,R3
XRLA,R6
MOVC,ACC.7
MOVSR0,C
MOVA,R3
CLRACC.7
MOVR3,A
MOVA,R6
CLRACC.7
MOVR6,A
LCALLNMUL22
MOVA,R5
MOVC,SR0
MOVACC.7,C
MOVR5,A
RET
;原码有符号双字节除法程序 (R5R2R3R4/R6R7)=(R3R4) 余数(R6R7)
;入口:R5,R2,R3,R4
;占用资源:ACC,SR0,NDIV42
;堆栈需求:6字节
;出口:R3,R4,R6,R7,OV
IDIV:MOVA,R5
XRLA,R6
MOVC,ACC.7
MOVSR0,C
MOVA,R5
CLRACC.7
MOVR5,A
MOVA,R6
CLRACC.7
MOVR6,A
LCALLNDIV42
MOVA,R3
JBACC.7,IDIVE
JBOV,IDIVE
MOVC,SR0
MOVACC.7,C
MOVR3,A
RET
IDIVE:SETBOV
RET
;单字节顺序查找程序
;入口:R0,R1,A,R7
;占用资源:B
;堆栈需求:2字节
;出口:R0,R1,A
FINDB1:MOVB,A
MOVDPL,R1
MOVDPH,R0
FINDB11:MOVXA,@DPTR
CJNEA,B,FINDB12
MOVR1,DPL
MOVR0,DPH
CLRA
RET
FINDB12:INCDPTR
DJNZR7,FINDB11
MOVA,#0FFH
RET
;单字节顺序查找程序
;入口:R0,R1,A,R6,R7
;占用资源:B
;堆栈需求:2字节
;出口:R0,R1,A
FINDB2:MOVB,A
MOVDPL,R1
MOVDPH,R0
MOVA,R7
JZFINDB21
INCR6
FINDB21:MOVXA,@DPTR
CJNEA,B,FINDB22
MOVR1,DPL
MOVR0,DPH
CLRA
RET
FINDB22:INCDPTR
DJNZR7,FINDB21
DJNZR6,FINDB21
MOVA,#0FFH
RET
;双字节字符串顺序查找程序
;入口:R0,R1,R3,R4,R7
;占用资源:ACC,B
;堆栈需求:2字节
;出口:R0,R1,A
FINDS1:MOVDPL,R1
MOVDPH,R0
FINDS11:MOVXA,@DPTR
INCDPTR
CLRC
SUBBA,R4
JNZFINDS12
MOVXA,@DPTR
SUBBA,R3
JNZFINDS12
MOVA,DPL
CLRC
SUBBA,#01H
MOVR1,A
MOVA,DPH
SUBBA,#00H
MOVR0,A
CLRA
RET
FINDS12:DJNZR7,FINDS11
MOVA,#0FFH
RET
;双字节字符串顺序查找程序
;入口:R0,R1,R3,R4,R6,R7
;占用资源:ACC,B
;堆栈需求:2字节
;出口:R0,R1,A
FINDS2:MOVDPL,R1
MOVDPH,R0
MOVA,R7
JZFINDS21
INCR6
FINDS21:MOVXA,@DPTR
INCDPTR
CLRC
SUBBA,R4
JNZFINDS22
MOVXA,@DPTR
SUBBA,R3
JNZFINDS22
MOVA,DPL
CLRC
SUBBA,#01H
MOVR1,A
MOVA,DPH
SUBBA,#00H
MOVR0,A
CLRA
RET
FINDS22:DJNZR7,FINDS21
DJNZR6,FINDS21
MOVA,#0FFH
RET
;N字节字符串顺序查找程序
;入口:ADDPH,ADDPL,R0,R6,R7,N
;占用资源:ACC,B,R2,NCNT
;堆栈需求:2字节
;出口:ADDPH,ADDPL,A
FINDN:MOVA,R0
MOVR2,A
MOVA,ADDPL
MOVDPL,A
MOVA,ADDPH
MOVDPH,A
MOVA,R7
JZFINDN1
INCR6
FINDN1:MOVA,R2
MOVR0,A
MOVA,N
MOVNCNT,A
FINDN2:MOVXA,@DPTR
CLRC
SUBBA,@R0
JNZFINDN3
INCDPTR
INCR0
DJNZNCNT,FINDN2
MOVA,DPL
CLRC
SUBBA,N
MOVADDPL,A
MOVA,DPH
SUBBA,#00H
MOVADDPH,A
CLRA
RET
FINDN3:CLRC
MOVA,R0
SUBBA,R2
JNZFINDN4
INCDPTR
FINDN4:DJNZR7,FINDN1
DJNZR6,FINDN1
MOVA,#0FFH
RET
;单字节最值查找程序
;入口:R0,R1,R6,R7
;占用资源:ACC,B
;堆栈需求:2字节
;出口:R0(最大值),R1(最小值),R2,R3,R4,R5
FMAMIB:MOVDPL,R1
MOVDPH,R0
MOVXA,@DPTR
MOVR0,A
MOVR1,A
MOVA,DPL
MOVR3,A
MOVR5,A
MOVA,DPH
MOVR2,A
MOVR4,A
MOVA,R7
JZFMMB1
INCR6
FMMB1:MOVXA,@DPTR
MOVB,A
SETBC
SUBBA,R0
JCFMMB2
MOVR0,B
MOVR3,DPL
MOVR2,DPH
SJMPFMMB3
FMMB2:MOVA,B
CLRC
SUBBA,R1
JNCFMMB3
MOVR1,B
MOVR5,DPL
MOVR4,DPH
FMMB3:INCDPTR
DJNZR7,FMMB1
DJNZR6,FMMB1
RET
;浮点数顺序查找程序
;入口:R0,R1,R2,R3,R4,R6,R7
;占用资源:B,NCNT,FCMP
;堆栈需求:2字节
;出口:R0,R1,A
FINDF:MOVDPL,R1
MOVDPH,R0
MOVA,R7
MOVB,A
MOVNCNT,R6
JZFINDF1
INCNCNT
FINDF1:MOVXA,@DPTR
INCDPTR
MOVR5,A
MOVXA,@DPTR
INCDPTR
MOVR6,A
MOVXA,@DPTR
INCDPTR
MOVR7,A
LCALLFCMP
JNZFINDF2
MOVA,DPL
CLRC
SUBBA,#03H
MOVR1,A
MOVA,DPH
SUBBA,#00H
MOVR0,A
CLRA
RET
FINDF2:DJNZB,FINDF1
DJNZNCNT,FINDF1
MOVA,#0FFH
RET
;浮点数最值查找程序
;入口:ADDPH,ADDPL,R6,R7
;占用资源:ACC,B,NCNT,ITEMOV,EBMOV,MOVB,MOVR1,FCMP
;堆栈需求:5字节
;出口:[R0](最大值),[R1](最小值),R2,R3,R4,R5
FMAMIF:MOVA,ADDPL
MOVR3,A
MOVR5,A
MOVDPL,A
MOVA,ADDPH
MOVR2,A
MOVR4,A
MOVDPH,A
MOVB,R7
MOVR7,#03H
LCALLITEMOV
MOVR7,#03H
LCALLIBMOV
MOVA,B
JZFMMF1
INCNCNT
FMMF1:PUSHB
MOVXA,@DPTR
INCDPTR
MOVR2,A
MOVXA,@DPTR
INCDPTR
MOVR3,A
MOVXA,@DPTR
INCDPTR
MOVR4,A
LCALLMOVR1
LCALLFCMP
JNCFMMF2
MOVA,R0
XCHA,R1
MOVR0,A
LCALLMOVB
MOVR5,DPL
MOVR4,DPH
MOVA,R0
XCHA,R1
MOVR0,A
SJMPFMMF3
FMMF2:MOVA,R0
XCHA,R1
MOVR0,A
LCALLMOVR1
LCALLFCMP
MOVA,R0
XCHA,R1
MOVR0,A
JZFMMF3
JCFMMF3
LCALLMOVB
MOVR3,DPL
MOVR2,DPH
FMMF3:POPB
DJNZB,FMMF1
DJNZNCNT,FMMF1
RET
;单字节折半查找程序
;入口:A,R0,R1,R6,R7
;占用资源:B,R2
;堆栈需求:2字节
;出口:R0,R1
SEARCHB:MOVB,A
MOVA,R1
ADDA,R7
MOVR7,A
MOVA,R0
ADDCA,R6
MOVR6,A
MOVA,R7
SUBBA,#01H
MOVR7,A
JNCSECH1
DECR6
SECH1:MOVA,R7
CLRC
SUBBA,R1
MOVA,R6
SUBBA,R0
JNCSECH2
MOVA,#0FFH
RET
SECH2:MOVA,R7
ADDA,R1
MOVR2,A
MOVA,R6
ADDCA,R0
RRCA
MOVDPH,A
MOVA,R2
RRCA
MOVDPL,A
MOVXA,@DPTR
CLRC
SUBBA,B
JNCSECH3
INCDPTR
MOVR0,DPH
MOVR1,DPL
SJMPSECH1
SECH3:JZSECH5
MOVA,DPL
SUBBA,#01H
MOVR7,A
JNCSECH4
MOVR6,DPH
DECR6
SECH4:SJMPSECH1
SECH5:MOVR0,DPH
MOVR1,DPL
CLRA
RET