; ******************* DIVIDE SUBROUTINE ******************* ; PERFORMS AN UNSIGNED DIVIDE OF 16 BITS BY 8-BIT DIVISOR. ; ; DIVISION IS REPEATED SUBTRACTION. ; DIVIDEND / DIVISOR = QUOTIENT + REMAINDER. ; ; ENTRY: (HL) = DIVIDEND. ; (E) = DIVISOR. ; ; EXIT: (HL) = QUOTIENT. ; (BC) = REMAINDER. ; ALL REGISTERS SAVED EXCEPT HL, BC. ; **************************************************** .ORG 0000h LD SP, 0080h ; ADDED FOR TESTING PURPOSES. LD HL, 0FFF2h ; ADDED FOR TESTING PURPOSES. LD DE, 0008h ; ADDED FOR TESTING PURPOSES. LD BC, 0000h ; ADDED FOR TESTING PURPOSES. CALL DIVIDE ; ADDED FOR TESTING PURPOSES. HALT ; ADDED FOR TESTING PURPOSES. DIVIDE: PUSH DE ; DIVISIOR. PUSH IX PUSH HL ; DIVIDEND. POP IX ; HL POPPED TO IX. DIVIDEND TO IX. LD HL, 0 ; ZERO OUT HL. LD D, 0 ; DIVISOR IN DE. LD B, 16 ; ITERATION COUNT. DIV001: ADD HL, HL ; SHIFT 16 MS BITS. ADD IX, IX ; SHIFT 16 LS BITS. JP NC, DIV002 ; GO IF NO CARRY. INC HL ; CARRY T0 16 MS BITS. DIV002: INC IX ; SET Q BIT. OR A ; CLEAR CARRY. SBC HL, DE ; TRY SUBTRACT. JP NC, DIV003 ; GO IF DIVIDE WENT. ADD HL, DE ; RESTORE. DEC IX ; RESET Q BIT. DIV003: DJNZ DIV001 ; GO IF NOT 16 ITERATIONS. PUSH HL ; REMAINDER. POP BC PUSH IX ; QUOTIENT. POP HL POP IX ; RESTORE REGISTERS. POP DE RET ; RETURN .END