.TITLE PROUND -- ROUND AND TRUNC ROUTINES .IDENT /790814/ ;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. ; .PSECT $$$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 MOV SP,R0 MOV (R0),R1 MOV R2,(R0)+ MOV (R0),R2 ;HI-PART OF REAL MOV R3,(R0)+ MOV (R0),R3 ;LO-PART OF REAL MOV R1,(R0)+ CLR (R0) ;ZERO REULT - R0 EVEN ; MOV R2,R1 ;ISOLATE EXPONENT ASL R1 ROR R0 ;REMEMBER SIGN CLRB R1 SWAB R1 ;MOVE EXPONENT INT LO-BYTE SUB #200,R1 BLOS 2$ ;NO INTEGER PART CMP R1,#20 BHIS 3$ ;TOO BIG ; BIC #177400,R2 ;DON'T NEED EXPONENT BIS #200,R2 ;ISOLATE HI-PART OF FRACTION SUB #8.,R1 ;SHIFT IN INTEGER PART ASHC R1,R2 ; ASL R0 ;SEE IF NEGATIVE BCC 1$ NEG R2 1$: MOV R2,(R0) ;RESULT 2$: MOV (SP)+,R2 MOV (SP)+,R3 RTS PC ; 3$: FATAL ; .END