/ P?S/8 BLOCK-TO-BLOCK COPY SYSTEM / P?S/8 BLOCK-ORIENTED FACILITY FOR COPY/COMPARISON OF CONTIGUOUS SETS OF / BLOCKS ON ANY LOGICAL UNIT OF ANY NON-SYSTEM HANDLER. / LAST EDIT: 08-APR-1987 01:00:00 CJL / MUST BE ASSEMBLED WITH '/J' SWITCH SET. / PROGRAM USAGE EXAMPLE. / .[R ]BLKCPY[OPTIONAL INPUT FILES][OPTION SWITCHES] / BLKCPY V10F PROGRAM ANNOUNCEMENT / *SYS7:0-577 / PROGRAM OPTIONS. / /B USE HARDCOPY-ORIENTED BACKSPACE FOR COMMAND EDITING. DEFAULT IS / SCREEN-ORIENTED BACKSPACE. / /C ATTEMPT TO USE MORE MEMORY. IF AVAILABLE, MORE MEMORY WILL BE USED / FOR LARGER BUFFERS DURING THE COPY/COMPARISON. THIS OPTION ALLOWS / THE USE OF THE PARTIAL FIELD AVAILABLE BEYOND THE NORMAL MAXIMUM / CORE SIZE OF ADJUSTABLE SIZE SYSTEMS SUCH AS THE "RX01." SHOULD / THE CORE SIZE BE SET TO AN ENTIRE FIELD OR MORE BELOW AVAILABLE / MAXIMUM SIZE, AN ENTIRE ADDITIONAL FIELD WILL BE USED FOR BUFFER / SPACE. GENERALLY THE COPY/COMPARISON TAKES LESS TIME IF LARGER BUFFERS / ARE USED. THE DEFAULT OPERATION IS TO DETERMINE THE BUFFER SIZE / PURELY FROM THE CURRENT LOGICAL CORE SIZE. / /D DO NOT DISPLAY COMMAND GUIDES. DEFAULT IS TO DISPLAY THE COMMAND / GUIDES WHICH EXPLICITLY SHOW THE BLOCK EXTENTS IMPLIED BY THE LATEST / COMMAND. / /N DO NOT VERIFY THE COPIED DATA. DEFAULT IS TO VERIFY THE DATA. IGNORED / IN COMPARISON COMMANDS. / /O OVERRIDE THE MESSAGE "ARE YOU SURE?" ISSUED AFTER EVERY COMMAND. / DEFAULT IS TO WAIT FOR USER RESPONSE ('Y' OR 'N') FROM THE CONSOLE. / /U FOLD KEYBOARD INPUT TO UPPER-CASE AS IT IS TYPED IN. DEFAULT IS TO / ALLOW LOWER-CASE. INTERPRETATION OF INPUT IS ALWAYS CASELESS. OUTPUT / WILL ALSO BE TOTALLY UPPER-CASE IF THIS OPTION IS SELECTED. / /W WORD UPDATE MODE. CONTINUE AT NEXT WORD DURING MISMATCH FAILURES / OF COMPARISON OPERATION WHEN SKIPPING PAST LATEST PROBLEM (WORD). / DEFAULT IS TO IGNORE REST OF AFFECTED BLOCK AND CONTINUE AT FIRST / WORD OF NEXT BLOCK (NEXT HIGHER COMPATIBLE BLOCK IF COMPARING UNLIKE / BLOCK SIZE DEVICES). / FILE CONSIDERATIONS. / FILES PASSING INPUT FILES TO BLKCPY CAUSES COMMAND INPUT TO BE TAKEN FROM / THE CONTENTS OF THE FILES. AT END OF ALL PASSED INPUT FILES, INPUT / REVERTS TO THE CONSOLE. THE "$" CHARACTER MAY BE PLACED AT THE END / OF THE LAST INPUT FILE IN LIEU OF THE CHARACTER TO EXIT BLKCPY / AUTOMATICALLY. ALL OUTPUT FILES ARE IGNORED AND ONLY SERVE TO WASTE / SPACE IN THE FILE LIST. ALL DEVICES ASSOCIATED WITH THE FILES MUST / REMAIN RESIDENT DURING THE FILES-DRIVEN OPERATION. ALL YES/NO / QUESTIONS MUST BE ANSWERED AT THE CONSOLE (SEE /O). / COMMAND LINE OPTIONS. / =NNNN LENGTH OF BLOCKS TO COPY/COMPARE. MUST BE GIVEN UNLESS A RANGE IS / SPECIFIED. / -NNNN UPPER RANGE BLOCK. THE COPY/COMPARISON SHOULD BE PERFORMED UPON / THE BLOCKS RANGING FROM THE PREVIOUS STARTING BLOCK THROUGH BLOCK / NNNN. THIS FORM OF RANGE SPECIFICATION MAY BE APPLIED TO EITHER / INPUT OR OUTPUT. NOT ALLOWED IN COMBINATION WITH EITHER ANOTHER / (INPUT OR OUTPUT) RANGE OR AN "=" LENGTH SPECIFICATION. / USER COMMANDS CAN TAKE SEVERAL FORMS: / COPYING COMMANDS. / *SYS7:0-577SYS7:0-577 OUTPUT DETERMINES RANGE / *SYS0:0-577>SYS7:0 INPUT DETERMINES RANGE / *SYS0:0>SYS7:0=600 LENGTH PARAMETER GIVEN EXPLICITLY / THE DIRECTION OF TRANSFER IS DETERMINED BY WHETHER "<" OR ">" IS USED. / COMPARISON COMMANDS. / *SYS0:0-577!SYS7:0 FIRST INPUT DETERMINES RANGE / *SYS0:0!SYS7:0-577 SECOND INPUT DETERMINES RANGE / *SYS0:0!SYS7:0=600 LENGTH PARAMETER GIVEN EXPLICITLY / THE "=" PARAMETER CAN BE GIVEN ANYWHERE ON THE COMMAND LINE EXCEPT WITHIN / THE 'DEVU:BLOCK' CONSTRUCTION. / SPECIAL HANDLER CONSIDERATIONS. / WHEN DEALING WITH SPECIAL HANDLERS (PDP-10 DECTAPE, LAP6-DIAL LINCTAPE, / ETC.), THE LENGTH OR RANGE OF BLOCKS TO COPY/COMPARE REFERS TO THE ACTUAL / NUMBER OF BLOCKS SPECIFIED RELATIVE TO THE DEVICE ON THE SAME SIDE OF THE / I/O SEPARATOR ("<", ">" OR "!"). CONSEQUENTLY, THE NUMBER OF BLOCKS ACTUALLY / INVOLVED RELATIVE TO THE DEVICE ON THE OPPOSITE SIDE OF THE I/O SEPARATOR / WILL DEPEND ON THE INTER-DEVICE BLOCK SIZE RATIO. IN THE FOLLOWING EXAMPLE: / *SYS0:0DTP1:1077 / WILL YIELD AN I/O ERROR AS LTD0: BLOCK THREE AND THE FIRST HALF OF BLOCK / FOUR WILL GO TO DTP1: BLOCK 1101 (HIGHEST AVAILABLE BLOCK ON THAT DEVICE), / BUT THE SECOND HALF OF LTD0: BLOCK FOUR WILL ATTEMPT TO TRANSFER TO DTP1: / BLOCK 1102 (NON-EXISTENT BLOCK) YIELDING AN I/O ERROR. A PROPER COMMAND / USAGE WOULD BE: / *LTD0:0>DTP1:1077-1101 / THIS WILL ASK FOR TWO PAGES FROM LTD0: BLOCK THREE, AND A SINGLE PAGE FROM / LTD0: BLOCK FOUR TO COMPLETE THE THREE PAGE WRITE ON DTP1: BLOCK 1101. / WHEN REVERSING THE DIRECTION OF TRANSFER, THE BLOCK LIMITS (OR RANGE IF / "=NNNN" FORM IS USED) SHOULD STAY ON THE SAME SIDE OF THE SEPARATOR. THE / FOLLOWING COMMAND WILL SUCCESSFULLY COPY THE SAME DATA BACK TO THE LTD0: / DEVICE: / *DTP1:1077-1101>LTD0:0 / SINCE THE ACTUAL NUMBER OF BLOCKS TRANSFERRED IS STILL DETERMINED BY THE / DTP1: HANDLER. / RESTRICTIONS. / THE SYSTEM BOOTSTRAP UNIT MUST REMAIN RESIDENT UNTIL THE COPY/COMPARE STARTS / (JUST AFTER THE "ARE YOU SURE? " QUESTION IS ASKED). THIS, IN TURN, REQUIRES / THE USER TO NOT INVOKE /O IF ANY DISMOUNTING OF THE SYSTEM DEVICE IS REQUIRED, / AS THIS PREVENTS THE PAUSE FOR USER RESPONSE REQUIRED TO SYNCHRONIZE SUCH / DEVICE MOUNTS. THE RESTRICTION DOES NOT APPLY IF EITHER OF THE DEVICES "SYS" / OR "NUL" (SEE BELOW) ARE CHOSEN FOR ALL "DEVU:BLOCK" CONSTRUCTIONS. / REPEATING THE LATEST OPERATION BY USE OF <^R>, OR A SIMILAR OPERATION USING / THE SAME EXACT HANDLERS, WILL OBVIATE THE REQUIRED RESIDENCE OF THE SYSTEM / DEVICE, AS THE SAME HANDLERS ARE USED FOR THE SAME PURPOSE. A NEW OPERATION / REQUIRES THE SYSTEM DEVICE TO BE MOUNTED, AS EACH OPERATION IS DYNAMICALLY / ALLOCATED FOR THE BEST THROUGHPUT. / AS A CONVENIENCE TO THE USER, A HANDLER KNOWN AS "SYS" IS PROVIDED AND IS / ALSO MADE PERMANENTLY RESIDENT WHICH PREVENTS THE ABOVE-MENTIONED OVERHEAD / AND DISMOUNT RESPONSIBILITY (NON-/O REQUIREMENT). THIS HANDLER ADDRESSES / THE SYSTEM LOGICAL UNITS BY PASSING ITS PARAMETERS TO THE SYSTEM HANDLER / ITSELF. SINCE THE SYSTEM HANDLER PROVIDES NO ERROR RECOVERY TO A CALLING / PROGRAM, THE USER MUST INTERACT WITH THE SYSTEM HANDLER IN THE NORMAL FASHION / (HALT, RETRY OR OVERLAY ERROR MESSAGE) AS NECESSARY. ANY RETURN TO BLKCPY / IS PERCEIVED AS ERROR-FREE, AND THUS ALL ERROR RECOVERY PROCEDURES DOCUMENTED / HERE DO NOT APPLY WHEN USING THE "SYS" HANDLER. / CALLING THE "SYS" HANDLER WITH LOGICAL UNITS 0-7 APPENDED CORRESPONDS TO / ACCESSING LOGICAL UNITS 0-7 THROUGH THE SYSTEM HANDLER. ANY ANOMALIES CAUSED / BY THE SYSTEM HANDLER UNIT ARE PURELY WITHIN THE DOMAIN OF THE SYSTEM HANDLER. / THE USER IS REFERRED TO SPECIFIC SYSTEM HANDLER DOCUMENTATION. NO ATTEMPT / IS MADE TO LIMIT THE BLOCK RANGE APPLIED TO THE HANDLER, SO THIS ALSO IS / GOVERNED BY THE CONSTRAINTS OF THE HANDLER ITSELF AND IS BEYOND THE SCOPE / AND CONTROL OF THIS PROGRAM. FOR EXAMPLE: USING THE "RX01" SYSTEM HANDLER / WILL MAP ALL UNITS FROM 4-7 INTO 0-3 WITHOUT REPORTING AN ERROR. DEPENDING / ON HARDWARE CONFIGURATION, FURTHER MAPPING OF UNITS 2-3 INTO UNITS 0-1 MAY / OCCUR. ATTEMPTS TO ACCESS BLOCKS BEYOND 1733 (ON RX01 OR RX02, OR 3667 ON / RX03 WITH DOUBLE-SIDED DISKETTE INSERTED) WILL CAUSE A "HIGH TRACK" ERROR / TO BE REPORTED BY THE HANDLER ITSELF. / TO ALLOW FOR READ-CHECKING OF A DEVICE, A "NUL" HANDLER IS PROVIDED, AND / ALSO MADE PERMANENTLY RESIDENT. THE "NUL" HANDLER WILL ALWAYS RETURN / SUCCESSFULLY ON ANY READ TO ANY UNIT OR BLOCK. "NUL" HANDLER BLOCK SIZE / IS CONSIDERED TO BE 128 WORDS/BLOCK. READING FROM THE "NUL" HANDLER (NUL0-7) / WILL RESULT IN ZEROED DATA BEING READ, WHICH IS USEFUL FOR CLEARING OUTPUT / DEVICE BLOCKS. / IF INPUT FILES CONTAINING COMMANDS ARE PASSED, THE DEVICES ASSOCIATED WITH / THESE FILES MUST ALWAYS REMAIN RESIDENT DURING THE FILES-DRIVEN PORTION OF / THE BLKCPY SESSION. THE USER MUST RESPOND TO YES/NO QUESTIONS SUCH AS "ARE / YOU SURE" (ASSUMING NON-/O USAGE), OR ERROR MESSAGES GENERATED BY PROBLEMATIC / TRANSFERS, ON THE SYSTEM CONSOLE. ALL INPUT (INCLUDING COMMAND STRINGS) / REVERTS TO THE CONSOLE AFTER ALL INPUT FILES' CONTENTS HAVE BEEN PROCESSED. / COMMAND FORMATTING AND STYLE NOTES. / SINCE BLKCPY COMMANDS ARE POTENTIALLY CONFUSING TO THE USER AND SUBTLETIES / SUCH AS AN INVERTED DIRECTION OF TRANSFER HAVE SUCH DIRE CONSEQUENCES, THE / USER IS ENCOURAGED TO DEVELOP A DISTINCTIVE STYLE WHEN USING BLKCPY TO PREVENT / MISHAPS. TOWARDS THIS END, SEVERAL COSMETIC FEATURES EXIST WITHIN BLKCPY: / A) BLKCPY ALLOWS COMMANDS TO BE PARTIAL OR TOTAL COMMENTS. ANY PORTION / OF A COMMAND LINE STARTING WITH A SLASH ("/") CHARACTER IS CONSIDERED / TO BE A COMMENT. THIS IS ESPECIALLY USEFUL WHEN CREATING COMMAND / FILES FOR BATCH-ORIENTED USAGE. / B) BLANK (NULL) LINES ARE FREELY ALLOWED FOR SPACING COMMANDS APART / TO AID CLARITY. / C) SPACE AND HORIZONTAL TAB CHARACTERS ARE FREELY ALLOWED ANYWHERE / WITHIN A COMMAND TO AID CLARITY. THE HORIZONTAL TAB WILL ECHO AS / A SPACE CHARACTER WITHIN THE BLKCPY COMMAND; THE USER IS ENCOURAGED / TO USE HORIZONTAL TAB CHARACTERS WITHIN ANY COMMAND FILE TO AID / UNDERSTANDING OF THE BLKCPY SESSION IMPLIED BY THE CONTENTS OF THE / COMMAND FILE. / D) SEVERAL KNOWN OPERATING SYSTEMS FOR OTHER COMPUTERS FORCE THE PERSONAL / PREFERENCE OF THE IMPLEMENTORS UPON THE USER WITH REGARD TO SUCH / AS THE IMPLIED DIRECTION OF MOVEMENT OF DATA WITHIN THE COMMAND / STRUCTURE OF THE SYSTEM. IN KEEPING WITH OTHER P?S/8 CONVENTIONS, / BLKCPY ALLOWS THE USER'S OWN PREFERENCE TO DETERMINE THIS (USE OF / "<" OR ">" AS NECESSARY). IT IS HOPED THAT THE USER'S OWN ROUTINE / USAGE OF BLKCPY WILL PREVENT ACCIDENTAL REVERSAL PROBLEMS OF THIS / NATURE. / E) BLKCPY FORCES NO PREFERENCE FOR UPPER OR LOWER CASE CHARACTERS. / THE USER MAY ENTER EITHER CASE WHERE APPLICABLE AS ACTUAL COMMAND / INTERPRETATION IS TOTALLY CASELESS. AT THE USER'S OPTION, ALL INPUT / WILL BE "FOLDED" TO UPPER CASE AS IT IS TYPED IN (SEE /U DESCRIPTION). / F) THE COMMAND GUIDE FEATURE EXPLICITLY STATES THE OBJECTIVE OF ANY / COMMAND TO ASSIST THE USER IN DETERMINING COMMAND ERRORS. THE / CONFIRMING QUESTION (ARE YOU SURE?) GIVES THE USER A FINAL OPPORTUNITY / TO CANCEL ANY COMMAND. BOTH OF THESE FEATURES ARE AVAILABLE FROM / THE COMMAND FILE MODE (AND ARE DEFAULT). USAGE OF COMMAND FILES / (OPTIONALLY) IN CONJUNCTION WITH COMMAND GUIDES AND/OR CONFIRMATIONS / BRINGS THE SAFEST USAGE OF BLKCPY TO THE NOVICE OR CASUAL USER. / AUTOMATIC EXIT CAPABILITY IS OPTIONALLY AVAILABLE FROM COMMAND FILES / BY TERMINATING ANY LINE WITH A DOLLAR SIGN ("$") CHARACTER WHICH / WILL BE INTERPRETED AS AN CHARACTER CAUSING BLKCPY TO EXIT / AFTER CONCLUDING THE LATEST COMMAND. / G) EXTENSIVE DIAGNOSTIC MESSAGES ASSIST THE USER IN DETERMINING / SYNTACTIC ERRORS WHEN USING BLKCPY. / IMPLEMENTATION NOTES AND CUSTOMIZATION. / IT MAY BE DESIRABLE TO CUSTOMIZE ANY PARTICULAR COPY OF BLKCPY TO THE USER'S / OWN PREFERENCE REGARDING CERTAIN SWITCHES. FOR EXAMPLE, A SOPHISTICATED / USER MAY PREFER TO DELETE THE COMMAND GUIDE FEATURE, OR EVEN THE "ARE YOU / SURE?" SEQUENCE INVOKED ON EVERY COMMAND. OPTION SWITCHES CONTROLLING THESE / AND OTHER ASPECTS OF BLKCPY ARE AVAILABLE TO CUSTOMIZE THE OPERATIONS OF / THE PROGRAM, BUT THESE REQUIRE THE USER TO INVOKE FAVORED OPTIONS REPEATEDLY. / SEVERAL KNOWN OPERATING SYSTEMS SUPPORT "PATCHED" VERSIONS OF SYSTEM PROGRAMS / WHICH EFFECTIVELY FORCE THE EFFECT OF OPTION SWITCHES WHETHER EXPLICITLY / GIVEN OR NOT. THIS PREVENTS THE POSSIBILITY OF USING THE PROGRAM IN THE / ORIGINAL WAY AS THERE IS NO METHOD TO REVERT THE ENFORCED OPTION. / TO OVERCOME THIS LIMITATION, THE USER CAN PATCH THE FIRST THREE WORDS OF / THE CORE IMAGE OF BLKCPY ITSELF WITH A "MASK" (EACH BIT CORRESPONDS TO AN / OPTION SWITCH SERIALLY FROM /A-/Z FOLLOWED BY /0-/9). THIS MASKING VALUE / WILL BE USED TO "REVERSE" THE EFFECT OF THE SPECIFIED SWITCH. FOR EXAMPLE: / SETTING RELATIVE WORD ZERO OF THE CORE IMAGE OF BLKCPY TO 0400 WILL REVERSE / THE /D OPTION. THIS WOULD REQUIRE THE USER TO INVOKE /D IF THE COMMAND / GUIDES WERE DESIRED, OPPOSITE TO NORMAL CONVENTION. ALL SWITCHES CAN BE / "REVERSED" ACCORDINGLY (INCLUDING OPTION SWITCHES IGNORED BY BLKCPY!). / THE RESULTANT CUSTOMIZED COPY OF BLKCPY OPERATES IN A TOTALLY CONVENTIONAL / MANNER; ONLY THE METHOD OF PASSING SWITCH OPTIONS CHANGES. / PROGRAM MESSAGES. / COPY FINISHED [WITH ERRORS] / THE LATEST COPY COMMAND HAS BEEN COMPLETED. IF ANY ERRORS WERE / UNCORRECTED, THE ERROR APPENDAGE IS ALSO GIVEN. / COMPARISON FINISHED [WITH ERRORS] / THE LATEST COMPARISON COMMAND HAS BEEN COMPLETED. IF ANY ERRORS / WERE UNCORRECTED, OR DATA DIFFERENCES WERE DETECTED, THE ERROR / APPENDAGE IS ALSO GIVEN. / COPY FAILED! / THE USER OPTED TO ABORT THE COPY OPERATION INSTEAD OF RETRYING OR / POSSIBLY SKIPPING PAST AN I/O ERROR. THE COMMAND WAS NOT (COMPLETELY) / CARRIED OUT. / COMPARISON ERROR! / WHILE COMPARING THE SPECIFIED SETS OF CONTIGUOUS BLOCKS, A MISMATCH / OCCURRED BETWEEN TWO CORRESPONDING WORDS. BOTH WORDS ARE REPORTED / IN THE FORM OF DEVU:BBBB.OOOO /VVVV WHERE OOOO IS THE RELATIVE OFFSET / WITHIN THE BLOCK BBBB ON UNIT U OF DEVICE DEV, AND VVVV IS THE DATA / VALUE OF THE WORD. OPTIONS AT THIS POINT ARE TO: / 1A) (/W NOT INVOKED) SKIP PAST BLOCK (Y/N) TO BYPASS / THE PROBLEM BLOCK. / 1B) (/W INVOKED) SKIP TO NEXT WORD (Y/N) TO BYPASS THE / PROBLEM WORD. / FAILING TO TAKE THIS OPTION WILL YIELD THE "COMPARISON FAILED!" MESSAGE. / COMPARISON FAILED! / THE USER OPTED TO ABORT THE COMPARISON OPERATION INSTEAD OF RETRYING / OR POSSIBLY SKIPPING PAST AN I/O ERROR OR MISMATCH. THE COMMAND / WAS NOT (COMPLETELY) CARRIED OUT. / INPUT ERROR ON DEVU:BBBB! / AN INPUT READ ERROR OCCURRED WHILE ATTEMPTING TO READ BLOCK BBBB / ON UNIT U OF DEVICE DEV. OPTIONS AT THIS POINT ARE TO: / 1) RETRY (Y/N) TO RETRY THE READ. / 2A) (COPY ONLY) WRITE DUMMY BLOCK (Y/N) TO WRITE A DUMMY / BLOCK ON THE OUTPUT DEVICE AT THE CORRESPONDING / BLOCK WHERE THE ORIGINAL DATA WAS INTENDED. / 2B) (COMPARISON ONLY) SKIP PAST BLOCK (Y/N) TO BYPASS / THE PROBLEM BLOCK. / TAKING ANY OPTION BUT 1) WILL CAUSE THE ERROR APPENDAGE TO APPEAR / WHEN (IF) THE COPY/COMPARISON COMPLETES. REJECTING ALL OPTIONS WILL / YIELD THE "COPY FAILED!" OR "COMPARISON FAILED!" MESSAGE. / OUTPUT ERROR ON DEVU:BBBB! / AN OUTPUT WRITE ERROR OCCURRED WHILE ATTEMPTING TO WRITE BLOCK BBBB / ON UNIT U OF DEVICE DEV. OPTIONS AT THIS POINT ARE TO: / 1) RETRY (Y/N) TO RETRY THE WRITE. / 2) SKIP PAST BLOCK (Y/N) TO BYPASS THE PROBLEM BLOCK. / TAKING ANY OPTION BUT 1) WILL CAUSE THE ERROR APPENDAGE TO APPEAR / WHEN (IF) THE COPY OPERATION COMPLETES. REJECTING ALL OPTIONS WILL / YIELD THE "COPY FAILED!" MESSAGE. / REPEATING LATEST OPERATION / <^R> WAS HIT AT THE COMMAND PROMPT OR DURING A COPY/COMPARISON. / THE OPERATION IS TOTALLY RESTARTED. IF THE ASSOCIATED MEDIA ARE / CHANGED BEFORE RESTARTING, MULTIPLE DISK COPY/COMPARISON CAN BE / INVOKED WITH A SINGLE KEYSTROKE PER OPERATION. / VERIFY ERROR ON DEVU:BBBB! / AFTER WRITING THE DATA TO THE OUTPUT DEVICE AND SUCCESSFULLY READING / IT BACK, A WORD BY WORD COMPARISON IS MADE FOR EVERY BLOCK BETWEEN / THE SOURCE AND DESTINATION DEVICE (UNLESS /N WAS INVOKED). THIS / ERROR INDICATES A DISCREPANCY BETWEEN THE SOURCE DATA AND THE / DESTINATION DATA, AND IS STATED AS AN ERROR ON THE DESTINATION DEVICE / DEV UNIT U AT BLOCK BBBB. OPTIONS AT THIS POINT ARE TO: / 1) RETRY (Y/N) TO RETRY THE WRITE AND SUBSEQUENT READ / OPERATION. / 2) SKIP PAST BLOCK (Y/N) TO BYPASS THE PROBLEM BLOCK. / TAKING ANY OPTION BUT 1) WILL CAUSE THE ERROR APPENDAGE TO APPEAR / WHEN (IF) THE COPY OPERATION COMPLETES. REJECTING ALL OPTIONS WILL / YIELD THE "COPY FAILED!" FAILURE MESSAGE. / VERIFY READ ERROR ON DEVU:BBBB! / A READ ERROR OCCURRED WHILE ATTEMPTING TO READ BLOCK BBBB ON UNIT / U OF DEVICE DEV JUST AFTER THE DATA WAS WRITTEN (NOT PERFORMED IF / /N INVOKED). THE OUTPUT DEVICE REPORTED NO ERROR WHILE WRITING THE / DATA, BUT THE DATA CANNOT BE READ BACK FOR VERIFICATION PURPOSES. / OPTIONS AT THIS POINT ARE TO: / 1) RETRY (Y/N) TO RETRY THE WRITE AND SUBSEQUENT READ / OPERATION. / 2) SKIP PAST BLOCK (Y/N) TO BYPASS THE PROBLEM BLOCK. / TAKING ANY OPTION BUT 1) WILL CAUSE THE ERROR APPENDAGE TO APPEAR / WHEN (IF) THE COPY OPERATION COMPLETES. REJECTING ALL OPTIONS WILL / YIELD THE "COPY FAILED!" FAILURE MESSAGE. / ERROR RECOVERY (ALL EXAMPLES ASSUME /D, /O INVOKED FOR BREVITY). / RECOVERING FROM INPUT ERRORS. / SEVERAL EXAMPLES OF USER ERROR RECOVERY FROM INPUT ERRORS: / *DTA1:0DTA0:0 /USER INVOKES COPY COMMAND / INPUT ERROR ON DTA1:0001! /INPUT ERROR OCCURS / RETRY? NO! /USER OPTS TO NOT RETRY / WRITE DUMMY BLOCK? NO! /USER OPTS TO NOT WRITE DUMMY DATA / COPY FAILED! /COPY DOES NOT FINISH / *DTA1:0!DTA0:0=2702 /USER INVOKES COMPARISON COMMAND / INPUT ERROR ON DTA1:0001! /INPUT ERROR OCCURS / RETRY? NO! /USER OPTS TO NOT RETRY / SKIP PAST PROBLEM BLOCK? YES! /USER OPTS TO SKIP THE BLOCK / COMPARISON FINISHED [WITH ERRORS] /COMPARISON FINISHES / RECOVERING FROM OUTPUT ERRORS. / SEVERAL EXAMPLES OF USER ERROR RECOVERY FROM OUTPUT ERRORS: / *DTA1:0DTA1:0 /USER INVOKES COPY COMMAND / OUTPUT ERROR ON DTA1:0000! /OUTPUT ERROR OCCURS / RETRY? NO! /USER OPTS TO NOT RETRY / SKIP PAST PROBLEM BLOCK? YES! /USER OPTS TO SKIP THE BLOCK / COPY FINISHED [WITH ERRORS] /COPY FINISHES / RECOVERING FROM VERIFY ERRORS. / SEVERAL EXAMPLES OF USER ERROR RECOVERY FROM VERIFY ERRORS: / *DTA1:0DTA1:0-2701 /USER INVOKES COPY COMMAND / VERIFY ERROR ON DTA1:0000! /VERIFY ERROR OCCURS / RETRY? YES! /USER OPTS TO RETRY / VERIFY ERROR ON DTA1:0000! /ERROR PERSISTS / RETRY? NO! /USER OPTS NOT TO RETRY / SKIP PAST PROBLEM BLOCK? NO! /USER OPTS NOT TO SKIP PAST THE BLOCK / COPY FAILED! /COPY DOES NOT FINISH / RECOVERING FROM VERIFY READ ERRORS. / SEVERAL EXAMPLES OF USER ERROR RECOVERY FROM VERIFY READ ERRORS: / *DTA1:0-2701DTA1:0 /USER INVOKES COPY COMMAND / VERIFY READ ERROR ON DTA1:0000! /VERIFY READ ERROR OCCURS / RETRY? YES! /USER OPTS TO RETRY / VERIFY READ ERROR ON DTA1:0000! /ERROR PERSISTS / RETRY? NO! /USER OPTS NOT TO RETRY / SKIP PAST PROBLEM BLOCK? YES! /USER OPTS TO SKIP THE BLOCK / COPY FINISHED [WITH ERRORS] /COPY FINISHES / RECOVERING FROM COMPARISON ERRORS. / SEVERAL EXAMPLES OF USER ERROR RECOVERY FROM COMPARISON ERRORS. / (/W NOT INVOKED IN FOLLOWING EXAMPLE.) / *DTA1:0-2701!DTA0:0 /USER INVOKES COMPARISON COMMAND / COMPARISON ERROR! /COMPARISON ERROR OCCURRS / DTA1:0000.0001 /1234 DTA0:0000.0001 /4567 /BOTH VALUES REPORTED / SKIP PAST PROBLEM BLOCK? YES /USER OPTS TO SKIP THE BLOCK / COMPARISON FINISHED [WITH ERRORS] /COMPARISON FINISHES / (/W INVOKED IN FOLLOWING EXAMPLES.) / *DTA1:0!DTA0:0-2701 /USER INVOKES COMPARISON COMMAND / COMPARISON ERROR! /COMPARISON ERROR OCCURRS / DTA1:0000.0001 /1234 DTA0:0000.0001 /4567 /BOTH VALUES REPORTED / SKIP TO NEXT WORD? YES /USER OPTS TO SKIP THE WORD / DTA1:2701.0177 /4321 DTA0:2701.0177 /7654 /BOTH VALUES REPORTED / SKIP TO NEXT WORD? YES /USER OPTS TO SKIP THE WORD / COMPARISON FINISHED [WITH ERRORS] /COMPARISON FINISHES / *DTA1:0!DTA0:0=2702 /USER INVOKES COMPARISON COMMAND / COMPARISON ERROR! /COMPARISON ERROR OCCURRS / DTA1:0000.0001 /1234 DTA0:0000.0001 /4567 /BOTH VALUES REPORTED / SKIP TO NEXT WORD? NO /USER OPTS NOT TO SKIP THE WORD / COMPARISON FAILED! /COMPARISON DOES NOT FINISH / COMMAND ERROR MESSAGES. / INVALID COMMAND - BAD DEVICE UNIT / A LOGICAL UNIT "0"-"7" WAS NOT FOUND AFTER THE DEVICE NAME. / INVALID COMMAND - MISSING DEVICE UNIT / A LOGICAL UNIT "0"-"7" WAS NOT FOUND AFTER THE DEVICE NAME AND BEFORE / THE NEXT SPECIFICATION TERMINATOR ("<", ">", "!" OR ). / INVALID COMMAND - MISSING LENGTH PARAMETER / AN "=" WAS GIVEN WITHOUT THE LENGTH PARAMETER. / INVALID COMMAND - MISSING BLOCK NUMBER / THE BLOCK NUMBER AFTER "DEVU:" WAS NOT PRESENT. / INVALID COMMAND - MISSING COLON / THE ":" CHARACTER AFTER THE DEVICE UNIT IS NOT PRESENT. THIS CHARACTER / MUST BE PRESENT TO SEPARATE THE UNIT AND BLOCK NUMBER. / INVALID COMMAND - MISSING LOWER RANGE BLOCK / THE "-BBBB" CONSTRUCTION WAS GIVEN TO SPECIFY AN UPPER RANGE BLOCK / BUT NOT ADJACENT TO "DEVU:BBBB" WHICH IS THE REQUIRED POSITION FOR / THIS OPTION. / INVALID COMMAND - MISSING UPPER RANGE BLOCK / THE "-" FOR AN UPPER RANGE BLOCK CONSTRUCTION WAS GIVEN, BUT THE / UPPER BLOCK NUMBER IS MISSING. / INVALID COMMAND - MULTIPLE I/O SEPARATORS / THERE MUST BE EXACTLY ONE "<", ">", OR "!" CHARACTERS WITHIN A VALID / COMMAND. EITHER MORE THAN ONE OCCURANCE OR MIXED USAGE OF THESE / SOURCE/DESTINATION SEPARATORS WAS GIVEN. / INVALID COMMAND - MULTIPLE LENGTH/RANGE SPECIFICATIONS / THERE MUST BE EXACTLY ONE RANGE SPECIFICATION OR "=" LENGTH PARAMETER. / EITHER MORE THAN ONE OCCURANCE OR MIXED USAGE OF THESE SPECIFICATIONS / WAS GIVEN. / INVALID COMMAND - MISSING DEVICE NAME / THE DEVICE NAME WHICH STARTS THE "DEVU:BBBB" CONSTRUCTION WAS MISSING. / INVALID COMMAND - NO I/O SEPARATORS / NEITHER "<", ">", NOR "!" COULD BE FOUND IN THE COMMAND. THERE MUST / BE EXACTLY ONE OF THESE IN A VALID COMMAND. / INVALID COMMAND - NO LENGTH/RANGE SPECIFICATIONS / NEITHER AN "=" NOR "-" CONSTRUCTION COULD BE FOUND IN THE COMMAND. / THERE MUST BE EXACTLY ONE OF THESE IN A VALID COMMAND. / DEV NOT AVAILABLE / DEVICE "DEV" IS NOT AVAILABLE TO THIS PROGRAM. USE AVAILABLE DEVICES / FOR COPY/COMPARISON OPERATIONS. / CANNOT REPEAT LATEST OPERATION! / NEW COMMAND INPUT HAS OCCURRED. THE PREVIOUS COMMAND IS LOST AND / CANNOT BE REPEATED. TO REPEAT A COMMAND, RESPOND WITH <^R> AT THE / COMMAND PROMPT INSTEAD OF A COMMAND LINE. INPUTTING <^R> WILL ALSO / ABORT A COMMAND IN PROGRESS AND REPEAT IT FROM THE BEGINNING. / INSUFFICIENT MEMORY FOR REQUESTED OPERATION! / INSUFFICIENT MEMORY EXISTS TO ACCOMODATE THE REQUESTED COMMAND BECAUSE / THE ASSOCIATED HANDLER(S) AND INPUT/OUTPUT (AND VERIFY) BUFFER(S) / CANNOT FIT IN AVAILABLE MEMORY. USE /C TO ACCESS ADDITIONAL MEMORY / IF AVAILABLE, ELSE USE OTHER (SMALLER) HANDLERS IF APPLICABLE. THE / "SYS" AND "NUL" HANDLERS (EFFECTIVELY ZERO LENGTH) ALWAYS ALLOW / FOR ENOUGH MEMORY TO CARRY OUT ANY COPY/COMPARISON OPERATION; THEY / ARE NOT SUBJECT TO THIS ERROR MESSAGE. / FUNCTION EXCEEDS DEVICE LIMITS! / THE LATEST COMMAND ATTEMPTS A COPY/COMPARISON OPERATION BETWEEN / UNLIKE BLOCK SIZE DEVICES. DUE TO HANDLER RESTRICTIONS, A BLOCK / LARGER THAN 4095 (7777 OCTAL) CANNOT BE ACCOMODATED ON ANY HANDLER; / THE LATEST COMMAND ATTEMPTS TO VIOLATE THIS UPPER LIMIT. / NOTE: IT IS ALSO POSSIBLE THAT THE ATTEMPTED TRANSFER MIGHT NOT / BE FEASABLE EVEN IF THIS MESSAGE IS NOT ISSUED. CONSULT SPECIFIC / HANDLER DOCUMENTATION TO DETERMINE INTER-DEVICE TRANSFER LIMITATIONS. / ALL LIKE BLOCK SIZE REQUESTS WILL ALWAYS CORRECTLY FUNCTION UP TO / THE LIMITS OF THE (SMALLER) DEVICE. / SPECIAL CONTROL CHARACTERS. / CERTAIN CHARACTERS HAVE MEANING TO THE PROGRAM IN GENERAL AND OTHERS ONLY / TO THE COMMAND PROCESSOR (THESE ARE MARKED WITH "*"): / EXIT TO THE MONITOR; DON'T TERMINATE BATCH. / <^A> SAME AS . / <^B> SAME AS <^A>. / <^C> EXIT TO MONITOR; PRINT "^C"; TERMINATE BATCH. / * BACKSPACE OVER PREVIOUS CHARACTER IN COMMAND LINE. / IF AT PROMPT, A CHARACTER WILL BE SENT IF / ATTEMPTING TO BACKUP TOO FAR. / * SAME AS . / * SAME AS . / * VIEW CURRENT COMMAND LINE BUFFER WITHOUT TERMINATING / THE COMMAND. / * TERMINATE COMMAND INPUT AND START COMMAND. WHEN / COMMAND IS DONE, RESTART THE PROGRAM. / * OR * TERMINATE COMMAND INPUT AND START COMMAND. DENOTED / BY ECHOING "$" WITHOUT , . EXIT THE PROGRAM / WHEN CURRENT COMMAND IS DONE. / <^U>* IGNORE CURRENT COMMAND LINE AND RESTART COMMAND / LINE PROCESSOR. / <^P> ABORT CURRENT OPERATION AND RESTART THE PROGRAM. / <^R> REPEAT LAST OPERATION; NOT ALLOWED IF THE USER ENTERS / A NEW COMMAND. CAUSES RESTART OF CURRENT COMMAND / IF PRESSED DURING COPY/COMPARISON OPERATION. / <^S> PAUSE PROGRAM UNTIL <^Q> ISSUED FROM TERMINAL OR / USER. THIS IS USED IN THE CONVENTIONAL WAY TO PREVENT / TERMINAL DATA OVERRUN, BUT CAN ACTUALLY PAUSE THE / COPY/COMPARISON OPERATION AS WELL. / <^Q> RELEASE PROGRAM TO CONTINUE EXECUTION AND/OR MESSAGE / PRINTING. / INPUTTING A MAXIMUM WIDTH COMMAND LINE (MORE THAN ADEQUATE FOR ANY REASONABLE / COMMAND) WILL CAUSE FURTHER INPUT TO BE IGNORED AND THE CHARACTER / TO BE ECHOED. THE COMMAND SHOULD THEN BE TERMINATED WITH OR OR / A BACKSPACE OPERATION SHOULD BE PERFORMED. / DEFINITIONS. COPREV= "F&77 /REVISION OF COPY PROGRAM COPVER= 12 /VERSION OF COPY PROGRAM HANDBLK=0122 /HANDLER INFORMATION BLOCK IACS= 6163 /LOAD LINC-8 "S" REGISTER INCON= 0031 /EQUATED FROM CONSOLE! JMSC= JMS . /CURRENT PAGE JMS INSTRUCTION LDA= 1000 /LOAD ACCUMULATOR ON PDP-12 LINC= 6141 /GOT L...MODE IF PDP-12 MAXHND= 40 /LARGEST PAGE COUNT IN A FULL-SIZE (FIELD) BUFFER NL0001= CLA IAC /LOAD AC WITH 0001 NL0002= CLA CLL CML RTL /LOAD AC WITH 0002 NL2000= CLA CLL CML RTR /LOAD AC WITH 2000 NL4000= CLA CLL CML RAR /LOAD AC WITH 4000 NL5777= CLA CLL CMA RTR /LOAD AC WITH 5777 NL7775= CLA CLL CMA RTL /LOAD AC WITH 7775 NL7777= CLA CMA /LOAD AC WITH 7777 OUTCON= 0033 /EQUATED FROM CONSOLE! PDP= 0002 /GOTO GOODY MODE IF PDP-12 SBOOT= 7600 /SYSTEM BOOTSTRAP ADDRESS SBTFUN= 7602 /SYSTEM BOOTSTRAP FUNCTION SCR= 0340 /SCALE RIGHT ON PDP-12 SCRSIZE=7611 /SYSTEM CORE SIZE WORD SFILES= 7757 /FILES PASSES HERE SOUTFLS=7607 /OUTPUT FILE COUNT PASSED HERE SWAL= 7604 /SWITCHES /A-/L SWMX= 7605 /SWITCHES /M-/X SYSIO= 7640 /SYSTEM I/O ENTRY TTY= 0003 /CONSOLE TTY: DEVICE CODE WRITE= 4000 /SYSIO WRITE BIT / DEPENDENT DEFINITIONS. JMSSYSI=SYSIO&177+JMSC /CALL TO SYSIO FROM ITS PAGE KEYCODE=TTY^10+6000 /SKELETON KEYBOARD CODE PRTCODE=TTY+1^10+6000 /SKELETON TELEPRINTER CODE KCCIOT= KEYCODE+2 /CLEAR KEYBOARD FLAG, AC, SET READER RUN KRBIOT= KEYCODE+6 /CLEAR KEYBOARD FLAG, LOAD CHARACTER INTO AC, /SET READER RUN KRSIOT= KEYCODE+4 /OR CHARACTER INTO AC, DON'T CLEAR KEYBOARD FLAG KSFIOT= KEYCODE+1 /SKIP ON KEYBOARD FLAG TLSIOT= PRTCODE+6 /LOAD OUTPUT BUFFER, CLEAR FLAG TSFIOT= PRTCODE+1 /SKIP ON OUTPUT FLAG / DEVICE TABLE OFFSET DEFINITIONS. BOFFSET=3 /BLOCK ENTRY OFFSET EOFFSET=5 /ENTRY POINT OFFSET LOFFSET=4 /HANDLER LENGTH OFFSET *0 /START AT THE BEGINNING XORSWS= . /XOR VALUES FOR OPTION SWITCHES HERE CNTRLBL,0/.-. /LOOP CONTROL BLOCK ESCAPSW,0/.-. / COMMAND TERMINATION SWITCH GBTEMP, 0/.-. /TEMPORARY FOR GET A BUFFER ROUTINE, ETC. GETPTR, .-. /COMMAND BUFFER POINTER NAMPTR, .-. /DEVICE NAME POINTER VERCNT, .-. /VERIFY COUNTER, ETC. VERSW, 1 /VERIFY (WRITE WITH READ-VERIFY) SWITCH VOSW, .-. /VERIFY-ONLY (NO COPY) SWITCH *10 /DEFINE AUTO-INDEX AREA XR1, .-. /AUTO-INDEX NUMBER ONE XR2, .-. /AUTO-INDEX NUMBER TWO XR3, .-. /AUTO-INDEX NUMBER THREE XR4, .-. /AUTO-INDEX NUMBER FOUR CMECNT, .-. /COMPARE ERROR RETRY COUNT INCHAR, .-. /INPUT BUFFER INECNT, .-. /INPUT ERROR RETRY COUNT OTECNT, .-. /OUTPUT ERROR RETRY COUNT *20 /GET PAST AUTO-INDEX AREA BCSW, .-. /COPY/COMPARE ERRORS SWITCH BLKFLG, .-. /INPUT/OUTPUT BLOCK CONTROL FLAG BLOCK, .-. /BLOCK NUMBER BSTFL1, .-. /FIRST BEST FIELD BSTFL2, .-. /SECOND BEST FIELD DEVLATE,.-. /LATEST ENTRY POINTER DEVNUMB,.-. /RELATIVE DEVICE NUMBER DEVPTR, .-. /DEVICE ENTRY POINTER DIVSOR, INITIALIZE/.-. /DIVISOR; INITIALIZED FOR STARTUP GFLPTR, SFILES-1 /FILE POINTER GIVPTR, .-. /BUFFER POINTER HI, .-. /HIGH-ORDER TEMPORARY INDEV, .-. /INPUT DEVICE ADDRESS FOR I/O CALLS INDLEN, .-. /INPUT DEVICE LENGTH INEND, .-. /LAST INPUT BLOCK INFLD, .-.^10 /INPUT BUFFER FIELD INFO, .-. /DEVICE BLOCK-SIZE INFORMATION WORD ININFO, .-. /INPUT HANDLER BLOCK-SIZE INFORMATION WORD IOSW, 0 /ONE-AT-A-TIME MODE SWITCH LENGTH, .-. /-(COPY LENGTH) LFLAG, .-. /COPY LENGTH (SIZE) SCANNED SWITCH LO, .-. /LOW-ORDER TEMPORARY LSCAN, .-. /"<" SCAN COUNTER MAXIO, .-. /MAXIMUM BLOCK COUNT PER ITERATION NAMCNT, .-. /NAME CHARACTER COUNTER OTDLEN, .-. /OUTPUT DEVICE LENGTH OTINFO, .-. /OUTPUT HANDLER BLOCK-SIZE INFORMATION WORD OUTDEV, .-. /OUTPUT DEVICE ADDRESS FOR I/O CALLS OUTEND, .-. /LAST OUTPUT BLOCK QUO, .-. /QUOTIENT REM, .-. /REMAINDER SCRCASE,100 /ALPHABETIC CASE SCRCHAR,.-. /LATEST OUTPUT CHARACTER SCRPTR, .-. /MESSAGE POINTER SINBLK, .-. /FIRST INPUT BLOCK SAVED HERE SINDNUM,4000 /INPUT DEVICE NUMBER SAVED HERE SIZINFO,.-. /CONTROLLING BLOCK SIZE (NEGATED) SOTDNUM,4001 /OUTPUT DEVICE NUMBER SAVED HERE SOUTBLK,.-. /FIRST OUTPUT BLOCK SAVED HERE SVOSW, 4000 /VERIFY-ONLY SWITCH SAVED HERE TABLUNI,.-. /SYSTEM LOGICAL UNIT WHERE DEVICE TABLE, HANDLERS EXIST UNIT, .-. /UNIT NUMBER UPDATE, .-. /LOOP UPDATE FACTOR VERFLD, .-.^10 /VERIFY BUFFER FIELD / I/O ARGUMENTS. / THE DEVICE NUMBERS AND UNITS MUST BE POSITIONED BEFORE THEIR CORRESPONDING / I/O CALLS FOR PROPER OPERATION OF THE "DVBLPRT" ROUTINE. INDNUM, .-. /INPUT DEVICE NUMBER INUNIT, .-. /INPUT DEVICE UNIT INADR, .-. /INPUT TRANSFER ADDRESS INFUN, .-. /INPUT FUNCTION WORD INBLK, .-. /INPUT BLOCK OTDNUM, .-. /OUTPUT DEVICE NUMBER OTUNIT, .-. /OUTPUT DEVICE UNIT OUTADR, .-. /OUTPUT TRANSFER ADDRESS OUTFUN, .-. /OUTPUT FUNCTION WORD OUTBLK, .-. /OUTPUT BLOCK / VERIFY ARGUMENTS. VERADR, .-. /VERIFY TRANSFER ADDRESS VERFUN, .-. /VERIFY FUNCTION WORD VERBLK, .-. /VERIFY INPUT BLOCK PAGE IFNZRO .&177 BLKCPY= . /BLKCPY STARTS HERE BLKCPY, 400 /CONSTANT 0400; HERE IN CASE WE'RE CHAINED TO COPZAP, JMP I DIVSOR/(INITIAL)/**** NORMAL **** TLSIOT **** CONSOLE **** 0000 RESTART,JMS I [CRLF] /DO A , RESTA1, JMS I (GETCMD) /GET COMMAND INPUT TAD INDNUM /GET INPUT DEVICE NUMBER JMS I (LENSET) /GET INPUT DEVICE LENGTH DCA INDLEN /STASH IT TAD INDNUM /GET INPUT DEVICE NUMBER CIA /INVERT IT FOR TESTING TAD OTDNUM /COMPARE TO OUTPUT DEVICE NUMBER SNA CLA /SKIP IF DIFFERENT JMP CLRLENGTH /JUMP IF THEY MATCH TAD OTDNUM /GET OUTPUT DEVICE NUMBER JMS I (LENSET) /GET OUTPUT DEVICE LENGTH CLRLENG,DCA OTDLEN /STASH IT TAD VOSW /GET VERIFY-ONLY SWITCH CIA /INVERT IT FOR TESTING TAD SVOSW /COMPARE TO PREVIOUS VALUE SLNZAP, SZA CLA /**** NOT /N **** SKP CLA JMP BUFCALC /JUMP IF DIFFERENT TAD INDNUM /GET CURRENT INPUT DEVICE NUMBER CIA /INVERT FOR TEST TAD SINDNUM /COMPARE TO PREVIOUS VALUE SZA CLA /SKIP IF IT MATCHES JMP BUFCALC /ELSE FORGET IT TAD OTDNUM /GET CURRENT OUTPUT DEVICE NUMBER CIA /INVERT FOR TEST TAD SOTDNUM /COMPARE TO PREVIOUS VALUE SNA CLA /SKIP IF IT DIFFERS JMP DOITOK /JUMP IF THEY BOTH MATCH BUFCALC,JMS I (HBSETUP) /SETUP HANDLERS, BUFFERS SKP /COULDN'T DO IT JMP DOITOK /NO PROBLEM JMS I [ESCRIBE] /TELL THEM NGMSG /WHAT THEY ASK IS IMPOSSIBLE JMP RESTART /FORGET IT DOITOK, TAD VOSW /GET VERIFY-ONLY SWITCH DCA SVOSW /SAVE FOR NEXT TIME TAD INDNUM /GET INPUT DEVICE NUMBER DCA SINDNUM /SAVE FOR NEXT TIME TAD OTDNUM /GET OUTPUT DEVICE NUMBER DCA SOTDNUM /SAVE FOR NEXT TIME TAD ININFO /GET INPUT BLOCK-SIZE WORD JMS I (BLKCALCULATE) /CALCULATE INPUT TRANSFER LENGTH-1 TAD INBLK /ADD ON FIRST INPUT BLOCK DCA INEND /SAVE LAST INPUT BLOCK TAD OTINFO /GET OUTPUT BLOCK-SIZE WORD JMS I (BLKCALCULATE) /CALCULATE OUTPUT TRANSFER LENGTH-1 TAD OUTBLK /ADD ON FIRST OUTPUT BLOCK DCA OUTEND /SAVE LAST OUTPUT BLOCK TAD I [SWAL] /GET /A-/L SWITCHES AND BLKCPY/(400) /JUST /D BIT SZA CLA /SKIP IF OFF JMP TESTO /JUMP IF ON TAD VOSW /GET VERIFY-ONLY SWITCH SZA CLA /SKIP IF COPYING JMP CMPGUIDE /JUMP IF VERIFYING JMS I [ESCRIBE] /GIVE THEM COPMSG /"COPY" MESSAGE TAD LSCAN /GET "<" SCAN INDICATOR SNA CLA /SKIP IF "OUTPUTOUTPUT" FORM WAS GIVEN JMS OTTOOT /PRINT OUTPUT STUFF NOW JMS I [SCRIBE] /GIVE THEM FROMSG /"FROM" MESSAGE JMS INTOIN /PRINT INPUT STUFF NOW JMP GUIDCOMMON /CONTINUE THERE CMPGUID,JMS I [ESCRIBE] /GIVE THEM COMMSG /"COMPARE" MESSAGE COPYTO, JMS INTOIN /PRINT INPUT STUFF NOW JMS I [SCRIBE] /GIVE THEM TOMSG /"TO" MESSAGE JMS OTTOOT /PRINT OUTPUT STUFF NOW GUIDCOM,JMS I [CRLF] /DO A , TESTO, TAD I [SWMX] /GET /M-/X SWITCHES AND (1000) /JUST /O BIT SZA CLA /SKIP IF OFF JMP DOIT /JUMP IF ON JMS I [ESCRIBE] /GIVE THEM THE RUSMSG /"ARE YOU SURE?" MESSAGE JMS I [YORNO] /GET RESPONSE SKP /YES, DON'T ABORT JMP RESTA1 /NO, JUST FORGET IT DOIT, DCA RHIT /ALLOW <^R> TAD INBLK /GET NEW INPUT BLOCK DCA SINBLK /SAVE IT FOR NEXT TIME TAD OUTBLK /GET NEW OUTPUT BLOCK DCA SOUTBLK /SAVE IT FOR NEXT TIME JMP RESTA2 /CONTINUE THERE / COMES HERE IF <^R> HIT. RHIT, SKP /**** <^R> ALLOWED **** 0000 JMP RGOOD /JUMP IF <^R> ALLOWED JMS I [SCRIBE] /TELL THEM THAT NORMSG /THEY CAN'T DO THAT JMP RESTART /AND THEN RESTART / COMES HERE IF <^R> HIT AND THE REPEAT OPERATION SHOULD BE ALLOWED. RGOOD, TAD SINBLK /GET SAVED FIRST INPUT BLOCK DCA INBLK /RESTORE IT TAD SOUTBLK /GET SAVED FIRST OUTPUT BLOCK DCA OUTBLK /RESTORE IT JMS I [ESCRIBE] /TELL THEM THAT REPMSG /WE ARE REPEATING RESTA2, DCA CNTRLBLK /CLEAR CONTROL BLOCK NL7777 /INDICATE LACK OF DCA BCSW /ERRORS (SO FAR) JMP I (IORESET) /GO START IT UP INTOIN, .-. /INPUT PARTICULARS PRINT ROUTINE JMS I [DVBLPRT] /GIVE THEM INPUT INDNUM-1 /"DEVU:BLOCK" TAD ("-&177) /GET "-" JMS I [P7CH] /PRINT IT TAD INEND /GET LAST INPUT BLOCK JMS I [PRTOCT] /PRINT IT JMP I INTOIN /RETURN OTTOOT, .-. /OUTPUT PARTICULARS PRINT ROUTINE JMS I [DVBLPRT] /GIVE THEM OUTPUT OTDNUM-1 /"DEVU:BLOCK" TAD ("-&177) /GET "-" JMS I [P7CH] /PRINT IT TAD OUTEND /GET LAST OUTPUT BLOCK JMS I [PRTOCT] /PRINT IT JMP I OTTOOT /RETURN PAGE / MAIN I/O LOOP. IOLOOP, TAD CNTRLBLK /GET CONTROL BLOCK CLL /CLEAR LINK FOR TEST TAD LENGTH /COMPARE TO UPPER LIMIT SZL /SKIP IF NOT DONE YET JMP IODONE /FORGET IT TAD UPDATE /ADD ON CURRENT UPDATE FACTOR SNL /SKIP IF THAT WOULD BE TOO FAR JMP IOK /JUMP IF NOT CIA /INVERT AND TAD UPDATE /SUBTRACT FROM UPDATE FACTOR DCA UPDATE /SAVE NEW SMALLER UPDATE FACTOR IOK, CLA /CLEAN UP TAD INBLK /GET CURRENT INPUT BLOCK JMS I (DISPLAY) /DISPLAY IT NL7775 /SETUP THE DCA INECNT /INPUT ERROR RETRY COUNT INPAGN, JMS I (CHKUP) /CHECK FOR <^C>, ETC. TAD ININFO /GET INPUT BLOCK-SIZE WORD JMS I [GETSIZE] /GET ADJUSTED PAGE BITS INUPDAT,.-. /INPUT UPDATE FACTOR TAD INFLD /ADD ON TRANSFER FIELD BITS TAD INUNIT /ADD ON INPUT LOGICAL UNIT DCA INFUN /STORE IN FUNCTION WORD INCFLD, .-. /WILL BE CIF INPUT HANDLER FIELD JMS I INDEV /CALL INPUT HANDLER INADR /ARGUMENT POINTER JMP I (INERROR) /BARF! INPAST, TAD OTINFO /GET OUTPUT BLOCK-SIZE WORD JMS I [GETSIZE] /GET ADJUSTED PAGE BITS OTUPDAT,.-. /OUTPUT UPDATE FACTOR TAD [WRITE] /ADD ON WRITE BIT TAD INFLD /ADD ON TRANSFER FIELD BITS TAD OTUNIT /ADD ON OUTPUT LOGICAL UNIT DCA OUTFUN /STORE IN FUNCTION WORD NL7775 /SETUP THE DCA CMECNT /COMPARE ERROR RETRY COUNT VERAGN, NL7775 /SETUP THE DCA OTECNT /OUTPUT ERROR RETRY COUNT OUTAGN, JMS I (CHKUP) /CHECK FOR <^C>, ETC. TAD OUTBLK /GET CURRENT OUTPUT BLOCK JMS I (DISPLAY) /DISPLAY IT TAD VOSW /GET VERIFY-ONLY SWITCH SZA CLA /SKIP IF OFF JMP OTBYPASS /BYPASS WRITING IF ON OTCFLD, .-. /WILL BE CIF OUTPUT HANDLER FIELD JMS I OUTDEV /CALL OUTPUT HANDLER OUTADR /ARGUMENT POINTER JMP I (OTERROR) /BARF! OTBYPAS,JMS I (CHKUP) /CHECK FOR <^C>, ETC. TAD OUTFUN /GET OUTPUT FUNCTION AND (3707) /JUST PAGE, UNIT BITS TAD VERFLD /ADD ON VERIFY FIELD DCA VERFUN /STORE VERIFY FUNCTION TAD OUTBLK /GET OUTPUT BLOCK DCA VERBLK /USE FOR VERIFY ALSO TAD VERSW /GET VERIFY SWITCH TAD VOSW /ALSO VERIFY-ONLY SWITCH SNA CLA /SKIP IF EITHER SET JMP VERPAST /JUMP IF NOT VERIFYING VECFLD, .-. /WILL BE CIF OUTPUT HANDLER FIELD JMS I OUTDEV /CALL VERIFY HANDLER VERADR /ARGUMENT POINTER JMP I (CMERROR) /BARF! JMS I [GETSIZE] /GET ADJUSTED PAGE COUNT .-. /DUMMY TO BE STORED INTO CLL RAL /TURN INTO WORD COUNT CIA /INVERT AND DCA VERCNT /SAVE AS VERIFY COUNT NL7777 /BACKUP TAD OUTADR /POINT TO DCA XR1 /OUTPUT BUFFER NL7777 /BACKUP TAD VERADR /POINT TO DCA XR2 /VERIFY BUFFER CMPLUP, CDF 00 /**** CHANGED IF ADDITIONAL MEMORY USED **** TAD I XR1 /GET A WORD CIA /INVERT FOR TESTING VERCDF, CDF 00 /**** CHANGED IF ADDITIONAL MEMORY USED **** TAD I XR2 /COMPARE TO CORRESPONDING WORD SZA CLA /SKIP IF IT MATCHES JMP I (CMPERROR) /ELSE COMPLAIN NEXTWD, ISZ VERCNT /DONE YET? JMP CMPLUP /NO, KEEP GOING VERPAST,CDF 00 /BACK TO FIELD ZERO TAD INBLK /\ TAD INUPDATE / >UPDATE INPUT BLOCK DCA INBLK // TAD OUTBLK /\ TAD OTUPDATE / >UPDATE OUTPUT BLOCK DCA OUTBLK // TAD CNTRLBLK /GET CONTROL BLOCK TAD UPDATE /UPDATE IT SNA /MORE TO GO? JMP IODONE /NO, WE'RE DONE DCA CNTRLBLK /YES, STORE BACK TAD IOSW /ARE WE IN ONE-AT-A-TIME MODE? SZA CLA /SKIP IF NOT ISZ IOSW /ARE WE DONE WITH ONE-AT-A-TIME MODE? JMP IOLOOP /NO, JUST KEEP GOING IORESET,TAD MAXIO /YES, RESET TO THE DCA UPDATE /NORMAL UPDATE FACTOR DCA IOSW /CLEAR CRAWL MODE FOR TOTAL RESET FROM HERE JMP IOLOOP /KEEP GOING / COMES HERE WHEN I/O COMPLETES. IODONE, TAD VOSW /GET VERIFY-ONLY SWITCH SZA CLA /SKIP IF OFF JMP VODONE /JUMP IF ON JMS I [ESCRIBE] /TELL THEM CDNMSG /THEY FINISHED THE COPY JMP DONECOMMON /CONTINUE THERE VODONE, JMS I [ESCRIBE] /TELL THEM VDNMSG /THEY FINISHED THE VERIFY DONECOM,TAD BCSW /GET BADNESS SWITCH SZA CLA /SKIP IF BAD JMP NOPROBLEM /JUMP IF NOT JMS I [SCRIBE] /TELL THEM WERMSG /ERRORS OCCURRED NOPROBL,TAD ESCAPSW /GET SWITCH SZA CLA /SKIP IF OFF JMP I [SBOOT] /ELSE EXIT NOW / SINCE THEY WANT TO DO ANOTHER ONE, RESTART. JMP I [RESTART] /GO RESTART IT PAGE / COMES HERE ON INPUT ERROR. INERROR,ISZ INECNT /TOO MANY ERRORS? JMP I (INPAGN) /NO, KEEP GOING JMS IOCHK /CHECK IF IN ONE-AT-A-TIME MODE JMS I [ESCRIBE] /TELL THEM IERMSG /THEY HAVE AN INPUT ERROR JMS I (REPORT) /PRINT OUT THE PARTICULARS INDNUM-1 /OF THEIR PROBLEM JMS I (ASKRETRY) /ASK FOR A RETRY JMP I (IOLOOP) /TRY, TRY AGAIN TAD VOSW /ARE WE JUST VERIFYING? SZA CLA /SKIP IF NOT JMP VRDCOMMON /JUMP IF SO JMS I [SCRIBE] /TELL THEM ABOUT WDBMSG /DUMMY BLOCK OPTION JMS I [YORNO] /GET RESPONSE JMP WDMBLK /YES, GO DO IT FAILURE,TAD VOSW /GET VERIFY MODE SWITCH SZA CLA /SKIP IF COPYING JMP VERFAIL /JUMP IF VERIFYING JMS I [SCRIBE] /TELL THEM CFAMSG /COPY FAILED JMP I [RESTART] /GO TRY AGAIN VERFAIL,JMS I [SCRIBE] /TELL THEM VFAMSG /VERIFY FAILED JMP I [RESTART] /GO TRY AGAIN / COMES HERE TO FAKE INPUT WITH A DUMMY BLOCK IMAGE. WDMBLK, NL7777 /-1 TAD INADR /POINT AT DCA XR1 /INPUT BUFFER TAD [-10] /SETUP THE DCA INECNT /REPEAT COUNT DUMLUP, TAD [-20] /SETUP THE WORD COUNT DCA VERCNT /FOR ONE MESSAGE'S WORTH TAD (DUMMSG-1) /POINT TO DCA XR2 /THE DUMMY MESSAGE DMLOOP, CDF 00 /GOTO MESSAGE FIELD TAD I XR2 /GET A DUMMY WORD DMBCDF, CDF 00 /**** CHANGED IF MORE MEMORY USED **** DCA I XR1 /STORE IN INPUT BUFFER ISZ VERCNT /DONE WITH THIS MESSAGE? JMP DMLOOP /NO, GO BACK ISZ INECNT /FINISHED WITH ENTIRE BLOCK? JMP DUMLUP /NO, GO BACK CDF 00 /BACK TO OUR FIELD DCA BCSW /INDICATE ERRORS JMP I (INPAST) /PRETEND WE GOT INPUT / COMES HERE ON OUTPUT ERROR. OTERROR,ISZ OTECNT /TOO MANY ERRORS? JMP I (OUTAGN) /NO, TRY AGAIN JMS IOCHK /CHECK IF IN ONE-AT-A-TIME MODE JMS I [ESCRIBE] /TELL THEM OERMSG /THEY HAVE AN OUTPUT ERROR JMS I (REPORT) /PRINT OUT THE PARTICULARS OTDNUM-1 /OF THEIR PROBLEM JMS I (ASKRETRY) /ASK FOR A RETRY JMP I (VERAGN) /TRY, TRY AGAIN VRDCOMM,JMS I [SCRIBE] /TELL THEM ABOUT SKPBMSG /THE SKIP BLOCK OPTION JMS I [YORNO] /GET RESPONSE SKP /SKIP IF YES JMP FAILURE /JUMP IF NO DCA BCSW /INDICATE ERRORS JMP I (VERPAST) /CONTINUE PAST ACTUAL I/O / COMES HERE ON COMPARE I/O ERROR. CMERROR,ISZ CMECNT /TOO MANY ERRORS? JMP I (VERAGN) /NO, TRY AGAIN JMS IOCHK /CHECK IF IN ONE-AT-A-TIME MODE TAD VOSW /GET VERIFY-ONLY SWITCH SZA CLA /SKIP IF COPYING JMP VRDERROR /JUMP IF VERIFYING JMS I [ESCRIBE] /TELL THEM THEY HAVE VREMSG /VERIFY READ ERROR JMP CMECOMMON /CONTINUE THERE VRDERRO,JMS I [ESCRIBE] /TELL THEM THEY HAVE IERMSG /INPUT READ ERROR CMECOMM,JMS I (REPORT) /PRINT OUT THE PARTICULARS OTDNUM-1 /OF THEIR PROBLEM JMS I (ASKRETRY) /ASK FOR A RETRY JMP I (INPAST) /TRY, TRY AGAIN JMP VRDCOMMON /CONTINUE THERE IF NOT / COMES HERE ON COMPARE DATA ERROR. CMPERRO,CDF 00 /ENSURE FIELD ZERO JMS IOCHK /CHECK IF IN ONE-AT-A-TIME MODE TAD VOSW /GET VERIFY-ONLY SWITCH SZA CLA /SKIP IF COPYING JMP I (VCMPERROR) /JUMP IF VERIFYING JMS I [ESCRIBE] /TELL THEM THEY HAVE CERMSG /A DATA COMPARE ERROR JMP CMECOMMON /CONTINUE THERE DISPLAY,.-. /BLOCK DISPLAY ROUTINE DCA VERCNT /SAVE PASSED BLOCK NUMBER TAD VERCNT /GET IT BACK IACS /LOAD LINC-8 "S" REGISTER CLA /CLEAN UP LINC /GOT L...MODE IF PDP-12, STOP THE TAPES IF LINC-8 LDA; VERCNT /GET THE PASSED VALUE AGAIN SCR 14 /PUT INTO MQ PDP /BACK TO GOODY MODE CLA /CLEAN UP TAD VERCNT /GET IT AGAIN MQL /LOAD MQ DIRECTLY IF EAE OR PDP-8/E OR BETTER CLA /CLEAN UP IF PDP-8/L OR WORSE JMP I DISPLAY /RETURN IOCHK, .-. /I/O MODE CHECK ROUTINE CLA /CLEAN UP TAD IOSW /GET CURRENT MODE SZA CLA /SKIP IF NORMAL MODE NOW JMP I IOCHK /RETURN IF ALREADY IN ONE-AT-A-TIME MODE TAD MAXIO /GET CURRENT MAXIMUM CIA /INVERT AND DCA IOSW /STORE AS CRAWL COUNT NL0001 /SETUP FOR DCA UPDATE /MINIMUM UPDATE JMP I (IOLOOP) /START AGAIN WITH MINIMUM TRANSFER THIS TIME PAGE / COMES HERE ON DATA COMPARE ERROR IN VERIFY-ONLY MODE. VCMPERR,JMS I [ESCRIBE] /TELL THEM ABOUT CMERMSG /DATA COMPARE ERROR TAD INBLK /GET CURRENT INPUT BLOCK DCA PRTOFFSET /SAVE IT JMS GBSETUP /SETUP OFFSET AND PAGE COUNT TAD ININFO /GET INPUT BLOCK SIZE WORD JMS I [MOD] /MODULATE PAGE COUNT PER THIS DEVICE TAD INBLK /GET CURRENT INPUT BLOCK TAD QUO /ADD ON BLOCK OFFSET DCA INBLK /STORE IN ARGUMENT LIST JMS I [DVBLPRT] /PRINT OUT THE INDNUM-1 /INPUT DEVU:BBBB TAD PRTOFFSET /RESTORE THE ORIGINAL DCA INBLK /INPUT BLOCK JMS PRTOFFSET /PRINT RELATIVE WORD OFFSET TAD XR1 /GET INPUT POINTER JMS PRTVALUE /PRINT CONTENTS OF OFFENDING WORD CMPLUP /CDF INPUT FIELD THERE TAD [" &177] /GET A JMS I [P7CH] /PRINT IT TAD [" &177] /GET A JMS I [P7CH] /PRINT IT TAD OUTBLK /GET CURRENT OUTPUT (SECOND INPUT) BLOCK DCA PRTOFFSET /SAVE IT JMS GBSETUP /SETUP OFFSET AND PAGE COUNT TAD OTINFO /GET OUTPUT (SECOND INPUT) BLOCK SIZE WORD JMS I [MOD] /MODULATE PAGE COUNT PER THIS DEVICE TAD OUTBLK /GET CURRENT OUTPUT (SECOND INPUT) BLOCK TAD QUO /ADD ON BLOCK OFFSET DCA OUTBLK /STORE IN ARGUMENT LIST JMS I [DVBLPRT] /PRINT OUT THE OUTPUT OTDNUM-1 /(SECOND INPUT) DEVU:BBBB TAD PRTOFFSET /RESTORE THE ORIGINAL DCA OUTBLK /OUTPUT (SECOND INPUT) BLOCK JMS PRTOFFSET /PRINT RELATIVE WORD OFFSET TAD XR2 /GET OUTPUT (SECOND INPUT) POINTER JMS PRTVALUE /PRINT CONTENTS OF OFFENDING WORD VERCDF /CDF OUTPUT (SECOND INPUT) FIELD THERE JMS I [CRLF] /DO A , JMS I [SCRIBE] /GIVE THEM THE NEXT BLOCK (OR WORD) MESSAGE WZAP1, SKPBMSG /**** /W **** SKPWMSG JMS I [YORNO] /GET RESPONSE SKP /SKIP IF YES JMP I (FAILURE) /JUMP IF NO DCA BCSW /INDICATE ERRORS JMP I WZAP2 /GO DO NEXT GBSETUP,.-. /OFFSET AND PAGE COUNT SETUP ROUTINE TAD OUTADR /GET BUFFER ADDRESS CIA /-BUFFER ADDRESS TAD XR1 /NOW HAVE RELATIVE OFFSET DCA LO /SAVE IT FOR OTHERS TAD LO /GET IT BACK AND [7600] /JUST PAGE BITS CLL RTL;RTL;RTL /TURN INTO PAGE COUNT DCA GBTEMP /SETUP MODULATION ROUTINE ARGUMENT JMP I GBSETUP /RETURN PRTOFFS,.-. /PRINT BLOCK OFFSET ROUTINE TAD (".&177) /GET A "." JMS I [P7CH] /PRINT IT TAD GBTEMP /GET WHOLE PAGE COUNT CLL RTR;RTR;RTR /TURN INTO WORD COUNT CIA /NEGATE TAD LO /NOW HAVE RELATIVE OFFSET JMS I [PRTOCT] /PRINT IT TAD [" &177] /GET A JMS I [P7CH] /PRINT IT TAD ("/&177) /GET A "/" JMS I [P7CH] /PRINT IT JMP I PRTOFFSET /RETURN PRTVALU,.-. /PRINT CONTENTS ROUTINE DCA HI /SAVE PASSED ADDRESS TAD I PRTVALUE /GET ADDRESS OF CDF INSTRUCTION DCA PRTCDF /STASH IT TAD I PRTCDF /GET THE CDF INSTRUCTION DCA PRTCDF /STORE IN-LINE ISZ PRTVALUE /BUMP PAST ARGUMENT PRTCDF, .-. /WILL BE CDF BUFFER FIELD TAD I HI /GET THE WORD CDF 00 /BACK TO FIELD ZERO JMS I [PRTOCT] /PRINT THE VALUE JMP I PRTVALUE /RETURN / SPECIAL CHARACTER TABLE. CHTBL, -177; BACKSP / -176; GOTESC /176 -175; GOTESC /175 -137; BACKSP /UNDERSCORE -33; GOTESC / -"U!300;DELETL /<^U> -"M!300;GOTCR / -"J!300;LFVIEW / -"I!300;GOTHT / -"H!300;BACKSP / 0 /THIS ENDS THE LIST / SPECIAL RUBOUT CHARACTER TABLE. RUBTBL, -177; RUBAGN / -137; RUBAGN /UNDERSCORE -"H!300;RUBAGN / 0 /THIS ENDS THE LIST / FIELD BUFFER AVAILABILITY TABLE; COPIED TO WORK AREA FOR DYNAMIC ALLOCATION. FIELD0, SBOOT-AVAIL%200 /FIELD ZERO AVAILABLE BUFFER FIELD1, 0 /**** UPDATED IF AVAILABLE **** FIELD2, 0 /**** UPDATED IF AVAILABLE **** FIELD3, 0 /**** UPDATED IF AVAILABLE **** FIELD4, 0 /**** UPDATED IF AVAILABLE **** / FIELD ALLOCATION WORK AREA. WORK0, ZBLOCK 5 /WORK AREA WORKEND=. /END OF WORK AREA WZAP2, VERPAST /**** /W **** NEXTWD PAGE / CHARACTER UNPACKING ROUTINE FOR P?S/8 INPUT FILES. INPUT REVERTS TO CONSOLE / AT . GIVCHR, .-. /GIVE ME A CHARACTER ROUTINE JMP I GIVTRIM /GO WHERE YOU HAVE TO GIVTRIM,GIVEOF /EXIT ROUTINE; INITIALIZED FOR FIRST FILE AND [77] /JUST SIX-BIT SNA /? JMP GIVEOL /YES TAD (-"$!200) /IS IT "$"? SNA /SKIP IF OTHER TAD (33-"$+" -1-100-37) /CONVERT "$" TO TAD (-37+"$-200) /IS IT ? SNA /SKIP IF NOT TAD ("I&37-100-37) /CONVERT TO ASCII SPA /IS IT ALPHABETIC? TAD [100] /YES, ADD ON ASCII BIT TAD (37) /RESTORE THE CHARACTER TO SEVEN-BIT GIVEXIT,DCA INCHAR /SAVE IT TAD INCHAR /GET IT BACK JMP I GIVCHR /RETURN TO MAIN CALLER GIVEOL, TAD (GVRSET) /SETUP THE DCA GIVTRIM /ALIGNED EXIT TAD ["M&37] /GET A JMP GIVEXIT /CONTINUE THERE GIVEOF, ISZ GFLPTR /BUMP TO NEXT FILE TAD I GFLPTR /GET THE FILE ARGUMENT SNA /END OF LIST? JMP GIVEOTEXT /YES, GO FINISH UP AND [7770] /NO, ISOLATE BLOCK BITS DCA GIVBLK /STORE IN-LINE TAD I GFLPTR /GET FILE ARGUMENT AGAIN AND [7] /JUST UNIT BITS TAD [1^100] /MAKE INTO ONE BLOCK READ DCA GIVFUN /STORE IN-LINE JMP GIVEOB /CONTINUE THERE GIVBAK, TAD I GIVPTR /GET A PAIR SNA /? JMP GIVEOF /YES RTR;RTR;RTR /MOVE DOWN THE HIGH-ORDER JMS GIVTRIM /AND CONVERT IT TO SEVEN-BIT TAD I GIVPTR /GET IT AGAIN JMS GIVTRIM /CONVERT LOW-ORDER TO SEVEN-BIT GVRSET, ISZ GIVPTR /BUMP TO NEXT TAD GIVPTR /GET CURRENT POINTER TAD (-GIVBUFFER-200) /COMPARE TO LIMIT SZA CLA /SKIP IF BUFFER EXCEEDED JMP GIVBAK /ELSE KEEP GOING GIVEOB, JMS I [SYSIO] /CALL I/O ROUTINES GIVBPT, GIVBUFFER /TRANSFER ADDRESS GIVFUN, 1^100+.-. /UNIT BITS WILL BE FILLED IN GIVBLK, .-. /BLOCK NUMBER WILL BE FILLED IN ISZ GIVBLK /BUMP FOR NEXT TIME TAD GIVBPTR/(GIVBUFFER) /RESET THE DCA GIVPTR /BUFFER POINTER JMP GIVBAK /KEEP GOING GIVEOTX,TAD (JMS I [INPUT]) /RESTORE THE DCA I (GETINP) /INPUT ROUTINE JMP I (GETINP) /CONTINUE THERE / COMMAND INPUT BUFFER. COMBUFF,ZBLOCK 74 /COMMAND STORED HERE COMBEND,0 /ROOM FOR FINAL DELIMITER PAGE GIVBUFF=. /FILE INPUT BUFFER *GIVBUFFER+200 /GET PAST FILE BUFFER / SUPPORT ROUTINES. INPUT, .-. /INPUT ROUTINE JMS CHKUP /CHECK FOR INPUT TAD INCHAR /WAS THERE ANY? SNA /SKIP IF SO JMP .-3 /ELSE WAIT FOR IT JMP I INPUT /RETURN CHKUP, .-. /CHECK FOR <^P>, <^C>, ETC. JMS CTLCTST /TEST FOR <^C>, ETC. SZA /SKIP IF NOTHING THERE TAD (-"Q!300) /ELSE COMPARE TO <^Q> SNA /SKIP IF SOMETHING ELSE JMP CHKCLR /IGNORE <^Q> IAC /TAD (-"P+"Q)/IS IT <^P>? SNA /SKIP IF NOT JMP PHIT /JUMP IF SO TAD (-"R+"P) /IS IT <^R>? SNA /SKIP IF NOT JMP I [RHIT] /JUMP IF SO TAD [-"S+"R] /IS IT <^S>? SZA CLA /SKIP IF SO JMP I CHKUP /RETURN IF NOT JMS CTLCTST /WAIT FOR <^Q> TAD (-"Q!300) /IS IT <^Q>? SZA CLA /SKIP IF SO JMP .-3 /GO BACK IF NOT CHKCLR, DCA INCHAR /CLEAR INPUT BUFFER JMP I CHKUP /RETURN CTLCTST,.-. /CHECK FOR <^C>, ETC. CLA /CLEAN UP CHKKSF, KSFIOT /**** CONSOLE **** CIF MCS+10 CHKJMP, JMP I CTLCTST /**** CONSOLE **** JMS INCON CHKKRS, KRSIOT/OR KRBIOT /**** CONSOLE **** JMP I CTLCTST AND [177] /JUST SEVEN BITS DCA INCHAR /SAVE IT NL7775 /-3 TAD INCHAR /COMPARE TO LATEST SNA /SKIP IF NOT <^C> ISZ I (SCRSIZE) /ELSE SET SOFT INDICATOR SPA SNA CLA /SKIP IF <^D> OR HIGHER JMP I [SBOOT] /ELSE GO SAVE LAST BUFFER AND LEAVE CHKKCC, KCCIOT/OR 0000 /**** CONSOLE **** 0000 TAD INCHAR /GET THE CHARACTER JMP I CTLCTST /RETURN P7CH, .-. /SEVEN-BIT OUTPUT ROUTINE DCA P7TEMP /SAVE PASSED VALUE P7AGN, JMS CHKUP /CHECK FOR <^C>, ETC. TAD P7TEMP /GET THE CHARACTER JMS P7OUT /TRY TO OUTPUT IT JMP P7AGN /CHECK INPUT WHILE WAITING JMS CHKUP /CHECK FOR <^C>, ETC. JMP I P7CH /RETURN P7OUT, .-. /SEVEN BIT I/O ROUTINE P7TSF, TSFIOT /**** CONSOLE **** CIF MCS+10 P7JMP, JMP I P7OUT /**** CONSOLE **** JMS OUTCON P7TLS, TLSIOT /**** CONSOLE **** JMP I P7OUT CLA!400 /CLEAN UP ISZ P7OUT /BUMP RETURN ADDRESS JMP I P7OUT /RETURN / COMES HERE IF <^P> HIT. PHIT, TAD ["^&177] /GET AN "^" JMS P7OUT /PRINT IT JMP .-1 /WAIT FOR IT TAD ("P&177) /GET A "P" JMS P7OUT /PRINT IT JMP .-1 /WAIT FOR IT JMP I [RESTART] /RESTART CRLF, .-. /, ROUTINE CLA /CLEAN UP FOR DIRTY CALLERS TAD ["M&37] /GET A JMS I [P7CH] /GO PRINT IT TAD ("J&37) /GET A JMS I [P7CH] /GO PRINT IT JMP I CRLF /RETURN ESCRLF, .-. / SWITCH TEST ROUTINE CLA /CLEAN UP JUST IN CASE TAD ESCAPSW /GET INDICATOR SMA CLA /SKIP IF SET TO INITIAL VALUE JMP I ESCRLF /RETURN IF SET TO SECOND VALUE OR NOT SET AT ALL NL2000 /SET SECOND VALUE DCA ESCAPSW /STORE NEW INDICATOR FOR NEXT TIME JMS I [CRLF] /DO A , NOW JMP I ESCRLF /RETURN / ROTATE THREE LEFT ROUTINE. RTL3, .-. /ROTATE THREE LEFT CLL RTL;RAL /MOVE THREE TO THE LEFT JMP I RTL3 /RETURN / OCTAL PRINTOUT ROUTINE. PRTOCT, .-. /OCTAL PRINT ROUTINE DCA LENSET /SAVE PASSED VALUE TAD (-4) /SETUP THE DCA VERCHK /DIGIT COUNT OCTLUP, TAD LENSET /GET THE VALUE JMS I [RTL3] /MOVE UP ONE DIGIT DCA LENSET /STORE BACK TAD LENSET /GET IT AGAIN RAL /ADJUST LATEST TO LOW-ORDER AND [7] /JUST LATEST DIGIT TAD ["0&177] /MAKE IT ASCII JMS I [P7CH] /PRINT IT ISZ VERCHK /DONE YET? JMP OCTLUP /NO, KEEP GOING JMP I PRTOCT /YES, RETURN / DEVICE LENGTH SET ROUTINE; RETURNS ZERO LENGTH IF DEVICE IS "SYS" OR "NUL". LENSET, .-. /DEVICE LENGTH ROUTINE SZA /IS IT DEVICE NUMBER ZERO (SYS)? TAD [-1] /NO, TRY DEVICE NUMBER ONE (NUL) SNA /SKIP IF NOT DEVICE "SYS" OR DEVICE "NUL" JMP I LENSET /JUST RETURN ZERO LENGTH IAC /RESTORE ORIGINAL VALUE JMS I [RTL3] /*10 TAD (DTABLE+LOFFSET)/POINT AT LENGTH ELEMENT DCA VERCNT /STASH THE POINTER TAD I VERCNT /GET THE LENGTH JMP I LENSET /RETURN VERCHK, .-. /CHECK IF VERIFYING ROUTINE TAD VOSW /GET VERIFY-ONLY SWITCH SNA CLA /SKIP IF VERIFYING NL2000 /ELSE SETUP /N BIT MASK AND I [SWMX] /GET /N BIT IF ALLOWED SNA CLA /SKIP IF /N SET AND NOT IN VERIFY-ONLY MODE ISZ VERCHK /BUMP RETURN IF /N NOT SET OR IN VERIFY-ONLY MODE JMP I VERCHK /RETURN EITHER WAY P7TEMP, .-. /TEMPORARY FOR OUTPUT PAGE / MESSAGE PRINTING ROUTINE WITH SPECIAL CONSIDERATION. ESCRIBE,.-. /SCRIBE WITH ROUTINE JMS I [ESCRLF] /CHECK IF , NEEDED HERE TAD ESCRIBE /GET OUR CALLER DCA SCRIBE /MAKE IT THEIRS SKP /DON'T EXECUTE HEADER! / MESSAGE PRINTING ROUTINE. SCRIBE, .-. /MESSAGE PRINT ROUTINE CLA /JUST IN CASE TAD I SCRIBE /GET MESSAGE POINTER DCA SCRPTR /STASH IT ISZ SCRIBE /BUMP PAST ARGUMENT TAD (140) /INITIALIZE TO LOWER-CASE CASZP1, DCA SCRCASE /**** /U **** CLA!400 SCRLUP, TAD I SCRPTR /GET LEFT HALF-WORD RTR;RTR;RTR /MOVE OVER JMS SCRPRNT /PRINT IT TAD I SCRPTR /GET RIGHT HALF-WORD JMS SCRPRNT /PRINT IT ISZ SCRPTR /BUMP TO NEXT PAIR JMP SCRLUP /KEEP GOING SCRPRNT,.-. /CHARACTER PRINT ROUTINE AND [77] /JUST SIX-BIT SNA /END OF MESSAGE? JMP I SCRIBE /YES, RETURN TO ORIGINAL CALLER DCA SCRCHAR /NO, SAVE FOR NOW TAD SCRCHAR /GET IT BACK TAD (-"%!200) /IS IT "%"? SNA /SKIP IF NOT JMP SCRCRLF /JUMP IF IT MATCHES TAD [-"^+100+"%] /IS IT "^" SNA CLA /SKIP IF NOT JMP SCRFLIP /JUMP IF IT MATCHES TAD SCRCHAR /GET THE CHARACTER AND [40] /DOES CASE MATTER? SNA CLA /SKIP IF NOT TAD SCRCASE /ELSE GET PREVAILING CASE TAD SCRCHAR /GET THE CHARACTER JMS I [P7CH] /PRINT THE CHARACTER JMP I SCRPRNT /RETURN SCRCRLF,JMS I [CRLF] /DO A , JMP I SCRPRNT /RETURN SCRFLIP,TAD SCRCASE /GET CURRENT CASE CIA /INVERT IT TAD (140+100) /ADD SUM OF POSSIBLE VALUES CASZP2, DCA SCRCASE /**** /U **** CLA!400 JMP I SCRPRNT /RETURN ASKRETR,.-. /ASK FOR RETRY ROUTINE JMS I [SCRIBE] /GIVE THEM RETMSG /THE RETRY REQUEST JMS I [YORNO] /GET RESPONSE SKP /YES, DON'T BUMP ISZ ASKRETRY /BUMP RETURN ADDRESS IF NO JMP I ASKRETRY /RETURN EITHER WAY YORNO, .-. /YES OR NO ROUTINE YNAGN, JMS I [INPUT] /GET A CHARACTER AND (137) /MAKE IT CASE-LESS TAD (-"Y!200) /IS IT "Y"? SNA /SKIP IF NOT JMP ISYES /JUMP IF IT MATCHES TAD (-"N+"Y) /IS IT "N"? SNA CLA /SKIP IF NOT JMP ISNO /JUMP IF IT MATCHES TAD ["G&37] /GET A JMS I [P7CH] /RING IT JMP YNAGN /TRY AGAIN ISYES, JMS I [SCRIBE] /TELL THEM YESMSG /YES JMP I YORNO /TAKE FIRST RETURN ISNO, JMS I [SCRIBE] /TELL THEM NOMSG /NO ISZ YORNO /BUMP RETURN ADDRESS JMP I YORNO /TAKE SKIP RETURN REPORT, .-. /ERROR REPORTING ROUTINE JMS I [SCRIBE] /TELL THEM EONMSG /COMMON MESSAGE TAD I REPORT /GET IN-LINE POINTER DCA REPINLINE /STORE IN-LINE JMS I [DVBLPRT] /PRINT "DEVU:BLOCK" REPINLI,.-. /WILL BE PASSED POINTER ARGUMENT TAD ("!&177) /GET A "!" JMS I [P7CH] /PRINT IT JMS I [CRLF] /DO A , ISZ REPORT /BUMP PAST POINTER ARGUMENT JMP I REPORT /RETURN MOD, .-. /MODULATION ROUTINE JMS I [SIZESETUP] /SETUP DIVISOR FROM PASSED INFORMATION WORD TAD GBTEMP /GET DIVIDEND JMS I [DIVIDE] /DIVIDE BY DIVISOR CLA /CLEAN UP TAD DIVSOR /GET THE DIVISOR CIA /INVERT IT DCA GBTEMP /USE FOR COUNTING UP TAD QUO /GET QUOTIENT ISZ GBTEMP /DONE ENOUGH? JMP .-2 /NO, GO GET IT AGAIN DCA GBTEMP /SAVE MODULATED RESULT JMP I MOD /RETURN GETSIZE,.-. /GET SIZE OF LATEST TRANSFER IN PAGES JMS I [SIZESETUP] /SETUP DIVISOR FROM PASSED INFORMATION WORD TAD SIZINFO /GET SIZE FACTOR DCA GBTEMP /SETUP THE COUNTER TAD UPDATE /GET BLOCK UPDATE FACTOR ISZ GBTEMP /DONE ENOUGH JMP .-2 /NO, DO IT AGAIN DCA GBTEMP /SAVE IT TAD GBTEMP /GET IT BACK JMS I [DIVIDE] /DIVIDE BY SETUP DIVISOR DCA I GETSIZE /STORE QUOTIENT ISZ GETSIZE /BUMP PAST ARGUMENT TAD REM /GET REMAINDER CIA /INVERT IT SZA /SKIP IF REMAINDER IS ZERO TAD DIVSOR /ELSE CREATE ROUNDUP FACTOR TAD GBTEMP /GET ORIGINAL PAGE COUNT CLL RTL;RTL;RTL /TURN INTO PAGE BITS (FOR FUNCTION WORD) AND [3700] /JUST PAGE BITS JMP I GETSIZE /RETURN WITH ADJUSTED BLOCKS*(PAGES/BLOCK) PAGE / BLOCK COUNT CALCULATION ROUTINE. BLKCALC,.-. /BLOCK COUNT CALCULATION ROUTINE JMS I [SIZESETUP] /CALCULATE DIVISOR FROM PASSED INFORMATION WORD DCA LO /CLEAR LOW-ORDER DCA HI /CLEAR HIGH-ORDER TAD SIZINFO /GET PREVAILING BLOCK-SIZE DCA GBTEMP /USE AS COUNTER IN MULTIPLYING MUYLUP, TAD LENGTH /GET COPY LENGTH (NEGATED) CLL CIA /WANT POSITIVE FORM (LINK SETS IF 4K) TAD LO /ADD ON LOW-ORDER DCA LO /STORE BACK RAL /GET CARRY TAD HI /ADD ON HIGH-ORDER DCA HI /STORE BACK ISZ GBTEMP /DONE ENOUGH? JMP MUYLUP /NO, KEEP GOING / NOW HAVE TOTAL PAGES IN HI, LO. DCA QUO /CLEAR LOW-ORDER QUOTIENT DCA REM /CLEAR HIGH-ORDER QUOTIENT DVILUP, TAD DIVSOR /GET LOW-ORDER DIVISOR CLL CIA /WANT NEGATIVE FORM WITH CLEAR LINK TAD LO /SUBTRACT FROM LOW-ORDER DCA LO /STORE BACK LOW-ORDER RAL /GET CARRY TAD [7777] /ADD ON HIGH-ORDER DIVISOR TAD HI /SUBTRACT FROM HIGH-ORDER DCA HI /STORE BACK SNL /SKIP IF MORE TO DO JMP DIVDONE /JUMP IF DONE ISZ QUO /BUMP UP LOW-ORDER QUOTIENT SKP /SKIP NEXT IF NO OVERFLOW ISZ REM /ELSE BUMP HIGH-ORDER QUOTIENT JMP DVILUP /KEEP GOING DIVDONE,TAD LO /GET CURRENT LOW-ORDER TAD DIVSOR /RESTORE ONE DIVISOR'S WORTH SZA CLA /SKIP IF DIVIDE WAS EXACT ISZ QUO /ELSE ROUNDUP LOW-ORDER QUOTIENT SKP /SKIP NEXT IF NO OVERFLOW ISZ REM /ELSE BUMP HIGH-ORDER QUOTIENT NL7777 CLL /SET BACKUP FACTOR WITH CLEAR LINK TAD QUO /GET LOW-ORDER QUOTIENT DCA QUO /STORE BACK RAL /GET CARRY TAD [7777] /ADD ON HIGH-ORDER BACKUP FACTOR TAD REM /ADD ON HIGH-ORDER QUOTIENT SZA CLA /SKIP IF QUOTIENT-1 IS LESS THAN 4K JMP OVFL /JUMP IF NOT TAD QUO /GET LOW-ORDER QUOTIENT-1 JMP I BLKCALCULATE /RETURN / COMES HERE IF CALCULATION IS TOO LARGE. OVFL, JMS I [ESCRIBE] /TELL THEM OVFLMSG /TRANSFER IS IMPOSSIBLY LARGE JMP I [RESTART] /RESTART / DEVICE NAME-UNIT-":"-BLOCK PRINT ROUTINE. DVBLPRT,.-. /"DEVU:BLOCK" PRINT ROUTINE TAD I DVBLPRT /GET IN-LINE POINTER DCA XR3 /STASH IT TAD I XR3 /GET THE DEVICE NUMBER JMS I [RTL3] /*10 TAD (DTABLE-1) /POINT AT DCA XR4 /DEVICE NAME TAD I XR4 /GET FIRST DEVICE NAME CHARACTER JMS I [P7CH] /PRINT IT TAD I XR4 /GET SECOND DEVICE NAME CHARACTER JMS I [P7CH] /PRINT IT TAD I XR4 /GET THIRD DEVICE NAME CHARACTER JMS I [P7CH] /PRINT IT TAD I XR3 /GET THE UNIT TAD ["0&177] /MAKE IT ASCII JMS I [P7CH] /PRINT IT TAD [":&177] /GET A ":" JMS I [P7CH] /PRINT IT ISZ XR3 /BUMP TO ADDRESS ISZ XR3 /BUMP TO FUNCTION WORD TAD I XR3 /GET THE BLOCK NUMBER JMS I [PRTOCT] /PRINT IT ISZ DVBLPRT /BUMP PAST POINTER ARGUMENT JMP I DVBLPRT /RETURN SIZESET,.-. /BLOCK-SIZE SETUP ROUTINE AND [7600] /JUST BLOCK-SIZE BITS CLL RTL;RTL;RTL /MOVE DOWN IAC /MAKE ORIGIN ONE DCA DIVSOR /STORE AS DIVISOR JMP I SIZESETUP /RETURN DMATCH, .-. /DEVICE NAME MATCH ROUTINE DCA DEVNUMBER /CLEAR DEVICE NUMBER TAD (DTABLE) /INITIALIZE THE POINTER TO DMAGAIN,DCA DEVLATEST /LATEST TABLE ENTRY JMS I [NAMSETUP] /SETUP NAME PARAMETERS TAD DEVLATEST /GET LATEST TRIAL POINTER DCA DEVPTR /SET IT UP DMALUP, TAD I NAMPTR /GET A NAME WORD CIA /INVERT FOR TEST TAD I DEVPTR /COMPARE TO TABLE ENTRY WORD SZA CLA /SKIP IF IT MATCHES JMP DMDIFFERENT /JUMP IF NOT ISZ NAMPTR /BUMP TO NEXT NAME WORD ISZ DEVPTR /BUMP TO NEXT TABLE WORD ISZ NAMCNT /CHECKED ALL YET? JMP DMALUP /NO, GO BACK TAD DEVNUMBER /GET RELATIVE TABLE ENTRY NUMBER JMP I DMATCH /RETURN DMDIFFE,TAD I DEVLATEST /GET LATEST ENTRY SZA CLA /SKIP IF AT END OF TABLE JMP DMNEXT /ELSE KEEP GOING NL7777 /SET BAD VALUE JMP I DMATCH /RETURN DMNEXT, ISZ DEVNUMBER /BUMP COUNT TO NEXT ENTRY TAD DEVLATEST /GET LATEST POINTER TAD [10] /BUMP TO NEXT ENTRY JMP DMAGAIN /CONTINUE THERE DIVIDE, .-. /DIVIDE ROUTINE DCA REM /SAVE DIVIDEND DCA QUO /CLEAR QUOTIENT TAD REM /GET DIVIDEND BACK STL CIA /INVERT SKP /DON'T BUMP FIRST TIME DIVLUP, ISZ QUO /BUMP UP QUOTIENT TAD DIVSOR /ADD ON DIVISOR SNA SZL /UNDERFLOW? JMP DIVLUP /NO, KEEP GOING CIA /YES, INVERT IT BACK TAD DIVSOR /RESTORE LOST VALUE DCA REM /SAVE AS REMAINDER TAD QUO /GET THE QUOTIENT JMP I DIVIDE /RETURN PAGE / BLOCK COMMAND DECODER ROUTINE. / CALL WITH: / JMS I (GETCMD) /CALL ROUTINE / RETURNS: / INBLK /FIRST INPUT BLOCK / INDNUM /INPUT DEVICE NUMBER / ININFO /INPUT HANDLER BLOCK-SIZE INFORMATION WORD / INUNIT /INPUT DEVICE UNIT / OTDNUM /OUTPUT DEVICE NUMBER / OTINFO /OUTPUT HANDLER BLOCK-SIZE INFORMATION WORD / OTUNIT /OUTPUT DEVICE UNIT / OUTBLK /FIRST OUTPUT BLOCK / SETS: / BLKFLG /INPUT/OUTPUT BLOCK CONTROL FLAG: /0= INPUT CONTROLS BLOCK-SIZE, /1= OUTPUT CONTROLS BLOCK-SIZE / LENGTH /-(LENGTH) OF COPY / ESCAPSW /0= , 4000= TERMINATED COMMAND / VOSW /0= COPY, 1= VERIFY-ONLY (I/O SEPARATOR IS "!") GETCMD, .-. /GET COMMAND ROUTINE CMDAGN, CLA /CLEAN UP JMS I (GETBUFFER) /GET THE INPUT BUFFER TYPED IN TAD [COMBUFFER] /POINT TO THE DCA GETPTR /INPUT BUFFER JMS I (GETCHR) /GET FIRST VIABLE CHARACTER SNA CLA /SKIP IF SOMETHING THERE JMP NULLINPUT /JUMP IF NOT TAD (SKP) /RESET THE DCA I [RHIT] /<^R> ROUTINE DCA RSCAN /INITIALIZE DCA LSCAN /THE DCA ESCAN /SCAN DCA MSCAN /COUNTERS DCA BLKFLG /ASSUME INPUT CONTROLS THE BLOCK SIZE DCA VOSW /ASSUME NORMAL COPY, NOT VERIFY-ONLY / WE PRESCAN THE COMMAND TO ASCERTAIN ITS OVERALL TYPE. COPY COMMANDS ARE / ALLOWED TO BE EITHER "OUTPUTOUTPUT." VERIFY-ONLY COMMANDS / ARE "FIRST!SECOND." COPY LENGTH CAN BE SET BY EITHER "BLOCK-BLOCK" ON EITHER / INPUT OR OUTPUT (NOT BOTH) OR WITH "=LENGTH" PLACED ANYWHERE IN THE COMMAND. PRESCAN,JMS I (GETCHR) /GET A CHARACTER SNA /END OF BUFFER? JMP ENDSCAN /YES, WE'RE DONE WITH PRESCAN TAD (-">!200) /IS IT ">"? SNA /SKIP IF NOT ISZ RSCAN /ELSE BUMP UP COUNT TAD (-"<+">) /IS IT "<"? SNA /SKIP IF NOT ISZ LSCAN /ELSE BUMP UP COUNT TAD [-"-+"<] /IS IT "-"? SNA /SKIP IF NOT ISZ MSCAN /ELSE BUMP UP COUNT TAD [-"=+"-] /IS IT "="? SNA /SKIP IF NOT ISZ ESCAN /ELSE BUMP UP COUNT TAD (-"!+"=) /IS IT "!"? SNA CLA /SKIP IF NOT ISZ VOSW /ELSE BUMP UP COUNT ISZ GETPTR /BUMP TO NEXT JMP PRESCAN /KEEP GOING / THE PRESCAN IS OVER; WE NOW CAN TELL WHAT TYPE OF COMMAND THIS IS AND VALIDATE / ITS FORM. CHECK IF I/O SEPARATOR AND LENGTH SPECIFICATION ARE CORRECT. ENDSCAN,NL7777 /-1 TAD LSCAN /ADD ON "<" COUNT TAD RSCAN /ADD ON ">" COUNT TAD VOSW /ADD ON "!" COUNT SZA /SKIP IF EXACTLY ONE OF ABOVE JMP SEPCOMPLAIN /COMPLAIN ABOUT BOTCHED SEPARATORS NL7777 /-1 TAD MSCAN /ADD ON "-" COUNT TAD ESCAN /ADD ON "=" COUNT SZA /SKIP IF EXACTLY ONE OF ABOVE JMP LENCOMPLAIN /COMPLAIN ABOUT BOTCHED LENGTH/RANGE SPECIFICATION TAD [COMBUFFER] /RESET THE DCA GETPTR /BUFFER POINTER JMS I (SCAN) /SCAN FIRST "DEVU:BLOCK" TAD LSCAN /GET "<" INDICATOR SNA CLA /SKIP IF SET JMP DOIN /MUST BE ">" OR "!" JMS SETOUT /STORE OTUNIT, OUTBLK, OTDNUM JMP DOMORE /CONTINUE THERE / MUST BE "INPUT>OUTPUT" OR "FIRST!SECOND." DOIN, JMS SETIN /STORE INUNIT, INBLK, INDNUM DOMORE, ISZ GETPTR /BUMP POINTER PAST DELIMITER JMS I (SCAN) /GET SECOND "DEVU:BLOCK" TAD LSCAN /GET "<" INDICATOR SZA CLA /SKIP IF NOT SET JMP DOIN2 /MUST BE "<" JMS SETOUT /STORE OTUNIT, OUTBLK, OTDNUM SKP /DON'T DO IT AGAIN! DOIN2, JMS SETIN /STORE INUNIT, INBLK, INDNUM JMP I GETCMD /RETURN / COMES HERE IF NOT EXACTLY ONE I/O SEPARATOR. SEPCOMP,SPA CLA /SKIP IF TOO MANY SEPARATORS JMP MISSEPARATOR /JUMP IF NONE JMS COMPLAIN /COMPLAIN OF MULSEPARATORS /TOO MANY SEPARATORS MISSEPA,JMS COMPLAIN /COMPLAIN OF NULSEPARATORS /NO SEPARATORS / COMES HERE IF NOT EXACTLY ONE LENGTH/RANGE SPECIFICATION. LENCOMP,SPA CLA /SKIP IF TOO MANY SPECIFIERS JMP MISSPECIFICATION/JUMP IF NONE JMS COMPLAIN /COMPLAIN OF MULSPECIFICATIONS /TOO MANY SPECIFICATIONS MISSPEC,JMS COMPLAIN /COMPLAIN OF NULSPECIFICATIONS /NO SPECIFICATIONS / COMES HERE IF NULL INPUT BUFFER. NULLINP,TAD ESCAPSW /GET TERMINATION INDICATOR SNA CLA /SKIP IF WAS USED JMP CMDAGN /JUST GET ANOTHER BUFFER JMP I [SBOOT] /EXIT TO MONITOR SETIN, .-. /SET INPUT PARAMETERS ROUTINE TAD UNIT /GET CURRENT UNIT DCA INUNIT /STORE IT TAD BLOCK /GET CURRENT BLOCK DCA INBLK /STORE IT TAD DEVNUMBER /GET DEVICE NUMBER DCA INDNUM /STORE IT TAD INFO /GET INFORMATION WORD DCA ININFO /STORE IT JMP I SETIN /RETURN SETOUT, .-. /SET OUTPUT PARAMETERS ROUTINE TAD UNIT /GET CURRENT UNIT DCA OTUNIT /STORE IT TAD BLOCK /GET CURRENT BLOCK DCA OUTBLK /STORE IT TAD DEVNUMBER /GET DEVICE NUMBER DCA OTDNUM /STORE IT TAD INFO /GET INFORMATION WORD DCA OTINFO /STORE IT TAD LFLAG /GET LENGTH-FOUND FLAG SZA CLA /SKIP IF OFF ISZ BLKFLG /INDICATE OUTPUT CONTROL OF BLOCK SIZE JMP I SETOUT /RETURN COMPLAI,.-. /GRIPING ROUTINE JMS I [ESCRIBE] /TELL THEM INVMSG /OPENING MESSAGE TAD I COMPLAIN /GET ARGUMENT DCA .+2 /STORE IN-LINE JMS I [SCRIBE] /TELL THEM .-. /THIS MESSAGE NAENTRY,JMS I [CRLF] /DO A , JMP CMDAGN /GO RESTART THE DECODER ESCAN, .-. /"=" COUNTER MSCAN, .-. /"-" COUNTER RSCAN, .-. /">" COUNTER PAGE SCAN, .-. /SCAN "DEVU:BLOCK", ETC. ROUTINE DCA BLKSW /INDICATE WE DIDN'T SCAN THE BLOCK PART YET DCA LFLAG /LENGTH NOT FOUND YET JMS I [NAMSETUP] /SETUP DEVICE NAME BUFFER STUFF DCA I NAMPTR /CLEAR A WORD ISZ NAMPTR /BUMP TO NEXT ISZ NAMCNT /DONE YET? JMP .-3 /NO, KEEP GOING SCNLUP, JMS I (ENDTEST) /ARE WE DONE WITH THIS ONE? JMP SCNTEST /YES, TEST IF WE GOT ANYTHING JMS I (GETCHR) /NO, GET A CHARACTER TAD (-"-!200) /IS IT "-"? SNA /SKIP IF NOT JMP GOTMINUS /JUMP IF SO TAD [-"=+"-] /IS IT "="? SNA CLA /SKIP IF NOT JMP GOTEQUALS /JUMP IF SO JMS I [NAMSETUP] /SETUP DEVICE NAME BUFFER STUFF NAMLUP, JMS I (GETCHR) /GET A CHARACTER TAD (-"[!200) /ADD ON UPPER LIMIT CLL /CLEAR LINK FOR TEST TAD ("[-"A) /ADD ON RANGE SNL CLA /SKIP IF VALID JMP NAMATCH /JUMP IF NOT JMS I (GETCHR) /GET THE CHARACTER DCA I NAMPTR /STORE IN NAME BUFFER ISZ NAMPTR /BUMP TO NEXT ISZ GETPTR /BUMP TO NEXT CHARACTER ISZ NAMCNT /DONE MAXIMUM (3) YET? JMP NAMLUP /NO, GO BACK NAMATCH,JMS I (DMATCH) /DOES IT MATCH A TABLE ELEMENT? SPA /SKIP IF SO JMP NAMENF /JUMP IF NOT JMS I (ENTSETUP) /GET ENTRY POINT WORD AND [7600] /JUST BLOCK-SIZE BITS DCA INFO /SAVE INFO JMS I (GETDIGIT) /GET DEVICE UNIT NUMBER JMP BADUNIT /WASN'T RIGHT DCA UNIT /STORE IT JMS I (GETCHR) /GET NEXT CHARACTER TAD (-":!200) /COMPARE TO ":" SZA CLA /SKIP IF IT MATCHES JMP BADCOLON /JUMP IF NOT JMS I (GETNUMBER) /GET THE BLOCK NUMBER JMP BADBLK /THEY SCREWED THAT UP! DCA BLOCK /STORE IT ISZ BLKSW /ALLOW "BLOCK-BLOCK" RANGE FORM JMP SCNLUP /KEEP GOING / COMES HERE IF WE GOT SOMETHING (OR NOTHING!). SCNTEST,TAD I (NAMBUFFER) /ANYTHING THERE? SZA CLA /SKIP IF NOT JMP I SCAN /RETURN IF OK / COMES HERE IF THERE IS NO DEVICE NAME. NONAME, JMS I (COMPLAIN) /COMPLAIN OF NODEV /NO DEVICE NAME / COMES HERE IF "-" FOUND. GOTMINU,JMS I (GETNUMBER) /GET THE UPPER BLOCK JMP NOHIGH /WASN'T ANY CMA /INVERT AND TAD BLOCK /ADD ON LOWER VALUE DCA LENGTH /STORE AS FINAL LENGTH TAD BLKSW /GET OUR SWITCH SZA CLA /SKIP IF WE SHOULDN'T HAVE DONE THAT JMP MINOK /ELSE JUST KEEP GOING JMS I (COMPLAIN) /COMPLAIN OF MISSLR /MISSING LOWER RANGE BLOCK / COMES HERE IF UPPER BLOCK WAS BAD. NOHIGH, JMS I (COMPLAIN) /COMPLAIN OF MISSUR /MISSING UPPER RANGE BLOCK / COMES HERE IF "=" FOUND. GOTEQUA,JMS I (GETNUMBER) /GET THE LENGTH JMP MISSEQUALS /WASN'T ANY CIA /INVERT IT DCA LENGTH /STORE AS FINAL LENGTH MINOK, ISZ LFLAG /INDICATE LENGTH WAS FOUND JMP SCNLUP /KEEP GOING / COMES HERE IF WE CAN'T MATCH A DEVICE NAME FROM THE TABLE. NAMENF, AND I (NAMBUFFER) /GET FIRST CHARACTER SNA CLA /SKIP IF VALID JMP NONAME /JUMP IF NOT JMS I [ESCRLF] /CHECK IF EXTRA , NEEDED JMS I [NAMSETUP] /SETUP DEVICE NAME PARAMETERS PNMLUP, TAD I NAMPTR /GET A NAME CHARACTER SZA /SKIP IF JMS I [P7CH] /PRINT IT ISZ NAMPTR /BUMP TO NEXT ISZ NAMCNT /DONE ALL? JMP PNMLUP /NO, GO BACK JMS I [SCRIBE] /TELL THEM NOTAVL /THEY CAN'T HAVE THAT DEVICE JMP I (NAENTRY) /KEEP GOING / COMES HERE IF WE COULDN'T GET THE DEVICE UNIT. BADUNIT,SZA CLA /WAS THERE ANYTHING? JMP BDUNIT /YES, BUT IT WAS JUNK JMS I (COMPLAIN) /NO, COMPLAIN OF NOUNIT /NO DEVICE UNIT BDUNIT, JMS I (COMPLAIN) /COMPLAIN OF BDEVUNIT /BAD DEVICE UNIT / COMES HERE IF ":" IS MISSING. BADCOLO,JMS I (COMPLAIN) /COMPLAIN OF MISSCOLON /MISSING COLON / COMES HERE IF WE COULDN'T GET THE BLOCK NUMBER. BADBLK, JMS I (COMPLAIN) /COMPLAIN OF MISSBLOCK /MISSING BLOCK NUMBER / COMES HERE IF NO PARAMETER AFTER "=". MISSEQU,JMS I (COMPLAIN) /COMPLAIN OF EQUMISSING /MISSING EQUALS PARAMETER NAMSETU,.-. /DEVICE NAME SETUP ROUTINE NL7775 /SETUP THE DCA NAMCNT /NAME COUNT TAD (NAMBUFFER) /POINT TO THE DCA NAMPTR /NAME BUFFER JMP I NAMSETUP /RETURN BLKSW, .-. /BLOCK-SCANNED SWITCH / DEVICE NAME BUFFER. NAMBUFF,ZBLOCK 3 /DEVICE NAME FORMED HERE PAGE / GET A CHARACTER ROUTINE. GETCHR, .-. /GET A CHARACTER ROUTINE SKP CLA /CLEAN UP AND DON'T DO IT YET GETCAGN,ISZ GETPTR /BUMP TO NEXT TAD I GETPTR /GET A CHARACTER TAD (-"/!200) /COMPARE TO "/" SNA /SKIP IF OTHER JMP I GETCHR /RETURN ZERO TAD [-" +"/] /COMPARE TO SNA /SKIP IF DIFFERENT JMP GETCAGN /ELSE TOSS IT TAD (-140+" -200) /COMPARE TO LOWER-CASE LIMIT SPA /SKIP IF LOWER-CASE TAD [40] /DON'T FOLD UPPER-CASE TAD [100] /RESTORE THE CHARACTER JMP I GETCHR /RETURN / GET A NUMBER ROUTINE. GETNUMB,.-. /GET A NUMBER ROUTINE ISZ GETPTR /BUMP TO NEXT CHARACTER DCA GDIGITS /CLEAR DIGIT COUNT GETNAGN,DCA GNUM /CLEAR OR SAVE LATEST NUMBER JMS GETDIGIT /GET A DIGIT JMP GDTEST /WASN'T ANY DCA GLATEST /SAVE IT TAD GNUM /GET THE VALUE JMS I [RTL3] /MOVE UP TAD GLATEST /ADD ON LATEST ISZ GDIGITS /BUMP DIGIT COUNT JMP GETNAGN /KEEP GOING GDTEST, CLA /CLEAN UP TAD GDIGITS /ANY DIGITS? SZA CLA /SKIP IF NONE ISZ GETNUMBER /ELSE TAKE SKIP RETURN TAD GNUM /GET THE VALUE JMP I GETNUMBER /RETURN GETDIGI,.-. /GET A DIGIT ROUTINE JMS ENDTEST /TEST IF AT DELIMITER JMP I GETDIGIT /FORGET IT JMS GETCHR /GET A CHARACTER TAD (-"8!200) /ADD ON UPPER LIMIT CLL /CLEAR LINK FOR TEST TAD ["8-"0] /ADD ON RANGE SNL /SKIP IF VALID JMP BADDIGIT /JUMP IF NOT ISZ GETDIGIT /TAKE SKIP RETURN ISZ GETPTR /BUMP TO NEXT CHARACTER SKP /DON'T SET BAD VALUE BADDIGI,NL7777 /INDICATE BAD DIGIT JMP I GETDIGIT /RETURN / HANDLER BUFFER ALLOCATION ROUTINE. / ALLOCATES A BUFFER FOR A HANDLER BASED ON BEST FIT CONSIDERATIONS. / CALL WITH: / L=0 /EXCLUDE PAGE ZERO FROM CONSIDERATION (NOT ATTEMPTING / /A SINGLE FULL-SIZE HANDLER) / OR / L=1 /FULL-SIZE HANDLER (40 PAGES) IS BEING ATTEMPTED / TAD (HANDLERLENGTH) /AC CONTAINS PAGE-SIZE OF HANDLER (ZERO IS INNOCUOUS) / JMS I (BESTFIT) /CALL ROUTINE / RETURNS: / POSITIVE VALUE OF FIELD NUMBER WHERE BEST FIT OCCURS; ELEMENT SIZE HAS BEEN / REDUCED TO REFLECT ALLOCATION. / OR / NEGATIVE IF ALLOCATION IS IMPOSSIBLE. BESTFIT,.-. /BEST FIT HANDLER ROUTINE SNA /ZERO LENGTH HANDLER? JMP I BESTFIT /YES, JUST RETURN ZERO DCA BFLENGTH /SAVE DESIRED LENGTH SNL /40 PAGES? NL0001 /NO, SET FIELD ZERO SWITCH DCA BFL0SW /SAVE EITHER WAY SNL /40 PAGES? NL7777 /NO, SET PAGE ZERO EXCLUSION VALUE DCA BFPZEXCLUDE /SAVE EITHER WAY TAD [WORK0] /SETUP THE DCA GBTEMP /WORK POINTER NL4000 /SETUP THE BAD DCA BFNUMBER /DEFAULT FIELD NUMBER NL5777 /SETUP THE DEFAULT DCA BFIT /BEST FIT SIZE TAD [WORK0-WORKEND] /SETUP THE DCA VERCNT /LIST COUNT BFLOOP, TAD BFPZEXCLUDE /GET EXCLUSION SWITCH TAD BFL0SW /GET FIELD ZERO SWITCH TAD I GBTEMP /GET LATEST ELEMENT CIA /INVERT FOR TEST TAD BFLENGTH /COMPARE TO DESIRED LENGTH SMA SZA /SKIP IF POSSIBLE JMP BFNEXT /JUMP IF NOT CIA /INVERT REMAINDER TAD BFIT /COMPARE TO PREVAILING WASTE SMA /SKIP IF LESS WASTEFUL JMP BFNEXT /ELSE FORGET IT CIA /INVERT AGAIN TAD BFIT /LOWER WASTE VALUE DCA BFIT /STORE NEW LESS WASTEFUL VALUE TAD BFLENGTH /GET DESIRED LENGTH CIA /INVERT IT TAD I GBTEMP /REMOVE FROM LIST ELEMENT DCA I GBTEMP /STORE IN LIST TAD GBTEMP /GET THE POINTER TAD [-WORK0] /MAKE IT RELATIVE DCA BFNUMBER /SAVE BEST FIELD NUMBER BFNEXT, CLA /CLEAN UP DCA BFL0SW /NO LONGER IN FIELD ZERO ISZ GBTEMP /BUMP TO NEXT ELEMENT ISZ VERCNT /DONE ALL YET? JMP BFLOOP /NO, KEEP GOING TAD BFNUMBER /GET BEST FITTING FIELD JMP I BESTFIT /RETURN ENDTEST,.-. /TEST FOR DELIMITER ROUTINE JMS GETCHR /GET A CHARACTER SZA /SKIP IF END OF BUFFER TAD (-">!200) /IS IT ">"? SZA /SKIP IF SO TAD (-"<+">) /IS IT "<"? SZA /SKIP IF SO TAD (-"!+"<) /IS IT "!"? SZA CLA /SKIP IF ANY DELIMITER ISZ ENDTEST /ELSE BUMP RETURN ADDRESS JMP I ENDTEST /RETURN EITHER WAY BFIT, .-. /WASTE FACTOR BFLENGT,.-. /DESIRED LENGTH BFL0SW, .-. /FIELD ZERO SWITCH BFNUMBE,.-. /BEST FIT FIELD NUMBER BFPZEXC,.-. /PAGE ZERO EXCLUSION SWITCH GDIGITS,.-. /DIGIT COUNTER GLATEST,.-. /LATEST DIGIT GNUM, .-. /NUMBER TEMPORARY PAGE / GET INPUT BUFFER ROUTINE. GETBUFF,.-. /GET INPUT BUFFER GRESTAR,TAD [COMBUFFER] /RESET THE DCA GETPTR /OUTPUT POINTER TAD ("*&177) /GET PROMPTING "*" JMS I [P7CH] /PRINT IT GETINP, JMS I (GIVCHR) /**** **** JMS I [INPUT] GOTINPU,JMS CMDSUB /TRY TO FIND CHTBL-1 /SPECIAL CHARACTERS TAD [-40] /COMPARE LATEST TO CONTROL CHARACTER SPA CLA /SKIP IF GREATER JMP GCMBEEP /IGNORE BAD CONTROL CHARACTERS TAD INCHAR /GET THE CHARACTER TAD [-140] /COMPARE TO LOWER-CASE LIMIT GCMZAP, NOP /**** /U **** SPA TAD [40] /RESTORE CASE TAD [100] /RESTORE THE CHARACTER SKP /DON'T DO STUFF! GOTHT, TAD [" &177] / BECOMES DCA GBTEMP /SAVE IT TAD GETPTR /GET OUTPUT POINTER TAD (-COMBEND) /COMPARE TO BUFFER LIMIT SMA CLA /SKIP IF NOT AT END YET JMP GCMBEEP /JUMP IF IT IS TAD GBTEMP /GET THE CHARACTER DCA I GETPTR /STORE IN THE BUFFER ISZ GETPTR /BUMP THE POINTER TAD GBTEMP /GET THE CHARACTER JMS I [P7CH] /PRINT IT JMP GETINPUT /KEEP GOING / COMES HERE ON BAD INPUT OR FULL BUFFER. GCMBEEP,TAD [7] /GET A JMS I [P7CH] /RING IT JMP GETINPUT /KEEP GOING / COMES HERE ON ANY CHARACTER GOTESC, TAD ("$&177) /GET A "$" JMS I [P7CH] /PRINT IT DCA I GETPTR /DELIMIT THE BUFFER NL4000 /INDICATE SEEN CRENTRY,DCA ESCAPSW /STORE THE SWITCH JMP I GETBUFFER /RETURN / COMES HERE ON <^U>. DELETL, TAD ["^&177] /GET AN "^" JMS I [P7CH] /PRINT IT TAD ("U&177) /GET A "U" JMS I [P7CH] /PRINT IT JMS I [CRLF] /DO A , JMP GRESTART /RESTART / COMES HERE ON . GOTCR, DCA I GETPTR /DELIMIT THE BUFFER JMS I [CRLF] /DO A , JMP CRENTRY /CONTINUE THERE / COMES HERE ON . LFVIEW, JMS I [CRLF] /DO A , TAD ("*&177) /GET THE PROMPT CHARACTER JMS I [P7CH] /PRINT IT TAD [COMBUFFER] /RESET THE DCA GBTEMP /BUFFER POINTER PRBLUP, TAD GBTEMP /GET THE POINTER VALUE CIA /INVERT FOR TEST TAD GETPTR /COMPARE TO MAIN POINTER SNA CLA /SKIP IF NOT THERE YET JMP GETINPUT /JUMP IF DONE PRINTING THE BUFFER TAD I GBTEMP /GET THE CURRENT CHARACTER JMS I [P7CH] /PRINT IT ISZ GBTEMP /BUMP TO NEXT JMP PRBLUP /KEEP GOING / COMES HERE ON ANY BACKSPACING CHARACTER. BACKSP, NL7777 /-1 TAD GETPTR /BACKUP THE POINTER DCA GBTEMP /SAVE FOR NOW TAD GBTEMP /GET IT BACK TAD (-COMBUFFER) /COMPARE TO LOWER LIMIT SPA CLA /SKIP IF OK JMP GCMBEEP /COMPLAIN IF TOO FAR BACK BZAP, JMP HARDRUBOUT /**** NOT /B **** 0000 TAD GBTEMP /GET UPDATED VALUE DCA GETPTR /USE IT IN POINTER TAD ["H&37] /GET JMS I [P7CH] /PRINT IT TAD [" &177] /GET A JMS I [P7CH] /PRINT IT TAD ["H&37] /GET JMS I [P7CH] /PRINT IT JMP GETINPUT /KEEP GOING / COMES HERE IF BACKSPACING ON HARD-COPY TERMINAL. HARDRUB,TAD ("\&177) /GET DELIMITER JMS I [P7CH] /PRINT IT RUBAGN, NL7777 /BACKUP TAD GETPTR /GET THE POINTER DCA GBTEMP /SAVE UPDATED VALUE TAD GBTEMP /GET IT BACK TAD (-COMBUFFER) /COMPARE TO LOWER LIMIT SPA CLA /SKIP IF OK JMP RUBDONE /JUMP IF TOO FAR TAD GBTEMP /GET THE NEW VALUE DCA GETPTR /STORE IT TAD I GETPTR /GET THE OLD CHARACTER JMS I [P7CH] /PRINT IT JMS I [INPUT] /GET FURTHER INPUT HERE JMS CMDSUB /CHECK IF A RUBTBL-1 /BACKSPACING CHARACTER RUBDONE,DCA GBTEMP /STORE LATEST OR TAD ("\&177) /GET TRAILING DELIMITER JMS I [P7CH] /PRINT IT TAD GBTEMP /GET THE LATEST (OR ) DCA INCHAR /APPEAR TO HAVE INPUT JMP GOTINPUT /GO USE IT THERE CMDSUB, .-. /COMMAND TABLE SEARCH ROUTINE CLA /CLEAN UP TAD I CMDSUB /GET THE INLINE POINTER DCA GBTEMP /STASH IT ISZ CMDSUB /BUMP PAST POINTER GCMLUP, ISZ GBTEMP /BUMP TO NEXT TAD I GBTEMP /GET AN ENTRY ISZ GBTEMP /BUMP TO NEXT SNA /END OF TABLE? JMP GCMEND /YES, FORGET IT TAD INCHAR /COMPARE TO LATEST SZA CLA /SKIP IF IT MATCHES JMP GCMLUP /JUMP IF NOT TAD I GBTEMP /GET THE ADDRESS DCA GBTEMP /STASH IT JMP I GBTEMP /GO THERE GCMEND, TAD INCHAR /GET THE CHARACTER BACK JMP I CMDSUB /RETURN PAGE / HANDLER, BUFFER SETUP ROUTINE. / CALL WITH: / INDNUM, OTDNUM ALREADY SET TO THEIR RESPECTIVE VALUES (0 IF "SYS") / INDLEN, OTDLEN ALREADY SET TO THEIR RESPECTIVE VALUES (0 IF "SYS") / JMS I (HBSETUP) /CALL ROUTINE / CANT BE DONE /RETURNS HERE IF REQUESTED COMBINATION CAN'T FIT / GOOD RETURN /RETURNS HERE WITH HANDLERS LOADED IF NECESSARY /AND I/O BUFFERS MAXIMIZED HBSETUP,.-. /HANDLER, BUFFER SETUP ROUTINE / WE FIRST ATTEMPT TO ALLOCATE EACH OF THE I/O HANDLERS, INPUT AND OUTPUT (OR / VERIFY), INDEPENDENTLY ON A "BEST FIT" BASIS, THE LARGER OF THE HANDLERS / FIRST AS THIS IS ORDINARILY THE BEST WAY. NL7777 /ASSUME WE CANNOT GET DCA MAXIO /ANY USABLE LENGTH JMS I (WORKSETUP) /SETUP WORK AREA TAD INDLEN /GET INPUT HANDLER LENGTH CIA /INVERT FOR TESTING TAD OTDLEN /COMPARE TO OUTPUT HANDLER LENGTH SMA CLA /SKIP IF INPUT HANDLER IS LARGER JMP OTFIRST /ELSE ALLOCATE OUTPUT FIRST TAD INDLEN /GET INPUT HANDLER LENGTH JMS I (FITSEPARATE) /ALLOCATE IT AND HOPEFULLY COME BACK DCA I (INHFLD) /STORE BEST FIT FIELD NUMBER TAD OTDLEN /GET OUTPUT HANDLER LENGTH JMS I (FITSEPARATE) /ALLOCATE IT AND HOPEFULLY COME BACK DCA I (OTHFLD) /STORE BEST FIT FIELD NUMBER JMP SEPACOMMON /CONTINUE THERE / THE OUTPUT HANDLER IS LARGER, SO ALLOCATE IT FIRST. OTFIRST,TAD OTDLEN /GET OUTPUT HANDLER LENGTH JMS I (FITSEPARATE) /ALLOCATE IT AND HOPEFULLY COME BACK DCA I (OTHFLD) /STORE BEST FIT FIELD NUMBER TAD INDLEN /GET INPUT HANDLER LENGTH JMS I (FITSEPARATE) /ALLOCATE IT AND HOPEFULLY COME BACK DCA I (INHFLD) /STORE BEST FIT FIELD NUMBER / AT THIS POINT, THE WORK TABLE CONTAINS THE AVAILABLE PAGE COUNT FOR ALL / VIABLE FIELD ENTRIES AFTER THE HANDLER LENGTHS HAVE BEEN SUBTRACTED ON A / BEST FIT BASIS. WE MUST NOW FIND THE LARGEST REMAINING BUFFER SPACE (TWO / BUFFERS ARE REQUIRED IF EITHER COPYING WITH VERIFY (NOT /N), OR VERIFY-ONLY, / ELSE ONLY ONE). SEPACOM,JMS I (BESTBUFFER) /FIND THE BEST (TWO) BUFFER(S) SPA SNA /DID WE GET ANY? JMP TRYTOGETHER /NO, FORGET IT DCA MAXIO /SAVE MAXIMUM BUFFER SIZE ACHIEVED TAD BSTFL1 /GET FIRST FIELD NUMBER DCA IOBFLD /SAVE AS I/O FIELD TAD BSTFL2 /GET SECOND FIELD NUMBER DCA VEBFLD /SAVE AS VERIFY FIELD / WE NEXT ATTEMPT TO ALLOCATE THE SUM TOTAL PAGE LENGTH OF BOTH HANDLERS IN / ONE FIELD (ADJACENT BUFFERS) AS THIS WILL PRODUCE OPTIMUM RESULTS IN CERTAIN / CASES. IT IS POSSIBLE FOR THIS METHOD TO FAIL IF THE HANDLERS CAN'T ACTUALLY / FIT TOGETHER IN ONE FIELD! / COMES HERE (FROM FITSEPARATE) IF EITHER HANDLER COULDN'T BE ALLOCATED VIA / THE FORMER METHOD (IT IS LIKELY THE CURRENT METHOD WILL ALSO FAIL LEADING TO / THE USER ERROR MESSAGE REGARDING INSUFFICIENT MEMORY). TRYTOGE,NL7777 /ASSUME THE TOGETHER DCA TOGMAXIO /METHOD WILL FAIL JMS I (WORKSETUP) /SETUP THE WORK AREA TAD INDLEN /GET THE INPUT HANDLER LENGTH TAD OTDLEN /ADD ON OUTPUT/VERIFY HANDLER LENGTH CLL /DOUBLET LENGTH IS ORDINARY CASE EVEN IF 40 PAGES JMS I [BESTFIT] /ATTEMPT TO ALLOCATE BOTH HANDLERS TOGETHER SPA /DID THEY FIT? JMP TESTBOTH /NO, GO FIND OUT IF THE FIRST METHOD WORKED DCA TOGFLD /YES, SAVE THEIR COMMON BEST FIT FIELD NUMBER JMS I (BESTBUFFER) /GET BEST (TWO) BUFFER(S) SPA SNA /DID WE GET ANY? JMP TESTBOTH /NO, FORGET IT DCA TOGMAXIO /SAVE THIS CASE'S SIZE TAD BSTFL1 /GET FIRST FIELD NUMBER DCA TOGIOFLD /SAVE FOR I/O BUFFER TAD BSTFL2 /GET SECOND FIELD NUMBER DCA TOGVEFLD /SAVE FOR VERIFY BUFFER / WE NOW TEST IF AT LEAST ONE OF THE CASES WORKED, ELSE IT CAN'T BE DONE! TESTBOT,NL0002 /SET MAGIC SUM TAD MAXIO /ADD ON FIRST CASE SIZE TAD TOGMAXIO /ADD ON SECOND CASE SIZE SNA CLA /SKIP IF OTHER THAN BOTH LOSERS JMP I HBSETUP /ALAS, TAKE IMMEDIATE RETURN IF IT COULDN'T BE DONE JMS I (WORKSETUP) /SETUP THE WORK AREA AGAIN JMS I (TOGORSEPARATE) /USE BETTER CASE'S PARAMETERS / WE NOW ACTUALLY ALLOCATE THE INPUT HANDLER BUFFER. JMS I (INSETUP) /GET INPUT HANDLER LOADED AND INPUT POINTER SET TAD I (INHFLD) /GET INPUT HANDLER FIELD JMS I [RTL3] /MOVE UP TO FIELD BITS TAD (CIF) /TURN INTO CIF HANDLER FIELD INSTRUCTION DCA I (INCFLD) /STORE IN-LINE TAD INDNUM /GET INPUT DEVICE NUMBER CIA /INVERT FOR TEST TAD OTDNUM /COMPARE TO OUTPUT DEVICE NUMBER SZA CLA /SKIP IF IT MATCHES JMP DIFFOUT /JUMP IF NOT TAD I (INHFLD) /GET INPUT FIELD DCA I (OTHFLD) /MAKE IT OUTPUT FIELD AS WELL TAD INDEV /GET INPUT POINTER DCA OUTDEV /MAKE IT OUTPUT POINTER AS WELL SKP /DON'T DO OUTPUT HANDLER DIFFOUT,JMS I (OTSETUP) /SETUP OUTPUT HANDLER AND LOAD IT TAD I (OTHFLD) /GET OUTPUT FIELD NUMBER JMS I [RTL3] /MOVE UP TO FIELD BITS TAD (CIF) /TURN INTO CIF HANDLER FIELD INSTRUCTION DCA I (OTCFLD) /STORE IN-LINE TAD I (OTCFLD) /GET IT BACK DCA I (VECFLD) /STORE IN VERIFY CODE ALSO TAD MAXIO /GET THE MAXIMUM BUFFER SIZE JMS I (BUFSETUP) /ALLOCATE IT IOBFLD, .-. /IN I/O FIELD DCA INADR /SAVE INPUT BUFFER BASE ADDRESS TAD IOBFLD /GET THE INPUT FIELD NUMBER JMS I [RTL3] /MOVE UP TO FIELD BITS DCA INFLD /STORE AS INPUT FIELD TAD INFLD /GET IT BACK TAD [CDF] /FORM CDF INPUT BUFFER INSTRUCTION DCA I (CMPLUP) /STORE IN COMPARE ROUTINE TAD I (CMPLUP) /GET IT BACK DCA I (DMBCDF) /STORE IN DUMMY BLOCK ROUTINE TAD INADR /GET INPUT ADDRESS DCA OUTADR /MAKE IT OUTPUT ADDRESS AS WELL JMS I [VERCHK] /ARE WE VERIFYING? JMP NOVBUFFER /NO, FORGET IT TAD MAXIO /GET MAXIMUM BUFFER SIZE JMS I (BUFSETUP) /ALLOCATE IT VEBFLD, .-. /IN VERIFY FIELD DCA VERADR /SAVE AS VERIFY BUFFER BASE ADDRESS TAD VEBFLD /GET VERIFY FIELD NUMBER JMS I [RTL3] /MOVE UP TO FIELD BITS DCA VERFLD /SAVE AS VERIFY FIELD TAD VERFLD /GET IT BACK TAD [CDF] /FORM CDF VERIFY FIELD INSTRUCTION DCA I (VERCDF) /STORE IN-LINE NOVBUFF,ISZ HBSETUP /BUMP TO GOOD RETURN JMS I (MAXSETUP) /SETUP MAXIMUM BLOCK UPDATE FACTOR JMP I HBSETUP /RETURN TO CALLER TOGFLD, .-. /DOUBLET HANDLER BUFFER FIELD TOGIOFL,.-. /DOUBLET I/O FIELD NUMBER TOGMAXI,.-. /MAXIMUM BUFFER LENGTH FOR DOUBLET CASE TOGVEFL,.-. /DOUBLET VERIFY FIELD NUMBER PAGE INSETUP,.-. /INPUT HANDLER SETUP ROUTINE TAD INDLEN /GET INPUT HANDLER LENGTH JMS BUFSETUP /GET THE BUFFER ADDRESS INHFLD, .-. /WILL BE INPUT HANDLER FIELD NUMBER DCA HNDADR /SAVE AS BASE ADDRESS OF HANDLER TAD INDNUM /GET INPUT HANDLER NUMBER JMS BLKSETUP /GET BLOCK WHERE THE HANDLER RESIDES DCA HNDBLK /STORE AS BASE BLOCK OF HANDLER NL7777 /-1 TAD INDNUM /GET INPUT DEVICE NUMBER SMA SZA CLA /SKIP IF IT IS "SYS" OR "NUL" JMP LOADIN /ELSE GO READ IT IN TAD (SYSPAGE) /POINT TO PRELOADED HANDLER JMP INHCOMMON /CONTINUE THERE LOADIN, TAD INDLEN /GET INPUT HANDLER LENGTH RTL;RTL;RTL /MOVE TO PAGE BITS AND [3700] /ISOLATE PAGE BITS DCA GBTEMP /STASH FOR NOW TAD I (INHFLD) /GET HANDLER FIELD NUMBER JMS HNDREAD /GO READ IN THE HANDLER INHCOMM,DCA VERCNT /SAVE HANDLER BASE FOR NOW TAD INDNUM /GET INPUT DEVICE NUMBER JMS ENTSETUP /GET ENTRY POINT OFFSET AND [177] /JUST ENTRY POINT BITS TAD VERCNT /ADD ON HANDLER BASE DCA INDEV /SAVE AS INPUT DEVICE POINTER JMP I INSETUP /RETURN OTSETUP,.-. /OUTPUT SETUP ROUTINE TAD OTDLEN /GET OUTPUT HANDLER LENGTH JMS BUFSETUP /ALLOCATE THE HANDLER BUFFER OTHFLD, .-. /WILL BE OUTPUT HANDLER FIELD NUMBER DCA HNDADR /SAVE AS OUTPUT HANDLER BASE ADDRESS TAD OTDNUM /GET OUTPUT DEVICE NUMBER JMS BLKSETUP /GET OUTPUT DEVICE HANDLER BLOCK DCA HNDBLK /STORE IN-LINE NL7777 /-1 TAD OTDNUM /GET THE OUTPUT DEVICE NUMBER SMA SZA CLA /SKIP IF IT IS "SYS" OR "NUL" JMP LOADOUT /JUMP IF NOT TAD (SYSPAGE) /POINT AT RESIDENT HANDLER JMP OTHCOMMON /CONTINUE THERE LOADOUT,TAD OTDLEN /GET OUTPUT HANDLER LENGTH RTL;RTL;RTL /MOVE UP TO PAGE BITS AND [3700] /JUST PAGE BITS DCA GBTEMP /STASH FOR NOW TAD OTHFLD /GET THE FIELD NUMBER JMS HNDREAD /GO READ IN THE HANDLER OTHCOMM,DCA VERCNT /STORE FOR NOW TAD OTDNUM /GET OUTPUT DEVICE NUMBER JMS ENTSETUP /GET ENTRY POINT VALUE AND [177] /JUST ENTRY POINT BITS TAD VERCNT /ADD ON BASE ADDRESS DCA OUTDEV /STORE HANDLER POINTER JMP I OTSETUP /RETURN / BUFFER SETUP ROUTINE. / ALLOCATES A BUFFER OF AC-PASSED SIZE IN THE FIELD PASSED INLINE. / THE WORK TABLE ELEMENT IS REDUCED BY THIS SIZE AND THE BUFFER ADDRESS PASSED / BACK IN THE AC. TO PREVENT HANDLER-RELATED PROBLEMS, THE BUFFER IS ALLOCATED / FROM THE REAR OF THE FIELD. / CALL WITH: / TAD (BUFSIZE) /AC CONTAINS BUFFER SIZE (ZERO IS INNOCUOUS) /FLDNO, .-. /FIELD NUMBER / RETURNS BUFFER ADDRESS IN AC BUFSETU,.-. /BUFFER SETUP ROUTINE DCA VERCNT /SAVE PASSED COUNT TAD I BUFSETUP /GET FIELD NUMBER TAD [WORK0] /POINT TO CORRESPONDING ELEMENT IN TABLE DCA GBTEMP /STASH THE POINTER TAD I BUFSETUP /GET THE IN-LINE FIELD AGAIN SNA CLA /SKIP IF NOT FIELD ZERO TAD (AVAIL) /ELSE USE FIELD ZERO AVAILABLE ADDRESS AS BASE DCA BLKSETUP /SAVE BASE ADDRESS OF FIELD'S AVAILABLE SPACE TAD VERCNT /GET DESIRED COUNT CIA /WANT NEGATIVE FORM TAD I GBTEMP /REMOVE FROM AVAILABLE COUNT DCA I GBTEMP /STORE BACK TAD I GBTEMP /GET REDUCED VALUE CLL RTR;RTR;RTR /*200 TAD BLKSETUP /ADD ON BUFFER BASE ISZ BUFSETUP /SKIP PAST ARGUMENT JMP I BUFSETUP /RETURN MAXSETU,.-. /MAXIO SETUP ROUTINE TAD BLKFLG /GET BLOCK CONTROL FLAG RAR /MOVE TO LINK SZL CLA /SKIP IF INPUT IN CONTROL TAD OTINFO /ELSE USE OUTPUT INFORMATION WORD SNL /SKIP IF OUTPUT IN CONTROL TAD ININFO /ELSE USE INPUT INFORMATION WORD JMS I [SIZESETUP] /SETUP SIZE DIVISOR TAD DIVSOR /GET THE DIVISOR CIA /WANT NEGATIVE FORM DCA SIZINFO /SAVE FOR OTHERS TAD MAXIO /GET CURRENT PAGE MAXIMUM JMS I [DIVIDE] /MAKE IT BLOCK MAXIMUM DCA MAXIO /STORE IT JMP I MAXSETUP /RETURN / HANDLER READ-IN ROUTINE. HNDREAD,.-. /HANDLER READ ROUTINE JMS I [RTL3] /MOVE UP PASSED VALUE TO FIELD BITS TAD GBTEMP /ADD ON PAGE BITS TAD TABLUNIT /ADD ON UNIT BITS DCA HNDFUN /STORE IN FUNCTION WORD JMS I [SYSIO] /CALL I/O ROUTINES TO READ IN THE HANDLER HNDADR, .-. /HANDLER BUFFER ADDRESS HNDFUN, .-. /FUNCTION WORD HNDBLK, .-. /BLOCK NUMBER TAD HNDADR /POINT TO HANDLER BASE JMP I HNDREAD /RETURN BLKSETU,.-. /BLOCK NUMBER SETUP ROUTINE JMS I [RTL3] /PASSED OFFSET*10 TAD (DTABLE+BOFFSET)/POINT TO BLOCK NUMBER DCA GBTEMP /STASH THE POINTER TAD I GBTEMP /GET THE BLOCK NUMBER JMP I BLKSETUP /RETURN ENTSETU,.-. /ENTRY POINT SETUP ROUTINE JMS I [RTL3] /PASSED OFFSET*10 TAD (DTABLE+EOFFSET)/POINT TO ENTRY POINT WORD DCA GBTEMP /STASH THE POINTER TAD I GBTEMP /GET THE ENTRY POINT WORD JMP I ENTSETUP /RETURN PAGE / WORK AREA SETUP ROUTINE. WORKSET,.-. /WORK AREA SETUP ROUTINE NL7777 /BACKUP TAD [WORK0] /POINT TO DCA XR2 /WORK AREA TAD (FIELD0-1) /POINT TO DCA XR1 /PRIME TABLE TAD [WORK0-WORKEND] /SETUP THE DCA VERCNT /MOVE COUNT WRKLUP, TAD I XR1 /GET A WORD DCA I XR2 /PUT A WORD ISZ VERCNT /DONE YET? JMP WRKLUP /NO, KEEP GOING JMP I WORKSETUP /YES, RETURN TOGORSE,.-. /TOGETHER OR SEPARATE DECISION ROUTINE TAD I (TOGMAXIO) /GET TOGETHER CASE BUFFER LENGTH CIA /INVERT FOR TESTING TAD MAXIO /COMPARE TO SEPARATE CASE LENGTH SMA CLA /SKIP IF TOGETHER CASE IS BETTER JMP I TOGORSEPARATE /ELSE JUST RETURN / SUBSTITUTE THE DOUBLET CASE VALUES FOR THE (ASSUMED CORRECT) SEPARATE VALUES. TAD I (TOGFLD) /GET HANDLER FIELD NUMBER DCA I (INHFLD) /USE FOR INPUT HANDLER TAD I (TOGFLD) /GET HANDLER FIELD NUMBER DCA I (OTHFLD) /USE FOR OUTPUT/VERIFY HANDLER ALSO TAD I (TOGMAXIO) /GET BUFFER(S) SIZE DCA MAXIO /USE AS MAXIMUM SIZE TAD I (TOGIOFLD) /GET I/O FIELD DCA I (IOBFLD) /STASH IT TAD I (TOGVEFLD) /GET VERIFY FIELD DCA I (VEBFLD) /STASH IT JMP I TOGORSEPARATE /RETURN / SEPARATE CASE BEST FIT SETUP ROUTINE. FITSEPA,.-. /BEST FIT SETUP ROUTINE SNA /ZERO LENGTH CASE? JMP I FITSEPARATE /YES, JUST RETURN ZERO DCA VERCNT /NO, SAVE IT FOR NOW TAD VERCNT /GET IT BACK TAD [-MAXHND] /COMPARE TO LARGEST VALUE CLL /CLEAR LINK FOR TEST SNA CLA /SKIP IF NOT LARGEST VALUE STL /ELSE SET LINK FOR LARGEST VALUE TEST TAD VERCNT /GET LENGTH AGAIN JMS I [BESTFIT] /TRY TO FIT IT IN SPA /SKIP IF IT MADE IT JMP I (TRYTOGETHER) /BYPASS ALL CALLERS IF NOT JMP I FITSEPARATE /RETURN WITH FIELD IT BEST FITS IN / BEST PAIR OF BUFFERS ROUTINE. / CALL WITH: / WORK TABLE CURRENTLY CONTAINS AVAILABLE BUFFER SIZES. / JMS I (BESTBUFFER) /CALL ROUTINE / RETURNS SIZE OF (2) LARGEST BUFFERS. / BSTFL1 CONTAINS FIRST FIELD CONTAINING LARGEST BUFFER. / BSTFL2 CONTAINS SECOND FIELD ALSO CONTAINING LARGEST BUFFER (MEANINGLESS IF / NO VERIFICATION BUFFER REQUIRED). BESTBUF,.-. /BEST BUFFER ROUTINE JMS BIGONE /GET LARGEST ONE IN LIST DCA BSTFL1 /SAVE IT JMS I [VERCHK] /ARE WE VERIFYING? JMP USEONE /NO, ONE IS ENOUGH TAD I BESTPTR /GET THE BEST ONE DCA SIZE1 /SAVE IT NL7777 /OBLITERATE DCA I BESTPTR /THE BEST ONE JMS BIGONE /GET SECOND BEST ONE DCA BSTFL2 /SAVE IT TAD SIZE1 /GET FIRST SIZE CLL RAR /%2 CIA /INVERT FOR TEST TAD I BESTPTR /COMPARE TO SECOND BEST SMA CLA /SKIP IF FIRST%2 IS LARGER JMP USEONE /JUMP IF NOT TAD BSTFL1 /GET FIRST ONE DCA BSTFL2 /USE FOR BOTH TAD SIZE1 /GET FIRST SIZE CLL RAR /%2 SKP /DON'T USE OTHER CASE! USEONE, TAD I BESTPTR /GET BEST AVAILABLE SIZE DCA GBTEMP /SAVE FOR NOW TAD ININFO /GET INPUT INFORMATION WORD JMS I [MOD] /MAKE SIZE MODULO (INPUT FACTOR) TAD OTINFO /GET OUTPUT INFORMATION WORD JMS I [MOD] /MAKE SIZE MODULO (OUTPUT FACTOR) TAD GBTEMP /GET MODULATED RESULT JMP I BESTBUFFER /RETURN BIGONE, .-. /FIND LARGEST IN LIST ROUTINE NL7777 /SETUP THE DCA GBTEMP /DUMMY VALUE TAD [WORK0] /POINT AT THE DCA BIGPTR /WORKING LIST TAD [WORK0-WORKEND] /SETUP THE DCA VERCNT /LIST COUNT BIGLUP, TAD I BIGPTR /GET A WORD CIA /INVERT FOR TEST TAD GBTEMP /COMPARE TO PREVAILING VALUE SMA CLA /SKIP IF LARGER JMP BIGNEXT /JUMP IF NOT TAD I BIGPTR /GET LATEST DCA GBTEMP /MAKE IT THE LARGEST SO FAR TAD BIGPTR /GET THE POINTER DCA BESTPTR /STASH IT BIGNEXT,ISZ BIGPTR /BUMP TO NEXT ISZ VERCNT /DONE ALL? JMP BIGLUP /NO, KEEP GOING TAD BESTPTR /GET THE POINTER TAD [-WORK0] /MAKE IT RELATIVE JMP I BIGONE /RETURN BESTPTR,.-. /POINTER TO LARGEST ELEMENT BIGPTR, .-. /POINTER TO LIST SIZE1, .-. /SIZE OF LARGEST BUFFER PAGE / MESSAGES. CDNMSG, TEXT "^C^OPY ^F^INISHED" CERMSG, TEXT "^V^ERIFY^" CFAMSG, TEXT "^C^OPY ^F^AILED!^" CMERMSG,TEXT "^C^OMPARISON ^E^RROR!%^" COMMSG, TEXT "^C^OMPARE ^" COPMSG, TEXT "^C^OPY " DUMMSG, TEXT "^I AM A DUMMY BLOCK, NOT DATA!!" EONMSG, TEXT " ^E^RROR ON ^" FROMSG, TEXT " FROM ^" IERMSG, TEXT "^I^NPUT" NOMSG, TEXT "^N^O!%^" OERMSG, TEXT "^O^UTPUT^" REPMSG, TEXT "^R^EPEATING ^L^ATEST ^O^PERATION%" RETMSG, TEXT "^R^ETRY? " RUSMSG, TEXT "^A^RE ^Y^OU ^S^URE? ^" SKPBMSG,TEXT "^S^KIP ^P^AST ^P^ROBLEM ^B^LOCK? " SKPWMSG,TEXT "^S^KIP TO ^N^EXT ^W^ORD? " TOMSG, TEXT " TO ^" VDNMSG, TEXT "^C^OMPARISON ^F^INISHED" VFAMSG, TEXT "^C^OMPARISON ^F^AILED!^" VREMSG, TEXT "^V^ERIFY ^R^EAD" WDBMSG, TEXT "^W^RITE ^D^UMMY ^B^LOCK? " WERMSG, TEXT " ^[^WITH ^E^RRORS^]" YESMSG, TEXT "^Y^ES!%" / ERROR MESSAGES. BDEVUNI,TEXT "^B^AD ^D^EVICE ^U^NIT" EQUMISS,TEXT "^M^ISSING ^L^ENGTH ^P^ARAMETER^" INVMSG, TEXT "^I^NVALID ^C^OMMAND - ^" MISSBLO,TEXT "^M^ISSING ^B^LOCK ^N^UMBER^" MISSCOL,TEXT "^M^ISSING ^C^OLON" MISSLR, TEXT "^M^ISSING ^L^OWER ^R^ANGE ^B^LOCK" MISSUR, TEXT "^M^ISSING ^U^PPER ^R^ANGE ^B^LOCK" MULSEP, TEXT "^M^ULTIPLE ^I/O S^EPARATORS" MULSPEC,TEXT "^M^ULTIPLE ^L^ENGTH/^R^ANGE ^S^PECIFICATIONS^" NGMSG, TEXT "^I^NSUFFICIENT ^M^EMORY FOR ^R^EQUESTED ^O^PERATION!^" NODEV, TEXT "^M^ISSING ^D^EVICE ^N^AME" NORMSG, TEXT "%^C^ANNOT ^R^EPEAT ^L^ATEST ^O^PERATION!%" NOTAVL, TEXT " ^N^OT ^A^VAILABLE^" NOUNIT, TEXT "^M^ISSING ^D^EVICE ^U^NIT" NULSEP, TEXT "^N^O ^I/O S^EPARATORS" NULSPEC,TEXT "^N^O ^L^ENGTH/^R^ANGE ^S^PECIFICATIONS^" OVFLMSG,TEXT "^F^UNCTION ^E^XCEEDS ^D^EVICE ^L^IMITS!" PAGE /ENSURE GOOD ALIGNMENT DTABLE= . /DEVICE TABLE LOADED HERE SYSPAGE=DTABLE+200 /"SYS" HANDLER LOADED HERE AVAIL= SYSPAGE+200 /AVAILABLE SPACE FOR BUFFERS, ETC. / ONCE-ONLY INITIALIZATION. INITIAL,TAD I (P7TLS) /GET "TLSIOT" DCA I (COPZAP) /MAKE IT RESTART WITH "TLSIOT", NOT COME TO US JMS I (XORSW) /SETUP USER PREFERENCE SWITCH SETTINGS TAD I [SWMX] /GET /M-/X SWITCHES AND [10] /JUST /U BIT SNA CLA /SKIP IF SET JMP IOCHEK /JUMP IF NOT TAD [CLA!400] /GET A "CLA" INSTRUCTION DCA I (CASZP1) /PREVENT CASE CHANGE TAD [CLA!400] /GET A "CLA" INSTRUCTION DCA I (CASZP2) /PREVENT CASE CHANGE TAD (SPA) /GET AN "SPA" DCA I (GCMZAP) /PREVENT LOWER-CASE INPUT IOCHEK, TAD I [SBOOT] /GET BOOTSTRAP INSTRUCTION TAD (-JMSSYSIO) /COMPARE TO POSSIBLE VALUE SNA CLA /SKIP IF DIFFERENT JMP CHKCOVRLAY /JUMP IF IT MATCHES ISZ I (CHKKRS) /TURN "KRSIOT" ISZ I (CHKKRS) /INTO "KRBIOT" DCA I (CHKKCC) /DESTROY "KCCIOT" CHKCOVR,NL0002 /SET "C" BIT MASK AND I (SCRSIZE) /GET THE BIT SNA CLA /SKIP IF "C" BIT SET JMP NOCON /JUMP IF NOT DCA I (COPZAP) /DESTROY "TLSIOT" TAD I (SCRSIZE) /GET THE CORE SIZE WORD RTR;RAR /MOVE OVER AND AND (70) /ISOLATE MCS BITS TAD (CIF 10) /TURN INTO "CIF MCS+10" DCA I (P7TSF) /STORE OVER "TSFIOT" TAD I (P7JMP) /GET "JMP I P7OUT" DCA I (P7TLS) /STORE OVER "TLSIOT" TAD (JMS OUTCON) /GET OUTPUT CALL DCA I (P7JMP) /STORE OVER "JMP I P7OUT" TAD I (P7TSF) /GET "CIF MCS+10" DCA I (CHKKSF) /STORE OVER "KSFIOT" TAD I (CHKJMP) /GET "JMP I CTLCTST" DCA I (CHKKRS) /STORE OVER "KRSIOT" ("KRBIOT") TAD (JMS INCON) /GET INPUT CALL DCA I (CHKJMP) /STORE OVER "JMP I CTLCTST" DCA I (CHKKCC) /DESTROY "KCCIOT" NOCON, JMS I [SCRIBE] /GIVE THEM THE ANNMSG /ANNOUNCEMENT MESSAGE NL2000 /SET /N MASK AND I [SWMX] /GET THE BIT SZA CLA /SKIP IF OFF JMP CLRVERIFY /JUMP IF ON TAD CLRSKP/(SKP CLA)/GET ZAP VALUE DCA I (SLNZAP) /PREVENT VERIFY-ONLY SWITCH CONSIDERATION CLRSKP, SKP CLA /ENSURE VERIFICATION CLRVERI,DCA VERSW /PREVENT VERIFICATION TAD I (SCRSIZE) /GET CORE SIZE WORD AND (70) /JUST LCS BITS SNA /SKIP IF SOMETHING THERE JMP TEST7K /JUMP IF NOT TAD [-40] /CHECK FOR 20K SMA /SKIP IF LESS AVAILABLE JMP GOT20K /JUMP IF 20K OR MORE TAD [-30+40] /CHECK FOR 16K SNA /SKIP IF OTHER JMP GOT16K /JUMP IF 16K TAD [-20+30] /CHECK FOR 12K SNA CLA /SKIP IF 8K JMP GOT12K /JUMP IF 12K GOT8K, JMS I (TESTMORE) /CHECK IF MORE AVAILABLE JMP SET8K /NO MORE, WE HAVE 8K JMP GOT12K /EXTRA FIELD AVAILABLE, USE 12K GOT11K, TAD (30) /3/4 FIELD AVAILABLE JMP SET11K /CONTINUE THERE GOT16K, JMS I (TESTMORE) /CHECK IF MORE AVAILABLE JMP SET16K /NO MORE, WE HAVE 16K JMP SET20K /EXTRA FIELD AVAILABLE, USE 20K GOT19K, TAD (30) /3/4 FIELD AVAILABLE JMP SET19K /CONTINUE THERE GOT12K, JMS I (TESTMORE) /CHECK IF MORE AVAILABLE JMP SET12K /NO MORE, WE HAVE 12K JMP GOT16K /EXTRA FIELD AVAILABLE, USE 16K GOT15K, TAD (30) /3/4 FIELD AVAILABLE JMP SET15K /CONTINUE THERE TEST7K, JMS I (TESTMORE) /TEST FOR MORE MEMORY JMP SET4K /NO MORE, WE HAVE 4K JMP GOT8K /EXTRA FIELD AVAILABLE, USE 8K GOT7K, TAD (30) /3/4 FIELD AVAILABLE JMP SET7K /CONTINUE THERE GOT20K, CLA /CLEAN UP SET20K, TAD [40] /GET WHOLE FIELD VALUE SET19K, DCA I (FIELD4) /STASH FIELD FOUR VALUE SET16K, TAD [40] /GET WHOLE FIELD VALUE SET15K, DCA I (FIELD3) /STASH FIELD THREE VALUE SET12K, TAD [40] /GET WHOLE FIELD VALUE SET11K, DCA I (FIELD2) /STASH FIELD TWO VALUE SET8K, TAD [40] /GET WHOLE FIELD VALUE SET7K, DCA I (FIELD1) /STASH FIELD ONE VALUE SET4K, JMP I (MORINIT) /CONTINUE THERE PAGE *GIVBUFFER /OVER FILE INPUT BUFFER / INITIALIZATION CONTINUES HERE. MORINIT,NL2000 /SET /B MASK AND I [SWAL] /GET /B BIT SNA CLA /SKIP IF SET DCA I (BZAP) /CLEAR HARDCOPY MODE IF NOT SET NL0002 /SETUP /W MASK AND I [SWMX] /GET THE /W BIT SNA CLA /SKIP IF SET JMP SETPOINTER /JUMP IF NOT TAD (SKPWMSG) /CHANGE THE DCA I (WZAP1) /MESSAGE POINTER TAD (NEXTWD) /CHANGE THE DCA I (WZAP2) /NEXT ADDRESS POINTER SETPOIN,TAD I (SOUTFLS) /GET OUTPUT FILE COUNT TAD GFLPTR /UPDATE FILE POINTER DCA GFLPTR /STORE IT BACK TAD I (SBTFUN) /GET SYSTEM BOOTSTRAP UNIT AND [7] /JUST UNIT BITS DCA TABLUNIT /STORE AS DEVICE HANDLER LOAD UNIT TAD TABLUNIT /GET DEVICE LOAD UNIT TAD [1^100] /TURN INTO READ FUNCTION DCA DTBFUN /STORE IN-LINE JMS I [SYSIO] /CALL I/O ROUTINES DTABLE /HANDLER TABLE BUFFER DTBFUN, 1^100+.-. /UNIT BITS WILL BE FILLED IN HANDBLK /BLOCK NUMBER TAD DTBFUN /GET READ FUNCTION DCA SYSFUN /STORE IN-LINE TAD I (DTABLE+BOFFSET)/GET FIRST BLOCK ENTRY ("SYS" IS FIRST) DCA SYSBLK /STORE IN-LINE JMS I [SYSIO] /CALL I/O ROUTINES SYSPAGE /BUFFER FOR HANDLERS SYSFUN, 1^100+.-. /UNIT BITS WILL BE FILLED IN SYSBLK, .-. /BLOCK NUMBER WILL BE FILLED IN JMP I [RESTART] /GO START IT UP TESTMOR,.-. /TEST FOR MEMORY ROUTINE TAD I [SWAL] /GET /A-/L SWITCHES AND (1000) /JUST /C SWITCH MORZAP, SNA CLA /**** ZAPPED **** CLA!400 JMP I TESTMORE /FORGET IT TAD [CLA!400] /GET "CLA" INSTRUCTION DCA MORZAP /EFFECTIVELY PREVENT SUBSEQUENT CALL TAD I (SCRSIZE) /GET CORE SIZE WORD AND (70) /JUST LCS BITS CIA /INVERT FOR TESTS DCA LCSTEMP /SAVE FOR LATER TAD I (SCRSIZE) /GET THE CORE SIZE WORD AGAIN RTR;RAR /MOVE DOWN AND AND (70) /ISOLATE MCS BITS TAD LCSTEMP /COMPARE TO LCS VALUE SPA SNA CLA /SKIP IF MCS>LCS JMP PHYTEST /ELSE TRY PCS BITS SOMENTR,ISZ TESTMORE /BUMP RETURN ADDRESS JMP I TESTMORE /TAKE SKIP RETURN PHYTEST,NL0002 /SETUP "C" BIT MASK AND I (SCRSIZE) /GET THE BIT SNA CLA /SKIP IF CONSOLE PRESENT TAD I (SCRSIZE) /GET CORE SIZE WORD AGAIN RTR;RTR;RTR /MOVE DOWN AND AND (70) /ISOLATE PCS BITS TAD LCSTEMP /COMPARE TO LCS VALUE SPA SNA CLA /SKIP IF PCS>LCS (LCS=MCS HERE) JMP I TESTMORE /FORGET IT ISZ TESTMORE /TAKE EXTRA SKIP RETURN JMP SOMENTRY /CONTINUE THERE XORSW, .-. /XOR OPTION SWITCH ROUTINE XORLUP, TAD I SWPTR /GET A SWITCH WORD AND I OPTPTR /AND AGAINST OPTION WORD CIA /INVERT CLL RAL /*2 TAD I SWPTR /ADD ON SWITCH WORD TAD I OPTPTR /ADD ON OPTION WORD DCA I SWPTR /STORE XOR-ED VALUE ISZ SWPTR /BUMP TO NEXT ISZ OPTPTR /BUMP TO NEXT ISZ SWCNT /DONE ALL YET? JMP XORLUP /NO, KEEP GOING JMP I XORSW /YES, RETURN LCSTEMP,.-. /TEMPORARY OPTPTR, XORSWS /OPTION WORD POINTER SWPTR, SWAL /PASSED SWITCHES POINTER SWCNT, -3 /OPTION WORD COUNT ANNMSG, TEXT "%^BLKCPY V" /OPENING MESSAGE COPVERSION%12^66+COPVERSION+6060/ "^^100+COPREVISION / TEXT "^" /THIS ENDS THE MESSAGE PAGE $ /THAT'S ALL FOLK!