From 8975ed2f727e4bb0190f22b1401821e5981cf7c2 Mon Sep 17 00:00:00 2001 From: Richard Cornwell Date: Thu, 16 May 2019 11:20:36 -0400 Subject: [PATCH] Added SRCCOM.MAC --- src/srccom.mac | 1116 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 1116 insertions(+), 0 deletions(-) create mode 100644 src/srccom.mac diff --git a/src/srccom.mac b/src/srccom.mac new file mode 100644 index 0000000..e615622 --- /dev/null +++ b/src/srccom.mac @@ -0,0 +1,1116 @@ +TITLE SRCCOM V.016 12-JUNE-69 +SUBTTL SOURCE FILE COMPARE - BOWERING/TWE +;*****(C)COPYRIGHT 1969 BY DIGITAL EQUIPMENT CORP., MAYNARD, MASS.,USA***** + +INTERNAL JOBVER,PURE +LOC + EXP 16 + +EXTERNAL JOBFF, JOBREL, JOBDA + +IFNDEF PURE, + IFN PURE, + +ACDEV==1 ;COMMAND SCANNER ACCUMULATORS +ACFILE==2 +ACEXT==3 +ACDEL==4 +ACPNTR==5 +ACPPN==6 ;COMMAND SCANNER AC FOR PROJ,PROG # + +CTL=0 ;I/O CHANNEL ASSIGNMENTS +IN1=1 +IN2=2 +out=3 +AL=1 ;ASCII LINE MODE + +W1=1 +W2=2 +W3=3 +FIL=4 ;FILE # (0 IS FILE 1; 1 IS FILE 2) +F1=5 ;LINE POINTER FILE 1 (CONTAINS INTEGER) +F2=F1+1 ;DITTO FILE 2 +FR=7 ;FLAG REGISTER (LH) AND FILE #(0 OR 1)(RH) +C=10 ;CONTAINS 1 CHAR FOR PROCESSING +T=11 ;TEMPORARY AC +TT=12 ;TEMP AC +PP=17 ;PUSH DOWN POINTER +LPDL==20 ;LENGTH OF PUSH DOWN LIST + +TAB==11 +LF==12 +FF==14 +CR==15 +VT==13 ;VERTICAL TAB + +NOFORM==1 ;DON'T OUTPUT FORM FEED +PAGSW==2 +ENDSW==4 ;END SWITCH (SUPPRESS FORM-FEED IF FILES IDENTICAL) +SSWBIT==100 ;/S SWITCH - IGNORE SPACING +CSWBIT==200 ;/C SWITCH - IGNORE COMMENTS +ALLSW==400 ;/B SWITCH (ALLOWS COMPARING BLANK LINES) +EOF1SW==1000 ;EOF SEEN ON FILE 1 +EOF2SW==2000 ;EOF SEEN ON FILE 2 +IOTTY==4000 ;OUTPUT TO TTY +CTYPF==10000 ;1 IF ANY CHARS TYPED FOR A COMMAND + +MATCH==3 ;# LINES TO BE MATCHED +WPL==^D100/5+1 ;MEMORY WORDS/LINE +LPP==^D52 ;LINES/PAGE + +COMP: MOVEI 0,106 + MOVEM 0,CCNT +COMPGO: CALLI + MOVEI 0,ENDP + MOVEM 0,JOBFF ;SET JOBFF AFTER VARIABLE AREA + MOVE PP,[IOWD LPDL,PPSET] ;SET UP PUSH DOWN LIST + MOVE 0,JOBFF + ADDI 0,500 + CALLI 0,11 ;CORE UUO + JRST ERRCOR ;NOT AVAILABLE + SETZM PPSET ;THIS IS THE ZERO WHICH WILL ; BE "BLT"ED TO CLEAR CORE + MOVE [XWD PPSET,PPSET+1] ;ZERO STORAGE AREA + BLT ENDP-1 ;ZEROED + MOVEI 0,MATCH-1 + MOVEM 0,NUMLIN ;MATCH IS NORMALLY 3 LINES (N-1) + AOS PAGNUM+0 ;ZEROED BY BLT ABOVE-1ST PAGE IS 1 + AOS PAGNUM+1 ;DITTO FOR SECOND FILE + MOVSI FR,NOFORM+PAGSW ;INIT FR FOR NEW PAGE HEADING + PUSHJ PP,INITTY ;INITIALIZE TTY + PUSHJ PP,CRLF ;OUTPUT CARRIAGE RETURN - LINE FEED + MOVEI C,"*" ;TELL USER WE ARE READY FOR COMMAND + PUSHJ PP,TYO ;OUTPUT THE * + PUSHJ PP,DMPOUT ;OUT GOES THE * + PUSHJ PP,NAME1 ;ANALIZE OUTPUT DEVICE AND NAME + CAIN C,"_" ;ERROR IF NO ARROW + JRST CTLSE1 ;ITS THERE--PROCEED + TLNN FR,CTYPF ;ANY COMMAND TYPED? + JRST COMPGO ;NO +CTLSER: JSP T,ERROUT + ASCIZ /?COMMAND ERROR/ + +CTLSE1: JUMPN ACFILE,CTLSE2 ;NO DEFAULT IF DEVICE NOT 0 + SKIPN ACDEV + MOVSI ACDEV,(SIXBIT /TTY/) ;IF FILENAME 0, ASSUME TTY +CTLSE2: SKIPN ACDEV + MOVSI ACDEV,(SIXBIT /DSK/) ;IF FILENAME NOT 0, ASSUME DISK + MOVEM ACDEV,OUTDEV ;SAVE OUTPUT DEVICE IN DIRECTORY BLOCK + MOVEM ACFILE,OUTDIR ;PUT SIXBIT FILE NAME IN + MOVEM ACEXT,OUTDIR+1 ;AND SAVE EXTENSION + ;PROCESS INPUT PART OF COMMAND STRING + PUSHJ PP,NAME1 ;GET INPUT COMMAND STRING + CAIN C,"," ;COMMA TO TERMINATE 1ST INPUT FILE? + TLNN FR,CTYPF ;ANY FILE DESCRIPTOR TYPES? + JRST CTLSER ;NO, ERROR + SKIPN ACDEV ;ASSUME DSK IF NO SPECIFIED DEVICE + MOVSI ACDEV,(SIXBIT /DSK/) + MOVEM ACDEV,INDEV1 + MOVEM ACFILE,INDIR1 ;FIRST INPUT FILE + MOVEM ACEXT,INDIR1+1 ;AND SAVE EXTENSION + MOVE 0,OPN1 ;INIT IN1,1 + MOVE 2,OPN1+1 ;INBUF1 + MOVE 3,OPN1+3 ;ERROR + MOVE 4,OPN1+4 ;JRST CTLSE3 + JRST 0 ;OPEN FILE FILE #1 + +CTLSE3: INBUF IN1,2 ;DO LOOKUP ON FIRST FILE NAME + LOOKUP IN1,INDIR1 + JRST ERRIA ;ERROR RETURN + PUSHJ PP,NAME1 + TLNN FR,CTYPF ;ANY FILE DESCRIPTOR TYPED? + JRST CTLSER ;NO, ERROR + SKIPN ACDEV + MOVSI ACDEV,(SIXBIT /DSK/) ;"DSK" IS DEFAULT + MOVEM ACDEV,INDEV1 + SKIPE ACFILE + MOVEM ACFILE,INDIR1 ;INSERT FILE NAME AND EXTENSION + CAIN ACDEL,"." ;PERIOD MEANS EXPLICIT EXTENSION + MOVEM ACEXT,INDIR1+1 + MOVE 0,OPN2 ;INIT IN2,2 + MOVE 1,INDEV1 + MOVE 2,OPN2+1 + MOVE 3,OPN1+3 + MOVE 4,OPN2+2 + JRST 0 ;OPEN FILE IN REGISTERS. +ERR2A: INBUF IN2,2 ;LOOKUP ON SECOND FILE NAMES + LOOKUP IN2,INDIR1 + JRST ERRIA + MOVSI 0,41000 ;INIT + TLNE FR,40000 + MOVSI 0,41140 ;INIT + MOVE ACDEV,OUTDEV + MOVSI ACFILE,CTOBUF + TLNE FR,40000 + MOVSI 2,OUTBUF ; ADJUST REGISTERS. + MOVE 3,OPN1+2 + MOVE 4,OPN2+3 + JRST 0 ; EXECUTE IN REGISTERS +CTLSE4: MOVE TT,OUTDEV + CALLI TT,4 ;DEVCHR + TLNN TT,1 + JRST ERRO + TLNE TT,40010 ; CHECK IF TTY OR LPT + TLO FR,IOTTY + MOVE T,INDIR1 ; SETUP OUTPUT FILE + SKIPN OUTDIR + MOVEM T,OUTDIR + MOVSI T,(SIXBIT /SCM/) + TLNE FR,40000 + MOVSI T,(SIXBIT /MRG/) + SKIPN OUTDIR+1 + MOVEM T,OUTDIR+1 + MOVE 0,[ENTER CTL,OUTDIR] + TLNE FR,40000 + HRLI 0,(ENTER OUT,) ; ENTER OUTPUT FILE + XCT 0 + JRST ERRO + OUTPUT CTL, + TLNE FR,40000 + OUTPUT 3, + AOS W1,JOBFF + HRRZM W1,LBUFP1 ;SET 1ST ADDRESS FILE 0 + SETZM 0,1(W1) ;FORCE NULLS INTO BUFFER + HRRZM W1,LBUFP2 ;DITTO FILE 2 + MOVE W1,JOBREL + SUB W1,JOBFF ;COMPUTE SPACE AVAILABLE + HRRZS W1 + LSH W1,-1 ;AVAILABLE SPACE/2 + ADDB W1,LBUFP2 ;INPUT POINTER FILE 2 STARTS HALF WAY THROUGH BUFFER + SETZM 1(W1) ;FORCE NULLS INTO BUFFER + HRLOI 0,377777 + MOVEM 0,OLDNUM ;ANY LINE # IS SMALLER THAN + MOVEM 0,OLDNUM+1 ; THIS ONE + SETOB F1,TOP1 ;INITIALIZE TOP OF EACH FILE + SETOB F2,TOP2 ;THE TOP IS THE HIGHEST LINE THAT WE HAVE EXAMINED + PUSHJ PP,GETTWO + JFCL + MOVE W1,LBUFP1 + HRRZ W2,(W1) + MOVSI W1,1(W1) + HRRI W1,HBUF1 + CAIL W2,25 + MOVEI W2,25 + BLT W1,HBUF1(W2) + SETZM HBUF2-1 + MOVE W1,LBUFP2 + HRRZ W2,(W1) + MOVSI W1,1(W1) + HRRI W1,HBUF2 + CAIL W2,25 + MOVEI W2,25 + BLT W1,HBUF2(W2) + SETZM HBUF2+WPL-1 + JRST MAINST ;START COMPARE WITH 1ST LINES + ;THE FOLLOWING CODE IS THE GUTS OF THE PROGRAM. +;WHEN THE LOOP AROUND MAIN DETECTS THAT TWO LINES ARE NOT A MATCH +;CONTROL GOES OFF TO DETERMINE THE EXTENT OF THESE DIFFERENCES. +;THE TOTAL DIFFERENCES ARE DETERMINED AS FOLLOWS. FIRST GET TWO +;MORE LINES. DOES THE ORGINAL LINE IN FILE 1 WHICH DID NOT MATCH +;MATCH THE NEW LINE FROM FILE TWO. IF SO THEN THE ORGINAL LINE +;IN FILE 2 WAS AN INSERTION. (OR A DELETION). IF NO MATCH THIS +;WAY TRY IT THE OTHER WAY. IF STILL NO MATCH GET TWO MORE LINES +;TAKE THE NEW LINE FROM FILE 1 AND TRY TO MATCH IT AGAINST ALL THE +;LINES WE HAVE BEEN EXAMINING IN FILE TWO; THEN DO IT THE OTHER +;WAY AROUND. EOF'S ARE DETECTED BY "GETTWO" WITH NO RETURN SKIP + +MAIN: TRZ FR,-1 ;THIS FOR FILE ONE + SETZM MPP(FR) + PUSHJ PP,MOVEUP ;MOVE UP THE BOTTOM, BECAUSE WE ARE FINISHED + ;WITH TWO LINES + HRRI FR,1 ;NOW FOR FILE TWO + TLNE FR,40000 + SETOM MPP(FR) + PUSHJ PP,MOVEUP ;UP GOESA THE BOTTOM POINTER +MAINST: SETOB F1,F2 ;INITIALIZE LINE POINTERS + PUSHJ PP,GETTWO ;GET TWO LINES + JRST MAIN15 ;ONE FILE SHORT + PUSHJ PP,COMPL ;COMPARE THESE TWO LINES + JRST MAIN ;THEY MATCH--LOOK AT NEXT TWO + +;WHEN WE GET HERE WE HAVE DETECTD A DIFFERENCE +;NOW THE PROGRAM WILL LOOK AHEAD TO TRY AND FIND THE NEXT TWO +;MATCHING LINES + +MAIN10: PUSHJ PP,GETTWO ;GET THE NEXT TWO LINES + JRST MAIN15 ;ONE FILE SHORT + SETZ F1, ;RESET POINTER FOR FIRST FILE TO + ;THE LINE IN WHICH THE DIFFERENCE WAS FOUND + +MAIN12: PUSHJ PP,COMPL ;NOW SEE IF WE CAN MATCH THAT LINE + JSP W1,MULTI ;FOUND 1 LINE MATCH- LOOK FOR MULTIPLE + CAME F1,F2 ;HAVE WE LOOKED FROM THE MISMATCHED LINE + ;TO THE CURRENT LINE? + AOJA F1,MAIN12 ;NO--UP LINE POINTER AND TRY AGAIN + SETZ F2, ;HAVEN'T FOUND A MATCH THIS TIME + ;NOW TRY IT THE OTHER WAY + +MAIN14: CAML F2,F1 ;LOOKED FAR ENOUGH? (THIS VERSION HAS + ;THE INEFFICIENCY MENTIONED IN THE LIBRARY + ;WRITE UP REMOVED- TWE) + JRST MAIN10 ;YES + PUSHJ PP,COMPL + JSP W1,MULTI ;LOOK FOR MULTI LINE MATCH + AOJA F2,MAIN14 ;INDEX AND LOOK SOME MORE + +;THE MAIN15 CODE HANDLES THE CASE OF EITHER (OR BOTH) FILES +;HAVING NO LINES TO COMPARE. IF BOTH FILES HAVE NO LINES, "FINISH" +;PRINTS OUT ALL LINES IN BOTH FILES (IF ANY) AS DIFFERENCES. +;IF EITHER FILE HAS A NEW LINE, THE SHORTER FILE IS +;SEARCHED FOR A MATCH FOR THAT LINE. THIS CONTINUES (READING A NEW LINE +;FROM THE LONGER FILE) UNTIL NEITHER FILE HAS ANY LINES OR UNTIL A +;MATCH IS FOUND. + +MAIN15: SKIPGE W1,GETFIL ;DOES EITHER FILE HAVE A LINE? + JRST FINISH ;NO + HRRZM W1,FIL ;SAVE FILE # THAT HAS LINES + HRR FR,W1 ;SETUP FR FOR MAIN18 + JUMPL F1,MAIN18 ;TRA IF FILE 1 HAS NO LINES + JUMPL F2,MAIN18 ;DITTO FILE 2 + TRC FIL,1 ;CHANGE 1 TO 0 (OR VICE VERSA) + SETOM F1(FIL) ;LOOK THRU SHORT FILE FOR MATCH +MAIN17: MOVE W1,F1(FIL) + CAML W1,TOP(FIL) ;SEARCHED THRU SHORT FILE? + JRST MAIN10 ;YES, AND NO MATCH + AOS F1(FIL) ;INDEX LINE + PUSHJ PP,COMPL ;LOOK FOR A MATCHING LINE + JSP W1,MULTI ;FOUND A MATCH, NOW LOOK FOR MULTIPLE MATCH + JRST MAIN17 ;NO MULTI LINE MATCH + +MAIN18: PUSHJ PP,PNTTXT ;ALL LINES ARE GONE FROM 1 FILE. + ;OUTPUT THE OTHER WITHOUT USING CORE + PUSHJ PP,MULT9 + JRST MAIN + JRST MAIN + +;AT THIS POINT NEITHER FILE HAS ANY MORE LINES TO BE READ. +;PRINT AS DIFFERENCES ANY LINES REMAINING FOR EITHER FILE. + +FINISH: JUMPGE F1,FIN1 ;PRINT DIFFERENCES IF EITHER BUFFER + JUMPL F2,FIN2 ; HAS ANY LINES IN IT +FIN1: PUSHJ PP,PNTBTH ;PRINT ANY LINES +FIN2: MOVEI T,[ASCIZ /NO DIFFERENCES ENCOUNTERED/] + SKIPN 0,ERRCNT ;ANY DIFFERENCES? + PUSHJ PP,TYPMSG ;NO, PRINT MESSAGE + SKIPE 0,ERRCNT + TLNN FR,40000 + JRST CARR1 + MOVEI T,[ASCIZ /END OF MERGE/] + PUSHJ PP,TYPMSG + JRST CARR1 ;END OF SOURCE COMPARE + +;THIS SECTION LOOKS FOR MULTI LINE MATCH + +MULTI: SKIPG NUMLIN ;MULTIPLE LINE TEST? + JRST MULT8 ;NO + HRRZM W1,RTNTMP ;YES, SAVE RETURN ADDRESS + SETZM NUMTMP ;INIT MULTI-LINE COUNTER + MOVEM F1,TEMPF1 ;SAVE CURRENT POINTERS + MOVEM F2,TEMPF2 +MULT2: PUSHJ PP,GETTWO ;GET NEXT TWO LINES + JRST MULT4 ;ONE FILE DOESN'T HAVE A LINE + PUSHJ PP,COMPL ;COMPARE THEM + JRST MULT6 ;MATCH, TEST MULTI COUNTER +MULT4: MOVE F1,TEMPF1 ;NO MATCH, RESET REGS + MOVE F2,TEMPF2 + JRST @RTNTMP ;RETURN TO WHERE WE GOT TO MULTI FROM + +MULT6: AOS W1,NUMTMP ;INDEX MULTI-LINE COUNTER + CAMGE W1,NUMLIN ;TEST FOR END + JRST MULT2 ;TEST NEXT TWO + SUB F1,W1 ;RESET TO 1ST COMPARISON + SUB F2,W1 +MULT8: PUSHJ PP,PNTBTH ;PRINT DIFFERENCES + PUSHJ PP,MULT9 + JRST MULT8A + +;THE TEXT OF DIFFERENCES HAS BEEN PRINTED--PUT IN ****** +;AND A CARRIAGE RETURN-LINE FEED AND GO BACK AND START COMPARING +;WHEN WE START COMPARING AGAIN THE LINE POINTERA WILL +;BE POINTING TO THE FIRST TWO LINES AFTER THE MATCHING LINES + + MOVE W1,[POINT 7,[ASCIZ /***************/]] + PUSHJ PP,PRINT + PUSHJ PP,PCRLF ;PRINT CARRIAGE RETURN-LINE FEED +MULT8A: ADD F1,NUMLIN ;CAUSE MOVEUP TO FLUSH ALL THE + ADD F2,NUMLIN ; LINES THAT WERE JUST MATCHED + JRST MAIN ;DIFFERENCES PRINTED- LOOK FOR MORE +MULT9: TLNN FR,40000 + JRST CPOPJ1 + SUBI F1,1 + SUBI F2,1 + PUSHJ PP,DMP3 +MULT10: PUSHJ PP,GETC + HRRI FR,0 + CAIN C,61 + JRST MULT11 + HRRI FR,NOFORM + CAIE C,62 + JRST MULT12 +MULT11: SETOM MPP(FR) + PUSHJ PP,MOVEUP + SETOM F1(FR) + JRST MULT10 +MULT12: CAIE C,124 + JRST .+6 +MULT13: PUSHJ PP,TTYIN1 + CAIN C,33 + JRST MULT10 + PUSHJ PP,FILEO + JRST MULT13 + CAIE C,0 + HALT .+1 + HRRI FR,0 + SETZM MPP(FR) + SKIPL F1(FR) + PUSHJ PP,MOVEUP + HRRI FR,NOFORM + SETZM MPP(FR) + SKIPL F1(FR) + PUSHJ PP,MOVEUP + ADDI F1,1 + ADDI F2,1 + POPJ PP, + ;THIS ROUTINE SETS UP THE POINTERS TO THE TEXT + +;MEMORY STORAGE AREA LOOKS LIKE THIS: +;1) BUFFER SPACE FOR FILE # 0 (POINTED TO BY LBUFP1) +; A) XWD (PAGE #),(WORD COUNT FOR LINE (INCLUDING THIS WORD)) +; TEXT FOR LINE 0 +; MORE TEXT FOR LINE 0 +; & MORE, ENDED WITH A NULL +; B) MORE LINES (EACH WITH PAGE #,WORD COUNT, AND TEXT +;2) BUFFER SPACE FOR FILE 1 (POINTED TO BY LBUFP2) +; A) AS ABOVE + +SETP: HRRI FR,1 ;SET UP POINTER FILE 1 + PUSHJ PP,SETONE + HRRI FR,0 ;DITTO FILE 0 + +SETONE: MOVE W3,F1(FR) ;GET LINE # +SETON1: MOVE TT,OLDNUM(FR) ;GET LAST # COMPUTED FOR + MOVEM W3,OLDNUM(FR) ;SAVE NEW # AS OLD + CAML W3,TT ;IS NEW LARGER THAN OLD? + SKIPA T,OLDPNT(FR) ;YES, START FROM OLD BYTE POINTER + SKIPA T,LBUFP1(FR) ;NO, START FROM BEGINNING + SUB W3,TT ;LOOP ONLY FROM OLD POINTER + MOVSI TT,(ADD T,(T)) ;(SET UP IN AC) + MOVE TT+2,[JRST SETON2];SET UP AC + MOVE TT+1,.+1 ;SET UP AC + SOJGE W3,TT + ;TT/ ADD T,(T) ;ADD IN WORD COUNT FOR LINE + ;TT+1/ SOJGE W3,.-1 ;MORE LINES LEFT? + ;TT+2/ JRST SETON2 ;NO + +SETON2: HRRZM T,OLDPNT(FR) ;SAVE POINTER TO THIS LINE + HRLI T,700 ;NO, CHANGE TO BYTE POINTER + MOVEM T,1(FR) + POPJ PP, + +;MOVE UP THE POINTERS WHICH POINT TO THE LINES FROM WHICH WE +;ARE EXAMINING. THIS IS DONE EVERYTIME A MATCH IS FOUND + +MOVEUP: SKIPE MPP(FR) + SKIPGE W3,F1(FR) + JRST MOVEY + CAMLE W3,TOP(FR) + MOVE W3,TOP(FR) + HRRZ T,LBUFP1(FR) +MOVE0: MOVEI W1,1(T) + HRLI W1,(POINT 7,,) + ILDB C,W1 + JUMPE C,.+3 + PUSHJ PP,FILEO + JRST .-3 + ADD T,(T) + SOJGE W3,MOVE0 +MOVEY: MOVE W3,F1(FR) ;GET LINE # FOR THIS + CAML W3,TOP(FR) ;GETTING RID OF ALL LINES? + JRST MOVEX ;YES, DON'T MOVE MEMORY + AOS W3,F1(FR) ;GET LINE # OF LINE TO SAVE + PUSHJ PP,SETON1 ;GET ADR OF 1ST LINE TO SAVE + HRL T,LBUFP1(FR) ;SET UP BLT AC (REVERSED) + PUSH PP,T ;SAVE + AOS W3,TOP(FR) ;GET 1ST NON-EXISTANT LINE # + PUSHJ PP,SETON1 ;GET CORRESPONDING 1ST ADR + POP PP,W1 + SUB T,W1 ;CALCULATE WORD COUNT OF TRANSFER + ADD T,LBUFP1(FR) ;CALCULATE "E" OF BLT AC,E + MOVSS 0,W1 ;SWITCH AC TO XWD FROM,TO + BLT W1,(T) ;AND AWAY WE GO + +MOVEX: SETCM W2,F1(FR) ;W2_-<(F1)+1> + ADDM W2,TOP(FR) ;CHANGE TO OP TO ACCOUNT FOR DEAR DEPARTED LINES + HRLOI 0,377777 + MOVEM 0,OLDNUM(FR) ;FORCE SETON1 TO RECALCULATE + POPJ PP, + ;CODE FOR GETTING TWO LINES +;CALLING SEQUENCE IS: +; PUSHJ PP,GETTWO +; RETURN 1 IF EITHER FILE HAS NO MORE LINES +; RETURN 2 IF ONE LINE READ FROM EACH FILE +; C(GETFIL)=THE # OF FILE FOR WHICH A LINE WAS READ (OR -1 IF NONE) + +GETTWO: SETOM GETCNT ;INIT # LINESOBTAINDED + SETOM GETFIL ;INIT FILE # LINE CAME FROM + TRZ FR,-1 ;ZERO RIGHT HALF OF "FR"--SET FOR FIRST FILE + PUSHJ PP,GLINE ;GET A LINE FROM FIRST FILE + HRRI FR,1 ;NOW DO FOR SECOND FILE + PUSHJ PP,GLINE + SKIPLE GETCNT ;GETCNT .G. 0 IF TWO LINES WERE GOT + AOS (PP) ;SKIP IF 2 LINES WERE AVAILABLE + POPJ PP, + +GLINE: TLZ FR,20000 + AOS W1,F1(FR) ;BUMP THE LINE POINTERS + CAMG W1,TOP(FR) ;HAVE WE GONE OVER THE TOP + JRST GLEXIT ;NO, LINE WAS AVAILABLE + SOS F1(FR) ;NOT CLEAR YET THAT A NEW LINE EXISTS +GLINE1: HRLS PAGNUM(FR) ;SAVE PAGE # AT BEGINNING OF LINE + PUSHJ PP,GCHAR ;GET A CHARACTER + TLNE FR,@EOFTBL(FR) ;END OF FILE? + POPJ PP, ;YES, NO LINE + TLNN FR,ALLSW ;SKIP IF COMPARING BLANK LINES + JUMPE C,GLINE1 ;NULLS INDICATE BLANK LINES + AOS W1,F1(FR) ;THERE ARE CHARS FOR A NEW LINE + MOVEM W1,TOP(FR) ;THIS LINE IS THE TOP LINE + PUSHJ PP,SETONE ;CALCUATE BYTE POINTER + MOVE W1,1(FR) ;GET BYTE POINTER IN W1 + MOVEM W1,WCADR ;SAVE ADR OF LINE WORD COUNT + MOVE W2,PAGNUM(FR) ;PICKUP PAGE # AT BEGINNING OF LINE + HLLZM W2,(W1) ;SAVE WITH THIS LINE + JRST GLINE3 + +MLON ;MULTI LINE LITERAL + +GLINE2: PUSHJ PP,GCHAR ;GET NEXT CHAR FOR LINE +GLINE3: TLNN W1,760000 ;WITH NEXT IDPB GO INTO NEXT WORD? + JRST [HRRZ W3,@GLTBL(FR);YES,GET HIGHEST ADR FOR THIS BUFFER + CAIG W3,3(W1) ;CHECK ADR. (LEAVE 1 WORD FOR WORD + ;COUNT FOR NEXT LINE PLUS 1 WORD + ;SLOP TO BE SAVE + JRST NOROOM ;NO ROOM IN THE INN + HLRZM C,1(W1) ;PUT BIT17 INTO BIT35 (FOR SEQUENCE #) + JRST .+1] ;GO INTO MAIN LOOP + IDPB C,W1 ;STORE CHARS IN LINE BUFFER + JUMPN C,GLINE2 ;NULL CHARACTER IS END OF LINE + MOVE W3,WCADR ;GET BACK ADR OF WORD COUNT + SUBI W1,-1(W3) ;CACLULATE WORD COUNT + HRRM W1,(W3) ;SAVE WORD COUNT IN BUFFER +GLEXIT: AOS GETCNT ;INDEX # LINES FOUNT + HRRZM FR,GETFIL ;SAVE # OF THIS FILE + POPJ PP, + +GLTBL: LBUFP2 ;POINTS TO TOP ADR FILE 0 + JOBREL ;POINTS TO TOP ADR FILE 1 + ;IF A "CORE" UUO IS INSTALLED HERE, IT MUST ADJUST THE FOLLOWING +;LIST OF LOCATIONS (ALL BY THE AMOUNT THE SECOND BUFFER AREA +;IS MOVED, IF ANY): +;1) BYTE POINTER ADDRESS IN: W1 +;2) BUFFER POINTER IN: LBUFP2 +;3) 1ST ADDRESS FOR LINE IN: 0(PP) ON PUSH DOWN LIST +;THEN RETURN TO THE IDPB NEAR GLINE2+6 + + +NOROOM: PUSH PP,W1 ;SAVE BYTE POINTER + TRC FR,1 ;CHANGE 1 TO 0 (OR VICE VERSA) + MOVE W3,TOP(FR) ;GET TOP LINE # FOR "OTHER" FILE + ADDI W3,1 ;FIND 1ST ADR OF THE NEXT LINE ABOVE TOP + PUSHJ PP,SETON1 ;GET ADR + HRRZM T,HIGH ;SAVE 1ST FREE ADR OF NON-FULL FILE + HRRZ T,@GLTBL(FR);GET HIGHEST ADR AVAILABLE TO NON-FULL FILE + SUB T,HIGH ;GET SPACE AVAILABLE + SUBI T,2 ;LEAVE 1 WRD FOR NEXT LINE WORD COUNT + ;PLUS 1 WORD SLOP TO BE SAVE + TRC FR,1 ;CHANGE FILE # BACK TO THE WAY IT WAS + MOVEM T,ROOM ;SAVE ROOM AVAILABLE + CAIL T,^D400 ;COMPARE WITH 400. (NO MAGIC SIGNIFICANCE) + JRST NOR2 ;PLENTY ROOM AVAILABLE- DON'T GET MORE CORE + + HRRZ T,JOBREL + MOVEM T,W1 ;SAVE THIS JOBREL AS "OLD" JOBREL + ADDI T,1 ;REQUEST CORE SIZE CONTAINING THIS ADDRESS +NOR1: CALLI T,11 ;CORE UUO + SKIPA T,ROOM ;FAIL + JRST NOR4 ;SUCCESS +NOR11: JUMPG T,NOR2+1 ;ANY CORE LEFT AT ALL? +NORERR: JSP T,ERROUT ;NO, PRINT MESSAGE + ASCIZ /?BUFFER CAPACITY EXCEEDED AND NO CORE AVAILABLE/ + +NOR4: HRRZ T,44 ;CORE UUO SUCCESFUL- GET "NEW" JOBREL + SUB T,W1 ;FIND OUT HOW MUCH WAS ADDED + ADDB T,ROOM ;UPDATE TOTAL ROOM AVAILABLE +NOR3: TRNE FR,1 ;WHICH FILE NEEDS ROOM? + JRST NOR98 ;FILE #1, IT JUST GOT IT + ;FILE #0, SHUFFLE CORE +NOR2: ASH T,-1 ;DIVIDE AVAILABLE SPACE BETWEEN FILES + MOVEM T,ROOM ;FILE #1 GETS MOVED THIS AMOUNT + TRNN FR,1 ;WHICH FILE NEEDED ROOOM? + JRST NOR7 ;FILE #0. MOVE #1 TOWARD 777777 + ;FILE #1. MOVE #1 TOWARD 0 +NOR6: MOVNS T,ROOM ;FIOLE IS MOVING IN NEGATIVE DIRECTION + ADDM T,WCADR ;WORD COUNT ADR FOR FILE# 1 IS MOVED DOWN + ADDM T,(PP) ;SAME WITH BYTE POINTER + MOVE W1,(PP) ;GET LAST ADR TO MOVE FROM BYTE POINTER + ADD T,LBUFP2 ;GET "TO" ADR. [(LBUFP2)-D OF M] + HRL T,LBUFP2 ;GET "FROM" ADR + BLT T,(W1) ;BLT T,"E" (T/ XWD "FROM","TO") + JRST NOR90 + +NOR7: MOVE W1,T ;GET D OF M + HRLI W1,(POP T,(T)) ;SETUP- POP T,(T) INTO W1 + MOVE W2,HIGH ;GET HIGH(+1) ADR OF FILE #1 + SUB W2,LBUFP2 ;GET LENGTH OF FILE #1 + SOS T,HIGH ;GET LAST ADR IN FILE #1 + HRLI T,400000(W2);PUT WORD COUNT(+400000) IN LEFT HALF + ;400000 AVOIDS PDL OVERFLOW PROBLEM IN AC LOOP + MOVE W3,[JRST NOR90] + MOVE W2,.+1 + JUMPL T,W1 ;W1/ POP T,(T) + ;W2/ JUMPL T,W1 + ;W3/ JRST NOR90 +;THE ABOVE INSTRUCTIONS ARE A REVERSE BLT AND ARE IN THE AC'S FOR SPEED + +NOR90: MOVE T,ROOM ;GET DISTANCE FILE #1 WAS MOVED + ADDM T,LBUFP2 ;MODIFY STARTING ADR OF FILE #1 + HRLOI 0,377777 + MOVEM 0,OLDNUM+1 ;FORCE "SETONE" TO RECALCULATE BYTE POINTER +NOR98: POP PP,1 +NOR99: JRST GLINE3 ;CHECK COMPUTATIONS ON RETURNING + + ;THIS PAGE CONTAINS ROUTINE FOR COMPARING TWO LINES +;IT HAS TWO RETURNS--CALLING ADR.+1 IF LINES MATCH OR +;CALLING ADR+2 IF NO MATCH + +COMPL: PUSHJ PP,SETP ;CALCULATE POINTER TO TEXT + MOVEM W1,P1 ;P1=TEMP POINTER TO TEXT FOR FIRST FILE + MOVEM W2,P2 ;P2 FOR SECOND FILE + + MOVEI W3,1 + TDNN W3,1(W1) ;TEST SEQUENCE # BIT + JRST .+3 ;NOT SEQ. # + AOS P1 ;SKIP OVER SEQ. # AND + IBP P1 ;THE TAB + TDNN W3,1(W2) ;SAME THING FOR FILE #2 + JRST .+3 + AOS P2 + IBP P2 + +COMPL1: ILDB W1,P1 ;GET A CHARACTER FROM LINE FROM FIRST FILE +COMPL2: ILDB W2,P2 ;AND ONE FROM SECOND FILE + CAME W1,2 ;THIS IS THE BIG TEST--ARE THEY EQUAL + JRST COMPL4 ;NO +COMPL7: CAIN W1,";" ;YES, COMMENT? + TLNN FR,CSWBIT ;YES, SUPPRESS COMMENTS? + JUMPN W1,COMPL1 ;NO,NO. TEST FOR END OF LINE + POPJ PP, ;LINES MATCH, RETURN + +COMPL3: ILDB W1,P1 ;GET NEW CHAR FOR FILE 1 +COMPL4: CAIE W1,40 ;SPACE? + CAIN W1,TAB ;OR TAB? + TLNN FR,SSWBIT ;AND IS SPACING BEING IGNORED? + SKIPA ;NO + JRST COMPL3 ;FLUSH SPACE OR TAB FOR FILE 1 + + CAIE W2,40 ;SPACE? + CAIN W2,TAB ;OR TAB? + TLNN FR,SSWBIT ;AND IS SPACING BEING IGNORED? + SKIPA ;NO + JRST COMPL2 ;YES, FLUSH A SPACE OR TAB FOR FILE 2 + + CAMN W1,W2 ;ARE THE CHARACTERS NOW THE SAME? + JRST COMPL7 ;YES, TEST FOR END OF LINES + + CAIE W1,";" ;COMMENT IN FILE 1? + CAIN W2,";" ;OR IN FILE 2? + TLNN FR,CSWBIT ;AND ARE COMMENTS BEING IGNORED? + JRST CPOPJ1 ;NO, FILES DON'T MATCH, SKIP RETURN + JUMPE W1,CPOPJ ;YES, OTHER CHAR MUST BE NULL OR ELSE ON + JUMPE W2,CPOPJ ; LINE IS LONGER THAN OTHER AND FILES DIFFER +CPOPJ1: AOS (PP) +CPOPJ: POPJ PP, + ;WHEN WE GET TO THIS POINT WE HAVE FOUND +;THE EXTENT OF THE DIFFERENCES AND WE ARE READY TO PRINT +;THESE DIFFERENCES OUT + +PNTBTH: TRZ FR,-1 ;OUTPUT FILE 1 + PUSHJ PP,PNTTXT ;PRINT FILE 1 DIFFERENCES + MOVE W1,[POINT 7,[ASCIZ /****/]] + PUSHJ PP,PRINT + PUSHJ PP,PCRLF + HRRI FR,1 ;THEN PRINT FILE 2 DIFFERNCES + +;THIS SUBROUTINE PRINTS ALL THE TEXT IN THE +;BUFFER SPECIFIED BY C(FR)R. I. E. FILE 1 OR FILE 2 + +PNTTXT: SETOM TEMP ;START POINTER AT -1 + SETOM PAGEN ;GUARANTEE PAGE # MISMATCH- THERFORE PRINT IT +PNTTX1: AOS W1,TEMP ;INDEX LINE COUNTER + CAMLE W1,F1(FR) ;PRINTED ALL LINES? + POPJ PP, ;YES, RETURN + AOS ERRCNT ;MAKE ERRCNT NON-ZERO + PUSH PP,F1 ;NO, SAVE LINE POINTERS + PUSH PP,F2 + SETZB F1,F2 ;F1=F2=0 + MOVEM W1,F1(FR) ;SET UP EITHER FOR F1 OR F2 + PUSHJ PP,SETONE ;CALCULATE BYTE POINTERS TO TEXT + MOVE W1,W1(FR) ;UNNECESSARY FOR FILE 1- MOVES BYTE PNT FILE 2 + PUSHJ PP,PLINEN ;PRINT: 1) TEXT + TLNN FR,ALLSW + PUSHJ PP,PCRLF + POP PP,F2 + POP PP,F1 ;RESTORE REGS + JRST PNTTX1 ;FINISH OUT ALL LINES + + ;THE FOLLOWING CODE IS USED TO OUTPUT A LINE OF TEXT +PLINEN: MOVEI C,"1"(FR) + PUSHJ PP,PCHART ;PRINT 1 OR 2 + MOVEI C,")" + PUSHJ PP,PCHART ;PRINT ) + HLRZ C,(W1) ;GET PAGE NUMBER OF THIS LINE + CAME C,PAGEN ;IS IT THE SAME AS PREVIOUS LINE? + PUSHJ PP,PGNUM ;PRINT NEW PAGE NUMBER + MOVEI C,TAB ;PRINT TAB + PUSHJ PP,PCHART + +PRINT: ILDB C,W1 ;GET CHARACTER + JUMPN C,.-2 ;LOOP UNTIL A NULL SHOWS UP + POPJ PP, + + +PCRLF: ;THIS CODE OUTPUTS A CARRAIGE RETURN-LINE + ;FEED AND DECREMENTS THE LINE COUNT + + PUSHJ PP,CRLF + SETZM COLCNT + TLNE FR,40000 + POPJ PP, + SOSN LINCNT ;DECREMENT THE LINES/PAGE COUNT + TLO FR,PAGSW ;THIS MEAN WE GET A NEW HEADING + POPJ PP, + +PGNUM: MOVEM C,PAGEN ;SAVE NEW PAGE # AS OLD +PGNUM1: IDIVI C,12 ;STANDARD DECIMAL PRINT ROUTINE + HRLM T,(PP) + SKIPE C + PUSHJ PP,PGNUM1 + HLRZ C,(PP) + ADDI C,"0" + JRST PCHART + ;THIS PAGE CONTAINS ROUTINES FOR CHARACTER OUTPUT + +;CHARACTERS OUTPUTED AS A STRING OF TEXT COME THROUGH HERE + +PCHART: JUMPE C,CPOPJ ;ZERO MEANS A CARRIAGE RETURN + ;IF SO WE ARE THROUGH WITH LINE + AOS T,COLCNT + CAIGE C," " ;A PRINTING CHAR? + JRST PCHAR2 +PCHAR0: TLNE FR,40000 + CAMG T,CCNT + JRST PCHAR + POPJ PP, +PCHAR2: SKIPG CCNT + POPJ PP, + CAIE C,TAB ;OR A TAB? + JRST .+4 + IORI T,7 + MOVEM T,COLCNT + JRST PCHAR0 + CAIE C,CR + JRST .+3 + SETZM COLCNT + JRST PCHAR + CAIE C,LF + JRST .+3 + SOS COLCNT + JRST PCHAR ;YES + MOVSI C,100(C) ;NO, CONTROL CHAR --SAVE + HRRI C,"^" ;THIS IS CONTROL SYMBOL + PUSHJ PP,PCHAR ;OUTPUT THE "^" + MOVSS C ;AND NOW FOR THE LETTER +PCHAR: TLZN FR,PAGSW ;DO WE NEED A NEW HEADING + JRST TYO ;NO--SIMPLE CHARACTER OUTPUT + SETOM LINCNT ;YES +;THIS CODE OUTPUTS A HEADING COMPRISES OF THE TITLE OF +;EACH FILE AFTER "FILE 1)" AND "FILE 2)" + + MOVEM 16,SAVEXS+16 ;SAVE ACCUMULATORS WHILE OUTPUTING HEADING + MOVEI 16,SAVEXS + BLT 16,SAVEXS+15 ;ACCUMULATORS ARE NOW SAVED + TLNE FR,ENDSW ;DON'T BOTHER IF NO ERRORS DETECTED + JRST PCHAR1 + MOVEI C,FF ;FOR NEW PAGE, ISSUE FORM FEED + TLNN FR,NOFORM ;IF 1, SUPPRESS FORM FEED + PUSHJ PP,TYO + MOVE W1,[POINT 7,[ASCIZ /FILE 1) /]] + PUSHJ PP,PRINT + MOVE W1,[POINT 7,HBUF1] + PUSHJ PP,PRINT ;PRINT FILE 1 NAME + PUSHJ PP,PCRLF + MOVE W1,[POINT 7,[ASCIZ /FILE 2) /]] + PUSHJ PP,PRINT + MOVE W1,[POINT 7,HBUF2] + PUSHJ PP,PRINT ;PRINT FILE 2 NAME +PCHAR1: PUSHJ PP,PCRLF ;FOLLOWED BY TWO CARRIAGE RETURNS FINE FEEDS + PUSHJ PP,PCRLF + MOVEI LPP ;RESET LINES/PAGE COUNT + MOVEM LINCNT + MOVSI 16,SAVEXS ;AND RESTORE ACS + BLT 16,15 + MOVE 16,SAVEXS+16 + TLZ FR,NOFORM ;CLEAR SUPPRESS FF FLAG AFTER RESTORING AC'S + JRST TYO ;DON'T FORGET ABOUT THAT ORIGINAL CHARACTER + + ;THE CODE ON THIS PAGE IS FOR HANDLING INPUT ERRORS +;THERE ARE TWO TYPES OF ERRORS--EITHER THE FILE IS NOT FOUND +;OR THE DEVICE IS NOT AVAILABLE--THE FORMAT FOR THESE MESSAGES +;IS THE SAME FORMAT USED FOR THE "TECO" MESSAGES. + + +ERRIA: MOVEI T,[ASCIZ /?INPUT ERROR- /] + PUSHJ PP,TYPMSG ;TYPE FIRST PART OF MESSAGE + MOVE T,INDIR1 ;GET FILE NAME + PUSHJ PP,PNTSIX ;PRINT + HLLZS T,INDIR1+1 ;GET EXTENSION FREED FROM GARBAGE + JUMPE T,NOEXT ;ANY EXTENSION? + MOVEI C,"." ;YES, TYPE DOT + PUSHJ PP,TYO + MOVE T,INDIR1+1 ;GET EXTENION + PUSHJ PP,PNTSIX ;PRINT +NOEXT: MOVEI T,[ASCIZ / FILE NOT FOUND/] ;FINISH MESSAGE + PUSHJ PP,TYPMS2 + JRST CARR ;THIS WILL OUTPUT TWO C.R. AND EXIT + + +ERRA: MOVE T,OUTDEV ;OUTPUT INIT FAIL + MOVEM T,INDEV1 + +ERRI: MOVEI T,[ASCIZ /?DEVICE /] + PUSHJ PP,TYPMSG ;TYPE BEGINING OF MESSAGE + MOVE T,INDEV1 + PUSHJ PP,PNTSIX + MOVEI T,[ASCIZ /: NOT AVAILABLE/] + PUSHJ PP,TYPMS2 ;TYPE REST OF MESSAGE + JRST CARR ;INSERT CARRIAGE RETURNS AND EXIT + +PNTSIX: MOVE TT,[POINT 6,T] ;INIT SIXBIT BYTE POINTER +PNTS1: TLNN TT,770000 ;FINISHED WITH WORD? + POPJ PP, ;YES + ILDB C,TT ;NO, GET CHARACTER + JUMPE C,PNTS1 ;FLUSH SPACES + ADDI C,40 ;CHANGE TO ASCII + PUSHJ PP,TYO + JRST PNTS1 + CRLF: MOVEI C,CR ;OUTPUT A CARRIAGE RETURN-LINE FEED + PUSHJ PP,TYO + MOVEI C,LF ;NOW THE LINE FEED + +TYO: SOSG CTOBUF+2 ;DECREMENT BUFFER COUNT + PUSHJ PP,DMPOUT ;BUFFER WAS FULL + IDPB C,CTOBUF+1 ;DEPOSIT CHAR. + CAIN C,LF ;LINE FEED? + TLNN FR,IOTTY ;WHILE DOING 1 OUTPUT PER LINE + POPJ PP, ;NO +DMPOUT: OUT CTL, ;YES, OUTPUT BUFFER + POPJ PP, ;OK + JSP T,ERROUT + ASCIZ /?OUTPUT DEVICE ERROR/ + +ERRO: JSP T,ERROUT + ASCIZ /?OUTPUT INITIALIZATION ERROR/ +ERRCOR: MOVEI T,[ASCIZ /?2K CORE NEEDED AND NOT AVAILABLE/] + PUSHJ PP,TYPMSG + CALLI 12 ;PRINT MESSAGE AND EXIT + +ERROUT: PUSHJ PP,TYPMSG ;OUTPUT ERROR + JRST CARR ;THROW IN TWO CR AND TRY AGAIN + +FILEO: SOSG OUTBUF+2 + PUSHJ PP,DMPFIL + IDPB C,OUTBUF+1 + POPJ PP, +DMPFIL: OUT 3, + POPJ PP, + JSP T,ERROUT + ASCIZ /?MERGE OUTPUT FILE WRITE ERROR/ +DMP2: MOVEM W1,CCNT +DMP3: MOVEI C,52 + PUSHJ PP,TYO + PUSHJ PP,DMPOUT + MOVE W1,[POINT 7,MPP1] +DMPFL1: MOVEI C,0 + CAIE W1,[POINT 7,MPP2,7] + PUSHJ PP,TTYIN + CAIGE C,40 + MOVEI C,0 + IDPB C,1 + CAIE C,61 + CAIN C,62 + JRST DMPFL1 + CAIN C,124 + JRST DMPFL1 + CAIE C,103 + JRST SAVP + +GETDEC: MOVEI W1,0 + PUSHJ PP,TTYIN + CAIGE C,40 + JRST DMP2 + CAIL C,"0" + CAILE C,"9" + JRST ERRD + IMULI W1,^D10 + ADDI W1,-"0"(C) + JRST GETDEC+1 + +SAVP: MOVE W1,[POINT 7,MPP1] + MOVEM W1,MPPX + JUMPE C,CPOPJ +ERRD: MOVE W1,[POINT 7,[ASCIZ Z?ONLY 1, 2, AND/OR T ARE LEGAL IN MERGE COMMANDS +OR C### TO SET MAX. COL. +Z]] + PUSHJ PP,PRINT + JRST DMP3 +GETC: ILDB C,MPPX + POPJ PP, + ;ROUTINES FOR OUTPUTING ERROR MESSAGES + +TYPMSG: PUSHJ PP,INITTY ;INITALIZE TTY + PUSHJ PP,CRLF ;OUTPUT A CARRIAGE RETURN +TYPMS2: HRLI T,(POINT 7,,) ;THIS IS POINTER FOR ERROR MESSAGE + SKIPA + PUSHJ PP,TYO +TYPMS1: ILDB C,T ;LOAD A CHAR. FROM ERROR MESSAGE + JUMPN C,.-2 ;ALL ERROR MESSAGES END WITH A ZERO + POPJ PP, ;THROUGH WITH ERROR MESSAGE + +CARR: PUSHJ PP,CRLF ;COMMON EXIT FOR ERROR MESSAGES +CARR1: PUSHJ PP,CRLF + + CLOSE CTL, + RELEASE CTL, + RELEASE IN1, + RELEASE IN2, + RELEASE OUT, + JRST COMPGO + +;INITIALIZE TTY FOR ERROR MESSAGES +INITTY: CLOSE CTL, + RELEASE CTL, + INIT CTL,1 + SIXBIT /TTY/ + XWD CTOBUF,CTIBUF + HALT + INBUF CTL,1 + OUTBUF CTL,1 + POPJ PP, + +GCHAR0: TLNE FR,ALLSW + POPJ PP, +GCHAR: TLZN FR,20000 + TLNE FR,@EOFTBL(FR) ;EOF SEEN? + JRST NULL ;YES, RETURN NULL + SOSG @CNTTBL(FR) ;DECREMENT BUFFER COUNT + JSP C,@[EXP GCHAR1,GCHAR2](FR) ;BUFFER EMPTY- DO "INPUT" + SKIPN @CNTTBL(FR) ;DID WE GET ANY DATA + JRST GCHAR ;NO + ILDB C,@BYTTBL(FR) ;YES, GET A CHARACTER + JUMPE C,GCHAR ;GET RID OF NULLS + CAIE C,LF ;LINE FEED? + CAIN C,VT ;NO-VERTICAL TAB? + JRST FORM+1 ;YES, RETURN NULL + CAIN C,CR ;CARRIAGE RETURN? + JRST GCHAR0 ;YES FLUSH + CAIN C,FF ;IS IT A FORM FEED? + JRST FORM ;YES + HRL C,@SEQTBL(FR) ;GET SEQUENCE # BIT (IF IT EXISTS) + TLZ C,777776 ;TURN OFF ALL BUT SEQ. # BIT + POPJ PP, ;NO, RETURN WITH CHAR + +FORM: AOS PAGNUM(FR) ;INDEX PAGE NUMBER + TLO FR,20000 + TLNE FR,ALLSW + POPJ PP, + JRST NULL + +EOF: TLO FR,@EOFTBL(FR) ;SET EOF FLAG +NULL: MOVEI C,0 ;EOF IS A NULL + POPJ PP, + +GCHAR1: INPUT IN1, ;INPUT FOR FILE 1 + STATO IN1,762000 ;ERRORS OR END OF FILE? + JRST (C) ;NO + STATO IN1,742000 ;YES, EOF? + JRST EOF ;YES END OF FILE + JSP T,ERROUT + ASCIZ /?FILE 1 READ ERROR/ + +GCHAR2: INPUT IN2, + STATO IN2,762000 + JRST (C) + STATO IN2,742000 + JRST EOF + JSP T,ERROUT + ASCIZ /?FILE 2 READ ERROR/ + +SEQTBL: Z @INBUF1+1 ;POINTS TO ADR OF LAST CHAR FILE #0 + Z @INBUF2+1 ;DITTO FILE #1 + +BYTTBL: INBUF1+1 ;ADR OF BYTE POINTER FILE #0 + INBUF2+1 ;DITTO FILE #1 + +EOFTBL: EOF1SW ;EOF FLAG FOR FILE 1 + EOF2SW ;EOF FLAG FOR FILE 2 + +CNTTBL: INBUF1+2 ;POINTS TO FILE 1 CHAR COUNT + INBUF2+2 ;DITTO FILE 2 + NAME1: SETZB ACDEV,ACDEL ;ZERO REGISTERS WHICH WILL RETURN THE NAMES + SETZB ACFILE,ACEXT + TLZ FR,CTYPF ;CLEAR COMMAND TYPED FLAG + +NAME3: MOVSI ACPNTR,(POINT 6,0) ;SET POINTER + SETZB TT,0 ;THE SIXBIT NAME WILL BE STORED IN THE AC0 + +GETIOC: PUSHJ PP,TTYIN ;GET INPUT CHARACTER + CAIE C,32 ;AND EOF TERMINATES A FILE NAME + CAIG C,CR ;THIS IS ANOTHER WAY TO GET A FILE NAME + JRST TERM ;CATCHES CR,LF,FF,VT + CAIN C,33 ;ALT MODE? + JRST TERM ;YES + CAIE C,"_" ;ONE KIND OF SEPERATOR + CAIN C,"," ;THIS ALSO MANES WE HAVE FINISHED A TERM + JRST TERM ;TERM HAS BEEN READ + CAIN C,"/" ;IS THERE A SWITCH? + JRST GETSW ;YES + TLO FR,CTYPF ;SET COMMAND TYPED FLAG + CAIN C,":" ;HAVE WE BEEN GETTING A DEVICE NAME + JRST DEVICE ;YES + CAIN C,"." ;OR A FILE NAME + JRST NAME ;YES + TRC C,40 ;CONVERT TO SIXBIT + TLNE ACPNTR,770000 ;HAVE WE STORED SIX BYTES? + IDPB C,ACPNTR ;NO + JRST GETIOC ;GET ANOTHER CHAR. + +TTYIN: PUSHJ PP,TTYIN1 + CAIL C,140 + TRZ C,40 ;CHANGE LOWER CASE TO UPPER CASE + CAIE C," " ;SKIP BLANKS + CAIN C,TAB ;AND TABS + JRST TTYIN + CAIN C,CR + JRST TTYIN + POPJ PP, +TTYIN1: SOSG CTIBUF+2 ;DECREMENT CHARACTER COUNT, ANY LEFT? + INPUT CTL, ;NO, GET A BUFFER FULL + ILDB C,CTIBUF+1 ;GET CHARACTER + JUMPE C,TTYIN1 ;FLUSH NULLS + CAIE C,176 + CAIN C,175 + MOVEI C,33 ;CHANGE ALL ALT MODES TO NEW + POPJ PP, + DEVICE: SKIPA ACDEV,0 ;DEVICE NAME +NAME: MOVE ACFILE,0 ;FILE NAME + MOVE ACDEL,C ;SET DELIMITER + JRST NAME3 ;GET NEXT SYMBOL + +TERM: JUMPE ACDEL,.+3 ;IF NO PREVIOUS DELIMITOR, OR + CAIE ACDEL,":" ;IF PREVIOUS DELIMITER + JRST TERM1 + MOVE ACFILE,0 ;SET FILE +TERM1: CAIE ACDEL,"." ;IF PERIOD, + POPJ PP, + HLLZ ACEXT,0 ;SET EXTENSION + POPJ PP, ;EXIT + +GETSW: PUSHJ PP,TTYIN ;A SWITCH HAS BEEN DETECTED + MOVSI T,SWTBL-SWTBLE ;SET UP NEG. COUNT FOR TABLE SEARCH + CAIE C,@SWTBL(T) ;FOUND CHAR? (INDIRECT=INDEX=0 + AOBJN T,.-1 + JUMPGE T,GETSW1 ;JUMP IF NOTHING FOUND + TDO FR,SWTBL(T) ;TURN ON FLAG (GARBAGE IN RIGHT) + JRST GETIOC ;GET NEXT PART OF COMMAND + +GETSW1: MOVEI C,-"1"(C) ;CHANGE CHAR TO NUMBER + CAILE C,10 + JRST CTLSER ;ERROR IF CHARACTER ISN'T 1-9 + MOVEM C,NUMLIN ;SAVE AS # EXTRA LINES TO MATCH (AFTER 1ST) + JRST GETIOC + +SWTBL: XWD SSWBIT,"S" + XWD CSWBIT+SSWBIT,"C" + XWD ALLSW,"B" + XWD 40000+IOTTY+ALLSW,"M" +SWTBLE: ;END OF TABLE + +OPN1: INIT IN1,1 + INBUF1 + JRST ERRA + JRST ERRI + JRST CTLSE3 +OPN2: INIT IN2,1 + INBUF2 + JRST ERR2A + JRST CTLSE4 + LIT +IFN PURE, ;IMPURE AREA +CCNT: BLOCK 1 +OUTDEV: BLOCK 1 +PPSET: BLOCK LPDL ;PUSH DOWN LIST STORAGE + +CTIBUF: BLOCK 3 +CTOBUF: BLOCK 3 +INBUF1: BLOCK 3 +INBUF2: BLOCK 3 +OUTBUF: BLOCK 3 +ERRCNT: BLOCK 1 ;DIFFERENCES COUNTER (0 MEANS NO DIFFERENCES) + +INDEV1: BLOCK 1 + +INDIR1: BLOCK 4 + +OUTDIR: BLOCK 4 + +TOP: ;CONTAINS # LINES ACTUALLY STORED IN BUFFER FOR: +TOP1: BLOCK 1 ;FILE #1 +TOP2: BLOCK 1 ;FILE #2 + +LBUFP: +LBUFP1: BLOCK 1 ;POINTER TO BEGINNING OF LINE STORAGE FOR FILE #1 +LBUFP2: BLOCK 1 ;DITTO FILE #2 + +P1: BLOCK 1 ;BYTE POINTERS USED BY "COMPL" SUBROUTINE +P2: BLOCK 1 + +HBUF1: BLOCK WPL ;HOLDS HEADER FOR FIRST FILE +HBUF2: BLOCK WPL ;FOR SECOND FILE +PAGNUM: BLOCK 2 ;PAGE NUMBERS FOR THE TWO FILES + ; LH(# AT BEGIN OF LINE), RH(# AFTER LAST CHAR) +PAGEN: BLOCK 1 ;TEMPORARY FOR PAGE #'S IN PLINEN SUBROUTINE +OLDNUM: BLOCK 2 ;LAST LINE # USED IN "SETONE" +OLDPNT: BLOCK 2 ;LAST BYTE POINTER CALCULATED BY "SETONE" +MPP: BLOCK 2 +MPP1: BLOCK 1 +MPP2: BLOCK 1 + BLOCK 1 +MPPX: BLOCK 1 +SAVEXS: BLOCK 17 ;STORAGE FOR AC'S WHEN PRINTING PAGE HEADERS + +TEMP: BLOCK 1 +LINCNT: BLOCK 1 +COLCNT: BLOCK 1 +RTNTMP: BLOCK 1 ;RETURN ADDRESS FOR "MULTI" SUBROUTINE +WCADR: BLOCK 1 ;TEMP IN GLINE SUBROUTINE +HIGH: BLOCK 1 ;USED BY NOROOM +ROOM: BLOCK 1 ;USED BY "NOROOM" +GETCNT: BLOCK 1 ;# LINES (-1) "GETTWO" GOT +GETFIL: BLOCK 1 ;# OF FILE FROM WHICH "GETTWO" GOT LINE (.L. 0 IF NONE) +NUMLIN: BLOCK 1 ;# LINES FOR A MATCH +NUMTMP: BLOCK 1 ;TEMP FOR NUMLIN +TEMPF1: BLOCK 1 ;TEMP FOR F1 +TEMPF2: BLOCK 1 ;TEMP FOR F2 + +ENDP: + +END COMPGO + -- 1.7.1