start MOVB,>= dvdu,rem,check_mag ; Move upper dividend ; check for &< 0 ADD 0,dvdl,quo ; Move lower dividend always SUB 0,quo,quo ; Get absolute value of SUBB 0,rem,rem ; the dividend in rem,quo check_mag SUBT,= 0,dvr,tp ; Check 0, clear carry, ; negate the divisor ; and trap if dvr = 0 DS 0,tp,0; ; Set V-bit to the complement ; of the divisor sign ADD quo,quo,quo ; Shift msb bit into carry DS,&<< rem,dvr,rem ; 1st divide step, if carry ; out msb of quotient = 0 B,n min_ovfl ; Abs(quotient) > 2**31 ; deal with elsewhere ADDC quo,quo,quo ; Shift quo with/into carry DS rem,dvr,rem ; 2nd divide step ; ... ;repeat divide step sequence ; ... ADDC quo,quo,quo ; Shift quo with/into carry DS rem,dvr,rem ; 31st divide step ADDC quo,quo,quo ; Shift quo with/into carry DS rem,dvr,rem ; 32nd divide step, ADDC quo,quo,quo ; Shift last quo bit into quo ADDB,>=,n rem,0,finish ; Branch if pos. rem ADD,&< dvr,0,0 ; If dvr > 0, add dvr ADD,tr rem,dvr,rem ; for correcting rem. ADDL rem,tp,rem ; Else add absolute value dvr finish ADD,>= dvdu,0,0 ; Set sign of rem SUB 0,rem,rem ; to sign of dividend XOR,>= dvdu,dvr,0 ; Get correct sign of quo SUB 0,quo,quo ; based on operand signs |