jak udelat _cislo_ MOD 7 ?

Snail Instruments snail
Středa Březen 17 11:51:44 CET 2004


>nenapada vas nejaky elegantni algoritmus jak udelat _WORD_ MODULO 7, kdyz
>mam k dispozici jen + - a rotace?

Otazka je, v cem tkvi ta elegance - ma to byt kratke, rychle, bezpracne,
univerzalni nebo jake? Ja pouzivam velice sikovnou rutinu na deleni
16bitoveho delence 7bitovym delitelem, mozna by sla adaptovat i na '51, i
kdyz ponekud omezene moznosti rotace vyzaduji neustale presuny promennych
sem-tam a zase zpatky, ale treba se to nekomu podari zefektivnit.

Pokud se deli konstantou, muze se samozrejme nahradit promenna v registru
konkretnim cislem.

; ------------------------------
; UNSIGNED DIVIDE
; AARG1,2 =/ TEMP0
; 179 CYCLES
; ------------------------------
UDIVW:	MOVLW	D'16'
	MOVWF	TEMP1
	CLRF	TEMP2
FXDU0:	RLF	AARG2,W
	RLF	AARG1,F
	RLF	TEMP2,F
	MOVF	TEMP0,W
	SUBWF	TEMP2,W
	BTFSC	_C
	MOVWF	TEMP2
	RLF	AARG2,F
	DECFSZ	TEMP1,F
	GOTO	FXDU0
	MOVF	TEMP2,W

; ------------------------------
; UNSIGNED DIVIDE
; R1,2 =/ R3
; 307-323 CYCLES :-(
; ------------------------------
; AARG1,2 - R1,2
; TEMP0 - R3
; TEMP1 - R4
; TEMP2 - R5
; ------------------------------
UDIVA:	MOV	R4,#16
	MOV	R5,#0
FXDU0:	MOV	A,R2
	RLC	A
	MOV	A,R1
	RLC	A
	MOV	R1,A
	MOV	A,R5
	RLC	A
	MOV	R5,2
	MOV	A,R5
	CLR	C
	SUBB	A,R3
	CPL	C
	JNC	FXDU1
	MOV	R5,A
FXDU1:	MOV	A,R2
	RLC	A
	MOV	R2,A
	DJNZ	R4,FXDU0
	MOV	A,R5

J. Hanzal








Další informace o konferenci Hw-list