.TITLE PROUND -- ROUND AND TRUNC ROUTINES .IDENT /800318/ ;ROUND ($$$099) USES R0 AS A SCRATCH REGISTER ;TRUNC ($$$098) DOES NOT USE ANY REGISTERS ; ;BOTH ROUND AND TRUNC EXPECT A REAL VALUE ON TOP ;OF THE STACK AND RETURN AN INTEGER VALUE ON TOP OF ;THE STACK. ; $$$099::;ROUND MOV (SP)+,R0 ;SAVE RETURN ADDRESS CLR -(SP) ;LOWER HALF OF 0.5 MOV #40000,-(SP) ;UPPER HALF OF 0.5 TST 4(SP) ;IS OPERAND NEGATIVE BGE 1$ ;NO BIS #100000,(SP) ;ADD -0.5 IF NEGATIVE 1$: FADD SP ;ADD TO PASSED VALUE TO ROUND ;THE VALUE. MOV R0,-(SP) ;REPLACE RETURN ADDRESS ;FALL INTO TRUNC HERE $$$098::;TRUNC CLR 6(SP) ;CLEAR INTEGER RESULT MOV 2(SP),-(SP) ;COPY HIGH PART OF VALUE BEQ 2$ ;ZERO VALUE BIC #100000,(SP) ;CLEAR SIGN BIT ASL (SP) ;PLACE EXPONENT IN PROPER POSITION SWAB (SP) ;IN LOWER BYTE OF WORD BIS #200,4(SP) ;INSERT HIDDEN BIT IN FRACTION CMPB #200,(SP) ;CHECK IF NUMBER IS A FRACTION BHIS 3$ ;IT IS CMPB #220,(SP) ;CHECK IF OVERFLOW BLE 5$ ;NUMBER IS TOO LARGE 1$: CMPB #200,(SP) ;ARE WE DONE SHIFTING? BEQ 2$ ;YES, FINISH UP ROL 6(SP) ;GET BIT FROM LOW FRACTION INTO CARRY BIT ROLB 4(SP) ;INSERT INTO HIGH FRACTION ;AND GET IT'S HIGH BIT INTO CARRY BIT ROL 10(SP) ;INSERT HIGHEST FRACTION BIT INTO INTEGER RESULT DECB (SP) ;DECREMENT EXPONENT BR 1$ ;REPEAT 5$: MOV #77777,10(SP) ;LARGEST VALUE 2$: TST 4(SP) ;WAS VALUE NEGATIVE? BPL 3$ ;NO TST 10(SP) ;IS RESULT ZERO BEQ 3$ ;YES, DO NOT NEGATE ZERO NEG 10(SP) ;YES, NEGATE RESULT 3$: MOV 2(SP),6(SP) ;GET STACK READY FOR RETURN ADD #6,SP ;;; RTS PC ;RETURN .END