.TITLE PREDESESSOR FUNCTION .PSECT PREDESESSOR .GLOBL LEN PRED:: JSR PC,LEN ;GET LENTH OF STRING BPL OKLEN ;IT'S OK RTS PC ;RETURN ERROR OKLEN: MOV 2(R5),R1 ;GET POINTER TO FIRST CHARACTER ADD R1,R0 ;GET POINTER PAST LAST CHARACTER CLR R2 ;ASSUME NUMERIC TO START NEXT: MOVB -(R0),R3 ;GET NEXT CHARACTER TO TEST CMP R0,R1 ;TEST FOR DONE BLT DONE CMPB R3,#'9 ;IS IT A NUMERAL? BGT ALFTST ;NO CMPB R3,#'0 ;PERHAPS... BLT SPACE ;BUT NOT REALLY. BEQ NUMCAR ;DOES IT CARRY? CMPB R3,#'1 ;IS THIS A 1 GOING TO A ZERO? BNE DECNUM ;NOPE CMP R0,R1 ;IS THERE ANYTHING TO TEST? BEQ FILL ;NO CMPB -1(R0),#40 ;TRY AND AVOID LEADING ZEROS BEQ FILL ;YES, THIS WOULD HAVE BEEN ONE DECNUM: DECB (R0) ;NOPE, SUBTRACT AWAY SAFELY CLR R0 RTS PC ;AND RETURN NUMCAR: MOVB #'9,(R0) ;RESET TO ZERO CLR R2 ;SET NUMERIC FLAG BR NEXT ;AND GO DO THE CARRY ALFTST: CMPB R3,#'Z ;IS IT ALPHA? BGT SPACE ;NOPE CMPB R3,#'A ;PERHAPS... BLT SPACE ;BUT NOT REALLY. BEQ ALFCAR ;YES! DOES IT CARRY? DECB (R0) ;NO, ADD AWAY SAFELY, CLR R0 RTS PC ;AND RETURN ALFCAR: CMP R1,R0 BEQ FILL CMPB -1(R0),#40 ;IS THERE ANYTHING TO CARRY DOWN FROM? BEQ FILL ;NO MOVB #'Z,(R0) ;RESET TO 'Z' INC R2 ;SET MODE TO ALPHA BR NEXT ;AND GO ADD THE CARRY SPACE: CMP R0,R1 BEQ FILL CMPB -1(R0),#40 ;ONLY FILL WHEN THERE IS AANOTHER CHAR TO THE LEFT BNE NOFILL FILL: MOVB #40,(R0) ;REPLACE LEADING SPECIALS WITH BLANKS BR DONE NOFILL: TST R2 ;WHAT WAS LAST MODE? BEQ LSTNUM ;IT WAS NUMERIC MOVB #'Z,(R0) ;INITALIZE TO 'Z' CLR R0 RTS PC ;AND GO HOME LSTNUM: MOVB #'9,(R0) ;INITALIZE TO '9' DONE: CLR R0 ;ZETO ERROR RETURN RTS PC .END