.TITLE $ICO ;INTEGER OUTPUT CONVERSION .IDENT 'GCE876' ; ; CONVERSION ROUTINES FROM DOS FORTRAN LIBRARY ; FOR FMTOUT. ; ; THESE ROUTINES ARE RE-ENTRANT AND POSITION INDEPENDENT. ; .PSECT ICORO,RO ; ; $OCO OCTAL TO ASCII CONVERSION ; $ICO INTEGER TO ASCII CONVERSION ; CALLING SEQUENCE: ; PUSH FIELD START LOCATION ; PUSH FIELD LENGTH ; PUSH VALUE ; JSR PC,$ICO (OR $OCO) ; ERROR WILL RETURN WITH C BIT SET ON ; R0, R1, R2, R3 ARE DESTROYED ; $OCO:: MOV #OCT-REL,R0 ;POINT TO OCTAL TABLE BR GO $ICO:: MOV #DEC-REL,R0 ;POINT TO DECIMAL TABLE GO: MOV R4,-(SP) MOV 8.(SP),R3 ;GET FIELD START MOV 6.(SP),R2 ;GET FIELD LENGTH BGE LPOS ;JUMP IF LENGTH NOT NEG CLR R2 CLR 6(SP) LPOS: MOV 4.(SP),R4 ;GET VALUE TO BE CONVERTED MOV #' ,-(SP) ;CLEAR SIGN CMP R0,#OCT-REL ;CHECK IF DOING OCTAL BEQ POS ;YES, GIVE MAGNITUDE RESULT TST R4 BGE POS ;JUMP IF + NEG R4 ;GET ABSOLUTE VALUE MOV #'-,@SP ;SAVE - POS: CLR -(SP) ;SET FENCE ADD PC,R0 REL: TST: TST @R0 BEQ MOV ;JUMP IF ALL POWERS DONE CLR R1 SUB: SUB @R0,R4 ;SEE IF CURRENT POWER WILL GO AGAIN BLO BACK INC R1 ;BUMP DIGIT BR SUB BACK: ADD (R0)+,R4 ;TOO MUCH, BACK UP TST R1 BNE NZERO ;JUMP IF DIGIT NOT 0 TST @SP BEQ TST ;JUMP IF NO NON-ZERO DIGITS YET NZERO: ADD #60,R1 ;CONVERT TO ASCII MOV R1,-(SP) BR TST MOV: ADD R2,R3 ;POINT TO FIELD END ADD #60,R4 ;CONVERT LEAST SIGNIFICANT DIGIT MOVB R4,-(R3) DECR: DEC R2 BLE FULL ;JUMP IF COUNT EXHAUSTED MOVB (SP)+,-(R3) ;MOVE DIGIT BNE DECR ;JUMP IF NOT THE FENCE MOVB (SP)+,@R3 ;MOVE OUT THE SIGN FILL: DEC R2 BEQ DONE ;JUMP IF FIELD FILLED MOVB #' ,-(R3) ;MOVE IN LEADING BLANKS BR FILL FULL: TST (SP)+ BNE ERROR ;NUMBER TOO BIG FOR FIELD CMP #' ,(SP)+ BNE STARS-4. ;JUMP IF NO ROOM FOR - DONE: MOV (SP)+,R4 MOV (SP)+,4(SP) ;MOVE RETURN UP TST (SP)+ ;FLUSH VALUE ROL (SP)+ ;FLUSH FLAG AND SET C BIT ON IF ERROR RTS PC ERROR: TST (SP)+ BNE ERROR TST (SP)+ ;FLUSH SIGN MOV 8.(SP),R3 STARS: MOVB #'*,(R3)+ ;FILL FIELD WITH * DEC 6(SP) BGT STARS ;JUMP IF MORE TO DO COM 6(SP) ;FLAG ERROR BR DONE ; .PSECT ICORD,RO,D ; DEC: .WORD 10000.,1000.,100.,10.,0 OCT: .WORD 100000,10000,1000,100,10,0 ; .END