.TITLE P.TCON PASCAL TYPE CONVERSION ROUTINES .PSECT P$TCON .PAGE .SBTTL P$TCIA - INTEGER TO ASCII .GLOBL P$TCIA P$TCIA: ;CONVERTS INTEGER IN R0 ;TO STRING WITH LEADING ZEROS ;SUPPRESSED. IF NEGATIVE, A '-' ;IS PREFIXED. ;REGISTERS ;USES: R0,R1 ;R0 = (SIGNED) INTEGER ;R1 -> BYTE FIELD FOR RESULT ;(UP TO 6 BYTES) ;SETS: R0 ;R0 = LENGTH OF RESULTING ASCII STRING ;DESTROYS: R1,R2,R3 ;R2: DIGIT COUNT ;R3: POINTER TO POWERS OF TEN TABLE ;SAVES AND RESTORES: R4 MOV R4,-(SP) CLR R2 TST R0 BGT WRI1 BEQ WRI8 INC R2 MOVB #'-,(R1)+ ;MINUS SIGN NEG R0 WRI1: CLR R4 MOV PC,R3 ADD #P$WTAB-.,R3 ;ADDRESS POWERS OF TEN TABLE WRI2: SUB (R3),R0 ;SUBTRACT POWER OF TEN FROM INTEGER BLT WRI3 INC R4 BR WRI2 WRI3: ADD (R3)+,R0 ;MAKE INTEGER >= 0 AGAIN TST R4 ;THIS DIGIT A ZERO BEQ WRI2 ;IF YES, KEEP LOOKING FOR SIGNIFICANCE WRI4: ADD #'0,R4 ;FORM DIGIT MOVB R4,(R1)+ ;AND STORE IT AWAY INC R2 ;BUMP DIGIT COUNTER TST (R3) ;IF NOT AT END OF TABLE, MORE DIGITS BEQ WRI9 ;IF NOT GO WRITE THEM OUT CLR R4 ;PREPARE FOR NEXT DIGIT WRI6: SUB (R3),R0 BLT WRI7 INC R4 BR WRI6 WRI7: ADD (R3)+,R0 ;RESTORE INTEGER TO NON-NEGATIVE BR WRI4 WRI8: MOVB #'0,(R1) ;INTEGER WAS ZERO INC R2 WRI9: MOV R2,R0 MOV (SP)+,R4 RTS PC P$WTAB:.WORD 10000.,1000.,100.,10.,1.,0 .END