.TITLE MR03.. STRING PROCEDURES IN MACRO .IDENT /MR03.D/ ; ; MOD LIST ; ======== ; ; (A) SET ERROR FLAG IF CONVERT NO LEGAL ; (B) ENABLE ANY BASE FROM 2 TO 36 TO BE PROCESSED ; (C) NEW ROUTINES HEX AND BINARY ; (D) CORRECT OVERFLOW ERROR CODING ; ; .PAGE .SBTTL . BINARY/OCTAL/DECIMAL/HEX STRINGS TO BINARY CONVERSIONS ; ; ; R$BINB:: ;CONVERT ASCII CHARACTER BINARY TO WORD ; ENTRY CONDITIONS ; R0 -> ASCII STRING ADDRESS ; ; EXIT CONDITIONS ; R0 = CONVERTED VALUE ; ; MOV #2,BASE ;HOLD BASE CONTROL VALUE BR R$STRB ;GOTO GENERAL CHARACTER TO BINARY ROUTINE ; ; R$OCTB:: ;CONVERT ASCII CHARACTER TO OCTAL WORD ; ENTRY CONDITIONS ; R0 -> ASCII STRING ADDRESS ; ; EXIT CONDITIONS ; R0 = CONVERTED VALUE ; ; MOV #8.,BASE ;HOLD BASE CONTROL VALUE BR R$STRB ;GOTO GENERAL CHARACTER TO BINARY ROUTINE ; ; ; R$DECB:: ;CONVERT ASCII CHARACTER TO DECIMAL WORD ; ENTRY CONDITIONS ; R0 -> ASCII STRING ADDRESS ; ; EXIT CONDITIONS ; R0 = CONVERTED VALUE ; ; MOV #10.,BASE ;HOLD BASE CONTROL VALUE BR R$STRB ;GOTO GENERAL CHARACTER TO BINARY ROUTINE ; ; R$HEXB:: ;CONVERT ASCII CHARACTER TO HEX WORD ; ENTRY CONDITIONS ; R0 -> ASCII STRING ADDRESS ; ; EXIT CONDITIONS ; R0 = CONVERTED VALUE ; ; MOV #16.,BASE ;HOLD BASE CONTROL VALUE ; BR R$STRB ;GOTO GENERAL CHARACTER TO BINARY ROUTINE ; ; ; .PAGE .SBTTL . GENERAL ASCII TO BINARY ROUTINE ; ; R$STRB:: ;GENERAL ASCII TO BINARY ROUTINE ; ; ENTRY CONDITIONS ; BASE: = BASE OF ASCII STRING ; R0 = ADDRESS OF CHARACTER STRING ; ; EXIT CONDITIONS ; R0 = CONVERTED STRING VALUE IF STATUS = SUCCESS ; ; SAVE R1,R2,R3,R4 ;SAVE REGISTERS R1 TO R4 MOV (PC)+,R4 ;HOLD BASE BASE: .WORD 10. ;DEFAULT BASE = 10 UNTIL CHANGED CLR R3 ;CLEAR OUT ACUMULATOR CLR 100$ ;INDICATE VALUE POSITIVE AND CONVERT SUCCESS MOV (R0)+,R2 ;R2 HOLDS NUMBER OF CHARACTERS ;AND R0 POINTS TO 1ST CHARACTER BLE 60$ ;J IF EMPTY STRING 20$: MOVB (R0)+,R1 ;HOLD CHARACTER INDEX POINTER TO NEXT CMP #'.,R1 ;IS CHARACTER RADIX POINT BEQ 20$ ;IF SO IGNORE IT (WHO WOULD WANT IT ANY WAY) CMP #'-,R1 ;IS CHARACTER MINUS SIGN BEQ 40$ ;JUMP IF MINUS SIGN CMP #'+,R1 ;HAS PLUS SIGN BEEN GIVEN BNE 30$ ;J IF NOT PLUS CHARACTER CLRB 100$ ;INDICATE VALUE POSITIVE BR 50$ ;CONTINUE PROCESSING ; 30$: SUB #'0,R1 ;REDUCE ENTRY VALUE TO BASE RANGE BLT 45$ ;IF RESULT -VE INVALID CHARACTER HENCE JUMP CMP R1,#9. ;IS VALUE IN BASE 10 CHARACTER SET BLE 35$ ;J IF DECIMAL CHARACTER SET SUB #'A-'0,R1 ;CONVERT USING ALPHA BASE BLT 45$ ;J IF UCKY CHARACTER 35$: CMP R1,R4 ;DOES VALUE EXCEED BASE LIMIT BGE 45$ ;J IF NOT VALID CHARACTER MUL R4,R3 ;SHIFT ACUMULATOR 1 BASE UNIT LEFT ADD R1,R3 ;ADD IN LEAST SIGNIFICANT DIGIT BVS 45$ ;J IF OVERFLOW HAS OCCURED BR 50$ ;PROCESS NEXT CHARACTER ; 40$: DECB 100$ ;INDICATE VALUE NEGATIVE BR 50$ ;CONTINUE WITH LOOP ; 45$: DECB 110$ ;INDICATE ERROR HAS OCCURED 50$: SOB R2,20$ ;CYCLE THROUGH CHARACTER STRING ; TSTB 100$ ;DOES RESULT SIGN NEED CHANGING BGE 60$ ;J IF VALUE POSITIVE NEG R3 ;NEGATE ACUMULATOR 60$: MOV R3,R0 ;HOLD RESULT FROM ACUMULATOR UNSAVE R1,R2,R3,R4 ;RESTORE R1 TO R4 ; TSTB 110$ ;DID CONVERT OPERATE OK BGE 62$ ;J IF A GOOD CONVERT EXITERROR ;INDICATE BAD CONVERT ; 62$: EXITSUCCESS ;INDICATE GOOD CONVERT ; ; ; DATA AREA USED FOR SIGN CHECKING ; 100$: .BYTE 0 ;DEFAULT SETTING POSITIVE 110$: .BYTE 0 ;DEFAULT SETTING CONVERT = SUCCESS ; ; .END ; ;