software: Added more and more
[pdp8.git] / sw / os8 / v3d / sources / system / dectapes / dectape1 / SRCCOM.PA
CommitLineData
7af5ad59
PH
1/1 OS8 SOURCE COMPARE (SRCCOM)
2/
3/
4/
5/
6/
7/
8/
9/
10/
11/COPYRIGHT (C) 1972,1973,1974,1975,1977 BY DIGITAL EQUIPMENT CORPORATION
12/
13/
14/
15/
16/
17/
18/
19/
20/
21/
22/THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE
23/AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
24/CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY
25/FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT.
26/
27/THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER
28/UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED
29/(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH
30/SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL.
31/
32/DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE
33/OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY
34/DIGITAL.
35/
36/
37/
38/
39/
40/
41/
42/
43/
44/
45\f/LAST EDITED 4/28/77
46/
47/
48/COPYRIGHT 1973,1977
49/DIGITAL EQUIPMENT CORPORATION
50/MAYNARD, MASS. 01754
51/
52/PDP-8 SOURCE COMPARISON PROGRAM
53/STOLEN FROM PDP-10 SRCCOM BY R. LARY
54
55VERSION= 4 /CHANGE EVERY MAJOR EDIT
56PATCH="A
57
58 IFNDEF CORE <CORE=2 /DEFAULT IS 8K SYSTEM>
59 MPARAM=7643 /COMMAND DECODER PARAMETER BLOCK
60
61 IFZERO CORE-2 <F1=0 /FIELD FOR FILE 1
62 F2=10 /FIELD FOR FILE 2
63 LNBEG=2000 /BEGINNING OF LINE BUFFER
64>
65 IFZERO CORE-4 <F1=20
66 F2=30
67 LNBEG=20
68>
69 BUFLIM=FBLOCK-1001 /END OF LINE BUFFER
70 INBUF=FBLOCK-1000 /INPUT BUFFER
71\f/SRCCOM FIELD 0 PAGE 0
72
73 FIELD 0
74
75 XR=10
76
77 *20
78SCT, 0 /TEMPORARY
79OFILNM, ZBLOCK 4 /OUTPUT FILE NAME
80IFPTR, 0 /TEMPORARY
81SETUP1, NOPUNCH
82 *7556 /JAM PARAMETERS UP AGAINST TOP OF USER CORE
83FBLOCK, ENPUNCH
84
85/LAYOUT OF FILE PARAMETER TABLE
86/THERE IS A COPY OF THIS TABLE IN FIELDS F1 AND F2. EACH COPY
87/CONTAINS ALL THE INFORMATION ABOUT THE FILE WHOSE BUFFERS
88/ARE IN THE SAME FIELD
89
90
91PGNUM, 1 /CURRENT INPUT PAGE
92CURLIN, 0 /CURRENT LINE (IN LINE BUFFER)
93TOPLIN, 0 /NUMBER OF LINES IN LINE BUFFER
94TMPLIN, 0 /TEMPORARY STORAGE FOR "CURLIN"
95OLDLIN, 1 /LINE OPTIMIZATION COUNTER
96OLDPTR, LNBEG /LINE OPTIMIZATION POINTER
97 /THE NEXT SEVERAL WORDS ARE A SUBROUTINE
98 /WHICH READS A BUFFER IN FROM THE INPUT FILE
99INTEMP, 0 /SHIFT REGISTER FOR "GCHAR" ROUTINE
100 CIF 0
101 JMS I INHNDL
102INCHCT, 7777 /COUNT OF CHARACTERS IN BUFFER
103INPTR, 0 /POINTS TO CURRENT WORD IN BUFFER
104INREC, 0 /CONTAINS CURRENT INPUT RECORD
105 ISZ INTEMP /SUBROUTINE SKIPS ON INPUT ERROR
106 CIF 10
107 JMP I INTEMP
108INHNDL, 0 /POINTS TO ENTRY POINT OF INPUT HANDLER
109
110INEOF, 0 /END-OF-FILE INDICATOR
111INRCNT, 0 /COUNT OF RECORDS REMAINING IN THIS FILE
112 IFNZRO .-7600 <_ERROR_>
113 *SETUP1+.-FBLOCK/PUT ASSEMBLER LOCATION COUNTER BACK
114 SETUP2=.
115\f
116
117 /CORE ALLOCATION FOR 8K SYSTEM
118
119/ FIELD 0
120/
121/0000-0377 CONTROL CODE
122/0400-0777 INPUT HANDLER 1
123/1000-1377 INPUT HANDLER 2
124/1400-1777 OUTPUT HANDLER
125/2000-6555 FILE 1 LINE BUFFER
126/6556-7555 FILE 1 INPUT BUFFER
127/7556-7577 FILE 1 CONTROL BLOCK
128/
129/ FIELD 1
130/
131/0000-1377 SRCCOM PROPER
132/1400-1777 OUTPUT BUFFER
133/2000-6555 FILE 2 LINE BUFFER
134/6556-7555 FILE 2 INPUT BUFFER
135/7556-7577 FILE 2 CONTROL BLOCK
136/
137/
138/ FORMAT OF LINE BUFFER:
139/ THE LINE BUFFER CONSISTS OF SOURCE LINES. THE FIRST WORD
140/ OF EACH LINE IS A LENGTH WORD GIVING THE LENGTH OF THE
141/ LINE (INCLUDING THE LENGTH WORD ITSELF) AS A POSITIVE
142/ NUMBER. THE NEXT WORD IS THE NUMBER OF THE SOURCE PAGE
143/ ON WHICH THIS LINE WAS FOUND. SUBSEQUENT WORDS CONTAIN THE
144/ CHARACTERS OF THE LINE ITSELF, PACKED ONE PER WORD.
145
146
147NODFMS, "N;"O;" ;"D;"I;"F;"F;"E;"R;"E;"N;"C;"E;"S;0
148\fSETUP, 0 /ROUTINE TO SET UP FILE PARAMETERS
149 TAD [SETUP1-SETUP2
150 DCA SCT
151 TAD [TAD SETUP1
152 DCA INST2
153 TAD [FBLOCK-1
154 DCA XR
155INST2, HLT /MOVE THE SKELETON PARAMETER BLOCK
156 DCA I XR /UP INTO THE DESIRED FIELD
157 ISZ INST2
158 ISZ SCT
159 JMP INST2
160 RDF
161 TAD [6201
162 DCA SETCDF /SAVE FIELD NUMBER
163 CDF 10
164 TAD I IFPTR
165 CDF 0
166 SNA
167 JMP I [INERR1 /NO INPUT FILE - BAD
168 CIF 10
169 JMS I [200 /ASSIGN DEVICE HANDLER
170 1
171DVPAGE, 0
172 HLT /NEVER HOPPEN
173 CDF 10
174 TAD I IFPTR
175 AND [7760 /COMPUTE FILE LENGTH
176 SZA
177 TAD [17
178 CLL CML RTR
179 RTR
180 DCA SCT /SAVE IT AWAY TEMPORARILY
181 ISZ IFPTR
182 TAD I IFPTR
183SETCDF, HLT /RESET DATA FIELD
184 DCA I [INREC /SAVE STARTING BLOCK NUMBER
185 TAD SCT
186 DCA I [INRCNT /SAVE FILE LENGTH
187 TAD DVPAGE
188 DCA I [INHNDL /SAVE DEVICE HANDLER ENTRY POINT
189 ISZ IFPTR
190 JMP I SETUP /RETURN
191\f *200 /INITIALIZATION CODE
192SRCCOM, ISZ NOCHN
193 CIF 10
194 JMS I [7700
195 10 /BRING USR INTO CORE
196SRCCD, TAD NOCHN /HAVE WE BEEN CHAINED TO?
197 SNA CLA
198 JMP NOSRCD /YES
199 CIF 10
200 JMS I [200
201 5 /COMMAND DECODE
202 0 /NO DEFAULT EXTENSIONS
203NOSRCD, TAD [7617
204 DCA IFPTR /SET IFPTR POINTING TO FILE 1
205 TAD [401
206 DCA DVPAGE /FILE 1 HANDLER GOES IN 400-777
207 CDF F1
208 JMS SETUP /SET UP FILE 1 PARAMETER AREA
209 TAD [1001
210 DCA DVPAGE /FILE 2 HANDLER GOES INTO 1000-1377
211 CDF F2
212 JMS SETUP /SET UP FILE 2 PARAMETER AREA
213 TAD [1401
214 DCA OUPAGE /OUTPUT HANDLER GOES INTO 1400-1777
215GTOUHN, CDF 10
216 TAD I [7600 /GET OUTPUT DEVICE #
217 CDF 0
218 SZA /IS THERE ONE?
219 JMP ASSOUT
220 DCA TTYNO
221 CIF 10 /NO - LOOK UP "TTY"
222 JMS I [200
223 12 /INQUIRE
224 5524 /=2424+3100 = TTY
225TTYNO, 0
226 0
227 JMP OUERR1 /NO TELETYPE
228 TAD TTYNO
229 CDF 10
230 DCA I [7600
231 JMP GTOUHN /BACK TO GET IT AGAIN
232ASSOUT, CIF 10
233 JMS I [200
234 1
235OUPAGE, 0
236 JMP OUERR1
237\f TAD [-4
238 DCA SCT
239 TAD [7600
240 DCA XR
241 TAD [DCA OFILNM
242 DCA INST1
243 CDF 10 /MOVE OUTPUT FILE NAME INTO FIELD 0
244 TAD I XR
245INST1, HLT
246 ISZ INST1
247 ISZ SCT
248 JMP INST1-1
249 TAD PFILNM
250 DCA ORCNO /SET UP ENTER
251 TAD OFILNM+3
252 SNA
253 TAD [1423 /ASSUMED OUTPUT EXTENSION = .LS
254 DCA OFILNM+3
255 TAD I [7600
256 CDF 0
257 CIF 10
258 JMS I [200
259 3
260ORCNO, 0 /POINTS TO FILE NAME
261OLEN, 0
262 JMP OUERR1
263 CIF 10
264 JMS I [200
265 11 /KICK USR OUT OF CORE
266 DCA OCOUNT
267 CDF CIF 10
268 TAD ORCNO
269 DCA I [OUREC
270 TAD OUPAGE
271 JMP I .+1
272 SRCOPT /GO SET UP OPTION SWITCHES AND COMPARE
273\fOCLOSE, CIF 10
274 JMS I [7700
275 10 /GET USR INTO CORE
276 CDF CIF 10
277 TAD I [7600 /GET OUTPUT DEVICE NUMBER
278 CDF 0
279 JMS I [200
280 4 /CLOSE OUTPUT FILE
281PFILNM, OFILNM
282OCOUNT, 0 /COUNT OF BLOCKS WRITTEN
283 JMP OUERR1 /ERROR ON CLOSE
284SRCATS, ISZ NOCHN /IN CASE WE LOOP, CLEAR "CHAINED TO" FLAG
285 CDF 10
286 TAD I [MPARAM-1 /GET ALTMODE FLAG
287 CDF 0
288 SPA CLA
289 JMP I [7605 /GO AWAY IF ALTMODE
290 JMP SRCCD /GO BACK FOR MORE
291
292NOCHN, 0
293
294INERR1, RDF
295 CLL RTR
296 RAR
297 TAD [-4
298OUERR1, TAD [4005
299NOROOM, TAD [260
300 DCA SETUP
301 TAD [277
302 JMS TYPE /OUTPUT "?N" WHERE N IS THE ERROR NUMBER
303 TAD SETUP
304 JMS TYPE
305 TAD [215
306 JMS TYPE
307 TAD [212
308 JMS TYPE
309 TAD SETUP
310 SPA CLA /IS THE USR IN CORE?
311 JMP SRCATS /YES - DON'T LOAD IT
312 CIF 10
313 JMS I [7700 /NO - LOAD IT
314 10
315 JMP SRCATS
316
317TYPE, 0
318 TLS
319 TSF
320 JMP .-1
321 CLA
322 JMP I TYPE
323\f/ PAGE 0 LITERALS
324 FIELD 1
325\f /PAGE 0 FOR SRCCOM
326
327 *0
328T1, 0
329T2, 0
330T, 0
331CT, 0
332
333 XR1=11
334 XR2=12
335
336 *20
337
338/*************** SRCCOM SWITCHES ***************
339
340CSW, 0 /"C" SWITCH - ON=-257, MEANING IGNORE COMMENTS
341 / OFF=+521, MEANING COMPARE COMMENTS
342SSW, 0 /"S" SWITCH - ON=-240, MEANING IGNORE SPACES & TABS
343 / OFF=-200, MEANING COMPARE SPACES&TABS
344TSW, 0 /"T" SWITCH - ON=20 , MEANING CONVERT TABS ON OUTPUT
345 / OFF=0 , MEANING PRINT TABS ON OUTPUT
346XSW, 0 /"X" SWITCH - ON=1 , MEANING DON'T INPUT COMMENTS
347 / OFF=0 , MEANING INPUT COMMENTS INTO CORE
348ALLSW, 0 /"B" SWITCH - ON=2000, MEANING COMPARE BLANK LINES
349 / OFF=0 , MEANING IGNORE BLANK LINES
350NUMLIN, 0 /NUMERICAL ARGUMENT - NUMBER OF LINES CONSTITUTING
351 /A MATCH - SET TO -3 IF NO NUMERICAL ARGUMENT
352
353MLIMIT, 0
354GETCNT, 0
355GETFIL, 0
356CHAR, 0
357IPTR, 0
358NUMTMP, 0
359PLNCNT, 0
360PNTPGN, 0
361OUHNDL, 0 /THESE 5 WORDS ARE USED BY OUTPUT ROUTINE
362OUCHCT, 0
363OUPTR, 0
364OUXPTR, 0
365OUTEMP, 0
366TABCT, 0
367DIFFS, 0 /DIFFERENCES FOUND FLAG
368
369CTCCHK, 0
370 TAD [200
371 KRS /GET A CHAR FROM THE TELETYPE
372 TAD [-203 /CHECK FOR EITHER PARITY ^C
373 SNA CLA
374 KSF /WITH THE KEYBOARD FLAG UP
375 JMP I CTCCHK /NOPE
376 CDF CIF 0 /YUP - RETURN TO OS/8
377 JMP I [7600
378\f PAGE
379
380SETONE, 0 /ROUTINE TO FIND WHERE A LINE IS
381 TAD I [CURLIN /GET LINE NUMBER
382 DCA TLNNUM /SAVE IT AWAY
383 TAD I [OLDPTR /GET THE POINTER TO THE LATEST LINE
384SETOPT, DCA T /SAVE THE STARTING POINTER
385 TAD TLNNUM /GET THE TARGET LINE
386 CMA CLL
387 TAD I [OLDLIN /IS IT BEFORE OR AFTER THE LATEST LINE?
388 SZL
389 JMP SETRST /BEFORE - WE MUST START SEARCHING FROM LINE 1
390 DCA CT /AFTER - START SEARCHING FROM LATEST LINE
391TLOOP, ISZ CT
392 JMP KEEPON /NOT THERE YET
393 TAD TLNNUM /WE FOUND IT - MAKE THIS LINE
394 DCA I [OLDLIN /THE NEW "LATEST LINE"
395 TAD T /TO SPEED UP
396 DCA I [OLDPTR /FUTURE SEARCHES.
397 CLA CMA
398 TAD T
399 JMP I SETONE /RETURN POINTER FOR AUTO-XR
400KEEPON, TAD I T
401 TAD T /ADD LENGTH OF THIS LINE TO POINTER
402 DCA T /TO GET POINTER TO NEXT LINE
403 JMP TLOOP
404TLNNUM, 0 /TEMPORARY FOR SETONE - DO NOT USE ANYWHERE ELSE
405
406SETRST, CLA IAC /RESET THE "LATEST LINE" POINTERS TO THE FIRST
407 DCA I [OLDLIN /LINE, SINCE THE LINE WE SEEK IS BEFORE
408 TAD [LNBEG /THE CURRENT "LATEST LINE"
409 JMP SETOPT /GO BACK AND FIND THE LINE
410\fMOVEUP, 0 /SUBR TO DELETE LINES FROM CORE
411 TAD I [CURLIN /GET FIRST LINE NOT TO BE DELETED
412 CIA
413 TAD I [TOPLIN
414 DCA I [TOPLIN /REDUCE THE NUMBER OF LINES IN THE BUFFER
415 TAD I [TOPLIN /GET NEW LINE COUNT
416 SNA /IF ALL LINES DELETED, DON'T MOVE CORE
417 JMP MOVXIT /JUST CLEAN UP AND GET OUT
418 IAC
419 JMS SETONE /GET POINTER TO LAST LINE+1
420 CIA
421 DCA MLIMIT /SAVE AS LIMIT ON MOVE
422 IAC
423 JMS SETONE /GET POINTER TO THE FIRST LINE NOT TO DELETE
424 DCA XR1
425 TAD [LNBEG-1
426 DCA XR2
427MLOOP, TAD I XR1
428 DCA I XR2 /AREN'T AUTO-XRS WONDERFUL
429 TAD XR1
430 TAD MLIMIT /(ACTUALLY, NO)
431 SZA CLA
432 JMP MLOOP
433MOVXIT, CLA IAC /AFTER MOVING CORE AROUND, WE MUST
434 DCA I [OLDLIN /RESET THE "LATEST LINE" POINTERS TO THE FIRST
435 TAD [LNBEG /LINE SINCE IT IS THE ONLY ONE WHICH
436 DCA I [OLDPTR /HAS A KNOWN POSITION.
437 JMP I MOVEUP
438\fCOMPL, 0 /SUBROUTINE TO COMPARE TWO LINES
439 CDF F1
440 JMS SETONE /GET POINTER TO CURRENT LINE IN FILE 1
441 TAD [2 /SKIP OVER PROLOGUE
442 DCA XR1
443 CDF F2
444 JMS SETONE /GET POINTER TO CURRENT LINE IN FILE 2
445 TAD [2 /SKIP OVER PROLOGUE
446 DCA XR2
447COMP1, CDF F1
448 TAD I XR1 /GET A CHAR FROM FILE 1
449 DCA T1
450COMP2, CDF F2
451 TAD I XR2
452 DCA T2 /AND A CHAR FROM FILE 2
453COMP0, TAD T2
454 CIA
455 TAD T1
456 SZA CLA /ARE THEY EQUAL?
457 JMP COMP4 /NO
458COMP5, TAD T1
459 SZA
460 TAD CSW /IF AT END OF LINE, OR IF AT A "/"
461 SZA CLA /AND "IGNORE COMMENTS" SWITCH ON,
462 JMP COMP1
463 JMP I COMPL /TAKE "LINES MATCH" RETURN
464
465COMP3, CDF F1
466 TAD I XR1 /GET THE NEXT CHAR FROM FILE 1
467 DCA T1
468COMP4, TAD T1
469 TAD SSW /IF T1 IS A BLANK OR A TAB
470 SZA
471 TAD [27 /(27=BLANK-TAB)
472 SNA CLA /AND WE ARE IGNORING BLANKS,
473 JMP COMP3 /THEN IGNORE T1
474 TAD T2
475 TAD SSW /DO THE SAME WITH T2
476 SZA
477 TAD [27
478 SNA CLA
479 JMP COMP2
480 TAD T1
481 CIA
482 TAD T2 /NOW THAT WE HAVE (MAYBE) ELIMINATED BLANKS
483 SNA CLA /ARE T1 AND T2 STILL UNEQUAL?
484 JMP COMP5 /NO - THERE'S STILL HOPE
485 TAD T1 /YES - NOW TEST COMMENT SWITCH
486 CMA
487 AND T2
488 TAD CSW /IF T1 IS A CARRIAGE RETURN AND T2 IS A "/"
489 SNA CLA /WITH THE COMMENT SWITCH ON WE'VE SUCEEDED
490 JMP I COMPL /SO TAKE "LINES MATCH" RETURN
491 TAD T2
492 CMA
493 AND T1 /SAME IF T2=CARRIAGE RETURN AND T1="/"
494 TAD CSW
495 SZA CLA
496 ISZ COMPL /OTHERWISE TAKE "LINES DON'T MATCH" RETURN
497 JMP I COMPL
498
499GETTWO, 0 /SUBROUTINE TO GET A LINE FROM EACH FILE
500 CLA CLL CMA RTL
501 DCA GETCNT
502 DCA GETFIL /ZERO INDICATOR AS TO WHICH FILE IS NULL
503 CDF F1
504 JMS I [GLINE /GET A LINE FROM FILE 1
505 CDF F2
506 JMS I [GLINE /DITTO FILE 2
507 ISZ GETCNT /HOW MANY LINES DID WE GET?
508 JMP I GETTWO /LESS THAN TWO - TAKE EOF RETURN
509 ISZ GETTWO
510 JMP I GETTWO /TAKE NORMAL RETURN
511
512 PAGE
513\fGLINE, 0 /SUBROUTINE TO GET A LINE FROM A FILE
514 TAD I [CURLIN
515 CIA
516 TAD I [TOPLIN
517 SZA CLA /IS THE LINE IN CORE?
518 JMP GLEXIT /YES
519 CLA IAC
520 JMS I [SETONE /GET POINTER TO THIS LINE
521 DCA XR1
522 CLA CLL CML RTL
523 DCA I XR1 /SET WORD COUNT TO 2
524 TAD XR1
525 DCA T /SAVE POINTER TO LENGTH WORD
526 JMS CTCCHK /CHECK FOR ^C TYPED
527 ISZ XR1
528GLINE2, JMS GCHAR /MAIN LOOP - GET A CHARACTER
529 JMS I [TSTXSW /SEE WHETHER WE SHOULD INPUT COMMENTS
530 CLA CLL CMA RAL
531 TAD CHAR
532 TAD ALLSW /IF THE CHAR IS A CARRIAGE RETURN AND THE
533 TAD I T /"B" SWITCH IS OFF AND THE LINE COUNT IS 2,
534 SNA CLA /THEN WE SHOULD IGNORE THIS BLANK LINE.
535 JMP GLINE2
536 TAD CHAR
537 DCA I XR1 /SALT IT AWAY
538 TAD XR1
539 CLL
540 TAD [4-BUFLIM /COMPARE AGAINST END OF BUFFER
541 SNL CLA
542 JMP .+3
543 CDF CIF 0 /LINE OVERFLOWS CORE - BAD!
544 JMP I [NOROOM /TELL THE WORLD
545 ISZ I T /BUMP COUNTER OF WORDS IN LINE
546 TAD CHAR
547 SZA CLA /WAS IT A CARRIAGE RETURN?
548 JMP GLINE2 /NO
549 ISZ I [TOPLIN /YES - BUMP COUNT OF LINES IN CORE
550 ISZ T
551 TAD I [PGNUM
552 DCA I T
553GLEXIT, ISZ GETCNT /BUMP COUNTER OF # OF LINES GOTTEN
554 RDF
555 TAD [6201
556 DCA GETFIL /INDICATE THAT THIS FILE WAS NOT NULL
557 ISZ I [CURLIN /BUMP CURRENT LINE POINTER
558 JMP I GLINE
559\fGCHAR, 0 /SUBROUTINE TO GET A CHAR FROM A FILE
560 TAD I [INPTR
561 DCA IPTR /SAVE POINTER TO CURRENT BUFFER WORD
562 ISZ I [INCHCT /BUMP CHAR COUNTER
563 JMP GETIN
564 TAD I [INEOF /END OF BUFFER
565 SZA CLA /END OF FILE??
566 JMP GEOF+1 /YES
567 CLA CLL CML RTL
568 TAD I [INRCNT /BUMP COUNT OF REMAINING RECORDS BY 2
569 SZL /OVERFLOW?
570 ISZ I [INEOF /YES - SET END OF FILE FLAG
571 SNL
572 DCA I [INRCNT /RESTORE COUNTER IF NO OVERFLOW
573 CLL CMA CML RTL
574 RTL
575 RTL
576 TAD [401 /COMPUTE INPUT CONTROL WORD
577 RDF
578 DCA I [INCHCT
579 TAD [INBUF
580 DCA I [INPTR /PUT BUFFER ADDRESS INTO CALLING SEQUENCE
581 RDF
582 TAD [6203
583 DCA .+1
584 NOP /SET INSTRUCTION FIELD TO DATA FIELD
585 JMS I [INTEMP /CALL SUBR TO READ IN BUFFER
586 JMP .+4 /NO ERROR
587 SPA CLA /FATAL ERROR?
588 JMP I [INERR /YES
589 ISZ I [INEOF /NO - SET END OF FILE FLAG
590 ISZ I [INREC
591 ISZ I [INREC /BUMP RECORD NUMBER BY 2
592 TAD [10
593 DCA I [INTEMP /INITIALIZE SHIFT REGISTER
594 TAD I [INCHCT
595 CLL RAL
596 TAD I [INCHCT
597 AND [7600
598 CMA
599 DCA I [INCHCT /COMPUTE CHAR COUNT FROM BUFFER CONTROL WD
600 JMP GCHAR+1 /START ALL OVER WITH NEW BUFFER
601\fGETIN, TAD I [INTEMP
602 SPA /IF WE HAVE A CHAR IN THE SHIFT BUFFER
603 DCA I IPTR /WRITE OVER THE CURRENT BUFFER WORD WITH IT
604 DCA I [INTEMP /AND ZERO THE SHIFT BUFFER
605 TAD I IPTR /GET THE CURRENT BUFFER WORD
606 AND [7400
607 CLL RAL
608 TAD I [INTEMP
609 RTL /SHIFT THE HIGH ORDER 4 BITS
610 RTL /INTO THE SHIFT BUFFER
611 SMA /DID WE GET A COMPLETE CHARACTER?
612 ISZ I [INPTR /NO - BUMP WORD POINTER
613 DCA I [INTEMP
614 TAD I IPTR
615 AND [177 /USE LOW ORDER 7 BITS OF THE CURRENT WORD
616 SZA /AS THE CHARACTER
617 TAD [-177 /IGNORING BLANK TAPE, RUBOUTS, LINE-FEEDS
618 SZA /AND VERT. TABS
619 TAD [177-13
620 SZA
621 IAC
622 SNA
623 JMP GCHAR+1
624 TAD [12-14
625 SNA
626 JMP FFEED /FORM FEED IS SPECIAL
627 TAD [14-32
628 SNA
629 JMP GEOF /^Z SIGNIFIES END-OF-FILE
630 TAD [32-15
631 SZA
632 TAD [215 /AND CARRIAGE RETURN IS MAPPED INTO 0
633 DCA CHAR
634 JMP I GCHAR
635
636FFEED, ISZ I [PGNUM /BUMP THE PROPER PAGE COUNT ON A FORM FEED
637 JMP GCHAR+1 /BUT OTHERWISE IGNORE IT
638
639GEOF, ISZ I [INEOF /SET END-OF-FILE FLAG
640 CLA CMA
641 DCA I [INCHCT /FORCE AN EMPTY BUFFER
642 JMP I GLINE /RETURN FROM GLINE WITHOUT SETTING GETFIL
643
644 PAGE
645\f/ INITIALIZATION
646STARTC, JMS I [OUSETP /INITIALIZE OUTPUT BUFFER POINTERS
647 CLA IAC
648 DCA PNTPGN /FUDGE PNTPGN WHILE PRINTING HEADER LINES
649 TAD [HEDING-1
650 JMS I [PNTHDG /PRINT SRCCOM HEADING LINE
651 JMS I [GETTWO /GET TITLE LINES
652 JMP FINISH /ONE FILE IS EMPTY - ABORT COMPARISON
653 CDF F1
654 JMS I [PNTTXT /PRINT FILE 1 HEADER
655 CDF F2
656 JMS I [PNTTXT /AND FILE 2 HEADER
657 DCA PNTPGN /INITIALIZE PAGE NUMBER
658 STA
659 DCA DIFFS /INITIALIZE FLAG TO NO DIFFERENCES
660
661/ MAIN LOOP
662
663MAIN, CDF F1
664 JMS I [MOVEUP
665 CDF F2
666 JMS I [MOVEUP /DELETE ANY USELESS LINES
667MAINST, CDF F1
668 DCA I [CURLIN
669 CDF F2
670 DCA I [CURLIN
671 JMS I [GETTWO /GET TWO INPUT LINES
672 JMP MAIN15 /ONE FILE IS EMPTY
673 JMS I [COMPL /COMPARE THE LINES
674 JMP MAIN /EQUAL - DELETE AND CONTINUE
675 DCA DIFFS /UNEQUAL - CLEAR "NO DIFFERENCES" FLAG
676
677MAIN10, JMS I [GETTWO /GET TWO MORE LINES
678 JMP MAIN15 /ONE FILE RAN OUT
679 CDF F1
680 DCA I [CURLIN /INITIALIZE FILE 1 LINE NO.
681MAIN12, ISZ I [CURLIN /BUMP TO NEXT LINE IN FILE 1
682 JMS I [COMPL /COMPARE NEW LINE FROM FILE 2
683 JMS MULTI /WITH THIS LINE FROM FILE 1
684 CDF F2 /AND IF MATCH IS FOUND CHECK MULTIPLE LINES
685 TAD I [CURLIN
686 CIA
687 CDF F1
688 TAD I [CURLIN
689 SZA CLA /THROUGH WITH FILE 1 LINES?
690 JMP MAIN12 /NO
691 CDF F2
692 CLA IAC
693 DCA I [CURLIN /NOW INITIALIZE FILE 2 LINE NO.
694MAIN14, TAD I [CURLIN
695 CIA
696 CDF F1
697 TAD I [CURLIN
698 SNA CLA /HAVE WE EXHAUSTED FILE 2 LINES?
699 JMP MAIN10 /YES - NO MATCH AT ALL
700 JMS I [COMPL /NO - COMPARE ALL FILE 2 LINES
701 JMS MULTI /AGAINST NEW FILE 1 LINE
702 CDF F2 /AND, IF MATCH, CHECK MULTIPLE LINES
703 ISZ I [CURLIN /GO TO NEXT FILE 2 LINE
704 JMP MAIN14 /AND LOOP
705
706MAIN15, TAD GETFIL
707 SNA /FIND WHICH FILE WAS EMPTY
708 JMP FINISH /BOTH - ALL DONE
709 DCA MAIN18
710 CDF F1
711 TAD I [CURLIN
712 CDF F2
713 SZA CLA
714 TAD I [CURLIN
715 SNA CLA /IS EITHER FILE EXHAUSTED IN CORE?
716 JMP MAIN18 /YES - PRINT ALL OF OTHER FILE
717 TAD MAIN18 /GET CDF OF LONG FILE
718 CIA
719 TAD [4402+F1+F2 /COMPUTE CDF OF SHORT FILE
720 DCA MAIN17
721MAIN17, NOP
722 TAD I [CURLIN
723 CMA CLL
724 TAD I [TOPLIN
725 SNL CLA /IS CURLIN < TOPLIN?
726 JMP MAIN10 /NO - WE STILL HAVE SOME COMPARING TO DO
727 ISZ I [CURLIN
728 JMS I [COMPL
729 JMS MULTI
730 JMP MAIN17
731
732MAIN18, NOP /SET DF TO DATA FIELD OF LONG FILE
733 JMS I [PNTTXT /PRINT IT
734 JMP MAIN
735
736FINISH, CDF F1
737 TAD I [CURLIN
738 CDF F2
739 TAD I [CURLIN
740 SZA CLA /ARE BOTH CORE BUFFERS EMPTY?
741 JMS I [PNTBTH /NO - PRINT THEM
742 JMP I [EOCOMP
743\f/ MULTI-LINE COMPARATOR
744MULTI, 0
745 CDF F1
746 TAD I [CURLIN
747 DCA I [TMPLIN
748 CDF F2
749 TAD I [CURLIN
750 DCA I [TMPLIN /STORE CURLIN AWAY IN A TEMPORARY
751 TAD NUMLIN
752 DCA NUMTMP /GET COUNT OF LINES TO COMPARE
753 JMP MULT6
754
755MULT2, JMS I [GETTWO /GET TWO LINES
756 JMP MULT4 /ONE FILE HAS NO MORE
757 JMS I [COMPL /COMPARE THEM
758 JMP MULT6 /THEY COMPARE - KEEP GOING
759MULT4, JMS SWAPCT /RESET OLD CURLIN
760 JMP I MULTI
761MULT6, ISZ NUMTMP /LINE COUNT EXHAUSTED?
762 JMP MULT2 /NO - KEEP COMPARING
763 JMS SWAPCT /RESTORE OLD CURLIN
764 JMS I [PNTBTH /PRINT OUT DIFFERENCES
765 TAD [-10
766 JMS I [PNTAST /PRINT OUT SEPARATOR
767 JMS SWAPCT /RE-SWAP FOR DELETION
768 JMP MAIN /DELETE THRU MATCHING LINES AND CONTINUE
769
770SWAPCT, 0
771 CDF F1
772 JMS SWAPX /SWAP CURLIN AND TMPLIN FOR FILE 1
773 CDF F2
774 JMS SWAPX /DITTO FOR FILE 2
775 JMP I SWAPCT
776SWAPX, 0
777 TAD I [CURLIN
778 DCA NUMTMP
779 TAD I [TMPLIN
780 DCA I [CURLIN
781 TAD NUMTMP
782 DCA I [TMPLIN
783 JMP I SWAPX
784
785 PAGE
786\fPNTBTH, 0 /PRINT BOTH TEXT BUFFERS
787 TAD [212
788 JMS I [OCHAR /SEPARATOR
789 CDF F1
790 JMS PNTTXT /PRINT FILE 1 BUFFER
791 TAD [-4
792 JMS PNTAST /PRINT SEPARATOR
793 CDF F2
794 JMS PNTTXT /PRINT FILE 2 BUFFER
795 TAD [212
796 JMS I [OCHAR /SEPARATOR
797 JMP I PNTBTH
798
799PNTTXT, 0 /PRINT A TEXT BUFFER
800 TAD I [CURLIN
801 CIA
802 DCA PLNCNT /GET # OF LINES TO PRINT
803PNTLP, DCA TABCT /ZERO TAB COUNTER (IN CASE "T" SW ON)
804 RDF
805 CLL RTR
806 RAR /GET FILE NUMBER
807 TAD [261 /260 FOR 12K VERSION
808 JMS I [OCHAR
809 TAD [251
810 JMS I [OCHAR /PRINT RPAR
811 TAD PLNCNT
812 IAC
813 JMS I [SETONE /GET POINTER TO LINE
814 IAC
815 DCA XR1
816 TAD I XR1 /GET THE PAGE NUMBER OF THE LINE
817 DCA T
818 TAD T
819 CIA
820 TAD PNTPGN
821 SNA CLA /DID THE PAGE NUMBER JUST CHANGE?
822 JMP PNTTAB /NO - DON'T PRINT IT
823 TAD TENTAD
824 DCA PNTTAD
825 TAD T
826 DCA PNTPGN /UPDATE THE CURRENT PAGE NUMBER
827 CLA CLL CMA RTL
828 DCA CT /PRINT 3 DECIMAL DIGITS
829DIGLP1, DCA T1
830 JMP .+3
831DIGLP2, DCA T
832 ISZ T1
833 TAD T
834PNTTAD, HLT /ADD IN A POWER OF 10
835 SMA
836 JMP DIGLP2 /KEEP GOING
837PN7200, CLA
838 ISZ PNTTAD /GOT A DIGIT - GO TO NEXT POWER OF 10
839 TAD T1
840 TAD [260
841 JMS I [OCHAR /PRINT DIGIT
842 ISZ CT /THROUGH?
843 JMP DIGLP1 /NO
844PNTTAB, TAD TSW
845 SNA CLA /SHOULD WE SIMULATE TABS?
846 JMP PNTCHR /NO
847 TAD [240 /YES - PRINT A BLANK
848 JMS I [OCHAR
849 TAD TABCT
850 AND [7
851 SZA CLA /KEEP PRINTING BLANKS UNTIL WE REACH A MULTIPLE OF
852 JMP PNTTAB /EIGHT COLUMNS.
853PNTCLP, TAD I XR1 /GET A CHARACTER FROM THE LINE
854 SNA /END?
855 JMP PNTCR /YES
856 TAD [-211
857 SNA /IS IT A TAB?
858 JMP PNTTAB /YES
859PNTCHR, TAD [211 /NO - RESTORE THE CHAR
860 JMS I [OCHAR
861 JMP PNTCLP /PRINT IT AND LOOP
862PNTCR, TAD [215 /PRINT CRLF
863 JMS I [OCHAR
864 TAD [212
865 JMS I [OCHAR
866 ISZ PLNCNT
867 JMP PNTLP /LOOP FOR EACH LINE IN BUFFER
868 JMP I PNTTXT
869\fPNTAST, 0 /ROUTINE TO PRINT ASTERISKS
870 DCA CT /SAVE COUNTER
871 TAD ["*
872 JMS I [OCHAR
873 ISZ CT
874 JMP .-3 /PRINT REQUIRED NUMBER OF ASTERISKS
875 TAD [215
876 JMS I [OCHAR /TERMINATE THE LINE
877 TAD [212
878 JMS I [OCHAR
879 DCA PNTPGN /KILL CURR. PAGE NUMBER
880 JMP I PNTAST
881
882EOCOMP, ISZ DIFFS /ANY DIFFERENCES?
883 JMP .+4 /YES
884 CDF 0 /MESSAGE IN FIELD 0
885 TAD [NODFMS-1
886 JMS I [PNTHDG /NO - PRINT MESSAGE
887 TAD PN7200 /ROUTINE TO FINISH UP OUTPUT
888 DCA CT
889 TAD [214
890 JMS I [OCHAR /TERMINATE THE OUTPUT FILE
891 TAD [232 /WITH A FORM FEED AND A ^Z
892 JMS I [OCHAR
893 ISZ CT
894 JMP .-2 /FILL WITH ZEROS TO FORCE BUFFER OUT
895 CDF CIF 0
896 JMP I .+1 /GO TO FIELD 0 TO FINISH UP AS WE WILL BE
897 OCLOSE /OVERLAYED BY THE USR DURING THE CLOSE
898
899TENTAD, TAD .+1 /TABLE OF POWERS OF TEN
900 -144
901 -12
902 -1
903
904INERR, RDF /INPUT ERROR - ERROR NUMBER=FILE NUMBER
905 CLL RTR
906 RAR
907 IFZERO CORE-2 <IAC>
908 IFZERO CORE-4 <TAD [-1>
909 CDF CIF 0
910 JMP I [NOROOM /GO TO COMMON ERROR ROUTINE
911
912PNTHDG, 0 /ROUTINE TO PRINT A LITERAL LINE
913 DCA XR1 /POINTER TO LINE IN AC
914 TAD PNTHDG
915 DCA PNTTXT /WE WORK BY FAKING OUT PNTTXT
916 STA
917 DCA PLNCNT /SET LINE COUNTER TO 1
918 JMP PNTCLP
919
920 PAGE
921\fOCHAR, 0 /LOW LEVEL OUTPUT ROUTINE
922 AND [377
923 DCA OUTEMP
924 ISZ TABCT /BUMP TAB COUNTER
925 RDF
926 TAD [6201
927 DCA OCDF
928 CDF 10
929 TAD OUCHCT /GET CHAR COUNTER - CHAR COUNTER COUNTS
930 RTR /FOUR TIMES FOR EACH THREE CHARACTERS.
931 CML /WHEN THE LOW ORDER BITS OF THE COUNT ARE 10,
932 SZL SPA CLA /ITS TIME TO SQUEEZE A CHAR INTO THE HIGH
933 JMP OUNORM /ORDER BITS - OTHERWISE JUST STORE IT
934 ISZ OUCHCT /WE MUST SQUEEZE - BUMP OUCHCT AN EXTRA
935 TAD OUTEMP /TIME
936 RTL
937 RTL
938 AND [7400
939 TAD I OUXPTR /FIRST WORD OF DOUBLET
940 DCA I OUXPTR
941 TAD OUTEMP
942 RTR
943 RTR
944 RAR
945 AND [7400
946 TAD I OUPTR /SECOND WORD OF DOUBLET
947 JMP OUCOMN
948
949OUNORM, TAD OUPTR
950 DCA OUXPTR /REMEMBER LAST WORD
951 ISZ OUPTR
952 TAD OUTEMP
953OUCOMN, DCA I OUPTR
954 ISZ OUCHCT /BUMP CHAR COUNT
955 JMP OCDF /RETURN
956 CIF 0 /CHAR COUNT OVFLO - OUTPUT BUFFER
957 JMS I OUHNDL
958 4210
959 1400
960OUREC, 0
961 JMP OUERR2
962 JMS OUSETP /INITIALIZE FOR NEXT BUFFER
963 ISZ OUREC /BUMP RECORD NUMBER
964 CDF 0
965 ISZ I [OCOUNT /BUMP CLOSING COUNT
966 ISZ I [OLEN /AND LENGTH OF HOLE
967 JMP OCDF
968OUERR2, CLL CML RTL /OUTPUT ERROR OR FILE TOO BIG - GENERATE
969 IAC /A 3 OR A 4 MESSAGE, RESPECTIVELY
970 CDF CIF 0
971 JMP I [NOROOM
972OCDF, HLT /RESTORE DATA FIELD
973 JMP I OCHAR /RETURN
974\fOUSETP, 0
975 TAD [7000 /4 COUNTS FOR 2 WORDS
976 DCA OUCHCT
977 TAD [1377
978 DCA OUPTR
979 JMP I OUSETP
980
981TSTXSW, 0 /SUBROUTINE TO IGNORE COMMENTS ON INPUT
982 TAD CHAR /IF "X" SWITCH SET
983 TAD [-257
984 SNA CLA
985 TAD XSW /IF XSW IS OFF OR THE CURRENT CHAR ISN'T A /
986 SNA CLA
987 JMP I TSTXSW /RETURN
988 JMS I [GCHAR
989 TAD CHAR /SKIP CHARACTERS UNTIL CARRIAGE RETURN
990 SZA CLA
991 JMP .-3
992TSTXLP, CLA CLL CMA RAL
993 TAD I T
994 SNA CLA /ARE WE AT THE BEGINNING OF A LINE?
995 JMP I TSTXSW /YES - GLINE WILL DELETE IT IF NECESSARY
996 TAD XR1
997 DCA TX
998 TAD I TX
999 TAD [-240
1000 SZA /IS THE PREVIOUS CHARACTER A SPACE
1001 TAD [240-211
1002 SZA CLA /OR A TAB?
1003 JMP I TSTXSW /NO
1004 CMA
1005 TAD XR1
1006 DCA XR1 /BACK UP CHAR PTR
1007 CMA
1008 TAD I T
1009 DCA I T /AND CHAR CTR
1010 JMP TSTXLP /LOOP
1011TX, 0
1012\fSRCOPT, DCA OUHNDL
1013 TAD I [MPARAM
1014 CMA
1015 AND [1000 /"C" OPTION
1016 TAD [-257
1017 DCA CSW
1018 CLA CLL CML RTR
1019 AND I [MPARAM
1020 DCA ALLSW /"B" OPTION
1021 TAD I [MPARAM+1
1022 CMA
1023 AND [40 /"S" OPTION
1024 TAD [-240
1025 DCA SSW
1026 TAD I [MPARAM+1
1027 AND [20 /"T" OPTION
1028 DCA TSW
1029 CLA IAC
1030 AND I [MPARAM+1
1031 DCA XSW /"X" OPTION
1032 TAD I [MPARAM+3
1033 CIA /GET NEGATIVE OF NUMERICAL ARGUMENT
1034 SNA
1035 CLA CLL CMA RTL /DEFAULT VALUE IS 3
1036 DCA NUMLIN /TO NUMBER OF LINES NECESSARY FOR A MATCH
1037 JMP I .+1
1038 STARTC
1039
1040HEDING, "S;"R;"C;"C;"O;"M;" ;"V;VERSION+"0;PATCH;212;0
1041\f/PAGE 0 LITERALS FOR FIELD 1
1042 $-$-$ /END OF ASSEMBLY OF SRCCOM
1043\f