.TITLE ITOS .IDENT /830228/ ; PROCEDURE ITOS(N:INTEGER; VAR DST:STRING; BASE:INTEGER; SIGN:BOOLEAN; MAX_LENGTH:INTEGER); EXTERNAL; ; ; CONVERTS A 16 BIT BINARY NUMBER INTO A STRING OF DIGITS IN THE SPECIFIED BASE ; ;REGISTER USAGE: R0 - POINTER TO STRING ; R1 - MAXIMUM STRING LENGTH ; R2,R3 - NUMBER ; R4 - BASE ; R5 - SIGN .PSECT ITOS:: MOV (SP)+,R0 ;RETURN ADDRESS MOV (SP),-(SP) ;MAXIMUM LENGTH MOV SP,R1 TST (R1)+ MOV R5,(R1)+ MOVB (R1),R5 ;SIGN MOV R4,(R1)+ MOV (R1),R4 ;BASE MOV R2,(R1)+ MOV (R1),R2 ;STRING MOV R3,(R1)+ MOV (R1),R3 ;NUMBER MOV R0,(R1) ;MOVE UP RETURN ADDRESS MOV R2,R0 ;POINTER IN R0 MOV (SP)+,R1 ;MAXIMUM LENGTH ; MOV R0,-(SP) ;SAVE FOR LATER REVERSAL CLRB (R0)+ ;MARK END OF STRING TST R1 BLE 5$ ;MAXIMUM LENGTH TOO SMALL ; CMP R4,#2 ;CHECK THE BASE BLO 5$ CMP R4,#36. BHI 5$ ; TSTB R5 ;CHECK THE SIGN BEQ 2$ TST R3 ;SIGN WANTED, SIGN NEEDED ? BMI 1$ CLRB R5 ;NO BR 2$ 1$: NEG R3 ;YES ; 2$: CLR R2 ;CLR HI-ORDER WORD DIV R4,R2 ;DO THE DIVISION CMP R3,#9. ;CHECK IF DIGIT LIES IN RANGE A-Z BLOS 3$ ADD #'A-'9-1,R3 ;YES, ADD OFFSET 3$: ADD #'0,R3 ;MAKE ASCII MOVB R3,(R0)+ ;PUT IN STRING BACKWARDS MOV R2,R3 ;MOVE BACK QUOTIENT BEQ 4$ ;FINISHED SOB R1,2$ ; TSTB R5 ;NO MORE ROOM BEQ 5$ MOVB #'-,-1(R0) ;SQUEEZE IN SIGN BR 5$ ; 4$: TSTB R5 BEQ 5$ MOVB #'-,(R0)+ ;PUT IN SIGN ; 5$: MOV (SP)+,R1 ;START OF STRING 6$: MOVB (R1),R4 ;SWAP AND REVERSE MOVB -(R0),(R1)+ MOVB R4,(R0) CMP R1,R0 BLO 6$ ;LOOP UNTIL ALL REVERSED ; MOV (SP)+,R5 MOV (SP)+,R4 MOV (SP)+,R2 MOV (SP)+,R3 RTS PC .END