.TITLE TOASCI .PSECT UTILS ; OCTAL TO ASCII AND INTEGER TO ASCII CONVERSION. ; CALLING SEQUENCE: ; PUSH ASCII FIELD START (ADRS) ; PUSH FIELD LENGTH (# CHARS) ; PUSH VALUE TO BE CONVERTED ; JSR PC,OCTASC (OR INTASC) ; ERROR WILL RETURN WITH THE C BIT SET. DECTBL: .WORD 10000.,1000.,100.,10.,0 OCTABL: .WORD 100000,10000,1000,100,10,0 ; OFFSETS TO ARGUMENTS ON THE STACK. TO... FLDSTR = 16. ;...ASCII FIELD START,... FLDLEN = 14. ;...FIELD LENGTH,... VALUE = 12. ;...AND VALUE TO CONVERT. OCTASC::;ENTRY POINT IF CONVERTING OCTAL TO ASCII. MOV R0,-(SP) ;SAVE RO. MOV #OCTABL,R0 ;POINT TO OCTAL TABLE. .enable LSB BR 5$ INTASC::;ENTRY POINT IF CONVERTING INTEGER TO ASCII. MOV R0,-(SP) ;SAVE R0. MOV #DECTBL,R0 ;POINT TO DECIMAL TBL. 5$: .DSABLE LSB MOV R1,-(SP) ;SAVE R1... MOV R2,-(SP) ;...R2... MOV R3,-(SP) ;...R3... MOV R4,-(SP) ;...AND R4. MOV FLDSTR(SP),R3 ;GET FIELD START. MOV FLDLEN(SP),R2 ;GET FIELD LENGTH. BGE 10$ ;BR IF LENGTH NOT NEG. CLR R2 ;IF NEGATIVE, MAKE... CLR FLDLEN(SP) ;...IT'S LENGTH ZERO. 10$: MOV VALUE(SP),R4 ;GET VALU TO BE CONVRTD. MOV #' ,-(SP) ;CLEAR SIGN TO SPACE. CMP R0,#OCTABL ;WORKING OCTAL? BEQ 15$ ;YES... ;NO. WE'RE WORKING DECIMAL. TST R4 ;IS THE VALUE POSITIVE? BGE 15$ ;YES... NEG R4 ;NO. MAKE IT ABSOLUTE. MOV #'-,@SP ;BUT SAVE MINUS SIGN. 15$: CLR -(SP) ;SAVE THE FENCE. 20$: TST @R0 BEQ 40$ ;BR IF ALL POWERS DONE. CLR R1 25$: SUB @R0,R4 ;SEE IF CURRENT POWER ;WILL GO AGAIN. BLO 30$ ;IT WONT. INC R1 ;IT WILL. BUMP DIG 1. BR 25$ 30$: ADD (R0)+,R4 ;TOO MUCH. BACK UP. TST R1 BNE 35$ ;BR IF DIGIT NOT ZERO. TST @SP BEQ 20$ ;BR IF NO NON-ZERO DIGS ;YET. 35$: ADD #60,R1 ;CONVERT DIG TO ASCII. MOV R1,-(SP) BR 20$ 40$: ADD R2,R3 ;POINT TO FIELD END. ADD #60,R4 ;LEAST SIG DIG TO ASCI. MOVB R4,-(R3) 45$: DEC R2 BLE 55$ ;BR IF COUNT EXHAUSTED. MOVB (SP)+,-(R3) ;MOVE DIGIT. BNE 45$ ;BR IF NOT THE FENCE. MOVB (SP)+,@R3 ;MOVE OUT THE SIGN. 50$: DEC R2 BEQ 75$ ;BR IF FIELD FILLED. MOVB #' ,-(R3) ;MOV IN LEADING BLANKS. BR 50$ 55$: TST (SP)+ BNE 60$ ;NBR TOO BIG FOR FIELD. CMP #' ,(SP)+ BNE 65$ ;BR IF NO ROOM FOR "-". BR 75$ 60$: ;OOPS! WE'VE ENCOUNTERED AN ERROR! TST (SP)+ BNE 60$ TST (SP)+ ;FLUSH SIGN. 65$: MOV FLDSTR(SP),R3 ;POINT TO FIRST POSITION ;IN DESTINATION FIELD. 70$: ;FILL DEST FIELD WITH "*", INDICATING ERROR. MOVB #'*,(R3)+ ;PUT ONE "*" IN PLACE. DEC FLDLEN(SP) ;ONE MORE "*" IN PLACE. BGT 70$ ;BR IF MORE TO DO. COM FLDLEN(SP) ;MAKE RDY TO SET C BIT. 75$: MOV (SP)+,R4 ;RESTORE R4... MOV (SP)+,R3 ;...R3... MOV (SP)+,R2 ;...R2... MOV (SP)+,R1 ;...R1... MOV (SP)+,R0 ;...AND R0. MOV (SP)+,4(SP) ;MOVE RETURN ADRS UP. TST (SP)+ ;WE'RE DONE W/VALUE ARG. ROL (SP)+ ;ADV PAST STACK PLACE ;FOR FLDLEN AND SET C ;BIT, IF ERROR. RETURN ;RETURN TO CALLER. .END