Divide 32 bit on 16 bit
07.02.2025
smalest code
    ; Input: 32-bit Dividend in DIVIDEND3:DIVIDEND0
    ;        16-bit Divisor in DIVISORH:DIVISORL
    ; Output: 32-bit Quotient in QUOTIENT3:QUOTIENT0
    ;         16-bit Remainder in REMAINDERH:REMAINDERL

    ; Initialize Remainder and Quotient
    CLRF    REMAINDERH      ; Clear Remainder (high byte)
    CLRF    REMAINDERL      ; Clear Remainder (low byte)
    CLRF    QUOTIENT3       ; Clear Quotient (MSB)
    CLRF    QUOTIENT2       ; Clear Quotient
    CLRF    QUOTIENT1       ; Clear Quotient
    CLRF    QUOTIENT0       ; Clear Quotient (LSB)

    ; Loop counter for 32 bits
    MOVLW   32              ; 32 iterations for 32-bit division
    MOVWF   COUNT           ; Store loop counter

DIVIDE_LOOP:
    ; Shift left the Dividend and Quotient
    RLNCF   DIVIDEND0, F    ; Shift left DIVIDEND0, LSB into Carry
    RLNCF   DIVIDEND1, F    ; Shift left DIVIDEND1
    RLNCF   DIVIDEND2, F    ; Shift left DIVIDEND2
    RLNCF   DIVIDEND3, F    ; Shift left DIVIDEND3
    RLNCF   QUOTIENT0, F    ; Shift left QUOTIENT0
    RLNCF   QUOTIENT1, F    ; Shift left QUOTIENT1
    RLNCF   QUOTIENT2, F    ; Shift left QUOTIENT2
    RLNCF   QUOTIENT3, F    ; Shift left QUOTIENT3

    ; Shift left the Remainder with Carry
    RLNCF   REMAINDERL, F   ; Shift left REMAINDERL
    RLNCF   REMAINDERH, F   ; Shift left REMAINDERH

    ; Subtract Divisor from Remainder
    MOVF    DIVISORL, W     ; Load Divisor (low byte)
    SUBWF   REMAINDERL, F   ; Subtract from Remainder (low byte)
    MOVF    DIVISORH, W     ; Load Divisor (high byte)
    SUBWFB  REMAINDERH, F   ; Subtract with borrow from Remainder (high byte)

    ; Check if Remainder >= 0
    BNC     REMAINDER_NEG   ; If Carry is clear, Remainder is negative

    ; Remainder is positive, set LSB of Quotient
    BSF     QUOTIENT0, 0    ; Set LSB of Quotient
    BRA     NEXT_ITERATION  ; Continue to next iteration

REMAINDER_NEG:
    ; Remainder is negative, restore it by adding Divisor back
    MOVF    DIVISORL, W     ; Load Divisor (low byte)
    ADDWF   REMAINDERL, F   ; Add to Remainder (low byte)
    MOVF    DIVISORH, W     ; Load Divisor (high byte)
    ADDWFC  REMAINDERH, F   ; Add with carry to Remainder (high byte)

NEXT_ITERATION:
    ; Decrement loop counter and check if done
    DECFSZ  COUNT, F        ; Decrement COUNT, skip if zero
    BRA     DIVIDE_LOOP     ; Repeat for next bit

    ; Division complete
    ; Quotient is in QUOTIENT3:QUOTIENT0
    ; Remainder is in REMAINDERH:REMAINDERL