;64/64 BIT UNSIGNED DIVISION
;DIVIDEND ->MSB R31...R24 <-LSB
;DIVISOR ->MSB R15...R8 <-LSB
;RESULT ->MSB R31...R24 <-MSB
;REMINDER ->MSB R23:R22:R21:R7:R6:R5:R4:R3 <-LSB

DIV64:
CLR R3			;CLEAR REMINDER LOW BYTES
CLR R4
CLR R5
CLR R6
CLR R7
CLR R21
CLR R22
SUB R23,R23		;AND CARRY
LDI R16,65		;INIT LOOP COUNTER
DIV64_1:
ROL R24			;SHIFT LEFT DIVIDEND
ROL R25
ROL R26
ROL R27
ROL R28
ROL R29
ROL R30
ROL R31
DEC R16			;DECREASE LOOP COUNTER
BREQ Com64
ROL R3			;SHIFT DIVIDEND INTO REMINDER
ROL R4
ROL R5
ROL R6
ROL R7
ROL R21
ROL R22
ROL R23
SUB R3,R8		;REMINDER = REMINDER - DIVISOR
SBC R4,R9
SBC R5,R10
SBC R6,R11
SBC R7,R12
SBC R21,R13
SBC R22,R14
SBC R23,R15
BRCC DIV64_1		;IF RESULT NEGATIVE
ADD R3,R8		;RESTORE REMINDER
ADC R4,R9
ADC R5,R10
ADC R6,R11
ADC R7,R12
ADC R21,R13
ADC R22,R14
ADC R23,R15
RJMP DIV64_1
Com64:
COM R24			;INVERT RESULT
COM R25
COM R26
COM R27
COM R28
COM R29
COM R30
COM R31
RET