.TITLE QUTNUM - NUMERIC CONVERSION ROUTINES ; ; QUTDPB - PRINT DECIMAL BYTE ; QUTDPT - PRINT DECIMAL WORD ; QUTOPB - PRINT OCTAL BYTE ; QUTOPT - PRINT OCTAL WORD ; ;CALL: ; MOV N,-(SP) ; CALL QUTDPB OR QUTDPT OR QUTOPB OR QUTOPT ; ..ARGUMENT IS POPPED OFF STACK BY ROUTINE ; .MCALL ENTER,LEAVE .MCALL TTYOUT ; ; THE FOLLOWING ROUTINE IS CALLED BY ALL ROUTINES ; TO SAVE REGISTERS, SET UP THE TEMPORARY AREA ; ON THE STACK, AND GET THE VALUE TO BE PRINTED INTO ; R5. R3 IS SET TO THE CONTENTS OF THE ; WORD FOLLOWING THE CALL (USED BY CNVT AS RADIX) ; SETUP: ENTER R1,R2,R3,R4 ;(R5 SAVED BY JSR) MOV (R5)+,R3 ;GET RADIX MOV SP,R1 ;POINT AT TEMPORARY AREA ON STACK MOV R1,R2 ;AND COPY INTO OUTPUT POINTER SUB #6,SP ;AND ADVANCE OVER IT MOV 22(SP),-(SP) ;6+(R1,R2,R3,R4)+(R5)+(PC)+(ARG) RTS R5 ;MANEUVRE ARGUMENT INTO R5 ; ; QUTOPB::CLRB 3(SP) ;CLEAR HIGH BYTE QUTOPT::JSR R5,SETUP ;START THINGS UP .WORD 10 ;OCTAL CALL CNVT ;DO CONVERSION PRINT: MOV R2,R4 ;REMEMBER WHERE WE ARE SUB R1,R2 ;COMPUTE LENGTH NEG R2 ;(WE GO THE OTHER WAY) TTYOUT R4,R2 ;DO OUTPUT MOV R1,SP ;RESTORE STACK TO GET RID OF WORK AREA LEAVE ;RESTORE R1 THROUGH R4 MOV (SP)+,R5 ;AND R5 MOV (SP)+,(SP) ;COMPRESS OVER ARGUMENT RETURN ; ; QUTDPB::CLRB 3(SP) ;CLEAR HIGH BYTE QUTDPT::JSR R5,SETUP .WORD 12 ;DECIMAL RADIX MOVB #'.,-(R2) ;INDICATE BASE CALL CNVT ;DO CONVERSION BR PRINT ;OUTPUT IT ; ; CNVT: CLR R4 ;SET UP FOR DIVIDE DIV R3,R4 ADD #60,R5 ;CONVERT TO ASCII MOVB R5,-(R2) ;STASH AWAY CHARACTER MOV R4,R5 ;FOR NEXT DIVIDE BEQ 1$ ;IF FINISHED, PRINT IMMEDIATELY CALL CNVT ;GO DO NEXT DIGIT 1$: RETURN ; .END