1 /1 OS8 SOURCE COMPARE (SRCCOM)
11 /COPYRIGHT (C) 1972,1973,1974,1975,1977 BY DIGITAL EQUIPMENT CORPORATION
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.
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.
32 /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE
33 /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY
45 \f/LAST EDITED 4/28/77
49 /DIGITAL EQUIPMENT CORPORATION
52 /PDP-8 SOURCE COMPARISON PROGRAM
53 /STOLEN FROM PDP-10 SRCCOM BY R. LARY
55 VERSION= 4 /CHANGE EVERY MAJOR EDIT
58 IFNDEF CORE <CORE=2 /DEFAULT IS 8K SYSTEM>
59 MPARAM=7643 /COMMAND DECODER PARAMETER BLOCK
61 IFZERO CORE-2 <F1=0 /FIELD FOR FILE 1
62 F2=10 /FIELD FOR FILE 2
63 LNBEG=2000 /BEGINNING OF LINE BUFFER
69 BUFLIM=FBLOCK-1001 /END OF LINE BUFFER
70 INBUF=FBLOCK-1000 /INPUT BUFFER
71 \f/SRCCOM FIELD 0 PAGE 0
79 OFILNM, ZBLOCK 4 /OUTPUT FILE NAME
82 *7556 /JAM PARAMETERS UP AGAINST TOP OF USER CORE
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
91 PGNUM, 1 /CURRENT INPUT PAGE
92 CURLIN, 0 /CURRENT LINE (IN LINE BUFFER)
93 TOPLIN, 0 /NUMBER OF LINES IN LINE BUFFER
94 TMPLIN, 0 /TEMPORARY STORAGE FOR "CURLIN"
95 OLDLIN, 1 /LINE OPTIMIZATION COUNTER
96 OLDPTR, LNBEG /LINE OPTIMIZATION POINTER
97 /THE NEXT SEVERAL WORDS ARE A SUBROUTINE
98 /WHICH READS A BUFFER IN FROM THE INPUT FILE
99 INTEMP, 0 /SHIFT REGISTER FOR "GCHAR" ROUTINE
102 INCHCT, 7777 /COUNT OF CHARACTERS IN BUFFER
103 INPTR, 0 /POINTS TO CURRENT WORD IN BUFFER
104 INREC, 0 /CONTAINS CURRENT INPUT RECORD
105 ISZ INTEMP /SUBROUTINE SKIPS ON INPUT ERROR
108 INHNDL, 0 /POINTS TO ENTRY POINT OF INPUT HANDLER
110 INEOF, 0 /END-OF-FILE INDICATOR
111 INRCNT, 0 /COUNT OF RECORDS REMAINING IN THIS FILE
112 IFNZRO .-7600 <_ERROR_>
113 *SETUP1+.-FBLOCK/PUT ASSEMBLER LOCATION COUNTER BACK
117 /CORE ALLOCATION FOR 8K SYSTEM
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
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
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.
147 NODFMS, "N;"O;" ;"D;"I;"F;"F;"E;"R;"E;"N;"C;"E;"S;0
148 \fSETUP, 0 /ROUTINE TO SET UP FILE PARAMETERS
155 INST2, HLT /MOVE THE SKELETON PARAMETER BLOCK
156 DCA I XR /UP INTO THE DESIRED FIELD
162 DCA SETCDF /SAVE FIELD NUMBER
167 JMP I [INERR1 /NO INPUT FILE - BAD
169 JMS I [200 /ASSIGN DEVICE HANDLER
175 AND [7760 /COMPUTE FILE LENGTH
180 DCA SCT /SAVE IT AWAY TEMPORARILY
183 SETCDF, HLT /RESET DATA FIELD
184 DCA I [INREC /SAVE STARTING BLOCK NUMBER
186 DCA I [INRCNT /SAVE FILE LENGTH
188 DCA I [INHNDL /SAVE DEVICE HANDLER ENTRY POINT
191 \f *200 /INITIALIZATION CODE
195 10 /BRING USR INTO CORE
196 SRCCD, TAD NOCHN /HAVE WE BEEN CHAINED TO?
202 0 /NO DEFAULT EXTENSIONS
204 DCA IFPTR /SET IFPTR POINTING TO FILE 1
206 DCA DVPAGE /FILE 1 HANDLER GOES IN 400-777
208 JMS SETUP /SET UP FILE 1 PARAMETER AREA
210 DCA DVPAGE /FILE 2 HANDLER GOES INTO 1000-1377
212 JMS SETUP /SET UP FILE 2 PARAMETER AREA
214 DCA OUPAGE /OUTPUT HANDLER GOES INTO 1400-1777
216 TAD I [7600 /GET OUTPUT DEVICE #
221 CIF 10 /NO - LOOK UP "TTY"
224 5524 /=2424+3100 = TTY
227 JMP OUERR1 /NO TELETYPE
231 JMP GTOUHN /BACK TO GET IT AGAIN
243 CDF 10 /MOVE OUTPUT FILE NAME INTO FIELD 0
250 DCA ORCNO /SET UP ENTER
253 TAD [1423 /ASSUMED OUTPUT EXTENSION = .LS
260 ORCNO, 0 /POINTS TO FILE NAME
265 11 /KICK USR OUT OF CORE
272 SRCOPT /GO SET UP OPTION SWITCHES AND COMPARE
275 10 /GET USR INTO CORE
277 TAD I [7600 /GET OUTPUT DEVICE NUMBER
282 OCOUNT, 0 /COUNT OF BLOCKS WRITTEN
283 JMP OUERR1 /ERROR ON CLOSE
284 SRCATS, ISZ NOCHN /IN CASE WE LOOP, CLEAR "CHAINED TO" FLAG
286 TAD I [MPARAM-1 /GET ALTMODE FLAG
289 JMP I [7605 /GO AWAY IF ALTMODE
290 JMP SRCCD /GO BACK FOR MORE
302 JMS TYPE /OUTPUT "?N" WHERE N IS THE ERROR NUMBER
310 SPA CLA /IS THE USR IN CORE?
311 JMP SRCATS /YES - DON'T LOAD IT
313 JMS I [7700 /NO - LOAD IT
325 \f /PAGE 0 FOR SRCCOM
338 /*************** SRCCOM SWITCHES ***************
340 CSW, 0 /"C" SWITCH - ON=-257, MEANING IGNORE COMMENTS
341 / OFF=+521, MEANING COMPARE COMMENTS
342 SSW, 0 /"S" SWITCH - ON=-240, MEANING IGNORE SPACES & TABS
343 / OFF=-200, MEANING COMPARE SPACES&TABS
344 TSW, 0 /"T" SWITCH - ON=20 , MEANING CONVERT TABS ON OUTPUT
345 / OFF=0 , MEANING PRINT TABS ON OUTPUT
346 XSW, 0 /"X" SWITCH - ON=1 , MEANING DON'T INPUT COMMENTS
347 / OFF=0 , MEANING INPUT COMMENTS INTO CORE
348 ALLSW, 0 /"B" SWITCH - ON=2000, MEANING COMPARE BLANK LINES
349 / OFF=0 , MEANING IGNORE BLANK LINES
350 NUMLIN, 0 /NUMERICAL ARGUMENT - NUMBER OF LINES CONSTITUTING
351 /A MATCH - SET TO -3 IF NO NUMERICAL ARGUMENT
361 OUHNDL, 0 /THESE 5 WORDS ARE USED BY OUTPUT ROUTINE
367 DIFFS, 0 /DIFFERENCES FOUND FLAG
371 KRS /GET A CHAR FROM THE TELETYPE
372 TAD [-203 /CHECK FOR EITHER PARITY ^C
374 KSF /WITH THE KEYBOARD FLAG UP
376 CDF CIF 0 /YUP - RETURN TO OS/8
380 SETONE, 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
384 SETOPT, DCA T /SAVE THE STARTING POINTER
385 TAD TLNNUM /GET THE TARGET LINE
387 TAD I [OLDLIN /IS IT BEFORE OR AFTER THE LATEST LINE?
389 JMP SETRST /BEFORE - WE MUST START SEARCHING FROM LINE 1
390 DCA CT /AFTER - START SEARCHING FROM LATEST LINE
392 JMP KEEPON /NOT THERE YET
393 TAD TLNNUM /WE FOUND IT - MAKE THIS LINE
394 DCA I [OLDLIN /THE NEW "LATEST LINE"
396 DCA I [OLDPTR /FUTURE SEARCHES.
399 JMP I SETONE /RETURN POINTER FOR AUTO-XR
401 TAD T /ADD LENGTH OF THIS LINE TO POINTER
402 DCA T /TO GET POINTER TO NEXT LINE
404 TLNNUM, 0 /TEMPORARY FOR SETONE - DO NOT USE ANYWHERE ELSE
406 SETRST, 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
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
419 JMS SETONE /GET POINTER TO LAST LINE+1
421 DCA MLIMIT /SAVE AS LIMIT ON MOVE
423 JMS SETONE /GET POINTER TO THE FIRST LINE NOT TO DELETE
428 DCA I XR2 /AREN'T AUTO-XRS WONDERFUL
430 TAD MLIMIT /(ACTUALLY, NO)
433 MOVXIT, 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.
438 \fCOMPL, 0 /SUBROUTINE TO COMPARE TWO LINES
440 JMS SETONE /GET POINTER TO CURRENT LINE IN FILE 1
441 TAD [2 /SKIP OVER PROLOGUE
444 JMS SETONE /GET POINTER TO CURRENT LINE IN FILE 2
445 TAD [2 /SKIP OVER PROLOGUE
448 TAD I XR1 /GET A CHAR FROM FILE 1
452 DCA T2 /AND A CHAR FROM FILE 2
456 SZA CLA /ARE THEY EQUAL?
460 TAD CSW /IF AT END OF LINE, OR IF AT A "/"
461 SZA CLA /AND "IGNORE COMMENTS" SWITCH ON,
463 JMP I COMPL /TAKE "LINES MATCH" RETURN
466 TAD I XR1 /GET THE NEXT CHAR FROM FILE 1
469 TAD SSW /IF T1 IS A BLANK OR A TAB
471 TAD [27 /(27=BLANK-TAB)
472 SNA CLA /AND WE ARE IGNORING BLANKS,
473 JMP COMP3 /THEN IGNORE T1
475 TAD SSW /DO THE SAME WITH T2
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
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
493 AND T1 /SAME IF T2=CARRIAGE RETURN AND T1="/"
496 ISZ COMPL /OTHERWISE TAKE "LINES DON'T MATCH" RETURN
499 GETTWO, 0 /SUBROUTINE TO GET A LINE FROM EACH FILE
502 DCA GETFIL /ZERO INDICATOR AS TO WHICH FILE IS NULL
504 JMS I [GLINE /GET A LINE FROM FILE 1
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
510 JMP I GETTWO /TAKE NORMAL RETURN
513 \fGLINE, 0 /SUBROUTINE TO GET A LINE FROM A FILE
517 SZA CLA /IS THE LINE IN CORE?
520 JMS I [SETONE /GET POINTER TO THIS LINE
523 DCA I XR1 /SET WORD COUNT TO 2
525 DCA T /SAVE POINTER TO LENGTH WORD
526 JMS CTCCHK /CHECK FOR ^C TYPED
528 GLINE2, JMS GCHAR /MAIN LOOP - GET A CHARACTER
529 JMS I [TSTXSW /SEE WHETHER WE SHOULD INPUT COMMENTS
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.
537 DCA I XR1 /SALT IT AWAY
540 TAD [4-BUFLIM /COMPARE AGAINST END OF BUFFER
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
547 SZA CLA /WAS IT A CARRIAGE RETURN?
549 ISZ I [TOPLIN /YES - BUMP COUNT OF LINES IN CORE
553 GLEXIT, ISZ GETCNT /BUMP COUNTER OF # OF LINES GOTTEN
556 DCA GETFIL /INDICATE THAT THIS FILE WAS NOT NULL
557 ISZ I [CURLIN /BUMP CURRENT LINE POINTER
559 \fGCHAR, 0 /SUBROUTINE TO GET A CHAR FROM A FILE
561 DCA IPTR /SAVE POINTER TO CURRENT BUFFER WORD
562 ISZ I [INCHCT /BUMP CHAR COUNTER
564 TAD I [INEOF /END OF BUFFER
565 SZA CLA /END OF FILE??
568 TAD I [INRCNT /BUMP COUNT OF REMAINING RECORDS BY 2
570 ISZ I [INEOF /YES - SET END OF FILE FLAG
572 DCA I [INRCNT /RESTORE COUNTER IF NO OVERFLOW
576 TAD [401 /COMPUTE INPUT CONTROL WORD
580 DCA I [INPTR /PUT BUFFER ADDRESS INTO CALLING SEQUENCE
584 NOP /SET INSTRUCTION FIELD TO DATA FIELD
585 JMS I [INTEMP /CALL SUBR TO READ IN BUFFER
587 SPA CLA /FATAL ERROR?
589 ISZ I [INEOF /NO - SET END OF FILE FLAG
591 ISZ I [INREC /BUMP RECORD NUMBER BY 2
593 DCA I [INTEMP /INITIALIZE SHIFT REGISTER
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
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
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
626 JMP FFEED /FORM FEED IS SPECIAL
629 JMP GEOF /^Z SIGNIFIES END-OF-FILE
632 TAD [215 /AND CARRIAGE RETURN IS MAPPED INTO 0
636 FFEED, ISZ I [PGNUM /BUMP THE PROPER PAGE COUNT ON A FORM FEED
637 JMP GCHAR+1 /BUT OTHERWISE IGNORE IT
639 GEOF, ISZ I [INEOF /SET END-OF-FILE FLAG
641 DCA I [INCHCT /FORCE AN EMPTY BUFFER
642 JMP I GLINE /RETURN FROM GLINE WITHOUT SETTING GETFIL
646 STARTC, JMS I [OUSETP /INITIALIZE OUTPUT BUFFER POINTERS
648 DCA PNTPGN /FUDGE PNTPGN WHILE PRINTING HEADER LINES
650 JMS I [PNTHDG /PRINT SRCCOM HEADING LINE
651 JMS I [GETTWO /GET TITLE LINES
652 JMP FINISH /ONE FILE IS EMPTY - ABORT COMPARISON
654 JMS I [PNTTXT /PRINT FILE 1 HEADER
656 JMS I [PNTTXT /AND FILE 2 HEADER
657 DCA PNTPGN /INITIALIZE PAGE NUMBER
659 DCA DIFFS /INITIALIZE FLAG TO NO DIFFERENCES
666 JMS I [MOVEUP /DELETE ANY USELESS LINES
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
677 MAIN10, JMS I [GETTWO /GET TWO MORE LINES
678 JMP MAIN15 /ONE FILE RAN OUT
680 DCA I [CURLIN /INITIALIZE FILE 1 LINE NO.
681 MAIN12, 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
689 SZA CLA /THROUGH WITH FILE 1 LINES?
693 DCA I [CURLIN /NOW INITIALIZE FILE 2 LINE NO.
694 MAIN14, 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
707 SNA /FIND WHICH FILE WAS EMPTY
708 JMP FINISH /BOTH - ALL DONE
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
719 TAD [4402+F1+F2 /COMPUTE CDF OF SHORT FILE
725 SNL CLA /IS CURLIN < TOPLIN?
726 JMP MAIN10 /NO - WE STILL HAVE SOME COMPARING TO DO
732 MAIN18, NOP /SET DF TO DATA FIELD OF LONG FILE
733 JMS I [PNTTXT /PRINT IT
740 SZA CLA /ARE BOTH CORE BUFFERS EMPTY?
741 JMS I [PNTBTH /NO - PRINT THEM
743 \f/ MULTI-LINE COMPARATOR
750 DCA I [TMPLIN /STORE CURLIN AWAY IN A TEMPORARY
752 DCA NUMTMP /GET COUNT OF LINES TO COMPARE
755 MULT2, 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
759 MULT4, JMS SWAPCT /RESET OLD CURLIN
761 MULT6, ISZ NUMTMP /LINE COUNT EXHAUSTED?
762 JMP MULT2 /NO - KEEP COMPARING
763 JMS SWAPCT /RESTORE OLD CURLIN
764 JMS I [PNTBTH /PRINT OUT DIFFERENCES
766 JMS I [PNTAST /PRINT OUT SEPARATOR
767 JMS SWAPCT /RE-SWAP FOR DELETION
768 JMP MAIN /DELETE THRU MATCHING LINES AND CONTINUE
772 JMS SWAPX /SWAP CURLIN AND TMPLIN FOR FILE 1
774 JMS SWAPX /DITTO FOR FILE 2
786 \fPNTBTH, 0 /PRINT BOTH TEXT BUFFERS
788 JMS I [OCHAR /SEPARATOR
790 JMS PNTTXT /PRINT FILE 1 BUFFER
792 JMS PNTAST /PRINT SEPARATOR
794 JMS PNTTXT /PRINT FILE 2 BUFFER
796 JMS I [OCHAR /SEPARATOR
799 PNTTXT, 0 /PRINT A TEXT BUFFER
802 DCA PLNCNT /GET # OF LINES TO PRINT
803 PNTLP, DCA TABCT /ZERO TAB COUNTER (IN CASE "T" SW ON)
807 TAD [261 /260 FOR 12K VERSION
810 JMS I [OCHAR /PRINT RPAR
813 JMS I [SETONE /GET POINTER TO LINE
816 TAD I XR1 /GET THE PAGE NUMBER OF THE LINE
821 SNA CLA /DID THE PAGE NUMBER JUST CHANGE?
822 JMP PNTTAB /NO - DON'T PRINT IT
826 DCA PNTPGN /UPDATE THE CURRENT PAGE NUMBER
828 DCA CT /PRINT 3 DECIMAL DIGITS
834 PNTTAD, HLT /ADD IN A POWER OF 10
836 JMP DIGLP2 /KEEP GOING
838 ISZ PNTTAD /GOT A DIGIT - GO TO NEXT POWER OF 10
841 JMS I [OCHAR /PRINT DIGIT
845 SNA CLA /SHOULD WE SIMULATE TABS?
847 TAD [240 /YES - PRINT A BLANK
851 SZA CLA /KEEP PRINTING BLANKS UNTIL WE REACH A MULTIPLE OF
852 JMP PNTTAB /EIGHT COLUMNS.
853 PNTCLP, TAD I XR1 /GET A CHARACTER FROM THE LINE
859 PNTCHR, TAD [211 /NO - RESTORE THE CHAR
861 JMP PNTCLP /PRINT IT AND LOOP
862 PNTCR, TAD [215 /PRINT CRLF
867 JMP PNTLP /LOOP FOR EACH LINE IN BUFFER
869 \fPNTAST, 0 /ROUTINE TO PRINT ASTERISKS
874 JMP .-3 /PRINT REQUIRED NUMBER OF ASTERISKS
876 JMS I [OCHAR /TERMINATE THE LINE
879 DCA PNTPGN /KILL CURR. PAGE NUMBER
882 EOCOMP, ISZ DIFFS /ANY DIFFERENCES?
884 CDF 0 /MESSAGE IN FIELD 0
886 JMS I [PNTHDG /NO - PRINT MESSAGE
887 TAD PN7200 /ROUTINE TO FINISH UP OUTPUT
890 JMS I [OCHAR /TERMINATE THE OUTPUT FILE
891 TAD [232 /WITH A FORM FEED AND A ^Z
894 JMP .-2 /FILL WITH ZEROS TO FORCE BUFFER OUT
896 JMP I .+1 /GO TO FIELD 0 TO FINISH UP AS WE WILL BE
897 OCLOSE /OVERLAYED BY THE USR DURING THE CLOSE
899 TENTAD, TAD .+1 /TABLE OF POWERS OF TEN
904 INERR, RDF /INPUT ERROR - ERROR NUMBER=FILE NUMBER
908 IFZERO CORE-4 <TAD [-1>
910 JMP I [NOROOM /GO TO COMMON ERROR ROUTINE
912 PNTHDG, 0 /ROUTINE TO PRINT A LITERAL LINE
913 DCA XR1 /POINTER TO LINE IN AC
915 DCA PNTTXT /WE WORK BY FAKING OUT PNTTXT
917 DCA PLNCNT /SET LINE COUNTER TO 1
921 \fOCHAR, 0 /LOW LEVEL OUTPUT ROUTINE
924 ISZ TABCT /BUMP TAB COUNTER
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
939 TAD I OUXPTR /FIRST WORD OF DOUBLET
946 TAD I OUPTR /SECOND WORD OF DOUBLET
950 DCA OUXPTR /REMEMBER LAST WORD
954 ISZ OUCHCT /BUMP CHAR COUNT
956 CIF 0 /CHAR COUNT OVFLO - OUTPUT BUFFER
962 JMS OUSETP /INITIALIZE FOR NEXT BUFFER
963 ISZ OUREC /BUMP RECORD NUMBER
965 ISZ I [OCOUNT /BUMP CLOSING COUNT
966 ISZ I [OLEN /AND LENGTH OF HOLE
968 OUERR2, CLL CML RTL /OUTPUT ERROR OR FILE TOO BIG - GENERATE
969 IAC /A 3 OR A 4 MESSAGE, RESPECTIVELY
972 OCDF, HLT /RESTORE DATA FIELD
975 TAD [7000 /4 COUNTS FOR 2 WORDS
981 TSTXSW, 0 /SUBROUTINE TO IGNORE COMMENTS ON INPUT
982 TAD CHAR /IF "X" SWITCH SET
985 TAD XSW /IF XSW IS OFF OR THE CURRENT CHAR ISN'T A /
989 TAD CHAR /SKIP CHARACTERS UNTIL CARRIAGE RETURN
992 TSTXLP, CLA CLL CMA RAL
994 SNA CLA /ARE WE AT THE BEGINNING OF A LINE?
995 JMP I TSTXSW /YES - GLINE WILL DELETE IT IF NECESSARY
1000 SZA /IS THE PREVIOUS CHARACTER A SPACE
1006 DCA XR1 /BACK UP CHAR PTR
1009 DCA I T /AND CHAR CTR
1012 \fSRCOPT, DCA OUHNDL
1015 AND [1000 /"C" OPTION
1020 DCA ALLSW /"B" OPTION
1033 CIA /GET NEGATIVE OF NUMERICAL ARGUMENT
1035 CLA CLL CMA RTL /DEFAULT VALUE IS 3
1036 DCA NUMLIN /TO NUMBER OF LINES NECESSARY FOR A MATCH
1040 HEDING, "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