.title ascr50 Ascii to Radix-50 conversion .ident /000003/ ; ;+ ; ; Index Convert Ascii to Radix-50 ; ; Usage ; ; ascr50(count, input, output) ; int count; ; int *output; ; char *input; ; ; Description ; ; Convert 'count' characters from ascii to Radix 50. If there aren't a ; multiple of 3 characters, blanks are padded on the end. The ascii ; string is moved to the output when finished. The input and output ; areas may be the same since three input characters are read for ; every two bytes of output. ; ; Bugs ; ;- ; Edit history ; 000001 27-Aug-78 BAM Original ; 000002 26-Aug-80 MM Made stupid bug in converting to C$PMTR. fixed same ; 000003 19-Jan-87 JMC Change .psect for I/D space. .psect c$code ASCR50:: JSR R5,CSV$ ;SAVE ALL REGISTERS 1$: MOV #" ,-(SP) ;SET AREA TO BLANKS MOV @SP,-(SP) MOV SP,R4 ;R4 -> INPUT AREA MOV #3,R0 2$: DEC C$PMTR+0(R5) ;DROP INPUT COUNT BMI 3$ ;IF NO MORE CHARACTERS LEFT TO CONVERT MOVB @C$PMTR+2(R5),(R4)+ ;MOVE A CHARACTER INTO INPUT AREA INC C$PMTR+2(R5) ;BUMP INPUT POINTER DEC R0 ;DROP BUFFER POINTER BNE 2$ ;IF MORE CHARACTERS IN THIS HUNK OF 3 3$: CMP R0,#3 BEQ 4$ ;IF NO CHARACTERS FOR THIS WORD, RETURN MOV SP,R4 MOV R5,-(SP) ;SAVE R5 (R50WRD USES ALL REGISTERS) CALL R50WRD ;CONVERT A WORDS WORTH MOV (SP)+,R5 CMP (SP)+,(SP)+ ;POP OFF ASCII INPUT MOV R1,@C$PMTR+4(R5) ;PUT RESULT CHARACTER INTO RESULT STRING ADD #2,C$PMTR+4(R5) ;BUMP WORD POINTER BR 1$ ;DO ANOTHER GROUP OF CHARACTERS 4$: JMP CRET$ ;RETURN ; R50WRD - COMMON RAD50 CONVERSION ROUTINE ; REGISTER USAGE NOTES: ; R0 & R2 WORK REGISTERS ; R1 RAD50 VALUE TO BE RETURNED ; R3 NUMBER OF CHARACTERS CONVERTED SO FAR ; R4 ADRS OF NEXT INPUT CHARACTER ; R5 MAXIMUM NUMBER OF INPUT CHARACTERS LEFT R50WRD: MOV #2,-(SP) ;SET LOOP COUNT (3 CHARS/WORD) CLR R1 ;ZERO ACCUMULATOR WORD 1$: CLR R0 ;ZERO CURRENT RAD50 CHAR DEC R5 ;ANY CHARS LEFT TO PROCESS BMI 5$ ;NO MORE CHARS TO PROCESS MOV #R50TAB,R2 ;GET CONVERSION TABLE POINTER BISB (R4)+,R0 ;GET NEXT INPUT CHAR 2$: CMPB (R2)+,R0 ;.LE. UPPER LIMIT? BLO 3$ ;NOPE - NOT IN THIS RANGE CMPB (R2)+,R0 ;.GT. LOWER LIMIT? BLO 4$ ;YES - FOUND CONVERSION (AND SET CARRY) DEC R2 ;ELSE BUMP OVER REMAINDER 3$: ADD #3,R2 ; OF TABLE ENTRY TST @R2 ;END OF TABLE REACHED? BNE 2$ ;NOPE - CONTINUE LOOKING NEG R5 ;ELSE INDICATE NON-RAD50 CHAR FOUND CLR R0 ;MAKE CURRENT = 0 (AND CLEAR C) 4$: ADC R3 ;UPDATE CHARACTER COUNT ADD @R2,R0 ;DO TRANSLATION 5$: ASL R1 ;MULTIPLY PREVIOUS BY 50(8) ASL R1 ASL R1 ADD R1,R0 ASL R1 ASL R1 ADD R0,R1 ;AND ADD IN CURRENT CHAR DEC @SP ;ANY CHARS LEFT IN THIS WORD? BPL 1$ ;YES TST (SP)+ ;ELSE DISCARD LOOP COUNT RTS PC .psect c$data,d ;03 R50TAB: .BYTE 132+40,100+40 ;LOWERCASE A-Z .WORD -140 .BYTE 132,100 ;A-Z .WORD -100 .BYTE 71,57 ;0-9 .WORD -22 .BYTE 40,37 ;SPACE .WORD -40 .BYTE 44,43 ;DOLLAR SIGN .WORD -11 .BYTE 56,55 ;PERIOD .WORD -22 .WORD 0 ;END OF TABLE FLAG (MUST BE ZERO) .END