; CFDIV VERSION 2.0 0945 16-OCT-79 ; CORAL FLOATING DIVIDE C86CODE SEGMENT BYTE PUBLIC ASSUME CS:C86CODE PUBLIC C@FIDIV C@FIDIV PROC NEAR PUSH BP ;SET UP LOCAL FRAME MOV BP,SP CMP DX,[BP+6] ;RETURN 1.0 IF EQUAL OPERANDS JNE ZER1 ; NOT EQUAL CMP AX,[BP+4] ; LS HALVES JNE ZER1 ; NOT EQUAL MOV DX,8100H ZERAX LABEL NEAR MOV AX,0000H CLEARUP LABEL NEAR POP BP ;RESTORE FRAME POINTER RET 4 ;RETURN ZER1 LABEL NEAR CMP DX,0 ;DIVISOR ZERO? JNE ZER2 CMP AX,0 JNE NOTBY0 ; ;MAXIMUM RESULT MOV AX,0FFFFH MOV DX,[BP+6] ;TAKING SIGN OF OPERAND-1 OR DX,0FF7FH JMP CLEARUP ZER2 LABEL NEAR CMP WORD PTR [BP+6],0 ;DIVIDEND ZERO? JNE NOTBY0 ; NOT ZERO CMP WORD PTR [BP+4],0 ; LS HALF JNE NOTBY0 MOV DX,0 ;RESULT 0.0 JMP ZERAX ; NOTBY0 LABEL NEAR MOV CL,[BP+7] ;EXPONENT-1 MOV CH,0 ;WIDEN MOV BL,DH ;EXPONENT-2 MOV BH,CH ;WIDEN SUB BX,128 ;REMOVE EXCESS 128 SUB CX,BX ;RESULT EXPONENT PUSH CX ;SAVE IT MOV BX,DX ;COPY FOR SIGN XOR BX,[BP+6] ;FORM RESULT SIGN PUSH BX ;SAVE IT MOV BX,[BP+6] ;OPERAND-1 MS AND BX,7FH ;CLEAR EXPONENT BITS OR BL,80H ;SET HIDDEN 2**-1 MOV CX,[BP+4] ;OPERAND-1 LS MOV WORD PTR[BP+6],0 ;CLEAR FOR RESULT MOV WORD PTR[BP+4],0 AND DX,7FH ;CLEAR OPERAND-2 EXPONENT OR DL,80H ;SET HIDDEN 2**-1 PLOOP LABEL NEAR CMP BX,0 ;LOOK FOR PREVIOUS OVERFLOW JGE SUBTRCT ADD CX,AX ADC BX,DX JMP PTEST SUBTRCT LABEL NEAR SUB CX,AX SBB BX,DX PTEST LABEL NEAR JL OVER OR WORD PTR[BP+4],1 ;CONTRIBUTION TO RESULT OVER LABEL NEAR SHL WORD PTR[BP+4],1 RCL WORD PTR[BP+6],1 SHR DX,1 ;SHIFT DIVISOR RCR AX,1 CMP AX,0 ;STOP WHEN DIVISOR EXHAUSTED JNE PLOOP CMP DX,0 JNE PLOOP POP BX ;RESULT SIGN AND BL,80H ;CLEAN UP POP CX ;RESULT EXPONENT MOV AX,[BP+4] ;ANSWER LS MOV DX,[BP+6] ;ANSWER MS MANTISSA BITS CMP DH,0 ;COULD NEED ONE BIT RIGHT SHIFT JE SIGNEXP SHR DX,1 RCR AX,1 CMP CX,255 ;CHECK IF EXPONENT HAS ROOM JL INCEXP OFLO LABEL NEAR MOV AX,0FFFFH ;OVERFLOW MAX ANSWER WITH MOV DX,0FF7FH ; CORRECT SIGN SIGN LABEL NEAR AND DL,7FH ;CLEAR ASSUMED 2**-1 OR DL,BL JMP CLEARUP INCEXP LABEL NEAR ;COMPENSATE EXPONENT FOR SHIFT INC CX SIGNEXP LABEL NEAR MOV DH,CL ;INSERT EXPONENT CMP CX,255 ;CHECK FOR EXPONENT OVERFLOW JG OFLO JMP SIGN C@FIDIV ENDP C86CODE ENDS END