.TITLE MR15.. STRING PROCEDURES IN MACRO ; .IDENT /MR15../ ; ; .PAGE .SBTTL . CONVERT RAD50 BINARY TO ASCII CHARACTERS ; R$BR50:: ;THIS PROCEDURE CONVERTS A BINARY VALUE ;INTO A THREE CHARACTER ASCII STRING ; ; ENTRY CONDITIONS ; R0 = BINARY VALUE ; ; EXIT CONDITIONS ; R0 -> CONVERTED ASCII STRING IF STATUS = SUCCESS ; SAVE R1,R2,R3,R4,R5 ;PROTECT ALL REGISTERS MOV #"**,100$+2 ;FILL STORE AREA WITH KLUDGE MOV #"**,100$+4 ;SAME AGAIN ;NOTE SIGN BIT HAS NO SIGNIFICANCE WITH ;RADIX 50 VALUES CMP R0,#50*50*50-1 ;BIGGEST POSIBLE VALUE BLOS 5$ ;IS THE INPUT VALID SETERROR 40$ ;YECH INPUT HENCE ERROR EXIT 5$: MOV R0,R2 ;HOLD INPUT VALUE MOV #3,R4 ;LOOP COUNT FOR THREE CHARACTER 10$: MOV #11.,R5 ;LARGEST RESULT = (2 ^ 11) - 1 MOV #2000,R3 ;HIGHEST RAD50 POSIBLE BIT SET MOV R2,R0 ;LOAD INITIAL VALUE TO WORK AREA CLR R2 ;CLEAR OUT NEXT INITIAL START VALUE MOV #120000,R1 ;HOLD (RAD50 * (2 ^ 10)) 20$: CMP R0,R1 ;IS THE DIVISION VALID THIS ROUTINE ;ASSUMES GROTTY COMPUTER WITH NO DIVIDE BLO 30$ ;TOP LINE SMALLER HENCE NO DIVIDE SUB R1,R0 ;REMOVE DIVIDE BIT BIS R3,R2 ;SET POWER OF BINARY DIVIDE BIT 30$: ASR R3 ;CRANK ALL BITS RIGHT CLC ;STOP C BIT SLIPPING DOWN CRUNCH WORD ROR R1 ;DIVIDE DIVIDING THING BY TWO SOB R5,20$ ;COMPLETE A ONE PASS DIVIDE ; CALL R$R50C ;CONVERT REMAINDER TO ASCII CHARACTER IFERROR 40$ ;SUMAT WENT WRONG IF ERROR SET MOVB R0,100$+1(R4) ;STASH CONVERTED DIGIT IN STRING SOB R4,10$ ;PROCESS ALL THREE CHARACTERS ; SETSUCCESS ;SOME HOW THIS ROUTINE SEEMS TO HAVE WORKED 40$: MOV #100$,R0 ;HOLD ADDRESS OF CHARACTER STRING UNSAVE R1,R2,R3,R4,R5 ;RESTORE ALL REGISTERS RETURN ;GO BACK TO WHERE YOU THINK YOU CAME FROM ; ; ; DATA AREA ; .WORD 0 ;THIS STRING WRITE PROTECTED 100$: .WORD 3 ;THREE CHARACTERS IN STRING ALL BEING WELL .WORD "** ;DEFAULT LOAD STATE .WORD "** ;AN EXTRA * COST US NOTHING ; ; ; .END ; ;