Added SRCCOM.MAC
[retro-software/dec/tops10/v4.5.git] / src / srccom.mac
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
4 \r
5 INTERNAL JOBVER,PURE\r
6 LOC <JOBVER==137>\r
7         EXP 16\r
8 \r
9 EXTERNAL        JOBFF,  JOBREL, JOBDA\r
10 \r
11 IFNDEF PURE,<PURE=1>\r
12   IFN PURE,<HISEG>\r
13 \r
14 ACDEV==1        ;COMMAND SCANNER ACCUMULATORS\r
15 ACFILE==2\r
16 ACEXT==3\r
17 ACDEL==4\r
18 ACPNTR==5\r
19 ACPPN==6        ;COMMAND SCANNER AC FOR PROJ,PROG #\r
20 \r
21 CTL=0   ;I/O CHANNEL ASSIGNMENTS\r
22 IN1=1\r
23 IN2=2\r
24 out=3\r
25 AL=1    ;ASCII LINE MODE\r
26 \r
27 W1=1\r
28 W2=2\r
29 W3=3\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
35 T=11    ;TEMPORARY AC\r
36 TT=12   ;TEMP AC\r
37 PP=17   ;PUSH DOWN POINTER\r
38 LPDL==20        ;LENGTH OF PUSH DOWN LIST\r
39 \r
40 TAB==11\r
41 LF==12\r
42 FF==14\r
43 CR==15\r
44 VT==13  ;VERTICAL TAB\r
45 \r
46 NOFORM==1               ;DON'T OUTPUT FORM FEED\r
47 PAGSW==2\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
56 \r
57 MATCH==3                ;# LINES TO BE MATCHED\r
58 WPL==^D100/5+1  ;MEMORY WORDS/LINE\r
59 LPP==^D52       ;LINES/PAGE\r
60 \r
61 COMP:   MOVEI   0,106\r
62         MOVEM   0,CCNT\r
63 COMPGO: CALLI\r
64         MOVEI   0,ENDP\r
65         MOVEM   0,JOBFF                 ;SET JOBFF AFTER VARIABLE AREA\r
66         MOVE    PP,[IOWD LPDL,PPSET]    ;SET UP PUSH DOWN LIST\r
67         MOVE    0,JOBFF\r
68         ADDI    0,500\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
73         BLT     ENDP-1  ;ZEROED\r
74         MOVEI   0,MATCH-1\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
88         JRST    COMPGO  ;NO\r
89 CTLSER: JSP     T,ERROUT\r
90         ASCIZ   /?COMMAND ERROR/\r
91 \r
92 CTLSE1: JUMPN   ACFILE,CTLSE2           ;NO DEFAULT IF DEVICE NOT 0\r
93         SKIPN   ACDEV\r
94         MOVSI   ACDEV,(SIXBIT /TTY/)    ;IF FILENAME 0, ASSUME TTY\r
95 CTLSE2: SKIPN   ACDEV\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
107         MOVEM   ACDEV,INDEV1\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
115 \r
116 CTLSE3: INBUF   IN1,2   ;DO LOOKUP ON FIRST FILE NAME\r
117         LOOKUP  IN1,INDIR1\r
118         JRST    ERRIA   ;ERROR  RETURN\r
119         PUSHJ   PP,NAME1\r
120         TLNN    FR,CTYPF                ;ANY FILE DESCRIPTOR TYPED?\r
121         JRST    CTLSER          ;NO,    ERROR\r
122         SKIPN   ACDEV\r
123         MOVSI   ACDEV,(SIXBIT /DSK/)    ;"DSK" IS DEFAULT\r
124         MOVEM   ACDEV,INDEV1\r
125         SKIPE   ACFILE\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
130         MOVE    1,INDEV1\r
131         MOVE    2,OPN2+1\r
132         MOVE    3,OPN1+3\r
133         MOVE    4,OPN2+2\r
134         JRST    0               ;OPEN   FILE IN REGISTERS.\r
135 ERR2A:  INBUF   IN2,2           ;LOOKUP ON SECOND FILE NAMES\r
136         LOOKUP  IN2,INDIR1\r
137         JRST    ERRIA\r
138         MOVSI   0,41000         ;INIT \r
139         TLNE    FR,40000\r
140         MOVSI   0,41140         ;INIT\r
141         MOVE    ACDEV,OUTDEV\r
142         MOVSI   ACFILE,CTOBUF\r
143         TLNE    FR,40000\r
144         MOVSI   2,OUTBUF                ; ADJUST REGISTERS.\r
145         MOVE    3,OPN1+2\r
146         MOVE    4,OPN2+3\r
147         JRST    0               ; EXECUTE IN REGISTERS\r
148 CTLSE4: MOVE    TT,OUTDEV\r
149         CALLI   TT,4            ;DEVCHR\r
150         TLNN    TT,1\r
151         JRST    ERRO\r
152         TLNE    TT,40010        ; CHECK IF TTY OR LPT\r
153         TLO     FR,IOTTY\r
154         MOVE    T,INDIR1                ; SETUP OUTPUT FILE\r
155         SKIPN   OUTDIR\r
156         MOVEM   T,OUTDIR\r
157         MOVSI   T,(SIXBIT /SCM/)\r
158         TLNE    FR,40000\r
159         MOVSI   T,(SIXBIT /MRG/)\r
160         SKIPN   OUTDIR+1\r
161         MOVEM   T,OUTDIR+1\r
162         MOVE    0,[ENTER CTL,OUTDIR]\r
163         TLNE    FR,40000\r
164         HRLI    0,(ENTER OUT,)  ; ENTER OUTPUT FILE\r
165         XCT     0\r
166         JRST    ERRO\r
167         OUTPUT  CTL,\r
168         TLNE    FR,40000\r
169         OUTPUT  3,\r
170         AOS     W1,JOBFF\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
174         MOVE    W1,JOBREL\r
175         SUB     W1,JOBFF                        ;COMPUTE SPACE AVAILABLE\r
176         HRRZS   W1\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
180         HRLOI   0,377777\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
185         PUSHJ   PP,GETTWO\r
186         JFCL    \r
187         MOVE    W1,LBUFP1\r
188         HRRZ    W2,(W1)\r
189         MOVSI   W1,1(W1)\r
190         HRRI    W1,HBUF1\r
191         CAIL    W2,25\r
192         MOVEI   W2,25\r
193         BLT     W1,HBUF1(W2)\r
194         SETZM   HBUF2-1\r
195         MOVE    W1,LBUFP2\r
196         HRRZ    W2,(W1)\r
197         MOVSI   W1,1(W1)\r
198         HRRI    W1,HBUF2\r
199         CAIL    W2,25\r
200         MOVEI   W2,25\r
201         BLT     W1,HBUF2(W2)\r
202         SETZM   HBUF2+WPL-1\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
215 \r
216 MAIN:   TRZ     FR,-1           ;THIS FOR FILE ONE\r
217         SETZM   MPP(FR)\r
218         PUSHJ   PP,MOVEUP       ;MOVE UP THE BOTTOM, BECAUSE WE ARE FINISHED\r
219                                 ;WITH TWO LINES\r
220         HRRI    FR,1            ;NOW FOR FILE TWO\r
221         TLNE    FR,40000\r
222         SETOM   MPP(FR)\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
229 \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
232 ;MATCHING LINES\r
233 \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
238 \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
246 \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
250         JRST    MAIN10          ;YES\r
251         PUSHJ   PP,COMPL\r
252         JSP     W1,MULTI        ;LOOK FOR MULTI LINE MATCH\r
253         AOJA    F2,MAIN14       ;INDEX AND LOOK SOME MORE\r
254 \f\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
261 ;MATCH IS FOUND.\r
262 \r
263 MAIN15: SKIPGE  W1,GETFIL       ;DOES EITHER FILE HAVE A LINE?\r
264         JRST    FINISH          ;NO\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
278 \r
279 MAIN18: PUSHJ   PP,PNTTXT       ;ALL LINES ARE GONE FROM 1 FILE.\r
280                                 ;OUTPUT THE OTHER WITHOUT USING CORE\r
281         PUSHJ   PP,MULT9\r
282         JRST    MAIN\r
283         JRST    MAIN\r
284 \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
287 \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
294         SKIPE   0,ERRCNT\r
295         TLNN    FR,40000\r
296         JRST    CARR1\r
297         MOVEI   T,[ASCIZ /END OF MERGE/]\r
298         PUSHJ   PP,TYPMSG\r
299         JRST    CARR1           ;END OF SOURCE COMPARE\r
300 \f\r
301 ;THIS SECTION LOOKS FOR MULTI LINE MATCH\r
302 \r
303 MULTI:  SKIPG   NUMLIN          ;MULTIPLE LINE TEST?\r
304         JRST    MULT8           ;NO\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
308         MOVEM   F2,TEMPF2\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
314         MOVE    F2,TEMPF2\r
315         JRST    @RTNTMP         ;RETURN TO WHERE WE GOT TO MULTI FROM\r
316 \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
321         SUB     F2,W1\r
322 MULT8:  PUSHJ   PP,PNTBTH       ;PRINT DIFFERENCES\r
323         PUSHJ   PP,MULT9\r
324         JRST    MULT8A\r
325 \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
330 \r
331         MOVE    W1,[POINT 7,[ASCIZ /***************/]]\r
332         PUSHJ   PP,PRINT\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
338         JRST    CPOPJ1\r
339         SUBI    F1,1\r
340         SUBI    F2,1\r
341         PUSHJ   PP,DMP3\r
342 MULT10: PUSHJ   PP,GETC\r
343         HRRI    FR,0\r
344         CAIN    C,61\r
345         JRST    MULT11\r
346         HRRI    FR,NOFORM\r
347         CAIE    C,62\r
348         JRST    MULT12\r
349 MULT11: SETOM   MPP(FR)\r
350         PUSHJ   PP,MOVEUP\r
351         SETOM   F1(FR)\r
352         JRST    MULT10\r
353 MULT12: CAIE    C,124\r
354         JRST    .+6\r
355 MULT13: PUSHJ   PP,TTYIN1\r
356         CAIN    C,33\r
357         JRST    MULT10\r
358         PUSHJ   PP,FILEO\r
359         JRST    MULT13\r
360         CAIE    C,0\r
361         HALT    .+1\r
362         HRRI    FR,0\r
363         SETZM   MPP(FR)\r
364         SKIPL   F1(FR)\r
365         PUSHJ   PP,MOVEUP\r
366         HRRI    FR,NOFORM\r
367         SETZM   MPP(FR)\r
368         SKIPL   F1(FR)\r
369         PUSHJ   PP,MOVEUP\r
370         ADDI    F1,1\r
371         ADDI    F2,1\r
372         POPJ    PP,\r
373 \f;THIS ROUTINE SETS UP THE POINTERS TO THE TEXT\r
374 \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
378 ;          TEXT FOR LINE 0\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
383 ;       A) AS ABOVE\r
384 \r
385 SETP:   HRRI    FR,1            ;SET UP POINTER FILE 1\r
386         PUSHJ   PP,SETONE\r
387         HRRI    FR,0            ;DITTO FILE 0\r
388 \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
399         SOJGE   W3,TT\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
403 \r
404 SETON2: HRRZM   T,OLDPNT(FR)    ;SAVE POINTER TO THIS LINE\r
405         HRLI    T,700           ;NO, CHANGE TO BYTE POINTER\r
406         MOVEM   T,1(FR)\r
407         POPJ    PP,\r
408 \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
411 \r
412 MOVEUP: SKIPE   MPP(FR) \r
413         SKIPGE  W3,F1(FR)       \r
414         JRST    MOVEY           \r
415         CAMLE   W3,TOP(FR)\r
416         MOVE    W3,TOP(FR)\r
417         HRRZ    T,LBUFP1(FR)\r
418 MOVE0:  MOVEI   W1,1(T)\r
419         HRLI    W1,(POINT 7,,)\r
420         ILDB    C,W1\r
421         JUMPE   C,.+3\r
422         PUSHJ   PP,FILEO\r
423         JRST    .-3\r
424         ADD     T,(T)\r
425         SOJGE   W3,MOVE0\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
432         PUSH    PP,T            ;SAVE\r
433         AOS     W3,TOP(FR)      ;GET 1ST NON-EXISTANT LINE #\r
434         PUSHJ   PP,SETON1       ;GET CORRESPONDING 1ST ADR\r
435         POP     PP,W1\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
440 \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
443         HRLOI   0,377777\r
444         MOVEM   0,OLDNUM(FR)    ;FORCE SETON1 TO RECALCULATE\r
445         POPJ    PP,\r
446 \f;CODE FOR GETTING TWO LINES\r
447 ;CALLING SEQUENCE IS:\r
448 ;       PUSHJ PP,GETTWO\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
452 \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
458         PUSHJ   PP,GLINE\r
459         SKIPLE  GETCNT          ;GETCNT .G. 0 IF TWO LINES WERE GOT\r
460         AOS     (PP)            ;SKIP IF 2 LINES WERE AVAILABLE\r
461         POPJ    PP,\r
462 \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
481         JRST    GLINE3\r
482 \f\r
483 MLON    ;MULTI LINE LITERAL\r
484 \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
490                                 ;SLOP TO BE SAVE\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
501         POPJ    PP,\r
502 \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
512 \r
513 \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
528 \r
529         HRRZ T,JOBREL\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
533         SKIPA T,ROOM    ;FAIL\r
534         JRST NOR4       ;SUCCESS\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
538 \f\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
557         JRST NOR90\r
558 \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
567         MOVE W2,.+1\r
568         JUMPL T,W1      ;W1/    POP T,<DISTANCE OF MOVE>(T)\r
569                         ;W2/    JUMPL T,W1\r
570                         ;W3/    JRST NOR90\r
571 ;THE ABOVE INSTRUCTIONS ARE A REVERSE BLT AND ARE IN THE AC'S FOR SPEED\r
572 \r
573 NOR90:  MOVE T,ROOM     ;GET DISTANCE FILE #1 WAS MOVED\r
574         ADDM T,LBUFP2   ;MODIFY STARTING ADR OF FILE #1\r
575         HRLOI 0,377777\r
576         MOVEM 0,OLDNUM+1        ;FORCE "SETONE" TO RECALCULATE BYTE POINTER\r
577 NOR98:  POP PP,1\r
578 NOR99:  JRST GLINE3     ;CHECK COMPUTATIONS ON RETURNING\r
579 \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
583 \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
587 \r
588         MOVEI   W3,1\r
589         TDNN    W3,1(W1)        ;TEST SEQUENCE # BIT\r
590         JRST    .+3             ;NOT SEQ. #\r
591         AOS     P1              ;SKIP OVER SEQ. # AND\r
592         IBP     P1              ;THE TAB\r
593         TDNN    W3,1(W2)        ;SAME THING FOR FILE #2\r
594         JRST    .+3\r
595         AOS     P2\r
596         IBP     P2\r
597 \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
601         JRST    COMPL4          ;NO\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
606 \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
611         SKIPA                   ;NO\r
612         JRST    COMPL3          ;FLUSH SPACE OR TAB FOR FILE 1\r
613 \r
614         CAIE    W2,40           ;SPACE?\r
615         CAIN    W2,TAB          ;OR TAB?\r
616         TLNN    FR,SSWBIT       ;AND IS SPACING BEING IGNORED?\r
617         SKIPA                   ;NO\r
618         JRST    COMPL2          ;YES, FLUSH A SPACE OR TAB FOR FILE 2\r
619 \r
620         CAMN    W1,W2           ;ARE THE CHARACTERS NOW THE SAME?\r
621         JRST    COMPL7          ;YES, TEST FOR END OF LINES\r
622 \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
629 CPOPJ1: AOS     (PP)\r
630 CPOPJ:  POPJ    PP,\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
634 \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
638         PUSHJ   PP,PRINT\r
639         PUSHJ   PP,PCRLF\r
640         HRRI    FR,1            ;THEN PRINT FILE 2 DIFFERNCES\r
641 \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
644 \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
652         PUSH    PP,F2\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
658         TLNN    FR,ALLSW\r
659         PUSHJ   PP,PCRLF\r
660         POP     PP,F2\r
661         POP     PP,F1           ;RESTORE REGS\r
662         JRST    PNTTX1          ;FINISH OUT ALL LINES\r
663 \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
667         MOVEI   C,")"\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
673         PUSHJ   PP,PCHART\r
674 \r
675 PRINT:  ILDB    C,W1            ;GET CHARACTER\r
676         JUMPN   C,.-2           ;LOOP UNTIL A NULL SHOWS UP\r
677         POPJ    PP,\r
678 \r
679 \r
680 PCRLF:          ;THIS CODE OUTPUTS A CARRAIGE RETURN-LINE\r
681                         ;FEED AND DECREMENTS THE LINE COUNT\r
682 \r
683         PUSHJ   PP,CRLF \r
684         SETZM   COLCNT\r
685         TLNE    FR,40000\r
686         POPJ    PP,\r
687         SOSN    LINCNT  ;DECREMENT THE LINES/PAGE COUNT\r
688         TLO     FR,PAGSW        ;THIS MEAN WE GET A NEW HEADING\r
689         POPJ    PP,\r
690 \r
691 PGNUM:  MOVEM   C,PAGEN         ;SAVE NEW PAGE # AS OLD\r
692 PGNUM1: IDIVI   C,12            ;STANDARD DECIMAL PRINT ROUTINE\r
693         HRLM    T,(PP)\r
694         SKIPE   C\r
695         PUSHJ   PP,PGNUM1\r
696         HLRZ    C,(PP)\r
697         ADDI    C,"0"\r
698         JRST    PCHART\r
699 \f;THIS PAGE CONTAINS ROUTINES FOR CHARACTER OUTPUT\r
700 \r
701 ;CHARACTERS OUTPUTED AS A STRING OF TEXT COME THROUGH HERE\r
702 \r
703 PCHART: JUMPE   C,CPOPJ         ;ZERO MEANS A CARRIAGE RETURN\r
704                                 ;IF SO WE ARE THROUGH WITH LINE\r
705         AOS     T,COLCNT\r
706         CAIGE   C," "           ;A PRINTING CHAR?\r
707         JRST    PCHAR2\r
708 PCHAR0: TLNE    FR,40000\r
709         CAMG    T,CCNT\r
710         JRST    PCHAR\r
711         POPJ    PP,\r
712 PCHAR2: SKIPG   CCNT\r
713         POPJ    PP,\r
714         CAIE    C,TAB           ;OR A TAB?\r
715         JRST    .+4\r
716         IORI    T,7\r
717         MOVEM   T,COLCNT\r
718         JRST    PCHAR0\r
719         CAIE    C,CR\r
720         JRST    .+3\r
721         SETZM   COLCNT\r
722         JRST    PCHAR\r
723         CAIE    C,LF\r
724         JRST    .+3\r
725         SOS     COLCNT\r
726         JRST    PCHAR           ;YES\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
733         SETOM   LINCNT  ;YES\r
734 ;THIS CODE OUTPUTS A HEADING COMPRISES OF THE TITLE OF\r
735 ;EACH FILE AFTER "FILE 1)" AND "FILE 2)"\r
736 \r
737         MOVEM   16,SAVEXS+16    ;SAVE ACCUMULATORS WHILE OUTPUTING HEADING\r
738         MOVEI   16,SAVEXS\r
739         BLT     16,SAVEXS+15    ;ACCUMULATORS ARE NOW SAVED\r
740         TLNE    FR,ENDSW        ;DON'T BOTHER IF NO ERRORS DETECTED\r
741         JRST    PCHAR1\r
742         MOVEI   C,FF            ;FOR NEW PAGE, ISSUE FORM FEED\r
743         TLNN    FR,NOFORM       ;IF 1, SUPPRESS FORM FEED\r
744         PUSHJ   PP,TYO\r
745         MOVE    W1,[POINT 7,[ASCIZ /FILE 1)     /]]\r
746         PUSHJ   PP,PRINT\r
747         MOVE    W1,[POINT 7,HBUF1]\r
748         PUSHJ   PP,PRINT        ;PRINT FILE 1 NAME\r
749         PUSHJ   PP,PCRLF\r
750         MOVE    W1,[POINT 7,[ASCIZ /FILE 2)     /]]\r
751         PUSHJ   PP,PRINT\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
755         PUSHJ   PP,PCRLF\r
756         MOVEI   LPP     ;RESET LINES/PAGE COUNT\r
757         MOVEM   LINCNT\r
758         MOVSI   16,SAVEXS       ;AND RESTORE ACS\r
759         BLT     16,15\r
760         MOVE    16,SAVEXS+16\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
763 \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
768 \r
769 \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
777         PUSHJ   PP,TYO\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
781         PUSHJ   PP,TYPMS2\r
782         JRST    CARR    ;THIS WILL OUTPUT TWO C.R. AND EXIT\r
783 \r
784 \r
785 ERRA:   MOVE    T,OUTDEV        ;OUTPUT INIT FAIL\r
786         MOVEM   T,INDEV1\r
787 \r
788 ERRI:   MOVEI   T,[ASCIZ /?DEVICE /]\r
789         PUSHJ   PP,TYPMSG       ;TYPE BEGINING OF MESSAGE\r
790         MOVE    T,INDEV1\r
791         PUSHJ   PP,PNTSIX\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
795 \r
796 PNTSIX: MOVE TT,[POINT 6,T]     ;INIT SIXBIT BYTE POINTER\r
797 PNTS1:  TLNN TT,770000          ;FINISHED WITH WORD?\r
798         POPJ PP,                ;YES\r
799         ILDB C,TT               ;NO, GET CHARACTER\r
800         JUMPE C,PNTS1           ;FLUSH SPACES\r
801         ADDI C,40               ;CHANGE TO ASCII\r
802         PUSHJ PP,TYO\r
803         JRST PNTS1\r
804 \fCRLF:  MOVEI   C,CR    ;OUTPUT A CARRIAGE RETURN-LINE FEED\r
805         PUSHJ   PP,TYO\r
806         MOVEI   C,LF    ;NOW THE LINE FEED\r
807 \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
813         POPJ    PP,             ;NO\r
814 DMPOUT: OUT     CTL,            ;YES, OUTPUT BUFFER\r
815         POPJ    PP,             ;OK\r
816         JSP     T,ERROUT\r
817         ASCIZ   /?OUTPUT DEVICE ERROR/\r
818 \r
819 ERRO:   JSP     T,ERROUT\r
820         ASCIZ   /?OUTPUT INITIALIZATION ERROR/\r
821 ERRCOR: MOVEI   T,[ASCIZ /?2K CORE NEEDED AND NOT AVAILABLE/]\r
822         PUSHJ   PP,TYPMSG\r
823         CALLI   12              ;PRINT MESSAGE AND EXIT\r
824 \r
825 ERROUT: PUSHJ   PP,TYPMSG       ;OUTPUT ERROR\r
826         JRST    CARR    ;THROW IN TWO CR AND TRY AGAIN\r
827 \r
828 FILEO:  SOSG    OUTBUF+2\r
829         PUSHJ   PP,DMPFIL\r
830         IDPB    C,OUTBUF+1\r
831         POPJ    PP,\r
832 DMPFIL: OUT     3,\r
833         POPJ    PP,\r
834         JSP     T,ERROUT\r
835         ASCIZ   /?MERGE OUTPUT FILE WRITE ERROR/\r
836 DMP2:   MOVEM   W1,CCNT\r
837 DMP3:   MOVEI   C,52\r
838         PUSHJ   PP,TYO\r
839         PUSHJ   PP,DMPOUT\r
840         MOVE    W1,[POINT 7,MPP1]\r
841 DMPFL1: MOVEI   C,0\r
842         CAIE    W1,[POINT 7,MPP2,7]\r
843         PUSHJ   PP,TTYIN\r
844         CAIGE   C,40\r
845         MOVEI   C,0\r
846         IDPB    C,1\r
847         CAIE    C,61\r
848         CAIN    C,62\r
849         JRST    DMPFL1\r
850         CAIN    C,124\r
851         JRST    DMPFL1\r
852         CAIE    C,103\r
853         JRST    SAVP\r
854 \r
855 GETDEC: MOVEI   W1,0\r
856         PUSHJ   PP,TTYIN\r
857         CAIGE   C,40\r
858         JRST    DMP2\r
859         CAIL    C,"0"\r
860         CAILE   C,"9"\r
861         JRST    ERRD\r
862         IMULI   W1,^D10\r
863         ADDI W1,-"0"(C)\r
864         JRST    GETDEC+1\r
865 \r
866 SAVP:   MOVE    W1,[POINT 7,MPP1]\r
867         MOVEM   W1,MPPX\r
868         JUMPE   C,CPOPJ\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
871 Z]]\r
872         PUSHJ   PP,PRINT\r
873         JRST    DMP3\r
874 GETC:   ILDB    C,MPPX\r
875         POPJ    PP,\r
876 \f;ROUTINES FOR OUTPUTING ERROR MESSAGES\r
877 \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
881         SKIPA   \r
882         PUSHJ   PP,TYO\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
886 \r
887 CARR:   PUSHJ   PP,CRLF ;COMMON EXIT FOR ERROR MESSAGES\r
888 CARR1:  PUSHJ   PP,CRLF\r
889 \r
890         CLOSE   CTL,\r
891         RELEASE CTL,\r
892         RELEASE IN1,\r
893         RELEASE IN2,\r
894         RELEASE OUT,\r
895         JRST    COMPGO\r
896 \r
897 ;INITIALIZE TTY FOR ERROR MESSAGES\r
898 INITTY: CLOSE   CTL,\r
899         RELEASE CTL,\r
900         INIT    CTL,1\r
901         SIXBIT  /TTY/\r
902         XWD     CTOBUF,CTIBUF\r
903         HALT\r
904         INBUF   CTL,1\r
905         OUTBUF  CTL,1\r
906         POPJ    PP,\r
907 \r
908 GCHAR0: TLNE    FR,ALLSW\r
909         POPJ    PP,\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
916         JRST    GCHAR           ;NO\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
925         JRST    FORM            ;YES\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
929 \r
930 FORM:   AOS     PAGNUM(FR)      ;INDEX PAGE NUMBER\r
931         TLO     FR,20000\r
932         TLNE    FR,ALLSW\r
933         POPJ    PP,\r
934         JRST    NULL\r
935 \r
936 EOF:    TLO     FR,@EOFTBL(FR)  ;SET EOF FLAG\r
937 NULL:   MOVEI   C,0             ;EOF IS A NULL\r
938         POPJ    PP,\r
939 \r
940 GCHAR1: INPUT   IN1,            ;INPUT FOR FILE 1\r
941         STATO   IN1,762000      ;ERRORS OR END OF FILE?\r
942         JRST    (C)             ;NO\r
943         STATO   IN1,742000      ;YES, EOF?\r
944         JRST    EOF             ;YES END OF FILE\r
945         JSP     T,ERROUT\r
946         ASCIZ   /?FILE 1 READ ERROR/\r
947 \r
948 GCHAR2: INPUT   IN2,\r
949         STATO   IN2,762000\r
950         JRST    (C)\r
951         STATO   IN2,742000\r
952         JRST    EOF\r
953         JSP     T,ERROUT\r
954         ASCIZ   /?FILE 2 READ ERROR/\r
955 \r
956 SEQTBL: Z @INBUF1+1     ;POINTS TO ADR OF LAST CHAR FILE #0\r
957         Z @INBUF2+1     ;DITTO FILE #1\r
958 \r
959 BYTTBL: INBUF1+1                ;ADR OF BYTE POINTER FILE #0\r
960         INBUF2+1                ;DITTO FILE #1\r
961 \r
962 EOFTBL: EOF1SW          ;EOF FLAG FOR FILE 1\r
963         EOF2SW          ;EOF FLAG FOR FILE 2\r
964 \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
968         SETZB   ACFILE,ACEXT\r
969         TLZ     FR,CTYPF                ;CLEAR COMMAND TYPED FLAG\r
970 \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
973 \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
979         JRST    TERM            ;YES\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
984         JRST    GETSW   ;YES\r
985         TLO     FR,CTYPF        ;SET COMMAND TYPED FLAG\r
986         CAIN    C,":"   ;HAVE WE BEEN GETTING A DEVICE NAME\r
987         JRST    DEVICE  ;YES\r
988         CAIN    C,"."   ;OR A FILE NAME\r
989         JRST    NAME    ;YES\r
990         TRC     C,40    ;CONVERT TO SIXBIT\r
991         TLNE    ACPNTR,770000   ;HAVE WE STORED SIX BYTES?\r
992         IDPB    C,ACPNTR        ;NO\r
993         JRST    GETIOC          ;GET ANOTHER CHAR.\r
994 \r
995 TTYIN:  PUSHJ   PP,TTYIN1       \r
996         CAIL    C,140\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
1000         JRST    TTYIN\r
1001         CAIN    C,CR\r
1002         JRST    TTYIN\r
1003         POPJ    PP,\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
1008         CAIE    C,176\r
1009         CAIN    C,175\r
1010         MOVEI   C,33    ;CHANGE ALL ALT MODES TO NEW\r
1011         POPJ    PP,\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
1016 \r
1017 TERM:   JUMPE   ACDEL,.+3       ;IF NO PREVIOUS DELIMITOR, OR\r
1018         CAIE    ACDEL,":"       ;IF PREVIOUS DELIMITER\r
1019         JRST    TERM1\r
1020         MOVE    ACFILE,0        ;SET FILE\r
1021 TERM1:  CAIE    ACDEL,"."       ;IF PERIOD,\r
1022         POPJ    PP,\r
1023         HLLZ    ACEXT,0 ;SET EXTENSION\r
1024         POPJ    PP,             ;EXIT\r
1025 \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
1029         AOBJN   T,.-1\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
1033 \r
1034 GETSW1: MOVEI   C,-"1"(C)       ;CHANGE CHAR TO NUMBER\r
1035         CAILE   C,10\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
1038         JRST    GETIOC\r
1039 \r
1040 SWTBL:  XWD     SSWBIT,"S"\r
1041         XWD     CSWBIT+SSWBIT,"C"\r
1042         XWD     ALLSW,"B"\r
1043         XWD     40000+IOTTY+ALLSW,"M"\r
1044 SWTBLE:         ;END OF TABLE\r
1045 \r
1046 OPN1:   INIT    IN1,1\r
1047         INBUF1\r
1048         JRST    ERRA\r
1049         JRST    ERRI\r
1050         JRST    CTLSE3\r
1051 OPN2:   INIT    IN2,1\r
1052         INBUF2\r
1053         JRST    ERR2A\r
1054         JRST    CTLSE4\r
1055         LIT\r
1056 IFN PURE,<LOC 140>      ;IMPURE AREA\r
1057 CCNT:   BLOCK   1\r
1058 OUTDEV: BLOCK   1\r
1059 PPSET:  BLOCK   LPDL    ;PUSH DOWN LIST STORAGE\r
1060 \r
1061 CTIBUF: BLOCK   3\r
1062 CTOBUF: BLOCK   3\r
1063 INBUF1: BLOCK   3\r
1064 INBUF2: BLOCK   3\r
1065 OUTBUF: BLOCK   3\r
1066 ERRCNT: BLOCK   1       ;DIFFERENCES COUNTER (0 MEANS NO DIFFERENCES)\r
1067 \r
1068 INDEV1: BLOCK 1\r
1069 \r
1070 INDIR1: BLOCK   4\r
1071 \r
1072 OUTDIR: BLOCK   4\r
1073 \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
1077 \r
1078 LBUFP:\r
1079 LBUFP1: BLOCK   1       ;POINTER TO BEGINNING OF LINE STORAGE FOR FILE #1\r
1080 LBUFP2: BLOCK   1       ;DITTO FILE #2\r
1081 \r
1082 P1:     BLOCK   1       ;BYTE POINTERS USED BY "COMPL" SUBROUTINE\r
1083 P2:     BLOCK   1\r
1084 \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
1092 MPP:    BLOCK 2 \r
1093 MPP1:   BLOCK 1 \r
1094 MPP2:   BLOCK 1 \r
1095         BLOCK 1 \r
1096 MPPX:   BLOCK 1 \r
1097 SAVEXS: BLOCK   17     ;STORAGE FOR AC'S WHEN PRINTING PAGE HEADERS\r
1098 \r
1099 TEMP:   BLOCK   1\r
1100 LINCNT: BLOCK   1\r
1101 COLCNT: BLOCK   1\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
1112 \r
1113 ENDP:\r
1114 \r
1115 END COMPGO\r
1116 \r