Jag har kommenterat så att det förhoppningsvis går att förstå hur den fungerar. Men fungerar gör den.
Kanske det hjälper någon annan med behov.
Kod: Markera allt
;**************Test**************************
DIV_X_Y
; Dividerar TEMPX8/TEMPY8 resultat i RESULT8
; Register:
; TEMPX8 ; Täljaren
; TEMPY8 ; Nämnaren
; RESULT8 ; Resultat
; IDX16 ; Basindex
MOVF TEMPY8,F ; Uppdaterar Z-flagga i STATUS
BTFSC STATUS,Z ;
RETURN ; Om nämnaren är noll så ...
CLRF RESULT8 ; Rensa resultatregistret
MOVLW 1
MOVWF IDX16 ; Ladda in 1 i IDX16
SHIFT_IT8
BTFSC TEMPY8,7 ; Skifta nämnaren och basindex vänster
GOTO DIVU8LOOP ; tills MSb i nämnaren är satt
BCF STATUS,C ; Nolla C
RLF IDX16,F ; Rotera basindex vänster
BCF STATUS,C ; Nolla C
RLF TEMPY8,F ; Rotera nämnaren vänster
GOTO SHIFT_IT8 ; På igen
DIVU8LOOP
MOVF TEMPY8,W ; Lägg in den modifierade nämnaren i W
SUBWF TEMPX8, F ; Dra ifrån den modifirade nämnaren från täljaren
BTFSC STATUS,C ; Om reultatet blir ...
GOTO COUNT8 ; ... positivt, lägg basindex till resultatet
ADDWF TEMPX8, F ; ... negativt, lägg den modifierade nämnaren till täljaren
GOTO FINAL8
COUNT8
MOVF IDX16,W ; Positivt, lägg basindex till resultatet
ADDWF RESULT8, F
FINAL8 ; Rotera tillbaka nämnare och basindex
BCF STATUS,C ; Nolla C
RRF TEMPY8,F ; Rotera tillbaka nämnaren
BCF STATUS,C ; Nolla C
RRF IDX16,F ; Rotera tillbaka basindex
BTFSS STATUS,C ; När 1:an i basindex åker ut i C så är vi färdiga
GOTO DIVU8LOOP ; Fortsätt tills basindex = 1
RETURN ; Klart
;**************!Test*************************