/ OS/8 <- -> P?S/8 CONVERT PROGRAM / OS/8 TO P?S/8 OR P?S/8 TO OS/8 ASCII FILE CONVERSION PROGRAM. / LAST EDIT: 15-APR-1986 11:00:00 CJL / MUST BE ASSEMBLED WITH '/J' SWITCH SET. / P?S/8 UTILITY TO CONVERT ASCII FILES BETWEEN OS/8 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 SEVEN-BIT ASCII FILE IN OS/8 / FORMAT IN A MANNER COMPATIBLE WITH OS/8 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 OS/8 INPUT TO P?S/8 OUTPUT FILES: / .R OS8CON [LIST OF P?S/8 OUTPUT FILES] < (OPTION SWITCHES) / OR / .R OS8CON > [LIST OF P?S/8 OUTPUT FILES] (OPTION SWITCHES) / CONVERSION OF P?S/8 INPUT FILES TO A SINGLE OS/8 OUTPUT FILE: / .R OS8CON [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. OS8CON CANNOT BE USED WITHOUT PASSED P?S/8 FILES. / PROGRAM OPTIONS. / /C ATTEMPT TO USE MORE MEMORY THAN CURRENT LOGICAL / CORE SIZE INDICATES. OS/8 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! / /F DELETE SPECIAL FORM-FEED PROCESSING. THIS CAUSES / OS/8 CHARACTERS TO BECOME P?S/8 SEQUENCES. / P?S/8 EJECT SEQUENCES ARE PASSED LITERALLY / INSTEAD OF CONVERSION TO OS/8 CHARACTERS. / /L OUTPUT TO OS/8 FILES WHEN PROCESSING P?S/8 / PRECEDED BY . DEFAULT IS TO OUTPUT / AND . / /P PACK P?S/8 LINE NUMBER FILES. OS/8 CHARACTER / HANDLING WILL NOT CHECK FOR EXTRA ROOM IN THE FILE. / THIS OPTION IS IGNORED IF /E OR /F IS INVOKED AS / /E USES EXTENDED FILES AND /F DELETES SPECIAL / PROCESSING. / /0-/7 LOGICAL UNIT FOR OS/8 INPUT/OUTPUT (DEFAULT IS /7). / =NNNN STARTING OS/8 RECORD (DEFAULT IS 0007). / DEFAULT OPTIONS. / OS/8 INPUT/OUTPUT ASSUMES OS/8 RECORD 0007 (P?S/8 BLOCK 0016) ON THE OS/8 / DEVICE DEFINED BY THE PREVAILING LOGICAL P?S/8 UNIT TO BE USED FOR OS/8 / INPUT/OUTPUT. THE DEFAULT LOGICAL UNIT IS SEVEN. EITHER OS/8 RECORD OR UNIT / CAN BE MODIFIED WITH THE APPROPRIATE EQUALS PARAMETER (FOR RECORD) OR /0 / THROUGH /7 (FOR LOGICAL UNIT). / THE OS/8 DEVICE MUST BE LAID OUT IN A MANNER COMPATIBLE WITH P?S/8 BLOCK / CONVENTIONS. ALTHOUGH THIS IS USUALLY THE CASE, CONSULT DEVICE HANDLER / DOCUMENTATION TO BE SURE. / OS/8 OUTPUT FILE CONSIDERATIONS. / IT IS RECOMMENDED THAT THE OS/8 OUTPUT FILE BE APPLIED TO AN EMPTY DEVICE / (IN THE OS/8 SENSE, THE DEVICE CAN BE ZEROED OUT AND THEN A SINGLE FILE CAN / BE TRANSFERRED TO IT VIA THIS UTILITY) TO MAKE THE PROCESS OF CONVERSION / EASIER. / **** NOTE **** THIS PROGRAM DOES NOT RECOGNIZE OS/8 DIRECTORY CONSIDERATIONS, / IT CAN ONLY WRITE THE ACTUAL FILE AS OS/8 WOULD REQUIRE IT ASSUMING THE / BLOCK LAYOUT SCHEME IS COMPATIBLE WITH P?S/8 ON THE LOGICAL OUTPUT UNIT. / THIS UTILITY IS IGNORANT OF OS/8 LENGTH RESTRICTIONS AND COULD ATTEMPT TO / ACCESS NON-EXISTANT RECORDS OR OVERWRITE RECORDS HIGHER UP ON THE OS/8 DEVICE / ORDINARILY BELONGING TO OTHER OS/8 FILES. / BY USING THE DEFAULT OPTIONS, AN OS/8 FILE WILL BE PLACED WHERE IT WOULD / BE PLACED BY OS/8 ITSELF JUST AFTER ZEROING THE DIRECTORY. THIS ALLOWS THE / FOLLOWING METHOD TO WORK: / (FROM P?S/8) / .R OS8CON,PQSFIL/1=7 CONVERT PQSFIL TO OS/8 FORMAT ON UNIT 0001 / AT RECORD 0007. / (BOOTSTRAPPING TO OS/8) / ASSUMING AN OS/8 SYSTEM WITH NON-SYSTEM DECTAPE: / .R PIP INVOKE OS/8 PERIPHERAL UTILITY. / *DTA1: PRECEDED BY OR OR AT / BEGINNING OF P?S/8 OUTPUT FILE EJECT / NOT PRECEDED BY OR EJECT / NOT FOLLOWED BY / , / NOT PRECEDED BY / P?S/8 TO OS/8 CONVERSION (ASSUMING /L IS INVOKED). / P?S/8 OS/8 / NOT PRECEDED BY , / IMMEDIATELY FOLLOWING / EJECT / ALL LOWER-CASE OS/8 INPUT CHARACTERS WILL BE FOLDED TO THE CORRESPONDING / UPPER-CASE P?S/8 OUTPUT CHARACTERS. / ALL CONTROL CHARACTERS OTHER THAN , , , ARE IGNORED. / ALL CHARACTERS WILL BE IGNORED. / 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, OS/8 INPUT TRUNCATED! / THE P?S/8 OUTPUT FILES' CAPABILITY WAS EXHAUSTED WITH FURTHER OS/8 / INPUT PRESENT. THE LAST P?S/8 FILE IS PROPERLY CLOSED AND 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. / OS/8 => P?S/8 / CONVERSION IS FROM OS/8 TO P?S/8 LINE NUMBER FILES. P?S/8 OUTPUT / FILES WERE PASSED WITHOUT /E AND ARE CREATED FROM OS/8 INPUT. / OS/8 => P?S/8 [EXTENDED FILES] / CONVERSION IS FROM OS/8 TO P?S/8 EXTENDED FILES. P?S/8 OUTPUT FILES / WERE PASSED WITH /E INVOKED AND ARE CREATED FROM OS/8 INPUT. / P?S/8 => OS/8 / CONVERSION IS FROM P?S/8 INPUT FILES TO A SINGLE OS/8 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 OS/8. 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. 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 NL2000= CLA CLL CML RTR /LOAD AC WITH 2000 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="B&77 /REVISION OF OS8CON TLSIOT= TTY+1^10+6006 /OUTPUT TO TELEPRINTER TSFIOT= TTY+1^10+6001 /SKIP ON TELEPRINTER FLAG VERSION=12 /VERSION OF OS8CON *0 /START AT THE BEGINNING CHAR, .-. /LATEST P?S/8 CHARACTER FOR OS/8 OUTPUT FILPTR, SFILES /FILE POINTER OS8UNIT,.-. /OS/8 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 OS8FIEL,OS8FLD /**** 8K **** 0010 PFFLATE,.-. /LATEST CHARACTER INSERTED INTO FIXED FILE PFFPREV,.-. /PREVIOUS CHARACTER INSERTED INTO FIXED FILE *20 /GET PAST AUTO-INDEX AREA FFPROTE,700 / PROTECTION COUNT GCPTR, INBUFFER /P?S/8 INPUT BUFFER POINTER INCHAR, .-. /LATEST KEYBOARD INPUT CHARACTER OS8WFUN,OUTLENGTH^100+WRITE /**** 8K **** O8KLENGTH^100+WRITE OUTBCNT,OUTLENGTH^300^7777 /**** 8K **** O8KLENGTH^300^7777 OUTBLEN,OUTLENGTH /**** 8K **** O8KLENGTH OUTCNT, OUTLENGTH^300^7777 /**** 8K **** O8KLENGTH^300^7777 OUTPTR, OUTBUFFER /OS/8 OUTPUT BUFFER POINTER PREVCHA,"J&77!200 /PREVIOUS OS/8 OUTPUT CHARACTER PASSED P7TEMP, .-. /TERMINAL OUTPUT TEMPORARY TEMPTR, .-. /TEMPORARY OUTPUT POINTER TESTCT, .-. /STRING TEST COUNTER / P?S/8 INPUT WINDOW AREA. WINDOW, ZBLOCK 10 /SEARCH WINDOW HERE ELEMENT,.-. /LATEST CHARACTER TO SHIFT INTO THE WINDOW / TEST STRING. TSTRING,11 / "E&177 /E "J&177 /J "E&177 /E "C&177 /C "T&177 /T L15, "M&77 / L12, "J&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 / OS/8 <- -> P?S/8 CONVERSION UTILITY STARTS HERE. OS8CON= . /PROGRAM STARTS HERE IFNZRO .&177 OS8CON, 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 OS8CON /STASH IT ISZ SCRIBE /BUMP PAST ARGUMENT TAD (140) /INITIALIZE TO DCA SCRCASE /LOWER-CASE OUTPUT SCRLUP, TAD I OS8CON /GET LEFT HALF-WORD RTR;RTR;RTR /MOVE OVER JMS SCRPRNT /PRINT IT TAD I OS8CON /GET RIGHT HALF-WORD JMS SCRPRNT /PRINT IT ISZ OS8CON /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 L15/["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 "OS8IN" 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 OS8IN, 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, ^OS/8 I^NPUT ^T^RUNCATED!%^" PAGE / OS/8 SEVEN-BIT INPUT ROUTINE. NEWBUFF,JMS CHKUP /CHECK FOR <^C>, ETC. TAD OS8RFUN /GET READ FUNCTION TAD OS8FIELD /ADD ON FIELD BITS TAD OS8UNIT /ADD ON UNIT BITS DCA OS8FUN /STORE IN-LINE JMS I PSYSIO/[SYSIO] /CALL I/O ROUTINES OS8CORE,OS8BUFFER /BUFFER ADDRESS OS8FUN, OS8LEN^100+OS8FLD+.-. /UNIT BITS WILL BE FILLED IN OS8RECO,.-. /BLOCK NUMBER WILL BE FILLED IN TAD OS8BCNT /SETUP THE DOUBLE-WORD DCA BUFCNT /(TRIPLE-BYTE) COUNT TAD OS8CORE/(OS8BUFFER) /SETUP THE DCA BUFPTR /BUFFER POINTER PUTUM, DCA CHAR /CLEAR THIRD BYTE NOW JMS PUT1 /GET AND OUTPUT FIRST BYTE JMS PUT1 /GET AND OUTPUT SECOND BYTE TAD CHAR /GET THIRD BYTE JMS PUTC /OUTPUT IT ISZ BUFCNT /DONE ALL WORD PAIRS? JMP PUTUM /NO, KEEP GOING TAD OS8RECORD /GET CURRENT RECORD TAD OS8BLENGTH /UPDATE TO NEXT BUFFER DCA OS8RECORD /STORE BACK JMP NEWBUFFER /KEEP GOING PUT1, .-. /ONE BYTE OUTPUT ROUTINE PUTCDF, NOP /**** 8K **** CDF 10 TAD I BUFPTR /GET FIRST WORD AND [7400] /JUST THIRD-BYTE NYBBLE CLL RAL /MOVE UP TAD CHAR /GET OLD NYBBLE (IF ANY) RTL;RTL /MOVE UP NYBBLE BITS DCA CHAR /SAVE FOR NEXT TIME TAD I BUFPTR /GET IT AGAIN JMS PUTC /OUTPUT CURRENT BYTE ISZ BUFPTR /BUMP TO NEXT WORD JMP I PUT1 /RETURN / OS/8 TO P?S/8 CHARACTER OUTPUT ROUTINE. PUTC, .-. /OS/8 => P?S/8 ROUTINE CDF 00 /BACK TO FIELD ZERO AND [177] /JUST SEVEN-BIT DCA OS8LATEST /SAVE AS LATEST CHARACTER TAD OS8LATEST /GET IT BACK TAD (-177) /COMPARE TO SNA /SKIP IF OTHER JMP IGNORE /IGNORE TOTALLY TAD [-140+177] /COMPARE TO LOWER-CASE LIMIT SPA /SKIP IF LOWER-CASE TAD [40] /ELSE RESTORE UPPER-CASE SNA / OR ? JMP PUTOSS /YES, DON'T PUT IN OUTPUT FILE TAD (-"Z!300+100) /COMPARE TO <^Z> SNA /SKIP IF OTHER JMP OS8EOF /JUMP IF CHARACTER TAD (-"I+"Z) /COMPARE TO SNA /SKIP IF OTHER TAD (37-"I+2400) /ADD ON KLUDGE TAD (-"M+"I) /COMPARE TO SNA /SKIP IF OTHER JMP DOCR /JUMP IF IAC /TAD (-"L+"M)/COMPARE TO SNA /SKIP IF OTHER JMP DOFF /JUMP IF TAD [-"J+"L] /COMPARE TO SNA /SKIP IF OTHER JMP DOLF /JUMP IF TAD (-137+"J-300) /COMPARE TO SNA /SKIP IF OTHER JMP PUTOSS /DON'T PUT IN OUTPUT FILE TAD [-40+137] /COMPARE TO REMAINING CONTROL CHARACTERS SPA /SKIP IF OTHERWISE JMP IGNORE /TOTALLY IGNORE OTHER CONTROL CHARACTERS TAD [40] /RESTORE THE CHARACTER AND [77] /JUST SIX-BIT DOCR, JMS I (P6CH) /OUTPUT THE CHARACTER PUTOSS, TAD OS8LATEST /GET LATEST CHARACTER DCA OS8PREVIOUS /SAVE AS PREVIOUS CHARACTER FOR NEXT TIME IGNORE, CLA /CLEAN UP JMP I PUTC /RETURN / IF AFTER , IGNORE IT; ELSE OUTPUT . DOLF, TAD OS8PREVIOUS /GET PREVIOUS CHARACTER TAD (-"M!300) /COMPARE TO SZA CLA /SKIP IF IT MATCHES JMS I (P6CH) /ELSE OUTPUT JMP PUTOSS /CONTINUE THERE / <^Z> () COMES HERE. OS8EOF, NL4000 /SET VALUE JMS I POUT /CLOSE THE LAST FILE JMP I [CREPORT] /FINISH IT THERE / COMES HERE. DOFF, TAD I [SWAL] /GET /A-/L SWITCHES AND [100] /JUST /F BIT SZA CLA /SKIP IF OFF JMP DOCR /JUMP IF ON TAD OS8PREVIOUS /GET PREVIOUS CHARACTER TAD (-"M!300) /WAS IT ? SZA /SKIP IF SO TAD (-"J+"M) /ELSE WAS IT ? SZA CLA /SKIP IF EITHER JMS I (P6CH) /ELSE OUTPUT FIRST 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 .+3 /FORGET IT, JUST KEEP GOING NL4000 /SET VALUE JMS I (P6CH) /CLOSE THIS FILE, OPEN ANOTHER ONE NL7776 /TAD ("J-"L) /GET VALUE JMP PUTOSS /CONTINUE THERE BUFCNT, .-. /BUFFER DOUBLE-WORD COUNTER BUFPTR, .-. /BUFFER POINTER EFFCHK, FFCHK /**** /E **** PEXFFCHECK OS8BCNT,OS8LENGTH^100^7777 /**** 8K **** O8KLENGTH^100^7777 OS8BLEN,OS8LENGTH /**** 8K **** O8KLENGTH OS8LATE,.-. /LATEST OS/8 OUTPUT CHARACTER OS8PREV,"J&77 /PREVIOUS OS/8 OUTPUT CHARACTER OS8RFUN,OS8LENGTH^100 /**** 8K **** O8KLENGTH^100 PAGE / P?S/8 TO OS/8 CHARACTER OUTPUT ROUTINE. OS8OUT, 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 TAD (-"Z!100) /IS IT <^Z>? SZA CLA /SKIP IF SO 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 [7600] /JUST PAGE BITS STL RAR /MOVE DOWN AND SET WRITE BIT TAD [100] /ADD ONE PAGE TO CALL JMP OS8CLOSE /CONTINUE THERE PUTRETU,ISZ OUTCNT /DONE WITH THIS BUFFER? JMP OS8OUT /NO, KEEP GOING TAD OUTBCNT /YES, RESET THE DCA OUTCNT /CHARACTER COUNT TAD OUTADR/(OUTBUFFER) /RESET THE DCA OUTPTR /OUTPUT POINTER TAD OS8WFUN /GET WRITE FUNCTION OS8CLOS,TAD OS8FIELD /ADD ON FIELD BITS TAD OS8UNIT /ADD ON UNIT BITS DCA OUTFUN /STORE IN-LINE JMS CHKUP /CHECK FOR <^C>, ETC. JMS I PSYSIO/[SYSIO] /CALL I/O ROUTINES OUTADR, OUTBUFFER /BUFFER ADDRESS OUTFUN, OUTLENGTH^100+WRITE+OS8FLD+.-. /UNIT BITS WILL BE FILLED IN OUTBLK, .-. /BLOCK NUMBER TAD OUTBLK /GET OUTPUT BLOCK TAD OUTBLENGTH /UPDATE IT DCA OUTBLK /STORE BACK OUTZAP, JMP OS8OUT /**** <^Z> **** 0000 ISZ FILCNT /BUMP OUTPUT FILE COUNT JMP I [CREPORT] /FINISH IT THERE PUTLOOP,JMS PUTNEXT /GET NEXT CHARACTER PUTONE, 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 DCA I OUTPTR /STORE THE SECOND ONE JMS PUTNEXT /GET NEXT CHARACTER RTL;RTL /MOVE UP AND [7400] /JUST FIRST NYBBLE TAD I TEMPTR /ADD ON FIRST CHARACTER DCA I TEMPTR /STORE BACK TAD CHAR /GET LATEST RTR;RTR;RAR /MOVE UP AND [7400] /JUST SECOND NYBBLE TAD I OUTPTR /ADD ON SECOND CHARACTER DCA I OUTPTR /STORE BACK ISZ OUTPTR /BUMP TO NEXT PAIR JMP PUTLOOP /KEEP GOING / P?S/8 FIXED FILE ON 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 TAD ("I&77-37-100) /ELSE MAKE IT <^I> SPA /IS IT ALPHA? TAD [100] /YES, MAKE IT SEVEN-BIT TAD [37] /RESTORE THE CHARACTER GCTEST, DCA ELEMENT /**** /F **** JMP SETPARITY 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 ("L&77) /GET A JMP SETPARITY /CONTINUE THERE NOTFF, TAD WINDOW /GET HEAD OF WINDOW SNA /SKIP IF SOMETHING THERE JMP I GCTRIM /ELSE GO GET ANOTHER ONE SETPARI,TAD [200] /ADD ON MARK STATE PARITY BIT FOR OS/8 DCA CHAR /SAVE IT TAD CHAR /GET THE CHARACTER TAD (-"M!100) /COMPARE TO SZA CLA /SKIP IF IT MATCHES JMP NRMCHARACTER /JUMP IF NOT NL0001 /SET /L MASK AND I [SWAL] /GET /L BIT SNA CLA /SKIP IF SET JMP NRMCHARACTER /JUMP IF NOT TAD PREVCHARACTER /GET THE PREVIOUS CHARACTER TAD (-"J!100) /WAS IT ? SNA CLA /SKIP IF NOT JMP I GCTRIM /THROW AWAY NRMCHAR,TAD CHAR /GET LATEST CHARACTER DCA PREVCHARACTER /SAVE AS PREVIOUS CHARACTER FOR NEXT TIME TAD CHAR /GET THE CHARACTER AGAIN JMP I GETCHR /RETURN TO CALLER GCEOL, TAD (GCLF) /MAKE IT COME BACK DCA GCTRIM /FOR NEXT TIME TAD L15/["M&77] /GET A JMP GCTEST /CONTINUE THERE GCLF, TAD (GETLEFT) /SETUP THE CO-ROUTINE DCA GCTRIM /FOR NEXT CALLER TAD L12/["J&77] /GET A JMP GCTEST /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 / COMES HERE WHEN LAST FILE IS EXHAUSTED. GCEOT, NL7777 /BACKUP THE FILE POINTER TAD FILPTR /SO FURTHER ATTEMPTS DCA FILPTR /YIELD AGAIN TAD ("Z&77) /GET <^Z> JMP GCTEST /CONTINUE 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 [-10] /SETUP THE DCA TESTCT /STRING COUNTER TAD (WINDOW-1) /SETUP THE DCA XROUT /WINDOW POINTER JMP I TSETUP /RETURN 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 (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 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 OS8BUFF=. /OS/8 INPUT BUFFER OS8END= FILBUFFER /END OF OS/8 INPUT BUFFER OS8FLD= 00 /BUFFER FIELD IN 4K OS8LENG=OS8END-OS8BUFFER%200 /OS/8 INPUT BUFFER SIZE IN PAGES OUTBUFF=OS8BUFFER /OS/8 OUTPUT BUFFER OUTEND= INBUFFER /END OF OS/8 OUTPUT BUFFER OUTLENG=OUTEND-OUTBUFFER%200 /OS/8 OUTPUT BUFFER SIZE IN PAGES O8KLENG=END8K-OS8BUFFER%200 /OS/8 8K BUFFER SIZE IN PAGES PEXLENG=SBOOT-FILBUFFER%200 /P?S/8 EXTENDED FILES BUFFER PAGE SIZE / 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 [-7-1] /ELSE MAKE IT DEFAULT TO SEVEN CLL CMA RAL /INVERT AND DOUBLE TO OUR BLOCK (THEIR RECORD) DCA I (OS8RECORD) /STASH IT TAD I (OS8RECORD) /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 OS8UNIT /STASH IT TAD I [SWAL] /GET /A-/L SWITCHES AND [100] /JUST /F BIT SNA CLA /SKIP IF SET JMP .+3 /JUMP IF NOT TAD (SETPARITY&177+JMPC) /GET "JMP SETPARITY" INSTRUCTION DCA I (GCTEST) /PREVENT HANDLING THERE 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, TAD I (SOUTFLS) /GET OUTPUT FILE COUNT SNA /SKIP IF ANY OUTPUT FILES JMP I (OUTOS8) /JUMP IF NONE TAD FILPTR /POINT TO FILE LIST DELIMITER SNA /SKIP IF NOT ALL OUTPUT FILES JMP I (OUTPQS8) /JUMP IF ALL OUTPUT FILES DCA UNITCNT /STASH THE POINTER TAD I UNITCNT /GET SUPPOSED DELIMITER SNA CLA /SKIP IF NOT SO JMP I (OUTPQS8) /JUMP IF NO INPUT FILES JMS I [SCRIBE] /TELL THEM MFLMSG /OF MIXED FILES JMP I [CREPORT] /GOODBYE! UNITCNT,-10 /UNIT SWITCH COUNTER PAGE NOFILES,JMS I [SCRIBE] /TELL THEM NFLMSG /THEY GOOFED JMP I [CREPORT] /GOODBYE! OUTOS8, JMS I [SCRIBE] /TELL THEM P2OMSG /OUR DIRECTION JMP I (OS8OUT) /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 (OS8IN) /CONTINUE THERE FFLOUT, JMS I [SCRIBE] /JUST DO CRLF /, JMP I (OS8IN) /CONTINUE THERE / ONCE-ONLY TEXT MESSAGES. ANNMSG, TEXT " %^OS8CON " /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!%" O2PMSG, TEXT "%^OS/8 => P?S/8" P2OMSG, TEXT "%^P?S/8 => OS/8%^" PAGE / 8K REPLACEMENT LIST. LIST8K, OS8BCNT; O8KLENGTH^100^7777 /ENLARGE DOUBLE-WORD COUNT OS8BLENGTH; O8KLENGTH /ENLARGE BLOCK UPDATE OS8FIELD; 10 /OS/8 BUFFER IS IN FIELD ONE OS8RFUNCTION; O8KLENGTH^100 /READ FUNCTION ENLARGED OS8WFUNCTION; O8KLENGTH^100+WRITE /WRITE FUNCTION ENLARGED OUTBCNT; O8KLENGTH^300^7777 /ENLARGE CHARACTER COUNT OUTBLENGTH; O8KLENGTH /ENLARGE BLOCK UPDATE OUTCDF; CDF 10 /OS/8 OUTPUT INTO FIELD ONE OUTCNT; O8KLENGTH^300^7777 /ENLARGE CHARACTER COUNTER PUTCDF; CDF 10 /EACH BYTE TAKEN FROM FIELD ONE 0 /THIS ENDS THE LIST FIELD 0 /HERE COME THE LITERALS! $ /THAT'S ALL FOLK!