.TITLE EDITVP - V9 UOW /* /* 12 DEC 72 - CHANGE PACK & UNPACK TO FASTER ROUTINES /* 19 AUG 71 - PAUL HENDERSON: CONVERT TO B/F AT UOW /* /EDITVP -- 9-11-70 EDIT-8 /COPYRIGHT 1970, DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. /PDP-9/15 TEXT EDITOR, VERSION 9A. /// /// VP STORAGE SCOPE VERSION /// /ASSEMBLY PARAMETER ASSIGNMENTS: /* /* THE ONLY PARAMETERS OF SIGNIFICANCE ARE BF, SINCE THIS VERSION /* HAS ALL PDP-9 CONDITIONALS EDITED OUT /* / I. PDP-9/15 BULK STORAGE SYSTEMS -- / A. PDP9=1 FOR PDP-9 VERSION. / NO OTHER PARAMETER ASSIGNMENTS ARE ALLOWED. / II. PAPER TAPE SYSTEMS / A. PTP=1. / B. PDP9=1 FOR PDP-9 VERSION. / NO OTHER PARAMETER ASSIGNMENTS ARE ALLOWED. /* III. BACKGROUND/FOREGROUND SYSTEMS /* THE SYMBOL BF MUST BE DEFINED /// .ABS /// ORIGIN-SETTING STATEMENTS WERE DELETED TO MAKE THIS DISPLAY /// EDITOR RELOCATABLE AND LINK-LOADABLE. THE '.IODEV' STATEMENT WAS /// INSERTED, ADDING .DAT SLOT 10 FOR THE DISPLAY. /// .LOC BANK*20000+EDSTRT /* .IFUND PDP9 /* .EBREL /* .ENDC /* .IFUND .DAT /* .IFUND PTP /* .IFUND PDP9 .DAT=141 /* .ENDC /* .IFDEF PDP9 /*.DAT=135 /* .ENDC /* .ENDC /* .IFDEF PTP /* .IFUND PDP9 /*.DAT=136 /* .ENDC /* .IFDEF PDP9 /*.DAT=135 /* .ENDC /* .ENDC /* .ENDC .IFUND PTP .IODEV -10,-14,-15,10 /DAT SLOT 10: VP09 DISPLAY TTICAL=2776 /DAT SLOT -2: KEYBOARD INPUT TTOCAL=2775 /DAT SLOT -3: TELEPRINTER OUTPUT INPCAL=2764 /DAT SLOT -14: EDIT FILE INPUT OUTCAL=2763 /DAT SLOT -15: EDIT FILE OUTPUT IN2CAL=2770 /DAT SLOT -10: AUXILIARY INPUT OPOCAL=1763 /DAT SLOT -15: OPEN OUTPUT FILE OPICAL=0764 /DAT SLOT -14: OPEN INPUT FILE DATM14=.DAT-14 /ABSOLUTE DAT -14. DATM15=.DAT-15 /ABSOLUTE DAT -15. .ENDC .IFDEF PTP .IODEV 3,5,6,10 TTICAL=2776 /DAT SLOT -2: KEYBOARD INPUT. TTOCAL=2775 /DAT SLOT -3: TELEPRINTER OUTPUT. INPCAL=2003 /DAT SLOT 3: EDIT FILE INPUT. OUTCAL=2005 /DAT SLOT 5: EDIT FILE OUTPUT. IN2CAL=2006 /DAT SLOT 6: AUXILIARY INPUT. OPOCAL=1005 /DAT SLOT 5: OPEN OUTPUT FILE. OPICAL=3 /DAT SLOT 3: OPEN INPUT FILE. DATM14=.DAT+3 /ABSOLUTE DAT 3. DATM15=.DAT+5 /ABSOLUTE DAT 5. .ENDC .SCOM=100 /SYSTEM COMMUNICATION AREA. BUFLEN=46 /READ-WRITE LINE BUFFER SIZE. LINSIZ=BUFLEN-2/2*5+1 /MAXIMUM CHARACTERS PER LINE. QUESMK=77 /QUESTION MARK. BEGIN JMP SETBNK /SET EPC BITS FOR CURRENT BANK. LAC ALTXIT /WAS LAST CLOSE COMMAND TERMINATED WITH ALTMODE SPA JMP EXIT1 /YES. RETURN TO MONITOR TTOCAL /INITIALIZE TELETYPE. ONE 1 /.. ADR001 RECOUP /RETURN FROM CONTROL P. LOOPCT 0 /TEMPORARY STORAGE. POINTR=LOOPCT /.. DZM BUFEMP DZM OUTPSW /SET OUTPUT AND / DZM VERISW /VERIFY TO "ON". ALTMOD 175\777777 /1'S COMPLEMENT ALT MODE TERMINATOR. DAC PBLKSW /TURN OFF BLOCK MODE. DAC GBLKSW /.. DAC BRFSW /SET BRIEF TO OFF. DAC OPEN /ALLOW USE OF OPEN AND DAC CALL /CALL SEQUENCES. DAC EXIT /ENABLE .EXIT CAL DAC SAVESW /TURN OFF SAVE OPTION. DAC OUTSW1 /INDICATE NOTHING IN OUTPUT FILE. DZM RLFACT /ZERO CURRENT RELOCATION FACTOR FOR PA AND PL. LAW -67 /55(10). DAC BUFSIZ /DEFAULT BLOCK-BUFFER SIZE. DAC NAMSW /INDICATE NO NAME PRESENT. LAC JMSCLS /PERMIT CLOSE SEQUENCE TO USE DAC CLOSE1 /SUBROUTINE CLSOUT. LAW OUTCAL /DAT SLOT -15. AND ADRMSK /THROW AWAY JUNK. DAC OUTPCL /INITIAL OUTPUT DAT SLOT IS -15. DAC INPTCL /SET UP INPUT DAT SLOT. ISZ INPTCL /INITIAL INPUT DAT SLOT IS -14. DZM DIRSW /INITIAL TRANSFER DIRECTION (READ -14, WRITE -15). LAC TFILE1 /SET UP DEFAULT EDIT FILE NAME (.TFIL2 EDT). DAC INNAME /.. LAC TFILE1+1 /.. DAC INNAME+1 /.. ISZ INNAME+1 /MAKE IT .TFIL2. LAC EDNAM /"EDT" DAC INNAME+2 /EXTENSION FOR DEFAULT FILE NAME. FSTFL1 JMS IOINIT JMS FSTAT /GO SEE IF .TFIL1 EDT IS PRESENT. XCT TFILE1 /BIT 0 = 1 MEANS CHECK THE OUTPUT DEVICE. DAC LOOPCT /SAVE RESULTS OF FSTAT. LAW EDTMES JMS TYPOUT /PRINT "EDITVP VNN". LAC LOOPCT /PICK UP RESULTS OF PREVIOUS FSTAT. SNA /FILE MAY BE PRESENT. JMP FND6 /NOT FOUND, OK. TFIFND SAD FENCE /TEMP FILE FOUND, IS OUTPUT DEVICE FILE-STRUCTURED? JMP FND6 /NO, THEN GO START UP AS USUAL. LAW TFILE1 /YES, INFORM USER OF DIFFICULTY. JMS TYNAME /"FILE .TFIL1 EDT" LAW TWOFIL /COMPLETE THE COMMENT. JMS TYPOUT /"IS PRESENT ON OUTPUT DEVICE." LAW TWOFL0 /TYPE NEXT LINE OF COMMENT. JMS TYPOUT /"PLEASE DELETE OR RENAME IT." JMP FND6 /GO READ A CONTROL REQUEST (SHOULD BE DELETE OR RENAME). MOVE JMP ILLCWD /MOVE IS NOT IMPLEMENTED. /TURN ON INPUT MODE. INPUT LAW INPTM /TYPE CONTROL MODE NOW IN EFFECT. JMS TYPOUT /"INPUT" /MAIN PROCESSING LOOP FOR INPUT MODE. RDNPUT LAW TYLINE /PUT LINE TO BE TYPED IN TYLINE. DAC QUIT /INDICATE PROCESSING IS IN PROGRESS. JMS TYPEIN /THEN GO READ THE KEYBOARD. CLA /WAS CONTROL P STRUCK DURING TYPEIN? SAD QUIT /SKIP IF NOT. JMP TTRS /IF SO, GO RETURN CARRIAGE, CHANGE MODES. JMS UNPACK /NORMAL INPUT LINE, GO UNPACK IT. EDLAD1 TYLINE /FROM TYLINE... EDLADR EDLIN /TO EDLIN. SNA /LENGTH COMES BACK IN AC. JMP EDIT /LINE IS EMPTY (JUST CR ISSUED), CHANGE MODES. ADD EDLADR /START OF LINE PLUS LENGTH. DAC QUIT /ADDRESS OF TERMINATOR. LAC* QUIT /GET TERMINATOR TYPED. SAD ALTMOD /ALT MODE? JMS TYPRTN /YES, GO RETURN CARRIAGE. JMS PUTLIN /PUT AWAY THE PREVIOUS CURRENT LINE. JMP FULBUF /FULL BUFFER RETURN. LAC EDLADR /NORMAL RETURN; GET ADDRESS OF CURRENT-LINE BUFFER. DAC NXTPTR /SET UP NEXT-CHARACTER POINTER. DZM LENGTH /ZERO TOTAL CHARACTERS IN CURRENT LINE. JMS APPEND /THEN GO MOVE TYPED INPUT LINE TO INLINE ARRAY. JMP RDNPUT /READ ANOTHER INPUT LINE. /TURN ON EDIT MODE. EDIT LAW EDTM /TYPE CONTROL-MODE INDICATION. JMS TYPOUT /"EDIT" JMP FND6 /GO TYPE A RIGHT ANGLE BRACKET. /MAIN PROCESSING LOOP FOR EDIT MODE. RDLIN DZM QUIT /INDICATE NO FILE PROCESSING GOING ON NOW. LAW TYLINE /READ NEXT REQUEST FROM TELETYPE. JMS TYPEIN /INPUT-LINE AREA. JMS UNPACK /UNPACK THE TYPED LINE. ADR002 TYLINE /FROM TYLINE... EDLIN /...TO EDLIN. SNA /SKIP IF TOTAL CHARS IN LINE .G. 0. JMP INPUT /CARRIAGE RETURN ONLY, CHANGE MODE. LAC EDLADR /EDLADR POINTS TO EDLIN (WHERE TYPED LINE IS). DAC NXTPTR /SET INITIAL POINTER IN NXTCHR. JMS GETCOM /GO EXTRACT CONTROL WORD FROM INPUT LINE. /DECODE WHAT IS PRESUMED TO BE AN EDITING CONTROL WORD (IN CWD ARRAY) /AND TAKE ACTION IF LEGAL. IF NOT, IGNORE INPUT LINE, COMPLAIN ON /TELEPRINTER, AND REENTER EDIT MODE READ SEQUENCE AT FND6. DECODE LAW CWDTBL-TABEND /TOTAL ENTRIES IN CWD TABLE (2'S COMPLEMENT). DAC LOOPCT /SET UP COUNT OF CONTROL WORDS TO EXAMINE. LAC CWDTOP /GET BEGINNING OF CONTROL WORD TABLE. CWDLP1 DAC SCN1 /SET UP NEXT CALL TO UNPACK. JMS UNPACK /UNPACK NEXT CONTROL WORD. SCN1 0 /MODIFIED EACH TIME TO POINT TO NEW ENTRY. ADR003 TYLINE /USE TYLINE AS OUTPUT ARRAY. JMS SCAN /COMPARE INPUT COMMAND WITH CURRENT ENTRY. CWDLIT CWD /TYPED COMMAND IS IN CWD...CWD+7. TYLINE /CURRENT TABLE ENTRY HAS JUST BEEN UNPACKED INTO TYLINE. SKPLIT SKP /NO MATCH. SKP /END STRING 1. JMP CWDLP2 /FAILED COMPARE, GET NEXT TABLE ENTRY. LAC* STR2 /POSSIBLE MATCH, GET NEXT WORD FROM TYLINE. SMA!CLL!CML /MATCH IF NEXT WORD IN TYLINE IS NEGATIVE... SKP!CLA!RAL /...OR IF TOTAL CHARS IN CWD .E. 1. JMP CWDISP /FULL CONTROL WORD, GO DISPATCH. SAD NCHARS /CHECK FOR ABBREVIATION (AC .E. 1 NOW). JMP CWDISP /NCHARS .E. 1, GO DISPATCH. CWDLP2 LAW -1 /MATCH FAILED, SET UP NEW ARG TO UNPACK... TAD* C12 /...USING A POINTER INTERNAL TO UNPACK. ISZ LOOPCT /COUNT ENTRIES IN CONTROL WORD TABLE. JMP CWDLP1 /MORE TO DO, CONSIDER NEXT ENTRY. /UNRECOGNIZED CONTROL WORD COMES HERE. ILLCWD LAC BRFSW /IS BRIEF MODE IN EFFECT? SMA /NOT IF BRFSW IS NEGATIVE. JMP TYQUES /BRIEF MODE ON, JUST PRINT A QUESTION MARK. LAW ERREQM /BRIEF MODE IS OFF, PRINT FULL ERROR MESSAGE. JMS TYPOUT /"NOT A REQUEST:" LAW 40 /PRINT A LEADING JMS TYONCH /BLANK CHARACTER. JMS PACK /REPACK INPUT LINE. ADR004 EDLIN /FROM HERE. TYLINE /TO HERE. LAW TYLINE /PRINT OFFENDING INPUT LINE. JMS TYPOUT /.. JMP FND6 /GO BACK TO READ SOME MORE. TYQUES LAW QUESMK /BRIEF IS ON, GET QUESTION MARK. JMS TYONCH /GO TYPE IT OUT. JMS TYPRTN /PRINT CARRIAGE RETURN, LINE FEED. JMP FND6 /READ NEXT COMMAND. CWDISP LAC TABEND /GET END OF DISPATCH TABLE. TAD LOOPCT /CALCULATE OUR CURRENT POSITION IN IT. ADD XCTZRO /INSERT AN XCT AS TABLE REFERENCE. DAC CWDXCT /GIVE TO DISPATCHER. /GO TO SERVICE SECTION FOR THIS CONTROL WORD. CWDXCT XX /RESULTS IN XCT OF PROPER TABLE ENTRY (JMP OR JMS). QUIT=CWDXCT /QUIT .NE. 0, COMMAND PROCESSING IS IN PROGRESS. JMP FND4 /IN CASE TABLE ENTRY WAS A JMS. .EJECT /TABLE OF CONTROL WORDS FOR COMPARE AGAINST TYPED EDIT COMMANDS. /CONTROL WORDS ARE LIMITED TO SEVEN CHARACTERS IN LENGTH. CWDTOP .-1 .ASCII 'PRINT'<15> .LOC .-1 C104 104 .ASCII 'NEXT'<15> .ASCII 'FIND'<15> .ASCII 'LOCATE'<15> .LOC .-1 C122 122 .ASCII 'GET'<15> .ASCII 'INSERT'<15> .LOC .-1 C111 111 .ASCII 'DELETE'<15> NAMSW=.-1 /0, FILE NAME GIVEN IN OPEN REQUEST; -1, NO NAME GIVEN. .ASCII 'SIZE'<15> .ASCII 'OVERLAY'<15> .ASCII 'CHANGE'<15> NAMSW1=.-1 .ASCII 'VERIFY'<15> STR1=.-1 .ASCII 'TOP'<15> .ASCII 'TV'<15> .ASCII 'BOTTOM'<15> STR2=.-1 /POINTER FOR CHANGE REQUEST. .ASCII 'BRIEF'<15> PBLKSW=.-1 /OUTPUT BLOCK BUFFER: 0, WRITE BUFFER. -1, WRITE FILE. .ASCII 'RETYPE'<15> GBLKSW=.-1 .ASCII 'APPEND'<15> CURPUT=.-1 .ASCII 'KEEP'<15> .ASCII 'RENEW'<15> .LOC .-1 C77 77 .ASCII 'READ'<15> .ASCII 'WRITE'<15> CURGET=.-1 .ASCII 'MOVE'<15> .ASCII 'PL'<15> .ASCII 'PA'<15> .ASCII 'CALL'<15> .ASCII 'FORM'<15> .ASCII 'BLOCK'<15> DIRSW=.-1 .ASCII 'OUTPUT'<15> ERRSW=.-1 .ASCII 'EXIT'<15> .ASCII 'OPEN'<15> .ASCII 'CLOSE'<15> BTEMP=.-1 /GETNUM: TEMPORARY STORAGE. .ASCII 'ICLOSE'<15> BUFEND=.-1 .ASCII 'SCLOSE'<15> FBUFSW=.-1 .EJECT /TABLE OF DISPATCHERS TO CONTROL-WORD SERVICE SECTIONS. ENTRIES ARE /EITHER "JMP"S OR "JMS"S AND ARE REFERENCED BY AN XCT (AT CWDXCT) /OF THE APPLICABLE TABLE LOCATION AFTER COMMAND DECODING. NOTE THAT /ENTRIES ARE SO ORDERED AS TO CORRESPOND WITH ASCII ENTRIES IN TABLE /OF CONTROL WORDS ABOVE. FOR BOTH TABLES, NOTE THAT ANY CONTROL WORD /WHICH CAN LEGALLY BE ABBREVIATED MUST PRECEDE ANY OTHER CONTROL WORD /HAVING THE SAME INITIAL CHARACTER (THUS "BOTTOM" PRECEDES "BRIEF"). /MAY COMMAND BE ABBREVIATED? CWDTBL JMP PRINT /YES -- "P" JMP NEXT /YES -- "N" JMP FIND /YES -- "F" JMP LOCATE /YES -- "L" JMP GET /YES -- "G" JMP INSERT /YES -- "I" JMP DELETE /YES -- "D" JMP SIZE /YES -- "S" JMP OVRLAY /YES -- "O" JMP CHANGE /YES -- "C" JMP VERIFY /YES -- "V" JMP TOP /YES -- "T" JMP TV /NO! JMP BOTTOM /YES -- "B" JMP BRIEF /NO! JMP RETYPE /YES -- "R" JMS APPEND /YES -- "A" JMP KEEP /YES -- "K" JMP RENEW /NO! JMS READ /NO! JMS WRITE /COULD BE, BUT THIS FACT IS NOT ADVERTISED. JMP MOVE /NOT IMPLEMENTED 10/25/67. JMP PRTLOC /NOT ADVERTISED -- PRINT CONTENTS OF CORE LOCATION. JMP PATLOC /NOT ADVERTISED -- PATCH CORE LOCATION. JMP CALL /NO! JMP FORM /NO! JMP BLOCK /NO! JMP OUTPUT /NO! JMP EXIT /COULD BE, BUT NOT ADVERTISED. JMP OPEN /NO! JMP CLOSE /NO! JMP ICLOSE /NOT ADVERTISED -- CLOSE INPUT FILE, LEAVE OUT FILE OPEN. JMP SCLOSE /NOT ADVERTISED -- CLOSE LEAVING OUT FILE ON SCRATCH DEVICE. TABEND CAL TABEND /13-BIT END-OF-TABLE DEFINITION. .EJECT /PRINT N LINES FROM EDIT FILE. PRINT JMS GETNUM /GET ARGUMENT. DAC LOOPCT /N LINES TO PRINT. PRLIN LAC LENGTH /GET TOTAL CHARS IN CURRENT LINE. SNA /PRINT ONLY IF LINE IS NON-EMPTY. JMP PRT1 /OTHERWISE IGNORE IT. JMS PACK /PACK THE CURRENT LINE. ADR005 INLINE /FROM INLINE... TYLINE /TO TYLINE. LAW TYLINE /THEN PRINT THIS DATA LINE. JMS TYPOUT /.. PRT1 ISZ LOOPCT /COUNT LINES TO BE PRINTED. SKP /MORE TO DO. JMP FND4 /ALL DONE, RETURN TO COMMAND READER. JMS PUTLIN /WRITE OUT THIS LINE. JMP FULBUF /NO MORE ROOM. JMS GETLIN /GET NEXT LINE. INLINE JMP EOF /RETURN IF EOF ENCOUNTERED. JMS TVCL /DISPLAY NEW CURRENT LINE. JMP PRLIN /GO PRINT NEW CURRENT LINE. /DELETE N OR 1 LINES. DELETE JMS TVXUT /CROSS OUT CURRENT LINE ON DISPLAY CLA /SET DELSW TO ZERO. /MOVE POINTER DOWN N OR 1. NEXT DAC DELSW /SET DELSW. AC IS GUARANTEED NON-ZERO. JMS GETNUM /GET ARGUMENT. DAC LOOPCT /N LINES TO SKIP OVER. NXTLIN LAC DELSW /GET DELETE-NEXT INDICATOR. SNA /DELSW .E. 0, OPERATION IS "DELETE." DAC LENGTH /DELETE, FORESTALL WRITE OF THIS LINE. JMS PUTLIN /NEXT, SAVE CURRENT LINE. JMP FULBUF /.. JMS GETLIN /GET NEXT LINE. INLINE /.. JMP EOF /.. LAC DELSW /IF CURRENT OPERATION IS DELETE SZA /DO NOT JMS TVCL /DISPLAY CURRENT LINE. ISZ LOOPCT /COUNT LINES CONSIDERED. JMP NXTLIN /MORE LINES TO SKIP. LAC DELSW /IF CURRENT OPERATION IS 'NEXT' SNA /THE CURRENT LINE HAS ALREADY JMS TVCL /BEEN DISPLAYED. JMP FND4 /ALL FINISHED, RETURN TO MAIN LINE. /FIND A LINE. FIND LAC NXTPTR /GET POINTER TO CURRENT CHAR IN COMMAND LINE. DAC FND2 /INSERT IN ARGUMENT LIST. FND1 JMS PUTLIN /OUTPUT CURRENT LINE. JMP FULBUF /.. JMS GETLIN /GET NEXT LINE. INLINE /.. JMP EOF /IF END-OF-FILE. JMS TVCL /DISPLAY CURRENT LINE. JMS SCAN /CALL STRING COMPARER. FND2 0 /SEARCH FOR THIS STRING... INLINE /...IN THIS LINE. SKP /NOT FOUND. SKP /EOL, STRING 1. JMP FND1 /GO BACK TO SEARCH SOME MORE. /DESIRED LINE HAS BEEN LOCATED. ASCERTAIN WHETHER OR NOT CONFIRMATORY /PRINT SHOULD BE UNDERTAKEN. FND3 LAC LENGTH SNA JMP FND6 LAC INLADR DAC NXTPTR ADD LENGTH DAC APPEND LAC* APPEND DAC LOC2 LAW -3 DAC TABCT LAC BRFSW SMA FNDLP1 JMS NXTCHR JMP FND5 SAD BLANK JMP TABFND SAD TAB JMP TABFND SAD SLASH JMP FND5-2 LAC NXTPTR DAC APPEND LAC* APPEND DAC LOC2 JMP FNDLP1 TABFND ISZ TABCT JMP FNDLP1 CLA!CMA DAC* APPEND FND5 LAC VERISW SPA JMP FNDRS JMS PACK ADR006 INLINE TYLINE LAW TYLINE JMS TYPOUT FNDRS LAC LOC2 DAC* APPEND FND4 LAC QUIT SNA JMP TTRS FND6 LAW 76 JMS TYONCH JMP RDLIN /COME HERE ON BUFFER OVERFLOW FULBUF LAW BOVFLM JMS TYPOUT JMS PACK ADR011 INLINE TYLINE LAW TYLINE JMS TYPOUT JMP FND4 /LOCATE A LINE. LOCATE LAC NXTPTR /GET ADDRESS OF NEXT CHAR IN COMMAND LINE. DAC LOC2 /GIVE TO SCAN ARGUMENT LIST. LOC5 JMS PUTLIN /WRITE THE CURRENT LINE. JMP FULBUF /FULL-BUFFER RETURN. JMS GETLIN /READ THE NEXT LINE. INLINE /TO CURRENT-LINE AREA. JMP EOF /END-OF-FILE RETURN. JMS TVCL /DISPLAY CURRENT LINE. LAC INLADR /GET START ADDRESS OF NEW LINE. DAC LOC4 /INSERT AS SCAN ARGUMENT #2. LOC1 JMS SCAN /CALL SCAN. LOC2 0 /STRING TO LOOK FOR. LOC4 0 /WHERE TO LOOK FOR IT. TABCT=LOC4 /COUNT OF TABS AND BLANKS FOR BRIEF MODE SERVICER. JMP LOC3 /NOT FOUND THIS TRY. JMP FND3 /FOUND. JMP LOC5 /NOT FOUND ANYWHERE IN THIS LINE. LOC3 ISZ LOC4 /BUMP SCAN ARG TO NEW STRING IN CURRENT LINE. JMP LOC1 /THEN GO SEARCH THE NEW STRING. /SET VERIFY SWITCH VERIFY JMS DCODSW /GO INTERPRET NEXT WORD IN LINE. VERISW 0 /VERIFY ON-OFF SWITCH. JMP FND4 /SET BLOCK-MODE INDICATOR. BLOCK JMS DCODSW /"ON" OR "OFF"? BLOKSW -1 /BLOCK MODE ON-OFF SWITCH. SNA JMP SETPBL-1 LAC BUFEMP SZA!CLA!CMA JMP BLOK01 DAC GBLKSW SETPBL DAC PBLKSW JMP FND4 BLOK01 LAW BFNEMM JMS TYPOUT JMP FND4 /SET BRIEF MODE SWITCH. BRIEF JMS DCODSW /INTERPRET NEXT CONTROL WORD. BRFSW -1 /BRIEF IS OFF INITIALLY. JMP FND4 /SET OUTPUT-SUPPRESSION INDICATOR. OUTPUT JMS DCODSW /CHECK ARGUMENT. OUTPSW 0 /OUTPUT IS "ON" IF ZERO. JMP FND4 /SET DISPLAY-WANTED INDICATOR. TV JMS DCODSW /GET ARGUMENT. TVSW -1 /TV IS OFF INITALLY. SAD TVON /ANY CHANGE IN STATUS? JMP TV2 /NO. DAC TVON /YES,SAVE NEW STATUS. JMS TVST /START OR STOP DISPLAY. LAC TVSW /IF TV WAS TURNED ON, TV2 SZA JMP FND4 CMA /TURN OFF VERIFY SWITCH. DAC VERISW LAC LENGTH /IF THERE IS ONE, SZA JMS TVCL /DISPLAY THE CURRENT LINE. JMP FND4 /INSERT A LINE AFTER CURRENT LINE. INSERT JMS PUTLIN /WRITE CURRENT LINE. JMP FULBUF /RETURN HERE IF NO MORE ROOM. DZM LENGTH /ZERO TOTAL CHARACTERS. JMS APPEND /CALL APPEND. LAC LENGTH /GET CALCULATED LENGTH. SNA /WAS THERE ANY STUFF AFTER THE COMMAND? JMP INPUT /NO, CHANGE TO INPUT MODE. JMP FND4 /YES, GET NEXT COMMAND. LINE INSERTED IS NOW THE CURRENT LINE. /REPLACE CURRENT INLINE WITH CONTENTS OF EDLIN. RETYPE DZM LENGTH /ZERO TOTAL CHARACTERS PRESENTLY IN CURRENT LINE, JMS TVXUT /CROSS OUT CURRENT LINE ON DISPLAY. JMS APPEND /...THEN PERFORM A NORMAL APPEND. JMP FND4 /GO GET NEXT COMMAND. /ADD SOME DATA TO THE CURRENT LINE. APPEND 0 /APPEND IS REACHED VIA JMS. LAC LENGTH /IF CURRENT OPERATION IS 'APPEND' SZA /(L>0) PREPARE TO ADD TO CURRENT LINE JMS TVMLF /BY MOVING DISPLAY LINE POINTER UP ONE. APPND1 LAC INLADR /GET START OF CURRENT LINE. ADD LENGTH /BUMP BY TOTAL DATA CHARACTERS. DAC POINTR /GIVE TO NEXT-CHARACTER INDICATOR LAW -2 /ENSURE THAT THIS CHAR WILL FIT. TAD MAXLEN /MAXLEN=(LINSIZ. CMA TAD LENGTH SPA!CLA!CMA /AC POSITIVE IF LENGTH .GE. MAXLEN-1. JMS NXTCHR /GET NEXT CHARACTER FROM INPUT STREAM NOPLIT NOP /IGNORE NXTCHR END-OF-LINE RETURN. DAC* POINTR /INSERT IN LINE. SPA /END-OF-LINE? JMP .+3 /YES, RETURN TO CALLER. ISZ LENGTH /NO, BUMP TOTAL CHARACTERS. JMP APPND1 /GO GET ANOTHER CHARACTER. JMS TVCL /DISPLAY CURRENT LINE. JMP* APPEND /RETURN. /REPLACE STRING 1 WITH STRING 2. CHANGE DZM LOOPCT JMS NXTCHR /GET NEXT CHARACTER FROM COMMAND LINE. JMP FND3 /NO MORE CHARACTERS, IGNORE CHANGE REQUEST. DAC QUOTE /USE AS QUOTE CHARACTER. LAC NXTPTR /GET POINTER TO NEXT CHARACTER. DAC CHSCN1 /USE AS ARG1 TO SCAN. CHLP1 JMS NXTCHR /GET NEXT CHARACTER IN STRING 1. JMP FND3 /NO MORE CHARACTERS, NO CHANGE POSSIBLE. SAD QUOTE /SECOND APPEARANCE OF QUOTE CHARACTER? JMP CHGE1 /YES, ENTER SEARCH LOOP FOR STRING 1. ISZ LOOPCT /NO, COUNT ANOTHER CHARACTER IN STRING 1. JMP CHLP1 /GO CHECK MORE CHARS FOR QUOTE. CHGE1 LAC CHSCN1 ADD LOOPCT DAC STR1 CLA!CMA DAC* STR1 LAC INLADR DAC CHSCN2 CHSCN JMS SCAN CHSCN1 0 CHSCN2 0 JMP RESCAN SKP!CLA!CMA JMP FND3 TAD LOOPCT CMA TAD STR2 DAC STR1 LAC EDLAD1 DAC POINTR CHLP2 LAC* STR2 DAC* POINTR ISZ STR2 ISZ POINTR SMA JMP CHLP2 CHLP3 JMS NXTCHR JMP CHDON SAD QUOTE JMP CHDON DAC* STR1 ISZ STR1 JMP CHLP3 CHDON LAC EDLAD1 DAC STR2 LAC STR1 DAC APPEND CHLP4 LAC* STR2 DAC* STR1 ISZ STR2 ISZ STR1 SMA!CLA!CMA JMP CHLP4 XOR INLADR /FORM 1'S COMPLEMENT OF START ADDRESS OF LINE. TAD STR1 /LESS ADDRESS+1 OF LAST CHARACTER IN LINE. DAC LENGTH /GIVES NEW TOTAL DATA CHARACTERS. LAC* APPEND DAC LOC2 LAC BRFSW SMA!CLA!CMA DAC* APPEND JMS TVXUT /CROSS OUT CURRENT LINE ON DISPLAY. JMS TVCL /DISPLAY NEW CURRENT LINE. JMP FND5 RESCAN ISZ CHSCN2 JMP CHSCN /SET N LINES IN BLOCK BUFFER. SIZE JMS GETNUM /GET DECIMAL ARGUMENT. SAD FENCE /-1? JMP ILLCWD /ILLEGAL IF SO. DAC BUFSIZ /ARG .G. 1, SAVE NEW SIZE. JMP FND4 /GET NEXT COMMAND. /CHANGE N LINES. OVRLAY JMS GETNUM /GET TOTAL LINES TO REPLACE. DAC LOOPCT /SAVE AS COUNTER. JMS TVXUT /CROSS OUT CURRENT LINE ON DISPLAY. OVRLP1 DZM LENGTH /FORESTALL WRITE OF FINAL LINE SKIPPED OVER. ISZ LOOPCT /COUNT CURRENT LINE. SKP /MORE TO DO, GET NEXT LINE. JMP INPUT /DONE, GO CHANGE TO INPUT MODE. JMS GETLIN /READ NEXT LINE FROM FILE OR INPUT BUFFER. INLINE /.. JMP EOF /END-OF-FILE RETURN FROM GETLIN. JMP OVRLP1 /READ WAS SUCCESSFUL, PROCESS THIS LINE. /PRINT CONTENTS OF SPECIFIED CORE LOCATION. PRTLOC JMS GETOCT /GET ADDRESS OF LOCATION TO DUMP. ADD RLFACT /ADD RELOCATION FACTOR. DAC OCTNUM /SAVE AS POINTER. LAW -6 /SET UP TO PRINT SIX CHARACTERS. DAC LOOPCT /.. LAC* OCTNUM /GET CELL TO DUMP. DAC OCTNUM /AND SAVE. PRTLP1 LAC OCTNUM /GET NEXT DIGIT, PICK UP CURRENT NUMBER. RTL /.. RAL DAC OCTNUM /SAVE NEXT NUMBER. RAL /GET THIRD BIT. AND C7 /MASK OFF JUNK. ADD C60 /INSERT ZONE BITS. JMS TYONCH /GO TYPE THIS DIGIT. ISZ LOOPCT /COUNT SIX CHARACTERS TYPED. JMP PRTLP1 /MORE TO DO, GET NEXT DIGIT. JMS TYPRTN /ALL DONE, GO RETURN CARRIAGE. JMP FND6 /THEN RETURN TO MAIN LINE. /PATCH SPECIFIED CORE LOCATION. PATLOC JMS GETOCT /GET ADDRESS OF LOCATION TO PATCH. ADD RLFACT /PLUS RELOCATION FACTOR. DAC POINTR /SAVE ABSOLUTE ADDRESS. JMS GETOCT /THEN GET NEW CONTENTS. DAC* POINTR /PATCH CELL SPECIFIED. JMP FND6 /AND RETURN. /SERVICE CALL REQUEST. CALL NOP JMS GETCOM LAC CWD SAD C104 JMP CDEL SAD C122 JMP CREN JMP ILLCWD CDEL JMS GETDAT JMS GETCOM SNA JMP ILLCWD LAW -2 JMS PK6BT CWD CALLDB CALDB1 LAC SRCNAM DAC CALDB1+2 JMS GETCOM SNA!CLA!CMA JMP CDEL1 JMS PK6BT CWD CALDB1+2 CDEL1 LAC CALLDB ADD CALDAT DAC CDEL2+1 CDEL2 JMS DELFIL 0 JMP IOSET /CALL RENAME.. CREN JMS GETDAT JMS GETCOM SNA JMP ILLCWD LAW -2 JMS PK6BT CWD CALDB1 JMS GETCOM SNA!CLA!CMA JMP ILLCWD JMS PK6BT CWD CALDB1+2 JMS GETCOM SNA JMP ILLCWD LAW -2 JMS PK6BT CWD CALDB2 LAC CALDB1+2 DAC CALDB2+2 JMS GETCOM SNA!CLA!CMA JMP CREN2 JMS PK6BT CWD CALDB2+2 CREN2 LAC CALLDB ADD CALDAT DAC CREN1 JMS RENAME CREN1 0 CALDB2 IOSET JMS IOINIT JMP FND6 /GETDAT... GETDAT 0 JMS GETCOM LAC CWD SAD OFF JMP COUT SAD C111 JMP CIN JMP ILLCWD CIN CLA!SKP COUT LAC XCTZRO DAC CALDAT JMP* GETDAT /PRODUCE A FORM FEED ON PAPER TAPE TO KEEP THE PDP7 /EDITOR HAPPY. FORM LAC OUTDEV SMA JMP FND6 OUTCAL 11 /WRITE FEED FORMFD -4 JMP FND4 FORMFD 002002 BLANK 40 /CHECKSUM -- IGNORED BY PUNCH HANDLER. BNKMSK .ASCII <14> RECOUP=. .IFDEF BF DAC SAVEAC /SAVE AC .ENDC LAC QUIT SNA JMP BEGIN DZM QUIT .IFUND BF LAC* SCOM16 /RESTORE LINK. .ENDC .IFDEF BF LAC* SCOM10 /RESTORE LINK .ENDC DAC QRETN /SAVE RETURN. RAL /.. .IFUND BF LAC* SCOM17 /RESTORE AC. .ENDC .IFDEF BF LAC SAVEAC /RESTORE AC .ENDC JMP* QRETN /REENTER INTERRUPTED SEGMENT. .IFDEF BF SAVEAC 0 .ENDC TTRS JMS TYPRTN JMP EDIT /OPEN AN INPUT FILE FOR EDITING. OPEN NOP /OR JMP ILLCWD, IF OPEN SEQUENCE ALREADY EXECUTED. LAC INDEV /IS INPUT DEVICE FILE-STRUCTURED? SPA /INDEV IS POSITIVE IF SO. JMP FND4 /NON-FILE-STRUCTURED, IGNORE OPEN REQUEST. JMS GETCOM /GET FILE NAME FROM COMMAND STRING. SNA /SKIP IF A NAME WAS IN FACT TYPED. JMP NONAM1 /NO NAME FURNISHED, PUBLISH ERROR. LAW -2 /FILE NAME GIVEN, PACK INTO FIRST JMS PK6BT /TWO WORDS OF DEB. CWD /.. INNADR INNAME /.. LAC SRCNAM /USE "SRC" AS DEFAULT EXTENSION. DAC INNAME+2 /.. JMS GETCOM /THEN GO GET TYPED EXTENSION, IF PRESENT. SNA!CLA!CMA /SKIP IF AN EXTENSION WAS TYPED. JMP DZMNAM /OTHERWISE, ASSUME "SRC" IS WANTED. JMS PK6BT /NOW PACK UP THE EXTENSION TYPED. CWD /.. INNAME+2 /INTO THIRD WORD OF DEB. DZMNAM DZM NAMSW /INDICATE THAT A FILE NAME HAS BEEN FURNISHED. JMS IOINIT /INIT INPUT AND OUTPUT DEVICE. JMS FSTAT /NOW GO LOOK FOR THE NAMED FILE. INNAME /FILE NAME IS IN INNAME...INNAME+2. SNA /SKIP IF FILE IS PRESENT ON INPUT DEVICE. JMP NTFND /FILE NOT FOUND, COMMENT. DZM INFILE /INDICATE THAT AN INPUT FILE IS PRESENT. JMS SEEK /GO OPEN THE INPUT FILE FOR READING. INNAME /.. LAC BADARG /GET A TRANSFER TO ILLCWD DAC OPEN /AND SHUT OUT FURTHER ACCESS TO OPEN DAC CALL /AND CALL SEQUENCES. DAC EXIT /AND ALSO EXIT JMP EDIT /THEN GO PREPARE TO EDIT THE FILE JUST OPENED. INNAME .BLOCK 3 NONAM1 LAW NOFLNM JMS TYPOUT JMP FND4 NTFND LAW INNAME /ADDR OF NAME OF ABSENT FILE. JMS TYNAME /TYPE OUT FILE NAME. LAW FILN1 /COMPLETE THE COMMENT. JMS TYPOUT /"NOT FOUND." LAC BADARG /INHIBIT CALL OF .EXIT CAL DAC EXIT DAC OPEN /ALSO SHUT OFF OPEN AND DAC CALL /CALL COMMANDS JMP INPUT /ACCEPT SOME INPUT. /SERVICE KEEP REQUEST. KEEP LAC DIRSW /ARE WE GOING FROM -14 TO -15? SMA /IF NOT, SKIP; COULD BE TROUBLE. JMP KEEP1 /YES, OK. LAC* INPDAT /SEE IF SAME UNIT AND DEVICE FOR -14 AND -15. XOR* OUTDAT /.. SNA /SKIP IF NOT SAME UNIT. JMP KEEP1 /SAME UNIT FOR BOTH DAT SLOTS, OK. HONOR REQUEST. LAW TOPRQM /TWO UNITS AND GOING WRONG WAY, COMMENT. JMS TYPOUT /"TOP REQUEST NEEDED." JMP FND6 /GET NEXT COMMAND. KEEP1 JMS GETCOM /GET FILE NAME WANTED. SNA /SKIP IF A FILE NAME WAS GIVEN. JMP NONAM1 /IF NOT, GO COMPLAIN. LAW -2 /PACK 2-WORD FILE NAME. JMS PK6BT /.. CWD /FILE NAME IS IN CWD. SVADR SAVNAM /PUT IT IN SAVNAM. LAC SRCNAM /GET DEFAULT EXTENSION. DAC SAVNAM+2 /SAVE IN DIRECTORY ENTRY. JMS GETCOM /THEN GO SEE IF AN EXTENSION WAS TYPED, TOO. SNA!CLA!CMA /SKIP IF AN EXTENSION IS THERE. JMP SETSAV /NO EXTENSION. JMS PK6BT /PACK A ONE-WORD EXTENSION. CWD /TYPED EXTENSION IS IN CWD. SAVNAM+2 /EXTENSION WORD IN DEB. SETSAV DZM SAVESW /INDICATE A SAVE IS WANTED. JMP FND6 /THEN REENTER MAIN LINE. /CLOSE INPUT FILE ONLY. ICLOSE CLA /INDICATE CURRENT INPUT DAT SLOT IS TO BE REFERENCED. DAC ICLSW /SET ICLOSE SWITCH JMS CLSFIL /GO CLOSE THE INPUT FILE. LAC NOPLIT /GET A NOP CODE. DAC OPEN /ALLOW ENTRY TO "OPEN" SEQUENCE. DAC RDFNOP /AND SET UP TO FILL BOTH INPUT BUFFERS ON NEXT READ. DAC NAMSW /INDICATE NO FILE NAME HAS BEEN PROVIDED. LAC INDEV /IS INPUT DEVICE FILE-STRUCTURED? SPA!CMA /INDEV .G. 0, YES; SET AC NEGATIVE. CLA /INDEV .L. 0, NO; SET AC POSITIVE. DAC INFILE /INFILE NEGATIVE MEANS NO INPUT FILE PRESENT. JMP FND4 /GO READ NEXT COMMAND. SCLOSE LAW -1 DAC DIRSW CLOSE LAC TOTCHR TAD (EDLIN /POINT TO LINE TERMINATOR DAC ALTXIT LAC* ALTXIT /GET LINE TERMINATOR SAD ALTMOD /IS IT ALT MODE? DAC ALTXIT /SET -VE IF LINE TERMINATOR WAS ALT MODE LAC OUTDEV SMA JMP CLOSE2 JMSCLS JMS CLSOUT JMP BEGIN CLOSE2 JMS GETCOM DZM NAMSW1 SZA!CLA /SKIP IF NO NAME TYPED IN CLOSE REQUEST. JMP NAMEIN /A NAME WAS TYPED. SAD NAMSW /SKIP IF NO NAME GIVEN IN OPEN REQUEST. JMP CLOSE1 /AT LEAST ONE NAME HAS BEEN PROVIDED. LAW NOFLNM JMS TYPOUT JMP FND4 NAMEIN LAW -2 /PACK TWO WORDS... JMS PK6BT /...IN SIX-BIT FORMAT. CWD /FROM CWD. NEWNAM /TO NEWNAM. LAC SRCNAM /GET "SRC". DAC NEWNAM+2 /USE AS DEFAULT EXTENSION. DAC NAMSW1 /INDICATE A NAME WAS GIVEN IN THIS CLOSE REQUEST. JMS GETCOM /SEE IF AN EXTENSION WAS TYPED. SNA!CLA!CMA /SKIP IF AN EXTENSION WAS IN FACT TYPED. JMP CLOSE1 /NO EXTENSION, USE "SRC". JMS PK6BT /EXTENSION GIVEN, GO PACK IT UP (AC = 777777 NOW). CWD /EXTENSION IS IN CWD. NEWNAM+2 /PUT IT IN DEB. CLOSE1 JMS CLSOUT LAC INDEV SPA JMP GETNM2 LAC* INPDAT XOR* OUTDAT SNA JMP GETNM2 LAC DIRSW SMA JMP GETNM2 JMS SEEK INNAME JMP CLOSE1 GETNM2 LAC NAMSW1 SNA JMP BEGIN CKNAM LAC INDEV RAL LAC CKNM1 AND CL0777 SZL ADD XCTZRO DAC CKNM1 LAC CKNM2 AND CL0777 SZL ADD XCTZRO DAC CKNM2 LAC NAMSW SNA!CLA!CMA JMP CKNM3 CKNM0 JMS FSTAT CKNM1 NEWNAM SZA JMP NMERR2 RNM2 JMS RENAME CKNM2 INNAME NEWNAM JMP BEGIN NMERR2 LAW BADNAM JMS TYPOUT LAC NOPLIT DAC CLOSE1 JMP FND4 /NAMES GIVEN BOTH IN OPEN AND CLOSE REQUESTS. FIND OUT IF TWO /NAMES ARE IDENTICAL. IF SO, ACCEPT CLOSE REQUEST. CKNM3 TAD CKNM1 DAC* C12 CLA!CMA TAD CKNM2 DAC* C15 LAW -3 DAC WRITE CKNM4 LAC* 12 SAD* 15 SKP JMP CKNM0 ISZ WRITE JMP CKNM4 JMP BEGIN NEWNAM .BLOCK 3 /SERVICE TOP COMMAND. TOP LAC PBLKSW SZA JMP TOPFIL JMS RSBUFF JMS CHBUFF JMP FND4 TOPFIL LAC FILSTR SPA JMP ILLCWD LAC RDFNOP SAD RDFJMP JMP TOPFL1 AND OUTSW1 SPA JMP FND4 TOPFL1 JMS CLSOUT JMS SEEK INNAME JMP FND4 .EJECT /MOVE POINTER TO LAST LINE OF FILE OR BUFFER. BOTTOM LAC LENGTH DAC LEN1 JMS GETLIN /GET NEXT LINE. EDLIN /SAVE TEMPORARILY IN EDLIN ARRAY. JMP FND3 /ALL DONE IF END OF FILE. LAC LEN1 DAC LENGTH JMS PUTLIN /NOT YET, OUTPUT CURRENT LINE. JMP FULBUF DZM LENGTH /MOVE EDLIN TO INLINE. LAC EDLADR DAC NXTPTR JMS APPEND JMP BOTTOM /READ SOME LINES FROM SUBSIDIARY DEVICE. GET JMS GETNUM DAC LOOPCT SBREAD IN2CAL 10 SBADR SBUFF -BUFLEN IN2CAL 12 LAC SBUFF AND C7 SAD C5 SKP SAD C6 JMP GETEOF JMS PUTLIN JMP FULBUF JMS UNPACK ADR008 SBUFF INLINE DAC LENGTH JMS TVCL /DISPLAY NEW CURRENT LINE. ISZ LOOPCT JMP SBREAD JMP FND4 GETEOF LAW EOMRM JMS TYPOUT JMP EOFCOM SBUFF .BLOCK BUFLEN /SERVICE RENEW REQUEST. RENEW JMS WRITE /FIRST WRITE OUT THE CURRENT BUFFER. JMS READ /THEN FILL UP THE BUFFER FROM THE INPUT FILE. JMP FND4 /AND GO READ ANOTHER REQUEST. .EJECT /SERVICE WRITE REQUEST. WRITE 0 /ENTRY TO WRITE BLOCK BUFFER INTO OUTPUT FILE. LAC PBLKSW /IS BLOCK MODE ON? SZA /SKIP IF IT IS. JMP ILLCWD /IF BLOCK MODE IS OFF, DON'T ACCEPT WRITE REQUEST. JMS RSBUFF /GO FILL UP OUTPUT BUFFER FROM INPUT BUFFER. JMS CHBUFF /THEN CHANGE THE BUFFERS AROUND. LAC BLOKSW /SAVE THE CURRENT STATUS OF BLOKSW. DAC LOOPCT /.. FENCE LAW -1 /THEN TURN BLOCK MODE OFF. DAC PBLKSW /.. DAC BLOKSW /.. JMS RSBUFF /NOW GO EMPTY THE INPUT BUFFER, AND THIS TIME WRITE OUTPUT FILE. LAC LOOPCT DAC BLOKSW DZM PBLKSW JMS CHBUFF DZM BUFEMP JMP* WRITE /RETURN TO CALLER. /SERVICE READ REQUEST. READ 0 /ENTRY TO FILL INPUT BUFFER. LAC BUFEMP SZA JMP NEMPBF LAC BUFSIZ DAC LOOPCT LAC BLOKSW SZA!CLA!CMA /SKIP IF BLOCK ON,-1 TO AC JMP ILLCWD /ILLEGAL COMMAND IF NOT. DAC PBLKSW /OFF PUTLIN BLOCK SWITCH. JMS PUTLIN /OUTPUT CURRENT LINE IF ANY. JMP FULBUF DZM PBLKSW /RESET PUTLIN BLOCK SWITCH ON. JMS CHBUFF LAW -1 DAC GBLKSW READ1 JMS GETLIN INLINE JMP EOF JMS PUTLIN JMP FULBUF ISZ LOOPCT JMP READ1 JMS CHBUFF JMP* READ NEMPBF LAW BFNEMM JMS TYPOUT JMP* READ /SUBROUTINE RSBUFF; EMPTY INPUT BUFFER, FILL OUTPUT BUFFER. RSBUFF 0 NCHARS=RSBUFF /GETCOM: TOTAL TYPED CHARACTERS IN CURRENT COMMAND. RSB01 JMS PUTLIN JMP FULBUF LAC GBLKSW SZA JMP* RSBUFF JMS GETLIN INLINE JMP* RSBUFF JMP RSB01 .EJECT /SUBROUTINE CHBUFF, EXCHANGE INPUT AND OUTPUT BUFFERS; SET GET /AND PUT POINTERS TO BUFFER TOPS. CHBUFF 0 LAC BBUF1 /GET TOP OF BUFFER 1. DAC NXTPUT /GIVE TO OUTPUT POINTERS. DAC CURPUT /.. TAD FENCE ADD BBUFX DAC BUFEND LAC BBUF2 /GET TOP OF BUFFER 2. DAC CURGET /GIVE TO INPUT POINTER. DAC BBUF1 /SWITCH BUFFERS. LAC NXTPUT /.. DAC BBUF2 /.. LAC PBLKSW DAC GBLKSW LAC BFPTSW /ANYTHING IN OLD OUTPUT BUFFER? SNA /SKIP IF SO DZM CURGET DZM BFPTSW /NOW INDICATE NOTHING IN NEW OUTPUT BUFFER. /INITIALIZATION FOR DISPLAY BUFFERS. TVINIT LAW -TVNLN /NUMBER OF LINES TO BUFFER FOR DISPLAY. DAC TVCNT LAC (TVBUF1 /ADDRESS OF 1ST BUFFER IN THE RING. DAC TVSPTR /SET UP START POINTER. DAC TVCPT2 /SET UP FILL-BUFFERS POINTER. TVNT10 DAC TVCPTR /SET UP TO INITIALIZE BUFFERS. DZM* TVCPTR /0 1ST WORD MEANS EMPTY BUFFER. TAD (BUFLEN+1 /NEXT BUFFER. ISZ TVCNT /ALL BUFFERS DONE? JMP TVNT10 /NO,RECYCLE. LAC (JMP TVVP20 /SET SWITCH TO ROUTINE USED TO DAC TVVP10 /FILL UP BUFFERS. LAC TVSW /SAVE PRESENT STATUS OF TV SWITCH. DAC TVCL SZA /IF IT WAS ON, JMP TVOFF LAW -1 /TURN OFF DAC TVSW /THE DISPLAY SWITCH JMS TVST /AND THE DISPLAY. TVOFF LAC TVCL /THEN RESET THE DAC TVSW /DISPLAY SWITCH. JMP* CHBUFF /RETURN TO CALLER. C5 5 C777 777 C175 175 BFPTSW 0 .EJECT /SUBROUTINE RDFILE, DOUBLE-BUFFERED READ-INPUT-FILE. BEFORE /FIRST CALL, RDFNOP MUST CONTAIN SOME INSTRUCTION PERMITTING /CONTROL TO FALL THROUGH TO RDFNOP+1. /CALL: JMS RDFILE / LINE BUFFER ADDRESS / RETURN IF NO MORE LINES (EOF CODE IN AC) / NORMAL RETURN RDFILE 0 LAC INFILE /IS THERE AN INPUT FILE PRESENT? SMA /THERE IS NOT IF INFILE IS NON-ZERO. JMP .+4 /IF INFILE .E. ZERO, THERE IS AN INPUT FILE. LAW NOFIL1 /NO FILE, COMPLAIN. JMS TYPOUT /"NO INPUT FILE PRESENT." JMP FND4 /GO READ NEXT COMMAND. LAC* RDFILE /GET LINE OUTPUT ADDRESS. ISZ RDFILE /BUMP TO RETURN. JMS GETBNK /INSERT BANK BITS. DAC RDUP02 /GIVE OUT ADDRESS TO UNPACKER. RDFUPD LAC RDCAL2 /GET LAST BUFFER READ. DAC RDUP01 /UNPACK THAT BUFFER. LAC RDALTB /READ INTO THE OTHER BUFFER. DAC RDCAL2 /.. LAC RDUP01 /UPDATE OTHER-BUFFER POINTER. DAC RDALTB /.. INPTCL INPCAL /ISSUE READ. 10 RDCAL2 RDBUF2 /MODIFIED AT EACH CALL. -BUFLEN RDFNOP NOP /MODIFIED AFTER FIRST TIME THROUGH. LAC RDFJMP /ONE-TIME SECTION TO PRIME READ BUFFERS. DAC RDFNOP JMP RDFUPD /READ AGAIN FIRST TIME ONLY. RDFJMP JMP .+1 LAC* RDUP01 /GET BUFF HEADER. AND C7 /THROW AWAY JUNK. SAD C5 /END OF FILE? SKP /YES, SO INDICATE. SAD C6 /OR END OF MEDIUM? JMP RDFEOF /YES, TAKE EOM RETURN. LAC* RDUP01 /CHECK FOR READ AND LONG-LINE ERRORS, GET BUFFER HEADER. AND C60 /EXTRACT ERROR BITS. DAC ERRSW /SAVE AS ERROR-PRESENT INDICATOR. JMS UNPACK /CALL UNPACK. RDUP01 0 /CURRENT READ BUFFER ADDRESS. RDUP02 0 /CALLER'S LINE BUFFER AREA. ISZ RDFILE /INDEX TO RETURN. JMP* RDFILE /RETURN TO CALLER. RDFEOF LAC NOPLIT DAC RDFNOP JMP* RDFILE /RETURN TO CALLER. RDALTB RDBUF1 .EJECT /SUBROUTINE WRFILE, DOUBLE-BUFFERED WRITE-OUTPUT-FILE. /CALL: JMS WRFILE / RETURN WRFILE 0 LAC OUTPSW /IS OUTPUT WANTED? (OUTPSW SET BY OUTPUT ON/OFF COMMAND. SZA /SKIP IF OUTPUT IS ON. JMP* WRFILE /OTHERWISE IGNORE THIS CALL. LAC WRPAK2 /EXCHANGE BUFFER ADDRESSES. GET BUFFER USED LAST. DAC RDFILE /SAVE THAT ADDRESS TEMPORARILY. LAC WRALTB /GET START OF ALTERNATE BUFFER. DAC WRPAK2 /USE THAT BUFFER FOR PACKING THIS LINE. DAC WRCAL2 /WRITE FROM THAT BUFFER ALSO. DAC TVWRFL /ADD TO DISPLAY BUFFERS. LAC RDFILE /NOW GET THE FIRST BUFFER AGAIN. DAC WRALTB /AND SAVE AS ALT BUFFER FOR NEXT TIME. JMS PACK /GO PACK THE OUTPUT LINE. INLADR INLINE /LINE TO BE PACKED IS ALWAYS IN INLINE. WRPAK2 WRBUF2 /MODIFIED EACH TIME TO POINT TO "CURRENT" BUFFER. JMS TVVP /ADD A LINE TO THE DISPLAY RING BUFFERS. TVWRFL 0 /THIS LINE. LAC OUTSW1 SNA JMP OUTPCL JMS ENTER TFILE1 OUTPCL OUTCAL /WRITE THE LINE JUST PACKED. 11 WRCAL2 0 /UPDATED EACH TIME TO CORRESPOND TO WRPAK2. C1000 1000 /WORD COUNT -- IGNORED BY DEVICE HANDLERS. DZM OUTSW1 /INDICATE SOMETHING WRITTEN INTO OUTPUT FILE. JMP* WRFILE /NO WAIT REQUIRED AFTER WRITING. WRALTB WRBUF1 /MODIFIED EACH TIME TO POINT TO "OTHER" BUFFER. EDLIN .BLOCK LINSIZ /CURRENT COMMAND STRING ARRAY. INLINE .BLOCK LINSIZ /CURRENT INPUT LINE FROM FILE OR KEYBOARD. WRBUF1 .BLOCK BUFLEN .EJECT TYLINE .BLOCK 133 /DEFINE TEMPORARY STORAGE REGISTERS RESIDING IN TYLINE AREA. RNMFIL=TYLINE RENMCT=RNMFIL+6 RNMWRD=RENMCT+1 CALDB1=RNMWRD+1 CALDB2=CALDB1+3 CALDAT=CALDB2+3 RDBUF1 .BLOCK BUFLEN /READ BUFFERS. RDBUF2 .BLOCK .-RDBUF1 /.. WRBUF2 .BLOCK BUFLEN /SUBROUTINE DCODSW, DECODE CONTROL WORDS "OFF" AND "ON". ON EXIT, /C(C(DCODSW)) .E. 0 IF ON, -1 IF OFF. IF NO ARGUMENT IS PRESENT, APPROPRIATE /SWITCH IS SET TO "ON" (0). DCODSW 0 JMS GETCOM /GET PARAMETER TYPED. SNA!CLA /SKIP IF A PARAMETER WAS PRESENT. JMP SETSW /IF NO PARAMETER GIVEN, GO TREAT AS "ON". JMS SCAN /CALL STRING COMPARER. CWD /TYPED PARAMETER IS HERE. OFF /COMPARE WITH "OFF". JMP DCOD01 /NO MATCH THIS TIME. SKP /POSSIBLE MATCH. JMP ILLCWD /ILLEGAL PARAMETER. LAC* STR2 /END OF STRING 2 FOUND? SPA!CLA!CMA /NO, SKIP. JMP SETSW /YES, SET SWITCH TO "OFF" (-1). DCOD01 JMS SCAN /COMPARE AGAIN. CWD /PARAMETER IS STILL HERE. ON /THIS TIME, TRY "ON". SKP /NOT FOUND. SKP /POSSIBLE HIT. JMP ILLCWD /NO MATCH, GO COMPLAIN. LAC* STR2 /ENSURE END OF STRING 2 REACHED. SMA!CLA /SKIP IF SO. JMP ILLCWD /IF NOT, COMPLAIN. SETSW DAC* DCODSW /AC IS EITHER 0 OR 777777 HERE. ISZ DCODSW JMP* DCODSW OFF 117 /"O" 106 /"F" 106 /"F" XCTZRO XCT 0 /BIT 0 = 1 TO TURN OFF STRING COMPARE IN SCAN. ON 117 /"O" SCOM17=ON /.SCOM+17: AC ON TTY INTERRUPTS. 116 /"N" CL7770 777000 .EJECT /SCAN, ATTEMPT TO MATCH TWO CHARACTER STRINGS. /CALL: JMS SCAN / ADDRESS OF STRING TO SEARCH FOR. / ADDRESS OF STRING UPON WHICH SEARCH IS TO BE PERFORMED. / RETURN IF STRING NOT FOUND. / RETURN IF END OF STRING1 FOUND. / RETURN IF END OF STRING2 FOUND. SCAN 0 LAC* SCAN JMS GETBNK DAC STR1 ISZ SCAN LAC* SCAN JMS GETBNK DAC STR2 ISZ SCAN SLOOP1 LAC* STR1 SPA JMP SLP1 LAC* STR2 SPA JMP SLP2 SAD* STR1 SKP JMP* SCAN ISZ STR1 ISZ STR2 JMP SLOOP1 SLP2 ISZ SCAN SLP1 ISZ SCAN JMP* SCAN .EJECT /SUBROUTINE PUTLIN, INSERT A LINE EITHER IN THE CURRENT OUT BUFFER /OR IN THE OUTPUT FILE ITSELF. /CALL: JMS PUTLIN / RETURN IF BUFFER FULL (LINE NOT INSERTED) / NORMAL RETURN. PUTLIN 0 LAC LENGTH DAC BTEMP SNA!CLA!CLL!CML JMP PTOFLO-2 SAD QUIT JMP TTRS SAD PBLKSW /SKIP IF BLOCK MODE IS OFF. SKP!RAL /BLOCK MODE ON. SET AC = 1. JMP WRCAL /BLOCK MODE OFF, GO OUTPUT LINE. DAC NPAIRS /SET INITIAL WORD-PAIR COUNTER. ISZ BTEMP /ACCOUNT FOR A CARRIAGE RETURN. COUNT1 ISZ NPAIRS /COUNT A PAIR. LAW -5 /5 CHARS PER PAIR. TAD BTEMP /ADJUST CHARACTER COUNT. DAC BTEMP /SAVE NEW ONE. SZA!SMA /DONE IF ZERO OR MINUS. JMP COUNT1 /MORE TO DO. LAC NPAIRS /ALL DONE, GET TOTAL PAIRS REQUIRED BY THIS LINE. CLL!RAL /NPAIRS * 2 TO GIVE TOTAL WORDS THIS LINE. ADD NXTPUT /FORM CURRENT ADDRESS + WORDS THIS LINE. DAC BTEMP /SAVE TEMPORARILY. CMA /2'S COMPLEMENT LAST ADDR REQUIRED. TAD BUFEND /COMPARE WITH LAST ADDRESS AVAILABLE. SPA!SNA /LAST NEEDED .L. LAST AVAILABLE, OK. JMP PTOFLO /ERROR OTHERWISE. .EJECT PKCAL JMS PACK ADR009 INLINE NXTPUT 0 /WHERE TO BEGIN WRITING NEXT LINE. LAC NXTPUT /GET ADDRESS OF DAC .+2 JMS TVVP /A LINE TO ADD TO THE DISPLAY RING BUFFERS. 0 LAC NXTPUT SAD CURPUT SKP DAC* CURPUT ADD ONE DAC CURPUT DZM* CURPUT LAC BTEMP DAC NXTPUT DAC BUFEMP DAC BFPTSW PUTRTN ISZ PUTLIN /.. DZM LENGTH PTOFLO JMP* PUTLIN WRCAL LAC PBLKSW SZA JMP WRCAL1 DZM PBLKSW JMP PUTLIN+1 WRCAL1 JMS WRFILE JMP PUTRTN .EJECT /GETLIN, RETURN NEXT LINE FROM CURRENT BUFFER OR FROM INPUT FILE. /CALL: JMS GETLIN / .DSA BUFF / RETURN IF NO MORE LINES TO GET. / NORMAL RETURN GETLIN 0 LAC QUIT SNA JMP TTRS LAC* GETLIN /GET LINE ADDRESS. JMS GETBNK /INSERT HIGH-ORDER BITS. DAC UPKCAL+2 /GIVE TO UNPACKER. DAC RDCAL+1 /AND TO FILE READER. LAC GBLKSW /GET BLOCK MODE. SZA /SKIP IF BLOCK IS ON. JMP RDCAL /READ FROM FILE IF NOT. LAC BUFEMP SNA JMP EMPBUF LAC CURGET /GET POINTER TO NEXT LINE SNA /SKIP IF THERE IS ANOTHER LINE TO GET. JMP EMPBUF /NO MORE LINES. DAC UPKCAL+1 /GIVE TO UNPACKER. UPKCAL JMS UNPACK /CALL UNPACK. PWRD1 0 /FROM. PWRD2 0 /TO. DAC LENGTH ISZ CURGET LAC* CURGET DAC CURGET ISZ GETLIN /BUMP TO RETURN. EMPBUF ISZ GETLIN /.. JMP* GETLIN RDCAL JMS RDFILE PWRD3 0 JMP EMPBUF DAC LENGTH LAC ERRSW SAD C60 JMP TYTRN SNA JMP EMPBUF-1 TYPAR LAW PRTYMS JMS TYPOUT JMP FND3 TYTRN LAW TRNMES JMS TYPOUT JMP FND3 .EJECT /CLOSED SUBROUTINES FOR CHARACTER PACKING AND UNPACKING. /SUBROUTINE UNPACK, IOPS ASCII TO ONE CHAR PER WORD. ON RETURN, /IOPS LINE IS UNPACKED IN "TO" ARRAY AS 7-BIT CHARACTERS, ONE PER /WORD, RIGHT-ADJUSTED WITH LEADING ZEROES. INITIAL LINE FEED (IF /ANY) AND TERMINATING CARRIAGE RETURN (OR ALT MODE) ARE DELETED. IN PLACE /OF THE TERMINATING CHARACTER IS INSERTED ITS 1'S COMPLEMENT (I.E., /000015 BECOMES 777762). THE ACCUMULATOR AND REGISTER "TOTCHR" HOLD POSITIVE /TOTAL NUMBER OF DATA CHARACTERS UNPACKED, EXCLUSIVE OF THE TERMINATOR. /NOTA BENE: UNPACK USES AUTOINDEX REGISTERS 3 AND 6 (LOCATIONS 12 AND 15) /AS INPUT AND OUTPUT POINTERS. /CALL: JMS UNPACK /GO TO UNPACK. / FROM /15-BIT ADDRESS OF WORD 0 OF LINE BUFFER HEADER. / TO /15-BIT ADDRESS OF FIRST CHAR OF OUTPUT LINE. UNPACK 0 /ENTRY TO UNPACK. PKFROM=UNPACK /PK6BT: POINTER TO NEXT CHARACTER IN INPUT ARRAY. PACKTO=UNPACK /PACK: POINTER TO OUTPUT ASCII ARRAY LAC* UNPACK /GET ADDRESS OF INPUT LINE. DAC* C12 /SAVE AS INPUT POINTER (IN LOC 12). ISZ* C12 /ADJUST TO POINT TO FIRST DATA PAIR. ISZ UNPACK /BUMP TO SECOND ARGUMENT. LAC* UNPACK /ARG 2 IS ADDRESS OF OUTPUT LINE. TAD FENCE /DECREMENT BY ONE. DAC* C15 /SAVE AS POINTER TO OUTPUT ARRAY (IN LOC 15). ISZ UNPACK /BUMP TO RETURN. DZM TOTCHR /ZERO TOTAL CHARACTERS IN LINE. DZM FSTSW /INDICATE NO DATA ENCOUNTERED YET. LAC (UNFRT /INITIALIZE G.UNPK ROUTINE DAC HINGE / / NOW ENTER LOOP TO EXTRACT THE CHARACTERS, ONE BY ONE, AUTOMATICALLY / INCREMENTING THROUGH THE WORD PAIRS. / UNPLP1 JMS G.UNPK /UNPACK ONE CHARACTER SNA /ACCEPT ONLY IF NON-NULL. JMP UNPLP1 /NULL CHARACTER, IGNORE. SAD C12 /LINE FEED? JMP UNPLNF /YES, GO IGNORE ONLY IF FIRST CHARACTER IN LINE. SAD C175 /ALT MODE TYPE TERMINATOR? JMP UNPCR /YES, TREAT JUST LIKE CARRIAGE RETURN. SAD C15 /CARRIAGE RETURN? JMP UNPCR /YES, LINE IS COMPLETE. UNPDAC DAC* 15 /REAL ASCII CHAR, DEPOSIT IN OUTPUT ARRAY. DAC FSTSW /INDICATE SOME DATA ENCOUNTERED. ISZ TOTCHR /BUMP TOTAL DATA CHARACTERS SEEN. LAC TOTCHR /GET TOTAL CHARACTERS SEEN. ADD ONE /WILL WE OVERFLOW NEXT TIME? SAD MAXLEN /SKIP IF NOT. JMP UNPOFL /OTHERWISE, STOP NOW. JMP UNPLP1 /GET NEXT CHARACTER UNPOFL LAC C15 /TOO MANY CHARS, GET CARRIAGE RETURN. UNPCR CMA /LINE FINISHED, GET TERMINATOR. DAC* 15 /INSERT AS LAST WORD OF OUTPUT LINE. LAC TOTCHR /PICK UP TOTAL DATA CHARACTERS PROCESSED. JMP* UNPACK /RETURN TO CALLER. UNPLNF LAC FSTSW /LINE FEED FOUND. HAVE WE SEEN ANY BEFORE? SNA /SKIP IF NOT. JMP UNPLP1 /YES, SO TREAT AS NORMAL DATA CHARACTER. LAC C12 /NO, SET TO ACCEPT LATER ONES. JMP UNPDAC /THEN GO IGNORE THIS ONE. / SUBROUTINE G.UNPK: MUST BE INITIALIZED SO THAT 'HINGE' POINTS / TO 'UNFRT'. SUBROUTINE USES AUTO-INDEX REGISTER 12 WHICH MUST / BE INITIALIZED TO POINT TO INPUT 5/7 ASCII. / *** NOTE ***: THE MQ MUST REMAIN UNCHANGED BETWEEN CALLS / G.UNPK XX WORDCT=G.UNPK /PACK: WORD COUNT OF # OF PACKED 5/7 WORDS JMP* HINGE /RETURN TO LAST PROCESSING POINT HINGE UNFRT AND (177 /TRIM TO 7 BITS JMP* G.UNPK / UNFRT LAC* 12 /FETCH 1ST WORD OF NEXT WORD PAIR DAC OBJECT /SAVE IT LMQ LAC* 12 /FETCH 2ND WORD AT THIS TIME BECAUSE WE MUST DAC PWRD2 /USE AUTO-INDEX REGISTER IN 2'S LLS 7 /EXTRACT 1ST CHARACTER JMS HINGE / LLS 7 / 2ND CHARACTER JMS HINGE / LAC PWRD2 /RETRIEVE 2ND WORD OF PAIR LMQ LAC OBJECT /RETRIEVE 1ST WORD LLS 3 /EXTRACT 3RD CHARACTER JMS HINGE / LLS 7 / 4TH CHARACTER JMS HINGE / LLS 7 / 5TH CHARACTER JMS HINGE JMP UNFRT /BEGIN ON NEXT WORD PAIR / / SUBROUTINE G.PACK: MUST BE INITIALIZED SO THAT 'SWING' POINTS / TO 'LEFT' ON THE FIRST CALL. WORDCT MUST BE ZEROED INITIALLY. / *** NOTE ***: G.PACK CLEARS THE MQ / G.PACK XX OBJECT=G.PACK /TEMPORARY STORAGE FOR 'G.UNPK' CLQ!020000 / CLQ!CLL JMP* SWING /RETURN TO LAST PROCESSING POINT SWING LEFT XOR* PACKTO /INCORPORATE THIS CHARACTER WITH DAC* PACKTO /PREVIOUS ONES (IF ANY) JMP* G.PACK / LEFT ISZ WORDCT /COUNT NUMBER OF WORDS PACKED RTR; RTR; RTR; RTR /SHIFT TO AC 0-6 (1ST CHARACTER) DZM* PACKTO /CLEAR 1ST WORD OF PAIR JMS SWING / RTL; RTL /SHIFT TO AC 7-13 (2ND CHAR) JMS SWING / LRS 3 /MOVE TO AC 14-17 & MQ 0-3 XOR* PACKTO DAC* PACKTO /PUT OUT FINAL PART OF 1ST WORD OF PAIR ISZ PACKTO /POINT TO 2ND WORD OF PAIR ISZ WORDCT /COUNT NUMBER OF WORDS DZM* PACKTO /CLEAR 2ND WORD LACQ /MOVE BITS TO AC 0-3 (3RD CHAR) JMS SWING / RTL; RTL; RTL; RTL /MOVE TO AC 3-9 (4TH CHAR) JMS SWING / RAL /SHIFT TO AC 10-16 (5TH CHAR) JMS SWING ISZ PACKTO /POINT TO 1ST WORD OF NEXT PAIR JMP LEFT / /SUBROUTINE PACK, RIGHT-ADJUSTED 7-BIT CHARACTER ARRAY TO HEADERED /IOPS ASCII. TERMINATES ON NEGATIVE WORD IN INPUT ARRAY. /NOTE: USES AUTOINDEX REGISTER 3 (LOCATION 12) AS POINTER TO /INPUT LINE. /CALL: JMS PACK /GO TO PACK. / FROM /15-BIT ADDRESS OF FIRST CHAR OF INPUT ARRAY. / TO /15-BIT ADDRESS OF FIRST WORD OF OUTPUT LINE. PACK 0 /ENTRY TO PACK. LAW -1 TAD* PACK /PICK UP START OF INPUT ARRAY. DAC* C12 /GIVE TO INPUT POINTER. ISZ PACK /BUMP ENTRY TO ARG 2. LAC* PACK /GET ADDRESS OF LINE BUFFER TO FILL. DAC PLBH /SAVE AS ADDRESS OF WORD 0 OF HEADER. TAD (2 /AND ALSO IN OUTPUT POINTER. DAC PACKTO LAC (LEFT /INITIALIZE G.PACK ROUTINE DAC SWING DZM WORDCT /INITIALIZE WORD COUNTER ISZ PACK /BUMP TO RETURN. / GET NEXT CHARACTER FROM INPUT LINE, CHECK FOR / COMPLETION, AND INSERT IN CURRENT PAIR. PLOOP1 LAC* 12 /GET NEXT CHARACTER FROM INPUT ARRAY. SPA /TERMINATOR? (NEGATIVE IF SO.) JMP PCLOSE /YES, GO TRY TO CLOSE THE OUTPUT LINE. JMS G.PACK /PACK IT UP JMP PLOOP1 /COME HERE ON TERMINATOR FOUND IN INPUT ARRAY. PCLOSE CMA /INVERT TERMINATOR. SNA /IS IT NOW A NULL CHARACTER? LAC C15 /IF SO, GET CARRIAGE RETURN. PKNULL JMS G.PACK /GO PUT CARRIAGE RETURN OR ALT MODE AWAY. /COME HERE TO PAD WORD-PAIR WITH NULLS AFTER TERMINATING CHARACTER /HAS BEEN INSERTED. LAC WORDCT /IS WORD COUNT ODD OR EVEN? RAR SZL!CLA JMP PKNULL /PACK WITH NULLS UNTIL WORD COUNT IS EVEN LAC WORDCT TAD (2 /DON'T FORGET THE HEADER WORDS ALSS 10 /GENERATE HEADER XOR (2 DAC* PLBH /RESTORE HEADER IN LINE BUFFER AREA. JMP* PACK /ALL DONE, EXIT. /SUBROUTINE PK6BT, RIGHT-ADJUSTED 7-BIT CHARACTERS TO 3-6 TRIMMED /ASCII, ZERO-FILLED. TERMINATES ON END CODE (BIT 0 = 1) IN INPUT ARRAY /OR WORD COUNT OVERFLOW (COUNT -- 2'S COMPLEMENT -- IN AC AT CALL). /CALL: LAW -MAXWDS /2'S COMPLEMENT WORDS TO FILL. / JMS PK6BT /CALL PK6BT. / FROM /START OF INPUT ARRAY. / TO /START OF OUTPUT ARRAY. PK6BT 0 /ENTRY TO PK6BT. TOTCHR=PK6BT /UNPACK: TOTAL CHARS IN OUTPUT LINE. DAC PK6WDC /SAVE COUNT OF TOTAL WORDS TO FILL. LAC* PK6BT /GET START OF INPUT ARRAY. JMS GETBNK /MAKE IT A 15-BIT ADDRESS. DAC PKFROM /GIVE TO INPUT POINTER. ISZ PK6BT /BUMP TO OUTPUT ADDRESS. LAC* PK6BT /GET START OF OUTPUT ARRAY. JMS GETBNK /MAKE IT 15 BITS LONG ALSO. DAC PK6TO /GIVE TO OUTPUT POINTER. ISZ PK6BT /BUMP TO RETURN. PK6LP1 LAW -3 /THREE CHARS PER WORD. DAC PK6CT1 /SET UP 3-CHARACTER COUNTER. DZM* PK6TO /ZERO NEW OUTPUT WORD. PK6LP2 LAC* PKFROM /GET NEXT CHARACTER FROM INPUT ARRAY. SPA!CLL /IS THIS THE ARRAY TERMINATOR? (NEGATIVE IF SO.)? JMP PK6CLS /YES, GO GENERATE A NULL CHARACTER. AND C77 /NO, EXTRACT RIGHTMOST SIX BITS. DAC PK6CHR /THEN SAVE AS CURRENT CHARACTER. ISZ PKFROM /BUMP INPUT POINTER FOR NEXT TIME. PK6LP3 LAC* PK6TO /GET 3-6 WORD GENERATED SO FAR. RTL /SHIFT IT SIX BITS LEFT TO MAKE ROOM FOR CURRENT CHAR. RTL /.. RTL /.. ADD PK6CHR /THEN INSERT CURRENT CHARACTER. DAC* PK6TO /SAVE NEW 3-6 WORD. ISZ PK6CT1 /COUNT 3 CHARACTERS PACKED IN THIS WORD. JMP PK6LP2 /MORE TO DO, GET NEXT CHARACTER. ISZ PK6TO /ALL DONE WITH THIS WORD, BUMP OUTPUT POINTER. ISZ PK6WDC /COUNT MAXIMUM WORDS IN OUTPUT ARRAY. JMP PK6LP1 /MORE ROOM IN OUTPUT ARRAY, SET UP NEW WORD. PK6RET JMP* PK6BT /OUTPUT ARRAY IS FULL, RETURN TO CALLER. /COME HERE ON TERMINATOR FOUND IN INPUT ARRAY. FILL REMAINDER OF OUTPUT /ARRAY WITH NULL (00) CHARACTERS. PK6CLS DZM PK6CHR /MAKE CURRENT CHAR A NULL. JMP PK6LP3 /AND PUT IT AWAY. NEXT INPUT CHAR WILL BE SAME TERMINATOR .EJECT /EXECUTE SEEK ON NAMED FILE. / JMS SEEK / POINTER TO DEB / RETURN SEEK 0 PK7BTS=SEEK PK6WDC=SEEK LAC INPTCL AND C777 DAC SKCAL LAC* SEEK JMS GETBNK DAC SKCAL+2 ISZ SEEK DZM INFILE SKCAL 0 PK6CHR=SKCAL LSTSW=SKCAL FSTSW=SKCAL 3 0 PK6TO=SKCAL+2 JMP* SEEK /EXECUTE ENTER ON NAMED FILE. / JMS ENTER / POINTER TO DEB / RETURN ENTER 0 LAC OUTPCL AND C777 ADD C1000 DAC ENTCAL LAC* ENTER JMS GETBNK DAC ENTCAL+2 ISZ ENTER ENTCAL 0 4 0 JMP* ENTER /EXECUTE FSTAT ON NAMED FILE. / JMS FSTAT / DEB POINTER (BIT 0 .E. 0, INPUT FILE. / (BIT 0 .E. 1, OUTPUT FILE.) / RETURN (AC .E. -1, NON-FILE-ORIENTED. / (AC .E. 0, NOT FOUND) FSTAT 0 LAC* FSTAT RAL LAC OUTPCL SNL LAC INPTCL AND C777 ADD C3000 DAC FSTCAL LAC* FSTAT JMS GETBNK DAC FSTCAL+2 ISZ FSTAT FSTCAL 0 2 DTYP1 0 /DIRECTORY TYPE CODE IN BITS 0-3. DAC FSTCAL LAC DTYP1 AND CL7000 SZA!CLA!CMA LAC FSTCAL JMP* FSTAT /EXECUTE CLOSE ON IN OR OUT FILE. / JMS CLSFIL (AC .E. 0 IF INPUT, AC BIT 0 .E. 1 IF OUTPUT.) / RETURN CLSFIL 0 RAL LAC INPTCL SZL LAC OUTPCL AND C777 DAC CLSCAL CLSCAL 0 6 JMP* CLSFIL /RENAME A FILE. / JMS RENAME / DEB1 (BIT 0 .E. 0, INPUT; BIT 0 .E. 1, OUTPUT.) / DEB2 / RETURN RENAME 0 LAW -2 DAC RENMCT LAC* RENAME RAL LAC INPTCL SZL LAC OUTPCL AND C777 ADD C2000 DAC RNMCAL LAW RNMFIL-1 JMS GETBNK DAC* C15 RNMLP1 LAW -3 DAC RNMWRD CLA!CMA TAD* RENAME ISZ RENAME JMS GETBNK DAC* C12 RNMLP2 LAC* 12 DAC* 15 ISZ RNMWRD JMP RNMLP2 ISZ RENMCT JMP RNMLP1 RNMCAL 0 2 DEB1 RNMFIL JMP* RENAME /EXECUTE DELETE ON NAMED FILE. DELFIL 0 LAC* DELFIL JMS GETBNK DAC DELNAM LAC* DELFIL RAL LAC OUTPCL SNL LAC INPTCL AND C777 ADD C1000 DAC DELCAL DELCAL 0 2 DELNAM 0 ISZ DELFIL JMP* DELFIL /SUBROUTINE CLSOUT, CLOSE INPUT AND OUTPUT FILES. CLSOUT 0 JMS PUTLIN JMP FULBUF LAW -1 DAC BLOKSW JMS RSBUFF LAC PBLKSW SZA JMP CLS01 JMS CHBUFF LAW -1 DAC PBLKSW JMS RSBUFF JMS CHBUFF DZM BUFEMP CLS01 LAC INFILE /IS THERE AN INPUT FILE PRESENT? SPA /SKIP IF SO. JMP CLS01A /IF NOT, GO TRY TO CLOSE OUTPUT FILE. CLS01B JMS PUTLIN /WRITE OUT THE CURRENT LINE. NOP /.. JMS GETLIN INLINE SKP!CLA JMP CLS01B /MORE TO DO, GO WRITE THIS LINE. JMS CLSFIL /CLOSE THE INPUT FILE. CLS01A LAC OUTSW1 /HAS ANYTHING BEEN PUT INTO THE OUTPUT FILE? SPA!CLA!CMA /SKIP IF SO. JMP EMPFIL /NOTHING IN FILE, GO COMMENT. JMS CLSFIL LAC INFILE /IS THERE AN INPUT FILE PRESENT? SPA /SKIP IF SO. JMP CLS03 /IF NOT, GO DEAL WITH OUTPUT FILE. LAC OUTDEV /IS THE OUTPUT DEVICE FILE-STRUCTURED? SPA /SKIP IF SO. JMP* CLSOUT /OTHERWISE, RETURN TO CALLER. LAC SAVESW /IS A SAVE WANTED? SZA /SKIP IF SO. JMP CLS02 /IF NOT, GO CLOSE AS USUAL. JMS FSTAT /CHECK FOR PRESENCE OF SAVNAM. SAVNAM /.. SZA /NOT FOUND, SKIP. JMP SAVERR /SAVNAM IS IN USE, COMPLAIN. JMS RENAME /NAME IS OK, RENAME THE INPUT FILE. INNAME /.. SAVNAM /.. LAW -1 /TURN OFF SAVESW. DAC SAVESW /.. JMP CLS03 CLS02 JMS DELFIL INNAME CLS03 JMS FSTAT XCT INNAME SZA JMP CLSERR JMS RENAME XCT TFILE1 INNAME LAC FILSTR SMA /SKIP IF NON-FILE-ORIENTED. JMS CHDAT /FILE-ORIENTED, GO EXCHANGE DAT ASSIGNMENTS. JMP* CLSOUT /AND RETURN TO CALLER. /COME HERE ON FILE-NAME DIFFICULTIES DURING CLOSE SEQUENCE. CLSERR LAC OUTPCL-1 /ADDRESS OF .TFIL1 EDT DIR ENTRY BLOCK. DAC CLSENT /SET UP TO USE THAT NAME. LAC FILSTR /BOTH DEVICES FILE-STRUCTURED? SPA /SKIP IF SO. JMP SETF1 /IF NOT, SKIP ALL THIS STUFF. LAC* INPDAT /FILES ON SAME UNIT AND DEVICE? XOR* OUTDAT /.. SNA /SKIP IF FILES ON DIFFERENT UNITS OR DEVICES. JMP SETF1 /SAME UNIT, DON'T BOTHER SWITCHING. LAC DIRSW /WHICH DIRECTION ARE WE GOING? SPA /SKIP IF GOING FROM -14 TO -15. JMP SETF1 /GOING BACK TO -14, EVERYTHING OK. /COME HERE ON TROUBLE TRYING TO CLOSE ON -15. JMS CHDAT /GO CHANGE DAT SLOTS AROUND. JMS FSTAT /IS THERE A .TFIL1 EDT ON -14? XCT TFILE1 /-14 IS NOW THE OUTPUT DAT SLOT. SZA /SKIP IF .TFIL1 EDT IS NOT PRESENT. JMP SETF1 /.TFIL1 EDT IS THERE, GO COMMENT. JMS FSTAT /MAYBE ORIGINAL FILE NAME IS THERE. CLSINN XCT INNAME /.. SZA /SKIP IF INNAME IS OK FOR -14. JMP CLSSK /NOT OK, USE .TFIL1 EDT. LAC CLSINN /USE INNAME. DAC CLSENT /.. CLSSK JMS SEEK /SEEK THE INPUT FILE. TFILE1 JMS ENTER /OPEN UP THE OUTPUT FILE. CLSENT 0 /INNAME OR .TFIL1 DZM OUTSW1 /FORESTALL ANOTHER ENTER. CLSRD JMS RDFILE /READ A LINE. INLINE JMP CLSCLS /IF EOF ENCOUNTERED. JMS WRFILE /WRITE THE LINE READ. JMP CLSRD /GO FOR MORE. /COME HERE ON COMPLETE FILE TRANSFERRED. CLSCLS CLA!CMA JMS CLSFIL /CLOSE THE OUTPUT FILE. CLA JMS CLSFIL /CLOSE THE INPUT FILE, TOO. JMS DELFIL /THEN DELETE THE INPUT FILE. TFILE1 /.. SETF1 LAW INNAME JMS TYNAME LAW TWOFIL JMS TYPOUT LAW NUFIL1 JMS TYPOUT LAC OUTPCL RTR LAW 64 SZL ADD ONE JMS TYONCH LAW NUFIL2 JMS TYPOUT LAC CLSENT JMS TYNAME JMS TYPRTN LAW OLDEL JMS TYPOUT JMP BEGIN SAVERR JMS RENAME INNAME SAVNM2 LAW SAVNAM JMS TYNAME LAW TWOFL1 JMS TYPOUT LAW SVNMES JMS TYPOUT JMP CLS03 EMPFIL LAW EMPFLM JMS TYPOUT JMP BEGIN /START AGAIN. SAVNAM .BLOCK 3 SAVNM2 .SIXBT 'SAVFILEDT' /COMMON EXIT ROUTINE. EXIT NOP /ASSEMBLE NOP FOR ALL SYSTEMS. / .IFUND BULKST / .LOC EXIT / JMP ILLCWD /IF PAPER TAPE SYSTEM, DON'T ALLOW EXIT. / .ENDC EXIT1 CAL C15 15 ALTXIT .EJECT /CLOSED SUBROUTINES FOR TYPEWRITER INPUT AND OUTPUT. /SUBROUTINE TYPOUT, SET UP AND ISSUE CAL FOR IOPS ASCII OUTPUT MESSAGE. /CALL: LAW OUTMSG /START ADDRESS (HEADER WORD 0) OF MESSAGE TO PRINT. / JMS TYPOUT /GO TO TYPOUT. TYPOUT 0 /ENTRY TO TYPOUT. JMS GETBNK /GET SOME EPC BITS. DAC TTOUT /INSERT 15-BIT ADDRESS IN CAL SEQUENCE. TTOCAL /IOPS MODE WRITE TO TTY. TAB 11 /.. TTOUT 0 /START OF LINE BUFFER. SRCNAM .SIXBT 'SRC' /WORD COUNT -- IGNORED BY TELETYPE HANDLER. TTOCAL /WAIT FOR PRINTING TO FINISH. C12 12 /.. JMP* TYPOUT /RETURN TO CALLER. /SUBROUTINE TYPEIN, SET UP AND ISSUE CAL FOR IOPS ASCII INPUT LINE. /CALL: LAW INBUFF /WHERE TO PUT INCOMING LINE. / JMS TYPEIN /GO TO TTY READER. TYPEIN 0 /ENTRY TO TYPEIN. JMS GETBNK /INSERT EXTENDED-MEMORY BITS. DAC TTIN /GIVE TRUE (15-BIT) ADDRESS TO CAL SEQUENCE. TTICAL /ISSUE CAL. 10 /READ. TTIN 0 /ADDRESS OF LINE BUFFER. -BUFLEN /DON'T OVERFLOW BUFFER. TTICAL /WAIT FOR USER TO FINISH. 12 /.. JMP* TYPEIN /RETURN TO CALLER. /SUBROUTINE TYNAME, TYPE OUT FILE NAME STORED IN DEB FORMAT. /CALL: LAW DEBADR /START ADDRESS OF DEB TO TYPE OUT. / JMS TYNAME /GO PRINT IT. TYNAME 0 /ENTRY TO TYNAME. STARSW=TYNAME /GETOCT: INDIRECTION-WANTED INDICATOR. JMS GETBNK /13-BIT ADDRESS OF DEB IS IN AC AT CALL. DAC ERNAME /SAVE 15-BIT ADJUSTED ADDRESS. LAW FILMES /TYPE "FILE". JMS TYPOUT /.. JMP LAWBLK /THEN PRINT OUT A BLANK. TYNSW1 LAW -3 /WILL BE -2 WHEN CONTROL FIRST COMES HERE. DAC LOOPCT /COUNT TWO WORDS (FILE NAME) OR ONE WORD (EXT). TYNLP1 LAW -3 /COUNT THREE CHARACTERS EACH WORD. DAC CHRCT /.. LAC* ERNAME /GET NEXT WORD FROM DIRECTORY ENTRY BLOCK. DAC ERWORD /SAVE AS CURRENT WORD. TYNLP2 LAC ERWORD /GET CURRENT WORD. NEXT CHAR IS IN BITS 0-5. RTL /SHIFT OUT SIX BITS. RTL /.. RTL /.. DAC ERWORD /SAVE REMAINDER FOR NEXT TIME. RAL /GET SIXTH BIT FROM LINK. AND C77 /THROW AWAY JUNK. XOR C77 /COMPLEMENT RIGHT SIX BITS ONLY. SAD C77 /NULL CHARACTER? JMP TYNLP3 /YES, IGNORE. TAD LAWBLK /GENERATE SEVENTH (LEFTMOST) BIT. XOR C77 /RESTORE RIGHTMOST FIVE BITS. XOR LAWBLK /RESTORE SIXTH BIT. JMS TYONCH /GO TYPE OUT THIS CHARACTER. TYNLP3 ISZ CHRCT /COUNT CHARS PER WORD. JMP TYNLP2 /MORE CHARS IN THIS WORD, GO GET NEXT ONE. ISZ ERNAME /CURRENT WORD EMPTY, SERVICE NEXT ONE. ISZ LOOPCT /COUNT WORDS IN THIS PORTION OF DEB. JMP TYNLP1 /ANOTHER WORD TO TREAT, DO SO. LAWBLK LAW 40 /FILE NAME OR EXT FINISHED, GET BLANK. JMS TYONCH /TYPE IT OUT. ISZ TYNSW1 /COUNT THREE BLANK CHARS TYPED. JMP TYNSW1 /ANOTHER GROUP TO DO. LAW -3 /ALL DONE, RESET TYNSW1 FOR NEXT TIME. DAC TYNSW1 /.. JMP* TYNAME /RETURN TO CALLER. FILMES 002002 /HEADER WORD 1: 2 PAIRS, IOPS ASCII. C2000 2000 /CHECKSUM -- IGNORED BY TELETYPE HANDLER. .ASCII 'FILE'<175> /SUBROUTINE TYONCH, OUTPUT SINGLE CHARACTER IN AC. /NO WAIT REQUIRED BEFORE STORING C(AC) IN SINGCH. /CALL: LAW CHAR /CHARACTER TO BE TYPED IN AC(11-17). / JMS TYONCH /GO TO TYONCH. TYONCH 0 /ENTRY TO TYONCH. DAC SINGCH /STORE CHAR TO TYPE IN IMAGE ASCII LINE BUFFER. TTOCAL+1000 /IMAGE MODE WRITE TO TTY. 11 /.. ADR000 CHRMS /ADDRESS OF OUTPUT MESSAGE. CHRCT 0 /WORD COUNT -- IGNORED BY TELETYPE HANDLER. JMP* TYONCH /RETURN TO CALLER. CHRMS 002003 /HEADER WORD 0: 2 PAIRS, IMAGE ASCII. C3000 3000 /CHECKSUM -- IGNORED BY TELETYPE HANDLER. SINGCH 0 /CHARACTER TO BE TYPED IN BITS 11-17. C177 177 /RUBOUT WILL TURN OFF TYPING. /SUBROUTINE TYPRTN, PRODUCE CARRIAGE-RETURN AND LINE-FEED ON TELETYPE. /CALL: JMS TYPRTN TYPRTN 0 /ENTRY TO TYPRTN. OCTNUM=TYPRTN /GETOCT: RESULTS REGISTER. TTOCAL /OUTPUT CAL TO TELETYPE HANDLER. C6 6 /.CLOSE WILL GENERATE CR/LF. JMP* TYPRTN /RETURN TO CALLER. .EJECT /SUBROUTINE GETBNK, ADD EXTENDED MEMORY BITS REFERENCING CURRENT /BANK TO 13-BIT ADDRESS IN AC. /CALL: LAW ADDR /GET ADDRESS TO BE MODIFIED. / JMS GETBNK /CALL GETBNK. GETBNK 0 /ENTRY TO GETBNK. CWCHRC=GETBNK /GETCOM: MAXIMUM CHARACTERS POSSIBLE IN LEGAL COMMAND WORD. AND ADRMSK /EXTRACT 13-BIT ADDRESS FROM AC. (ADRMSK=017777) DAC GBADR /SAVE TEMPORARILY. LAC GETBNK /GET ENTRY. AND BNKMSK /EXTRACT EPC BITS. (BNKMSK=060000) ADD GBADR /NOW RETRIEVE 13-BIT ADDRESS. JMP* GETBNK /EXIT WITH 15-BIT ADDRESS IN AC. .EJECT /SUBROUTINES FOR DISPLAYING OUTPUT ON VP09 STORAGE SCOPE. / / /START OR STOP DISPLAY, DEPENDING ON TVSW. / CALL: JMS TVST / WILL START THE VP09 AND DISPLAY ALL LINES IN THE RING BUFFERS IF / TVSW=0(ON) OR .CLOSE(ERASE) THE DISPLAY IF TVSW=-1(OFF) / TVST XX /INITIALIZE AND RESET DISPLAY. TVST10 .INIT TVDAT,1,0 /INIT DISPLAY DZM TVLCT /RESET COUNT OF DISPLAYED LINES LAC TVSW /CHECK ON STATUS OF TV SWITCH. SZA /GO DISPLAY BUFFERS IF ON. JMP* TVST /RETURN IF OFF. /DISPLAY ALL THE LINES IN THE RING OF BUFFERS LAC TVSPTR /FIRST LINE IN BUFFERS. DAC TVCPTR LAW -TVNLN /NUMBER OF BUFFERS. DAC TVCNT TVST12 LAC* TVCPTR /GET BUFFER POINTER. SNA JMP* TVST /NO MORE LINES IF 0, RETURN. DAC TVTEMP ISZ TVCPTR /POINT AT HEADER PAIR, LAC TVCPTR DAC .+3 /INSERT BUFFER ADDRESS IN WRITE CAL .WRITE TVDAT,2,0,0 /WRITE TO DISPLAY, IOPS ASCII ISZ TVLCT /INCREMENT LINE COUNT. LAC TVTEMP /RESET POINTER DAC TVCPTR /TO NEXT BUFFER. ISZ TVCNT /CHECK BUFFER COUNT. JMP TVST12 /RECYCLE. JMP* TVST /ALL LINES DONE, RETURN. / / /DISPLAY THE CURRENT LINE,UNPACKED, FROM INLINE. / CALL: JMS TVCL / WILL DISPLAY THE CURRENT LINE IF TVSW=0(ON) / TVCL XX LAC TVSW /TV ON OR OFF SZA /0=ON JMP* TVCL /OFF, NO ACTION. /PACK LINE TO BE DISPLAYED JMS PACK /SACK INTO IOPS ASCII INLINE /FROM (CURRENT LINE) TYLINE /TO /DISPLAY IS RUNNING,ADD THE LINE TO IT. LAW -40 /CHECK IF SCREEN IS FULL (32 LINES) TAD TVLCT SMA JMS TVST /FULL SCREEN,GO RESTART DISPLAY. ISZ TVLCT /INCREMENT LINE COUNT. .WRITE TVDAT,2,TYLINE,0 /WRITE THE LINE. .WAIT TVDAT /WAIT TO AVOID CATCHING UP WITH DISPLAY. JMP* TVCL /RETURN. / / /ADD A LINE TO THE DISPLAY RING BUFFERS. / CALL: JMS TVVP / BUFFER POINTER / WILL ADD THE PACKED LINE AT BUFFER POINTER TO THE DISPLAY RING / BUFFERS, REGARDLESS OF TVSW. / TVVP XX LAC* TVVP /GET ARGUMENT ISZ TVVP /POINT TO RETURN LOCATION. DAC TVTEMP /SAVE ARGUMENT. /INSERT PACKED LINE FROM ARGUMENT INTO DISPLAY BUFFER RING. TVVP10 XX /SWITCH FOR BUFFERS FULL OR BEING FILLED. /BUFFERS FULL, REPLACE OLD FIRST BY NEW LAST LINE. LAC TVSPTR /POINTS TO FIRST LINE. TAD (1 DAC TVCPTR /POINTS TO HEADER PAIR. LAC* TVSPTR /BUFFER POINTER TO NEXT BUFFER, DAC TVSPTR /WHICH BECOMES NEW FIRST LINE. JMP TVVP30 /GO MOVE TYLINE TO TVCPTR /BUFFERS BEING FILLED. TVVP20 LAC TVCPT2 /POINTS TO FIRST EMPTY BUFFER. TAD (1 DAC TVCPTR /POINTS TO HEADER PAIR. TAD (BUFLEN /POINTS TO NEXT BUFFER. SAD TVBPTR /IF THIS IS THE LAST BUFFER JMP TVVP24 /GO MAKE IT POINT TO THE FIRST ONE. TVVP22 DAC* TVCPT2 /SET BUFFER POINTER DAC TVCPT2 /SET FIRST-EMPTY POINTER. JMP TVVP30 /GO MOVE TYLINE INTO TVCPTR. TVVP24 LAC NOPLIT /NOP INTO BUFFERS-FULL SWITCH DAC TVVP10 LAC (TVBUF1 /ADDR OF FIRST BUFFER INTO LAST BUF PTR. JMP TVVP22 /MOVE LINE INTO BUFFER POINTED AT BY TVCPTR. TVVP30 LAW -BUFLEN /BUFFER LENGTH DAC TVCNT /INTO COUNTER. TVVP32 LAC* TVTEMP /GET A WORD FROM THE LINE. DAC* TVCPTR /INSERT INTO BUFFER. ISZ TVTEMP /NEXT WORD. ISZ TVCPTR /... ISZ TVCNT /CHECK COUNT, JMP TVVP32 /RECYCLE. JMP* TVVP /RETURN. / / /BACK THE DISPLAY LINE COUNTER UP ONE LINE. / CALL: JMS TVMLF / REPOSITIONS THE DISPLAY UP ONE LINE AND REDUCES THE LINE / COUNT BY ONE, IF TVSW=0(ON) / TVMLF XX LAC TVSW /CHECK TV ON OR OFF SZA /0=ON JMP* TVMLF /OFF,NO ACTION .WRITE TVDAT,2,TVNOLF,0 LAC TVLCT /SUBTRACT 1 FROM LINE COUNT. TAD FENCE DAC TVLCT JMP* TVMLF / / /CROSS OUT A LINE ON THE DISPLAY. / CALL: JMS TVXUT / CAUSES A BROKEN LINE TO BE DRAWN THROUGH THE DISPLAY LINE / BEFORE THE ONE ABOUT TO BE WRITTEN, IF TVSW=0(ON). / TVXUT XX LAC TVSW /CHECK TV ON OR OFF SZA /0=ON JMP* TVXUT /OFF, NO ACTION JMS TVMLF /BACK UP TO PREVIOUS LINE. ISZ TVLCT /BUMP LINE COUNT FOR THIS WRITE. .WRITE TVDAT,2,TVDASH,0 /CROSS OUT LINE. JMP* TVXUT /RETURN /DISPLAY CONSTANTS AND STORAGE. TVNLN=5 TVSPTR TVBUF1 /POINTS TO LOGICALLY 1ST BUFFER TO DISPLAY TVBUF1 .BLOCK BUFLEN+1*TVNLN /RING BUFFER FOR TVNLN LINES TVBPTR . /END OF BUFFERS TVCPTR 0 /CURRENT BUFFER POINTER TVCPT2 TVBUF1 /...USED BY BUFFER FILLER TVCNT /COUNTER TVLCT /LINES ON THE SCREEN TVON -1 /DISPLAY ON INDICATOR TVLF=22 /VP09 LINE FEED, RASTER UNITS TVDAT=10 /VP09 .DAT SLOT TVNOLF TVNO-.*400+2 0 .ASCII <20><35><175> TVNO=. TVDASH TVDEND-.*400+2 TVTEMP 0 /TEMPORARY STORE .ASCII '----------------------------------------' .ASCII '------------------------------'<15> TVDEND=. .EJECT /MESSAGES OUT. EDTMES ENDED1-.*400+2 BUFSIZ -67 /LINES PER BLOCK MODE BUFFER LOAD (INITALLY 55(10)). .IFUND BF .ASCII ' EDITVP V9UOW'<15> .ENDC .IFDEF BF .ASCII ' EDITVP BF9UOW'<15> .ENDC ENDED1=. ERREQM ENDERQ-.*400+2 BNUM 0 /PARTIAL RESULT DURING RADIX CONVERT OF NUMERIC ARGS. PK5CHR=BNUM /5-CHARACTER COUNTER FOR PACK-UNPACK. PK6CT1=BNUM .ASCII 'NOT A REQUEST:'<15> ENDERQ=. INPTM ENDINM-.*400+2 FINDSW 0 /INDICATOR FOR FIND AND LOCATE SEQUENCES. .ASCII 'INPUT'<15> OUTSW1=.-1 /-1 IF OUTPUT FILE IS EMPTY, 0 OTHERWISE. ENDINM=. EOFRM ENDEFM-.*400+2 NUMPTR 0 /POINTER TO CURRENT DIGIT IN ARGUMENT STRING. PLBH=NUMPTR /POINTER TO LINE BUFFER HEADER, WORD 0. .ASCII 'END OF FILE REACHED BY:'<15> ENDEFM=. EOMRM ENDEMM-.*400+2 MAXLEN LINSIZ .ASCII 'END OF MEDIUM REACHED BY:'<15> ENDEMM=. EOBRM ENDEBM-.*400+2 NXTPTR 0 /POINTER TO NEXT CHARACTER IN CONTROL WORD STRING. .ASCII 'END OF BUFFER REACHED BY:'<15> ENDEBM=. BOVFLM ENDBOM-.*400+2 .IFUND BF SCOM16 .SCOM+16 .ENDC .IFDEF BF SCOM10 .SCOM+10 .ENDC .ASCII 'BUFFER CAPACITY EXCEEDED BY:'<15> ENDBOM=. NOFIL1 ENDNF1-.*400+2 BUFEMP 0 .ASCII 'NO INPUT FILE PRESENT.'<15> ENDNF1=. NOFLNM ENDNFN-.*400+2 QRETN 0 /QRETN MAY NEVER BE USED EXCEPT FOR ^P PC STORAGE. .ASCII 'NO FILE NAME GIVEN.'<15> ENDNFN=. TOPRQM ENDTRQ-.*400+2 RLFACT 0 /RELOCATION AUGMENT FOR PA AND PL. .ASCII 'TOP REQUEST NEEDED.'<15> ENDTRQ=. TWOFIL ENDTF-.*400+2 GBADR 0 .ASCII 'IS PRESENT ON OUTPUT DEVICE.'<15> ENDTF=. TWOFL0 ENDTF0-.*400+2 STAR 52 /GETOCT: ASTERISK. .ASCII 'PLEASE RENAME IT OR IT WILL BE DELETED.'<15> ENDTF0=. TWOFL1 ENDTF1-.*400+2 SAVESW -1 .ASCII 'IS PRESENT ON INPUT DEVICE.'<15> ENDTF1=. BADNAM ENDBDN-.*400+2 QUOTE 0 /QUOTE CHARACTER FOR CHANGE REQUEST. .ASCII 'PLEASE USE ANOTHER NAME.'<15> ERWORD=QUOTE ENDBDN=. FILN1 ENDFN1-.*400+2 DELSW 0 /INDICATOR FOR NEXT AND DELETE SEQUENCES. ERNAME=DELSW .ASCII 'NOT FOUND.'<15> .LOC .-1 C7 7 ENDFN1=. EMPFLM ENDEMF-.*400+2 LEN1 0 .ASCII 'NOTHING IN FILE.'<15> .LOC .-1 C17 17 ENDEMF=. PRTYMS ENDPMS-.*400+2 0 .ASCII 'READ ERROR:'<15> .LOC .-1 ADRMSK 17777 ENDPMS=. TRNMES ENDTRN-.*400+2 CL0777 077777 .ASCII 'TRUNCATED:'<15> .LOC .-1 C60 60 ENDTRN=. BFNEMM ENDBNM-.*400+2 CL7000 700000 .ASCII 'BUFFER NON-EMPTY.'<15> ENDBNM=. NUFIL1 ENDNF1-.*400+2 0 .ASCII 'YOUR EDITED FILE IS ON .DAT -1'<175> ENDNF1=. OLDEL ENDOLD-.*400+2 0 .ASCII 'ORIGINAL FILE DELETED.'<15> ENDOLD=. NUFIL2 ENDNF2-.*400+2 0 .ASCII ' AS '<175> ENDNF2=. SVNMES ENDSVM-.*400+2 SLASH 57 /SLASH (/) FOR BRIEF MODE SERVICER. .ASCII 'DATA PRESERVED IN SAVFIL EDT.'<15> ENDSVM=. TFILE1 .SIXBT '.TFIL1' EDNAM .SIXBT 'EDT' EDTM 002002 LENGTH 0 /TOTAL DATA CHARACTERS IN CURRENT LINE. .ASCII 'EDIT'<15> /SUBROUTINE GETCOM, EXTRACT CONTROL WORD FROM TYPED INPUT LINE. /IGNORES LEADING BLANKS IN STRING AND TERMINATES ON FIRST FOLLOWING /BLANK OR END-OF-LINE. IF STRING BEING EXTRACTED EXCEEDS SEVEN CHARACTERS /IN LENGTH, THE RIGHTMOST OVERFLOW CHARACTERS ARE THROWN AWAY. TOTAL /CHARACTERS IN STRING EXTRACTED IS RETURNED TO THE CALLER IN THE AC. GETCOM 0 /ENTRY TO GETCOM. NPAIRS=GETCOM /PUTLIN: TEMPORARY STORAGE. LAC CWDLIT /POINTER TO START OF CONTROL-WORD ARRAY. DAC CWDPTR /SAVE AS CURRENT-CHARACTER POINTER. FIVE70 LAW -10 /LENGTH OF CONTROL-WORD ARRAY (CWD). DAC CWCHRC /SAVE AS MAXIMUM-CHARACTERS COUNTER. DZM NCHARS /ZERO TOTAL CHARACTERS IN CONTROL-WORD STRING. CLL!CML /INDICATE NO CHARACTERS ENCOUNTERED YET. GTNXT JMS NXTCHR /GET NEXT CHARACTER FROM INPUT LINE. JMP GTCLOS /NO MORE CHARACTERS, CLOSE OUT ARRAY. SAD BLANK /SUCCESS. IS CHARACTER A BLANK? JMP BLKFND /YES, MAKE SURE SOME DATA PRECEDED IT. CLL /NO, INDICATE SOME NON-BLANK CHARACACTER HAS BEEN FOUND. ISZ CWCHRC /BUMP MAXIMUM-CHARACTERS-ALLOWED. JMP GTCPUT /NO OVERFLOW YET, PUT CHARACTER AWAY. CLC /SEVEN CHARACTERS INSERTED, DON'T ALLOW ANY MORE. DAC CWCHRC /RESET CWCHRC TO -1. JMP GTNXT /THEN GO LOOK FOR BLANK OR TERMINATOR. /COME HERE TO INSERT DATA CHARACTER IN CWD ARRAY. GTCPUT DAC* CWDPTR /PUT CHARACTER AWAY. ISZ CWDPTR /BUMP POINTER FOR NEXT TIME. ISZ NCHARS /AND BUMP CHARACTERS PROCESSED. JMP GTNXT /THEN GO FOR NEXT CHARACTER. /COME HERE ON BLANK FOUND IN INPUT LINE. BLKFND SZL!CLA!CMA /SKIP IF THIS S NOT A LEADING BLANK. JMP GTNXT /LEADING BLANK, IGNORE IT. GTCLOS DAC* CWDPTR /NOT LEADING BLANK, THEN TERMINATE STRING (AC = -1 NOW). LAC NCHARS /PICK UP TOTAL CHARACTERS IN STRING. JMP* GETCOM /AND RETURN TO CALLER. CWD .BLOCK 10 /ROOM FOR LONGEST LEGAL CONTROL WORD AND TERMINATOR. /SUBROUTINE NXTCHR, RETURN NEXT 7-BIT CHARACTER FROM UNPACKED INPUT /ARRAY. NXTPTR MUST BE SET TO BEGINNING OF ARRAY BEFORE FIRST CALL. /CALL: JMS NXTCHR /GO TO NXTCHR. / JMP DONE /RETURN HERE IF END-OF-LINE ENCOUNTERED. / DAC CHAR /RETURN HERE WITH CHARACTER IN AC. NXTCHR 0 /ENTRY TO NXTCHR. TNUM=NXTCHR /GETNUM: TEMPORARY STORAGE. LAC* NXTPTR /GET NEXT CHARACTER. SPA /TERMINATOR? JMP* NXTCHR /YES, RETURN IMMEDIATELY. ISZ NXTPTR /OTHERWISE BUMP POINTER FOR NEXT TIME. ISZ NXTCHR /AND BUMP RETURN ADDRESS. JMP* NXTCHR /THEN RETURN TO CALLER WITH CHARACTER IN AC 11-17. /SUBROUTINE GETNUM, RETURN BINARY VALUE IN AC OF THE DECIMAL /ARGUMENT IN THE CONTROL WORD STRING. NUMBER IS RETURNED IN NEGATIVE (2'S /COMPLEMENT) FORM. IF NO PARAMETER IS PRESENT, AC = 777777. THE /APPEARANCE OF ANY NON-NUMERIC IN THE PARAMETER STRING CAUSES /TRANSFER OF CONTROL TO ILLCWD AND SUBSEQUENT DISREGARD OF THE /ENTIRE COMMAND. GETNUM 0 /ENTRY TO GETNUM. JMS GETCOM /GET NEXT CONTROL-WORD STRING. LAC CWDLIT /SET DIGIT POINTER TO DAC NUMPTR /BEGINNING OF CONTROL-WORD STRING. DZM BNUM /SET INITIAL RESULT TO ZERO. GTNLP LAC* NUMPTR /ENTER MAIN LOOP, GET NEXT DIGIT FROM INPUT STREAM. SPA /TERMINATOR CHARACTER? JMP GTNRTN /YES, GO TO RETURN. AND C17 /NO, MASK OFF NUMERICS. DAC TNUM /SAVE NUMERICS. XOR* NUMPTR /ZERO NUMERICS, REINSERT ZONE BITS. XOR C60 /THEN ZERO ZONE BITS. THIS ONLY SEEMS TEDIOUS. SZA /BITS 2 AND 3 ON, BIT 1 OFF: NUMBER PRESENT. BADARG JMP ILLCWD /NON-NUMBER OTHERWISE. GO COMMENT. LAC BNUM /GET VALUE COMPUTED SO FAR, THEN MULTIPLY BY 100. CLL!RAL /FORM BNUM * 2. RTL /BNUM * 8. ADD BNUM /BNUM * 9. ADD BNUM /BNUM * 10. ADD TNUM /BNUM PLUS CURRENT DIGIT. DAC BNUM /NEW VALUE. ISZ NUMPTR /BUMP POINTER TO NEXT DIGIT. JMP GTNLP /LOOP TILL DONE. GTNRTN LAC BNUM /ALL FINISHED, GET FINAL VALUE. SZA!CMA /IF BNUM .E. 0, BNUM = 1. TAD ONE /IF BNUM .G. 0, FORM 2'S COMPLEMENT. JMP* GETNUM /RETURN TO CALLER WITH RESULT IN AC. /SUBROUTINE GETOCT, RETURN BINARY VALUE OF OCTAL ARGUMENT IN CONTROL WORD /STRING. BINARY NUMBER IS RETURNED IN AC. GETOCT 0 /ENTRY TO GETOCT. DZM OCTNUM /ZERO RESULTS REGISTER. DZM STARSW /ZERO INDIRECT INDICATOR. GETOC1 JMS GETCOM /MOVE ARGUMENT TO CWD. LAC CWD /GET ARGUMENT. SAD STAR /IS IT AN ASTERISK? SKP /YES, SKIP. JMP GETOC2 /NO, ARGUMENT IS DIRECT ADDRESS. DAC STARSW /INDIRECTION WANTED, SO INDICATE. JMP GETOC1 /THEN GET THE NEXT STRING. GETOC2 LAC CWDLIT /GET START OF CWD ARRAY. DAC NUMPTR /USE AS INPUT POINTER. GETOC3 LAC* NUMPTR /GET NEXT DIGIT. SPA /SKIP IF NOT TERMINATOR. JMP GETOCR /TERMINATOR, GO TO RETURN. AND C7 /DATA CHARACTER, EXTRACT NUMERICS. DAC* NUMPTR /AND SAVE. LAC OCTNUM /GET RESULTS SO FAR. CLL!RAL /MAKE ROOM FOR THIS DIGIT. RTL /.. ADD* NUMPTR /AND INSERT IT. DAC OCTNUM /SAVE NEW RESULT. ISZ NUMPTR /BUMP INPUT POINTER. JMP GETOC3 /AND GO FOR NEXT DIGIT. GETOCR LAC STARSW /ALL DONE, WAS INDIRECTION WANTED? SZA /SKIP IF NOT. JMP .+3 /IF SO, GO GET RIGHT WORD. LAC OCTNUM /GET NUMBER WANTED. JMP* GETOCT /AND RETURN TO CALLER. LAC* OCTNUM /WORD WANTED IS SPECIFIED BY OCTNUM. JMP* GETOCT /RETURN. /COME HERE ON EOF ENCOUNTERED IN INPUT FILE. EOF LAC GBLKSW SZA JMP PRTEOF LAC BFPTSW DAC BUFEMP LAW EOBRM SKP PRTEOF LAW EOFRM JMS TYPOUT EOFCOM JMS PACK ADR010 EDLIN TYLINE LAW TYLINE JMS TYPOUT JMP FND4 IOINIT 0 CWDPTR=IOINIT LAC INPTCL AND C777 DAC .+1 OPICAL /INPUT DEVICE. UNIT1 1 0 INDEV 0 DZM LENGTH LAC ICLSW /CHECK IF ICLOSE SMA!CLC JMP OUTDEV+3 /SKIP .INIT TO OUTPUT DEVICE LAC OUTPCL AND C777 ADD C1000 DAC .+1 OPOCAL /SCRATCH DEVICE. UNIT2 1 0 OUTDEV 0 LAW -1 DAC OUTSW1 /INDICATE NOTHING WRITTEN YET IN OUTPUT FILE DAC INFILE DAC OWFLSW DAC RDFNOP LAW -377 TAD INDEV DAC INDEV SPA DZM INFILE LAC ICLSW /WAS ICLOSE REQUESTED SZA /YES IF ZERO LAW -377 TAD OUTDEV SPA DZM OWFLSW DAC OUTDEV LAC INFILE TAD OWFLSW SAD NAMEIN SKP!CLA CLA!CMA DAC FILSTR CMA DAC BLOKSW DAC PBLKSW CLC DAC ICLSW /RESET ICLOSE SWITCH DZM BFPTSW JMS CHBUFF JMP* IOINIT INFILE -1 OWFLSW -1 ICLSW -1 FILSTR 0 BBUF1 0 /START OF BLOCK BUFFER 1. BBUF2 0 /START OF BLOCK BUFFER 2. BBUFX 0 /LENGTH OF EACH BLOCK BUFFER. INPDAT .SCOM+23 OUTDAT DATM15 /SUBROUTINE CHDAT, CHANGE DAT SLOTS AROUND. CHDAT 0 LAC DIRSW CMA DAC DIRSW LAC OUTPCL DAC RENAME LAC INPTCL DAC OUTPCL LAC RENAME DAC INPTCL DZM OUTPSW JMS IOINIT JMP* CHDAT .EJECT .LOC EDLIN /ONE-TIME SECTION TO SET UP CONSTANT ADDRESSES WITH EPC BITS /TO REFERENCE PROPER (CURRENT) BANK; CALCULATE START OF BLOCK /BUFFERS. CODING RESIDES IN READ-WRITE LINE BUFFER AREAS AND SETS "BEGIN" /TO NOP TO AVOID FURTHER CALLS. SETBNK LAC NOPLIT DAC BEGIN .IFDEF BF LAC* (.SCOM+26 / 0 = FGD; 1 = BGD TAD (.SCOM+16 /POINT TO CORRECT .DAT TABLE DAC INPDAT .ENDC LAW -15 TAD* INPDAT DAC OUTDAT DAC INPDAT ISZ INPDAT LAW ADRTBL JMS GETBNK DAC* C12 ADRLP1 LAC* 12 JMS GETBNK DAC POINTR LAC* POINTR JMS GETBNK DAC* POINTR ISZ ACOUNT JMP ADRLP1 LAC* SCOM2 DAC BBUF1 LAC* SCOM3 JMS GETBNK CMA TAD BBUF1 CMA RAR!CLL DAC BBUFX TAD BBUF1 DAC BBUF2 DZM BFPTSW .IFUND BF LAC* SCOM3 JMS GETBNK CMA TAD* SCOM2 SPA!SNA JMP OK LAW LOAD1 JMS TYPOUT JMP EXIT1 LOAD1 ENDLD1-.*400+2 0 .ASCII '.SYSLD 1'<15> ENDLD1=. .ENDC OK JMS CHBUFF TTICAL 1 ADR012 RECOUP 0 IN2CAL 1 0 SBSIZ 0 LAW -377 TAD SBSIZ SPA JMP BEGIN+1 LAW FSDERM JMS TYPOUT LAW FSDER1 JMS TYPOUT LAW TYLINE JMS TYPEIN LAC TYLINE+2 XOR YES SNA JMP BEGIN+5 JMP EXIT1 FSDERM ENDFSD-.*400+2 0 .ASCII '.DAT -10 IS FILE-ORIENTED.'<15> ENDFSD=. FSDER1 ENDFR1-.*400+2 0 .ASCII 'DO YOU WISH TO CONTINUE'<77><15> ENDFR1=. YES .ASCII 'YES' .LOC .-1 SCOM2 .SCOM+2 ADRTBL=.-1 CWDLIT CWDTOP INLADR EDLADR EDLAD1 FEED SBADR RDCAL2 RDALTB WRPAK2 WRALTB DEB1 CKNM1 CKNM2 CKNM2+1 ADR000 ADR001 ADR002 ADR002+1 ADR003 ADR004 ADR004+1 ADR005 ADR005+1 ADR006 ADR006+1 ADR008 ADR008+1 ADR009 ADR010 ADR010+1 ADR011 ADR011+1 ADR012 ACOUNT ADRTBL-.+1 SCOM3 .SCOM+3 .END BEGIN