$BEGIN ASCR50,<29.0>, ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ; BE USED OR COPIED ONLY IN ACCORDANCE WITH THE TERMS ; OF SUCH LICENSE. ; ; COPYRIGHT (c) 1982 BY DIGITAL EQUIPMENT CORPORATION. ; ALL RIGHTS RESERVED. ; ; PETER H. LIPMAN ; ; Modification History: ; ; August 31, 1984 by Robin Miller. Edit (01) ; Allow "$" and "." as valid Radix-50 characters. ; ;+ ; CONVERT ASCII STRING TO RAD50 ; CALLING SEQUENCE: ; CALL ..SGR5 ; INPUTS: ; R2=ADDRESS OF ASCII STRING ; R3=SIZE OF STRING ; R4=ADDRESS TO STORE RAD50 STRING - AREA PREVIOUSLY ZEROED ; OUTPUTS: ; C=0 IF OK, C=1 IF ASCII CHAR IS NOT ALPHANUMERIC ; R4=UPDATED POINTER TO LAST WORD WRITTEN WITH RAD50 CHARS ; R0,R1 PRESERVED ; R2 POINTS PAST LAST CHARACTER CONVERTED. ; GK001 ; R3 CONTAINS COUNT OF CHARACTERS LEFT + 1 IF ERROR, 0 OTHERWISE ; GK001 ; R5 ALTERED. ; GK001 ;- ; GK001 ..SGR5::MOV R0,-(SP) ; GK001 MOV R1,-(SP) ; GK001 MOV PC,-(SP) ; GK001 ADD #..SCR5-.,(SP) ; GK001 ; GK001 10$: MOVB (R2)+,R5 ;PICK UP NEXT ASCII CHARACTER ; GK001 CALL @(SP)+ ;CONVERT 1 CHAR, STORE IT ; GK001 BCS 20$ ;BRANCH IF ILLEGAL CHARACTER ; GK001 SOB R3,10$ ;LOOP FOR MORE ; GK001 TST (SP)+ ;POP COROUTINE ADDRESS OFF STACK ; GK001 20$: MOV (SP)+,R1 ;RESTORE REGISTERS ; GK001 MOV (SP)+,R0 ;... ; GK001 RETURN ; GK001 ; GK001 ; GK001 ;+ ; GK001 ; CONVERT ASCII CHARACTER TO RAD50 AND STORE IN GROWING STRING ; GK001 ; CALLING SEQUENCE: ; GK001 ; MOV #..SCR5,-(SP) ;POINT AT CO-ROUTINE ; GK001 ;10$: MOVB ,R5 ;PICK UP NEXT CHAR TO DO ; GK001 ; CALL @(SP)+ ;CALL CO-ROUTINE ; GK001 ; BCS ERROR ;IF CS, ERROR ; GK001 ; SOB COUNT,10$ ;LOOP FOR MORE CHARACTERS ; GK001 ; INPUTS: ; GK001 ; R5=CHARACTER TO BE CONVERTED AND STORED ; GK001 ; R4=POINTER TO CURRENT WORD BEING STORED IN ; GK001 ; R0,R1 MUST BE PRESERVED ACROSS SUCCESSIVE CALLS ; GK001 ; OUTPUTS: ; GK001 ; C=0 IF OK, C=1 IF NOT A RAD50 CHARACTER. IF C=1, STACK POPPED. ; GK001 ; R0 CONTAINS DATA THAT MUST BE PASSED ON NEXT CALL ; GK001 ; R1 CONTAINS NO. CHARACTERS LEFT TO STORE IN CURRENT WORD, MUST ; GK001 ; BE PASSED BACK. ; GK001 ; R2,R3 PRESERVED. ; GK001 ; R4 UPDATED TO POINT TO NEXT WORD TO BE USED ; GK001 ; R5 DESTROYED. ; GK001 ;- ; GK001 ..SCR5:: ; ; FIRST CHARACTER ; CALL ASCR50 ;CONVERT ONE CHARACTER TO RAD50 BCS 20$ ;FAILURE - INVALID CHARACTER CALL 30$ ;MULTIPLY BY 50(8) CALL 30$ ;MULTIPLY BY 50(8) MOV R5,(R4) ;PUT THIS RAD50 CHARACTER IN THE STRING CALL @(SP)+ ;DONE WITH THE FIRST CHARACTER ; ; SECOND CHARACTER ; CALL ASCR50 ;CONVERT ONE CHARACTER TO RAD50 BCS 20$ ;FAILURE - INVALID CHARACTER CALL 30$ ;MULTIPLY BY 50(8) ADD R5,(R4) ;PUT THIS RAD50 CHARACTER IN THE STRING ; NOTE THAT THE CARRY WILL ALWAYS BE CLEAR CALL @(SP)+ ;DONE WITH THE SECOND CHARACTER ; ; THIRD CHARACTER ; CALL ASCR50 ;CONVERT ONE CHARACTER TO RAD50 BCS 20$ ;FAILURE - INVALID CHARACTER ADD R5,(R4)+ ;PUT THIS RAD50 CHARACTER IN THE STRING ; NOTE THAT THE CARRY WILL ALWAYS BE CLEAR CALL @(SP)+ ;DONE WITH THE THIRD CHARACTER BR ..SCR5 ;LOOP UNTIL THE CALLER STOPS CALLING ; ; FAILURE ; 20$: RETURN ;FAILURE ; ; MULTIPLY BY 50(8) AND RETURN WITH THE CARRY CLEAR ; 30$: .IF GT,R$$EIS MUL #50,R5 ;MULTIPLY BY 50(8) CLC ;CLEAR THE CARRY ON EXIT .IFF ASL R5 ;MULTIPLY BY 2 ASL R5 ;MULTIPLY BY 4 ASL R5 ;MULTIPLY BY 10 MOV R5,R0 ;SAVE FOR A MINUTE ASL R5 ;MULTIPLY BY 20 ASL R5 ;MULTIPLY BY 40 ADD R0,R5 ;MULTIPLY BY 50 ; AND CLEAR THE CARRY BIT .ENDC RETURN ;DONE ;+ ; ASCII TO RAD50 CONVERSION ROUTINE ; CALLING SEQUENCE ; CALL ASCR50 ; INPUTS: ; R5=1 ASCII CHARACTER,MUST BE ALPHANUMERIC ; OUTPUTS: ; R5=RAD50 CONVERSION OF CHARACTER ; C=0 IF SUCCESSFUL ; C=1 IF CHARACTER WAS NOT ALPHANUMERIC ; R0-R4 PRESERVED ;- ASCR50: CMP R5,#'$ ; Is this a dollar sign ? (01) BNE 1$ ; If NE, no. (01) MOV #33,R5 ; Convert it to Radix-50. (01) BR 5$ ; And return success... (01) 1$: CMP R5,#'. ; Is this a period ? (01) BNE 2$ ; If NE, no. (01) MOV #34,R5 ; Yes, convert it to Radix-50. (01) BR 5$ ; And return success ... (01) 2$: CMP R5,#'Z ;IS THE CHARACTER ALPHABETIC BHI 6$ ;BRANCH IF LARGER THAN Z CMP R5,#'A BHIS 4$ ;BRANCH IF ALPHABETIC CMP R5,#'9 ;IS CHARACTER NUMERIC BHI 6$ ;BRANCH IF NO CMP R5,#'0 BLO 6$ ;BRANCH IF NOT NUMERIC ; CHARACTER IS NUMERIC SUB #22-100,R5 ; CHARACTER IS ALPHABETIC 4$: SUB #100,R5 5$: CLC ; Show success. (01) RETURN 6$: SEC RETURN ; ; $END ASCR50 ; .END