MDU16硬件乘/除移位指令
- $NOMOD51
-
- NAME UIDIV
-
- /**********************************************************************************************
- * int R6R7 uidiv(int R6R7, int R4R5); 出口:余数int R4R5
- * result = value1 / value2
- * 16位/16位-->16位(无符号二进制除法)
- * R6R7 = R6R7 / R4R5 (出口:余数R4R5)
- * note: if value2 ==0 , result = value1;
-
- * 用 途 :STC8系列MCU
- * 作 者 :许意义
- * 版 本 :2.00
- * 日 期 :2022-12-12
-
- **********************************************************************************************/
-
- CLR_EA MACRO
- MOV C, EA
- CLR EA
- PUSH P_SW2
- ORL P_SW2,#0x80
- ENDM
-
- SETB_EA MACRO
- POP P_SW2
- MOV EA, C
- ENDM
-
- LD_MD MACRO BYTE_X, INC_DPTR
- MOV A,BYTE_X
- MOVX @DPTR,A
- IF INC_DPTR
- INC DPTR
- ENDIF
- ENDM
-
- ST_MD MACRO BYTE_X, INC_DPTR
- MOVX A,@DPTR
- MOV BYTE_X,A
- IF INC_DPTR
- INC DPTR
- ENDIF
- ENDM
-
- WAIT MACRO
- MOV A,#0x01
- MOVX @DPTR,A
- MOVX A,@DPTR
- JB ACC.0,$-1
- ENDM
-
- //NOMOD51 SET (SMALL) DEBUG EP
- //SET (SMALL) DEBUG EP
- ; 特殊功能寄存器和位
- P_SW2 DATA 0BAH ; Bit7: EAXFR
- ACC DATA 0E0H
- B DATA 0F0H
- PSW DATA 0D0H
- SP DATA 81H
- DPL DATA 82H
- DPH DATA 83H
- IE DATA 0A8H
- OV BIT 0D0H.2
- P BIT 0D0H.0
- F0 BIT 0D0H.5
- F1 BIT 0D0H.1
- RS1 BIT 0D0H.4
- RS0 BIT 0D0H.3
- AC BIT 0D0H.6
- CY BIT 0D0H.7
- EA BIT 0A8H.7
- ; MODE[2:0]= 1, 右移(clock:3-18); MODE[2:0]= 2, 左移(clock:3-18); MODE[2:0]= 3, 数据规格化(clock:3-20)
- ; MODE[2:0]= 4, 16位乘法(clock:10); MODE[2:0]= 5, 16位除法(clock:9); MODE[2:0]= 6, 32位/16位(clock:17)
- ARCON DATA 0FCF6H ; Bit[7:5]: MODE[2:0], Bit[4:0]: SC[4:0]
- OPCON DATA 0FCF7H ; Bit6: MDOV, Bit1: RST, Bit0: ENOP
- MD3 DATA 0FCF0H
- MD2 DATA 0FCF1H
- MD1 DATA 0FCF2H
- MD0 DATA 0FCF3H
- MD5 DATA 0FCF4H
- MD4 DATA 0FCF5H
-
-
- ?PR?_UIDIV?UIDIV SEGMENT CODE
- PUBLIC ?C?UIDIV
- RSEG ?PR?_UIDIV?UIDIV
-
- ?C?UIDIV:
- CLR_EA
- MOV DPTR, #MD1
- LD_MD R6, +1
- LD_MD R7, +1
- LD_MD R4, +1
- LD_MD R5, +1
- // MOV DPTR,#ARCON
- LD_MD #0xA0, +1 // 16位/16位除法(clock:9)
- WAIT
- MOV DPTR, #MD1
- ST_MD R6, +1
- ST_MD R7, +1
- ST_MD R4, +1
- ST_MD R5, 0
- SETB_EA
- RET
-
- END
复制代码
|