1 TITLE SRCCOM V.016 12-JUNE-69
\r
2 SUBTTL SOURCE FILE COMPARE - BOWERING/TWE
\r
3 ;*****(C)COPYRIGHT 1969 BY DIGITAL EQUIPMENT CORP., MAYNARD, MASS.,USA*****
\r
9 EXTERNAL JOBFF, JOBREL, JOBDA
\r
11 IFNDEF PURE,<PURE=1>
\r
14 ACDEV==1 ;COMMAND SCANNER ACCUMULATORS
\r
19 ACPPN==6 ;COMMAND SCANNER AC FOR PROJ,PROG #
\r
21 CTL=0 ;I/O CHANNEL ASSIGNMENTS
\r
25 AL=1 ;ASCII LINE MODE
\r
30 FIL=4 ;FILE # (0 IS FILE 1; 1 IS FILE 2)
\r
31 F1=5 ;LINE POINTER FILE 1 (CONTAINS INTEGER)
\r
32 F2=F1+1 ;DITTO FILE 2
\r
33 FR=7 ;FLAG REGISTER (LH) AND FILE #(0 OR 1)(RH)
\r
34 C=10 ;CONTAINS 1 CHAR FOR PROCESSING
\r
37 PP=17 ;PUSH DOWN POINTER
\r
38 LPDL==20 ;LENGTH OF PUSH DOWN LIST
\r
44 VT==13 ;VERTICAL TAB
\r
46 NOFORM==1 ;DON'T OUTPUT FORM FEED
\r
48 ENDSW==4 ;END SWITCH (SUPPRESS FORM-FEED IF FILES IDENTICAL)
\r
49 SSWBIT==100 ;/S SWITCH - IGNORE SPACING
\r
50 CSWBIT==200 ;/C SWITCH - IGNORE COMMENTS
\r
51 ALLSW==400 ;/B SWITCH (ALLOWS COMPARING BLANK LINES)
\r
52 EOF1SW==1000 ;EOF SEEN ON FILE 1
\r
53 EOF2SW==2000 ;EOF SEEN ON FILE 2
\r
54 IOTTY==4000 ;OUTPUT TO TTY
\r
55 CTYPF==10000 ;1 IF ANY CHARS TYPED FOR A COMMAND
\r
57 MATCH==3 ;# LINES TO BE MATCHED
\r
58 WPL==^D100/5+1 ;MEMORY WORDS/LINE
\r
59 LPP==^D52 ;LINES/PAGE
\r
65 MOVEM 0,JOBFF ;SET JOBFF AFTER VARIABLE AREA
\r
66 MOVE PP,[IOWD LPDL,PPSET] ;SET UP PUSH DOWN LIST
\r
69 CALLI 0,11 ;CORE UUO
\r
70 JRST ERRCOR ;NOT AVAILABLE
\r
71 SETZM PPSET ;THIS IS THE ZERO WHICH WILL ; BE "BLT"ED TO CLEAR CORE
\r
72 MOVE [XWD PPSET,PPSET+1] ;ZERO STORAGE AREA
\r
75 MOVEM 0,NUMLIN ;MATCH IS NORMALLY 3 LINES (N-1)
\r
76 AOS PAGNUM+0 ;ZEROED BY BLT ABOVE-1ST PAGE IS 1
\r
77 AOS PAGNUM+1 ;DITTO FOR SECOND FILE
\r
78 MOVSI FR,NOFORM+PAGSW ;INIT FR FOR NEW PAGE HEADING
\r
79 PUSHJ PP,INITTY ;INITIALIZE TTY
\r
80 PUSHJ PP,CRLF ;OUTPUT CARRIAGE RETURN - LINE FEED
\r
81 MOVEI C,"*" ;TELL USER WE ARE READY FOR COMMAND
\r
82 PUSHJ PP,TYO ;OUTPUT THE *
\r
83 PUSHJ PP,DMPOUT ;OUT GOES THE *
\r
84 PUSHJ PP,NAME1 ;ANALIZE OUTPUT DEVICE AND NAME
\r
85 CAIN C,"_" ;ERROR IF NO ARROW
\r
86 JRST CTLSE1 ;ITS THERE--PROCEED
\r
87 TLNN FR,CTYPF ;ANY COMMAND TYPED?
\r
89 CTLSER: JSP T,ERROUT
\r
90 ASCIZ /?COMMAND ERROR/
\r
92 CTLSE1: JUMPN ACFILE,CTLSE2 ;NO DEFAULT IF DEVICE NOT 0
\r
94 MOVSI ACDEV,(SIXBIT /TTY/) ;IF FILENAME 0, ASSUME TTY
\r
96 MOVSI ACDEV,(SIXBIT /DSK/) ;IF FILENAME NOT 0, ASSUME DISK
\r
97 MOVEM ACDEV,OUTDEV ;SAVE OUTPUT DEVICE IN DIRECTORY BLOCK
\r
98 MOVEM ACFILE,OUTDIR ;PUT SIXBIT FILE NAME IN
\r
99 MOVEM ACEXT,OUTDIR+1 ;AND SAVE EXTENSION
\r
100 \f;PROCESS INPUT PART OF COMMAND STRING
\r
101 PUSHJ PP,NAME1 ;GET INPUT COMMAND STRING
\r
102 CAIN C,"," ;COMMA TO TERMINATE 1ST INPUT FILE?
\r
103 TLNN FR,CTYPF ;ANY FILE DESCRIPTOR TYPES?
\r
104 JRST CTLSER ;NO, ERROR
\r
105 SKIPN ACDEV ;ASSUME DSK IF NO SPECIFIED DEVICE
\r
106 MOVSI ACDEV,(SIXBIT /DSK/)
\r
108 MOVEM ACFILE,INDIR1 ;FIRST INPUT FILE
\r
109 MOVEM ACEXT,INDIR1+1 ;AND SAVE EXTENSION
\r
110 MOVE 0,OPN1 ;INIT IN1,1
\r
111 MOVE 2,OPN1+1 ;INBUF1
\r
112 MOVE 3,OPN1+3 ;ERROR
\r
113 MOVE 4,OPN1+4 ;JRST CTLSE3
\r
114 JRST 0 ;OPEN FILE FILE #1
\r
116 CTLSE3: INBUF IN1,2 ;DO LOOKUP ON FIRST FILE NAME
\r
118 JRST ERRIA ;ERROR RETURN
\r
120 TLNN FR,CTYPF ;ANY FILE DESCRIPTOR TYPED?
\r
121 JRST CTLSER ;NO, ERROR
\r
123 MOVSI ACDEV,(SIXBIT /DSK/) ;"DSK" IS DEFAULT
\r
126 MOVEM ACFILE,INDIR1 ;INSERT FILE NAME AND EXTENSION
\r
127 CAIN ACDEL,"." ;PERIOD MEANS EXPLICIT EXTENSION
\r
128 MOVEM ACEXT,INDIR1+1
\r
129 MOVE 0,OPN2 ;INIT IN2,2
\r
134 JRST 0 ;OPEN FILE IN REGISTERS.
\r
135 ERR2A: INBUF IN2,2 ;LOOKUP ON SECOND FILE NAMES
\r
138 MOVSI 0,41000 ;INIT
\r
140 MOVSI 0,41140 ;INIT
\r
142 MOVSI ACFILE,CTOBUF
\r
144 MOVSI 2,OUTBUF ; ADJUST REGISTERS.
\r
147 JRST 0 ; EXECUTE IN REGISTERS
\r
148 CTLSE4: MOVE TT,OUTDEV
\r
152 TLNE TT,40010 ; CHECK IF TTY OR LPT
\r
154 MOVE T,INDIR1 ; SETUP OUTPUT FILE
\r
157 MOVSI T,(SIXBIT /SCM/)
\r
159 MOVSI T,(SIXBIT /MRG/)
\r
162 MOVE 0,[ENTER CTL,OUTDIR]
\r
164 HRLI 0,(ENTER OUT,) ; ENTER OUTPUT FILE
\r
171 HRRZM W1,LBUFP1 ;SET 1ST ADDRESS FILE 0
\r
172 SETZM 0,1(W1) ;FORCE NULLS INTO BUFFER
\r
173 HRRZM W1,LBUFP2 ;DITTO FILE 2
\r
175 SUB W1,JOBFF ;COMPUTE SPACE AVAILABLE
\r
177 LSH W1,-1 ;AVAILABLE SPACE/2
\r
178 ADDB W1,LBUFP2 ;INPUT POINTER FILE 2 STARTS HALF WAY THROUGH BUFFER
\r
179 SETZM 1(W1) ;FORCE NULLS INTO BUFFER
\r
181 MOVEM 0,OLDNUM ;ANY LINE # IS SMALLER THAN
\r
182 MOVEM 0,OLDNUM+1 ; THIS ONE
\r
183 SETOB F1,TOP1 ;INITIALIZE TOP OF EACH FILE
\r
184 SETOB F2,TOP2 ;THE TOP IS THE HIGHEST LINE THAT WE HAVE EXAMINED
\r
203 JRST MAINST ;START COMPARE WITH 1ST LINES
\r
204 \f;THE FOLLOWING CODE IS THE GUTS OF THE PROGRAM.
\r
205 ;WHEN THE LOOP AROUND MAIN DETECTS THAT TWO LINES ARE NOT A MATCH
\r
206 ;CONTROL GOES OFF TO DETERMINE THE EXTENT OF THESE DIFFERENCES.
\r
207 ;THE TOTAL DIFFERENCES ARE DETERMINED AS FOLLOWS. FIRST GET TWO
\r
208 ;MORE LINES. DOES THE ORGINAL LINE IN FILE 1 WHICH DID NOT MATCH
\r
209 ;MATCH THE NEW LINE FROM FILE TWO. IF SO THEN THE ORGINAL LINE
\r
210 ;IN FILE 2 WAS AN INSERTION. (OR A DELETION). IF NO MATCH THIS
\r
211 ;WAY TRY IT THE OTHER WAY. IF STILL NO MATCH GET TWO MORE LINES
\r
212 ;TAKE THE NEW LINE FROM FILE 1 AND TRY TO MATCH IT AGAINST ALL THE
\r
213 ;LINES WE HAVE BEEN EXAMINING IN FILE TWO; THEN DO IT THE OTHER
\r
214 ;WAY AROUND. EOF'S ARE DETECTED BY "GETTWO" WITH NO RETURN SKIP
\r
216 MAIN: TRZ FR,-1 ;THIS FOR FILE ONE
\r
218 PUSHJ PP,MOVEUP ;MOVE UP THE BOTTOM, BECAUSE WE ARE FINISHED
\r
220 HRRI FR,1 ;NOW FOR FILE TWO
\r
223 PUSHJ PP,MOVEUP ;UP GOESA THE BOTTOM POINTER
\r
224 MAINST: SETOB F1,F2 ;INITIALIZE LINE POINTERS
\r
225 PUSHJ PP,GETTWO ;GET TWO LINES
\r
226 JRST MAIN15 ;ONE FILE SHORT
\r
227 PUSHJ PP,COMPL ;COMPARE THESE TWO LINES
\r
228 JRST MAIN ;THEY MATCH--LOOK AT NEXT TWO
\r
230 ;WHEN WE GET HERE WE HAVE DETECTD A DIFFERENCE
\r
231 ;NOW THE PROGRAM WILL LOOK AHEAD TO TRY AND FIND THE NEXT TWO
\r
234 MAIN10: PUSHJ PP,GETTWO ;GET THE NEXT TWO LINES
\r
235 JRST MAIN15 ;ONE FILE SHORT
\r
236 SETZ F1, ;RESET POINTER FOR FIRST FILE TO
\r
237 ;THE LINE IN WHICH THE DIFFERENCE WAS FOUND
\r
239 MAIN12: PUSHJ PP,COMPL ;NOW SEE IF WE CAN MATCH THAT LINE
\r
240 JSP W1,MULTI ;FOUND 1 LINE MATCH- LOOK FOR MULTIPLE
\r
241 CAME F1,F2 ;HAVE WE LOOKED FROM THE MISMATCHED LINE
\r
242 ;TO THE CURRENT LINE?
\r
243 AOJA F1,MAIN12 ;NO--UP LINE POINTER AND TRY AGAIN
\r
244 SETZ F2, ;HAVEN'T FOUND A MATCH THIS TIME
\r
245 ;NOW TRY IT THE OTHER WAY
\r
247 MAIN14: CAML F2,F1 ;LOOKED FAR ENOUGH? (THIS VERSION HAS
\r
248 ;THE INEFFICIENCY MENTIONED IN THE LIBRARY
\r
249 ;WRITE UP REMOVED- TWE)
\r
252 JSP W1,MULTI ;LOOK FOR MULTI LINE MATCH
\r
253 AOJA F2,MAIN14 ;INDEX AND LOOK SOME MORE
\r
255 ;THE MAIN15 CODE HANDLES THE CASE OF EITHER (OR BOTH) FILES
\r
256 ;HAVING NO LINES TO COMPARE. IF BOTH FILES HAVE NO LINES, "FINISH"
\r
257 ;PRINTS OUT ALL LINES IN BOTH FILES (IF ANY) AS DIFFERENCES.
\r
258 ;IF EITHER FILE HAS A NEW LINE, THE SHORTER FILE IS
\r
259 ;SEARCHED FOR A MATCH FOR THAT LINE. THIS CONTINUES (READING A NEW LINE
\r
260 ;FROM THE LONGER FILE) UNTIL NEITHER FILE HAS ANY LINES OR UNTIL A
\r
263 MAIN15: SKIPGE W1,GETFIL ;DOES EITHER FILE HAVE A LINE?
\r
265 HRRZM W1,FIL ;SAVE FILE # THAT HAS LINES
\r
266 HRR FR,W1 ;SETUP FR FOR MAIN18
\r
267 JUMPL F1,MAIN18 ;TRA IF FILE 1 HAS NO LINES
\r
268 JUMPL F2,MAIN18 ;DITTO FILE 2
\r
269 TRC FIL,1 ;CHANGE 1 TO 0 (OR VICE VERSA)
\r
270 SETOM F1(FIL) ;LOOK THRU SHORT FILE FOR MATCH
\r
271 MAIN17: MOVE W1,F1(FIL)
\r
272 CAML W1,TOP(FIL) ;SEARCHED THRU SHORT FILE?
\r
273 JRST MAIN10 ;YES, AND NO MATCH
\r
274 AOS F1(FIL) ;INDEX LINE
\r
275 PUSHJ PP,COMPL ;LOOK FOR A MATCHING LINE
\r
276 JSP W1,MULTI ;FOUND A MATCH, NOW LOOK FOR MULTIPLE MATCH
\r
277 JRST MAIN17 ;NO MULTI LINE MATCH
\r
279 MAIN18: PUSHJ PP,PNTTXT ;ALL LINES ARE GONE FROM 1 FILE.
\r
280 ;OUTPUT THE OTHER WITHOUT USING CORE
\r
285 ;AT THIS POINT NEITHER FILE HAS ANY MORE LINES TO BE READ.
\r
286 ;PRINT AS DIFFERENCES ANY LINES REMAINING FOR EITHER FILE.
\r
288 FINISH: JUMPGE F1,FIN1 ;PRINT DIFFERENCES IF EITHER BUFFER
\r
289 JUMPL F2,FIN2 ; HAS ANY LINES IN IT
\r
290 FIN1: PUSHJ PP,PNTBTH ;PRINT ANY LINES
\r
291 FIN2: MOVEI T,[ASCIZ /NO DIFFERENCES ENCOUNTERED/]
\r
292 SKIPN 0,ERRCNT ;ANY DIFFERENCES?
\r
293 PUSHJ PP,TYPMSG ;NO, PRINT MESSAGE
\r
297 MOVEI T,[ASCIZ /END OF MERGE/]
\r
299 JRST CARR1 ;END OF SOURCE COMPARE
\r
301 ;THIS SECTION LOOKS FOR MULTI LINE MATCH
\r
303 MULTI: SKIPG NUMLIN ;MULTIPLE LINE TEST?
\r
305 HRRZM W1,RTNTMP ;YES, SAVE RETURN ADDRESS
\r
306 SETZM NUMTMP ;INIT MULTI-LINE COUNTER
\r
307 MOVEM F1,TEMPF1 ;SAVE CURRENT POINTERS
\r
309 MULT2: PUSHJ PP,GETTWO ;GET NEXT TWO LINES
\r
310 JRST MULT4 ;ONE FILE DOESN'T HAVE A LINE
\r
311 PUSHJ PP,COMPL ;COMPARE THEM
\r
312 JRST MULT6 ;MATCH, TEST MULTI COUNTER
\r
313 MULT4: MOVE F1,TEMPF1 ;NO MATCH, RESET REGS
\r
315 JRST @RTNTMP ;RETURN TO WHERE WE GOT TO MULTI FROM
\r
317 MULT6: AOS W1,NUMTMP ;INDEX MULTI-LINE COUNTER
\r
318 CAMGE W1,NUMLIN ;TEST FOR END
\r
319 JRST MULT2 ;TEST NEXT TWO
\r
320 SUB F1,W1 ;RESET TO 1ST COMPARISON
\r
322 MULT8: PUSHJ PP,PNTBTH ;PRINT DIFFERENCES
\r
326 ;THE TEXT OF DIFFERENCES HAS BEEN PRINTED--PUT IN ******
\r
327 ;AND A CARRIAGE RETURN-LINE FEED AND GO BACK AND START COMPARING
\r
328 ;WHEN WE START COMPARING AGAIN THE LINE POINTERA WILL
\r
329 ;BE POINTING TO THE FIRST TWO LINES AFTER THE MATCHING LINES
\r
331 MOVE W1,[POINT 7,[ASCIZ /***************/]]
\r
333 PUSHJ PP,PCRLF ;PRINT CARRIAGE RETURN-LINE FEED
\r
334 MULT8A: ADD F1,NUMLIN ;CAUSE MOVEUP TO FLUSH ALL THE
\r
335 ADD F2,NUMLIN ; LINES THAT WERE JUST MATCHED
\r
336 JRST MAIN ;DIFFERENCES PRINTED- LOOK FOR MORE
\r
337 MULT9: TLNN FR,40000
\r
342 MULT10: PUSHJ PP,GETC
\r
349 MULT11: SETOM MPP(FR)
\r
355 MULT13: PUSHJ PP,TTYIN1
\r
373 \f;THIS ROUTINE SETS UP THE POINTERS TO THE TEXT
\r
375 ;MEMORY STORAGE AREA LOOKS LIKE THIS:
\r
376 ;1) BUFFER SPACE FOR FILE # 0 (POINTED TO BY LBUFP1)
\r
377 ; A) XWD (PAGE #),(WORD COUNT FOR LINE (INCLUDING THIS WORD))
\r
379 ; MORE TEXT FOR LINE 0
\r
380 ; & MORE, ENDED WITH A NULL
\r
381 ; B) MORE LINES (EACH WITH PAGE #,WORD COUNT, AND TEXT
\r
382 ;2) BUFFER SPACE FOR FILE 1 (POINTED TO BY LBUFP2)
\r
385 SETP: HRRI FR,1 ;SET UP POINTER FILE 1
\r
387 HRRI FR,0 ;DITTO FILE 0
\r
389 SETONE: MOVE W3,F1(FR) ;GET LINE #
\r
390 SETON1: MOVE TT,OLDNUM(FR) ;GET LAST # COMPUTED FOR
\r
391 MOVEM W3,OLDNUM(FR) ;SAVE NEW # AS OLD
\r
392 CAML W3,TT ;IS NEW LARGER THAN OLD?
\r
393 SKIPA T,OLDPNT(FR) ;YES, START FROM OLD BYTE POINTER
\r
394 SKIPA T,LBUFP1(FR) ;NO, START FROM BEGINNING
\r
395 SUB W3,TT ;LOOP ONLY FROM OLD POINTER
\r
396 MOVSI TT,(ADD T,(T)) ;(SET UP IN AC)
\r
397 MOVE TT+2,[JRST SETON2];SET UP AC
\r
398 MOVE TT+1,.+1 ;SET UP AC
\r
400 ;TT/ ADD T,(T) ;ADD IN WORD COUNT FOR LINE
\r
401 ;TT+1/ SOJGE W3,.-1 ;MORE LINES LEFT?
\r
402 ;TT+2/ JRST SETON2 ;NO
\r
404 SETON2: HRRZM T,OLDPNT(FR) ;SAVE POINTER TO THIS LINE
\r
405 HRLI T,700 ;NO, CHANGE TO BYTE POINTER
\r
409 ;MOVE UP THE POINTERS WHICH POINT TO THE LINES FROM WHICH WE
\r
410 ;ARE EXAMINING. THIS IS DONE EVERYTIME A MATCH IS FOUND
\r
412 MOVEUP: SKIPE MPP(FR)
\r
418 MOVE0: MOVEI W1,1(T)
\r
419 HRLI W1,(POINT 7,,)
\r
426 MOVEY: MOVE W3,F1(FR) ;GET LINE # FOR THIS
\r
427 CAML W3,TOP(FR) ;GETTING RID OF ALL LINES?
\r
428 JRST MOVEX ;YES, DON'T MOVE MEMORY
\r
429 AOS W3,F1(FR) ;GET LINE # OF LINE TO SAVE
\r
430 PUSHJ PP,SETON1 ;GET ADR OF 1ST LINE TO SAVE
\r
431 HRL T,LBUFP1(FR) ;SET UP BLT AC (REVERSED)
\r
433 AOS W3,TOP(FR) ;GET 1ST NON-EXISTANT LINE #
\r
434 PUSHJ PP,SETON1 ;GET CORRESPONDING 1ST ADR
\r
436 SUB T,W1 ;CALCULATE WORD COUNT OF TRANSFER
\r
437 ADD T,LBUFP1(FR) ;CALCULATE "E" OF BLT AC,E
\r
438 MOVSS 0,W1 ;SWITCH AC TO XWD FROM,TO
\r
439 BLT W1,(T) ;AND AWAY WE GO
\r
441 MOVEX: SETCM W2,F1(FR) ;W2_-<(F1)+1>
\r
442 ADDM W2,TOP(FR) ;CHANGE TO OP TO ACCOUNT FOR DEAR DEPARTED LINES
\r
444 MOVEM 0,OLDNUM(FR) ;FORCE SETON1 TO RECALCULATE
\r
446 \f;CODE FOR GETTING TWO LINES
\r
447 ;CALLING SEQUENCE IS:
\r
449 ; RETURN 1 IF EITHER FILE HAS NO MORE LINES
\r
450 ; RETURN 2 IF ONE LINE READ FROM EACH FILE
\r
451 ; C(GETFIL)=THE # OF FILE FOR WHICH A LINE WAS READ (OR -1 IF NONE)
\r
453 GETTWO: SETOM GETCNT ;INIT # LINESOBTAINDED
\r
454 SETOM GETFIL ;INIT FILE # LINE CAME FROM
\r
455 TRZ FR,-1 ;ZERO RIGHT HALF OF "FR"--SET FOR FIRST FILE
\r
456 PUSHJ PP,GLINE ;GET A LINE FROM FIRST FILE
\r
457 HRRI FR,1 ;NOW DO FOR SECOND FILE
\r
459 SKIPLE GETCNT ;GETCNT .G. 0 IF TWO LINES WERE GOT
\r
460 AOS (PP) ;SKIP IF 2 LINES WERE AVAILABLE
\r
463 GLINE: TLZ FR,20000
\r
464 AOS W1,F1(FR) ;BUMP THE LINE POINTERS
\r
465 CAMG W1,TOP(FR) ;HAVE WE GONE OVER THE TOP
\r
466 JRST GLEXIT ;NO, LINE WAS AVAILABLE
\r
467 SOS F1(FR) ;NOT CLEAR YET THAT A NEW LINE EXISTS
\r
468 GLINE1: HRLS PAGNUM(FR) ;SAVE PAGE # AT BEGINNING OF LINE
\r
469 PUSHJ PP,GCHAR ;GET A CHARACTER
\r
470 TLNE FR,@EOFTBL(FR) ;END OF FILE?
\r
471 POPJ PP, ;YES, NO LINE
\r
472 TLNN FR,ALLSW ;SKIP IF COMPARING BLANK LINES
\r
473 JUMPE C,GLINE1 ;NULLS INDICATE BLANK LINES
\r
474 AOS W1,F1(FR) ;THERE ARE CHARS FOR A NEW LINE
\r
475 MOVEM W1,TOP(FR) ;THIS LINE IS THE TOP LINE
\r
476 PUSHJ PP,SETONE ;CALCUATE BYTE POINTER
\r
477 MOVE W1,1(FR) ;GET BYTE POINTER IN W1
\r
478 MOVEM W1,WCADR ;SAVE ADR OF LINE WORD COUNT
\r
479 MOVE W2,PAGNUM(FR) ;PICKUP PAGE # AT BEGINNING OF LINE
\r
480 HLLZM W2,(W1) ;SAVE WITH THIS LINE
\r
483 MLON ;MULTI LINE LITERAL
\r
485 GLINE2: PUSHJ PP,GCHAR ;GET NEXT CHAR FOR LINE
\r
486 GLINE3: TLNN W1,760000 ;WITH NEXT IDPB GO INTO NEXT WORD?
\r
487 JRST [HRRZ W3,@GLTBL(FR);YES,GET HIGHEST ADR FOR THIS BUFFER
\r
488 CAIG W3,3(W1) ;CHECK ADR. (LEAVE 1 WORD FOR WORD
\r
489 ;COUNT FOR NEXT LINE PLUS 1 WORD
\r
491 JRST NOROOM ;NO ROOM IN THE INN
\r
492 HLRZM C,1(W1) ;PUT BIT17 INTO BIT35 (FOR SEQUENCE #)
\r
493 JRST .+1] ;GO INTO MAIN LOOP
\r
494 IDPB C,W1 ;STORE CHARS IN LINE BUFFER
\r
495 JUMPN C,GLINE2 ;NULL CHARACTER IS END OF LINE
\r
496 MOVE W3,WCADR ;GET BACK ADR OF WORD COUNT
\r
497 SUBI W1,-1(W3) ;CACLULATE WORD COUNT
\r
498 HRRM W1,(W3) ;SAVE WORD COUNT IN BUFFER
\r
499 GLEXIT: AOS GETCNT ;INDEX # LINES FOUNT
\r
500 HRRZM FR,GETFIL ;SAVE # OF THIS FILE
\r
503 GLTBL: LBUFP2 ;POINTS TO TOP ADR FILE 0
\r
504 JOBREL ;POINTS TO TOP ADR FILE 1
\r
505 \f;IF A "CORE" UUO IS INSTALLED HERE, IT MUST ADJUST THE FOLLOWING
\r
506 ;LIST OF LOCATIONS (ALL BY THE AMOUNT THE SECOND BUFFER AREA
\r
507 ;IS MOVED, IF ANY):
\r
508 ;1) BYTE POINTER ADDRESS IN: W1
\r
509 ;2) BUFFER POINTER IN: LBUFP2
\r
510 ;3) 1ST ADDRESS FOR LINE IN: 0(PP) ON PUSH DOWN LIST
\r
511 ;THEN RETURN TO THE IDPB NEAR GLINE2+6
\r
514 NOROOM: PUSH PP,W1 ;SAVE BYTE POINTER
\r
515 TRC FR,1 ;CHANGE 1 TO 0 (OR VICE VERSA)
\r
516 MOVE W3,TOP(FR) ;GET TOP LINE # FOR "OTHER" FILE
\r
517 ADDI W3,1 ;FIND 1ST ADR OF THE NEXT LINE ABOVE TOP
\r
518 PUSHJ PP,SETON1 ;GET ADR
\r
519 HRRZM T,HIGH ;SAVE 1ST FREE ADR OF NON-FULL FILE
\r
520 HRRZ T,@GLTBL(FR);GET HIGHEST ADR AVAILABLE TO NON-FULL FILE
\r
521 SUB T,HIGH ;GET SPACE AVAILABLE
\r
522 SUBI T,2 ;LEAVE 1 WRD FOR NEXT LINE WORD COUNT
\r
523 ;PLUS 1 WORD SLOP TO BE SAVE
\r
524 TRC FR,1 ;CHANGE FILE # BACK TO THE WAY IT WAS
\r
525 MOVEM T,ROOM ;SAVE ROOM AVAILABLE
\r
526 CAIL T,^D400 ;COMPARE WITH 400. (NO MAGIC SIGNIFICANCE)
\r
527 JRST NOR2 ;PLENTY ROOM AVAILABLE- DON'T GET MORE CORE
\r
530 MOVEM T,W1 ;SAVE THIS JOBREL AS "OLD" JOBREL
\r
531 ADDI T,1 ;REQUEST CORE SIZE CONTAINING THIS ADDRESS
\r
532 NOR1: CALLI T,11 ;CORE UUO
\r
535 NOR11: JUMPG T,NOR2+1 ;ANY CORE LEFT AT ALL?
\r
536 NORERR: JSP T,ERROUT ;NO, PRINT MESSAGE
\r
537 ASCIZ /?BUFFER CAPACITY EXCEEDED AND NO CORE AVAILABLE/
\r
539 NOR4: HRRZ T,44 ;CORE UUO SUCCESFUL- GET "NEW" JOBREL
\r
540 SUB T,W1 ;FIND OUT HOW MUCH WAS ADDED
\r
541 ADDB T,ROOM ;UPDATE TOTAL ROOM AVAILABLE
\r
542 NOR3: TRNE FR,1 ;WHICH FILE NEEDS ROOM?
\r
543 JRST NOR98 ;FILE #1, IT JUST GOT IT
\r
544 ;FILE #0, SHUFFLE CORE
\r
545 NOR2: ASH T,-1 ;DIVIDE AVAILABLE SPACE BETWEEN FILES
\r
546 MOVEM T,ROOM ;FILE #1 GETS MOVED THIS AMOUNT
\r
547 TRNN FR,1 ;WHICH FILE NEEDED ROOOM?
\r
548 JRST NOR7 ;FILE #0. MOVE #1 TOWARD 777777
\r
549 ;FILE #1. MOVE #1 TOWARD 0
\r
550 NOR6: MOVNS T,ROOM ;FIOLE IS MOVING IN NEGATIVE DIRECTION
\r
551 ADDM T,WCADR ;WORD COUNT ADR FOR FILE# 1 IS MOVED DOWN
\r
552 ADDM T,(PP) ;SAME WITH BYTE POINTER
\r
553 MOVE W1,(PP) ;GET LAST ADR TO MOVE FROM BYTE POINTER
\r
554 ADD T,LBUFP2 ;GET "TO" ADR. [(LBUFP2)-D OF M]
\r
555 HRL T,LBUFP2 ;GET "FROM" ADR
\r
556 BLT T,(W1) ;BLT T,"E" (T/ XWD "FROM","TO")
\r
559 NOR7: MOVE W1,T ;GET D OF M
\r
560 HRLI W1,(POP T,(T)) ;SETUP- POP T,<D OF M>(T) INTO W1
\r
561 MOVE W2,HIGH ;GET HIGH(+1) ADR OF FILE #1
\r
562 SUB W2,LBUFP2 ;GET LENGTH OF FILE #1
\r
563 SOS T,HIGH ;GET LAST ADR IN FILE #1
\r
564 HRLI T,400000(W2);PUT WORD COUNT(+400000) IN LEFT HALF
\r
565 ;400000 AVOIDS PDL OVERFLOW PROBLEM IN AC LOOP
\r
566 MOVE W3,[JRST NOR90]
\r
568 JUMPL T,W1 ;W1/ POP T,<DISTANCE OF MOVE>(T)
\r
571 ;THE ABOVE INSTRUCTIONS ARE A REVERSE BLT AND ARE IN THE AC'S FOR SPEED
\r
573 NOR90: MOVE T,ROOM ;GET DISTANCE FILE #1 WAS MOVED
\r
574 ADDM T,LBUFP2 ;MODIFY STARTING ADR OF FILE #1
\r
576 MOVEM 0,OLDNUM+1 ;FORCE "SETONE" TO RECALCULATE BYTE POINTER
\r
578 NOR99: JRST GLINE3 ;CHECK COMPUTATIONS ON RETURNING
\r
580 \f;THIS PAGE CONTAINS ROUTINE FOR COMPARING TWO LINES
\r
581 ;IT HAS TWO RETURNS--CALLING ADR.+1 IF LINES MATCH OR
\r
582 ;CALLING ADR+2 IF NO MATCH
\r
584 COMPL: PUSHJ PP,SETP ;CALCULATE POINTER TO TEXT
\r
585 MOVEM W1,P1 ;P1=TEMP POINTER TO TEXT FOR FIRST FILE
\r
586 MOVEM W2,P2 ;P2 FOR SECOND FILE
\r
589 TDNN W3,1(W1) ;TEST SEQUENCE # BIT
\r
590 JRST .+3 ;NOT SEQ. #
\r
591 AOS P1 ;SKIP OVER SEQ. # AND
\r
593 TDNN W3,1(W2) ;SAME THING FOR FILE #2
\r
598 COMPL1: ILDB W1,P1 ;GET A CHARACTER FROM LINE FROM FIRST FILE
\r
599 COMPL2: ILDB W2,P2 ;AND ONE FROM SECOND FILE
\r
600 CAME W1,2 ;THIS IS THE BIG TEST--ARE THEY EQUAL
\r
602 COMPL7: CAIN W1,";" ;YES, COMMENT?
\r
603 TLNN FR,CSWBIT ;YES, SUPPRESS COMMENTS?
\r
604 JUMPN W1,COMPL1 ;NO,NO. TEST FOR END OF LINE
\r
605 POPJ PP, ;LINES MATCH, RETURN
\r
607 COMPL3: ILDB W1,P1 ;GET NEW CHAR FOR FILE 1
\r
608 COMPL4: CAIE W1,40 ;SPACE?
\r
609 CAIN W1,TAB ;OR TAB?
\r
610 TLNN FR,SSWBIT ;AND IS SPACING BEING IGNORED?
\r
612 JRST COMPL3 ;FLUSH SPACE OR TAB FOR FILE 1
\r
615 CAIN W2,TAB ;OR TAB?
\r
616 TLNN FR,SSWBIT ;AND IS SPACING BEING IGNORED?
\r
618 JRST COMPL2 ;YES, FLUSH A SPACE OR TAB FOR FILE 2
\r
620 CAMN W1,W2 ;ARE THE CHARACTERS NOW THE SAME?
\r
621 JRST COMPL7 ;YES, TEST FOR END OF LINES
\r
623 CAIE W1,";" ;COMMENT IN FILE 1?
\r
624 CAIN W2,";" ;OR IN FILE 2?
\r
625 TLNN FR,CSWBIT ;AND ARE COMMENTS BEING IGNORED?
\r
626 JRST CPOPJ1 ;NO, FILES DON'T MATCH, SKIP RETURN
\r
627 JUMPE W1,CPOPJ ;YES, OTHER CHAR MUST BE NULL OR ELSE ON
\r
628 JUMPE W2,CPOPJ ; LINE IS LONGER THAN OTHER AND FILES DIFFER
\r
631 \f;WHEN WE GET TO THIS POINT WE HAVE FOUND
\r
632 ;THE EXTENT OF THE DIFFERENCES AND WE ARE READY TO PRINT
\r
633 ;THESE DIFFERENCES OUT
\r
635 PNTBTH: TRZ FR,-1 ;OUTPUT FILE 1
\r
636 PUSHJ PP,PNTTXT ;PRINT FILE 1 DIFFERENCES
\r
637 MOVE W1,[POINT 7,[ASCIZ /****/]]
\r
640 HRRI FR,1 ;THEN PRINT FILE 2 DIFFERNCES
\r
642 ;THIS SUBROUTINE PRINTS ALL THE TEXT IN THE
\r
643 ;BUFFER SPECIFIED BY C(FR)R. I. E. FILE 1 OR FILE 2
\r
645 PNTTXT: SETOM TEMP ;START POINTER AT -1
\r
646 SETOM PAGEN ;GUARANTEE PAGE # MISMATCH- THERFORE PRINT IT
\r
647 PNTTX1: AOS W1,TEMP ;INDEX LINE COUNTER
\r
648 CAMLE W1,F1(FR) ;PRINTED ALL LINES?
\r
649 POPJ PP, ;YES, RETURN
\r
650 AOS ERRCNT ;MAKE ERRCNT NON-ZERO
\r
651 PUSH PP,F1 ;NO, SAVE LINE POINTERS
\r
653 SETZB F1,F2 ;F1=F2=0
\r
654 MOVEM W1,F1(FR) ;SET UP EITHER FOR F1 OR F2
\r
655 PUSHJ PP,SETONE ;CALCULATE BYTE POINTERS TO TEXT
\r
656 MOVE W1,W1(FR) ;UNNECESSARY FOR FILE 1- MOVES BYTE PNT FILE 2
\r
657 PUSHJ PP,PLINEN ;PRINT: 1) TEXT
\r
661 POP PP,F1 ;RESTORE REGS
\r
662 JRST PNTTX1 ;FINISH OUT ALL LINES
\r
664 \f;THE FOLLOWING CODE IS USED TO OUTPUT A LINE OF TEXT
\r
665 PLINEN: MOVEI C,"1"(FR)
\r
666 PUSHJ PP,PCHART ;PRINT 1 OR 2
\r
668 PUSHJ PP,PCHART ;PRINT )
\r
669 HLRZ C,(W1) ;GET PAGE NUMBER OF THIS LINE
\r
670 CAME C,PAGEN ;IS IT THE SAME AS PREVIOUS LINE?
\r
671 PUSHJ PP,PGNUM ;PRINT NEW PAGE NUMBER
\r
672 MOVEI C,TAB ;PRINT TAB
\r
675 PRINT: ILDB C,W1 ;GET CHARACTER
\r
676 JUMPN C,.-2 ;LOOP UNTIL A NULL SHOWS UP
\r
680 PCRLF: ;THIS CODE OUTPUTS A CARRAIGE RETURN-LINE
\r
681 ;FEED AND DECREMENTS THE LINE COUNT
\r
687 SOSN LINCNT ;DECREMENT THE LINES/PAGE COUNT
\r
688 TLO FR,PAGSW ;THIS MEAN WE GET A NEW HEADING
\r
691 PGNUM: MOVEM C,PAGEN ;SAVE NEW PAGE # AS OLD
\r
692 PGNUM1: IDIVI C,12 ;STANDARD DECIMAL PRINT ROUTINE
\r
699 \f;THIS PAGE CONTAINS ROUTINES FOR CHARACTER OUTPUT
\r
701 ;CHARACTERS OUTPUTED AS A STRING OF TEXT COME THROUGH HERE
\r
703 PCHART: JUMPE C,CPOPJ ;ZERO MEANS A CARRIAGE RETURN
\r
704 ;IF SO WE ARE THROUGH WITH LINE
\r
706 CAIGE C," " ;A PRINTING CHAR?
\r
708 PCHAR0: TLNE FR,40000
\r
714 CAIE C,TAB ;OR A TAB?
\r
727 MOVSI C,100(C) ;NO, CONTROL CHAR --SAVE
\r
728 HRRI C,"^" ;THIS IS CONTROL SYMBOL
\r
729 PUSHJ PP,PCHAR ;OUTPUT THE "^"
\r
730 MOVSS C ;AND NOW FOR THE LETTER
\r
731 PCHAR: TLZN FR,PAGSW ;DO WE NEED A NEW HEADING
\r
732 JRST TYO ;NO--SIMPLE CHARACTER OUTPUT
\r
734 ;THIS CODE OUTPUTS A HEADING COMPRISES OF THE TITLE OF
\r
735 ;EACH FILE AFTER "FILE 1)" AND "FILE 2)"
\r
737 MOVEM 16,SAVEXS+16 ;SAVE ACCUMULATORS WHILE OUTPUTING HEADING
\r
739 BLT 16,SAVEXS+15 ;ACCUMULATORS ARE NOW SAVED
\r
740 TLNE FR,ENDSW ;DON'T BOTHER IF NO ERRORS DETECTED
\r
742 MOVEI C,FF ;FOR NEW PAGE, ISSUE FORM FEED
\r
743 TLNN FR,NOFORM ;IF 1, SUPPRESS FORM FEED
\r
745 MOVE W1,[POINT 7,[ASCIZ /FILE 1) /]]
\r
747 MOVE W1,[POINT 7,HBUF1]
\r
748 PUSHJ PP,PRINT ;PRINT FILE 1 NAME
\r
750 MOVE W1,[POINT 7,[ASCIZ /FILE 2) /]]
\r
752 MOVE W1,[POINT 7,HBUF2]
\r
753 PUSHJ PP,PRINT ;PRINT FILE 2 NAME
\r
754 PCHAR1: PUSHJ PP,PCRLF ;FOLLOWED BY TWO CARRIAGE RETURNS FINE FEEDS
\r
756 MOVEI LPP ;RESET LINES/PAGE COUNT
\r
758 MOVSI 16,SAVEXS ;AND RESTORE ACS
\r
761 TLZ FR,NOFORM ;CLEAR SUPPRESS FF FLAG AFTER RESTORING AC'S
\r
762 JRST TYO ;DON'T FORGET ABOUT THAT ORIGINAL CHARACTER
\r
764 \f;THE CODE ON THIS PAGE IS FOR HANDLING INPUT ERRORS
\r
765 ;THERE ARE TWO TYPES OF ERRORS--EITHER THE FILE IS NOT FOUND
\r
766 ;OR THE DEVICE IS NOT AVAILABLE--THE FORMAT FOR THESE MESSAGES
\r
767 ;IS THE SAME FORMAT USED FOR THE "TECO" MESSAGES.
\r
770 ERRIA: MOVEI T,[ASCIZ /?INPUT ERROR- /]
\r
771 PUSHJ PP,TYPMSG ;TYPE FIRST PART OF MESSAGE
\r
772 MOVE T,INDIR1 ;GET FILE NAME
\r
773 PUSHJ PP,PNTSIX ;PRINT
\r
774 HLLZS T,INDIR1+1 ;GET EXTENSION FREED FROM GARBAGE
\r
775 JUMPE T,NOEXT ;ANY EXTENSION?
\r
776 MOVEI C,"." ;YES, TYPE DOT
\r
778 MOVE T,INDIR1+1 ;GET EXTENION
\r
779 PUSHJ PP,PNTSIX ;PRINT
\r
780 NOEXT: MOVEI T,[ASCIZ / FILE NOT FOUND/] ;FINISH MESSAGE
\r
782 JRST CARR ;THIS WILL OUTPUT TWO C.R. AND EXIT
\r
785 ERRA: MOVE T,OUTDEV ;OUTPUT INIT FAIL
\r
788 ERRI: MOVEI T,[ASCIZ /?DEVICE /]
\r
789 PUSHJ PP,TYPMSG ;TYPE BEGINING OF MESSAGE
\r
792 MOVEI T,[ASCIZ /: NOT AVAILABLE/]
\r
793 PUSHJ PP,TYPMS2 ;TYPE REST OF MESSAGE
\r
794 JRST CARR ;INSERT CARRIAGE RETURNS AND EXIT
\r
796 PNTSIX: MOVE TT,[POINT 6,T] ;INIT SIXBIT BYTE POINTER
\r
797 PNTS1: TLNN TT,770000 ;FINISHED WITH WORD?
\r
799 ILDB C,TT ;NO, GET CHARACTER
\r
800 JUMPE C,PNTS1 ;FLUSH SPACES
\r
801 ADDI C,40 ;CHANGE TO ASCII
\r
804 \fCRLF: MOVEI C,CR ;OUTPUT A CARRIAGE RETURN-LINE FEED
\r
806 MOVEI C,LF ;NOW THE LINE FEED
\r
808 TYO: SOSG CTOBUF+2 ;DECREMENT BUFFER COUNT
\r
809 PUSHJ PP,DMPOUT ;BUFFER WAS FULL
\r
810 IDPB C,CTOBUF+1 ;DEPOSIT CHAR.
\r
811 CAIN C,LF ;LINE FEED?
\r
812 TLNN FR,IOTTY ;WHILE DOING 1 OUTPUT PER LINE
\r
814 DMPOUT: OUT CTL, ;YES, OUTPUT BUFFER
\r
817 ASCIZ /?OUTPUT DEVICE ERROR/
\r
820 ASCIZ /?OUTPUT INITIALIZATION ERROR/
\r
821 ERRCOR: MOVEI T,[ASCIZ /?2K CORE NEEDED AND NOT AVAILABLE/]
\r
823 CALLI 12 ;PRINT MESSAGE AND EXIT
\r
825 ERROUT: PUSHJ PP,TYPMSG ;OUTPUT ERROR
\r
826 JRST CARR ;THROW IN TWO CR AND TRY AGAIN
\r
828 FILEO: SOSG OUTBUF+2
\r
835 ASCIZ /?MERGE OUTPUT FILE WRITE ERROR/
\r
836 DMP2: MOVEM W1,CCNT
\r
840 MOVE W1,[POINT 7,MPP1]
\r
842 CAIE W1,[POINT 7,MPP2,7]
\r
866 SAVP: MOVE W1,[POINT 7,MPP1]
\r
869 ERRD: MOVE W1,[POINT 7,[ASCIZ Z?ONLY 1, 2, AND/OR T ARE LEGAL IN MERGE COMMANDS
\r
870 OR C### TO SET MAX. COL.
\r
876 \f;ROUTINES FOR OUTPUTING ERROR MESSAGES
\r
878 TYPMSG: PUSHJ PP,INITTY ;INITALIZE TTY
\r
879 PUSHJ PP,CRLF ;OUTPUT A CARRIAGE RETURN
\r
880 TYPMS2: HRLI T,(POINT 7,,) ;THIS IS POINTER FOR ERROR MESSAGE
\r
883 TYPMS1: ILDB C,T ;LOAD A CHAR. FROM ERROR MESSAGE
\r
884 JUMPN C,.-2 ;ALL ERROR MESSAGES END WITH A ZERO
\r
885 POPJ PP, ;THROUGH WITH ERROR MESSAGE
\r
887 CARR: PUSHJ PP,CRLF ;COMMON EXIT FOR ERROR MESSAGES
\r
888 CARR1: PUSHJ PP,CRLF
\r
897 ;INITIALIZE TTY FOR ERROR MESSAGES
\r
908 GCHAR0: TLNE FR,ALLSW
\r
910 GCHAR: TLZN FR,20000
\r
911 TLNE FR,@EOFTBL(FR) ;EOF SEEN?
\r
912 JRST NULL ;YES, RETURN NULL
\r
913 SOSG @CNTTBL(FR) ;DECREMENT BUFFER COUNT
\r
914 JSP C,@[EXP GCHAR1,GCHAR2](FR) ;BUFFER EMPTY- DO "INPUT"
\r
915 SKIPN @CNTTBL(FR) ;DID WE GET ANY DATA
\r
917 ILDB C,@BYTTBL(FR) ;YES, GET A CHARACTER
\r
918 JUMPE C,GCHAR ;GET RID OF NULLS
\r
919 CAIE C,LF ;LINE FEED?
\r
920 CAIN C,VT ;NO-VERTICAL TAB?
\r
921 JRST FORM+1 ;YES, RETURN NULL
\r
922 CAIN C,CR ;CARRIAGE RETURN?
\r
923 JRST GCHAR0 ;YES FLUSH
\r
924 CAIN C,FF ;IS IT A FORM FEED?
\r
926 HRL C,@SEQTBL(FR) ;GET SEQUENCE # BIT (IF IT EXISTS)
\r
927 TLZ C,777776 ;TURN OFF ALL BUT SEQ. # BIT
\r
928 POPJ PP, ;NO, RETURN WITH CHAR
\r
930 FORM: AOS PAGNUM(FR) ;INDEX PAGE NUMBER
\r
936 EOF: TLO FR,@EOFTBL(FR) ;SET EOF FLAG
\r
937 NULL: MOVEI C,0 ;EOF IS A NULL
\r
940 GCHAR1: INPUT IN1, ;INPUT FOR FILE 1
\r
941 STATO IN1,762000 ;ERRORS OR END OF FILE?
\r
943 STATO IN1,742000 ;YES, EOF?
\r
944 JRST EOF ;YES END OF FILE
\r
946 ASCIZ /?FILE 1 READ ERROR/
\r
954 ASCIZ /?FILE 2 READ ERROR/
\r
956 SEQTBL: Z @INBUF1+1 ;POINTS TO ADR OF LAST CHAR FILE #0
\r
957 Z @INBUF2+1 ;DITTO FILE #1
\r
959 BYTTBL: INBUF1+1 ;ADR OF BYTE POINTER FILE #0
\r
960 INBUF2+1 ;DITTO FILE #1
\r
962 EOFTBL: EOF1SW ;EOF FLAG FOR FILE 1
\r
963 EOF2SW ;EOF FLAG FOR FILE 2
\r
965 CNTTBL: INBUF1+2 ;POINTS TO FILE 1 CHAR COUNT
\r
966 INBUF2+2 ;DITTO FILE 2
\r
967 \fNAME1: SETZB ACDEV,ACDEL ;ZERO REGISTERS WHICH WILL RETURN THE NAMES
\r
969 TLZ FR,CTYPF ;CLEAR COMMAND TYPED FLAG
\r
971 NAME3: MOVSI ACPNTR,(POINT 6,0) ;SET POINTER
\r
972 SETZB TT,0 ;THE SIXBIT NAME WILL BE STORED IN THE AC0
\r
974 GETIOC: PUSHJ PP,TTYIN ;GET INPUT CHARACTER
\r
975 CAIE C,32 ;AND EOF TERMINATES A FILE NAME
\r
976 CAIG C,CR ;THIS IS ANOTHER WAY TO GET A FILE NAME
\r
977 JRST TERM ;CATCHES CR,LF,FF,VT
\r
978 CAIN C,33 ;ALT MODE?
\r
980 CAIE C,"_" ;ONE KIND OF SEPERATOR
\r
981 CAIN C,"," ;THIS ALSO MANES WE HAVE FINISHED A TERM
\r
982 JRST TERM ;TERM HAS BEEN READ
\r
983 CAIN C,"/" ;IS THERE A SWITCH?
\r
985 TLO FR,CTYPF ;SET COMMAND TYPED FLAG
\r
986 CAIN C,":" ;HAVE WE BEEN GETTING A DEVICE NAME
\r
988 CAIN C,"." ;OR A FILE NAME
\r
990 TRC C,40 ;CONVERT TO SIXBIT
\r
991 TLNE ACPNTR,770000 ;HAVE WE STORED SIX BYTES?
\r
993 JRST GETIOC ;GET ANOTHER CHAR.
\r
995 TTYIN: PUSHJ PP,TTYIN1
\r
997 TRZ C,40 ;CHANGE LOWER CASE TO UPPER CASE
\r
998 CAIE C," " ;SKIP BLANKS
\r
999 CAIN C,TAB ;AND TABS
\r
1004 TTYIN1: SOSG CTIBUF+2 ;DECREMENT CHARACTER COUNT, ANY LEFT?
\r
1005 INPUT CTL, ;NO, GET A BUFFER FULL
\r
1006 ILDB C,CTIBUF+1 ;GET CHARACTER
\r
1007 JUMPE C,TTYIN1 ;FLUSH NULLS
\r
1010 MOVEI C,33 ;CHANGE ALL ALT MODES TO NEW
\r
1012 \fDEVICE: SKIPA ACDEV,0 ;DEVICE NAME
\r
1013 NAME: MOVE ACFILE,0 ;FILE NAME
\r
1014 MOVE ACDEL,C ;SET DELIMITER
\r
1015 JRST NAME3 ;GET NEXT SYMBOL
\r
1017 TERM: JUMPE ACDEL,.+3 ;IF NO PREVIOUS DELIMITOR, OR
\r
1018 CAIE ACDEL,":" ;IF PREVIOUS DELIMITER
\r
1020 MOVE ACFILE,0 ;SET FILE
\r
1021 TERM1: CAIE ACDEL,"." ;IF PERIOD,
\r
1023 HLLZ ACEXT,0 ;SET EXTENSION
\r
1026 GETSW: PUSHJ PP,TTYIN ;A SWITCH HAS BEEN DETECTED
\r
1027 MOVSI T,SWTBL-SWTBLE ;SET UP NEG. COUNT FOR TABLE SEARCH
\r
1028 CAIE C,@SWTBL(T) ;FOUND CHAR? (INDIRECT=INDEX=0
\r
1030 JUMPGE T,GETSW1 ;JUMP IF NOTHING FOUND
\r
1031 TDO FR,SWTBL(T) ;TURN ON FLAG (GARBAGE IN RIGHT)
\r
1032 JRST GETIOC ;GET NEXT PART OF COMMAND
\r
1034 GETSW1: MOVEI C,-"1"(C) ;CHANGE CHAR TO NUMBER
\r
1036 JRST CTLSER ;ERROR IF CHARACTER ISN'T 1-9
\r
1037 MOVEM C,NUMLIN ;SAVE AS # EXTRA LINES TO MATCH (AFTER 1ST)
\r
1040 SWTBL: XWD SSWBIT,"S"
\r
1041 XWD CSWBIT+SSWBIT,"C"
\r
1043 XWD 40000+IOTTY+ALLSW,"M"
\r
1044 SWTBLE: ;END OF TABLE
\r
1056 IFN PURE,<LOC 140> ;IMPURE AREA
\r
1059 PPSET: BLOCK LPDL ;PUSH DOWN LIST STORAGE
\r
1066 ERRCNT: BLOCK 1 ;DIFFERENCES COUNTER (0 MEANS NO DIFFERENCES)
\r
1074 TOP: ;CONTAINS # LINES ACTUALLY STORED IN BUFFER FOR:
\r
1075 TOP1: BLOCK 1 ;FILE #1
\r
1076 TOP2: BLOCK 1 ;FILE #2
\r
1079 LBUFP1: BLOCK 1 ;POINTER TO BEGINNING OF LINE STORAGE FOR FILE #1
\r
1080 LBUFP2: BLOCK 1 ;DITTO FILE #2
\r
1082 P1: BLOCK 1 ;BYTE POINTERS USED BY "COMPL" SUBROUTINE
\r
1085 HBUF1: BLOCK WPL ;HOLDS HEADER FOR FIRST FILE
\r
1086 HBUF2: BLOCK WPL ;FOR SECOND FILE
\r
1087 PAGNUM: BLOCK 2 ;PAGE NUMBERS FOR THE TWO FILES
\r
1088 ; LH(# AT BEGIN OF LINE), RH(# AFTER LAST CHAR)
\r
1089 PAGEN: BLOCK 1 ;TEMPORARY FOR PAGE #'S IN PLINEN SUBROUTINE
\r
1090 OLDNUM: BLOCK 2 ;LAST LINE # USED IN "SETONE"
\r
1091 OLDPNT: BLOCK 2 ;LAST BYTE POINTER CALCULATED BY "SETONE"
\r
1097 SAVEXS: BLOCK 17 ;STORAGE FOR AC'S WHEN PRINTING PAGE HEADERS
\r
1102 RTNTMP: BLOCK 1 ;RETURN ADDRESS FOR "MULTI" SUBROUTINE
\r
1103 WCADR: BLOCK 1 ;TEMP IN GLINE SUBROUTINE
\r
1104 HIGH: BLOCK 1 ;USED BY NOROOM
\r
1105 ROOM: BLOCK 1 ;USED BY "NOROOM"
\r
1106 GETCNT: BLOCK 1 ;# LINES (-1) "GETTWO" GOT
\r
1107 GETFIL: BLOCK 1 ;# OF FILE FROM WHICH "GETTWO" GOT LINE (.L. 0 IF NONE)
\r
1108 NUMLIN: BLOCK 1 ;# LINES FOR A MATCH
\r
1109 NUMTMP: BLOCK 1 ;TEMP FOR NUMLIN
\r
1110 TEMPF1: BLOCK 1 ;TEMP FOR F1
\r
1111 TEMPF2: BLOCK 1 ;TEMP FOR F2
\r