File: VISTC.PG of Tape: Sources/Other/new-21-vista-page8
(Source file text)
FILE VISTC - VISTA EDITOR TITLE VERSION 01.21 -- REVISION LEVEL HISTORY / / TITLE DEVICE HANDLER REGION / FREE 0 NO FREE SPACE FROM NOW ON ORG 06600 START OF INPUT DEVICE HANDLER AREA / IDEVH QUT %*,06600 INPUT DEVICE HANDLER / / COME HERE FOR INITIALIZATION / SAVE HIGHEST MEMORY FIELD (NOT USED IN VERSIONS 01.04 AND LATER, / BUT WE LEAVE THIS CODE IN FOR FUTURE ENHANCEMENTS WITH 12K+ MEMORY / FOR SUCH FUTURE FEATURES AS THE HIGH SPEED BLOCK POSITION COMMAND) / AFIELD %* INIT0 DCA FLAG SAVE FLAG SETTING FOR ENTRY TAD $07777 MEMORY COMMAND IN EFFECT? AND =070 ISOLATE MEMORY BITS SZA SKIP IF NOT JMP 2F USE EXPLICIT MEMORY TOP JMS CORE CALL MEMORY ROUTINE JMP INCONT OFF TO CHECK FOR SIZE NOW / 2H TAD =06211 SET CDF TO FIELD 1 AS HIGHEST FIELD DCA MAXF SET AS CDF TO HIGHEST FIELD INCONT TAD FLAG REGET CHAIN/NO-CHAIN FLAG JMPX INIT CONTINUE NOW WITH INITIALIZATION / AFIELD BUF EJECT / / THIS IS THE STANDARD OS/8 ROUTINE FOR DETERMINING CORE SIZE / CORE SUB CAL COR0 CDF 0 TAD CORSIZ GET FIELD TO TEST RTL ... RAL ... AND COR70 MASK USEFUL BITS TAD COREX ... DCA *+1 ... COR1 CDF 0 THIS IS FIELD TO TEST TADI CORLOC SAVE CURRENT CONTENTS COR2 NOP PROTECTION FOR PDP-8 DCA COR1 ... TAD COR2 USE NOP AS PATTERN TO STORE FOR TEST DCAI CORLOC STORE INTO MEMORY COR70 DC 070 NOP FOR PDP-8 TADI CORLOC TRY TO READ IT BACK CORX DC 07400 NOP for PDP-8 TAD CORX GUARD AGAINST 'WRAP-AROUND' TAD CORV ... SZA CLA SKIP IF FIELD EXISTS JMP COREX NON-EXISTENT FIELD EXIT TAD COR1 RESTORE CONTENTS WE DESTROYED DCAI CORLOC ... INC CORSIZ TRY NEXT HIGHER FIELD / JMP COR0 LOOP FOR NEXT / COREX CDF 0 RETURN CDF 0 LDI -1 TAD CORSIZ GET NUMBER OF LAST EXISTING FIELD CLL RAL SHIFT TO CDF POSITION (AC 6-8) RTL ... TAD =06201 BUILD CDF INSTRUCTION DCA MAXF SAVE CDF TO HIGHEST EXISTING FIELD RET CORE ALL DONE HERE / CORLOC DC CORX ADDRESS TO TEST IN EACH FIELD CORV DC 01400 7000+7400+1400=0 CORSIZ DC 1 CURRENT FIELD TO TEST TITLE HEURISTICS PROCESSING ORG 07200 / / NOTE: HEURISTICS ROUTINE MAY BE OVERLAYED BY A DEVICE / HANDLER. IF THIS IS SO, THEN THE /H OPTION IS / SHUT OFF AND THIS FEATURE IS NOT AVAILABLE / ROOM 4 ODEVH JMS ROWCK SKIP IF NOT AT END OF LINE JMP *+2 <1> AT END OF LINE: CONTINUE JMP CHARD <2> NOT AT END OF LINE: IGNORE HEURISTICS / / ARE WE IN A COMMENT FIELD? NOTHING HAPPENS IF SO / LDI -1 -1 SO WE DON'T FIND THE CURRENT CHAR ROOM 4 JMS TCMNT ARE WE IN A COMMENT FIELD? JMP CHARD <1> YES: SO NOTHING SPECIAL HAPPENS / / <2> NO: IS THE CURRENT CHARACTER THE COMMENT FIELD DELIMITER? / TAD THISC REGET CURRENT CHARACTER TAD MCMNT COMPARE WITH SELECTED COMMENT FIELD DELIMITER SZA CLA SKIP IF COMMENT FIELD DELIMITER JMP HEURA ELSE OFF FOR OTHER TESTS. / / HERE WE HAVE THE COMMENT FIELD DELIMITER. IF THE DELIMITER IS / IN COLUMN 8 (START OF OPERATOR FIELD), WE HAVE A FULL COMMENT / LINE, SO ERASE THE CHARACTER, AND PUT IT IN COLUMN 0 FOLLOWED / BY A SPACE, AND SET THE COMMENT FLAG SWITCH TO ALLOW UPPER/LOWER / CASE TO BE USED. / JMS LEFTC MOVE CURSOR TO THE LEFT TAD COL GET NEW COLUMN POSITION JMS PLEN SET LENGTH OF CURRENT ROW / TAD =X:BKSP DO BACKSPACE FUNCTION ON TERMINAL JMSI EXTER ... / TAD COL GET CURRENT COLUMN TAD =-8 IN COLUMNS 0-8? SPA SNA CLA SKIP IF NOT JMP SEMI6 YES: HANDLE THIS / / HERE WE HAVE THE COMMENT FIELD DELIMITER IN PAST COLUMN 8. / THEREFORE WE WANT TO TAB OUT TO COLUMN 32 IF WE ARE NOT YET PAST / COLUMN 32. / SEMI3 TAD COL GET CURRENT COLUMN TAD =-32 PAST COLUMN 32 YET? SMA CLA SKIP IF NOT JMP SEMI4 YES: SO DONE HERE / JMS RTAB NO: SO DO A TAB RIGHT FUNCTION JMP SEMI3 AND TRY AGAIN / / COME HERE TO SET UP AN ENTIRE COMMENT LINE ON THE SCREEN. / SEMI6 DCA COL MARK NOW IN COLUMN 0 (START OF LINE) JMSI EXTER RE-POSITION CURSOR ON THE SCREEN JMS TRUNCLN TRUNCATE LINE AT THAT COLUMN / / COME HERE WHEN WE HAVE PASSED THE 32 COLUMN POSITION / SEMI4 TAD THISC GET CURRENT CHARACTER (DELIMITER) JMS DISCHR DISPLAY CHARACTER/STORE INTO MEMORY / TAD =' FOLLOW WITH BLANK (IMPROVES READABILITY) JMS DISCHR ... JMP CHARD RETURN NOW TO MAIN IDLE LOOP EJECT / / HERE WE ARE NOT IN A COMMENT FIELD AND WE DO NOT HAVE THE COMMENT / CHARACTER. FINAL CHECK IS TO SEE IF WE ARE BETWEEN COLUMNS / 8 AND 15 AND IF WE HAVE JUST GOT A CHARACTER WHICH MARKS THE / END OF THE LABEL FIELD. IF SO, WE WANT TO JUMP COLUMNS 8-15 INTO / COLUMN 0-7 AND THEN TAB OVER TO COLUMN 8. / HEURA LDI -1 (ADJUST FOR PRE-INCREMENT) TAD COL GET CURRENT COLUMN POSITION AND =07770 TEST COLUMN POSITIONS TAD =-010 IN COLUMN 8-15? SZA CLA SKIP IF SO JMP CHARD NO: SO DONE HERE / TAD THISC REGET CURRENT CHARACTER TAD MTAG IS THIS THE CHAR WHICH MARKS A LABEL? SZA CLA SKIP IF SO JMP IDLP NO: SO NOTHING TO DO / / HERE WE HAVE A LABEL. STORE A PAD CHARACTER OVER THE TAB WHICH / WE PUT AT THE START OF THE LINE, THEN REFORMAT THE LINE WHICH / WILL COMPLETELY ELIMINATE THE TAB. / TADI ROW GET CURRENT ROW POINTER DCA TXR1 SET POINTER JUST BEFORE COLUMN 0 LDI PAD GET A PAD CODE DCAI TXR1 STORE PAD CODE OVER TAB DCA COL RESET COLUMN TO ZERO DCA INSF MUST REMOVE INSERT MODE FOR 'REDOLN' JMS REDOLN REFORMAT THE LINE TO KILL THE TAB JMP TABR TAB NOW OVER TO COLUMN 8. EJECT / / SUBROUTINE TO TEST WHETHER THE CURRENT CURSOR POSITION IS TO THE LEFT / OR TO THE RIGHT OF THE COMMENT CHARACTER (IF ANY). THIS IS USED BY / THE HEURISTICS ROUTINES TO SEE WHETHER WE ARE IN A COMMENT FIELD OR / NOT. AC CAN HAVE VALUE OF 1 ON ENTRY TO SKIP COMPARISON OF CURRENT / CHARACTER. IF IN COMMAND MODE, THIS IS TREATED THE SAME AS BEING / TO THE RIGHT OF THE COMMENT DELIMITER / / CALLING SEQUENCE: / / ROOM 4 / JMS TCMNT CALL ROUTINE / <RETURN> <1> IN COMMENT FIELD / <RETURN> <2> NOT IN COMMENT FIELD / ROOM 20 MUST BE ON SAME PAGE TCMNT DC 0 RETURN ADDRESS TAD COL GET CURRENT COLUMN POSITION CMA NEGATE, AND SET DCA CNTR AS LOOP COUNTER TAD CMND GET COMMAND MODE FLAG SZA CLA ARE WE IN COMMAND MODE? JMPI TCMNT YES: TREAT AS IF IN COMMENT FIELD TADI ROW SET POINTER TO START OF ROW DCA TXR1 ... JMP 2F START AT BOTTOM (IN CASE NULL ROW) / / LOOP HERE TESTING EACH CHARACTER ON THE ROW TO SEE IF WE HAVE / THE COMMENT DELIMITER / 1H TADI TXR1 / NEXT CHARACTER FROM ROW TAD MCMNT / COMPARE WITH MINUS COMMENT CHAR SNA CLA / DO WE HAVE A MATCH? JMPI TCMNT / YES: SO TAKE FIRST RETURN / 2H ISZ CNTR / NO: MORE CHARS ON THIS ROW? JMP 1B / YES: SO HANDLE THEM NOW ISZ TCMNT / NO: SO TAKE SECOND RETURN TO CALLER JMPI TCMNT / ALL DONE HERE TITLE CASE INVERSION / / HERE TO HANDLE THE KEY WHICH CAUSES THE CASE OF THE CURRENT / WORD TO BE INVERTED ON A CHARACTER BY CHARACTER BASIS / / IF ANY CHARACTER WAS ORIGINALLY UPPER CASE, IT IS NOW CHANGED / TO LOWER CASE. OTHERWISE, A LOWER CASE IS CHANGED TO UPPER CASE / NOTE THAT THE INVERSION OPERATION PROCEEDS FROM THE CURRENT CURSOR / POSITION TO THE END OF THE CURRENT WORD. / CASE DCA INSF REMOVE INSERT CHARACTER MODE IN CASE SET / / LOOP BACK HERE TO EXAMINE THE NEXT CHARACTER IN THE WORD / 1H JMSI TESTWD GET CHARACTER AND TEST IT SNL CLA SKIP IF NOT AT END OF WORD JMP WRIGHT END OF WORD: END WITH WORD RIGHT NOW / TADI CHARP REGET THE CHAR (CHARP SET BY TESTWD AND =040.XO.-1 IF LOWER CASE, WE CHANGED TO UPPER CASE NOW TAD =-'Z-1 CHECK FOR ALPHA CHARACTER CLL ... TAD ='Z-'A+1 ... SNL CLA SKIP IF ALPHABETIC CHARACTER JMP 2F NOT ALPHA: JUST ECHO CHAR TO MOVE CURSOR / / HERE WE HAVE AN ALPHA CHARACTER, SO INVERT THE CASE. / JMS FLAGLN FLAG MODIFICATION TO CURRENT LINE TADI CHARP REGET CHARACTER UNDER THE CURSOR AND =040 ISOLATE THE CASE BIT SZA CLA SKIP IF BIT WAS CLEAR ORIGINALLY TAD =-040-040 WAS ON: SO TURN IT OFF TAD =040 WAS OFF, SO TURN IT BACK ON / 2H TADI CHARP REGET CHARACTER UNDER THE CURSOR JMS DISCHR MOVE ONTO SCREEN NOW JMP 1B BACK FOR NEXT CHARACTER NOW TITLE TAB LEFT / / HERE FOR THE TAB LEFT FUNCTION WHICH MOVES THE CURSOR / TO THE PRIOR TAB STOP, OR IF THERE WAS NO TAB STOP, / TO THE BEGINNING OF THE CURRENT LINE. / TABL JMS LEFTC MOVE THE CURSOR TO THE LEFT TAD COL GET CURRENT COLUMN POSITION AND =7 TAB STOPS EVERY 8 POSITIONS SNA CLA SKIP IF NOT AT A TAB STOP JMPI PSETX RETURN NOW IF AT TAB STOP JMP TABL ELSE MOVE CURSOR LEFT AND TRY AGAIN TITLE HIGH SPEED CLOSE ROUTINE / / HERE FOR THE HIGH SPEED CLOSE. THE ALGORITHM IS IDENTICAL TO / THAT IN THE ICE EDITOR: WE BLOCK ALIGN THE INPUT BUFFER BY / READING CHARACTERS UNTIL A BLOCK BOUNDARY. THEN WE BLOCK ALIGN / THE OUTPUT FILE BY PADDING IT WITH ASCII NULLS (WHICH ALL OS/8 / ROUTINES, ALMOST WITHOUT EXCEPTION IGNORE). WE THEN COPY OVER / THE REMAINDER OF THE FILE 15 BLOCKS AT A TIME IN IMAGE MODE. / / NOTE: THIS FUNCTION IS NOT AVAILABLE IF THE FOURTH HANDLER / PAGE IS REQUIRED FOR AN I/O DRIVER (IN THAT CASE WE / ALWAYS DO THE SLOW /P TYPE CLOSE) / / READ CHARACTERS AND PUT THEM AWAY UNTIL WE FIND THAT 'RBE' / IS ABOUT TO BE CALLED. / / IF ORIGIN IS BELOW 7400, ORIGIN TO 7400 PAGE NOW (FAST CLOSE IS / REMOVED IF THAT PAGE IS NEEDED FOR A HANDLER) / AIF (*.XO.04000).GE.(07400.XO.04000),.OK ORG 07400 ORIGIN TO 7400 PAGE NOW .OK ANOP / FASTCL TAD BOF GET THE BOTTOM OF FILE FLAG SZA CLA HAS END OF FILE BEEN FOUND YET? JMP 1F YES: SO SUPPLY THE EOF CODE NOW / TAD BESW ABOUT TO READ FIRST BYTE? SNA SKIP IF NOT TAD BEPTR YES: WHERE IS BUFFER POINTER? TAD =-(BBUFE+1) PAST END OF BUFFER? SNA CLA ARE WE ABOUT TO CALL 'RBE'? JMP 2F YES: SO THE INPUT BUFFER IS ALIGNED NOW JMS GETBE NO: GET FROM BELOW SCREEN BUFFER JMS PUTAB ... JMP FASTCL LOOP FOR NEXT CHARACTER / / LOOP HERE STORING ASCII NULL CODES UNTIL THE 'PUTBE' ROUTINE / HAS JUST WRITTEN OUT THE BLOCK / 1H TAD =EOF-NULL ON EOF FOUND, MUST SUPPLY EOF CODE FIRST 2H TAD =NULL STORE ASCII NULL DCA TEMP SAVE FOR A MOMENT DCAX WAB+0 SET FLAG: 'WAB' NOT CALLED YET TAD TEMP REGET THE CHAR (NULL OR EOF CODE) JMS PUTAB PUT INTO THE ABOVE SCREEN BUFFER TADX WAB GET SUBROUTINE ENTRY POINT SNA CLA HAS THE BLOCK BEEN WRITTEN YET? JMP 2B NO: SO WAIT FOR IT EJECT / / BOTH BUFFERS ARE NOW ALIGNED TO A BLOCK BOUNDARY. COPY THE / REMAINING BLOCKS NOW UP TO 15 BLOCKS AT A TIME USING ALL OF / FIELD 1 FROM 10000-17377 AS A LARGE BUFFER. / / FIRST CHECK: ANY MORE BLOCKS TO READ IN THE FORWARD DIRECTION / FROM THE END OF THE TEMPORARY FILE? / 5H TAD TFBVBLK TEMPORARY FILE, BACKWARDS VIRTUAL BLOCK # TAD TFMLEN COMPARE WITH MINUS FILE LENGTH SNA ANY BLOCKS TO READ HERE? JMP 6F NO: TRY AND READ FROM ORIGINAL INPUT FILE CMA IAC CONVERT TO POSITIVE BLOCK COUNT DCA TEMP SAVE IN CASE < 15 BLOCKS TAD TFSBLK GET STARTING BLOCK TAD TFBVBLK PLUS VIRTUAL BLOCK DCA TEMP1 SET ARGUMENT TAD ODEV SET TO READ FROM TEMPORARY FILE JMS COPYBLK OFF TO READ 15 BLOCKS AND THEN WRITE THEM TAD TFBVBLK UPDATE VIRTUAL BLOCK NUMBER DCA TFBVBLK ... JMP 5B LOOP BACK NOW FOR NEXT SET OF BLOCKS / / TRY AND READ SOME BLOCKS FROM THE FORWARD DIRECTION FROM THE / INPUT FILE (IF ANY). / 6H TAD IFVBLK GET INPUT FILE VIRTUAL BLOCK TAD IFMLEN SUBTRACT OUT FILE LENGTH SNA ANY BLOCKS LEFT IN INPUT FILE? JMP 7F NO: SO ALL DONE HERE CMA IAC MAKE THE REMAINING BLOCK COUNT POSITIVE DCA TEMP SAVE BLOCKS TO READ TAD IFSBLK GET INPUT FILE STARTING BLOCK TAD IFVBLK PLUS INPUT FILE VIRTUAL BLOCK DCA TEMP1 SAVE BLOCK TO BE READ TAD IDEV WHERE TO READ BLOCKS FROM JMS COPYBLK READ/WRITE THOSE BLOCKS TAD IFVBLK UPDATE INPUT FILE VIRTUAL BLOCK DCA IFVBLK BY COUNT OF BLOCKS READ JMP 6B LOOP BACK NOW / 7H JMPX ICLOSE OFF TO CLOSE OUT THE FILE NOW EJECT / / SUBROUTINE TO COPY A GROUP OF BLOCKS FROM EITHER THE TEMPORARY / FILE OR THE INPUT FILE, AND THEN COPY THEM TO THE OUTPUT FILE / / ENTRY CONDITIONS: / / AC ADDRESS OF I/O ROUTINE TO CALL / TEMP NUMBER OF BLOCKS TO READ (POSSIBLY > 15) / TEMP1 STARTING BLOCK + VIRTUAL BLOCK / / EXIT CONDITIONS / / TEMP NUMBER OF BLOCKS ACTUALLY READ AND COPIED / COPYBLK DC 0 RETURN ADDRESS DCA TEMP2 SAVE ENTRY POINT TO DEVICE HANDLER TAD TEMP REGET COUNT OF BLOCKS TAD =-15 ARE THERE MORE THAN 15 BLOCKS LEFT? SPA SNA CLA SKIP IF SO JMP *+3 NO: SO CONTINUE / TAD =15 YES: SO JUST READ 15 BLOCKS DCA TEMP ... / TAD TEMP GET BLOCK COUNT CLL RTR MOVE TO AC 1-5 RTR ... RTR ... TAD =1.LS.3 READ INTO FIELD 1 CDF %* ADJUST FIELD NOW FOR STORING ARGUMENTS DCA 1F STORE OS/8 FUNCTION WORD TAD TEMP1 GET BLOCK START+VIRTUAL BLOCK DCA 2F STORE BLOCK NUMBER / / ALSO COME BACK HERE TO REPEAT OPERATION AFTER ERROR / ROOM 14 0H JMSI TEMP2 CALL DEVICE HANDLER 1H DC 0 OS/8 FUNCTION WORD DC 0 STARTING AT LOCATION ZERO 2H DC 0 BLOCK NUMBER SMA CLA <1> FATAL I/O ERROR? JMP 3F <2> NO, OR OK, CONTINUE JMS IOER HANDLE I/O ERROR JMP 3F <1> IGNORE THE ERROR JMP 0B <2> TRY OPERATION OVER AGAIN EJECT / / HERE ON END OF SUCCESSFUL READ. WRITE OUT THAT NUMBER / OF BLOCKS TO OUTPUT FILE. / 3H LDI 04000 TURN THE WRITE BIT ON TAD 1B ADD IN OS/8 FUNCTION WORD DCA 5F STORE FUNCTION WORD STL CMA -1 IN AC AND SET LINK FOR 12-BIT COMPARE TAD TFFVBLK GET TEMPORARY FILE FORWARD VIRTUAL BLOCK TAD TEMP ADD IN NUMBER OF BLOCKS WE WILL WRITE TAD TFMLEN COMPARE WITH MINUS FILE LENGTH CDF BUF RESET IN CASE 'OFULL' IS CALLED SZL CLA SKIP IF WE HAVE ROOM HERE JMP OFULL NO ROOM IN TEMPORARY FILE / TAD TFFVBLK VIRTUAL BLOCK AGAIN TAD TFSBLK PLUS STARTING BLOCK NUMBER CDF %* TO THIS FIELD NOW DCA 6F STORE INTO CALLING SEQUENCE / TAD ODEV GET OUTPUT DEVICE ADDRESS SNA CLA DO WE HAVE AN OUTPUT DEVICE? JMP 7F NO: SO BY-PASS THE I/O OPERATION ROOM 12 4H JMSI ODEV WRITE OUT THE BLOCK BUFFER NOW 5H DC 0 OS/8 FUNCTION WORD DC 0 BUFFER ADDRESS AT 0 6H DC 0 OS/8 BLOCK NUMBER TO WRITE FROM SMA CLA <1> SKIP IF FATAL ERROR JMP 7F <2> OK, OR NON-FATAL ERROR JMS IOER HANDLE ERROR CONDITION JMP 7F <1> IGNORE ERROR JMP 4B <2> TRY AND REPEAT I/O OPERATION / 7H CDF BUF RESET MEMORY FIELD TAD TFFVBLK UPDATE VIRTUAL BLOCK NUMBER TAD TEMP BY NUMBER OF BLOCKS WRITTEN DCA TFFVBLK ... TAD TEMP REGET COUNT OF BLOCKS READ/WRITTEN JMPI COPYBLK ALL DONE HERE / DSEC ORG 07600 SHOULD NOT BE UP TO HERE TITLE FIELD 1 AND INITIALIZATION CODE / FIELD 1 / BSBUF QUT %*,* BLOCK SAVE BUFFER BSBUFE QUT %*,BSBUF+0377 LAST WORD IN BUFFER / ORG BSBUFE+1 ABUF QUT %*,* ABOVE SCREEN BUFFER ABUFE QUT %*,ABUF+0377 LAST WORD ADDRESS INSIDE BUFFER TITLE PROCESS FILE VERSION NUMBER / ISEC 0 PAGING BACK ON AGAIN FREE DEBUG IF AVAILABLE: FREE UP SPACE HERE / / HERE FOR THE LAST PHASE OF THE INITIALIZATION CIRCUIT. AT / THIS POINT, THE ABOVE SCREEN BUFFER IS STILL SAFE SINCE WE / NOT GOING TO ROLL ANYTHING INTO IT. / / JOB HERE IS TO HANDLE THE FIRST SCREEN LOAD OF THE FILE AND / PROCESS THE VERSION FIELD IF PRESENT. / VERPRO CDF %ROWTAB GET ADDRESS OF ROW 1 IN ROW TABLE LDI 1 ... TADI =ROWTAB ... CDF BUF BACK TO BUFFER FIELD NOW DCA TEMP STORE POINTER TO ROW 1 TADI TEMP GET POINTER NOW TO ROW DCA TEMP ... / / SEARCH LINE 1 NOW FOR THE WORD 'VERSION' / TAD TEMP COPY POINTER TO THE LINE DCA TXR1 ... TADI TEMP GET LENGTH OF CURRENT LINE SPA IF ROW UNESTABLISHED, NOTHING TO DO JMP 9F OK, WE PROBABLY HAVE A BLANK SCREEN AND =LMASK ISOLATE THE LENGTH FIELD TAD TEMP ADD TO ADDRESS OF LENGTH/STATUS WORD IAC +1 TO POINT PAST LAST CHAR ON LINE DCA TEMP STORE POINTER DCAI TEMP NOW PUT SENTINEL THERE OF ZERO / / LOOP HERE SEARCHING FOR THE WORD 'VERSION'. / 1H TAD =VERS-1 SET POINTER TO WORD DCA TXR2 ... TAD =-7 MATCH ON 7 LETTERS DCA CNTR ... / / LOOP BACK HERE AS LONG AS WE ARE MATCHING ON THE WORD 'VERSION' / 2H TADI TXR1 NEXT CHARACTER FROM LINE SNA ARE WE AT THE SENTINEL? JMP 9F YES: 'VERSION' NOT PRESENT HERE AND =040.XO.-1 NO: STRIP OFF LOWER CASE ALPHA BIT CMA IAC NEGATE AND COMPARE WITH NEXT CHAR TADI TXR2 FROM WORD WE ARE LOOKING FOR SZA CLA SKIP IF WE HAVE A MATCH JMP 1B NO MATCH: RESET POINTER ISZ CNTR FULL MATCH? JMP 2B NO: KEEP TRYING THEN / / HERE WE HAVE A PERFECT MATCH ON THE WORD 'VERSION'. SCAN AHEAD NOW / FOR A VERSION NUMBER OF THE FORM 00.00 AND THEN INCREMENT IT. / / FIND THE FIRST DIGIT OF THE VERSION NUMBER / 5H TADI TXR1 NEXT CHARACTER FROM ROW SNA SENTINEL ON ROW? JMP 9F YES: WE DO NOT HAVE A VALID VERSION # THEN TAD =-'9-1 CHECK FOR DECIMAL DIGIT CLL ... TAD ='9-'0+1 ... SNL CLA DECIMAL DIGIT HERE? JMP 5B NO: KEEP LOOKING FOR IT / LDI -1 SAVE POSITION-1 OF FIRST DIGIT TAD TXR1 ... DCA TXR2 ... EJECT / / DO NOT INCREMENT VERSION NUMBER NOW IF /V OPTION SET / VFLAG JMP 3F ## NOP ## IF /V OPTION SELECTED JMP 7F IF /V, WE EXECUTE THIS JUMP / 3H TADI TXR1 NEXT CHARACTER FROM LINE SNA IF ZERO, SOMETHING WRONG JMP 9F NOT A VALID VERSION FIELD TAD =-'. PERIOD FOUND? SZA CLA SKIP IF SO JMP 3B NO: WAIT FOR IT / LDI 3 POINT JUST PAST FOURTH DIGIT OF VERSION # TAD TXR1 COPY POINTER NOW TO NON-INDEXING REGISTER DCA TEMP ... / / LOOP HERE INCREMENTING THE DIGITS IN DECIMAL / 4H LDI -1 DECREMENT THE POINTER TAD TEMP ... DCA TEMP ... TADI TEMP GET THAT DIGIT TAD =-'. IS THIS THE PERIOD? SNA SKIP IF NOT JMP 4B SKIP BACK OVER PERIOD IF SO / TAD ='.+1 RESTORE CHARACTER, INCREMENT CODE BY 1 DCAI TEMP STORE IT BACK TADI TEMP REGET THAT CODE TAD =-('9+1) GONE TOO FAR? SZA CLA SKIP IF SO JMP 7F ELSE ALL DONE HERE / TAD ='0 YES: SO RESET THIS DIGIT BACK TO 0 DCAI TEMP ... JMP 4B LOOP BACK TO INCREMENT PRIOR DIGIT EJECT / / HERE WHEN WE ARE ALL DONE. / PUT NEW VERSION NUMBER INTO THE STATUS MESSAGE / 7H LDI -3 TWO 1/2 PASSES THROUGH LOOP BELOW DCA CNTR ... TAD =STVER-1 SET POINTER TO WHERE VERSION # GOES DCA TXR1 ... TAD TXR2 SAVE POSITION OF WHERE VERSION # IS DCA TEMP ... / / LOOP HERE COPYING OVER VERSION # / 8H TADI TXR2 NEXT DIGIT CLL RTL MOVE TO LH OF AC RTL ... RTL ... ISZ CNTR END OF LOOP? JMP *+4 NO: CONTINUE / TAD =' -0201 YES: INSERT BLANK AT END DCAI TXR1 STORE FINAL PAIR OF CHARACTERS JMP 6F DONE HERE / TADI TXR2 MERGE IN SECOND DIGIT TAD =-0201 REMOVE BOTH MARK BITS TO CONVERT TO 6-BIT DCAI TXR1 AND STORE INTO THE MESSAGE JMP 8B LOOP BACK NOW / / NOW COPY OVER THE CURRENT VERSION NUMBER IN 8-BIT ASCII INTO / 'AVERS' WHERE IT CAN BE USED BY THE 'FLAGLN' ROUTINE / 6H TAD TEMP RESET POINTER TO CURRENT VERSION NUMBER DCA TXR2 ... TAD =AVERS-1 SET POINTER TO WHERE IT WILL BE PUT DCA TXR1 ... TAD =-5 SET TO MOVE FIVE CHARACTERS DCA CNTR ... CDF %MCMNT TO FIELD OF COMMENT FLAG TADI =MCMNT GET MINUS COMMENT CHARACTER CDF BUF TO MAIN BUFFER FIELD CMA IAC MAKE IT A POSITIVE ASCII CHARACTER DCAI TXR1 STORE THAT AWAY / / LOOP HERE COPYING THE VERSION NUMBER OVER / TADI TXR2 CHAR FROM NEW VERSION NUMBER DCAI TXR1 COPY INTO 'AVERS' AREA ISZ CNTR MORE CHARS TO COPY? JMP *-3 YES: BACK TO DO THEM JMP 0F ALL DONE NOW / / COME HERE IF THERE WAS NO VERSION NUMBER. / 9H CLA AC NON-ZERO IF UNESTABLISHED ROW DCAX AUDIT IN CASE THIS FLAG SET, CLEAR IT NOW / / EXIT NOW TO RESTORE SCREEN WITH NEW VERSION NUMBER SHOWING / 0H TADI =$07605 GET DEVICE FOR INPUT FILE SNA CLA SKIP IF WE THERE WAS AN INPUT FILE JMP 1F NO INPUT FILE: HANDLE THIS JMPX DOSCRN ELSE ALL DONE HERE 1H JMPX ASMCHK OFF TO CHECK FOR HEURISTICS MODE (COL 8)WING / VERS DC 'V,'E,'R,'S,'I,'O,'N / DSEC PAGING BACK OFF NOW ORG ABUFE+1 BBUF QUT %*,* BELOW SCREEN BUFFER BBUFE QUT %*,BBUF+0377 LAST WORD ADDRESS INSIDE BUFFER ORG BBUFE+1 TITLE MISCELLANEOUS ROUTINES ISEC 0 PAGING BACK ON AGAIN / / TEMPORARY STORAGE FOR CELLS AND LITERALS (WE DON'T WANT ANY LITERALS / OR PAGING LINKS IN THIS SECTION OF CODE). P7 DC 7 LITERAL ARZER DC "<0 ... P0700 DC 0700 ... M10 DC -10 ... P10 DC 10 ... DBLZER DC "00 ... TWOBL DC " ... M100 DC -100 ... PLUSB DC "+ ... SPZERO DC " 0 ... P1777 DC 01777 ... ONEAT DC "1@ ... P99 DC "99 ... PASCHR DC ASCHR POINTER PASCHR1 DC ASCHR+1 ... PTEMP DC TEMP POINTER TO 'TEMP' IN FIELD ZERO BT1 DC 0 STORAGE BINCTR DC 0 ... / / SUBROUTINE TO SET UP THE ASCII, OCTAL CHARACTER CODE IN THE / STATUS LINE MESSAGE. / CIF 0 BACK TO FIELD 0 FOR EXIT DOASCI SUB ENTRY AND RETURN ADDRESS DCA BT1 SAVE FOR A MOMENT TAD BT1 AND REGET IT CLL RTR SHIFT DOWN HIGH OCTAL DIGIT RTR ... RTR ... AND P7 ISOLATE OCTAL DIGIT TAD ARZER MAKE IT ASCII DCAI PASCHR STORE INTO MESSAGE / TAD BT1 REGET THE CHARACTER RTL SHIFT SECOND DIGIT TO LEFT HALF OF AC RAL ... AND P0700 ISOLATE THE LEFT HALF OF THE AC DCA BINCTR AND SAVE THAT TAD BT1 REGET THE CHARACTER AND P7 ISOLATE THE THIRD DIGIT TAD BINCTR MERGE SECOND BINARY DIGIT IN LEFT HALF OF AC TAD DBLZER MAKE IT AN ASCII ZERO DCAI PASCHR1 AND STORE THAT IT INTO THE MESSAGE JMP DOASCI-2 RETURN NOW: ALL DONE / / ROUTINE TO CONVERT A BINARY NUMBER IN THE AC IN THE RANGE 0-99 TO / TWO 6-BIT ASCII DIGITS IN THE AC. / CELL 'TEMP' IN FIELD 0 IS RETURNED WITH TWO BLANKS IF THE NUMBER WAS / IN THE RANGE 0-99, OR WITH A PLUS AND A BLANK IF GREATER / THAN 99. / CDF BUF RESTORE MAIN DATA FIELD CIF 0 RETURNING INSTRUCTION FIELD BINASC SUB 40 CDF 0 TO FIELD OF 'TEMP' IN FIELD 0 SPA IF NEGATIVE NUMBER, CLA MAKE IT ZERO DCA BT1 SAVE THE NUMBER FOR A MOMENT TAD TWOBL ASSUME NUMBER IN RANGE 0-99 TO START DCAI PTEMP ... CLL LINK = 0 FOR 12-BIT UNSIGNED TEST TAD BT1 GET THE NUMBER TAD M100 COMPARE WITH HIGHEST VALUE FOR THIS ROUTINE SNL CLA SKIP IF > 100 JMP 0F < 100, SO OK HERE / / NUMBER TOO LARGE, JUST RETURN 99 AND + IN TEMP / TAD PLUSB RETURN PLUS AND BLANK IN TEMP DCAI PTEMP ... TAD P99 AND RETURN 99 IN THE AC JMP BINASC-3 ALL DONE HERE / 0H TAD SPZERO INITIALIZE COUNTER TO 00 ASCII / / LOOP HERE DOING DIVIDE / 1H DCA BINCTR UPDATE THE COUNTER TAD BT1 REGET THE NUMBER AGAIN TAD M10 DIVIDE THE NUMBER BY 10 TO GET THE HIGH DIGIT SPA GONE TOO FAR YET? JMP 2F YES: JUMP OUT OF THIS LOOP / DCA BT1 NO: SAVE THE RESULT TAD BINCTR INCREMENT HIGH DIGIT AND P1777 TRIM OFF HIGH ASCII DIGIT BITS TAD ONEAT INCREMENT DIGIT (CHANGES BLANK TO DIGIT TOO!) JMP 1B LOOP BACK NOW / 2H TAD P10 RESTORE THE DIGIT TAD BINCTR DIGITS ARE NOW CORRECT JMP BINASC-3 ALL DONE HERE / DSEC PAGING OFF NOW TITLE COMMAND DISPATCH TABLE / / THIS IS THE DISPATCH TABLE BASED UPON CODES SENT THROUGH BY / THE INTERPRETER ROUTINES. / DISTAB DC IGNORE 100 DC IGNORE 101 DC IGNORE 102 DC IGNORE 103 DC IGNORE 104 DC IGNORE 105 DC IGNORE 106 DC IGNORE 107 DC IGNORE 110 DC IGNORE 111 DC IGNORE 112 DC IGNORE 113 DC IGNORE 114 DC IGNORE 115 DC IGNORE 116 DC IGNORE 117 DC IGNORE 120 DC IGNORE 121 DC IGNORE 122 DC IGNORE 123 DC CSTART 124 CURSOR TO START OF ROW NOCASE DC CASE 125 INVERT CASE (NEEDS 7200 PAGE) DC TRUNCF 126 TRUNCATE FILE WITH CURRENT PAGE DC TRANSP 127 TRANSPARENT CHAR ENTRY DC BKDEL 130 BACKSPACE DELETE DC TABR 131 TAB RIGHT DC INSTOG 132 INSERT CHAR ON/OFF DC DELWD 133 DELETE WORD DC RETURN 134 RETURN CODE DC DLETLN 135 DELETE LINE DC XEDIT 136 EXIT FROM EDIT MODE DC QUIT 137 QUIT TO OS/8 MONITOR DC CEOL 140 CURSOR TO END OF LINE DC RSTEP 141 REPLACE STEP DC RCONT 142 REPLACE CONTINUOUS DC SEARCH 143 SEARCH MODE DC CAPTOG 144 CAPS LOCK TOGGLE DC AWAY 145 AWAY POSITION DC BOFC 146 MOVE TO LAST PAGE DC TOFC 147 MOVE TO FIRST PAGE DC HOME 150 HOME CURSOR DC NEWCMD 151 ENTER/LEAVE COMMAND MODE DC PAGEDN 152 PAGE DOWN DC PAGEUP 153 PAGE UP DC SCRLDN 154 SCROLL DOWN DC SCRLUP 155 SCROLL UP DC ROWINS 156 INSERT LINE DC PUTDN 157 PUT DOWN SAVED LINES DC PICKUP 160 PICKUP MARKED LINES DC UNMKROW 161 UNMARK ROW DC MKROW 162 MARK ROW DC DISMOD 163 DISPLAY MODIFIED LINES DC DOSCRN 164 RESTORE SCREEN DC DELSCR 165 DELETE SCREEN DC CNEXTL 166 CURSOR TO NEXT LINE DC WRIGHT 167 WORD CURSOR RIGHT DC WLEFT 170 WORD CURSOR LEFT NOTABL DC TABL 171 TAB LEFT (NEEDS 7200 PAGE) DC INSBLK 172 INSERT BLOCK DC DELEWD 173 DELETE TO END OF WORD DC CRIGHT 174 CURSOR RIGHT DC CLEFT 175 CURSOR LEFT DC CDOWN 176 CURSOR DOWN DC CUP 177 CURSOR UP / / COMMAND DISPATCH TABLE / CTABLE DC -'C,C:CMND CLOSE BLOCK SAVE FILE DC -'L,L:CMND LOOKUP BLOCK SAVE FILE DC -'M,M:CMND MARK ALL LINES SCROLLED OFF SCREEN DC -'R,R:CMND REPLACEMENT STRING DC -'S,S:CMND STRING SEARCH DC -'W,W:CMND WORD SEARCH DC 0 TABLE SENTINEL / / SENTINEL ON COMMAND TABLE IS ALSO PRE-SENTINEL ON SAVE BUFFER / SAVBUF QUT %*,* SAVE BUFFER ORG SAVBUF+LMASK SHOULD PROVIDE PLENTY OF ROOM DC 0 SENTINEL ON SAVE BUFFER / / SEARCH/REPLACEMENT STRINGS / SSTRING AS LMASK/2 (SEARCH STRING BELOW JUST IN CASE A PROBLEM) RSTRING AS LMASK/2 REPLACEMENT STRING / AVERS AS 6 SAVE AREA FOR VERSION NUMBER + SENTINEL / KBUF DC 1 NON-ZERO VALUE FOR INITIAL ENTRY AND FLUSH AS 19 KEYBOARD INPUT BUFFER DC -1 SENTINEL ON BUFFER / / TEXT/ERROR MESSAGES. / BSMSG TEXT "^PICKUP/PUTDOWN ERROR\" CLMSG TEXT /^CLOSING FILE...\/ HEADER AS 12," 24 BLANKS STATUS TEXT /NONAME.XX-/ STVER TEXT /00.00 / BLOCKS TEXT /14 EXTRA BLOCKS / ASCHR TEXT /<NNN>\/ REPMSG TEXT /^NUMBER OF REPLACEMENTS MADE: / REPCOUNT TEXT /NN \/ / / / / / / END OF FIELD 1 FIXED STORAGE. REMAINDER IS DYNAMIC / DYNMEM QUT %*,* START OF DYNAMIC MEMORY / / ARGUMENT LIST FOR TIME-SHARE SYSTEMS. BREAK ON ALL CHARACTERS, ONLY / ALLOW INTERPRETATION OF CONTROL/V AND DOUBLE CONTROL/C / ARGLIST DC 0204 KSTAT: ALLOW ^C AND ^V DC 04000 BREAK: BREAK ON ALL CHARACTERS DC 07600 CONTROL/ C RESTART ADDRESS DC 07600 CONTROL/ P RESTART ADDRESS (NOT USED) TITLE DIRECT ENTRY FROM OS/8 / / COME HERE FROM OS/8 WITH THE AC: / / 0 IF WE WERE CHAINED TO BY CCL / 1 IF CALLED DIRECTLY WITH 'RUN' COMMAND / AIF (DYNMEM.XO.04000).GE.(02000.XO.04000),.OK ORG 02000 DYNMEM BELOW 2000 SO ORG ABOVE IT NOW .OK ANOP ISEC 0 PAGING BACK ON AGAIN NOW / INIT CDF %* ENSURE CURRENT FIELD IS SET SNA CLA SKIP IF WE DO NEED TO CALL DECODER JMP 0F DECODER ALREADY CALLED BY CCL: CONTINUE VISTAGO JMS NRUSR,5,"*@ CALL COMMAND DECODER IN SPECIAL MODE / / HANDLE CONDITION OF RUNNING UNDER A TIME-SHARE SYSTEM. IN THAT CASE, / WE ISSUE FUNCTION CALLS TO INDICATE THAT ALL CHARACTERS SHOULD BE / PASSED ALONG TO VISTA. CODE BELOW WILL SUPPORT ETOS/MULTOS SYSTEMS. / 0H DSI 06107 SKIP IF RUNNING UNDER TIME-SHARE SYSTEM JMP 1F NOT RUNNING UNDER TIME-SHARE: CONTINU TAD =ARGLIST GET ADDRESS OF ARGUMENT LIST DI 06047 CALL TIME-SHARE MONITOR CLA IN CASE 6047 NOT UNDER TIME-SHARE / 1H TAD =EOF MARK BLOCK SAVE BUFFER AS EMPTY DCAI =BSBUF ...(IF PICKUP, EOF FOUND RIGHT AWAY) TAD $07605 IF NO INPUT FILES, SET END-OF-FILE FLAG SZA CLA SKIP IF NO INPUT FILE JMP 8F WE HAVE AN INPUT FILE: CONTINUE NOW / LDI 1 SET FLAG (NO INPUT FILES) DCAX BOF MARK AT BOTTOM OF FILE TAD =EOF MARK INPUT BUFFER EMPTY SINCE THERE IS DCAI =BBUF NO INPUT FILE PRESENT TAD =BBUF RESET BUFFER POINTER TO FIND 'EOF' DCAX BEPTR CODE RIGHT AWAY / / HERE WHEN CHAINED TO DIRECTLY OR WHEN WE HAVE FINISHED SETTING / UP THE COMMAND DECODER TABLES / 8H CDF %* RESET CURRENT FIELD ('CORE' RETURNED HERE) IOT 4,6 FORCE SERIAL LINE UNIT FLAG UP TAD =VERSION OUTPUT VERSION NUMBER JMS XPRINT AND COPYRIGHT NOTICE TAD $07605 GET FIRST CHARS OF NAME OF INPUT FILE SNA DO WE HAVE AN INPUT FILE? TAD $07600 NO: DO WE HAVE AN OUTPUT FILE? SNA CLA SKIP IF EITHER PRESENT JMP HELP NEITHER: OFF TO GIVE HELP MESSAGE / / TEST FOR /C OPTION: ALLOW LOWER CASE CHARACTERS TO THE LEFT / OF THE COMMENT DELIMITER (ONLY SIGNIFICANT WHEN /H OPTION IS ALSO / CHOSEN. / TAD $07643 / GET WORD WITH /C BIT CLL RTL / SHIFT /C BIT TO AC0 SMA CLA / SKIP IF /C OPTION WAS SELECTED JMP 2F / NOT SELECTED: CONTINUE TAD =07200 / SELECTED: STORE 'CLA' INSTRUCTION DCAX SLASHC / TO ALWAYS AVOID CALL TO 'FOLD' ROUTINE8 / / CHECK FOR /P OPTION: USE THE SLOW CLOSE / 2H TAD $07644 GET WORD WITH /P BIT AND =0400 ISOLATE THE /P BIT SNA CLA WAS /P BIT SET? JMP 9F NO: SO CONTINUE / TAD =07000 YES: REMOVE JUMP TO FAST CLOSE ROUTINE DCAX SLASHP ... / / CHECK FOR /W OPTION: WORDWRAP MODE MEANS WE SUPPLY CR/LF WHENEVER / A LINE IS BROKEN BECAUSE IT EXCEEDS THE COLUMN WIDTH OF THE SCREEN. / 9H TAD $07644 GET WORD WITH /W BIT CLL RTR SHIFT /W BIT TO LINK SNL CLA SKIP IF SET JMP 0F NOT SET: CONTINUE DCAX WFLAG CLEAR FLAG / / NOW CHECK FOR /F OPTION: STRIP ALL FORM FEEDS IN INPUT FILE / 0H TAD $07643 GET WORD WITH /F BIT AND =0100 ISOLATE THE /F BIT SNA CLA WAS /F OPTION SPECIFIED? JMP 3F NO, SO CONTINUE NOW / / HERE WHEN THE /F OPTION WAS SPECIFIED. / TAD =-FF SET FORM FEED CODE IN FLAG WORD DCAX FFLAG ... / / CHECK FOR /V OPTION: DO NOT CHANGE THE VERSION NUMBER / 3H LDI 4 SET TO ISOLATE THE /V BIT AND $07644 ... SNA CLA SKIP IF /V OPTION IS SET JMP 0F ELSE CONTINUE NOW / TAD =07000 SET 'NOP' INSTRUCTION TO INHIBIT VERSION DCA VFLAG NUMBER FROM BEING PROCESSED / / / USE OUTPUT FILE EXTENSION TO SEE IF CORRECTION FLAGS WANTED / FORCE CORRECTION FLAGS FOR PAGE8 AND HIBOL SOURCE PROGRAMS / (ALWAYS WANTED). / 0H TAD $07600+4 EXTENSION LOCATION SNA SKIP IF THERE IS AN EXTENSION TAD $07605+4 IF NOT, USE THE INPUT FILE EXTENSION TAD =-"PG 'PG' FOR PAGE8 SOURCE SZA SKIP IF SO TAD ="PG-"HB OR 'HB' FOR HIBOL SNA CLA SKIP IF SOMETHING ELSE TAD =0400 SET FLAG FOR PAGE8 AND HIBOL DCAX MODF OR CLEAR THE FLAG IF SOME OTHER EXTENSION / / CHECK /H FLAG FOR ASSEMBLY/COMPILER ENTRY HEURISTICS / TAD $07643 WORD WITH /H OPTION BIT AND =020 ISOLATE THE /H BIT DCAX ASEMH SET FLAG ON IF /H SET / / CHECK /M FLAG: INVERT THE SETTING OF THE 'MODF' FLAG. I.E. POST / CORRECTION FLAGS FOR ALL EXTENSIONS OTHER THAN 'PG' AND 'HB', / CLEAR FLAGS FOR 'PG' AND 'HB'. / TAD $07644 GET WORD WITH THE /M BIT SMA CLA SKIP IF SET JMP 6F NOT SET: CONTINUE / TADX MODF GET THE FLAG TAD =0400 SET THE BIT ON AND =0400 TURN IF OFF IF IT WAS ALREADY SET DCAX MODF AND STORE IT BACK / / CHECK FOR AUDIT TRAIL WITH /A OPTION / 6H TAD $07643 GET WORD WITH /A BIT SMA CLA IS THE /A OPTION SET? JMP 1F NO: SO CONTINUE / TAD =0400 SET THE FLAG ON NOW DCAX AUDIT ... / / CHECK FOR /Z OPTION: IGNORE ALL END OF FILE CONDITIONS / (I.E. LIKE ""SUPER TECO'' / 1H TAD $07645 GET WORD WITH /Z BIT CLL RAL SHIFT /Z BIT TO AC 0 SMA CLA SKIP IF SET JMP 2F NOT SET TAD =07000 REMOVE END FILE CHECK DCAX EOFCK ... TAD =07000 REMOVE END FILE CHECK DCAX SLASHZ ... / 2H JMS NRUSR,8 LOCK USR IN CORE FOR INITIALIZATION ALIGN (AVOID ANY INDIRECT ADDRESSING PROBLEMS) / / NOW CHECK, DO WE HAVE AN OUTPUT FILE ? / TAD $07600+1 NAME WILL BE ZERO IF NO OUTPUT FILE SZA CLA SKIP IF NO OUTPUT FILE HERE JMP 6F OK, WE HAVE AN OUTPUT FILE HERE TAD =07600 SET POINTER TO OUTPUT FILE DCA BX1 TAD =07605 SET POINTER TO FIRST INPUT FILE DCA BX2 TAD =-5 SET TO MOVE 5 WORDS OVER DCA BCNTR / / CHECK FOR DEVICE AND NO NAME, IF SO, ONLY MOVE THE NAME OVER / TAD $07600 CHECK FOR PRESENCE OF OUTPUT FILE NOW SZA CLA SKIP IF NO OUTPUT DEVICE JMP 5F OK, LEAVE THE DEVICE NUMBERS ALONE / 3H TADI BX2 COPY WORD FROM INPUT FILE TO OUTPUT FILE / / NOW CHECK FOR ILLEGAL '*' IN FILENAME / (SINCE WE CALLED DECODER IN SPECIAL MODE) / TAD =-"@* CHECK FOR ILLEGAL STAR SNA CLA SKIP IF NOT JMP NO:OPEN '*' FOUND - SIGNAL ERROR TADI BX2 REGET AGAIN AND =07700 ISOLATE THE LEFT BYTE TAD =-"*@ TEST LEFT BYTE FOR ILLEGAL '*' SNA CLA SKIP IF NOT JMP NO:OPEN '*' FOUND - SIGNAL ERROR TADI BX2 REGET THE WORD DCAI BX1 ... 5H INC BX2 STEP BOTH POINTERS NOW INC BX1 ... ISZ BCNTR LOOP TILL ALL WORDS MOVED JMP 3B ... JMP 6F CONTINUE NOW / / TEMPORARY STORAGE / BX1 DC 0 BX2 DC 0 BCNTR DC 0 EJECT / / NOW MOVE THE FILENAME AND EXTENSION INTO THE FILE STATUS WORD. / 6H TAD $07601 FIRST 2 CHARS OF FILENAME DCA STATUS ... TAD $07602 2ND PAIR DCA STATUS+1 ... TAD $07603 3RD PAIR DCA STATUS+2 ... / TAD $07604 EXTENSION RTR SHIFT TO LOW END RTR ... RTR ... DCA TEMP SAVE FOR A MOMENT TAD TEMP REGET IT AND =077 TRIM OFF HIGH HALF TAD =".@ PUT PERIOD IN HIGH HALF DCA STATUS+3 STORE AWAY TAD TEMP REGET SHIFTED EXTENSION RAR NOW HAS 2ND CHAR IN HIGH HALF AND =07700 TRIM OFF LOW BITS TAD ="@- PUT HYPHEN IN LOW HALF DCA STATUS+4 AND STORE IT AWAY TAD =IDEVH RESET DEVICE HANDLER TOP ADDRESS DCA SDEV ... / / RUN THROUGH ALL FIVE WORDS NOW FROM STATUS UP TO STATUS+4. IF / THERE IS AN ASCII NULL (WILL BE @ IN 6-BIT CODE) CHANGE IT / TO A BLANK. / TAD =-5 FIVE WORDS TO CHECK DCA BCNTR ... TAD =STATUS POINTER TO FILENAME DCA BX1 ... / 7H TADI BX1 NEXT PAIR AND =07700 IS LEFT HALF NULL? SNA CLA SKIP IF NOT LDI " @ YES: CHANGE TO BLANK TADI BX1 MERGE IN OLD WORD DCAI BX1 ... TADI BX1 REGET AND =077 AND CHECK THE RIGHT HALF SNA CLA SKIP IF NOT NULL TAD ="@ CHANGE RIGHT TO BLANK TADI BX1 MERGE IN OLD WORD DCAI BX1 ... INC BX1 STEP POINTER ISZ BCNTR TEST LOOP COUNTER JMP 7B LOOP BACK FOR NEXT PAIR JMP LOOKUP OFF NOW TO LOOK UP THE INPUT FILES / / COME HERE TO ISSUE HELP MESSAGE / HELP TAD =06031 ALLOW KEYBOARD ABORT DCA BABORT ... TAD =HELPMSG GET THE MAIN HELP MESSAGE JMS XPRINT PRINT OUT THE ENTIRE MESSAGE JMPX QUIT AND QUIT NOW ALIGN TITLE INPUT FILE LOOKUP / / CELLS FOR THIS PAGE / SDEV DC IDEVH KEEPS TRACK OF WHERE HANDLERS LOADED BTEMP DC 0 BTEMP2 DC 0 / / HERE TO PERFORM OUR OWN LOOKUP ON THE INPUT FILE / THIS IS DONE SO THAT WE CAN HANDLE FILES LARGER THAN 256 BLOCKS / WITH THE SPECIAL FILE CLOSE FEATURE / LOOKUP TAD $07605 LOAD THE DEVICE NUMBER SNA DID WE HAVE AN INPUT FILE? JMP 5F NO: SO SKIP AHEAD ROOM 7 JMS USR,1 FETCH DEVICE HANDLER 2H DC IDEVH ... JMP *+2 <1> CAN'T LOAD THIS HANDLER JMP 3F <2> LOADED ALL RIGHT HERE / / IF HANDLER LOAD FAILED, CHECK TO SEE IF WE WERE TRYING TO / LOAD A 2-PAGE HANDLER. / TAD 2B GET STATUS WORD CLL RAR SHIFT 2-PAGE BIT TO LINK SZL CLA SKIP IF TRYING A 1-PAGE HANDLER JMP NODEV ERROR: CANNOT LOAD HANDLER INC 2B INDICATE 2-PAGE HANDLER ALLOWED HERE TAD SDEV UPDATE HANDLER ADDRESS TAD =0200 ... DCA SDEV ... JMP LOOKUP TRY AND DO THE LOOKUP AGAIN NOW / / HERE WHEN HANDLER LOAD WAS SUCCESSFUL / 3H TAD 2B GET ENTRY POINT DCAX IDEV STORE FOR USE BY I/O ROUTINES TAD SDEV IF ENTRY POINT ON SYSTEM PAGE, LEAVE TAD =-07600 ADDRESS ALONE (ALSO HANDLES ETOS/MULTOS ETC.) SPA CLA SKIP IF WE ARE USING 7600 PAGE FOR HANDLER TAD =0200 IF NOT, UPDATE ADDRESS NOW TAD SDEV ... DCA SDEV ... / TAD $07605 REGET THE DEVICE NUMBER CDF %* ROOM 7 JMS USR,2 DO LOOKUP ON INPUT FILE 4H DC 07606 FILENAME--CHANGED TO STARTING BLOCK DC 0 CHANGED TO MINUS LENGTH JMP NO:FILE <1> FILE NOT FOUND TAD 4B <2> GET THE STARTING BLOCK OF THE FILE CDF %IFSBLK POINT AT INPUT FILE DCAI =IFSBLK STORE IT CDF %* RETURN DATA BANK TAD =07606 RESET POINTER IN CASE LOOPING BACK DCA 4B ... TAD 4B+1 LOAD THE MINUS FILE LENGTH CDF %IFMLEN ... DCAI =IFMLEN STORE MINUS LENGTH CDF %* RESET DATA FIELD / / COMPUTE TOTAL FREE BLOCKS ON DEVICE / SO USER KNOWS AHEAD OF TIME IF ALL IS WELL / / FIRST FETCH DEVICE HANDLER FOR OUTPUT FILE / 5H TAD $07600+4 GET OUTPUT EXTENSION DCA EXTEN SAVE IT NOW TAD ="TM SET EXTENSION FOR ENTER FUNCTION CDF 1 DCA $07600+4 ... TAD SDEV SET DEVICE HANDLER POINTER DCA 7F ... 2H TAD $07600 GET DEVICE NUMBER ROOM 7 JMS USR,1 CALL USER SERVICE ROUTINE 7H DC 0 JMP *+2 <1> CAN'T LOAD HANDLER HERE JMP 8F <2> HANDLER LOADED ALL RIGHT / TAD 7B GET LOAD ADDRESS CLL RAR SHIFT 2-PAGE BIT TO LINK SZL CLA SKIP IF ON FIRST PASS THROUGH HERE JMP NODEV DEFINITELY CANNOT LOAD HANDLER HERE INC 7B SET 2-PAGE HANDLER BIT TAD SDEV UPDATE HANDLER ADDRESS TAD =0200 ... DCA SDEV ... JMP 2B LOOP BACK TO REPEAT OPERATION NOW / / HERE WHEN HANDLER LOADED SUCCESSFULLY / 8H TAD $07644 GET DECODER WORD WITH /O BIT CLL RTL SHIFT /O BIT TO AC 0 SPA CLA WAS THE /O OPTION SELECTED? JMP OKCONT YES: SO NO OUTPUT DEVICE TAD 7B GET ENTRY POINT DCAX ODEV AND STORE THAT / TAD SDEV GET DEVICE HANDLER ENTRY POINT AND =07600 ISOLATE THE PAGE ADDRESS TAD =-IDEVH WAS OUTPUT HANDLER CO-RESIDENT SNA CLA WITH THE INPUT HANDLER? JMP 0F YES: SO 7200-7577 IS STILL INTACT / TAD SDEV GET ENTRY POINT TAD =-07600 LOADED INTO 7600 PAGE? SPA CLA SKIP IF SO TAD =0200 ELSE UPDATE HANDLER PAGE ADDRESS TAD SDEV ... DCA SDEV ... / / IF THE OUTPUT FILE IS ON SYS (OUTPUT DEVICE HANDLER ENTRY POINT IS / 7607), THEN WE MUST PREVENT THE PIKUP ROUTINE FROM TRYING TO WRITE / TO THE SYSTEM DEVICE (ESPECIALLY A PROBLEM IF A DEVICE OTHER THAN / SYS REFERS TO SYS - SUCH AS DSK). / 0H TAD 7B GET DEVICE HANDLER ENTRY POINT TAD =-07607 IS SYS THE OUTPUT DEVICE? SNA CLA SKIP IF NOT JMP 8F YES: SO LEAVE PICKUP ROUTINE IN MEMORY TAD =07325 NO: SO ALLOW PICKUP ROUTINE TO USE SYS: DCAX OPFILE ...(7325 IS 'LDI 3' FOR CALL TO 'USR') / / NOW ENTER THE OUTPUT FILE / 8H TAD =07600+1 RESET ADDRESS OF FILE NAME DCA 9F ... TAD $O'7600' GET DEVICE NUMBER ROOM 7 JMS USR,3 DO THE ENTER ON THE OUTPUT FILE 9H DC 07600+1 ADDRESS OF FILE ENTRY NAME 6H DC 0 JMP NO:OPEN <1> CAN'T OPEN THE OUTPUT FILE HERE / / IF USER SPECIFIED OUTPUT FILE SIZE WITH [XXX] OPTION, USE THAT / FIGURE INSTEAD (PREVENTS THRASHING WHEN THERE IS A LARGE EMPTY / HOLE ON A DECTAPE SYSTEM) / TAD $07600 <2> GET LENGTH/DEVICE NUMBER AND =07760 DID USER SPECIFY A LENGTH? CLL RTR ... CLL RTR ... CMA IAC AND NEGATE IT SNA SKIP IF SO TAD 6B ELSE GET THE MINUS LENGTH OF THE FILE DCAX TFMLEN AND SAVE IT TAD 9B GET THE STARTING BLOCK DCAX TFSBLK AND STORE THAT TADX TFMLEN GET MINUS BLOCK LENGTH CMA IAC MAKE IT A POSITIVE NUMBER DCAX TFBVBLK SET AS BACKWARDS VIRTUAL BLOCK NUMBER / TADX TFMLEN REGET AVAILABLE LENGTH SNA IF ZERO, NOT A DIRECTORY DEVICE JMP OKCONT NOT A DIRECTORY DEVICE CLL CMA ASSUME NO /P (ALLOCATE EXTRA BLOCK THEN) TAD =2 ADD TWO BLOCKS FOR THE 'FUDGE FACTOR' DCA BTEMP SAVE FOR A MOMENT / / IF /P OPTION IS SET, WE NEED NOT ALLOW FOR 1 EXTRA BLOCK ON THE / HIGH SPEED CLOSE. / TAD $07644 DECODE SWITCH WITH /P OPTION AND =0400 ISOLATE THE /P BIT SZA CLA SKIP IF /P NOT SET INC BTEMP /P SET -- WE DON'T NEED THE EXTRA BLOCK THEN TADX IFMLEN GET THE MINUS LENGTH OF THE INPUT FILE SNA SKIP IF WE HAVE AN INPUT FILE JMP 1F NO INPUT FILE -- DON'T SUBTRACT HERE THEN TAD BTEMP COMPARE WITH # OF BLOCKS AVAILABLE SNL SKIP IF WE HAVE ROOM JMP TIGHT DEFINITELY TOO TIGHT DCA BTEMP SAVE NUMBER OF EXTRA BLOCKS / 1H TAD BTEMP CLL FOR UNSIGNED COMPARE TAD =-10 LESS THAN TEN BLOCKS AVAILABLE? SZL CLA SKIP IF SO JMP OKCONT 10 BLOCKS OR MORE: CONTINUE / / HERE WE HAVE LESS THAN 10 BLOCKS FOR THE FILE / TAD =0207 RING BELL JMS BTYPE TO GET ATTENTION TAD =FREEBY PRINT '<10 EXTRA BLOCKS' JMS XPRINT ... / / NOW DELAY HERE FOR ABOUT 2 SECONDS SO THE USER SEES THE MESSAGE / DCA BTEMP INSIDE COUNTER TAD =-100 OUTSIDE COUNTER DCA BTEMP2 ... IOT 3,2 CLEAR KEYBOARD FLAG / 4H ISZ BTEMP INSIDE COUNTER COUNTS DOWN JMP 4B ... IOS 3,1 KEYBOARD STRUCK? JMP *+2 NO: JMP OKCONT YES: SO GET OUT OF THE LOOP ISZ BTEMP2 OUTSIDE COUNTER JMP 4B LOOP BACK / / CONTINUE HERE NOW / OKCONT IOT 3,2 CLEAR KEYBOARD FLAG IN CASE SET TAD SDEV GET TOP FREE PAGE ABOVE HANDLERS TAD =-FASTCL COMPARE WITH 'FASTCL' ADDRESS SPA SNA CLA DID WE OVERWRITE HIGH SPEED CLOSE? JMP 2F NO: SO CONTINUE NOW TAD =07000 YES: SO REMOVE HIGH SPEED CLOSE DCAX SLASHP ... / 2H TAD SDEV REGET TOP FREE PAGE TAD =-ODEVH DID WE OVERWRITE THE /H FEATURE? SPA SNA CLA SKIP IF SO JMP 3F ELSE CONTINUE DCAX ASEMH YES: SO REMOVE /H FLAG JMS USR,9 SWAP DISPATCH TABLE BACK INTO MEMORY TAD =IGNORE MARK THAT CASE INVERSION IS UNAVAILABLE DCA NOCASE ... TAD =IGNORE MARK THAT TAB LEFT IS UNAVAILABLE DCA NOTABL ... JMS NRUSR,8 GET 'USR' BACK INTO MEMORY AGAIN / 3H TAD =CR AND DO A CR/LF JMS BTYPE TAD =LF JMS BTYPE TITLE SELECT VIDEO CHARACTERISTICS MODULE / / NOW SELECT THE VIDEO CHARACTERISTICS MODULE FOR THIS EDIT. DEFAULT / MODULE IS 'VCM0' HOWEVER, WE CAN SELECT MODULES 1-9 WITH / A SIMPLE / FOLLOWED BY THE NUMBER. / TAD =VCM RESET POINTER TO FILENAME DCA 4F ... TAD ="M0 RESET NUMBER IN CASE LOOPING BACK HERE DCA VCM+1 ... TAD $07645 GET OPTION WORD WITH DIGITS AND =0777 ISOLATE BITS 1-9 SNA SELECT OTHER THAN DEFAULT MODULE? JMP 3F NO: USE DEFAULT / / LOCATE DESIRED MODULE NUMBER BY FINDING THE FIRST BIT THAT IS SET / CLL RTL SHIFT DIGIT 1 BIT NOW TO AC1 / / LOOP HERE LOOKING FOR THE FIRST BIT SET. / 2H INC VCM+1 STEP DIGIT IN FILE NAME CLL RAL SHIFT NEXT BIT UP SMA SKIP WHEN WE HAVE FOUND THE BIT JMP 2B STILL LOOKING FOR IT / / NOW LOOK UP THE VCM FILE ON THE SYSTEM DEVICE AND READ IN / 3 OS/8 RECORDS (1 1/2 BLOCKS INTO LOCATION 6000-6577 IN FIELD 0 / 3H LDI 1 SYSTEM DEVICE (AC WAS NON-0 ON MERGE HERE) ROOM 8 JMS USR,2 FILE LOOKUP 4H DC VCM ADDRESS OF VCM NAME DC 0 DUMMY ARGUMENT JMP NO:VCM <1> ERROR: VCM FILE NOT FOUND TAD 4B <2> OK: GET THE STARTING BLOCK IAC SKIP OVER THE OS/8 LOADING BLOCK DCA 5F STORE FOR I/O CALL / ROOM 10 CIF 0 HANDLER IN FIELD 0 JMS $07607 CALL SYSTEM DEVICE HANDLER TO DC 3.LS.6 READ 3 RECORDS DC KIO TO KEYBOARD I/O ADDRESS 5H DC 0 FROM STARTING BLOCK OF FILE JMP NO:VCM <1> I/O ERROR CANNOT READ VCM FILE / / <2> FILE READ OK. SET UP PARAMS TAKEN FROM START OF VCM FILE AND / MOVE THEM ONTO PAGE ZERO WHERE THEY CAN BE CONVENIENTLY BE HANDLED / CDF 0 TO FIELD 0 TADI =VMCMNT MINUS COMMENT CHARACTER DCAI =MCMNT ... TADI =VMTAG MINUS TAG CHARACTER DCAI =MTAG ... TADI =VROWS # OF ROWS ON VIDEO SCREEN DCAI =ROWSIZ SET ROW SIZE TADI =VCOLS # OF COLUMNS ON VIDEO SCREEN DCAI =COLSIZ ... TADI =VAUCOL GET AUDIT TRAIL COLUMN DCAI =AUCOL ... TAD =-8 SET ROW COUNTDOWN COUNTER TADI =COLSIZ TO 8 COLS LESS THAN DOUBLE ROW SIZE CLL CMA IAC RAL NEGATE AND MULTIPLY BY TWO DCAI =RFCTR SET COUNTER TADI =RFCTR ALSO SET AS CONSTANT FOR RESTORATION DCAI =RFMAX OF 'RFCTR' / / HANDLE ROW STATUS WORD AND STATUS BITS. / / BIT 0 0 NO XON/XOFF / 1 HANDLE XON/XOFF / / BIT 1 0 NO CONTROL/O CHECK / 1 CONTROL/O INVERTS SCREEN BLANKING / TADI =VSTAT GET STATUS BIT SPA CLA SKIP IF NO XON/XOFF CHECKING JMP *+3 ELSE CONTINUE (ALL SET UP) / TAD =07000 SET 'NOP' INSTRUCTION TO AVOID DCAI =XONCK XON/XOFF CHECKING / TADI =VSTAT GET STATUS WORD AGAIN CLL RAL SHIFT CONTROL/O BIT TO AC 0 SPA CLA SKIP IF NO CONTROL/O CHECKING JMP *+3 ELSE CONTINUE (ALREADY SET UP) / TAD =07000 'NOP' INSTRUCTION AVOIDS DCAI =CTLOCK THE CHECK FOR CONTROL/O TITLE ESTABLISH ROW TABLE AND SCREEN MEMORY / / NOW SETUP ROW TABLE BASED UPON PARAMS FROM THE VCM FILE / TADI =COLSIZ GET THE COLUMN SIZE DCA TEMP1 MOVE TO PAGE 0 IN THIS FIELD TADI =ROWSIZ GET NUMBER OF ROWS ON SCREEN DCA TEMP2 ... CDF %* RESET CURRENT FIELD NOW / / DO QUICK CHECK ON VALIDITY OF ROWS AND COLUMNS, IF THIS HAS / BEEN MESSED UP, VISTA MIGHT CRASH WITHOUT CLEAR INDICATION / OF WHAT WAS WRONG. / TAD TEMP1 GET COLUMN COUNT TAD =-200-1 ANYWHERE BETWEEN 10 AND 200 IS ACCEPTABLE CLL ... TAD =200-10+1 ... SNL CLA VALID RANGE? JMP NO:VCM NO: TREAT AS BAD VCM FILE THEN / TAD TEMP2 GET COUNT OF ROWS ALLOWED ON SCREEN TAD =-100-1 ANYWHERE BETWEEN 2 AND 100 IS ACCEPTABLE CLL ... TAD =100-2+1 ... SNL CLA VALID RANGE? JMP NO:VCM NO: TREAT AS BAD VCM FILE THEN / / CALCULATE SCREEN SIZE BASED UPON THESE PARAMETERS. / TAD TEMP2 GET ROW COUNT CMA IAC NEGATE AND SET AS DCA CNTR LOOP COUNTER CLL / / MULTIPLY COLUMN SIZE BY ROW COUNT TO GET SIZE OF SCREEN MEMORY / MUST CHECK FOR MEMORY OVERFLOW TOO. NOTE THAT AN EXTRA WORD IS NEEDED / FOR A SENTINEL (SOME ROUTINES FOR EFFICIENCY STORE A SENTINEL AT THE / END OF THE ROW RATHER THAN USING THE ROW COUNT) / 1H TAD TEMP1 COLUMN SIZE TAD =2 +1 FOR LENGTH/STATUS, +1 FOR SENTINEL SZL OVERFLOW? JMP 9F YES: CLEAR SCREEN AND THEN ISSUE BAD VCM MSG ISZ CNTR MORE ROWS TO MULTIPLY BY? JMP 1B YES: SO BACK TO DO THAT / / SCREEN SIZE IS NOW IN THE AC. / TAD =DYNMEM ADD IN STARTING ADDRESS OF MEMORY SZL DID WE OVERFLOW HERE? JMP 9F YES: ISSUE BAD VCM MESSAGE CDF 0 TO FIELD 0 DCA TEMP SAVE FOR A MOMENT TAD TEMP SHOULD ALSO BE BELOW 7400 IN FIELD 1 TADI =ROWSIZ ADD IN SIZE OF ROW TABLE TAD =-07400+2 IN ORDER NOT TO HIT CLOSE ROUTINES SZL CLA SKIP IF ALL RIGHT HERE JMP NO:VCM TOO HIGH TAD TEMP REGET ADDRESS IAC +1 TO ACCOUNT FOR DUMMY ROW AT END DCAI =ROWTAB MARK AS FIRST ADDRESS OF ROW TABLE / TADI =ROWTAB ESTABLISH START OF ROW TABLE DCAI =ROW ... TADI =ROW SET 'TXTROW' IN CASE 'PICKUP' CALLED WITH DCAI =TXTROW NO MARKED ROWS (VALID ROW PTR NEEDED THERE) / TADI =ROWSIZ ... TAD TEMP + STARTING ADDRESS OF TABLE-1 DCAI =LASTROW IS ADDRESS OF LAST ROW IN ROW TABLE EJECT / / NOW ESTABLISH THE ROW TABLE WITH ALL THE ROW ADDRESSES AND / ALL THE STATUS WORDS FOR EACH ROW MARKED AS UNESTABLISHED. / TADI =ROWSIZ GET NUMBER OF ROWS IN ROW TABLE CMA NEGATE AND SET DCA CNTR AS A LOOP COUNTER (INCLUDE DUMMY ROW) TAD =DYNMEM STARTING ADDRESS OF ROWS IN MEMORY DCA TEMP ... LDI -1 SET POINTER TO FIRST SLOT IN ROW TABLE TADI =ROWTAB ... DCA TXR1 ... CDF BUF TO ROW TABLE FIELD NOW / / LOOP HERE ESTABLISHING EACH ROW IN THE ROW TABLE / 2H TAD TEMP STARTING ADDRESS OF NEXT ROW DCAI TXR1 STUFF INTO ROW TABLE SLOT LDI 2 ALLOCATE FOR LENGTH/STATUS AND SENTINEL TAD TEMP UP ADDRESS NOW TO ADDRESS OF NEXT ROW TAD TEMP1 + COLUMN SIZE DCA TEMP ... ISZ CNTR MORE ROWS TO SET UP? JMP 2B YES: SO BACK TO SET THEM NOW / / SET UP THE NUMBER OF BLOCKS IN THE SCREEN IN 'BLOCKCT' TO / STATUS LINE BLOCK COUNT. / TADI =ROWSIZ GET NUMBER OF ROWS CLL CMA IAC RAL TIMES 2 AND NEGATE TADI =ROWTAB SUBTRACT FROM END OF ROW TABLE TAD =-DYNMEM NOW CALCULATE SIZE OF SCREEN BUFFER / / LOOP HERE TO DIVIDE NUMBER OF CHARS ON SCREEN BY 384 WHICH / INDICATES THE MAXIMUM NUMBER OF OS/8 BLOCKS NEEDED TO HOLD / THAT NUMBER OF CHARACTERS. / 3H CLL FOR 12-BIT COMPARE TAD =-384 NUMBER OF WORDS IN OS/8 BLOCK INCX BLOCKCT COUNT NUMBER OF BLOCKS SZL GONE TOO FAR YET? JMP 3B NO: CONTINUE WITH DIVIDE CLA YES: REMOVE GARBAGE FROM AC EJECT JMS USR,9 RELEASE USR NOW JMPX STARTUP OFF TO READ IN FIRST PART OF FILE / 9H CLA CLEAR AC JMP NO:VCM THEN ISSUE BAD VCM MESSAGE / / COME HERE WHEN THE INPUT FILE WAS NOT FOUND / NO:FILE TAD =MFILE THERE WAS NO FILE HERE JMS XPRINT ... / / HERE TO RETURN DIRECTLY TO MONITOR / QIT JMPX QUIT ALL DONE HERE / / HERE IF WE CAN'T LOAD THE DEVICE HANDLER / NODEV TAD =CANTLD-OPENF CAN'T LOAD DEVICE HANDLER NO:OPEN TAD =OPENF-NOVCM CAN'T OPEN OUTPUT FILE NO:VCM TAD =NOVCM CAN'T FIND 'VCM' FILE JMS XPRINT ... JMP QIT QUIT NOW / / HERE IF THERE IS NOT ENOUGH ROOM FOR THE OUTPUT FILE / TIGHT CLA REMOVE GARBAGE FROM AC ON ENTRY TAD =0207 RING BELL ON CONSOLE A COUPLE OF TIMES JMS BTYPE TAD =0207 ... JMS BTYPE TAD =TIGHT2 TELL USER, NOT ENOUGH SPACE JMS XPRINT ... / TAD =CONWAY ASK USER IF THEY WISH TO CONTINUE JMS XPRINT ... JMS XREAD READ REPLY FROM CONSOLE AND =040.XO.-1 REMOVE UPPER/LOWER CASE BIT TAD =-'Y 'YES' REPLY HERE? SNA CLA SKIP IF NOT JMP OKCONT ELSE LET USER CONTINUE IF HE WANTS TO JMP QIT OK: QUIT NOW ALIGN ENSURE NO PAGING PROBLEMS HERE TITLE READ KEYBOARD AND PRINT STRING ROUTINE / / HERE TO READ FROM THE KEYBOARD / XREAD SUB IOT 3,2 ENSURE FLAG CLEAR ON ENTRY IOS 3,1 WAIT FOR KEYBOARD FLAG TO COME UP JMP *-1 ... IOT 3,6 READ RESPONSE AND =0177 TRIM PARITY BIT TAD =0200 NORMALIZE TO THE ON POSITION DCA XTEMP SAVE CHARACTER TAD XTEMP REGET THE CHARACTER JMS BTYPE OUTPUT TO THE CONSOLE TAD XTEMP REGET THE CHARACTER NOW RET XREAD RETURN CHARACTER IN THE AC TITLE PRINT STRING ROUTINE / / SUBROUTINE TO OUTPUT PACKED 6-BIT CHARACTER STRING. CHARACTER / POINTER IN AC. UP-ARROW CHARACTER INDICATES WE WISH TO PERFORM / A CR/LF. / XPRINT SUB DCA XTEMP SAVE POINTER TO THE SCREEN / / LOOP HERE TO GET THE NEXT PAIR OF CHARACTERS / 1H TADI XTEMP GET NEXT WORD RTR SHIFT LEFT BYTE TO RIGHT HALF OF AC RTR ... RTR ... JMS XPR2 OUTPUT RIGHT HALF OF AC TADI XTEMP GET WORD AGAIN JMS XPR2 OUTPUT RIGHT HALF OF AC INC XTEMP STEP POINTER TO NEXT PAIR OF CHARACTERS JMP 1B LOOP BACK FOR THEM NOW / / HERE TO OUTPUT THE RIGHT HALF OF THE AC AS A FULL 8-BIT CODE / CHECK ALSO FOR UP-ARROW WHICH CAUSES A CLEAR SCREEN FUNCTION / TO BE EXECUTED / XPR2 SUB AND =077 TRIM OFF HIGH PART OF AC SNA SKIP IF REAL CODE RET XPR2 IGNORE BINARY ZERO TAD =-"@^ UP-ARROW CODE? SNA SKIP IF NOT JMP 3F YES: HANDLE THIS / TAD ="@^-"@\ BACKSLASH: FOR END OF MESSAGE? SNA SKIP IF NOT RET XPRINT YES: RETURN DIRECTLY FROM 'XPRINT' / TAD ="@\-040 RESTORE AND TEST FOR 0-37 VS. 40-77 CODE SPA SKIP IF IN RANGE 40-77 TAD =0100 1-37 RANGE: ADD IN 7TH BIT TAD =0240 BUILD FULL CODE NOW 2H JMS BTYPE OUTPUT THE CHARACTER RET XPR2 DONE HERE / / HERE ON UP-ARROW CODE / 3H TAD =CR DO CR FIRST JMS BTYPE ... TAD =LF LOOP BACK NOW FOR LINE FEED JMP 2B SEND THAT NOW / XTEMP DC 0 TEMPORARY SAVE FOR POINTER / / OUTPUT CHARACTER IN AC TO CONSOLE TERMINAL / BTYPE SUB IOS 4,1 WAIT FOR SERIAL LINE UNIT TRANSMITTER FLAG JMP *-1 ... IOT 4,6 OUTPUT CHARACTER CLA REMOVE FROM AC BABORT DSI 07000 KEYBOARD FLAG UP? (HELP MESSAGE ONLY) RET BTYPE NO: ALL DONE HERE JMPX QUIT YES: QUIT NOW (INTERRUPT MESSAGE PRINTING) TITLE INITIALIZATION MESSAGES / DSEC / MACRO THIS MACRO INHIBITS OBJECT LISTING .TEXT <ARG> :A SET * ; TARGET FOR LISTING CALL NOLIST ; SHUT OFF OBJECT LISTING <> TEXT ]<ARG>] ; LIST OBJECT CODE OFF LIST ; LISTING BACK ON AGAIN NOW MEND / MFILE .TEXT <INPUT FILE NOT FOUND^\> OPENF .TEXT <CAN'T OPEN OUTPUT FILE^\> VERSION .TEXT <VISTA--01.09......COPYRIGHT (C), 1980^> .TEXT <DEWAR INFORMATION SYSTEMS CORPORATION^^\> CANTLD .TEXT <CAN'T LOAD HANDLER^\> TIGHT2 .TEXT <NOT ENOUGH ROOM FOR WHOLE INPUT FILE!!^\> FREEBY .TEXT <LESS THAN 10 BLOCKS FOR FILE EXPANSION!^\> CONWAY .TEXT <^CONTINUE ANYWAY? (Y/N): \> NOVCM .TEXT <VIDEO CHARACTERISTICS FILE BAD/MISSING!^\> / VCM TEXT /VCM0@@SV/ NAME OF VCM FILE TITLE MAIN HELP MESSAGE / HELPMSG .TEXT <^^RUN-TIME OPTIONS:^> .TEXT < /A AUDIT TRAIL OF CHANGES WITH VERSION #'S^> .TEXT < /B INHIBIT AUTOMATIC FILE BACKUP ON CLOSE^> .TEXT < /C ALLOW LOWER CASE CHARS BEFORE COMMENT^> .TEXT < /F STRIP FORM FEEDS ON INPUT^> .TEXT < /H ASSEMBLER/COMPILER HEURISTICS ON ENTRY^> .TEXT < /M FLAG MODIFIED LINES WITH CONTROL/A^> .TEXT < /O EDIT WITH NO OUTPUT^> .TEXT < /P USE SLOW, BUT OPTIMAL PACKING ON FILE CLOSE^> .TEXT < /V DON'T INCREMENT VERSION NUMBER^> .TEXT < /W WORDWRAP LINES WIDER THAN SCREEN^> .TEXT < /Z SKIP OVER & IGNORE END OF FILE^^> .TEXT < /1-9 SELECT ALTERNATE VCM FILE #1-9^> .TEXT <VISTA COMMANDS^^> .TEXT <C CLOSE BLOCK SAVE BUFFER AS 'PIKUPX' ON SYS:^> .TEXT <LA LOOK UP FILE 'PIKUPA' ON SYS: FOR PICKUP^> .TEXT <M MARK ALL ROWS SCROLLED OFF THE SCREEN^> .TEXT <R REPLACE SEARCH STRINGS WITH FOLLOWING STRING^> .TEXT <S SEARCH FOR STRING THAT FOLLOWS^> .TEXT <W SEARCH FOR WORD THAT FOLLOWS^> .TEXT <^IF MORE THAN 2 PDP-8 PAGES ARE NEEDED FOR HANDLER SPACE> .TEXT <^/H OPTION, INVERT CASE AND TAB LEFT FUNCTIONS ARE NOT> .TEXT <^AVAILABLE. IF ALL 4 HANDLER PAGES ARE NEEDED> .TEXT <^/P OPTION IS FORCED> .TEXT <^\> MAIN SENTINEL ON MESSAGE TITLE DIRECTORY CLEANUP AFTER FILE CLOSURE / / HERE TO CLOSE OUT THE OUTPUT FILE. OUTPUT FILE IS CLOSED WITH / EXTENSION OF .TM. ANY OLD BACKUP IS DELETED. OLD FILE IS / CHANGED TO .BK AND NEW FILE IS THEN CHANGED TO PROPER / EXTENSION / ON /B OPTION, WE JUST CLOSE OUT THE FILE WITH THE ORIGINAL EXTENSION / ORG 07400 END OF FIELD 1 / / MESSAGES AND EXTEN ARE PLACED HERE BECAUSE FAST CLOSE / OVERWRITES 10000-17377. / WTEMP DC 0 TEMPORARY STORAGE FOR THIS PAGE WTEMP2 DC 0 ... EXTEN DC 0 SAVE CELL FOR EXTENSION NOCLOSE TEXT /^FILE CLOSE ERROR\/ IOMSG TEXT "^I/O ERROR! RETRY? \" TFULL TEXT /^DEVICE FULL\/ / ISEC 0 PAGING BACK ON AGAIN / ICLOSE CDF 0 TO GET AT VIRTUAL BLOCK TADI =TFFVBLK THIS IS THE ACTUAL LENGTH OF THE FILE CDF %* RESET CURRENT FIELD NOW DCA 2F STORE FINAL OUTPUT VIRTUAL BLOCK COUNT JMS NRUSR,8 LOCK USR IN CORE FOR CLOSE OPERATIONS / / WITH USR LOCKED INTO MEMORY, / ### CAUTION ### WE MUST BE VERY CAREFUL ABOUT / USING PAGE ZERO CELLS. / TAD $07600 REGET DEVICE NUMBER JMS USR,4 CLOSE OUT THE OUTPUT FILE DC 07601 POINTS TO OUTPUT FILE NAME 2H DC 0 BLOCK COUNT STORED HERE JMP FAILCL <1> CLOSE FAILED / / <2> OK: IF THERE IS A .BK FILE WITH THE SAME NAME, DELETE IT NOW / TAD $07643 LOAD DECODER SWITCH CLL RAL SHIFT /B BIT TO AC 0 SMA CLA SKIP IF /B SET JMP *+3 NOT SET: LOOK UP .BK FILE TADI =EXTEN SET TO DELETE ORIGINAL IF /B SET SKP TAD ="BK SAVE .BK EXTENSION DCA $07600+4 EXTENSION POSITION FOR OUTPUT FILE TAD $07600 GET DEV NUMBER ROOM 7 JMS USR,2,07600+1,0 LOOK UP THE FILE NOW JMP 7F <1> NO FILE HERE WITH .BK EXTENSION TAD $07600 <2> FOUND: DELETE ANY OLD .BK VERSION NOW ROOM 7 JMS USR,4,07600+1,0 JMP FAILCL <1> CLOSE ERROR ON DELETE EJECT / / <2> OK: NOW LOOK TO SEE IF ANY ORIGINAL FILE WITH THIS NAME / 7H TADI =EXTEN THE SAVED EXTENSION DCA $07600+4 MOVE IT INTO NAME TAD $07600 GET DEV # ROOM 7 JMS USR,2,07600+1,0 DO FILE LOOKUP JMP 3F <1> NO ORIGINAL FILE WITH THAT NAME TAD ="BK <2> YES: CHANGE IT'S NAME NOW TO .BK JMS WRDCT WRITE OUT DIRECTORY NOW / / NOW LOOK UP THE FILE WE JUST CLOSED OUT AND CHANGE IT FROM .TM / TO THE ORIGINAL EXTENSION / 3H TAD ="TM RESET FILE EXTENSION DCA $07600+4 TAD $07600 GET DEV # ROOM 7 JMS USR,2,07600+1,0 LOOK UP OUTPUT FILE JMP FAILCL <1> ERROR: FILE DISAPPEARED??! TADI =EXTEN <2> OK: GET THE ORIGINAL EXTENSION JMS WRDCT WRITE OUT THE DIRECTORY NOW JMPX QUIT AND RETURN TO OS/8 VIA 'QUIT' / / HERE ON ERROR OF TRYING TO CLOSE OUT THE FILE / FAILCL JMPX CLFAIL BACK TO FIELD 0 TO ISSUE ERROR MESSAGE EJECT / / SUBROUTINE TO CHANGE THE EXTENSION OF THE LAST FILE LOOKED UP / IN THE USR ROUTINES. EXTENSION VALUE SHOULD BE IN AC / WRDCT SUB DCA WTEMP2 SAVE NEW EXTENSION LDI -1 TADI =$01404 MINUS # OF INFORMATION WORDS TADI =$017 + POINTER TO LENGTH WORD DCA WTEMP NOW POINTS AT FILE EXTENSION TAD WTEMP2 SET NEW EXTENSION DCAI WTEMP ... TADI =$051 GET ADDR OF DEV HANDLER DCA WTEMP SAVE THAT TADI =$7 GET SEGMENT NUMBER HERE AND =7 ISOLATE SEGMENT DCA 1F STORE ARGUMENT ROOM 9 DWRITE CIF 0 HANDLER IN FIELD 0 JMSI WTEMP WRITE OUT THIS DIRECTORY NOW DC 04210 1 BLOCK, WRITE, BANK 1 DC 01400 LOCATION OF DIRECTORY 1H DC 070 BLOCK HERE (70 IN CASE BUG !) SMA CLA <1> SKIP IF FATAL I/O ERROR RET WRDCT <2> ALL OK: RETURN NOW JMPX WFAIL I/O ERRORS ON DIRECTORY! BETTER RETRY! / ORG 07600 END OF CODE IN FIELD 1