/ DIAL <- -> P?S/8 CONVERT PROGRAM / LAP6-DIAL TO P?S/8 OR P?S/8 TO LAP6-DIAL ASCII FILE CONVERSION PROGRAM. / LAST EDIT: 17-APR-1986 10:00:00 CJL / MUST BE ASSEMBLED WITH '/J' SWITCH SET. / P?S/8 UTILITY TO CONVERT ASCII FILES BETWEEN LAP6-DIAL MEDIA AND P?S/8 MEDIA. / ANY FILE REPRESENTABLE IN P?S/8 SIX-BIT ASCII SUBSET WITH OR WITHOUT LINE / NUMBERS CAN BE CONVERTED TO THE CORRESPONDING SIX-BIT ASCII FILE IN LAP6-DIAL / FORMAT IN A MANNER COMPATIBLE WITH LAP6-DIAL DIRECTORY CONVENTIONS. THE / PROGRAM CAN ALSO BE USED TO REGROUP P?S/8 FILES OR REMOVE/RESTORE P?S/8 / LINE NUMBERS FROM A GROUP OF FILES FOR EDITING OR REFERENCE PURPOSES. / PROGRAM OPERATION AND OPTIONS. / CONVERSION OF LAP6-DIAL INPUT TO P?S/8 OUTPUT FILES: / .R L6DCON [LIST OF P?S/8 OUTPUT FILES] < (OPTION SWITCHES) / OR / .R L6DCON > [LIST OF P?S/8 OUTPUT FILES] (OPTION SWITCHES) / CONVERSION OF P?S/8 INPUT FILES TO A SINGLE LAP6-DIAL OUTPUT FILE: / .R L6DCON [LIST OF P?S/8 INPUT FILES] (OPTION SWITCHES) / THE DIRECTION OF CONVERSION IS DETERMINED BY PASSED P?S/8 FILES BEING EITHER / INPUT OR OUTPUT. L6DCON CANNOT BE USED WITHOUT PASSED P?S/8 FILES. / PROGRAM OPTIONS. / /C ATTEMPT TO USE MORE MEMORY THAN CURRENT LOGICAL / CORE SIZE INDICATES. LAP6-DIAL FILE BUFFERS WILL / BE ENLARGED IN BOTH CONVERSION DIRECTIONS. THIS / SWITCH IS ONLY NEEDED IF THE LOGICAL CORE SIZE IS / SET TO 4K EVEN THOUGH MORE IS ACTUALLY AVAILABLE. / GENERALLY CAUSES FASTER CONVERSION TO OCCUR. DEFAULT / IF THE LOGICAL CORE SIZE IS GREATER THAN 4K (I. E. / CORE 1-7). / /E USE EXTENDED LENGTH P?S/8 OUTPUT FILE PROCESSING / WITHOUT P?S/8 LINE NUMBERS. THE PASSED OUTPUT FILE / SPECIFICATION IS ASSUMED TO BE THE STARTING POINT / FOR OUTPUT FILE CONVERSION LIMITED BY THE DEVICE / LENGTH WORD CONTAINED IN THE EXTENDED USER DIRECTORY. / THE USER IS WARNED TO INVOKE THIS OPTION CAREFULLY! / /P PACK P?S/8 LINE NUMBER FILES. LAP6-DIAL EJECT / CHARACTER HANDLING WILL NOT CHECK FOR EXTRA ROOM / IN THE FILE. DEFAULT ACTION IS TO CLOSE THE CURRENT / FILE AND OPEN THE NEXT ONE IF A PROTECTION COUNT / IS EXCEEDED WHEN THIS SEQUENCE IS DETECTED IN THE / CONTENTS OF THE FILE. THIS OPTION IS IGNORED IF / /E IS INVOKED, AS EXTENDED FILES CONTAIN NO LINE / NUMBERS AND HAVE NO INTRINSIC SIZE RESTRICTIONS. / /0-/7 LOGICAL UNIT FOR LAP6-DIAL INPUT/OUTPUT (DEFAULT / IS /7). / =NNNN STARTING LAP6-DIAL BLOCK (DEFAULT IS 0370). / DEFAULT OPTIONS. / LAP6-DIAL INPUT/OUTPUT ASSUMES LAP6-DIAL BLOCK 0370 (LAP6-DIAL WORKING AREA) / ON THE LAP6-DIAL DEVICE USING LOGICAL UNIT SEVEN. EITHER LAP6-DIAL BLOCK / OR UNIT CAN BE MODIFIED WITH THE APPROPRIATE EQUALS PARAMETER (FOR BLOCK) / OR /0 THROUGH /7 (FOR LOGICAL UNIT). / THE LAP6-DIAL DEVICE MUST BE ACCESSIBLE THROUGH ONE OF THE BUILT-IN HANDLERS / WITHIN THE L6DCON PROGRAM. THE CURRENT VERSION SUPPORTS PDP-12 AND LINC-8 / LINCTAPE ONLY. NO HARDWARE MODIFICATIONS ARE REQUIRED. N. B. CERTAIN / HANDLER-SPECIFIC RESTRICTIONS WILL APPLY: / 1) ONLY PDP-12 HANDLERS SUPPORT 256/257 WORDS/BLOCK LINCTAPES. / 2) LINC-8 HANDLERS USED ON LINC-8 WITH ONLY TWO DRIVES WILL MAP ALL / LOGICAL UNIT NUMBERS 0-7 INTO 0-1 (ALL EVEN UNITS BECOME ZERO; ALL / ODD UNITS BECOME ONE). / 3) LINC-8 HANDLERS USED ON LINC-8 WITH EXTENDED DRIVES WILL HANG / INDEFINITELY, AND THE SYSTEM WILL REQUIRE MANUAL BOOTSTRAP, IF A / NON-EXISTANT DRIVE IS SELECTED. / LAP6-DIAL OUTPUT FILE CONSIDERATIONS. / IT IS RECOMMENDED THAT THE LAP6-DIAL OUTPUT FILE BE APPLIED TO AN EMPTY / DEVICE, AS LAP6-DIAL HAS THE CAPABILITY OF EDITING FILES TO ANY BLOCK USING / THE "CL", AND "AP ," COMMANDS. USING THE DEFAULT BLOCK VALUE / OF 0370 WILL WRITE THE LAP6-DIAL FILE INTO THE LAP6-DIAL WORKING AREA / DIRECTLY. / **** NOTE **** THIS PROGRAM DOES NOT RECOGNIZE LAP6-DIAL DIRECTORY / CONSIDERATIONS, IT CAN ONLY WRITE THE ACTUAL FILE AS LAP6-DIAL WOULD REQUIRE / IT. THIS UTILITY IS IGNORANT OF LAP6-DIAL LENGTH RESTRICTIONS AND COULD / ATTEMPT TO ACCESS NON-EXISTANT BLOCKS OR OVERWRITE BLOCKS HIGHER UP ON THE / LAP6-DIAL DEVICE ORDINARILY BELONGING TO OTHER LAP6-DIAL FILES OR SYSTEM / AREAS. / IF THE USER IS UNSURE OF THE LENGTH OF P?S/8 FILES WHEN CONVERTED TO LAP6-DIAL, / IT IS RECOMMENDED THAT A SCRATCH LAP6-DIAL TAPE BE USED AND "=0" INVOKED / TO OUTPUT TO THE BEGINNING OF THE TAPE. LATER, FROM LAP6-DIAL, AN / "AP 0," COMMAND CAN BE USED, AS LAP6-DIAL SHOULD NOT OVERLOAD ITS / OWN WORK AREA. IF THE CONVERSION IS TOO LARGE, IT CAN THEN BE REPEATED AFTER / BREAKING UP THE FILES INTO SMALLER SECTIONS. ASSUMING LAP6-DIAL CONVENTIONS / APPLY TO THE CONTENTS OF THE FILE, THE "CHAIN" PSEUDO-OP CAN BE INSERTED / AT THE END OF EACH CONVERTED LAP6-DIAL FILE TO RETAIN THE LOGICAL STREAM / OF THE ORIGINAL P?S/8 FILES. / CHARACTER CONVERSION CONSIDERATIONS. / LAP6-DIAL TO P?S/8 CONVERSION. / LAP6-DIAL P?S/8 / / OR < / P?S/8 TO LAP6-DIAL CONVERSION. / P?S/8 LAP6-DIAL / / # % / ' " / ALL OTHER CHARACERS INTERCHANGE FREELY IN BOTH CONVERSION DIRECTIONS. / CONSOLE MESSAGES. / CANNOT PROCESS MIXED INPUT AND OUTPUT FILES! / P?S/8 FILES MUST BE ALL INPUT OR ALL OUTPUT, NOT BOTH. THE PROGRAM / EXITS TO THE MONITOR. / INSUFFICIENT OUTPUT FILES, LAP6-DIAL INPUT TRUNCATED! / THE P?S/8 OUTPUT FILES' CAPABILITY WAS EXHAUSTED WITH FURTHER / LAP6-DIAL INPUT PRESENT. THE LAST P?S/8 FILE IS PROPERLY CLOSED AND / THE PROGRAM EXITS TO THE MONITOR. / LAP6-DIAL LINCTAPE INPUT ERROR! / AN ERROR OCCURRED WHILE READING THE LAP6-DIAL LINCTAPE. AFTER SEVERAL / RETRIES WERE ATTEMPTED, THE ERROR COULD NOT BE CLEARED. THIS ERROR / IS CONSIDERED FATAL; P?S/8 FILES MAY OR MAY NOT BE CREATED DEPENDING / ON THE TAPE POSITION AT THE POINT OF FAILURE. THE PROGRAM EXITS TO / THE MONITOR. / LAP6-DIAL LINCTAPE OUTPUT ERROR! / AN ERROR OCCURRED WHILE OUTPUTTING TO THE LAP6-DIAL LINCTAPE. AFTER / SEVERAL RETRIES WERE ATTEMPTED, THE ERROR COULD NOT BE CLEARED. THIS / ERROR IS CONSIDERED FATAL; THE PROGRAM EXITS TO THE MONITOR. / LAP6-DIAL => P?S/8 / CONVERSION IS FROM LAP6-DIAL TO P?S/8 LINE NUMBER FILES. P?S/8 OUTPUT / FILES WERE PASSED WITHOUT /E AND ARE CREATED FROM LAP6-DIAL INPUT. / LAP6-DIAL => P?S/8 [EXTENDED FILES] / CONVERSION IS FROM LAP6-DIAL TO P?S/8 EXTENDED FILES. P?S/8 OUTPUT / FILES WERE PASSED WITH /E INVOKED AND ARE CREATED FROM LAP6-DIAL / INPUT. / NO LINCTAPE HARDWARE! / SYSTEM HARDWARE DOES NOT INCLUDE REQUISITE LINCTAPE CONTROLLER AND / DRIVE(S). THE PROGRAM EXITS TO THE MONITOR. / NO P?S/8 FILES GIVEN! / NO P?S/8 FILES (EITHER INPUT OR OUTPUT) WERE GIVEN. THE PROGRAM / EXITS TO THE MONITOR. / P?S/8 => LAP6-DIAL / CONVERSION IS FROM P?S/8 INPUT FILES TO A SINGLE LAP6-DIAL OUTPUT / FILE. P?S/8 INPUT FILES NEED NOT CONTAIN LINE NUMBERS AS THEY ARE / IGNORED. / XX FILES CREATED / COUNT OF OUTPUT FILES CREATED BY CONVERSION. CAN BE "NO" (IF NO / FILES WERE CONVERTED) OR 1 THROUGH 17, THE P?S/8 UPPER LIMIT. THIS / QUANTITY WILL ALWAYS BE 1 IF CONVERTING P?S/8 FILES TO LAP6-DIAL. / THIS MESSAGE IS PRINTED BEFORE EXITING TO THE MONITOR. / P?S/8 DEFINITIONS. DOLBLK= 0040 /DEFAULT ASCII SCRATCH AREA ($) EXTCAT= 0067 /EXTENDED CATALOG BLOCK INCON= 0031 /EQUATED FROM CONSOLE! OUTCON= 0033 /EQUATED FROM CONSOLE! TTY= 0003 /CONSOLE DEVICE CODE SBOOT= 7600 /SYSTEM EXIT HERE SBTFUN= 7602 /SYSTEM BOOTSTRAP UNIT WORD SCRSIZE=7611 /SOFTWARE CORE SIZE WORD SFILES= 7757 /PASSED FILES HERE SOUTFLS=7607 /OUTPUT FILE COUNT SPARM= 7756 /EQUALS PARAMETER SWAL= 7604 /A-/L SWITCHES SWMX= 7605 /M-/X SWITCHES SWY9= 7606 /Y-/9 SWITCHES SYSIO= 7640 /ENTER I/O ROUTINES HERE WRITE= 4000 /SYSIO WRITE BIT / OTHER DEFINITIONS. BLKSIZE=400 /256 WORDS/BLOCK ON LAP6-DIAL LINCTAPES COM= 0017 /COMPLEMENT ACCUMULATOR FILBUFF=3000 /FILE CREATED IN 003000 JMPC= JMP . /CURRENT PAGE JMP INSTRUCTION JMSC= JMS . /CURRENT PAGE JMS INSTRUCTION JMSSYSI=SYSIO&177+JMSC /CALL TO SYSIO ON ITS PAGE KCCIOT= TTY^10+6002 /CLEAR KEYBOARD FLAG KRSIOT= TTY^10+6004 /READ KEYBOARD BUFFER KSFIOT= TTY^10+6001 /SKIP ON KEYBOARD FLAG NL0001= CLA IAC /LOAD AC WITH 0001 NL0002= CLA CLL CML RTL /LOAD AC WITH 0002 NL4000= CLA CLL CML RAR /LOAD AC WITH 4000 NL7775= CLA CLL CMA RTL /LOAD AC WITH 7775 NL7776= CLA CLL CMA RAL /LOAD AC WITH 7776 NL7777= CLA CMA /LOAD AC WITH 7777 REVISIO="A&77 /REVISION OF L6DCON TLSIOT= TTY+1^10+6006 /OUTPUT TO TELEPRINTER TSFIOT= TTY+1^10+6001 /SKIP ON TELEPRINTER FLAG VERSION=12 /VERSION OF L6DCON *0 /START AT THE BEGINNING CHAR, .-. /LATEST P?S/8 CHARACTER FOR LAP6-DIAL OUTPUT FILPTR, SFILES /FILE POINTER L6DUNIT,.-. /LAP6-DIAL I/O UNIT PEXEOFS,.-. /EXTENDED FILES SWITCH PEXLIMI,.-. /EXTENDED FILES OUTPUT BUFFER LIMIT PEXPTR, .-. /EXTENDED FILES STORAGE POINTER PINIT, PFFINITIALIZE /**** /E **** PEXINITIALIZE POUT, PFFOUT /**** /E **** PEXOUT *10 /DEFINE AUTO-INDEX AREA XR1, .-. /FIRST AUTO-INDEX REGISTER XRIN, .-. /P?S/8 INPUT AUTO-INDEX REGISTER XROUT, LIST8K-1 /P?S/8 INPUT AUTO-INDEX REGISTER; PRELOADED FOR STARTUP EOLPROT,250 / PROTECTION VALUE FOR FIXED FILES FILCNT, 0 /P?S/8 FILE CREATION COUNT L6DFIEL,L6DFLD /**** 8K **** 0010 PFFLATE,.-. /LATEST CHARACTER INSERTED INTO FIXED FILE PFFPREV,.-. /PREVIOUS CHARACTER INSERTED INTO FIXED FILE *20 /GET PAST AUTO-INDEX AREA ERRCNT, .-. /ERROR RETRY COUNTER FFPROTE,700 / PROTECTION COUNT GCPTR, INBUFFER /P?S/8 INPUT BUFFER POINTER INCHAR, .-. /LATEST KEYBOARD INPUT CHARACTER L6DHAND,LINCTAPE /**** LINC-8 **** L8TAPE L6DWFUN,OUTLENGTH^100+WRITE /**** 8K **** L8KLENGTH^100+WRITE OUTBLEN,OUTLENGTH%2 /**** 8K **** L8KLENGTH%2 OUTCNT, OUTLENGTH^200^7777 /**** 8K **** L8KLENGTH^200^7777 OUTPTR, OUTBUFFER /LAP6-DIAL OUTPUT BUFFER POINTER OUTWCNT,OUTLENGTH^200^7777 /**** 8K **** L8KLENGTH^200^7777 P7TEMP, .-. /TERMINAL OUTPUT TEMPORARY TEMPTR, .-. /TEMPORARY OUTPUT POINTER TESTCT, .-. /STRING TEST COUNTER / LAP6-DIAL INPUT EJECT WINDOW AREA. WINDOW, ZBLOCK 7 /SEARCH WINDOW HERE ELEMENT,.-. /LATEST CHARACTER TO SHIFT INTO THE WINDOW / TEST STRING. TSTRING,"'&77 / L5, "E&77 /E L12, "J&77 /J "E&77 /E "C&77 /C "T&77 /T "#&77 / CHKUP, .-. /CHECK FOR <^C>, ETC. ROUTINE JMS CTLCTST /CHECK FOR <^C> SZA /SKIP IF NOTHING CAME IN TAD [-"Q!300] /ELSE COMPARE TO <^Q> SNA /SKIP IF NEITHER CASE JMP CHKCLR /ELSE FORGET IT TAD [-"S+"Q] /COMPARE TO <^S> PSYSIO, SZA CLA /SKIP IF IT MATCHES JMP I CHKUP /ELSE RETURN JMS CTLCTST /GET ANOTHER CHARACTER TAD [-"Q!300] /COMPARE TO <^Q> SZA CLA /SKIP IF IT MATCHES JMP .-3 /ELSE KEEP GOING CHKCLR, DCA INCHAR /OBLITERATE <^Q>, ETC. JMP I CHKUP /RETURN CTLCTST,.-. /CHECK FOR <^C> ROUTINE 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 /STASH THE CHARACTER NL7775 /-3 TAD INCHAR /COMPARE INPUT TO <^C> SNA /SKIP IF OTHER ISZ I [SCRSIZE] /ELSE SET SOFT INDICATOR SPA SNA CLA /SKIP IF <^D> OR GREATER JMP I [SBOOT] /ELSE GOODBYE CHKKCC, KCCIOT/OR 0000 /**** CONSOLE **** 0000 TAD INCHAR /GET THE CHARACTER JMP I CTLCTST /RETURN P7CH, .-. /SEVEN-BIT PRINT ROUTINE DCA P7TEMP /STASH PASSED VALUE P7AGN, JMS CHKUP /CHECK FOR <^C>, ETC. TAD P7TEMP /GET THE VALUE P7TSF, TSFIOT /**** CONSOLE **** CIF MCS+10 P7JMP, JMP P7AGN /**** CONSOLE **** JMS OUTCON P7TLS, TLSIOT /**** CONSOLE **** JMP P7AGN JMS CHKUP /CHECK FOR <^C>, ETC. JMP I P7CH /RETURN PAGE / LAP6-DIAL <- -> P?S/8 CONVERSION UTILITY STARTS HERE. L6DCON= . /PROGRAM STARTS HERE IFNZRO .&177 L6DCON, NOP /IN CASE WE'RE CHAINED TO SCRCASE,JMP I SCRIBE/(INITIAL)/CONTINUE THERE / MESSAGE PRINTING ROUTINE. SCRIBE, INITIALIZE /MESSAGE PRINT ROUTINE; PRELOADED FOR STARTUP CLA /JUST IN CASE TAD I SCRIBE /GET MESSAGE POINTER DCA L6DCON /STASH IT ISZ SCRIBE /BUMP PAST ARGUMENT TAD [140] /INITIALIZE TO DCA SCRCASE /LOWER-CASE OUTPUT SCRLUP, TAD I L6DCON /GET LEFT HALF-WORD RTR;RTR;RTR /MOVE OVER JMS SCRPRNT /PRINT IT TAD I L6DCON /GET RIGHT HALF-WORD JMS SCRPRNT /PRINT IT ISZ L6DCON /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 LFENTRY,JMS P7CH /PRINT THE CHARACTER JMP I SCRPRNT /RETURN SCRCRLF,TAD ["M&77] /GET A JMS P7CH /PRINT IT TAD L12/["J&77] /GET A JMP LFENTRY /CONTINUE THERE SCRFLIP,TAD SCRCASE /GET CURRENT CASE CIA /INVERT IT TAD (140+100) /ADD SUM OF POSSIBLE VALUES DCA SCRCASE /SAVE NEW CASE JMP I SCRPRNT /RETURN SCRCHAR,.-. /LATEST OUTPUT CHARACTER / P?S/8 SIX-BIT OUTPUT ROUTINE. / CALL WITH: / TAD CHAR /AC CONTAINS LATEST CHARACTER TO OUTPUT / JMS I (P6CH) /CALL ROUTINE / ALWAYS RETURNS HERE WITH CLEAR AC / FILES ARE AUTOMATICALLY CREATED AS NECESSARY. / CALL APPROPRIATE ROUTINE TO CLOSE THE FILE (NL4000;JMS I POUT). / THE CONVERSION PROCESS STARTS AT "L6DIN" WHICH OPENS THE FIRST FILE. P6CH, NEWBUFFER /SIX-BIT OUTPUT ROUTINE; PRELOADED FOR STARTUP JMS I POUT /CALL CURRENT P?S/8 OUTPUT ROUTINE SKP /SKIP IF FILE JUST CLOSED JMP P6END /JUMP IF NOT ISZ FILPTR /BUMP TO NEXT FILE ARGUMENT L6DIN, TAD I FILPTR /GET THE NEXT FILE ARGUMENT SNA /END OF ALL FILES? JMP TRUNCATE /YES, WE LOSE DCA POFBLK /NO, STORE IN-LINE JMS I PINIT /CALL CURRENT INITIALIZE ROUTINE POFBLK, .-. /WILL BE FILE ARGUMENT ([BLOCK&7770] + [UNIT&7]) 144 /INITIAL LINE NUMBER; AND INSTRUCTION IF EXTENDED FILES 12 /LINE INCREMENT; AND INSTRUCTION IF EXTENDED FILES P6END, JMS CHKUP /CHECK FOR <^C>, ETC. JMP I P6CH /RETURN TO CALLER TRUNCAT,JMS I [SCRIBE] /TELL THEM TRUMSG /WE DIDN'T MAKE IT CREPORT,TAD FILCNT /GET FILE COUNT SNA /SKIP IF ANY JMP FILNO /ELSE LEAVE IT SAYING "NO" TAD (-12) /IS IT LESS THAN TEN? SMA /SKIP IF SO TAD ("1^100-3612) /ELSE CORRECT FOR 10-17 TAD ("0-200+3612) /GET NUMERIC CORRECTION DCA FCTMSG+1 /STORE IN MESSAGE NL7777 /-1 TAD FILCNT /EXACTLY ONE FILE? SZA CLA /SKIP IF SO JMP FILNO /JUMP IF OTHERWISE TAD ("E^100+"^-300) /ELSE MAKE IT DROP THE "S" DCA I (FLSMSG+3) /STORE INTO THE MESSAGE FILNO, JMS I [SCRIBE] /TELL THEM FCTMSG /THE FILE COUNT JMS I [SCRIBE] /TELL THEM FLSMSG /FILES (OR FILE) JMS I [SCRIBE] /TELL THEM CREMSG /CREATION MESSAGE JMP I [SBOOT] /GOODBYE FCTMSG, TEXT "%^NO^" TRUMSG, TEXT "%^I^NSUFFICIENT ^O^UTPUT ^F^ILES, ^LAP6-DIAL I^NPUT ^T^RUNCATED!%" PAGE / LAP6-DIAL INPUT ROUTINE. L6DTRIM,NXTBUFFER /EXIT ROUTINE; PRELOADED FOR STARTUP CDF 00 /ENSURE FIELD ZERO AND [77] /JUST SIX-BIT SNA /? NL4000 /YES, INDICATE SO L6DZAP, DCA ELEMENT /**** /P **** JMP NOWINDOW CLL /INDICATE SHIFT IN, NOT PURGE JMS SHIFT /SHIFT LATEST CHARACTER INTO THE WINDOW TAD (TSTRING-1) /POINT TO DCA XRIN /TEST STRING JMS TSETUP /SETUP WINDOW STRING POINTER AND COUNTER TSTLUP, TAD I XRIN /GET A TEST CHARACTER CIA /INVERT FOR TESTING TAD I XROUT /COMPARE TO WINDOW CHARACTER SZA CLA /SKIP IF IT MATCHES JMP NOTFF /JUMP IF NOT ISZ TESTCT /TESTED ALL YET? JMP TSTLUP /NO, KEEP GOING STL /INDICATE WINDOW PURGE JMS SHIFT /CLEAR THE WINDOW TAD (EJECTMSG-1) /SETUP THE DCA XR1 /MESSAGE POINTER EMSGLUP,TAD I XR1 /GET A CHARACTER SPA /END OF MESSAGE? JMP EMSGEND /YES JMS I (P6CH) /NO, OUTPUT IT JMP EMSGLUP /KEEP GOING EMSGEND,JMS I EFFCHK /CHECK IF NEEDED NOW JMP NOTFF /FORGET IT, JUST KEEP GOING NL4000 /SET VALUE JMS I (P6CH) /CLOSE THIS FILE, OPEN ANOTHER ONE NOTFF, TAD WINDOW /GET HEAD OF WINDOW SNA /SKIP IF SOMETHING THERE JMP I L6DTRIM /ELSE GO GET ANOTHER ONE NOWINDO,SPA /IS IT ? JMP L6DEOFILE /YES, FINISH IT THERE TAD [-37] /COMPARE TO SNA /SKIP IF OTHER TAD ("<&77-37) /CONVERT TO "<" TAD [-"#!200+37] /COMPARE TO SNA /SKIP IF OTHER JMP L6DOCR /JUMP IF IT MATCHES TAD [-"'+"#] /COMPARE TO SNA /SKIP IF OTHER TAD [37-"'!200] /CONVERT TO P?S/8 TAD TSTRING/["'&77] /RESTORE THE CHARACTER L6DOCR, DCA CHAR /SAVE IT TAD CHAR /GET THE CHARACTER JMS I (P6CH) /OUTPUT IT NEWBUFF,JMP I L6DTRIM /GO DO NEXT CHARACTER / COMES HERE ON LAP6-DIAL . L6DEOFI,NL4000 /SET VALUE JMS I POUT /CLOSE THE P?S/8 FILE JMP I [CREPORT] /FINISH IT THERE / COMES HERE TO READ IN ANOTHER LAP6-DIAL BUFFER. NXTBUFF,JMS CHKUP /CHECK FOR <^C>, ETC. TAD L6DRFUN /GET READ FUNCTION TAD L6DFIELD /ADD ON FIELD BITS TAD L6DUNIT /ADD ON UNIT BITS DCA L6DFUNCTION /STORE IN FUNCTION WORD NL7775 /SETUP THE DCA ERRCNT /RETRY COUNT L6DIAGN,JMS I L6DHANDLER /CALL LINCTAPE ROUTINES L6DCORE /ARGUMENT POINTER JMP L6DIERROR /OOPS! TAD L6DWCNT /SETUP THE DCA BUFCNT /WORD COUNT TAD L6DCORE/(L6DBUFFER) /SETUP THE DCA BUFPTR /BUFFER POINTER PUTLUP, NOP /**** 8K **** CDF 10 TAD I BUFPTR /GET A PAIR RTR;RTR;RTR /MOVE DOWN LEFT HALF JMS L6DTRIM /OUTPUT LEFT HALF PUTCD2, NOP /**** 8K **** CDF 10 TAD I BUFPTR /GET THE PAIR AGAIN JMS L6DTRIM /OUTPUT RIGHT HALF ISZ BUFPTR /BUMP TO NEXT WORD ISZ BUFCNT /DONE WITH THIS BUFFER? JMP PUTLUP /NO, KEEP GOING TAD L6DBLOCK /GET CURRENT BLOCK TAD L6DBLENGTH /UPDATE TO NEXT BUFFER DCA L6DBLOCK /STORE BACK JMP NXTBUFFER /KEEP GOING / COMES HERE ON LINCTAPE INPUT ERROR. L6DIERR,ISZ ERRCNT /TOO MANY ERRORS? JMP L6DIAGN /NO, TRY AGAIN JMS I [SCRIBE] /YES, TELL THEM LIEMSG /THEY LOSE JMP I [CREPORT] /FINISH IT THERE SHIFT, .-. /CHARACTER SHIFT ROUTINE TAD (WINDOW+1-1) /POINT TO FIRST DCA XRIN /CHARACTER TO MOVE JMS TSETUP /SETUP TEST STRING POINTER AND COUNT SHFTLUP,SNL /IF LINK SET THEN WE CLEAR THE STRING, NOT MOVE IT TAD I XRIN /GET A CHARACTER DCA I XROUT /STORE ONE UP IN STRING ISZ TESTCT /DONE ALL YET? JMP SHFTLUP /NO, KEEP GOING JMP I SHIFT /YES, RETURN TO CALLER TSETUP, .-. /TEST STRING SETUP ROUTINE TAD (-7) /SETUP THE DCA TESTCT /STRING COUNTER TAD (WINDOW-1) /SETUP THE DCA XROUT /WINDOW POINTER JMP I TSETUP /RETURN / I/O ARGUMENTS; MUST BE IN ORDER. L6DCORE,L6DBUFFER /BUFFER ADDRESS L6DFUN, L6DLEN^100+L6DFLD+.-. /UNIT BITS WILL BE FILLED IN L6DBLOC,.-. /BLOCK NUMBER WILL BE FILLED IN BUFCNT, .-. /BUFFER WORD COUNTER BUFPTR, .-. /BUFFER POINTER EFFCHK, FFCHK /**** /E **** PEXFFCHECK L6DBLEN,L6DLENGTH%2 /**** 8K **** L8KLENGTH%2 L6DRFUN,L6DLENGTH^100 /**** 8K **** L8KLENGTH^100 L6DWCNT,L6DLENGTH^200^7777 /**** 8K **** L8KLENGTH^200^7777 PAGE / P?S/8 TO LAP6-DIAL CHARACTER OUTPUT ROUTINE. L6DOUT, JMS I (GETCHR) /GET A P?S/8 CHARACTER OUTCDF, NOP /**** 8K **** CDF 10 JMP I PUTNEXT /GO WHERE YOU SHOULD PUTNEXT,PUTONE /EXIT ROUTINE; INITIALIZED FOR STARTUP CDF 00 /BACK TO FIELD ZERO TAD CHAR /GET LATEST CHARACTER SZA CLA /IS IT ? JMP PUTRETURN /JUMP IF NOT DCA OUTZAP /CAUSE FILE TO CLOSE CLL /CLEAR LINK FOR TEST TAD OUTPTR /GET OUTPUT POINTER TAD (-OUTBUFFER-1) /MAKE IT ABSOLUTE SNL /SKIP IF NOT AT BEGINNING CLA /ELSE REMOVE NEGATIVE OFFSET AND [7400] /JUST PAGE BITS STL RAR /MOVE DOWN AND SET WRITE BIT TAD [200] /ADD TWO PAGES TO CALL JMP L6DCLOSE /CONTINUE THERE PUTRETU,ISZ OUTFOO /DONE A PAIR? JMP L6DOUT /NO, KEEP GOING NL7776 /YES, RESET DCA OUTFOO /FOR NEXT TIME ISZ OUTCNT /DONE WITH THIS BUFFER? JMP L6DOUT /NO, KEEP GOING TAD OUTWCNT /YES, RESET THE DCA OUTCNT /WORD COUNT TAD OUTADR/(OUTBUFFER) /RESET THE DCA OUTPTR /OUTPUT POINTER TAD L6DWFUN /GET WRITE FUNCTION L6DCLOS,TAD L6DFIELD /ADD ON FIELD BITS TAD L6DUNIT /ADD ON UNIT BITS DCA OUTFUN /STORE IN-LINE JMS CHKUP /CHECK FOR <^C>, ETC. NL7775 /SETUP THE DCA ERRCNT /RETRY COUNT L6DOAGN,JMS I L6DHANDLER /CALL THE LINCTAPE HANDLER OUTADR /ARGUMENT POINTER JMP L6DOERROR /BARF! TAD OUTBLK /GET OUTPUT BLOCK TAD OUTBLENGTH /UPDATE IT DCA OUTBLK /STORE BACK OUTZAP, JMP L6DOUT /**** **** 0000 ISZ FILCNT /BUMP OUTPUT FILE COUNT JMP I [CREPORT] /FINISH IT THERE / COMES HERE ON OUTPUT ERROR. L6DOERR,ISZ ERRCNT /TOO MANY ERRORS? JMP L6DOAGN /NO, TRY AGAIN JMS I [SCRIBE] /YES, TELL THEM LOEMSG /THEY LOSE JMP I [CREPORT] /FINISH IT THERE / I/O ARGUMENTS; MUST BE IN ORDER. OUTADR, OUTBUFFER /BUFFER ADDRESS OUTFUN, OUTLENGTH^100+WRITE+L6DFLD+.-. /UNIT BITS WILL BE FILLED IN OUTBLK, .-. /BLOCK NUMBER WILL BE FILLED IN OUTFOO, -2 /PAIR COUNTER PUTLOOP,JMS PUTNEXT /GET NEXT CHARACTER PUTONE, CLL RTL;RTL;RTL /MOVE UP DCA I OUTPTR /STORE THE FIRST CHARACTER TAD OUTPTR /GET THE POINTER DCA TEMPTR /SAVE IT ISZ OUTPTR /BUMP TO NEXT JMS PUTNEXT /GET NEXT CHARACTER TAD I TEMPTR /ADD ON FIRST CHARACTER DCA I TEMPTR /STORE BACK JMP PUTLOOP /KEEP GOING / P?S/8 FIXED FILE ON EJECT CHECK ROUTINE. FFCHK, .-. /CHECK IF NEEDED ROUTINE CLA /CLEAN UP TAD I [SWMX] /GET /M-/X SWITCHES AND [400] /JUST /P BIT SZA CLA /SKIP IF OFF JMP I FFCHK /ELSE TAKE IMMEDIATE RETURN TAD I [FILBUFFER+3776] /GET TEXT POINTER TAD FFPROTECTION /ADD ON PROTECTION VALUE CIA /INVERT FOR TESTING TAD I [FILBUFFER+3777] /COMPARE TO LINE NUMBER LIMIT SPA CLA /SKIP IF NOT ALMOST FULL ISZ FFCHK /TAKE SKIP RETURN IF ALMOST FULL JMP I FFCHK /RETURN EITHER WAY / P?S/8 EXTENDED FILE INITIALIZE ROUTINE. / CALL WITH: / JMS I (PEXINITIALIZE) /CALL ROUTINE / BLOCK+UNIT /FILE ARGUMENT ([BLOCK&7770] + [UNIT&7]) / RETURN /ALWAYS RETURN HERE PEXINIT,.-. /EXTENDED FILES INITIALIZE ROUTINE TAD I PEXINIT /GET FILE ARGUMENT AND [7770] /JUST BLOCK BITS DCA I (PEXBLK) /STORE IN-LINE TAD I PEXINIT /GET ARGUMENT AGAIN AND [7] /JUST UNIT BITS DCA I (PEXUNIT) /STASH IT TAD (PEXLEN^100) /SETUP THE DCA I (PEXCNT) /USUAL PAGE COUNT TAD [1^100+00] /GET READ FUNCTION TAD I (PEXUNIT) /ADD ON UNIT BITS DCA PEXCFUN /STORE IN-LINE JMS I PSYSIO/[SYSIO] /CALL I/O ROUTINES PEXCBUF,FILBUFFER /BUFFER ADDRESS PEXCFUN,1^100+00+.-. /UNIT BITS WILL BE FILLED IN EXTCAT+2 /DIRECTORY BLOCK TAD I (FILBUFFER+176) /GET HIGHEST DEVICE BLOCK DCA I (PEXHIGHBLOCK) /STASH IT TAD [-SBOOT] /SETUP THE USUAL DCA PEXLIMIT /BUFFER LIMIT DCA PFFPREVIOUS /INITIALIZE PREVIOUS CHARACTER TO TAD PEXCBUFFER/(FILBUFFER) /SETUP THE DCA PEXPTR /FILE POINTER TAD (PEXLEFT) /SETUP THE DCA I (PEXPUT) /CO-ROUTINE DCA PEXEOFSW /CLEAR SWITCH ISZ PEXINIT /BUMP PAST ARGUMENT JMP I PEXINIT /RETURN TO CALLER / P?S/8 EXTENDED FILE ON CHECK ROUTINE. PEXFFCH,.-. /CHECK IF NEEDED ROUTINE CLA /CLEAN UP TAD PEXEOFSW /GET SWITCH SNA CLA /SKIP IF SET JMP I PEXFFCHECK /ELSE JUST TAKE IMMEDIATE RETURN TAD PEXPTR /GET THE STORAGE POINTER TAD FFPROTECTION /ADD ON PROTECTION VALUE CLL /CLEAR LINK FOR TEST TAD PEXLIMIT /ADD ON CURRENT POINTER LIMIT VALUE SZL CLA /SKIP IF STILL OK ISZ PEXFFCHECK /BUMP RETURN IS ALMOST FULL JMP I PEXFFCHECK /RETURN EITHER WAY PAGE / P?S/8 CHARACTER INPUT ROUTINE. GETCHR, .-. /GET A CHARACTER ROUTINE JMP I GCTRIM /GO WHERE YOU SHOULD GCTRIM, GCINITIALIZE /EXIT ROUTINE; PRELOADED FOR STARTUP AND [77] /JUST SIX-BIT SNA /? JMP GCEOL /YES TAD [-37] /IS IT ? SNA /SKIP IF NOT JMP GCTAB /JUMP IT IT MATCHES TAD [-"#!200+37] /IS IT "#"? SNA /SKIP IF OTHER TAD ["%-"#] /CONVERT "#" TO "%" GCEOL2, TAD [-"'+"#] /IS IT "'"? SNA /SKIP IF OTHER TAD [""-"'] /CONVERT "'" TO """ GCTAB, TAD TSTRING/["'&77] /RESTORE THE CHARACTER GCEOT, DCA CHAR /SAVE THE CHARACTER TAD CHAR /GET THE CHARACTER AGAIN JMP I GETCHR /RETURN TO CALLER GCEOL, TAD (GETLEFT) /RESET THE CO-ROUTINE DCA GCTRIM /FOR NEXT CALLER JMP GCEOL2 /CONTINUE THERE GCEOF, ISZ FILPTR /BUMP TO NEXT FILE ARGUMENT GCINITI,TAD I FILPTR /GET LATEST FILE ARGUMENT SNA /SKIP IF NOT AT END OF LIST JMP GCEOT /JUMP IF SO AND [7770] /JUST BLOCK BITS DCA GCBLOCK /STORE IN-LINE TAD I FILPTR /GET FILE ARGUMENT AGAIN AND [7] /JUST UNIT BITS TAD (INLEN^100+00) /ADD ON READ BITS DCA GCFUNCT /STORE IN-LINE GCEOB, JMS CHKUP /CHECK FOR <^C>, ETC. JMS I PSYSIO/[SYSIO] /CALL I/O ROUTINES GCADR, INBUFFER /BUFFER ADDRESS GCFUNCT,INLEN^100+00+.-. /UNIT BITS WILL BE FILLED IN GCBLOCK,.-. /BLOCK NUMBER WILL BE FILLED IN TAD GCBLOCK /GET CURRENT BLOCK TAD (INLEN) /UPDATE TO NEXT BUFFER DCA GCBLOCK /SAVE FOR NEXT TIME TAD GCADR/(INBUFFER)/SETUP THE DCA GCPTR /UNPACKING POINTER GETNEXT,TAD I GCPTR /GET NEXT PAIR SNA /? JMP GCEOF /YES RTR;RTR;RTR /NO, MOVE DOWN JMS GCTRIM /TRIM LEFT-HAND CHARACTER AND EXIT TAD I GCPTR /GET IT AGAIN JMS GCTRIM /TRIM RIGHT-HAND CHARACTER AND EXIT GETLEFT,ISZ GCPTR /BUMP TO NEXT PAIR TAD GCPTR /GET THE POINTER TAD [-SBOOT] /COMPARE TO LIMIT SNA CLA /SKIP IF NOT AT END OF BUFFER JMP GCEOB /GO READ IN ANOTHER BUFFER / WE'RE STILL OK, KEEP GOING. JMP GETNEXT /GO GET ANOTHER WORD LIEMSG, TEXT "%^LAP6-DIAL L^INCTAPE ^I^NPUT ^E^RROR!%" LOEMSG, TEXT "%^LAP6-DIAL L^INCTAPE ^O^UTPUT ^E^RROR!%^" PAGE / P?S/8 FIXED FILE OUTPUT ROUTINE. / CALL WITH: / TAD CHAR /AC CONTAINS LATEST CHARACTER TO OUTPUT / JMS I (PFFOUT) /CALL ROUTINE / JMP FILEFULL /THE FILE BECAME FULL AND WAS CLOSED OUT / JMP FILEOK /FILE IS STILL ACTIVE / FILES WILL BE CLOSED OUT IF: / A) A NON- IS PASSED AND THERE IS ONLY ROOM ENOUGH FOR THE / NON- CHARACTER AND AN ADDITIONAL CHARACTER AND . / AN WILL BE AUTOMATICALLY INSERTED TO PRESERVE THE INTEGRITY / OF THE FILE ALONG WITH AN TO CLOSE IT. THE FILE WILL ALSO / BE WRITTEN OUT TO THE SYSTEM DEVICE ACCORDING TO THE PRIOR / INITIALIZATION (SEE "PFFINIT"). / B) AN CHARACTER (0000) IS PASSED AND THERE IS LESS ROOM THAN / "EOLPROT" LEFT IN THE FILE. AN WILL BE INSERTED INTO THE FILE / AND IT WILL BE CLOSED AND WRITTEN OUT TO THE SYSTEM DEVICE ACCORDING / TO THE PRIOR INITIALIZATION (SEE "PFFINIT"). / C) AN CHARACTER (4000) IS PASSED. IF THE PREVIOUS CHARACTER WAS / NOT AN CHARACTER, ONE WILL BE INSERTED BEFORE AN IS / INSERTED. THE FILE WILL BE CLOSED AND WRITTEN OUT TO THE SYSTEM / DEVICE ACCORDING TO THE PRIOR INITIALIZATION (SEE "PFFINIT"). PFFOUT, .-. /FIXED FILE OUTPUT ROUTINE DCA PFFLATEST /SAVE LATEST CHARACTER TAD PFFLATEST /GET IT BACK SNA /IS IT ? JMP PFFEOL /YES SPA CLA /IS IT ? JMP PFFCLOSE /YES TAD PFFLATEST /NO, GET THE CHARACTER AND [77] /JUST IN CASE JMS PFFSTORE /STORE IN FILE BUFFER TAD PFFPTR /GET THE INSERTION POINTER VALUE TAD L5/[5] /ADD ON ULTIMATE PROTECTION VALUE CIA /INVERT FOR TESTING TAD I [FILBUFFER+3777] /COMPARE TO FILE POINTER LIMIT VALUE SMA SZA CLA /SKIP IF FILE IS ABSOLUTELY FULL JMP PFFOK /JUMP IF STILL SOME EXTRA ROOM JMS PFFOEOL /STORE CHARACTER TO PRESERVE FILE INTEGRITY JMP PFFWRITE /CONTINUE THERE PFFEOL, JMS PFFOEOL /OUTPUT CHARACTER TAD PFFNUMBER /GET LATEST LINE NUMBER TAD PFFINCREMENT /BUMP TO NEXT VALUE DCA PFFNUMBER /STORE BACK FOR NEXT TIME TAD (PFFLEFT) /RESET THE DCA PFFPUT /CO-ROUTINE TAD I [FILBUFFER+3776] /GET TEXT POINTER TAD EOLPROTECTION /ADD ON PROTECTION VALUE CIA /INVERT FOR TESTING TAD I [FILBUFFER+3777] /COMPARE TO POINTER LIMIT PF7700, SMA CLA /SKIP IF TOO FULL JMP PFFOK /JUMP IF STILL ENOUGH ROOM SKP /FALL INTO ROUTINE PFFCLOS,TAD PFFPREVIOUS /GET PREVIOUS CHARACTER SZA CLA /SKIP IF IT WAS JMS PFFOEOL /STORE CHARACTER PRESERVING FILE INTEGRITY PFFWRIT,TAD I [FILBUFFER+3776] /GET FREE TEXT POINTER TAD (-FILBUFFER) /COMPARE TO EMPTY VALUE SNA CLA /SKIP IF OTHERWISE JMP PFFEMPTY /JUMP IF FILE IS EMPTY JMS I PSYSIO/[SYSIO] /CALL I/O ROUTINES PFFBUFF,FILBUFFER /FILE ADDRESS PFFFUN, 20^100+WRITE+00+.-. /UNIT BITS WILL BE FILLED IN PFFBLK, .-. /BLOCK NUMBER WILL BE FILLED IN ISZ FILCNT /BUMP UP CREATION COUNT PFFEMPT,JMS PFFINITIALIZE /RE-INITIALIZE THE FILE POINTERS PFFDOLL,DOLBLK+.-. /UNIT BITS FROM "SBTFUN" WILL BE FILLED IN 144 /INITIAL LINE NUMBER 12 /LINE NUMBER INCREMENT SKP /DO NOT TAKE SKIP RETURN PFFOK, ISZ PFFOUT /BUMP TO OK RETURN TAD PFFLATEST /GET LATEST CHARACTER DCA PFFPREVIOUS /SAVE AS PREVIOUS CHARACTER FOR NEXT TIME JMP I PFFOUT /RETURN TO CALLER PFFOEOL,.-. / OUTPUT ROUTINE JMS PFFSTORE /OUTPUT CHARACTER ISZ PFFPTR /BUMP PAST LAST WORD DCA I PFFPTR /STORE TENTATIVE TAD PFFNUMBER /GET LATEST LINE NUMBER DCA I PFFLPTR /STORE OVER (FORMER) DUMMY LINE VALUE JMS PFFLINE /UPDATE FILE POINTERS AND CREATE NEW DUMMY PAIR JMP I PFFOEOL /RETURN / P?S/8 FIXED FILE INITIALIZE ROUTINE. / CALL WITH: / JMS I (PFFINITIALIZE) /CALL ROUTINE / BLOCK+UNIT /FILE ARGUMENT ([BLOCK&7770] + [UNIT&7]) / NUMBER /INITIAL LINE NUMBER / INCREMENT /LINE NUMBER INCREMENT / RETURN /ALWAYS RETURNS HERE PFFINIT,.-. /FIXED FILE INITIALIZE ROUTINE TAD I PFFINITIALIZE /GET FILE ARGUMENT AND [7770] /JUST BLOCK BITS DCA PFFBLK /STORE IN-LINE TAD I PFFINITIALIZE /GET IT AGAIN AND [7] /JUST UNIT BITS TAD (20^100+WRITE) /FORM WRITE FUNCTION DCA PFFFUN /STORE IN-LINE ISZ PFFINITIALIZE /BUMP TO NEXT ARGUMENT TAD I PFFINITIALIZE /GET INTIAL LINE NUMBER DCA PFFNUMBER /STASH IT ISZ PFFINITIALIZE /BUMP TO NEXT ARGUMENT TAD I PFFINITIALIZE /GET LINE NUMBER INCREMENT DCA PFFINCREMENT /STASH IT ISZ PFFINITIALIZE /BUMP PAST ARGUMENT TAD PFFBUFFER/(FILBUFFER) /SETUP THE DCA PFFPTR /TEXT POINTER TAD (PFFLEFT) /INITIALIZE DCA PFFPUT /CO-ROUTINE TAD [FILBUFFER+3777] /INITIALIZE DCA PFFLPTR /LINE POINTER JMS PFFLINE /CREATE INITIAL FILE POINTERS DCA PFFPREVIOUS /INITIALIZE PREVIOUS CHARACTER TO JMP I PFFINITIALIZE /RETURN PFFLINE,.-. /LINE POINTERS UPDATE ROUTINE NL7775 /BACKUP TO TAD PFFLPTR /PREVIOUS PAIR DCA PFFLPTR /STORE BACK TAD PFFLPTR /GET THE POINTER DCA I [FILBUFFER+3777] /STORE LATEST PAIR POINTER TAD PFFPTR /GET LATEST TEXT POINTER DCA I [FILBUFFER+3776] /STORE IN FREE TEXT POINTER TAD PFFPTR /GET TEXT POINTER DCA I PFFLPTR /STORE AS FREE TEXT POINTER IN DUMMY PAIR ISZ PFFLPTR /BUMP TO DUMMY LINE ADDRESS NL7777 /GET DUMMY LINE VALUE DCA I PFFLPTR /STORE IN DUMMY LINE HOLDER JMP I PFFLINE /RETURN PFFSTOR,.-. /CHARACTER INSERTION ROUTINE JMP I PFFPUT /GO WHERE YOU SHOULD PFFPUT, PFFLEFT /EXIT ROUTINE; INITIALIZED FOR FIRST CHARACTER DCA I PFFPTR /STORE LATEST WORD JMP I PFFSTORE /RETURN TO THEIR CALLER PFFLEFT,STL RTL;STL RTL;STL RTL /SHIFT LEFT WITH GARBAGE JMS PFFPUT /STORE IT AND GET ANOTHER CHARACTER DCA PFFINITIALIZE /SAVE LATEST CHARACTER TAD I PFFPTR /GET PREVIOUS AND GARBAGE AND PF7700/(7700) /REMOVE GARBAGE TAD PFFINITIALIZE /ADD ON LATEST JMS PFFPUT /STORE BOTH AND GET ANOTHER ISZ PFFPTR /BUMP TO NEXT PAIR JMP PFFLEFT /KEEP GOING PFFINCR,.-. /LINE NUMBER INCREMENT FOR FIXED FILES PFFLPTR,.-. /FIXED FILE INFORMATION PAIR POINTER PFFNUMB,.-. /LATEST LINE NUMBER FOR FIXED FILES PFFPTR, .-. /FIXED FILE INSERTION POINTER FLSMSG, TEXT " ^F^ILES^" PAGE / P?S/8 EXTENDED FILE OUTPUT ROUTINE. / CALL WITH: / TAD CHAR /AC CONTAINS LATEST CHARACTER TO OUTPUT / JMS I (PEXOUT) /CALL THE ROUTINE / JMP FILEFULL /THE FILE BECAME FULL AND WAS CLOSED OUT / JMP FILEOK /FILE IS STILL ACTIVE / FILES WILL BE CLOSED IF: / A) A NON- IS PASSED AND THERE IS ONLY ROOM FOR THE NON- / CHARACTER AND AN ADDITIONAL CHARACTER AND . AN / WILL BE AUTOMATICALLY INSERTED TO PRESERVE THE FILE INTEGRITY / ALONG WITH AN CHARACTER TO CLOSE IT. THE FILE WILL BE / WRITTEN OUT PERIODICALLY IN BUFFERS; THE CIRCUMSTANCE ABOVE WILL / CAUSE THE LAST BUFFER TO BE WRITTEN OUT TO THE SYSTEM DEVICE / ACCORDING TO THE PRIOR INITIALIZATION (SEE "PEXINIT"). / B) AN CHARACTER (0000) IS PASSED AND THERE IS LESS THAN / "EOLPROT" LEFT IN THE FILE. AN WILL BE INSERTED INTO THE / FILE AND THE LAST BUFFER WRITTEN OUT TO THE SYSTEM DEVICE THUS / CLOSING THE FILE. THIS WILL BE DONE ACCORDING TO THE PRIOR / INITIALIZATION (SEE "PEXINIT"). / C) AN CHARACTER (4000) IS PASSED. IF THE PREVIOUS CHARACTER / WAS NOT AN CHARACTER, ONE WILL BE INSERTED BEFORE AN / CHARACTER IS INSERTED. THE FILE WILL THEN BE CLOSED AND THE / LAST BUFFER WRITTEN OUT TO THE SYSTEM DEVICE ACCORDING TO THE / PRIOR INITIALIZATION (SEE "PEXINIT"). PEXOUT, .-. /EXTENDED FILE OUTPUT ROUTINE DCA PFFLATEST /SAVE LATEST CHARACTER TAD PFFLATEST /GET IT BACK SNA /IS IT ? JMP PEXEOL /YES SPA CLA /IS IT ? JMP PEXCLOSE /YES TAD PFFLATEST /NO, GET THE CHARACTER AND [77] /JUST IN CASE JMS PEXSTORE /OUTPUT INTO FILE PEXEOK, TAD PEXPTR /GET THE OUTPUT POINTER TAD PEXLIMIT /COMPARE TO CURRENT LIMIT SZA CLA /SKIP IF AT THE LIMIT JMP PEXOK /JUMP IF NOT THERE YET TAD PEXEOFSW /GET SWITCH SNA CLA /SKIP IF NOW IN LAST BUFFER JMP PEXWRITE /JUMP IF NOT SKP /JUST DO NOW PEXCL2, SZA CLA /SKIP IF AT AND IS NOT NEEDED JMS PEXOEOL /OUTPUT CHARACTER DCA I PEXPTR /STORE WORD ISZ FILCNT /BUMP FILE CREATION COUNT PEXWRIT,TAD PEXFUN /GET WRITE FUNCTION AND (4070) /REMOVE PAGE COUNT AND UNIT TAD PEXCNT /ADD ON CURRENT PAGE COUNT TAD PEXUNIT /ADD ON LOGICAL UNIT DCA PEXFUN /STORE IN-LINE JMS I PSYSIO/[SYSIO] /CALL I/O ROUTINES PEXBUFF,FILBUFFER /BUFFER ADDRESS PEXFUN, PEXLEN^100+WRITE+00+.-. /LENGTH AND UNIT BITS WILL BE FILLED IN PEXBLK, .-. /BLOCK NUMBER WILL BE FILLED IN TAD PEXEOFSW /GET SWITCH SZA CLA /SKIP IF NOT AT JMP I PEXOUT /TAKE IMMEDIATE RETURN SINCE FILE IS CLOSED TAD PEXBUFF/(FILBUFFER) /RESET THE DCA PEXPTR /FILE POINTER TAD PEXBLK /GET THE BLOCK TAD (PEXLEN) /UPDATE TO NEXT BLOCK GROUP DCA PEXBLK /STORE BACK PEXOK, ISZ PEXOUT /TAKE SKIP RETURN SINCE FILE IS STILL OPEN TAD PFFLATEST /GET LATEST CHARACTER DCA PFFPREVIOUS /SAVE AS PREVIOUS CHARACTER FOR NEXT TIME JMP I PEXOUT /RETURN TO CALLER PEXEOL, JMS PEXOEOL /OUTPUT TAD PEXEOFSW /IN LAST BUFFER? SNA CLA /SKIP IF SO JMP PEXEOK /JUMP IF NOT TAD PEXPTR /GET THE POINTER TAD EOLPROTECTION /ADD ON PROTECTION VALUE CLL /CLEAR LINK FOR TEST TAD PEXLIMIT /ADD ON FINAL LIMIT SNL CLA /SKIP IF TOO CLOSE TO FULL JMP PEXEOK /JUMP IF NOT TOO FULL / THE FILE IS NEARLY FULL; LET'S QUIT NOW AS THE NEXT LINE PROBABLY WON'T FIT! SKP /DON'T OUTPUT AGAIN! PEXCLOS,TAD PFFPREVIOUS /GET PREVIOUS CHARACTER ISZ PEXEOFSW /INDICATE NOW JMP PEXCL2 /CONTINUE THERE / ROUTINE. PEXOEOL,.-. /OUTPUT ROUTINE PEXOAGN,JMS PEXSTORE /OUTPUT TAD PEXPUT /GET ADDRESS HOLDER TAD (-PEXLEFT) /COMPARE TO EXPECTED VALUE SNA CLA /SKIP IF OTHER JMP I PEXOEOL /RETURN IF CORRECT TAD [77] /GET RIGHT-HAND JUNK VALUE JMP PEXOAGN /GO DO IT AGAIN PEXSTOR,.-. /OUTPUT A CHARACTER ROUTINE DCA PEXTEMP /SAVE PASSED VALUE TAD PEXBLK /GET CURRENT BLOCK TAD (PEXLEN) /ADD ON EXPECTED UPDATE CLL CIA /INVERT FOR TESTING TAD PEXHIGHBLOCK /COMPARE TO FINAL LIMIT SZL /SKIP IF TOO MUCH JMP PEXSOK /JUMP IF NOT IAC /CORRECT VALUE TAD (PEXLEN) /NOW HAVE NEW LENGTH CLL RTL;RTL;RTL /MOVE UP DCA PEXCNT /SAVE AS PAGE COUNT FOR I/O CALL TAD PEXCNT /GET IT BACK RAL /MOVE UP TO WORD COUNT TAD PEXBUFF/(FILBUFFER) /MAKE IT ABSOLUTE CIA /INVERT IT TAD [2] /LEAVE ROOM FOR AND DCA PEXLIMIT /SAVE AS NEW LIMIT NL0001 /SET THE DCA PEXEOFSW / SWITCH PEXSOK, CLA /CLEAN UP TAD PEXTEMP /RESTORE THE CHARACTER JMP I PEXPUT /GO WHERE YOU SHOULD PEXPUT, PEXLEFT /EXIT ROUTINE; INITIALIZED FOR FIRST CHARACTER DCA I PEXPTR /STORE THE PASSED WORD RAL /GET POSSIBLE INCREMENT TAD PEXPTR /UPDATE POINTER DCA PEXPTR /STORE BACK JMP I PEXSTORE /RETURN TO ORIGINAL CALLER PEXLOOP,TAD I PEXPTR /GET THE OLD WORD TAD PEXTEMP /ADD ON LATEST RIGHT-HAND CHARACTER STL /INDICATE POINTER BUMP JMS PEXPUT /OUTPUT THE PAIR PEXLEFT,AND [77] /JUST LATEST CHARACTER CLL RTL;RTL;RTL /MOVE UP JMS PEXPUT /STORE THIS ONE; LINK IS CLEAR DCA PEXTEMP /SAVE LATEST CHARACTER JMP PEXLOOP /KEEP GOING PEXCNT, .-. /BUFFER PAGE COUNT PEXHIGH,.-. /HIGHEST BLOCK ON LATEST OUTPUT DEVICE PEXTEMP,.-. /TEMPORARY PEXUNIT,.-. /OUTPUT UNIT CREMSG, TEXT " ^C^REATED%" EJECTMS,37;"E&77;"J&77;"E&77;"C&77;"T&77;0;-1 /EJECT MESSAGE PAGE / P?S/8 PDP-12 NON-SYSTEM HANDLER / P?S/8 LINCTAPE NON-SYSTEM HANDLER FOR THE PDP-12. / LAST EDIT: 17-APR-1986 10:00:00 CJL / MAY BE ASSEMBLED WITH '/J' SWITCH SET. / FEATURES: / 1) SUPPORT OF EIGHT UNITS (0-7). / 2) PARITY ERROR DETECTION AND RETRY (WITH COUNTER). / 3) NOT READY OR WRITE LOCK DETECTION AND RETRY (WITH COUNTER). / 4) WAITS IN PDP-8 MODE, THUS ALLOWING INTERRUPTS. XLIST OFF IFNDEF OFF IFNDEF ON IFNDEF BLKSIZE XLIST OFF IFZERO BLKSIZE-400 < XLIST ON; IFZERO 1 < / 5) SUPPORTS 256 OR 257 WORDS/BLOCK LINCTAPES AS A NON-STANDARD / FEATURE OF THIS PROGRAM. > XLIST OFF > IFZERO BLKSIZE-200 < XLIST ON; IFZERO 1 < / 5) SUPPORTS 128 OR 129 WORDS/BLOCK LINCTAPES. > XLIST OFF > XLIST ON PAGE /START ON A GOOD BOUNDARY HERE= . /WHERE WE ARE / DEFINITIONS. AXO= 0001 /LOAD EXTENDED OPERATIONS BUFFER XLIST OFF IFZERO BLKSIZE-200 < XLIST ON BLKSIZE=0200 /128 WORDS/BLOCK (ALSO ALLOWS 129) XLIST OFF > IFZERO BLKSIZE-400 < XLIST ON BLKSIZE=0400 /256 WORDS/BLOCK (ALSO ALLOWS 257) XLIST OFF > XLIST ON LDA= 1000 /LOAD ACCUMULATOR LINC= 6141 /GOTO LINC MODE XLIST OFF IFNDEF LINCTAPE XLIST ON LMR= 6151 /LOAD MAINTENANCE REGISTER LTLENGT=4000 /LINCTAPE BLOCK COUNT NL0002= CLA CLL CML RTL /LOAD AC WITH 0002 NL4000= CLA CLL CML RAR /LOAD AC WITH 4000 NL7775= CLA CLL CMA RTL /LOAD AC WITH 7775 PDP= 0002 /GOTO PDP-8 MODE RDE= 0702 /READ A TAPE BLOCK REVISIO="B&77 /REVISION OF HANDLER TAC= 0003 /TAPE ACCUMULATOR TO ACCUMULATOR TMA= 0023 /LOAD TAPE MEMORY ADDRESS REGISTER TRC= 6152 /TAPE REGISTER CLOCK XFR= 6154 /TRANSFER SELECTED REGISTER TO ACCUMULATOR / DEVICE HANDLER HEADER BLOCK. XLIST OFF IFZERO BLKSIZE-200 < XLIST ON *"L&177;*"T&177;*"A&177 /GROUP NAME *-1 /GROUP COUNT *"L&177;*"T&177;*"A&177 /DEVICE NAME XLIST OFF > IFZERO BLKSIZE-400 < XLIST ON *"L&177;*"T&177;*"D&177 /GROUP NAME *-1 /GROUP COUNT *"L&177;*"T&177;*"D&177 /DEVICE NAME XLIST OFF > XLIST ON *LINCTAPE&177 /ENTRY POINT *LTLENGTH-1 /LENGTH EXPRESSED AS HIGHEST BLOCK *REVISION /REVISION OF HANDLER *HERE /RESET ORIGIN LINCTAP,.-. /ENTRY POINT NL0002 /SET INSTRUCTION FIELD BIT RDF /NOW HAVE CALLING FIELD TAD (CDF) /MAKE RETURN CIF CDF INSTRUCTION DCA LTEXIT /STORE IN-LINE FOR EXIT LATER TAD I LINCTAPE /GET PARAMETER POINTER DCA LTBLOCK /STASH IT ISZ LINCTAPE /BUMP TO ERROR RETURN TAD I LTBLOCK /GET TRANSFER ADDRESS DCA LTCORE /STASH IT ISZ LTBLOCK /BUMP TO NEXT TAD I LTBLOCK /GET FUNCTION WORD AND (70) /JUST TRANSFER FIELD TAD (CDF) /MAKE INTO CDF TRANSFER FIELD INSTRUCTION DCA LTSVFLD /STORE IN-LINE FOR LATER TAD I LTBLOCK /GET FUNCTION WORD AGAIN RAR /LOW-ORDER UNIT BIT TO LINK AND LT3/(3) /ISOLATE HIGH-ORDER UNIT BITS DCA LTEMP /SAVE FOR LATER TAD I LTBLOCK /U2 RW P0 P1 P2 P3 P4 F0 F1 F2 U0 U1 U2 RTL /P0 P1 P2 P3 P4 F0 F1 F2 U0 U1 U2 U2 RW AND LT3/(3) /P0 0 0 0 0 0 0 0 0 0 0 U2 RW CLL RTL /0 0 0 0 0 0 0 0 0 U2 RW 0 0 TAD (RDE) /0 0 0 0 1 1 1 0 0 U2 RW 1 0 DCA LTAPINST /SAVE "RDE" OR "WRI" OR "RDE U" OR "WRI U" IN-LINE TAD LTAPINST /GET TAPE INSTRUCTION BACK DCA LTAPTST /SAVE IN-LINE FOR TESTING ALSO TAD I LTBLOCK /GET FUNCTION WORD AGAIN RAL /MOVE UP AND XLIST OFF IFZERO BLKSIZE-400 < XLIST ON AND (7400) /ISOLATE PAGE BITS XLIST OFF > IFZERO BLKSIZE-200 < XLIST ON AND LT7600/(7600) /ISOLATE PAGE BITS XLIST OFF > XLIST ON DCA LTPAGCT /SAVE FOR COUNTING TAD LTSVFLD /RW 1 1 0 0 1 0 F0 F1 F2 0 0 1 AND (70) /RW 0 0 0 0 0 0 F0 F1 F2 0 0 0 CLL RTL /0 0 0 0 0 F0 F1 F2 0 0 0 0 0 STL IAC RTL /0 0 0 F0 F1 F2 0 0 0 0 1 1 0 RTL /0 F0 F1 F2 0 0 0 0 1 1 0 0 0 TAD LTEMP /0 F0 F1 F2 0 0 0 0 1 1 0 U0 U1 DCA LTAXO /STORE FIELD, NOPAUSE, EXTENDED ADDRESSING, /HIGH-ORDER UNIT BITS IN-LINE FOR LATER ISZ LTBLOCK /BUMP TO BLOCK NUMBER TAD I LTBLOCK /GET THE BLOCK NUMBER DCA LTBLOCK /STASH IT FOR LATER RIF /GET OUR FIELD TAD (CIF) /MAKE INTO CIF OUR FIELD INSTRUCTION DCA LTINHBT /STORE IN-LINE TO TEMPORARILY PREVENT /INTERRUPTS AS THE CODE GOES INTO LINC MODE TAD LTINHBT /GET CIF OUR FIELD INSTRUCTION BACK DCA LTINH2 /STORE IN-LINE AS BEFORE NL7775 /SETUP THE DCA LTRYCNT /ERROR RETRY COUNTER LTNEXT, TAD LTCORE /GET TRANSFER ADDRESS LTINH2, .-. /WILL BE CIF OUR FIELD TO INHIBIT INTERRUPTS LINC /GOTO LINC MODE TMA /LOAD TAPE MEMORY ADDRESS SETUP REGISTER LDA!20 /LOAD ACCUMULATOR WITH LTAXO, .-. /EXTENDED ADDRESSING, NOPAUSE, FIELD /AND HIGH-ORDER UNIT BITS AXO /LOAD EXTENDED OPERATIONS BUFFER LTAPTST,.-. /WILL BE "RDE" OR "WRI" OR "RDE U" OR "WRI U" 0 /MUST USE BLOCK ZERO! LDA!20; 5000 /GET REGISTER SETTING BITS PDP /BACK TO PDP-8 MODE LMR /LOAD MAINTENANCE REGISTER XFR /GET DRIVE STATUS BACK RTR /DRIVE OK TO LINK SNL CLA /SKIP IF DRIVE OK JMP LTERR /JUMP IF NOT LINC /GOTO LINC MODE LTAPINS,.-. /WILL BE "RDE" OR "WRI" OR "RDE U" OR "WRI U" LTBLOCK,.-. /WILL BE DESIRED BLOCK NUMBER PDP /BACK TO PDP-8 MODE TAD LTCORE /GET TRANSFER ADDRESS TAD (BLKSIZE) /NOW HAVE ENDANGERED WORD'S ADDRESS DCA LTEMP /SAVE IT LTSVFLD,.-. /WILL BE CDF TRANSFER FIELD TAD I LTEMP /GET ENDANGERED WORD DCA LTSAVIT /SAVE IT TAD (100) /GET TEST BIT LMR /LOAD MAINTENANCE REGISTER JMP .-1 /WILL SKIP WHEN TAPE IS DONE LT7600, CLA!400 /CLEAN UP TAD LTSAVIT /GET ENDANGERED WORD DCA I LTEMP /RESTORE IT LTINHBT,.-. /WILL BE CIF OUR FIELD INSTRUCTION LINC /GOTO LINC MODE LT3, TAC /GET TAPE ACCUMULATOR PDP /BACK TO PDP-8 MODE CLL IAC /LINK IS SET IF NO PARITY ERRORS IF /READING, GARBAGE VALUE IF WRITING CLA IAC RTL /FORM (WRI&4)+(RDE&2&(NO PARITY ERROR)) AND LTAPINS /AC=4 (IF WRITING) OR AC=2 (IF READING /AND NO PARITY ERROR) SNA CLA /SKIP IF WRITING OR NO PARITY ERROR WHILE READING JMP LTERR /JUMP ON READ PARITY ERROR TAD LTEMP /GET PROTECTED ADDRESS DCA LTCORE /USE NEXT TIME FOR TRANSFER ADDRESS ISZ LTBLOCK /BUMP TO NEXT BLOCK TAD LTPAGCT /GET THE PAGE COUNT XLIST OFF IFZERO BLKSIZE-400 < XLIST ON TAD (-BLKSIZE) /ACCOUNT FOR LATEST TRANSFER XLIST OFF > IFZERO BLKSIZE-200 < XLIST ON TAD LT7600/(-200) /ACCOUNT FOR LATEST TRANSFER XLIST OFF > XLIST ON SNA /ANY LEFT TO DO? JMP LTDONE /NO, RETURN TO CALLER DCA LTPAGCT /YES, SAVE FOR NEXT TIME JMP LTNEXT /GO DO NEXT BLOCK LTERR, ISZ LTRYCNT /TOO MANY ERRORS? JMP LTNEXT /NO, GO READ IT AGAIN NL4000 /GET PRESET BIT TRC /RESET THE TAPE CONTROLLER SKP /FORGET IT LTDONE, ISZ LINCTAPE /BUMP TO SUCCESSFUL RETURN LTEXIT, .-. /WILL BE CIF CDF RETURN FIELD JMP I LINCTAPE /RETURN TO CALLER LTCORE, .-. /TRANSFER ADDRESS LTEMP, .-. /TEMPORARY LTPAGCT,.-. /PAGE COUNTER LTRYCNT,.-. /RETRY COUNTER LTSAVIT,.-. /TEMPORARY PAGE END8K= 6000 /END OF FIELD ONE IN CASE HANDLER IS PRESENT INBUFFE=3600 /P?S/8 INPUT BUFFER INLEN= SBOOT-INBUFFER%200 /P?S/8 INPUT BUFFER PAGE SIZE L6DBUFF=. /LAP6-DIAL BUFFER L6DEND= FILBUFFER /END OF LAP6-DIAL INPUT BUFFER L6DFLD= 00 /BUFFER FIELD IN 4K L6DLENG=L6DEND-L6DBUFFER%400^2 /LAP6-DIAL INPUT BUFFER SIZE IN PAGES OUTBUFF=L6DBUFFER /LAP6-DIAL OUTPUT BUFFER OUTEND= INBUFFER /END OF LAP6-DIAL OUTPUT BUFFER OUTLENG=OUTEND-OUTBUFFER%400^2 /LAP6-DIAL OUTPUT BUFFER SIZE IN PAGES L8KLENG=END8K-L6DBUFFER%400^2 /LAP6-DIAL 8K BUFFER SIZE IN PAGES PEXLENG=SBOOT-FILBUFFER%200 /P?S/8 EXTENDED FILES BUFFER PAGE SIZE / REGULAR LINC-8 LINCTAPE HANDLER XLIST OFF IFNDEF OFF IFNDEF ON XLIST ON / P?S/8 NON-SYSTEM LINCTAPE HANDLER FOR THE REGULAR (UN-MODIFIED) LINC-8. / LAST EDIT: 17-APR-1986 10:00:00 CJL / MAY BE ASSEMBLED WITH '/J' SWITCH SET. / FEATURES: / 1) SUPPORT OF EIGHT UNITS (0-7). / 2) STORAGE OF LATEST BLOCK SEARCHED. / 3) CUSTOM OVERSHOOT FACTOR. / 4) CORRECT INITIAL SEARCH DIRECTION BY COMPARING THE DESIRED / BLOCK TO THE LATEST BLOCK SEARCHED, OFFSET BY THE CUSTOM / OVERSHOOT FACTOR. / 5) PARITY ERROR DETECTION. XLIST OFF IFNDEF BLKSIZE IFZERO BLKSIZE-200 < XLIST ON / 6) SUPPORTS 128 WORDS/BLOCK LINCTAPES. XLIST OFF > IFZERO BLKSIZE-400 < XLIST ON / 6) SUPPORTS 256 WORDS/BLOCK LINCTAPES AS A NON-STANDARD FEATURE / OF THIS HANDLER. XLIST OFF > XLIST ON / RESTRICTIONS: / 1) NO RETRIES ON ERROR. / 2) LATEST BLOCK SEARCHED IS IGNORANT OF CHANGE OF LOGICAL UNIT. PAGE /START ON A GOOD BOUNDARY HERE= . /WHERE WE ARE / DEFINITIONS. XLIST OFF IFZERO BLKSIZE-200 < XLIST ON BLKSIZE=0200 /128 WORDS/BLOCK XLIST OFF > IFZERO BLKSIZE-400 < XLIST ON BLKSIZE=0400 /256 WORDS/BLOCK XLIST OFF > XLIST ON IAAC= 6171 /READ LINC "A" REGISTER IACA= 6167 /LOAD LINC "A" REGISTER IACF= 6175 /LOAD LINC INDICATOR FLIP-FLOPS ICON= 6141 /LOAD INTERFACE CONTROL INTS= 6147 /READ INTERFACE STATUS IZSA= 6173 /LOAD LINC "Z" REGISTER INTO LINC "A" REGISTER LTLENGT=4000 /LINCTAPE BLOCK COUNT XLIST OFF IFNDEF L8TAPE XLIST ON NL0002= CLA CLL CML RTL /LOAD AC WITH 0002 NL7777= CLA CMA /LOAD AC WITH 7777 REVISIO="A&77 /REVISION OF HANDLER / DEVICE HANDLER HEADER BLOCK. XLIST OFF IFZERO BLKSIZE-200 < XLIST ON *"L&177;*"I&177;*"N&177 /GROUP NAME *-1 /GROUP COUNT *"L&177;*"I&177;*"N&177 /DEVICE NAME XLIST OFF > IFZERO BLKSIZE-400 < XLIST ON *"L&177;*"I&177;*"D&177 /GROUP NAME *-1 /GROUP COUNT *"L&177;*"I&177;*"D&177 /DEVICE NAME XLIST OFF > XLIST ON *L8TAPE&177 /ENTRY POINT *LTLENGTH-1 /LENGTH EXPRESSED AS HIGHEST BLOCK *REVISION /REVISION OF HANDLER *HERE /RESET ORIGIN L8TAPE, .-. /ENTRY POINT NL0002 /SET INSTRUCTION FIELD BIT RDF /GET CALLING FIELD TAD (CDF) /NOW HAVE CIF CDF RETURN FIELD INSTRUCTION DCA L8OUT /STORE IN-LINE TAD I L8TAPE /GET PARAMETER POINTER DCA L8WAIT /STASH IT TAD I L8WAIT /GET TRANSFER ADDRESS DCA L8BUFF /SAVE IT ISZ L8WAIT /BUMP TO NEXT TAD I L8WAIT /GET FUNCTION WORD RAL /MOVE UP XLIST OFF IFZERO BLKSIZE-400 < XLIST ON AND (-BLKSIZE) /JUST PAGE BITS XLIST OFF > IFZERO BLKSIZE-200 < XLIST ON AND L87600/(-BLKSIZE) /JUST PAGE BITS XLIST OFF > XLIST ON DCA L8PCNT /SAVE AS PAGE COUNT RAR /RECOVER READ/WRITE BIT TAD L83/(3) /ADD ON BLOCK MODE BITS DCA L8FUNCT /SAVE AS TAPE FUNCTION TAD I L8WAIT /GET FUNCTION WORD AGAIN AND L870/(70) /JUST FIELD BITS TAD (CDF) /TURN INTO TRANSFER CDF DCA L8TRFLD /SAVE IN-LINE TAD I L8WAIT /L RW P P P P P F F F U U U RAR /U L RW P P P P P F F F U U AND L83/(3) /U 0 0 0 0 0 0 0 0 0 0 U U IACF /LOAD UNIT FLIP-FLOPS ONLY! NL7777 CML RAR /1 UC 1 1 1 1 1 1 1 1 1 1 1 TAD L83/(3) /L U 0 0 0 0 0 0 0 0 0 1 0 DCA L8UNIT /SAVE UNIT AND SEARCH BITS ISZ L8WAIT /BUMP TO BLOCK ARGUMENT TAD L8BLOCK /GET CURRENT BLOCK CIA /INVERT TAD I L8WAIT /FORM DIFFERENCE WITH DESIRED TAD L8OVSHT /ADD ON OVERSHOOT FACTOR DCA L8DIR /SAVE AS INITIAL DIRECTION TAD I L8WAIT /GET BLOCK ARGUMENT DCA L8BLOCK /SET IT UP ISZ L8TAPE /BUMP TO ERROR RETURN L84002, IOF /PREVENT PROBLEMS! L8NEXT, ISZ L8BLOCK /BUMP UP FOR ONE'S COMPLEMENT L83, 3 /BLOCK 7777 WOULD SKIP! XLIST OFF IFZERO BLKSIZE-400 < XLIST ON TAD (-BLKSIZE) /SETUP XLIST OFF > IFZERO BLKSIZE-200 < XLIST ON TAD L87600/(-BLKSIZE) /SETUP XLIST OFF > XLIST ON DCA L8COUNT /PAGE WORD COUNT DCA L8CHKSM /CLEAR CHECKSUM TAD L8DIR /GET INITIAL DIRECTION RAL /INTO LINK L87600, CLA!400 /CLEAN UP DCA L8DIR /ALL OTHERS FORWARD TAD L8UNIT /D U 0 0 0 0 0 0 0 0 0 1 0 ICON /LOAD UNIT AND SEARCH CML RAR /0 DC U 0 0 0 0 0 0 0 0 0 1 L8SER1, ICON /LOAD NEW DIRECTION L8SER2, JMS L8WAIT /WAIT FOR A BLOCK MARK SMA /NEGATIVE BLOCK NUMBERS? CML /YES, REVERSE OUR INTENT TAD L8BLOCK /COMPARE TO DESIRED BLOCK SNA /SKIP IF NOT FOUND JMP L8COULD /JUMP IF POSSIBLE SZL /RIGHT DIRECTION ANYWAY? JMP L8SER2 /YES, JUST KEEP GOING SMA CLA /REVERSE? STL RAR /NO, FORWARD ICON /STOP THE TAPE IAC /NOW SET TO CHANGE DIRECTION JMP L8SER1 /TURN AROUND THERE L8COULD,SNL CLA /GOING FORWARD? JMP L8SER2 /NO, UNDERSHOOT AND TRY AGAIN TAD L8FUNCT /GET A 3 ICON /GOTO BLOCK MODE SPA /WRITING? TAD L84002/(4002) /YES ICON /REDUNDANT OR TURN WRITERS ON SZL CLA /READING? JMS L8WAIT /YES, WAIT FOR GUARD WORD L8TRFLD,.-. /WILL BE CDF TRANSFER FIELD L8TRLUP,TAD I L8BUFF /GET A WORD JMS L8WAIT /WAIT FOR IT DCA I L8BUFF /PUT A WORD TAD I L8BUFF /RETRIEVE WORD TAD L8CHKSM /UPDATE CHECKSUM DCA L8CHKSM /STORE IT BACK ISZ L8BUFF /BUMP TO NEXT WORD L870, 70 /JUST IN CASE ISZ L8COUNT /DONE WITH THIS BLOCK? JMP L8TRLUP /NO, KEEP GOING TAD L8CHKSM /GET CHECKSUM IN CASE WRITING CIA /INVERT IT JMS L8WAIT /WRITE IT OR READ IN NEW ONE TAD L8CHKSM /WRITE ERROR IMPOSSIBLE SZA CLA /SKIP IF NO READ PARITY ERROR JMP L8ERROR /BARF JMS L8WAIT /WAIT FOR LAST TO BE WRITTEN STL CLA /CLEAN UP TAD L8PCNT /GET PAGE COUNT XLIST OFF IFZERO BLKSIZE-400 < XLIST ON TAD (-BLKSIZE) /DECREMENT IT XLIST OFF > IFZERO BLKSIZE-200 < XLIST ON TAD L87600/(-BLKSIZE) /DECREMENT IT XLIST OFF > XLIST ON SNA /DONE? JMP L8DONE /YES, FINISH UP THERE DCA L8PCNT /NO, SAVE FOR NEXT TIME JMP L8NEXT /GO DO ANOTHER BLOCK L8DONE, ISZ L8TAPE /BUMP TO GOOD RETURN L8ERROR,ICON /STOP THE TAPE L8OUT, .-. /WILL BE CIF CDF RETURN FIELD JMP I L8TAPE /RETURN L8WAIT, .-. /WAIT ROUTINE IACA /LOAD A IN CASE WRITING CLA /CLEAN UP TAD L87/(7) /GET CLEAR BITS ICON /CLEAR TAPE FLAG CLA /CLEAN UP L87, INTS /GET STATUS SMA /SKIP IF TAPE FLAG UP JMP L87 /JUMP IF NOT STL RAR /SAVE DIRECTION, FORM FUNCTION MASK AND L8FUNCT /NOW HAVE READ/WRITE FUNCTION SPA CLA /READING? IZSA /NO, RESTORE A IAAC /GET A EITHER WAY JMP I L8WAIT /RETURN L8BLOCK,.-. /BLOCK TEMPORARY L8BUFF, .-. /BUFFER POINTER L8CHKSM,.-. /CHECKSUM TEMPORARY L8COUNT,.-. /PAGE WORD COUNT L8DIR, .-. /CURRENT DIRECTION L8FUNCT,.-. /FUNCTION TEMPORARY L8OVSHT,7771 /OVERSHOOT FACTOR L8PCNT, .-. /PAGE COUNT L8UNIT, .-. /UNIT AND SEARCH TEMPORARY PAGE / INITIALIZATION STARTS HERE. INITIAL,TAD I (SBTFUN) /GET BOOTSTRAP FUNCTION WORD AND [7] /JUST UNIT BITS TAD [DOLBLK] /ADD ON "$" BLOCK NUMBER DCA I (PFFDOLLAR) /STORE IN INITIALIZE CODE TAD I [SBOOT] /GET BOOTSTRAP INSTRUCTION TAD (-JMSSYSIO) /COMPARE TO POSSIBLE VALUE SNA CLA /SKIP IF DIFFERENT JMP CHKCOVERLAY /JUMP IF IT MATCHES ISZ CHKKRS /TURN "KRSIOT" ISZ CHKKRS /INTO "KRBIOT" DCA CHKKCC /DESTROY "KCCIOT" CHKCOVR,NL0002 /SETUP "C" BIT MASK AND I [SCRSIZE] /GET THE "C" BIT SNA CLA /SKIP IF CONSOLE OVERLAY PRESENT JMP ANNOUNCE /JUMP IF NOT 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 P7TSF /STORE OVER "TSFIOT" TAD P7JMP /GET "JMP P7AGN" DCA P7TLS /STORE OVER "TLSIOT" TAD (JMS OUTCON) /GET OUTPUT CALL INSTRUCTION DCA P7JMP /STORE OVER "JMP P7AGN" TAD P7TSF /GET "CIF MCS+10" AGAIN DCA CHKKSF /STORE OVER "KSFIOT" TAD CHKJMP /GET "JMP I CTLCTST" DCA CHKKRS /STORE OVER "KRSIOT" (OR "KRBIOT") TAD (JMS INCON) /GET INPUT CALL INSTRUCTION DCA CHKJMP /STORE OVER "JMP I CTLCTST" DCA CHKKCC /DESTROY "KCCIOT" ANNOUNC,JMS I [SCRIBE] /TELL THEM ANNMSG /WE HAVE ARRIVED TAD I FILPTR /GET FIRST FILE ARGUMENT SNA CLA /SKIP IF SOMETHING THERE JMP I (NOFILES) /ELSE COMPLAIN TAD I (SPARM) /GET EQUALS PARAMETER CMA /INVERT IT SNA /SKIP IF SOMETHING WAS PASSED TAD (-370-1) /EKSE MAKE IT DEFAULT TO WORKING AREA CMA /INVERT BACK DCA I (L6DBLOCK) /STASH IT TAD I (L6DBLOCK) /GET IT BACK DCA I (OUTBLK) /STORE IN OUTPUT ROUTINE ALSO TAD I (SWY9) /GET /Y-/9 SWITCHES RAL /DO INITIAL SHIFT CHKLUP, RAL /MOVE UP SPA /THIS SWITCH SET? JMP CHKEND /YES ISZ UNITCNT /NO, TOO MANY TIMES? JMP CHKLUP /KEEP GOING CHKEND, CLA /CLEAN UP TAD UNITCNT /GET COUNTER SNA /SKIP IF SOME LEFT NL7777 /ELSE SET SEVEN VALUE TAD (10) /ADJUST TO UNIT DCA L6DUNIT /STASH IT TAD I [SWMX] /GET /M-/X SWITCHES AND [400] /JUST /F BIT SNA CLA /SKIP IF SET JMP .+3 /JUMP IF NOT TAD (NOWINDOW&177+JMPC) /GET "JMP NOWINDOW" INSTRUCTION DCA I (L6DZAP) /PREVENT CHECK FOR SEQUENCE TAD I [SCRSIZE] /GET SOFTWARE CORE SIZE WORD AND (70) /JUST LCS BITS SNA CLA /SKIP IF SOMETHING THERE JMP FOURCHK /JUMP IF APPARENTLY ONLY 4K GOT8K, TAD I XROUT /GET A REPLACEMENT ADDRESS SNA /END OF LIST? JMP OUTCHK /YES, WE'RE DONE DCA UNITCNT /NO, STASH THE POINTER TAD I XROUT /GET ZAP VALUE DCA I UNITCNT /ZAP IT IN JMP GOT8K /KEEP GOING FOURCHK,TAD I (SWAL) /GET /A-/L SWITCHES AND (1000) /JUST /C BIT SNA CLA /SKIP IF SET JMP OUTCHK /ELSE FORGET IT TAD I [SCRSIZE] /GET CORE SIZE WORD AND (700) /JUST MCS BITS SZA CLA /SKIP IF NOT SET JMP GOT8K /THEY HAD IT ALL ALONG NL0002 /SET "C" BIT MASK AND I [SCRSIZE] /GET THE BIT SZA CLA /SKIP IF OFF JMP OUTCHK /FORGET IT, THE OVERLAY IS THERE TAD I [SCRSIZE] /GET THE CORE SIZE WORD AGAIN AND (7000) /JUST PCS BITS SZA CLA /SKIP IF NO EXTRA MEMORY JMP GOT8K /ELSE LET THEM USE SOME OF FIELD ONE OUTCHK, JMS I (LINCHK) /CHECK FOR PROPER LINCTAPE CONFIGURATION JMP I (OUTMORE) /CONTINUE THERE UNITCNT,-10 /UNIT SWITCH COUNTER PAGE OUTMORE,TAD I (SOUTFLS) /GET OUTPUT FILE COUNT SNA /SKIP IF ANY OUTPUT FILES JMP OUTL6D /JUMP IF NONE TAD FILPTR /POINT TO FILE LIST DELIMITER SNA /SKIP IF NOT ALL OUTPUT FILES JMP OUTPQS8 /JUMP IF ALL OUTPUT FILES DCA LINCHK /STASH THE POINTER TAD I LINCHK /GET SUPPOSED DELIMITER SNA CLA /SKIP IF NOT SO JMP OUTPQS8 /JUMP IF NO INPUT FILES JMS I [SCRIBE] /TELL THEM MFLMSG /OF MIXED FILES JMP I [CREPORT] /GOODBYE! NOFILES,JMS I [SCRIBE] /TELL THEM NFLMSG /THEY GOOFED JMP I [CREPORT] /GOODBYE! OUTL6D, JMS I [SCRIBE] /TELL THEM P2OMSG /OUR DIRECTION JMP I (L6DOUT) /CONTINUE THERE OUTPQS8,JMS I [SCRIBE] /TELL THEM O2PMSG /OUR DIRECTION TAD I (SWAL) /GET /A-/L SWITCHES AND [200] /JUST /E BIT SNA CLA /SKIP IF SET JMP FFLOUT /JUMP IF NOT JMS I [SCRIBE] /TELL THEM ABOUT EFLMSG /EXTENDED FILES NL7777 /-1 TAD I (SOUTFLS) /ONE OUTPUT FILE? SNA CLA /SKIP IF MORE JMP .+3 /JUMP IF EXACTLY ONE TAD ("S&177+40) /GET LOWER-CASE "S" JMS P7CH /PRINT IT JMS I [SCRIBE] /PRINT OUT FNIMSG /FINISHING MESSAGE TAD (PEXINITIALIZE) /CHANGE THE DCA PINIT /INITIALIZE POINTER TAD (PEXOUT) /CHANGE THE DCA POUT /OUTPUT POINTER TAD (PEXFFCHECK) /CHANGE THE DCA I (EFFCHK) / CHECK FOR POINTER JMP I (L6DIN) /CONTINUE THERE FFLOUT, JMS I [SCRIBE] /JUST DO CRLF /, JMP I (L6DIN) /CONTINUE THERE LINCHK, .-. /LINCTAPE CHECK ROUTINE LINC /GOTO L...MODE COM /TRY TO COMPLEMENT THE AC PDP /BACK TO GOODY MODE IAC /DID WE COMPLEMENT? SNA CLA /SKIP IF NOT JMP I LINCHK /RETURN, WE'RE A -12 NL7777 /SET SOME BITS IACA /LOAD "A" REGISTER LINCNT, CLA!400 /CLEAN UP IAAC /READ THEM BACK IAC /INCREMENT SZA CLA /SKIP IF WE'RE A LINC-8 JMP NOHARDWARE /ELSE BARF L8MOVE, TAD I L8PTR /GET A WORD DCA I L12PTR /PUT A WORD ISZ L8PTR /BUMP TO NEXT ISZ L12PTR /LIKEWISE ISZ LINCNT /DONE YET? JMP L8MOVE /NO, GO BACK JMP I LINCHK /YES, RETURN NOHARDW,JMS I [SCRIBE] /TELL THEM NOLMSG /THEY LOSE JMP I [CREPORT] /FINISH IT THERE L8PTR, L8TAPE&7600 /WHERE LINC-8 LINCTAPE ROUTINE IS L12PTR, LINCTAPE&7600 /WHERE PDP-12 LINCTAPE ROUTINE IS IFNZRO LINCTAPE-L8TAPE&177 PAGE / ONCE-ONLY TEXT MESSAGES. ANNMSG, TEXT " %^L6DCON " /ANNOUNCEMENT MESSAGE VERSION%12+2660 /V VERSION%12^66+VERSION+"0^100+"^-300 / REVISION^100+"^-300 / CRLF, TEXT "%" EFLMSG, TEXT " ^[E^XTENDED ^F^ILE" FNIMSG, TEXT "^]%" MFLMSG, TEXT "%^C^ANNOT ^P^ROCESS ^M^IXED ^I^NPUT AND ^O^UTPUT ^F^ILES!%^" NFLMSG, TEXT "%^N^O ^P?S/8 F^ILES ^G^IVEN!%" NOLMSG, TEXT "%^N^O ^L^INCTAPE ^H^ARDWARE!%" O2PMSG, TEXT "%^LAP6-DIAL => P?S/8^" P2OMSG, TEXT "%^P?S/8 => LAP6-DIAL%" / 8K REPLACEMENT LIST. LIST8K, L6DWCNT; L8KLENGTH^200^7777 /ENLARGE WORD COUNT L6DLENGTH; L8KLENGTH%2 /ENLARGE BLOCK UPDATE L6DFIELD; 10 /LAP6-DIAL BUFFER IS IN FIELD ONE L6DRFUNCTION; L8KLENGTH^100 /READ FUNCTION ENLARGED L6DWFUNCTION; L8KLENGTH^100+WRITE /WRITE FUNCTION ENLARGED OUTWCNT; L8KLENGTH^200^7777 /ENLARGE WORD COUNT OUTBLENGTH; L8KLENGTH%2 /ENLARGE BLOCK UPDATE OUTCDF; CDF 10 /LAP6-DIAL OUTPUT INTO FIELD ONE OUTCNT; L8KLENGTH^200^7777 /ENLARGE CHARACTER COUNTER PUTLUP; CDF 10 /EACH CHARACTER TAKEN FROM FIELD ONE PUTCD2; CDF 10 /EACH CHARACTER TAKEN FROM FIELD ONE 0 /THIS ENDS THE LIST FIELD 0 /HERE COME THE LITERALS! $ /THAT'S ALL FOLK!