.TITLE CVIS ; .MACRO .CVIS I,S,R ;CONVERT INTEGER I TO STRING S USING RADIX R. ;16/6/6 DIGITS PRODUCED FOR RADIX 2/8/10. DIGITS RIGHT-JUSTIFIED .GLOBL .CVIS R: .BLKW 1 ;RADIX S: .BLKW 1 ;ADDRESS OF STRING I: .BLKW 1 ;INTEGER .CVIS: MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) MOV S,R2 ;R2=STRING POINTER ;DO TABLE LOOKUP OF NUMBER OF CHAR; 6 FOR RADIX 8 & 10; 16. CHAR FOR RADIX 2 MOV R,R1 ADD TABLE(R1),R2 ;R2 POINTS 1 BYTE BEYOND LAST BYTE OF STRING CLRB (R2) ;0 BYTE TERMINATES STRING MOV S,R1 ;FILL BUFFER WITH SPACES LOOPSP: MOVB #40,(R1)+ CMP R1,R2 BLO LOOPSP MOV I,R0 BEQ ZZ ;PUT OUT ZERO STRING IF I=0 CMP R,#10. ;FOR RADIX 10. ONLY, KEEP TRACK OF SIGN BNE CHOP ;BINARY & OCTAL NOS. TREATED AS UNSIGNED TST R0 BGE CHOP NEG R0 ;MAKE R0 POSITIVE CHOP: MOV R0,R1 CLR R0 DIV R,R0 ;R1=REMAINDER=LEAST SIGNIF DIGIT ADD #60,R1 ;CONVERT NUMBER INTO ASCII CHAR MOVB R1,-(R2) ;STORE CHAR IN BUFFER; AUTODEC TST R0 ;IF R0=0, WE DONE BNE CHOP CMP R,#10. ;TYPE MINUS CHAR FOR RADIX=10 ONLY BNE RETUR TST I BGE RETUR MOVB #'-,-(R2) BR RETUR ZZ: MOVB #'0,-(R2) ;MOVE 0 CHAR INTO STRING RETUR: MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 RETURN TABLE: .WORD 0,16.,0,0,6,6 .END