/ PROVE VALUE IN RANGE WITH SINGLE TEST / LAST EDIT: 12-NOV-2015 CJL / SHORT ROUTINE TO TEST IF AN ARBITRARY INTEGER VALUE IS WITHIN A DEFINED RANGE / [OR NOT] PERFORMING MERELY A SINGLE TEST [CONTRARY TO WIDESPREAD BELIEF THIS / IS IMPOSSIBLE AND *MUST* BE DONE WITH TWO TESTS]. / RESTRICTIONS: RANGE OF VALUES TESTED FOR MUST NOT EXCEED / HALF OF THE ENTIRE INTEGER RANGE SUPPORTED. / AS WRITTEN, ONLY COVERS UNSIGNED INTEGER / ARITHMETIC. [TO BE FAIR, CONVERSION FROM A / SIGNED SYSTEM TO AN UNSIGNED SYSTEM MAY / COMPLICATE THE PROBLEM TO THE POINT OF MAKING / THIS DEMONSTRATION MOOT; HOWEVER, THE VAST / MAJORITY OF REAL-WORLD PROBLEMS [RID OF THE / OFTEN ABSURD REQUIREMENTS OF NAYSAYERS WHO ARE / DESPERATE TO PROVE THEMSELVES CORRECT AT ALL / COSTS] ARE USUALLY DEFINED IN AN ENVIRONMENT / WHERE THE TASK AT HAND IS INHERENTLY QUITE / SIMPLE AND RESTRICTED TO A REASONABLY NARROW / SUBSET OF WHAT IS THEORETICALLY POSSIBLE, SUCH / AS CHARACTER TESTING WITHIN A DATA SET OF AT / MOST 256 CASES. [NOTE: ONE'S COMPLEMENT / DEVICES ARE NOT SUPPORTED; AS A PRACTICAL / MATTER, NO ONE'S COMPLEMENT DESIGNS HAVE BEEN / FORTHCOMING SINCE THE 1962 LINC.] / OBSERVATIONS: PROVING A VALUE IS WITHIN A RANGE IS THE SAME / PROBLEM AS PROVING THAT A VALUE IS OUTSIDE OF / THE RANGE CONSISTING OF ALL VALUES OTHER THAN / THE INTENDED RANGE; HOWEVER, IF THIS ALTERNATE / RANGE IS SMALLER, IT MAY BE THE ONLY WAY TO / SOLVE THE PROBLEM WITH ONE TEST. THUS, THE / NATURE OF THE SIZE OF THE TEST RANGE WITH / RESPECT TO THE AVAILABLE UNIVERSE OF INTEGERS / POSSIBLE MUST BE KNOWN BEFOREHAND. [INTEGER / ARITHMETIC IS FINITE; THE LARGER THE WORD / WIDTH, THE LARGER THE UNIVERSE, BUT ON ACTUAL / HARDWARE THIS IS ALWAYS AN UNDERLYING / CONSTRAINT OFTEN COMPLETELY BEYOND THE / COMPREHENSION OF THE NAYSAYERS.] / PROGRAMMING A CONDITION-CODE ARCHITECTURE / DESIGN SUCH AS THE PDP-11 MAY INVOLVE SOMEWHAT / MORE OVERHEAD DUE TO THE NEED TO MAINTAIN / CONDITION CODES AND POTENTIAL OPERATING SYSTEM / OVERHEAD SHOULD THE OPERATING SYSTEM REQUIRE / ELEVATED PRIVILEGES TO ALLOW A PROGRAM TO / MONITOR ITS OWN PROCESS.] / PROGRAM SOPHISTICATION LEVEL: LOW, [THIS IS AN EXAMPLE OF HOW TO CARRY OUT / A LOW-LEVEL EXAMPLE AS A CODE FRAGMENT.] / OBSERVATION: THE SUPPORT ROUTINES ARE OF MEDIUM-LEVEL / SOPHISTICATION OFTEN USED BY PROGRAMMERS / ONLY SLIGHTLY FAMILIAR WITH OPERATING SYSTEMS / ON THE PDP-8. NO ATTEMPT IS MADE TO DEAL WITH / SEVERAL NUANCES ASSOCIATED WITH PARTICULAR / OPERATING SYSTEMS [OR THE CONSOLE KEYBOARD / HARDWARE PARTICULAR TO THE PDP-8 FAMILY OF / MACHINES, WHICH IS SPECIFICALLY INCOMPATIBLE / WITH ALL DECMATES]. THE P?S/8 OPERATING / SYSTEM DEFINES A UNIVERSAL METHOD TO WORK ON / BOTH ARCHITECTURES BY USING ADDITIONAL / FEATURES TO OVERCOME INCOMPATIBILITIES. / HOWEVER, SUCH A PROGRAM WOULD NOT RUN ON ANY / OTHER OPERATING SYSTEM [UNLESS A MORE / SOPHISTICATED CHECK WAS MADE TO LIMIT SUCH A / PROGRAM TO MORE OR LESS THE PROGRAM AS / PRESENTED HERE SHOULD IT BE DESIRED TO WORK / WITH THESE OTHER SYSTEMS THAT DO NOT RUN ON / DECMATES]. / CODE OPTIMIMIZATION LEVEL: MODEST. [FOR INCREASED CLARITY TO BEGINNERS.] / CRITICISM 1: USES LITERALS FOR EXPEDIENCY AND TO EMPHASIZE / THE SMALL NATURE OF THE ENTIRE PROGRAM EVEN / THOUGH MOST OF IT IS UNRELATED CODE TO MAKE / IT PERFORM A DEMONSTRABLE FUNCTION WITHOUT / HAVING TO INSPECT MEMORY VIA THE FRONT PANEL / OR OTHER DISPLAY METHODS. / A SPECIFIC EXAMPLE WILL BE PRESENTED AS A SHORT PRACTICAL PROGRAM. / SUBROUTINE CALLS WILL BE USED TO ALLOW SUPPORT FOR DEVICES EXTERNAL TO THE / ISSUE AND TO ALLOW EXIT TO ONE OF THE PREVAILING OPERATING SYSTEMS. / HARDWARE RESTRICTION: SUPPORT SUBROUTINES ARE NOT WRITTEN TO BE / COMPATIBLE WITH DECMATE CONVENTIONS; TO / SUPPORT DECMATES FULLY ONLY ADDS ADDITIONAL / COMPLEXITY TO THE DEMONSTRATION PROGRAM AND / TENDS TO FURTHER OBFUSCATE THE ISSUES [BECAUSE / THE PIVOTAL PROGRAM CODE IS QUITE TINY]. / THE PROGRAM IS LOADED INTO MEMORY LOCATIONS 00200 AND FOLLOWING. THE OPERATOR / TYPES CHARACTERS ON THE SYSTEM CONSOLE KEYBOARD WITHOUT RESTRICTION. IF THE / CHARACTER CODE RETURNED IS WITHIN THE RANGE OF THE ASCII CODES FOR THE DIGITS / 0 THROUGH 9, THE CHARACTER TYPED WILL BE ECHOED. IF THE CHARACTER IS OUT OF / RANGE, THE CHARACTER WILL BE SENT TO THE CONSOLE OUTPUT [TO ACKNOWLEDGE / THAT A CHARACTER WAS PRESSED]. THE PROGRAM WILL EXIT TO 07600 IF THE / CHARACTER IS CONTROL-C [WHICH IS THE USUAL CONVENTION FOR PROGRAM EXIT]. / DEFINITIONS. HIVAL= "9&177 /HIGHEST CHARACTER VALUE IN THE DESIRED RANGE. LOWVAL= "0&177 /LOWEST CHARACTER VALUE IN THE DESIRED RANGE. NL7775= CLA CLL CMA RTL /LOAD ACCUMULATOR WITH 7775 [-3]. SBOOT= 7600 /EXIT TO THE OPERATING SYSTEM HERE. / THE PROGRAM STARTS HERE. *200 /THE USUAL STARTING ADDRESS. START, JMS INITIALIZE /PREPARE TO RUN THE TEST. LOOP, JMS GETCHAR /GET A CHARACTER FROM THE KEYBOARD. TAD MLIMIT /ADD ON LIMITING VALUE [FIRST OUTSIDE THE /RANGE NEGATED]. / BECAUSE THE PDP-8 ALLOWS THE LINK TO BE EITHER VALUE FREELY, IT IS NECESSARY / TO CLEAR IT FOR THE TEST [OR IN AN ALTERNATE SOLUTION SET IT; IT MUST BE / KNOWN AT THIS POINT FOR THE LOGIC TO WORK AS INTENDED]. CLL /CLEAR THE LINK BEFORE TESTING. TAD RANGE /ADD ON THE COUNT OF VALID NUMBERS IN THE RANGE. SNL /SKIP IF IN RANGE. JMP RINGIT /SEND A CHARACTER IF NOT. TAD ("0&177) /RESTORE RANGE TO PRINTABLE CHARACTER [FASTEST]. JMS OUTPUT /PRINT IT. JMP LOOP /GO DO ANOTHER ONE. / COMES HERE IF THE CHARACTER IS OUTSIDE OF THE RANGE. RINGIT, CLA /CLEAN UP. TAD ("G&37) /GET CODE JMS OUTPUT /RING IT JMP LOOP /GO TRY AGAIN. / SUPPORT SUBROUTINES. GETCHAR,.-. /GET A CHARACTER ROUTINE. KSF /FLAG UP? JMP .-1 /NO, WAIT FOR IT. KRB /YES, READ IT IN. AND (177) /JUST SEVEN-BIT ASCII; SOME TERMINALS /SET THE PARITY BIT! DCA GETEMP /SAVE IT FOR NOW. NL7775 /SET AC TO -3. TAD GETEMP /COMPARE LATEST TO . SNA CLA /SKIP IF OTHERWISE. JMP I (SBOOT) /EXIT IF PRESSED. TAD GETEMP /GET THE CHARACTER BACK. JMP I GETCHAR /RETURN TO CALLER. INITIAL,.-. /OUT OF LINE INITIALIZE ROUTINE. CLA /CLEAN UP. TSF /OUTPUT FLAG UP? TLS /NO, SET IT NOW. JMP I INITIALIZE /RETURN TO CALLER. OUTPUT, .-. /CONSOLE OUTPUT ROUTINE. TSF /FLAG UP? JMP .-1 /NO, WAIT FOR IT TLS /YES, OUTPUT LATEST CHARACTER. JMP I OUTPUT /RETURN TO CALLER. / TEMPORARIES AND VARIABLES. GETEMP, .-. /TEMPORARY USED BY THE KEYBOARD INPUT ROUTINE. MLIMIT, -HIVAL-1 /UPPER LIMIT OF THE RANGE [NEGATED]. RANGE, HIVAL-LOWVAL+1 /COUNT OF VALID CASES IN RANGE. PAGE /HERE COME THE LITERALS! $ /THAT'S ALL FOLK!