.TITLE CNAD .IDENT /2409.1/ ; ; ; ; WRITTEN BY RAY DI MARCO ; 24-SEP-80. ; ; ; ; VERSION 240980/01. ; ; ; ;-------------------------------------------------------------------- ; ; ; ; THIS MODULE CONTAINS THE 'CNAD' ROUTINE, WHICH IS USED TO CONVERT ; A BINARY NUMBER TO AN ASCII STRING. THE ARGUMENTS ARE- ; ; R0 THE NUMBER OF DIGITS TO BE PRODUCED ; R1 THE ADDRESS OF THE STORE STRING ; R2 THE NUMBER TO CONVERT. ; ; ; THIS IS A MODIFIED VERSION OF 'CNAF' MODULE. THE ROUTINE 'CNAD' HAS BEEN ; ADDED. IT IS A PREPROCESSOR WHICH SELECTS AN ENTRY IN THE 'CNAF' MODULE ; TO PRODUCE THE STRING. ; ; ; ; ; ; .SBTTL DOCUMENTATION - NAMING CONVENTION ; ; ; ; EXCEPT FOR THE "CNAFXX" (WHERE XX IS 16/8/6), THE ENTRY POINTS ; FOLLOW THE NAMING CONVENTION BELOW. ; ; ; 1) EACH ENTRY POINT TO THE MODULE HAS A NAME STARTING WITH ; THE LETTERS- ; 'CNAF' ; ; (WHICH STANDS FOR "CONVERT NUMBER TO ASCII USING FORMAT CONTROL WORD). ; ; ; ; 2) THE NEXT LETTER IN THE NAME IDENTIFIES THE REPRESENTATION ; WHICH IS TO BE USED IN THE CONVERSION. ALLOWABLE ; REPRESENTATIONS ARE- ; ; O -> OCTAL (TO BASE 8) ; D -> DECIMAL (TO BASE 10) ; H -> HEXADECIMAL (TO BASE 16) ; ; ; 3) THE NEXT LETTER MUST BE A DIGIT. THIS DIGIT SPECIFIES ; THE NUMBER OF CHARACTERS WHICH CAN BE USED TO REPRESENT ; THE NUMBER. THE ALLOWABLE DIGITS ARE ; ; OCTAL -> 0-6 DIGITS IN REPRESENTATION ; DEC -> 0-5 DIGITS IN REPRESENTATION ; HEX -> 0-4 DIGITS IN REPRESENTATION ; ; "CNAD" ; ; DIFFERENCE IS THAT R0 HOLDS NUMBER OF DIGITS TO PRODUCE AT ENTRY. ; THE ROUTINE ALWAYS PRODUCES THE OUTPUT RIGHT JUSTIFIED, WITH LEADING ; ZEROS INCLUDED. ; ; ; ; ; ; .SBTTL DOCUMENTATION - REGISTER USAGE AND ARGUMENT PASSING ; ; ; AT ENTRY TO THIS MODULE, THE REGISTERS MUST BE SET UP AS DETAILED ; BELOW- ; ; ; 1) THE FORMAT CONTROL WORD MUST BE IN R0 ; ; 2) R1 MUST HOLD THE ADDRESS OF THE BUFFER IN WHICH THE STRING IS ; TO BE STORED. ; ; 3) THE NUMBER TO BE CONVERTED IS TO BE IN R2. ; ; THE MODULE IS CALLED VIA A 'CALL CNAF#?', WHERE "CNAF#?' IS THE ENTRY ; POINT REQUIRED. ; ; AT EXIT, THE FOLLOWING CONDITIONS WILL BE FULFILLED BY THE ; MODULE- ; ; 1) ALL REGISTERS EXCEPT R1 AND R2 ARE PRESERVED THOUGH THE MODULE. ; REGISTER 'R2' IS PRESERVED BY ALL ENTRY POINTS EXCEPT THE ; 'CNAF16', 'CNAF8' AND 'CNAF6' ENTRIES, WHICH RETURN R2 AS ; AT ENTRY, EXCEPT MASKED TO 16, 8 OR 6 BITS. ; ; 2) AT EXIT, R1 POINTS TO THE LOCATION IMMEDIATELY AFTER THE LAST ; CHARACTER PRODUCED AND STORED IN THE STRING. ; ; 3) IF AN ERROR OCCURED, THE 'Z' FLAG WILL BE SET ON RETURN. IF NO ; ERRORS OCCURED, THE 'Z' FLAG WILL BE CLEAR ON RETURN. ; ; ; ; ; ; .SBTTL DOCUMENTATION - ERROR CONDITIONS ; ; ; THE ONLY ERROR CONDITION DETECTED BY THE ROUTINES IS AN ATTEMPT ; TO REPRESENT A NUMBER WITH N DIGITS, WHEN MORE THAN 'N' DIGITS ARE ; REQUIRED. IN THIS CASE THE ROUTINE ABORTS NORMAL EXECUTION. THE ; FIELD IN THE OUTPUT STRING IS FILLED WITH '*'S, AND THE 'Z' FLAG ; WILL BE SET ON RETURN. ; ; ; .SBTTL DOCUMENTATION - '?' CHARACTER IN OUTPUT STRING ; ; ; THE 'CONVRT' ROUTINE WILL OUTPUT A '?' IN THE OUTPUT STRING IF ; IT DISCOVERS THAT IT IS BEING ASKED TO CONVERT A NUMBER TO A CHARACTER, ; AND THERE IS NO NUMERAL/CHARCTER EQUIVALENT TO THE NUMBER. ; ; THIS CAN ONLY OCCURE IF THERE IS AN ERROR IN THE MODULE. ITS ; TIME TO DO SOME DEBUGGING IF THIS OCCURES. ; ; ; .SBTTL DOCUMENTATION - '*' CHARACTERS IN THE OUTPUT STRING ; ; ; THE OUTPUT FIELD IS FILLED WITH '*' IF THE NUMBER BEING CONVERTED ; CANNOT BE REPRESENTED IN THE NUMBER OF FIELDS SPECIFIED. ; ; ; ; ; ; .SBTTL DOCUMENTATION - FORMAT CONTROL WORD ; ; ; THE FORMAT CONTROL WORD IS PASSED OVER IN R0. IT DETERMINES ; THE COURSE OF ACTION TO BE TAKEN IF A LEADING 0 RESULTS FROM THE ; CONVERSION PROCESS. ; ; THE CALLER USES THE FORMAT WORD TO CHOSE BETWEEN THE FOLLOWING- ; ; 1) CONVERT A LEADING ZERO TO A SPACE (ASCII 40) ; ; 2) SUPPRESS (DO NOT INCLUDE IN STRING) A LEADING ZERO. ; ; 3) OUTPUT THE LEADING ZERO. ; ; ; THE FORMAT WORD CONSISTS OF 8, 2 BIT NIBLETS. THE NIBLET VALUE ; DETERMINES THE COURSE OF ACTION TO BE TAKEN. THE OPTIONS ARE ; ; NIBLET = 00 -> INCLUDE LEADING ZERO IN OUTPUT ; NIBLET = 01 -> CONVERT LEADING ZERO TO A ' ' IN OUTPUT ; NIBLET = 10 -> SUPPRESS LEADING ZERO IN OUTPUT ; NIBLET = 11 -> SUPPRESS LEADING ZERO IN OUTPUT ; ; ; THE NIBLETS ARE SCANNED LEFT TO RIGHT IN THE WORD. THE FIRST NIBLET ; CORRESPONDS TO THE LEFT MOST DIGIT TO BE PRODUCED. THE BIT 0/1 NIBLET ; WOULD REFER TO THE 8TH DIGIT BEING PRODUCED. ; ; ; NOTE- THE FORMAT WORD EFFECTS ONLY LEADING ZEROS, NOT EMBEDDED ZEROS. ; ; ; ; ; ; .SBTTL DOCUMENTATION - OPERATION OF MODULE ; ; ; THE ENTRY POINTS SAVE 'R5', MOVE THE ADDRESS OF AN ARGUMENT BLOCK ; INTO R5, AND PASS CONTROL TO THE 'SETUP' CODE. ; ; THE 'SETUP' CODE CHECKS THE FIRST ARGUMENT IN THE BLOCK AGAINST ; THE NUMBER TO BE CONVERETED. THE FIRST ARGUMENT IS THE UPPER VALUE ; WHICH CAN BE REPRESENTED WITH THE SPECIFIED NUMBER OF DIGITS. IF ; THE NUMBER CAN BE REPRESENTD, CONTROL IS PASSED TO THE 'PRDDIG' CODE. ; IF THE NUMBER CANNOT BE REPRESENTED IN THE SPECIFIED NUMBER OF DIGITS, ; THE OUTPUT FIELD IS FILLED WITH '*' CHARCTERS, THE REGISTERS RESTORED, ; THE 'Z' FLAG SET, AND CONTROL RETURNED TO THE CALLER. ; ; THE 'PRDDIG' CODE USES THE SECOND AND THIRD ARGUMENTS IN THE ; ARGUMENT BLOCK AS THE NUMBER OF DIGITS IN THE OUTPUT FIELD, AND THE ; ADDRESS OF A RADIX BASE VALUE TABLE. THIS ROUTINE SUCCESSIVELY DIVIDES ; THE NUMBER BY THE ENTRIES IN THE BASE VALUE TABLE, AND CALLS THE 'CONVRT' ; ROUTINE TO CONVERT THE EXTRACTED DIGIT TO A CHARACTER AND STORE IT IN THE ; OUTPUT STRING. UPON COMPLETION, THE ROUTINE RESTORES THE REGISTERS, CLEARS ; THE 'Z' FLAG AND RETURNS. ; ; THE 'CONVRT' ROUTINE CONVERTS THE EXTRACTED DIGIT TO AN ASCII ; CHARACTER VIA A LOOKUP TABLE. IT ALSO LOOKS AFTER LEADING ZEROS IN THE ; MANNER SPECIFIED BY THE FORMAT WORD. ; ; ; .SBTTL DOCUMENTATION - FUDGE #1 IN 'CONVRT' ROUTINE ; ; ; THE RESULT OF A DIVISION WILL HAVE THE SAME SIGN AS THE DIVIDEND. ; THE FUDGE IN THE ROUTINE CHECKS IF THE RESULT IS NEGATIVE. IF IT IS, IT ; NEGATES THE RESULT. THIS IS NEEDED IF NUMBERS GREATER THAN '100000' ARE ; TO BE REPRESENTED IN OCTAL. ; ; ; ; ; ; .SBTTL DECLARATIONS - MCALLS & GLOBALS ; ; .MCALL .PUSH,.POP ; .GLOBL CNAD ; ; ; ; .PSECT CODE ; OPEN CODE SECTION ; ------ ---- ; ; ; ; .SBTTL DEFINITION - MACRO '.ENTRY' ; ; ; THIS MACRO IS USED TO SET UP THE ENTRY POINTS 'CNAF#?'. ; THE MACRO ARGUMENTS ARE- ; ; LABLE - THE GLOBAL SYMBOL GIVEN TO THE ENTRY ; LIMIT - THE FIRST ARGUMENT IN THE ARGUMENT BLOCK ; NUMDIG - THE SECOND ARGUMENT IN THE BLOCK ; BASTAB - THE THIRD ARGUMENT IN THE BLOCK ; ; THE MACRO DOES A 'JSR R5,SETUP', WHICH DOES THE FOLLOWING- ; ; 1) SAVES R5 ON THE STACK ; 2) PLACES THE ADDRESS OF THE ARGUMENT BLOCK IN R5 ; 3) TRANSFERS CONTROL TO 'SETUP' CODE. ; ; .MACRO .ENTRY LABLE,LIMIT,NUMDIG,BASTAB .GLOBL LABLE ; DEFINE ENTRY POINT AS GLOBL LABLE: JSR R5,SETUP ; GOTO SETUP/SAVE R5/POINT TO DATA .WORD LIMIT ; NUMBER MUST BE <= LIMIT .WORD NUMDIG ; LENGHT OF NUMERAL FIELD .WORD BASTAB ; BASE TABLE FOR CONVERSION .ENDM ; END MACRO DEFINITION ; ; ; ; ; ; .SBTTL ROUTINE - 'CNAD' ... NUMBER -> DECIMAL ASCII STRING ; ; ; CNAD: .PUSH ; SAVE 10$: CMP R0,#5 ; MAX DIGIT ALLOWED = 5 BLOS 100$ ; OK -> 100$ MOVB #'0,(R1)+ ; PLACE A ZERO INTO THE FIELD DEC R0 ; DOWN COUNT BR 10$ ; LOOP ; 100$: ADD R0,R0 ; 2*R0 -> R0 MOV 1000$(R0),R5 ; ROUTINE ADRESS -> R5 CLR R0 ; FORMAT CONTROL = 0 CALL @R5 ; CONVERSION TIME ; .POP ; RESTORE RETURN ; HOME ; ; 1000$: .WORD CNAFD0,CNAFD1,CNAFD2,CNAFD3,CNAFD4,CNAFD5 ; ; ; ; ; ; ; .SBTTL ENTRY POINTS - 'CNAFD?' ... CONVERT TO DECIMAL REPRESENTATION ; ; ; THE '.ENTRY' MACRO IS USED TO DEFINE THE "CNAFD?" ENTRY POINTS TO ; THE MODULE. THE ENTRY POINT NAME IS NAME UP AS FOLLOWS- ; ; CNAF ... CONVERT NUMBER TO ASCII USING FORMAT WORD ; D ... USE DECIMAL REPRESENTATION ; ? ... (IS 0/1/2/3/4/5) AND IS NUMBER OF DIGITS IN NUMBER ; ; ; .ENTRY CNAFD5,65535.,5,DECTB5 ; ENTRY POINT TO PRODUCE 5 DIGITS .ENTRY CNAFD4,9999.,4,DECTB4 ; ENTRY POINT TO PRODUCE 4 DIGITS .ENTRY CNAFD3,999.,3,DECTB3 ; ENTRY POINT TO PRODUCE 3 DIGITS .ENTRY CNAFD2,99.,2,DECTB2 ; ENTRY POINT TO PRODUCE 2 DIGITS .ENTRY CNAFD1,9.,1,DECTB1 ; ENTRY POINT TO PRODUCE 1 DIGITS .ENTRY CNAFD0,0.,0,0 ; ENTRY TO PRODUCE 0 DIGITS ; ; ; .SBTTL TABLE - 'DECTB?' ... BASE VALUE TABLE FOR DEC REPRESENTATION ; ; ; THE ENTRIES IN THIS TABLE ARE USED AS THE BASES FOR THE PRODUCTION ; OF THE N'TH ORDER DIGIT. E.G. "DECTB4" ENTRY IS DIVIDED IN TO THE NUMBER ; TO PRODUCE THE (10^3) DIGIT. ; ; ; ; ; DECTB5: .WORD 10000. ; BASE VALUE TO EXTRACT 10^4DIGIT DECTB4: .WORD 1000. ; BASE VALUE TO EXTRACT 10^3DIGIT DECTB3: .WORD 100. ; BASE VALUE TO EXTRACT 10^2DIGIT DECTB2: .WORD 10. ; BASE VALUE TO EXTRACT 10^1DIGIT DECTB1: .WORD 1. ; BASE VALUE TO EXTRACT 10^0DIGIT ; ; ; ; ; ; .SBTTL ENTRY POINTS - 'CNAFO?' ... CONVERT TO OCTAL REPRESENTATION ; ; ; THE '.ENTRY' MACRO IS USED TO DEFINE THE "CNAFO?" ENTRY POINTS TO ; THE MODULE. THE ENTRY POINT NAME IS NAME UP AS FOLLOWS- ; ; CNAF ... CONVERT NUMBER TO ASCII USING FORMAT WORD ; O ... USE OCTAL REPRESENTATION ; ? ... (IS 0/1/2/3/4/5/6) AND IS NUMBER OF DIGITS IN NUMBER ; ; ; .ENTRY CNAFO6,177777,6,OCTTB6 ; ENTRY POINT TO PRODUCE 6 DIGITS .ENTRY CNAFO5,77777,5,OCTTB5 ; ENTRY POINT TO PRODUCE 5 DIGITS .ENTRY CNAFO4,7777,4,OCTTB4 ; ENTRY POINT TO PRODUCE 4 DIGITS .ENTRY CNAFO3,777,3,OCTTB3 ; ENTRY POINT TO PRODUCE 3 DIGITS .ENTRY CNAFO2,77,2,OCTTB2 ; ENTRY POINT TO PRODUCE 2 DIGITS .ENTRY CNAFO1,7,1,OCTTB1 ; ENTRY POINT TO PRODUCE 1 DIGITS .ENTRY CNAFO0,0.,0,0 ; ENTRY TO PRODUCE 0 DIGITS ; ; ; .SBTTL TABLE - 'OCTTB?' ... BASE VALUE TABLE FOR OCT REPRESENTATION ; ; ; THE ENTRIES IN THIS TABLE ARE USED AS THE BASES FOR THE PRODUCTION ; OF THE N'TH ORDER DIGIT. E.G. "OCTTB4" ENTRY IS DIVIDED IN TO THE NUMBER ; TO PRODUCE THE (8^3) DIGIT. ; ; ; ; ; OCTTB6: .WORD 100000 ; BASE VALUE TO EXTRACT 8^5DIGIT OCTTB5: .WORD 10000 ; BASE VALUE TO EXTRACT 8^4DIGIT OCTTB4: .WORD 1000 ; BASE VALUE TO EXTRACT 8^3DIGIT OCTTB3: .WORD 100 ; BASE VALUE TO EXTRACT 8^2DIGIT OCTTB2: .WORD 10 ; BASE VALUE TO EXTRACT 8^1DIGIT OCTTB1: .WORD 1 ; BASE VALUE TO EXTRACT 8^0DIGIT ; ; ; ; ; ; .SBTTL CODE - 'SETUP' ... SETUP FOR PRODUCTION OF NUMERALS ; ; ; ; AT ENTRY, R5 HAS BEEN SAVED ON THE STACK, AND THE ADDRESS ; OF THE ARGUMENT TABLE IS IN R5. THE FORMAT WORD IS IN R0, ; R1 POINTS TO THE ASCII STRING INTO WHICH THE OUTPUT IS TO ; GO, AND R2 HOLDS THE NUMBER TO BE CONVERTED TO ASCII. ONLY ; R5 HAS BEEN MODIFIED AT THIS STAGE, AND ITS CONTENTS AT ENTRY ; ARE NOW ON STACK. ; ; THE ARGUMENT TABLES ADDRESS IS STORED IN R5. THE TABLE ; IS SET OUT AS FOLLOWS- ; ; .WORD LIMIT ; UPPER LIMIT FOR NUMBER ; .WORD NUMDIG ; NUMBER DIGITS ALLOWED IN FIELD ; .WORD BASTAB ; ADDRESS OF BASE TABLE ; ; THE 'LIMIT' IS COMPARED AGAINST THE NUMBER TO BE CONVERTED. ; IF THE NUMBER IS >= 'LIMIT', THEN THE NUMBER IS TO LARGE ; TO CONTAIN IN THE FIELD. A FIELD OVERFLOW OCCURES, AND THE ; FIELD IS FILLED WITH '*', AND THE ROUTINE EXECUTION IS ; ABORTED. (ON ABORTION, THE REGISTERS ARE RESTORED, AND THE ; ERROR FLAG 'Z' IS SET.) ; ; ; ; SETUP: CMP R2,(R5)+ ; IS NUMBER WITHIN RANGE BLOS PRDDIG ; IF NUMBER WITHIN RANGE -> PRODUCE DIGIT MOV (R5)+,R5 ; GET NUMBER OF DIGITS ARGUMENT BEQ 40$ ; IF NUMBER FIELD = 0 --> SKIP 20$: MOVB #'*,(R1)+ ; NUMBER OVERFLOWED FIELD -INDICATE WITH * SOB R5,20$ ; LOOP TILL FILLED FIELD 40$: .POP R5 ; RESTORE R5 SEZ ; SET ERROR FLAG RETURN ; HOME - ERROR RETURN - ; ; ; ; ; ; .SBTTL CODE - 'PRDDIG' ... PRODUCE DIGITS ; ; ; AT ENTRY, R5 HAS BEEN SAVED, AND HOLDS THE ADDRESS OF THE ; SECOND ARGUMENT IN THE ARGUMENT BLOCK. (THE SECOND AND ; THIRD ARGUMENTS ARE THE NUMBER OF DIGITS IN THE FIELD ; AND THE ADDRESS OF THE BASE TABLE.) THE OTHER REGISTERS ; HAVE NOT AS YET BEEN MODIFIED. ; ; THIS ROUTINE SAVES THE REGISTERS (EXCEPT FOR R5, WHICH IS ; ALREADY SAVED) AND RESTORES THEM ALL (INCLUDING R5) BEFORE ; EXITING. IT CLEARS THE 'Z' (ERROR) FLAG BEFORE TERMINATING. ; ; THE ROUTINE USES 'R4' AS A LOOP COUNTER. IT IS INITALIZED ; TO THE 'NUMDIG' VALUE IN THE ARGUMENT BLOCK. THIS IS THE ; NUMBER OF DIGITS TO BE PRODUCED. R5 IS USED TO POINT TO ; THE 'BASTAB' TABLE, WHICH CONTAINS THE BASE VALUES BY ; WHICH THE NUMBER IS TO BE DIVIDED TO PRODUCE THE NEXT ; DIGIT. THE NUMBER IS CONTAINED IN (R2:R3), SO THAT THE ; DIVISION PLACES THE REMAINDER IN R3, AND THE WHOLE ; RESULT IN R2. THE 'CONVRT' ROUTINE IS CALLED TO CONVERT ; THE WHOLE NUMBER (R2) TO AN ASCII CHARCTER, TO BE STORED ; IN THE STRING POINTED TO BY R1, AND IN ACCORDANCE WITH ; THE FORMAT WORD IN R0. ; ; ; ; PRDDIG: .PUSH R4 ; SAVE R4 - WANT IT AS A LOOP COUNTER MOV (R5)+,R4 ; NUMBER DIGITS TO PROCUCE -> R4 BEQ 100$ ; SKIP IF TO PRODUCE 0 DIGITS ; .PUSH ; SAVE R3, NUMBER AND FORMAT WORD MOV R2,R3 ; PUT NUMBER INTO R3 MOV (R5),R5 ; POINT R5 TO BASE TABLE ; 10$: CLR R2 ; HIGH ORDER PART NUM = 0 DIV (R5)+,R2 ; SEPERATE OUT NEXT DIGIT CALL CONVRT ; CONVERT DIGIT TO ASCII SOB R4,10$ ; LOOP TILL PRODUCED REQUIRED NUMBER OF DIGS ; .POP ; RESTORE FORMAT WORD, NUMBER AND R3 100$: .POP ; RESTORE R4 AND R5 CLZ ; CLEAR FAILED FLAG RETURN ; HOME ; ; ; ; ; .SBTTL ROUTINE - 'CONVRT' ... CONVERT DIGIT ; ; ; AT ENTRY, R0 CONTAINS THE FORMAT WORD, R1 POINTS TO THE ; NEXT STORE LOCATION IN THE ASCII STRING, AND R2 HOLDS ; THE NUMBER TO BE CONVERTED. THE PROCESSOR 'Z' FLAG IS ; SET IF THE NUMBER IN R2 IS 0. ; ; THIS ROUTINE CONVERTS THE NUMBER IN R2 TO AN ASCII DIGIT. ; THE DIGIT IS STORED AT THE LOCATION POINTED TO BY R1. IF ; THE DIGIT IS A LEADING ZERO IN THE NUMERIC STRING BEING ; PRODUCED, THE FORMAT CONTROL WORD (R2) IS USED TO DETERMINE ; IF THE LEADING ZERO IS TO BE SUPPRESSED, CONVERTED TO A ; BLANK, OR OUTPUT AS A '0'. ; ; ROUTINE AT EXIT HAS DESROYED R2, BUMPED UP R1 (UNLESS A ; LEADING ZERO SUPPRESSION CONDITION WAS ENCOUNTERED) AND ; HAS MODIFIED THE FORMAT WORD (R0). ; ; THE CONVERSION OF THE NUMBER IN R2 TO AN ASCII CODE IS DONE ; BY THE 'ASCTAB' TABLE. IF THE TABLE DOES NOT HAVE A ASCII ; CHARACTER CORESPONDING TO A NUMBER, A '?' IS OUTPUT. ; ; ; ; ; CONVRT: BGT 10$ ; IF NUMBER >= 0 -> SKIP BEQ 50$ ; SKIP IF QUOTENT = 0 NEG R2 ; SEE DOCUMENTATION ON FUDGE #1 10$: CMPB R2,ASCTAB-2 ; SEE IF NUMBER IN RANGE BLOS 20$ ; SKIP IF LEGAL NUMBER MOV #-1,R2 ; POINT R2 TO ERROR CHARACTER 20$: MOVB ASCTAB(R2),(R1)+ ; STORE EXTRACTED DIGIT IN STRING CLR R0 ; CLEAR FORMAT BYTE RETURN ; ALL DONE ; 50$: MOVB #'0,R2 ; ASSUME GOING TO OUTPUT A "0" ASL R0 ; STRIP OF BIT 1 BCS 70$ ; CARRY SET -> SUPPRESS LEADING ZEROS BPL 60$ ; SKIP IF WANT ZEROS LEFT AS IS MOVB #40,R2 ; HE WANTS A ' ' PUT OUT 60$: MOVB R2,(R1)+ ; OUTPUT CHARACTER 70$: ASL R0 ; STRIP OF CONVERT BIT RETURN ; HOME ; ; ; .BYTE 16. ; 16 CODES IN TABLE (0-9 A-F) .BYTE '? ; USE ? --> ILLEGAL CODE ASCTAB: .ASCII /0123456789ABCDEF/ ; CONVERSION TABLE (EG 16 -> F) ; ; .END