;; ;;*************************************************** ;;*************************************************** ;;MACRO :DHLDEBYBC ;;PURP :DIVIDE HLDE BY BC ;;ENTRY :HL=DIVIDEND HIGH WORD,DE=DIVIDEND LOW WORD ;; :BC=DIVISOR ;;EXIT :HL=QUOTIENT,DE=REMAINDER ;; :IF BC=0 THEN ERROR=ZERODIVISOR ;; :NOTE THE QUOTIENT MUST BE BETWEEN 0,65535 ;; : EXAMPLE: 70000/1 IS ILLEGAL BUT 70000/2 IS LEGAL ;;USED :ALL ;;CALLS :@DHLDEBYBC ;;MACROS:NEGBC ;;********************************************************** ;; DHLDEBYBC MACRO LOCAL PASTSUB,NEXTBIT,CONT,DIV0,DIV1,DIV2,DIV3 ;; JMP PASTSUB ;; @DHLDEBYBC: MOV A,C ORA B JNZ CONT0 ;;JIF NOT ZERO ;;ELSE ERROR EXIT RET ;; CONT0: ;;DIVISOR<>0 MOV A,B CMA MOV B,A MOV A,C CMA MOV C,A INX B ;;TAKE NEGATIVE OF BC SO DAD B WILL ;;SET HL=HL-BC MVI A,17 ;;16 BITS + 1 NEXTBIT: DCR A JNZ CONT1 ;;JIF NOT DONE ;;ELSE EXIT XCHG ;;HL=QOUTIENT,DE=REMAINDER RET ;; ;;NOT DONE ;;SHIFT HL LEFT CY=BIT 15 CONT1: DAD H JC DIV2 ;;JIF BIT 15=1 ;; ;;SHIFT DE LEFT AND INTO HL (HL BIT0=DE BIT 15) XCHG DAD H XCHG ;;DE SHIFTED CY=DE BIT 15 JNC DIV0 ;;JIF BIT15=0 (HL BIT0=0 ALREADY) INR L ;;ELSE SET IT TO 1 ;; ;;IF ABS(BC)>=HL THEN HL=HL-ABS(BC) AND E=E+1 ;;?? DIV0: PUSH H ;;SAVE HL DAD B JC DIV1 ;;JIF ABS(BC) >= HL ;; ELSE GOTO NEXTBIT POP H ;;DISCARD SUBSTRACTION JMP NEXTBIT ;; ;; WELL ABS(BC) < HL SO INR E AND SET HL=HL-ABS(BC) ;; DIV1: INR E INX SP INX SP ;;DROP THE SAVED HL FROM THE STACK JMP NEXTBIT ;; ;; ;;ARRIVE HERE IF NEXTBIT=1 DIV2: XCHG DAD H XCHG ;;SHIFT DE LEFT JNC DIV3 ;;JIF BIT 15=0 INR L ;;ELSE SET BIT0 OF HL=1 ;; ;;NOW HL=HL-ABS(BC) AND E=E+1 DIV3: DAD B INR E JMP NEXTBIT ;;CONTINUE ON ;; ;; PASTSUB: ;; DHLDEBYBC MACRO CALL @DHLDEBYBC ENDM ;; DHLDEBYBC ENDM