--- /dev/null
+TITLE MUDCOM -- MUDDLE SRCCOM (MARC)
+
+.SYMTAB 8001.
+
+O=0
+F=0
+A=1
+B=2
+C=3
+D=4
+E=5
+X=6
+
+ENTPTR=10
+MANPTR=11
+CMNPTR=12
+COMPTR=13
+
+CH=14
+TMAX=16
+
+P=17 ;CANONICAL DM STACK LOCATION
+
+
+IF1,[ITS==0
+ PRINTC /MUDCOM for ITS? (Y OR N)/
+ .TTYMAC A
+ IFSE A,Y,[ITS==1]
+ TERMIN
+]
+IF1,[
+ IFE ITS,[
+ .TNXDF
+ .DECSAV
+]]
+
+
+
+IFN ITS,[
+LOC 77
+]
+IFE ITS,[
+LOC 140
+]
+JCLTOP: ASCII / /
+JCL: BLOCK 100.
+JNAME: BLOCK 2
+JFNBLK: BLOCK 1000.
+TIMBLK: BLOCK 3
+NBNBLK: BLOCK 25.
+GCSTOP: JFNBLK
+JCLINB: BLOCK 250.
+PDL: BLOCK 30.
+CPDL: BLOCK 100.
+INPBLK: BLOCK 500.
+SYLBUF: BLOCK 10.
+FTABLE: BLOCK 1200.
+PAKBUF: BLOCK 3
+ENTBUF: BLOCK 900.
+COMBUF: BLOCK 400.
+RNDTBL: BLOCK 800.
+MANBUF: BLOCK 800.
+CMNBUF: BLOCK 400.
+DIRPAG: BLOCK 1024.
+PATCH: BLOCK 20.
+
+VERSIO: .FVERS
+BLKEND: 0
+JFN: 0
+F1JFN: 0
+F2JFN: 0
+F1BLK: 0
+F2BLK: 0
+F1PTR: 0
+F2PTR: 0
+FBLOCK: 0
+DSKJFN: 0
+XTABLE: 0
+CMNMAX: -1
+CMNFLG: 0
+MANFLG: 0
+JCLPTR: 0
+
+; FILE NAME DEFINITIONS
+
+UFN1==0
+UFN2==1
+UNDATE==3
+LUNBLK==5
+
+; CHANNEL DEFINITIONS
+
+DSK1==0
+DSK2==1
+TYOC==2
+DSKI==3
+
+; TYPE CODES
+
+DEFMAC==1
+SETG==2
+MSETG==3
+ENTRY==7
+PACKAGE==10
+ENDPACKAGE==11
+RPACKAGE==12
+MANIFEST==13
+
+; FTABLE RECORDS
+
+RECLEN==3
+
+; ERROR CODES
+
+ESELF==1 ; SELF COMPARISON
+EILLCH==2 ; ILLEGAL CHARACTER IN FILE NAME
+ESYNER==3 ; SYNTAX ERROR
+EOPNFL==4 ; OPEN FAILED
+EINTER==5 ; INTERNAL BUG IN MUDCOM
+ENDIFF==6 ; NO DIFFERENCES
+ENSIM==7 ; NO SIMILARITIES
+
+; SEPARATORS
+
+LF==12
+FF==14
+CR==15
+TAB==11
+
+; TYPE CODES FOR MACRO/MANIFEST HACKS
+
+MACPAD==0
+NMNPAD==1
+CMNPAD==2
+XXXXXX==3 ;DON'T USE THIS!
+ASKPAD==4
+
+; TYPE TABLE
+
+GTYPE: ASCIZ /DEFINE/
+ ASCIZ /DEFMAC/
+ ASCIZ /SETG/
+ 0
+ ASCIZ /MSETG/
+ ASCIZ /TITLE/
+ ASCIZ /SUB-ENTRY/
+ ASCIZ /SET/
+ 0
+ ASCIZ /ENTRY/
+ ASCIZ /PACKAGE/
+ ASCIZ /ENDPACKAG/
+ ASCIZ /RPACKAGE/
+ ASCIZ /MANIFEST/
+
+PTYPE: ASCIZ /FUNCTION/
+ ASCIZ /MACRO/
+ ASCIZ /GVAL/
+ 0
+ ASCIZ /MSETG/
+ ASCIZ /CRUFTY/
+ ASCIZ /CRUFTY/
+ ASCIZ /LVAL/
+ 0
+PGTYPE: ASCIZ /FOOBAR/
+ ASCIZ /FOOBAR/
+ ASCIZ /FOOBAR/
+ ASCIZ /FOOBAR/
+ ASCIZ /FOOBAR/
+
+NUMTYP==<<PGTYPE-PTYPE>/2>
+ ; NUMBER OF OBJECT TYPES INTERESTED IN
+MAXTYP==<.-GTYPE>
+ ; MUST BE DEFINED BEFORE USED
+MXGTYP==5
+
+TBLTOP: RNDTBL
+NAME: 0
+FNBLKI:
+FNAME1: 0
+ 0
+FNAME2: SIXBIT />-1/
+ SIXBIT />/
+SNAME: 0
+ 0
+DEVICE: SIXBIT /DSK/
+FNBLKO: 0
+
+HPOS: 0
+
+SAVBLK: 0
+ 0
+ SIXBIT />-1/
+ SIXBIT />/
+ 0
+ 0
+ SIXBIT /DSK/
+ 0
+
+CHGTOT: BLOCK NUMTYP
+NEWTOT: BLOCK NUMTYP
+REMTOT: BLOCK NUMTYP
+SAMTOT: BLOCK NUMTYP
+
+ZSTART:
+P2SW: 0
+P3SW: 0
+BIGLOS: 0 ; -1 IF ANY SIMILARITIES ENCOUNTERED
+SMALOS: 0 ; -1 IF ANY DIFFERENCES ENCOUNTERED
+
+PRELOD: 0
+
+LSTPTR: 0
+LSTTYP: 0
+
+CURCHN: 0
+
+DEPTH: 0
+
+WINNER: 0
+SPACSW: 0
+
+CHKSW: 0
+
+COMCNT: 0
+PAKSW: 0
+RPAKSW: 0
+MQUOTE: 0
+MMACRO: 0
+SKIPPR: 0
+
+TOTSW: 0
+GETSW: 0
+STRSW: 0
+QUOTSW: 0
+ENDSW: 0
+EXCLSW: 0
+
+ENDFLG: 0
+ZFINIS:
+LSTFLG: 0
+
+
+COMSW: 0
+ACCPTR: -1
+ACCSAV: 0
+
+DEFINE HALT
+IFN ITS,[
+ .BREAK 16,140000
+]
+IFE ITS,[
+ JRST XHALT
+]
+TERMIN
+
+DEFINE DBP X ;DECREMENT BYTE POINTER
+ ADD X,[070000,,0]
+ JUMPGE X,.+3
+ SOS X
+ HRLI X,010700
+TERMIN
+
+DEFINE SAFEIN AC,
+ PUSH P,A
+ MOVE AC,ACCPTR
+ MOVEM AC,ACCSAV
+TERMIN
+
+DEFINE SAFEOUT AC,
+ MOVE AC,ACCSAV
+ CAMN AC,ACCPTR
+ JRST .+3
+ PUSHJ P,LSTBLK
+ JRST .-3
+ POP P,A
+TERMIN
+
+DEFINE NXTCHR X
+ IBP A
+ HRRZ A
+ CAML BLKEND
+ PUSHJ P,NXTBLK
+ LDB X,A
+ JUMPL X,EOFERR
+TERMIN
+
+DEFINE COMCHR CHR
+ MOVEI CHR
+ IDPB COMPTR
+ AOS COMCNT
+TERMIN
+
+DEFINE COMAC AC,
+ IDPB AC,COMPTR
+ AOS COMCNT
+TERMIN
+
+DEFINE CHRADD INST,CHR
+ZZZ==.
+ LOC CHRTBL+CHR
+ JRST INST
+LOC ZZZ
+TERMIN
+
+\f
+SUBTTL CHARACTER TABLE
+
+CHRTBL: REPEAT 200,JFCL
+
+CHRADD PAD,40
+CHRADD PAD,TAB
+CHRADD PAD,CR
+CHRADD PAD,LF
+CHRADD PAD,FF
+CHRADD PUSHER,"<
+CHRADD PUSHER,"(
+CHRADD PUSHER,"[
+CHRADD PUSHER,"{
+CHRADD POPPER,")
+CHRADD POPPER,"}
+CHRADD POPPER,"]
+CHRADD POPPER,">
+
+;START OF MUDCOM CODE
+
+IFN ITS,[
+START: CAIA
+ JRST COMBAT
+ .CALL TTYOPN
+ .VALUE
+ .BREAK 12,[5,,JCL]
+STARTX: .SUSET [.RSNAME,,A]
+ MOVEM A,SNAME ;DEFAULT THE SNAMES
+ MOVE P,[-30,,PDL-1]
+ .SUSET [.RJNAME,,B]
+ PUSHJ P,JNMCHK
+ MOVE MANPTR,[440700,,MANBUF]
+ MOVE CMNPTR,[440700,,CMNBUF]
+ SKIPA E,[440700,,JCLTOP]
+STARTC: MOVE E,JCLPTR
+ SKIPE FROBSW
+ JRST FROBCN
+ MOVE ENTPTR,[440700,,ENTBUF]
+ MOVE COMPTR,[440700,,COMBUF]
+ SETZ D,
+ PUSHJ P,FPARSS ;GET FIRST NAME
+ PUSH P,E
+ PUSHJ P,FPHACK ;HACK THE NAME
+ POP P,E
+ .CALL DSKOPN ;OPEN A CHANNEL
+ JRST OPNFL
+ .CALL RCHST ;GET REAL FILE NAMES
+ .LOSE 1000
+ SKIPE CHKSW
+ JRST START1
+ SKIPE LSTFLG
+ JRST STARTL
+ MOVEI D,1
+ SKIPN ENDBRK
+ PUSHJ P,FPARSS ;GET SECOND NAME
+ MOVEM E,JCLPTR
+ SKIPN FNAME1(D) ;DEFAULT FNAME1 IF NECESSARY
+ JRST [MOVE A,FNAME1
+ MOVEM A,FNAME1(D)
+ JRST .+1]
+ SKIPN SNAME(D) ;DEFAULT SNAME TO FIRST FILE SNAME
+ JRST [MOVE A,SNAME
+ MOVEM A,SNAME(D)
+ JRST .+1]
+ SKIPN DEVICE(D)
+ JRST [MOVE A,DEVICE
+ MOVEM A,DEVICE(D)
+ JRST .+1]
+ PUSHJ P,FPHACK ;HACK THE NAME
+ .CALL DSKOPN ;OPEN A CHANNEL
+ JRST OPNFL
+ .CALL RCHST ;GET REAL FILE NAMES
+ .LOSE 1000
+ MOVE A,FNAME1 ;SEE IF FIRST NAME IS SECOND NAME
+ CAME A,FNAME1+1
+ JRST START0
+ MOVE A,FNAME2
+ CAME A,FNAME2+1
+ JRST START0
+ MOVE A,SNAME
+ CAME A,SNAME+1
+ JRST START0
+ MOVE A,DEVICE
+ CAME A,DEVICE+1
+ JRST START0
+
+ SETZ D, ;SELF COMPARISON???
+ OASC [ASCIZ /Asked to compare /]
+ PUSHJ P,PFNAME
+ OASCR [ASCIZ / with itself?/]
+ MOVEI B,ESELF
+ JRST LOST
+
+]
+STARTL: OASC [ASCIZ /Listing /]
+ CAIA
+START1: OASC [ASCIZ /Checking /]
+ PUSHJ P,PFNAME
+ OASCR [ASCIZ /./]
+ JRST START2
+
+IFE ITS,[
+START: CAIA
+ SETOM COMSW
+ MOVE P,[-30,,PDL-1]
+ MOVE MANPTR,[440700,,MANBUF]
+ MOVE CMNPTR,[440700,,CMNBUF]
+ MOVE ENTPTR,[440700,,ENTBUF]
+ MOVE COMPTR,[440700,,COMBUF]
+ SETO A,
+ MOVE B,[-1,,E]
+ MOVEI C,.JISNM
+ GETJI
+ JFCL
+ MOVE B,E
+ PUSHJ P,JNMCHK
+; IF SNAME IS 0, WILL USE CONNECTED DIRECTORY...
+; MOVEI A,15. ; GET A BLOCK FOR SNAME
+; PUSHJ P,IBLOCK ; IN A
+; PUSH P,A
+; GJINF
+; HLL B,A
+; HRRO A,(P)
+; DIRST ; HERE IT IS
+; JFCL
+; POP P,A
+ SETZM XSNAME' ; GET POINTER TO ASCII SNAME
+ SETZ A,
+ RSCAN
+ JFCL
+ JUMPE A,TTYJCL
+ MOVN C,A
+ MOVEI A,.PRIIN
+ MOVE B,[440700,,JCL]
+ SIN ; READ JCL
+ MOVE A,[440700,,JCL] ; INTO JCL BLOCK
+ ILDB B,A ; PARSE IT
+ JUMPE B,TTYJCL
+ CAIE B,40 ; FIRST FLUSH LEADING 'MUDCOM '
+ JRST .-3
+ MOVEM A,F1PTR ; SAVE POINTER TO FIRST FILE NAME
+STT1: ILDB B,A
+ JUMPE B,TTYJCL ; FUNNY HACK NOW FOR TTY FNM READING
+ CAIN B,"/
+ PUSHJ P,XSWTCH
+ SKIPN CHKSW
+ SKIPE LSTFLG
+ JRST STT2
+ CAIE B,", ; FIND SEPARATOR
+ JRST STT1
+ MOVEI B,0
+ DPB B,A
+ MOVEM A,F2PTR ; AND POINTER TO SECOND FILE NAME
+STT2: MOVEI A,GTJFN1
+ MOVE B,F1PTR
+ MOVEM B,FPTR'
+ SKIPE C,XSNAME
+ HRROM C,GTJFN1+.GJDIR ; DEFAULT THE SNAME
+ MOVE C,[-1,,[ASCIZ /MUD/]]
+ MOVEM C,GTJFN1+.GJEXT ; AND MUD AS SECOND FILE NAME
+ MOVSI C,(GJ%OLD)
+ MOVEM C,GTJFN1+.GJGEN
+ GTJFN ; GET THE JFN
+ JRST JOPNFL ; THIS FILE DOESN'T EXIST -> LOSE
+ MOVEM A,F1JFN ; SAVE THE JFN
+ MOVEM A,JFN
+ MOVE B,[440000,,OF%RD]
+ OPENF ; OPEN THE FILE
+ JRST JOPNFL ; WHY? IF GTJFN WON???
+ MOVEI A,F1BLK
+ MOVEM A,FBLOCK
+ PUSHJ P,XJFNS ; PARSE THE NAME AND PUT POINTER IN F1BLK
+ SKIPE CHKSW ; FUNNYNESS WITH MUDCHK AND MUDLST
+ JRST START1
+ SKIPE LSTFLG
+ JRST STARTL
+ PUSHJ P,F1DEF ; FILL DEFAULTS
+ MOVEI A,GTJFN1
+ MOVE B,F2PTR ; NOW DO GTJFN, USING DEFAULTS AND JCL
+ MOVEM B,FPTR
+ MOVSI C,(GJ%OLD)
+ MOVEM C,GTJFN1+.GJGEN
+ GTJFN
+ JRST JOPNFL ; FILE DOESN'T EXIST
+STT3: MOVEM A,F2JFN ; SAVE JFN HERE ALSO
+ MOVEM A,JFN
+ MOVE B,[440000,,OF%RD]
+ OPENF ; OPEN THE FILE
+ JRST JOPNFL ; WHY?
+ MOVEI A,F2BLK
+ MOVEM A,FBLOCK
+ PUSHJ P,XJFNS ; PARSE THE FILE NAME AND SAVE IN F2BLK
+ MOVE A,F2BLK
+ MOVE B,3(A) ; GET FILE NAME 2
+ MOVE B,(B) ; INTO AC
+ CAME B,[ASCIZ /MSUBR/]
+ CAMN B,[ASCIZ /TEMP/]
+ JRST FOONM2
+ CAME B,[ASCIZ /MIMA/]
+ CAMN B,[ASCIZ /NBIN/] ; IS THIS NBIN??
+ JRST FOONM2
+ JRST START0 ; START THE BALL ROLLING....
+
+;here to find a MUD older than the file given as second file
+FOONM2: MOVE A,F2JFN
+ MOVEI B,TIMBLK
+ MOVEI C,2
+ RFTAD ; SAVE CREATION DATE, ETC.
+ MOVE A,TIMBLK+.RSCRV
+ MOVEM A,NBNTIM'
+ PUSHJ P,F1DEF
+ MOVSI A,(GJ%OLD+GJ%IFG)
+ HRRI A,-3
+ MOVEM A,GTJFN1 ; MAKE IT FOO.BAR.*
+ MOVEI A,GTJFN1
+ SETZ B,
+ GTJFN ; GET INDEXABLE POINTER
+ HALT
+ MOVEM A,JFN ; AND SAVE THIS
+ SETZ D,
+JFNLP: HRRZS A ; FLUSH BITS
+ MOVEI B,TIMBLK
+ MOVEI C,2
+ RFTAD
+ MOVE B,TIMBLK+.RSCRV
+ CAMG B,NBNTIM
+ CAMGE B,BSTTIM'
+ JRST NXTJFN
+ MOVEM B,BSTTIM
+ SETZM NBNBLK
+ MOVE B,[NBNBLK,,NBNBLK+1]
+ BLT B,NBNBLK+24.
+ MOVE B,A
+ HRROI A,NBNBLK
+ SETZ C,
+ JFNS
+NXTJFN: MOVE A,JFN
+ GNJFN
+ CAIA
+ JRST JFNLP
+
+ SKIPN BSTTIM
+ JRST NBNLOS
+ MOVSI A,(GJ%OLD+GJ%SHT)
+ HRROI B,NBNBLK
+ GTJFN
+ HALT ; WENT AWAY?
+ MOVEM A,F2JFN
+ MOVEM A,JFN
+ MOVE B,[440000,,OF%RD]
+ OPENF
+ HALT ; WHY?
+ MOVEI A,F2BLK
+ MOVEM A,FBLOCK
+ PUSHJ P,XJFNS ; PARSE THE FILE NAME AND SAVE IN F2BLK
+ JRST START0
+
+; FILL DEFAULTS INTO GTJFN BLOCK FROM FILE NAME 1
+
+F1DEF: MOVEI B,GTJFN1+.GJDEV
+F1DEF1: MOVE A,F1BLK
+ HRLI A,-5
+ HRRO C,(A)
+ MOVEM C,(B)
+ AOJ B,
+ AOBJN A,.-3 ; FILL IN NEW DEFAULTS FROM FILE NAME 1
+ POPJ P,
+
+XJFNS: MOVE E,[-5,,JFNSBT] ; AOBJN FOR JFNS'ING
+ MOVEI A,6
+ PUSHJ P,IBLOCK
+ MOVEM A,@FBLOCK
+ MOVE X,A
+ SETZ D, ; D IS ALWAYS 0 FOR JFNS
+XASKF1: MOVEI A,15.
+ PUSHJ P,IBLOCK
+ HRLI A,15.
+ MOVEM A,(X)
+ HRROS A ; POINTER TO STRING
+ MOVE B,JFN ; JFN
+ MOVE C,(E) ; CORRECT BIT FOR PARSING ONE FIELD
+ JFNS ; PARSE THE NAME
+ AOJ X,
+ AOBJN E,XASKF1 ; UPDATE POINTERS
+ POPJ P,
+
+JFNSBT: JS%DEV
+ JS%DIR
+ JS%NAM
+ JS%TYP
+ JS%GEN
+
+JOPNFL: OASC [ASCIZ /File not found - /]
+ MOVE A,FPTR
+ OBPTR A
+ HALT
+
+JCLLOS: OASCR [ASCIZ /ERROR - JCL terminated abruptly./]
+ HALT
+
+GTJFN1: GJ%OLD
+ .NULIO,,.NULIO
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+
+
+NOJCL: OASCR [ASCIZ /ERROR - JCL must be supplied./]
+ HALT
+
+; HERE TO READ STUFF FROM TTY INSTEAD OF JCL LINE
+; MOST OF CODE ABSTRACTED FROM START UP PORTION
+
+TTYJCL: OASC [ASCIZ /MUDCOM./]
+ ODEC VERSIO
+ OASCR [0]
+TTYJ0: SKIPE C,XSNAME
+ HRROM C,GTJFN2+.GJDIR
+ MOVE C,[-1,,[ASCIZ /MUD/]]
+ MOVEM C,GTJFN2+.GJEXT
+ MOVEI A,GTJFN2
+ SETZ B,
+ MOVEI D,.
+ MOVEM D,GTACT'
+ HRROI C,[ASCIZ /Compare (FILE) /]
+ MOVEM C,GTJFN2+.GJRTY
+ OASC (C)
+ MOVSI D,(GJ%CFM)
+ ANDCAM D,GTJFN2+.GJGEN
+ GTJFN
+ JRST TTYJ1
+ MOVEM A,JFN
+ MOVEM A,F1JFN
+ MOVE B,[440000,,OF%RD]
+ OPENF
+ HALT
+ MOVEI A,F1BLK
+ MOVEM A,FBLOCK
+ PUSHJ P,XJFNS
+ MOVEI B,GTJFN2+.GJDEV
+ PUSHJ P,F1DEF1
+ MOVEI D,.
+ MOVEM D,GTACT
+ HRROI C,[ASCIZ / with (FILE) /]
+ MOVEM C,GTJFN2+.GJRTY
+ OASC (C)
+ MOVSI D,(GJ%CFM)
+ IORM D,GTJFN2+.GJGEN
+ MOVEI A,GTJFN2
+ SETZ B,
+ GTJFN
+ JRST TTYJ1
+ JRST STT3
+
+TTYJ1: CAIN A,GJFX34 ; ? TYPED
+ JRST TTYHLP
+ CAIN A,GJFX37 ; NULL BUFFER
+ JRST TTYNUL
+ OASC [ASCIZ / ERROR - /]
+ MOVEI A,.PRIOU
+ MOVE B,[SETZ -1]
+ SETZ C,
+ ERSTR
+ JFCL
+ JFCL
+ OASCR [0]
+ JRST TTYJ0
+
+TTYHLP: OASCR [0]
+ OASCR [ASCIZ /Type in a file name./]
+ JRST @GTACT
+
+TTYNUL: OASCR [0]
+ OASCR [ASCIZ /Flushed?/]
+ JRST TTYJ0
+
+GTJFN2: GJ%OLD
+ .PRIIN,,.PRIOU
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ G1%RND+<20000,,0>+3
+ 0
+ 0
+ 0
+
+XSWTCH: ILDB B,A
+ CAIL B,"a
+ SUBI B,40 ; UPPER CASE
+ CAIN B,"T
+ JRST [SETOM TOTSW
+ JRST XSW1]
+ CAIN B,"C
+ JRST [SETOM CHKSW
+ JRST XSW1]
+ CAIN B,"M
+ JRST [SETOM MANFLG
+ JRST XSW1]
+ CAIN B,"L
+ JRST [SETOM LSTFLG
+ JRST XSW1]
+ OASC [ASCIZ /Illegal switch in JCL - /]
+ OASCI (B)
+ OASCR [ASCIZ /./]
+ POPJ P,
+
+XSW1: ILDB B,A
+ JUMPE B,JCLLOS
+ CAIN B,40
+ JRST XSW1
+ DBP A
+ MOVEM A,F1PTR
+ POPJ P,
+]
+
+JNMCHK: CAMN B,[SIXBIT /MUDCHK/]
+ JRST [SETOM CHKSW
+IFN ITS,[
+ MOVE A,[SIXBIT />/]
+ MOVEM A,FNAME2
+]
+ JRST .+1]
+ CAMN B,[SIXBIT /MUDLST/]
+ JRST [SETOM LSTFLG
+IFN ITS,[
+ MOVE A,[SIXBIT />/]
+ MOVEM A,FNAME2
+]
+ JRST .+1]
+ CAMN B,[SIXBIT /MUDFND/]
+ JRST [MOVE A,[440700,,JCLTOP]
+ MOVEI B,"(
+ IDPB B,A
+ SETOM FNDFLG'
+ JRST .+1]
+ POPJ P,
+
+START0: SETZ D, ;PRINT TITLE LINES
+ MOVEI A,[ASCIZ /Comparison of /]
+ SKIPE PRELOD
+ MOVEI A,[ASCIZ /Preload comparison of /]
+ SKIPN COMSW
+ OASC (A)
+ PUSHJ P,PFNAME
+ OASC [ASCIZ / and /]
+ MOVEI D,1
+ PUSHJ P,PFNAME
+ OASCR [ASCIZ /./]
+START2: MOVEI A,DSK1
+ MOVEM A,CURCHN
+ MOVE A,[10700,,BLKEND-1]
+
+;FIRST PHASE OF COMPARISON, READING IN FIRST FILE
+
+IFE ITS,[
+ MOVE A,F1JFN
+ MOVEM A,DSKJFN
+]
+PASS1: PUSHJ P,GETSUM
+ JRST PASS02
+ SKIPE WINNER
+ JRST [MOVEM B,FTABLE(TMAX)
+ AOJA TMAX,PASS1]
+ JRST PASS1
+
+\f
+;SECOND PHASE OF THE COMPARISON, READING SECOND FILE
+
+PASS02:
+IFE ITS,[
+ MOVE A,F2JFN
+ MOVEM A,DSKJFN
+]
+ SKIPE FROBSW
+ JRST CONTI1
+ SKIPE CHKSW
+ JRST CHKWIN
+ SKIPE LSTFLG
+ JRST LSTWIN
+; SKIPN MANFLG ; TAA 5/5/78 SEEMED TO DIE OTHERWISE: IF
+; .CLOSE DSK1, ; CHANGED MANIFEST, WENT TO PASS3 REGARDLESS OF MANFLG
+ MOVEI A,DSK2
+ MOVEM A,CURCHN
+ SETOM P2SW
+ PUSHJ P,CLFLAG
+ PUSHJ P,NXTBLK
+ HRLI A,440700
+
+PASS2: PUSHJ P,GETSUM
+ JRST PASS3
+ SKIPN WINNER
+ JRST PASS2
+ PUSH P,A
+ PUSH P,B
+ MOVE A,[440700,,SYLBUF] ;BUFFER IN A
+ MOVE B,LSTTYP ;TYPE IN B
+ PUSHJ P,MATCH
+ JRST [PUSHJ P,NEWOBJ
+ JRST P2ENDR]
+ SETOM BIGLOS
+ CAME A,(P) ;CHECKSUM IS IN A. ACCESS POINTER IN B. TYPE IN C
+ JRST [PUSHJ P,CHGOBJ
+ JRST P2ENDR]
+ AOSA SAMTOT(C)
+
+P2ENDR: OASCR [0]
+P2END: POP P,B
+ POP P,A
+ JRST PASS2
+
+\f
+;ROUTINES TO PRINT AND RECORD CHANGES
+
+REMOBJ: HLRZ C,-1(A)
+ SETOM SMALOS
+ AOS REMTOT(C)
+ OASC [ASCIZ /Removed /]
+ PUSHJ P,TYPPRT
+ MOVE B,-1(A)
+ OASCR (B)
+ JRST P3END
+
+CHGOBJ: OASC [ASCIZ /Changed /]
+ AOS CHGTOT(C)
+ CAIN C,DEFMAC
+ PUSHJ P,MACHAK
+ CAIN C,SETG
+ JRST [SKIPE MANFLG
+ PUSHJ P,MANCHK
+ JRST .+1]
+ CAIG C,1 ;MAKE FUNCTIONS AND MACROS WIN
+ SKIPN COMSW
+ JRST NEWOB1
+ PUSH P,A
+ PUSH P,B
+ PUSH P,C
+ MOVE F,[440700,,SYLBUF]
+GH1: ILDB A,F
+ JUMPE A,GH2
+ COMAC A,
+ JRST GH1
+
+GH2: SKIPN PAKSW
+ JRST GH3
+ PUSHJ P,ENTLKP
+ JRST ADDTR
+ SKIPN RPAKSW
+ JRST GH3
+ COMCHR "!
+ COMCHR "-
+GH3: COMCHR 40
+ POP P,C
+ POP P,B
+ POP P,A
+ JRST NEWOB1
+
+ADDTR: COMCHR "!
+ COMCHR "-
+ MOVE A,[440700,,PAKBUF]
+ADDTR1: ILDB B,A
+ JUMPE B,GH3
+ COMAC B,
+ JRST ADDTR1
+
+NEWOBJ: OASC [ASCIZ /New /]
+ AOS NEWTOT(C)
+NEWOB1: SKIPE CMNFLG
+ OASC [ASCIZ /MANIFEST /]
+ SETZM CMNFLG
+ PUSHJ P,TYPPRT
+ OASC SYLBUF
+ SETOM SMALOS
+ POPJ P,
+
+\f
+;THIRD GROSS PASS, FOR MANIFEST AND MACRO HACK
+
+PASS3: SETOM P3SW
+ SKIPL CMNMAX ; ONLY IF ONE CHANGED
+ SKIPL MANFLG ; BETTER BE LOOKING 7/8/78 (MARC)
+ JRST PASS4
+ SETZM ENDFLG
+ MOVEI A,DSK1
+ MOVEM A,CURCHN
+IFN ITS,[
+ .ACCESS DSK1,[0]
+]
+IFE ITS,[
+ MOVE A,F1JFN
+ SETZ B,
+ SFPTR
+ HALT ; WHY CAN'T ACCESS?
+]
+ MOVE A,[10700,,BLKEND-1]
+ PUSHJ P,ATOM
+ JRST PASS4
+ JRST .-2
+
+;FOURTH PASS, FOR REMOVED OBJECTS
+
+PASS4: MOVEI A,FTABLE+1
+ MOVE B,(A)
+ JUMPE B,FINIS
+ JUMPGE B,REMOBJ
+P3END: ADDI A,RECLEN
+ JRST PASS4+1
+
+\f
+;FINIS. PRINT SUMMARIES
+
+WINEND: POP P,
+ POPJ P,
+
+CONTIN: OASCR [0]
+CONTI1: PUSHJ P,CLFLAG
+ SETZ TMAX,
+ MOVE [SAVBLK,,FNBLKI]
+ BLT FNBLKO
+ SETZM ZSTART
+ MOVE [ZSTART,,ZSTART+1]
+ BLT ZFINIS
+ MOVEI RNDTBL
+ MOVEM TBLTOP
+IFN ITS,[
+ JRST STARTC
+]
+IFE ITS,[
+ OASC UNIMPL
+ HALT
+]
+
+UNIMPL: ASCIZ /Unimplemented on the 20. Sorry./
+
+CLFLAG: SETZM ENDFLG
+ SETZM SPACSW
+ SETZM GETSW
+ SETZM STRSW
+ SETZM QUOTSW
+ SETZM ENDSW
+ SETZM EXCLSW
+ SETOM ACCPTR
+ POPJ P,
+
+FINIS: SKIPE PRELOD
+ JRST CONTIN
+ SKIPN BIGLOS ; SKIP IF ANY SIMILARITIES
+ JRST LOSER
+ SKIPN SMALOS
+ JRST EQUAL
+ SKIPN TOTSW
+ JRST FINIS1
+ OASC [ASCIZ /
+ FUNCTION MACRO GVAL LVAL
+SAME/]
+ MOVEI D,SAMTOT
+ PUSHJ P,TOTAL
+ OASC [ASCIZ /
+CHANGED/]
+ MOVEI D,CHGTOT
+ PUSHJ P,TOTAL
+ OASC [ASCIZ /
+NEW/]
+ MOVEI D,NEWTOT
+ PUSHJ P,TOTAL
+ OASC [ASCIZ /
+REMOVED/]
+ MOVEI D,REMTOT
+ PUSHJ P,TOTAL
+FINIS1: SKIPN COMSW
+ HALT ;just halt if not under combat
+
+ SETZ A,
+ SKIPN B,COMCNT
+ MOVEI A,10
+IFN ITS,[
+ MOVEI C,COMBUF
+]
+IFE ITS,[
+ PUSH P,A
+ HRROI A,COMBUF
+ RSCAN
+ JFCL
+ SETZ A,
+ RSCAN
+ JFCL
+ POP P,A
+]
+ HALT ; THIS IS WAY TO END LEGIT
+
+TOTAL: MOVEI C,4
+ HRLI D,-NUMTYP
+TOTLP: ADDI C,6
+ OHPOS (C)
+ OALIGN 4,(D)
+ AOBJN D,TOTLP
+ POPJ P,
+
+EQUAL: OASC [ASCIZ /No differences encountered./]
+ MOVEI A,6
+ MOVEI C,COMBUF
+ HALT
+
+;MY FAVORITE!
+
+LOSER: OASC [ASCIZ /No similarities encountered./]
+ MOVEI A,7
+ HALT
+
+CHKWIN: OASC [ASCIZ /Blessed./]
+ HALT
+
+LSTWIN: HALT
+
+\f
+;GTNAM GETS THE NAME OF THE SUBR AND IF IT IS ONE WHICH IS HACKED
+;(E.G. DEFINE) IT GETS THE NAME OF THE FUNCTION AND PLACES IT IN
+;THE TABLE WITH THE CORRECT CODE
+
+GTNAM: AOS OBJCNT'
+ PUSH P,B
+ PUSH P,C
+ PUSH P,D
+ PUSH P,F
+ MOVE C,ACCPTR
+ IMULI C,500. ;FIX UP FOR 500 WORD BLOCKS
+ HRRZ D,A
+ ADD C,D ;SUBTRACT THE BP
+ SUBI C,INPBLK+1
+ MOVEM C,LSTPTR ;AND SAVE IT
+ MOVE B,[440700,,SYLBUF]
+ PUSHJ P,GETSYL ;GET FIRST ATOM IN FORM
+ PUSHJ P,GETTYP ;IS IT ONE OF OURS?
+ JRST GETEND ;LOSE
+ SKIPE P2SW ;WINNING ATOM
+ JRST GETNP2
+ HRRZ B,TBLTOP
+ HRL B,F ;SAVE POINTER TO NAME OF FUNCTION/ATOM
+ MOVEM B,FTABLE(TMAX)
+ MOVE C,LSTPTR ;SAVE ACCESS POINTER TO OBJECT
+ MOVEM C,FTABLE+1(TMAX)
+ ADDI TMAX,2
+ HRLI B,440700
+ PUSH P,B
+ PUSH P,F
+ PUSHJ P,GETSYL ;GET NAME OF FUNCTION/ATOM
+ POP P,C
+ POP P,D
+ SKIPE FROBSW
+ PUSHJ P,FROBCH
+ SKIPN LSTFLG
+ JRST GETNPR
+ SKIPE MMACRO
+ OASC [ASCIZ /INPUT MACRO /]
+ PUSHJ P,TYPPRT ;PRINT TYPE
+ OBPTR D ;AND NAME
+ OASCR [0]
+GETNPR: ADDI B,1
+ HRRM B,TBLTOP
+ SETOM WINNER ;MARK THAT WE HAVE WON
+GETEND: POP P,F
+ POP P,D
+ POP P,C
+ POP P,B
+ POPJ P,
+
+GETNP2: MOVE B,[440700,,SYLBUF]
+ MOVEM F,LSTTYP
+ PUSHJ P,GETSYL ;GET NAME OF FUNCTION/ATOM AND
+ SETOM WINNER ;LEAVE IT IN SYLBUF
+ JRST GETEND
+
+FROBCH: PUSH P,A
+ PUSH P,B
+ MOVEM C,LSTTYP
+ MOVE A,D
+ MOVE B,[440700,,CMNBUF]
+ MOVEI 3
+ IDPB CMNPTR
+ PUSHJ P,ATMLKP
+ JRST [POP P,B
+ JRST POPDAJ]
+ MOVE C,LSTTYP
+ PUSHJ P,TYPPRT
+ OBPTR A
+ OASC [ASCIZ / in file /]
+ SETZ D,
+ PUSHJ P,PFNAME
+ OASCR [ASCIZ /./]
+ SOSG CMNSAV
+ JRST [OASCR [ASCIZ /All present and accounted for./]
+ HALT
+]
+ POP P,B
+ JRST POPDAJ
+\f
+;GETSYL RETURNS A SYLLABLE (ATOM) FROM THE DATA POINTED TO
+;BY A AND PLACES THE SYLLABLE FOLLOWED BY ASCII 0 IN A LOCATION
+;POINTED TO BY B
+
+GETSLF: SKIPA D,[-1]
+GETSYL: SETZ D,
+ SETZM GETSW
+GTNAM1: NXTCHR C
+ CAIN C,";
+ PUSHJ P,SKPMAN
+ PUSHJ P,SEP
+ JRST GETSL1
+ CAIN C,""
+ JRST GETSL1
+ CAIE C,"[ ; ALLOW OPEN BRACKETS TO WIN HERE
+ CAIN C,"{
+ JRST GETSL1
+ CAIE C,"(
+ CAIN C,"<
+ JRST GETSL1
+ CAIN C,">
+ JRST GETSLE
+ SETOM GETSW
+ IDPB C,B
+ JRST GTNAM1
+
+GETSLE: JUMPN D,GETSL2
+GETSL1: SKIPN GETSW
+ JRST GTNAM1
+GETSL2: MOVEI F,0
+ IDPB F,B
+ DBP A
+ POPJ P,
+
+\f
+;GETTYP CHECKS WHETHER THE SYLLABLE IN SYLBUF MATCHES ANY
+;OF THE KNOWN TYPES (DEFINE, SETG, ETC..) AND SKIP RETURNS
+;IF IT DOES. THE CODE FOR THE MATCHING TYPE IS PLACED IN F.
+
+GETTYP: SETZM MSTGFL'
+ PUSH P,A
+ MOVEI A,GTYPE-2
+ SETO F,
+GETLP1: ADDI F,1
+ CAIN F,MAXTYP
+ JRST POPAJ
+ ADDI A,2
+ HRLI A,440700
+ MOVE B,[440700,,SYLBUF]
+GETLP2: ILDB C,A
+ ILDB D,B
+ CAME C,D
+ JRST GETLP1
+ JUMPE D,GETLP3
+ JRST GETLP2
+
+GETLP3: POP P,A
+ SKIPE P3SW
+ JRST [MOVE B,[440700,,SYLBUF]
+ PUSHJ P,GETSYL
+ POPJ P,]
+ CAIN F,MSETG
+ JRST [SETOM MSTGFL
+ JRST MANHAK]
+ CAIG F,MXGTYP
+ JRST POPJ1
+ CAIN F,MANIFEST
+ JRST MANHAK
+ SKIPE P2SW
+ POPJ P,
+ CAIN F,ENTRY
+ JRST ENTHAK
+ CAIN F,PACKAGE
+ JRST PAKHAK
+ CAIN F,RPACKAGE
+ JRST RPAKHK
+ CAIN F,ENDPACKAGE
+ JRST EPKHAK
+ POPJ P,
+
+\f
+;PACKAGE AND ENTRY HACKERY
+
+;ENTRY STATEMENT
+
+ENTHAK: SKIPN PAKSW
+ POPJ P,
+ SKIPE MQUOTE
+ JRST [SKIPN SILENT
+ OASCR [ASCIZ /Quoted ENTRY statement ignored./]
+ POPJ P,]
+ENTHK1: SETOM FUDGE'
+ENTCHR: NXTCHR B
+ CAIN B,";
+ PUSHJ P,SKPONE
+ CAIN B,">
+ POPJ P,
+ CAIE B,15
+ CAIN B,12
+ SETZ B,
+ CAIE B,11
+ CAIN B,"
+ SETZ B,
+ IDPB B,ENTPTR
+ JRST ENTCHR
+
+MANHAK: SETOM FUDGE
+ SAFEIN B,
+ PUSHJ P,MANCHR
+ SAFEOUT B,
+ SKIPE P2SW
+ JRST MANHK2
+
+MANHLP: HRRZ B,TBLTOP
+ HRLI B,MANIFEST
+ MOVE X,B
+ HRLI B,440700
+ SAFEIN C,
+ PUSHJ P,GETSLF
+ SKIPN GETSW
+ JRST POPSJ
+ ADDI B,1
+ HRRM B,TBLTOP
+ MOVEM X,FTABLE(TMAX)
+ SETOM FTABLE+1(TMAX)
+ ADDI TMAX,RECLEN
+ SKIPE MSTGFL
+ JRST MANHL1
+ SUB P,[1,,1]
+ JRST MANHLP
+
+POPSJ: SUB P,[1,,1]
+ POPJ P,
+
+MANHL1: MOVEI F,SETG
+ SETZM FUDGE
+ SAFEOUT C,
+ JRST POPJ1
+
+MANHK2: MOVE B,[440700,,SYLBUF]
+ SETZM FUDGE
+ PUSHJ P,GETSLF
+ SKIPN GETSW
+ POPJ P,
+ PUSH P,A
+ MOVE A,[440700,,SYLBUF]
+ MOVEI B,MANIFEST
+ PUSHJ P,MATCH
+ JRST [PUSHJ P,MNFOO
+ OASC [ASCIZ /New MANIFEST /]
+ OASCR SYLBUF
+ AOS CMNMAX
+ JRST .+1]
+ POP P,A
+ SKIPN MSTGFL
+ JRST MANHK2
+ PUSH P,A
+ MOVE A,[440700,,SYLBUF]
+ MOVEI B,SETG
+ MOVEM B,LSTTYP
+ PUSHJ P,MATCH
+ JRST [OASC [ASCIZ /New GVAL /]
+ OASCR SYLBUF
+ JRST POPAJ]
+ POP P,A
+ SUB P,[1,,1]
+ SETOM WINNER
+ JRST GETEND
+
+MANCHR: SETZM MCHRFL'
+ SETZM MPADFL'
+MANCHL: NXTCHR B
+ CAIN B,";
+ PUSHJ P,SKPMAN
+ CAIN B,">
+ JRST [SETZ B,
+ IDPB B,MANPTR
+ POPJ P,]
+ CAIE B,15
+ CAIN B,12
+ JRST MPAD
+ CAIE B,11
+ CAIN B,40
+ JRST MPAD
+ SETOM MCHRFL
+ SETZM MPADFL
+MPUT: IDPB B,MANPTR
+ JRST MANCHL
+
+SKPMAN: MOVEI B,ATOMSK
+ MOVEM B,ACTIV
+ JRST SKPHAK
+
+MPAD: SKIPN MCHRFL
+ JRST MANCHL
+ SKIPE MPADFL
+ JRST MANCHL
+ SETOM MPADFL
+ SETZ B,
+ SKIPN MSTGFL
+ JRST MPUT
+ IDPB B,MANPTR
+ POPJ P,
+
+MNFOO: PUSH P,D
+ MOVEI D,NMNPAD
+ JRST MACHK1
+MACHAK: PUSH P,D
+ MOVEI D,MACPAD
+MACHK1: PUSH P,A
+ PUSH P,B
+ PUSH P,C
+ JRST MANCIN
+
+MANCHK: PUSH P,D
+ PUSH P,A
+ PUSH P,B
+ PUSH P,C
+ MOVEI D,CMNPAD
+ MOVEI B,3
+ IDPB B,MANPTR
+ MOVE B,[440700,,MANBUF]
+ PUSHJ P,ENTLIN
+ JRST MANOUT
+ SETOM CMNFLG
+MANCIN: MOVE A,[440700,,SYLBUF]
+ MOVE C,CMNPTR
+MANLP: ILDB B,A
+ IDPB B,CMNPTR
+ JUMPN B,MANLP
+ IDPB D,CMNPTR
+ AOS CMNMAX
+MANOUT: POP P,C
+ POP P,B
+ POP P,A
+ POP P,D
+ POPJ P,
+
+;PACKAGE STATEMENT
+
+RPAKHK: SETOM RPAKSW
+PAKHAK: SKIPE MQUOTE
+ JRST [SKIPN SILENT
+ OASCR [ASCIZ /Quoted PACKAGE statement ignored./]
+ POPJ P,]
+ SETOM PAKSW
+ PUSH P,A
+ MOVE B,[440700,,PAKBUF]
+ MOVEI C,"I
+ IDPB C,B
+ COMCHR ""
+PAKHK1: ILDB C,A
+ CAIN C,">
+ JRST PAKEND
+ PUSHJ P,SEP
+ JRST PAKHK1
+ CAIN C,""
+ JRST PAKHK1
+ IDPB C,B
+ COMAC C,
+ JRST PAKHK1
+
+PAKEND: COMCHR ""
+ COMCHR 40
+ SKIPN RPAKSW
+ JRST PENDL1
+ MOVE A,[440700,,[ASCIZ /!-RPACKAGE/]]
+PENDLP: ILDB C,A
+ JUMPE C,PENDL1
+ IDPB C,B
+ JRST PENDLP
+
+PENDL1: SETZ C,
+ IDPB C,B
+ JRST POPAJ
+
+;ENDPACKAGE ==> RESET POINTERS
+
+EPKHAK: SKIPE MQUOTE
+ JRST [SKIPN SILENT'
+ OASCR [ASCIZ /Quoted ENDPACKAGE statement ignored./]
+ POPJ P,]
+ MOVE ENTPTR,[440700,,ENTBUF]
+ SETZM PAKBUF
+ SETZM PAKSW
+ POPJ P,
+
+\f
+;ENTRY LOOKUP FUNCTION. EXPECTS ITEM IN SYLBUF.
+;SKIP RETURNS IF SUCCESSFUL
+
+ENTLKP: MOVEI B,3
+ IDPB B,ENTPTR
+ MOVE B,[440700,,ENTBUF]
+ENTLIN: MOVE A,[440700,,SYLBUF]
+ PUSH P,A
+ENTL0: ILDB D,B
+ JUMPE D,.-1
+ CAIN D,3
+ JRST POPAJ
+ SKIPA A,(P)
+ENTL1: ILDB D,B
+ ILDB C,A
+ CAME C,D
+ JRST ENTL2
+ CAIE C,0
+ JRST ENTL1
+ ILDB C,B
+ SETOM MACFLG'
+ JUMPE C,.+2
+ SETZM MACFLG
+ JRST POPAJ1
+
+ENTL2: ILDB C,B
+ JUMPE C,ENTL0
+ CAIE C,3
+ JRST ENTL2
+ JRST POPAJ
+
+\f
+;MATCHING ROUTINE. A IS A BP TO ITEM TO BE SEARCHED FOR. B IS
+;THE TYPE CODE OF THE ITEM. MATCH SKIPS IF THE ITEM IS FOUND AND
+;RETURNS IN A THE CHECKSUM OF THE ITEM. THE SEARCH ENDS IF ANY
+;TABLE ENTRY IS NOT GREATER THAN ZERO
+;C,D, AND E ARE MUNGED
+
+MATCH: MOVEI X,FTABLE
+ PUSH P,A
+MATCH0: SKIPG C,(X)
+ JRST [MOVE C,B
+ JRST POPAJ] ;LOST
+ HLRZ F,C
+ CAME F,B
+ JRST MATCH2 ;NOT OF SAME TYPE
+ HRLI C,440700 ;D IS BP TO TABLE ENTRY
+ MOVE A,(P)
+MATCH1: ILDB D,C ;GET CHAR FROM TABLE ENTRY
+ ILDB E,A ;GET CHAR FROM SEARCH ITEM
+ CAME D,E
+ JRST MATCH2 ;NOT EQUAL ==> LOSE
+ CAIE E,0 ;BOTH 0 ==> WIN
+ JRST MATCH1
+ POP P,A
+ MOVE A,2(X) ;MOVE CHECKSUM INTO A
+ MOVE C,B ;TYPE CODE
+ MOVSI B,400000
+ IORB B,1(X)
+ JRST POPJ1 ;RETURN
+MATCH2: ADDI X,RECLEN ;GO TO NEXT ENTRY
+ JRST MATCH0
+
+\f
+;GETSUM CREATES A CHECKSUM FOR THE MUDDLE OBJECT WHICH IS POINTED
+;TO BY A BP IN A. CHECKSUM IS RETURNED IN B.
+;C GETS CLOBBERED
+;SKPONE SKIPS OVER ONE MUDDLE OBJECT
+
+SKPONE: MOVEI B,GETSM1
+ MOVEM B,ACTIV
+
+SKPHAK: PUSH P,DEPTH ;SAVE THE CURRENT DEPTH
+ SETZM DEPTH ;INDICATE TOP LEVEL OBJECT
+ SETZM MQUOTE ;NO QUOTING
+ SETZM MMACRO
+ SETZ B,
+ SETOM SKIPPR ;SET SKIP FLAG
+ PUSHJ P,@ACTIV ;SKIP THE OBJECT
+ JFCL ;EOF. DONT WORRY
+ SETZM SKIPPR
+ POP P,DEPTH ;RESTORE THE DEPTH
+ POPJ P, ;AND RETURN
+
+;FLUSH TOP LEVEL STRINGS
+
+GETSTT: CAIN C,"" ; IGNORE STRINGS AT TOP LEVEL
+ JRST GETST1
+ SKIPE STRSW
+ JRST GETST0
+ CAIE C,"(
+ CAIN C,"{
+ POPJ P,
+ CAIN C,"[
+ POPJ P,
+ CAIN C,"'
+ JRST [SETOM MQUOTE
+ JRST GETST0]
+ CAIN C,"%
+ JRST [SETOM MMACRO
+ JRST GETST0]
+ CAIE C,"<
+ JRST [SUB P,[1,,1]
+ JRST @ACTIV]
+GETST0: PUSHJ P,GTNAM
+ SETZM MQUOTE
+ SETZM MMACRO
+ SETZ B,
+ SKIPE FUDGE
+ MOVEI C,40
+ SETZM FUDGE
+ POPJ P,
+
+GETST1: SETCMM STRSW
+ SUB P,[1,,1]
+ JRST @ACTIV
+
+;HERE TO DO THE CHECKSUMMING
+
+GETSUM: SETZM WINNER
+ MOVE CH,[-100.,,CPDL]
+ SETZM DEPTH
+ MOVEI X,GETSM1
+ MOVEM X,ACTIV'
+
+;PUSHJ TO GETSM1 WITH CORRECT HACKS PERFORMED WILL SKIP OVER ONE
+;OBJECT. SEE SKPONE.
+
+GETSM1: NXTCHR C
+ SKIPN STRSW
+ SKIPE SKIPPR
+ JRST GETSM3
+ SKIPN DEPTH ;IF DEPTH=0, FIND NEXT OBJECT
+ PUSHJ P,GETSTT ;START?
+GETSM3: SKIPE QUOTSW
+ JRST EXCLQU ;QUOTE SWITCH SET. CHECK FOR !"\\
+ CAIN C,"\
+ JRST QUOTER ;QUOTE ONE CHARACTER
+ CAIN C,""
+ JRST STRING ;TOGGLE STRSW AND CHECK FOR !"
+ CAIN C,"!
+ JRST EXCL ;TOGGLE EXCLSW
+ SKIPE STRSW
+ JRST GETSM2 ;INSIDE STRING. IGNORE BRACKETS, ETC..
+ XCT CHRTBL(C)
+GETSM2: SKIPE SKIPPR
+ JRST SETSM5
+ ROT B,7 ;ADD IN THE LUCKY CHARACTER
+ XOR B,C
+SETSM5: SETZM QUOTSW ;CLEAR RANDOM ONCE ONLY SWITCHES
+ SETZM EXCLSW
+ SETZM SPACSW
+ JRST GETSM1 ;NEXT
+
+;COME HERE IF QUOTE SWITCH IS SET
+;IF BOTH EXCL SWITCH IS SET AND CHAR IS \, GO TO QUOTER (E.G. !"\\)
+;ELSE JUST SNARF ONE CHARACTER AND BE DONE WITH IT
+
+EXCLQU: CAIN C,"\
+ SKIPN EXCLSW
+ JRST GETSM2
+ SETZM EXCLSW
+ JRST QUOTER
+
+
+;COME HERE IF CHARACTER IS A SEPARATOR.
+;FIRST SEP GOES IN AS A SPACE. REST ARE IGNORED
+
+PAD: SKIPN SPACSW ;HACK SEPARATORS CORRECTLY
+ JRST [SETOM SPACSW
+ MOVEI C,40
+ SKIPE SKIPPR
+ JRST .+3
+ ROT B,7 ;ADD IN THE LUCKY CHARACTER
+ XOR B,C
+ SETZM QUOTSW
+ SETZM EXCLSW
+ JRST GETSM1]
+ JRST GETSM1
+
+;HANDLE EXCL
+;CHECKSUM THE EXCL AND SET EXCLSW IF NOT IN STRING
+
+EXCL: SKIPE SKIPPR
+ JRST .+3
+ ROT B,7 ;ADD IN THE LUCKY CHARACTER
+ XOR B,C
+ SKIPE STRSW
+ JRST GETSM2
+ SETOM EXCLSW
+ JRST GETSM1
+
+;HANDLE STRINGAGE
+
+STRING: SKIPE EXCLSW
+ JRST QUOTER ;MUST BE !"X
+ SETCMM STRSW ;ELSE TOGGLE STRING MODE
+ SKIPE STRSW ;ENTERING STRING?
+ JRST GETSM2 ;YES. CONTINUE.
+ SKIPN DEPTH ;TOP LEVEL STRING?
+ JRST POPJ1 ;YES. FINIS.
+ JRST GETSM2 ;NO. CONTINUE
+
+;QUOTE A CHARACTER
+
+QUOTER: SKIPE SKIPPR
+ JRST .+3
+ ROT B,7 ;ADD IN THE LUCKY CHARACTER
+ XOR B,C
+ SETOM QUOTSW
+ JRST GETSM1
+
+;PUSH AN CLOSED BRACKET CORRESPONDING TO CHAR IN C ON THE CH STACK
+;ALSO PUSH AN ACCESS POINTER TO THE CHAR IN CASE OF SYNTAX ERROR
+
+PUSHER: HRLZ D,ACCPTR
+ HRR D,A
+ PUSH CH,D
+ CAIN C,"< ;PUSH ONTO CH WHAT WE WANT BACK
+ PUSH CH,[">]
+ CAIN C,"[
+ PUSH CH,["]]
+ CAIN C,"(
+ PUSH CH,[")]
+ CAIN C,"{
+ PUSH CH,["}]
+ AOS DEPTH ;INCREMENT DEPTH
+ JRST GETSM2
+
+;HERE IF CLOSED BRACKET ENCOUNTERED
+;POP THE CH STACK AND COMPARE TO SEE IF WINNING
+
+POPPER: PUSH P,B
+ POP CH,B
+ POP CH,D ;GET LAST PUSHED CHARACTER
+ CAME B,C ;BETTER BE WHAT WE PUSHED
+ JRST SYNERR ;OH WELL, CANT WILL EM ALL
+ POP P,B
+ SOSLE DEPTH ;DECREMENT DEPTH
+ JRST GETSM2
+ SKIPE SKIPPR
+ JRST .+3
+ ROT B,7 ;ADD IN THE LUCKY CHARACTER
+ XOR B,C
+ JRST POPJ1 ;DONE ==> WIN
+
+\f
+;NXTBLK READS IN THE NEXT 500 WORDS OF THE INPUT FILE, AND
+;RETURNS IN A A BP TO THE TOP OF THE BLOCK
+
+NXTJCL: SKIPA A,[-500.,,JCLINB]
+NXTBLK: MOVE A,[-500.,,INPBLK]
+ MOVE A
+ SKIPE ENDFLG
+ JRST EOFERR ;END OF FILE
+IFN ITS,[
+ .CALL DSKIOT
+ .LOSE 1000 ;WHY?
+ AOS ACCPTR
+ JUMPGE .+2
+ SETOM ENDFLG
+ HRRZM BLKEND
+]
+IFE ITS,[
+ PUSHJ P,XIOTI
+ A
+ SETOM ENDFLG
+ AOS ACCPTR
+]
+ MOVE A,[350700,,INPBLK]
+ POPJ P, ;RETURN BP TO NEW BUFFER IN A
+
+LSTBLK: PUSH P,A
+ SOSGE A,ACCPTR
+ HALT ;HUH?
+ IMULI A,500.
+IFN ITS,[
+ .CALL DSKACC
+ .LOSE 1000
+ MOVE [-500.,,INPBLK]
+ .CALL DSKIOT
+ .LOSE 1000
+]
+IFE ITS,[
+ PUSH P,B
+ MOVE B,A
+ MOVE A,DSKJFN
+ SFPTR
+ HALT ; HUH?
+ MOVE A,[-500.,,INPBLK]
+ PUSHJ P,XIOTI
+ A
+ JFCL
+]
+ HRRZM BLKEND
+ SETZM ENDFLG
+ POP P,B
+ JRST POPAJ
+
+\f
+;ERROR HANDLERS
+
+ILLCHR: OASC [ASCIZ /ILLEGAL CHARACTER IN FILE NAME/]
+ MOVEI B,EILLCH
+ JRST LOST
+
+EOFERR: SKIPN DEPTH
+ JRST WINEND
+ OASC [ASCIZ /SYNTAX ERROR - EOF INSTEAD OF /]
+ OASCI @(CH)
+ JRST SYNER1
+
+SYNERR: OASC [ASCIZ /SYNTAX ERROR /]
+ OASCI (C)
+ OASC [ASCIZ / INSTEAD OF /]
+ OASCI (B)
+ OASC [ASCIZ / in /]
+ SKIPN CURCHN
+ JRST [SKIPN TMAX
+ JRST SYNLOS
+ HLRZ C,FTABLE-2(TMAX)
+ PUSHJ P,TYPPRT
+ MOVE C,FTABLE-2(TMAX)
+ OASC (C)
+ JRST SYNER1]
+ MOVE C,LSTTYP
+ SKIPN TMAX
+ JRST SYNLOS
+ PUSHJ P,TYPPRT
+ OASC SYLBUF
+SYNER1: OASCR [ASCIZ /./]
+ PUSH P,D
+ MOVE D,CURCHN
+ PUSHJ P,PFNAME
+ OASC [ASCIZ / [LOC=/]
+ POP P,D ; PRINT RANGE OF LOSSAGE
+ HLRZ C,D
+ IMULI C,500.
+ ADDI C,(D)
+ SUBI C,INPBLK
+ IMULI C,5
+ ODEC C
+ OASCI ",
+ MOVE C,ACCPTR
+ IMULI C,500.
+ ADDI C,(A)
+ SUBI C,INPBLK
+ IMULI C,5
+ ODEC C
+ OASCI "]
+ SKIPE FJCLSW
+ JRST FSYNER
+ SKIPE CHKSW
+ JRST CHKLOS
+ OASC [ASCIZ /.
+Comparison aborted./]
+ MOVEI B,ESYNER
+ JRST LOST
+
+CHKLOS: OASC [ASCIZ /.
+Check aborted./]
+ JRST LOST
+
+SYNLOS: OASC [ASCIZ /What the hell is this file, FORTRAN?/]
+ HALT
+
+OPNFL: OASC [ASCIZ /Open of /]
+ PUSHJ P,PFNAME
+ OASC [ASCIZ / failed./]
+OPNFL2: MOVEI B,EOPNFL
+ JRST LOST
+
+OPNFL1: OASC [ASCIZ /Open of the /]
+ OASC SNAME(D)
+ OASC [ASCIZ / directory failed./]
+ JRST OPNFL2
+
+\f
+;RANDOM CALL BLOCKS
+
+TTYOPN: SETZ
+ SIXBIT /OPEN/
+ 5000,,4001
+ MOVEI TYOC
+ SETZ [SIXBIT /TTY/]
+
+DSKOPN: SETZ
+ SIXBIT /OPEN/
+ 5000,,2
+ D
+ DEVICE(D)
+ FNAME1(D)
+ FNAME2(D)
+ SETZ SNAME(D)
+
+RCHST: SETZ
+ SIXBIT /RCHST/
+ D
+ MOVEM DEVICE(D)
+ MOVEM FNAME1(D)
+ MOVEM FNAME2(D)
+ SETZM SNAME(D)
+
+DIROPN: SETZ
+ SIXBIT /OPEN/
+ 5000,,6
+ MOVEI DSKI
+ DEVICE(D)
+ [SIXBIT /.FILE./]
+ [SIXBIT /(DIR)/]
+ SETZ SNAME(D)
+
+DIRIOT: SETZ
+ SIXBIT /IOT/
+ MOVEI DSKI
+ SETZ
+
+DSKACC: SETZ
+ SIXBIT /ACCESS/
+ CURCHN
+ SETZ A
+
+DSKIOT: SETZ
+ SIXBIT /IOT/
+ CURCHN
+ SETZ
+
+\f
+;RANDOM UTILITY ROUTINES
+
+;SEP SKIP RETURNS IF THE CHARACTER IN C IS NOT A SEPARATOR
+
+SEP: CAIE C,40
+ CAIN C,TAB
+ POPJ P,
+ CAIE C,CR
+ CAIN C,LF
+ POPJ P,
+ CAIN C,FF
+ POPJ P,
+ JRST POPJ1
+
+;TYPPRT PRINTS AN OBJECT TYPE IN C.
+
+TYPPRT: IMULI C,2
+ OASC PTYPE(C)
+ OASCI 40
+ POPJ P,
+
+\f
+
+;CORE ALLOCATOR OF A SORT
+
+IBLOCK: ADD A,GCSTOP
+ EXCH A,GCSTOP
+ POPJ P,
+
+IFE ITS,[
+
+; THIS IS CRETINOUS, BUT WHAT DO YOU EXPECT FROM DEC SOFTWARE?
+
+XHALT: HALTF
+ JRST XHALT
+
+; DO TWENEX IOTING
+; IN (P) IS THE WORD WHICH ITS WOULD LIKE
+
+XIOTI: PUSH P,[SIN]
+ CAIA
+ PUSH P,[SOUT]
+XIOT: MOVE O,[A,,XACS]
+ BLT O,XACS+2
+ MOVE A,-1(P)
+ MOVE A,(A)
+ MOVE O,XACS-1(A)
+ MOVE A,DSKJFN
+ HRRZ B,O
+ TLO B,444400
+ HLRE C,O
+ PUSH P,C
+ XCT -1(P)
+ HRRZM B,BLKEND
+ AOS BLKEND ;FUCK THIS
+ CAME C,(P)
+ AOS -2(P)
+ MOVE O,[XACS,,A]
+ BLT O,C
+ SUB P,[2,,2]
+ JRST POPJ1
+
+XACS: BLOCK 3
+]
+
+\f
+;ROUTINE TO PARSE FILE NAMES (FROM SHARER)
+
+FPARSS: SETZM ENDSW
+FPARSE: SETZM NAME ;CLEAR NAME SLOT
+ SKIPE ENDSW
+ POPJ P,
+ MOVE F,[440600,,NAME]
+
+GETCHR: ILDB B,E ;FIND NEXT NON-EMPTY CHARACTER
+ CAIE B,0
+ CAIN B,3
+ JRST [SKIPN FJCLSW
+ POPJ P,
+ .CLOSE
+ SETZM FJCLSW
+ MOVE E,FJCLPT
+ JRST GETCHR]
+ CAIE B,40
+ CAIN B,^I
+ JRST GETCHR
+ CAIN B,"[
+ JRST [SETOM PRELOD
+ JRST GETCHR]
+ CAIN B,"(
+ JRST [PUSHJ P,ASKHAK
+ SETOM MANFLG
+ JRST GETCHR]
+ CAIN B,"{
+ JRST [PUSHJ P,FROBOZ
+ JRST GETCHR]
+ CAIN B,""
+ JRST [PUSHJ P,FILJCL
+ JRST GETCHR]
+
+FIELD: CAIN B,^J
+ POPJ P,
+ CAIE B,40 ;HERE TO GET A NAME
+ CAIN B,^I
+ JRST FNAM ;SPACE AND TAB MAKE FNAME1 AND 2
+ CAIE B,0
+ CAIN B,^M
+ JRST FNAM ;SO DOES 0 AND <CR>
+ CAIN B,""
+ JRST FNAM
+ CAIN B,",
+ JRST [SETOM ENDSW
+ JRST FNAM]
+ SKIPN COMSW
+ JRST [CAIE B,"_
+ JRST FIELD1
+ SETOM ENDSW
+ JRST FNAM]
+FIELD1: CAIN B,":
+ JRST DEV ;DEVICE NAME
+ CAIE B,"}
+ CAIN B,"]
+ JRST [SETOM ENDSW
+ SETOM ENDBRK'
+ JRST FNAM]
+ CAIN B,"/
+ JRST SWITCH
+ CAIN B,";
+ JRST FDIR ;SNAME
+ CAIN B,^Q ;HANDLE QUOTING
+ ILDB B,E
+ CAIGE B,40 ;SUBI B,40 < 0 (BAD CHARACTER)
+ JRST ILLCHR
+ SUBI B,40
+ CAIL B,100
+ SUBI B,40 ;CASE CONVERSION
+ TLNE F,770000 ;IGNORE MORE THAN 6 CHARACTERS
+ IDPB B,F
+FPARS2: ILDB B,E
+ JRST FIELD
+
+SWITCH: ILDB B,E
+ CAIN B,"T
+ SETOM TOTSW
+ CAIN B,"C
+ SETOM CHKSW
+ CAIN B,"M
+ SETOM MANFLG
+ CAIN B,"L
+ SETOM LSTFLG
+ JRST FPARS2
+
+DEV: MOVE A,NAME ;SAVE DEVICE
+ MOVEM A,DEVICE(D)
+ JRST FPARSE
+
+FDIR: MOVE A,NAME ;SAVE SNAME
+ MOVEM A,SNAME(D)
+ JRST FPARSE
+
+FNAM: MOVE A,NAME
+ JUMPE A,FPARSE
+ SKIPE FNAME1(D) ;DOES HE HAVE AN FNAME1 ALREAD?
+ JRST FNAM1 ;YES - OOPS. HE IS GIVING TWO NAMES
+ MOVEM A,FNAME1(D) ;NO - TRY IT AS FNAME1
+ JRST FPARSE
+
+FNAM1: MOVEM A,FNAME2(D) ;PUT NEW NAME INTO FNAME2
+ JRST FPARSE
+
+; HERE TO HACK GROSS FIND'AGE IN LIST OF FILES
+
+FROBOZ: SETOM SILENT
+ MOVE CMNMAX
+ ADDI 1
+ MOVEM CMNTOT'
+ MOVEM CMNSAV'
+FROBCN: SKIPE ENDBRK
+ JRST FROBBD
+ SKIPE JCLPTR
+ MOVE E,JCLPTR
+ SETZ D,
+ MOVE A,[SIXBIT />/]
+ MOVEM A,FNAME2
+ SETZM FNAME1
+ PUSHJ P,FPARSS
+ PUSH P,E
+IFN ITS,[
+ PUSHJ P,FPHACK
+]
+IFE ITS,[
+ OASC UNIMPL
+ HALT
+]
+ POP P,JCLPTR
+ SKIPN FNAME1
+ JRST FROBCN
+IFN ITS,[
+ .CALL DSKOPN
+ JRST FROBOF
+ .CALL RCHST
+ .LOSE 1000
+]
+ SETOM CHKSW
+ SETOM FROBSW'
+ JRST START2
+
+FSYNER: SUB P,[1,,1]
+ OASCR [0]
+ JRST FROBCN
+
+FROBOF: OASC [ASCIZ /Open of /]
+ PUSHJ P,PFNAME
+ OASCR [ASCIZ / failed./]
+ JRST FROBCN
+
+FROBBD: OASC [ASCIZ /Found /]
+ MOVE A,CMNTOT
+ SUB A,CMNSAV
+ ODEC A
+ OASC [ASCIZ / out of /]
+ ODEC CMNTOT
+ OASCR [ASCIZ /./]
+ HALT
+
+; HERE TO READ JCL FROM A FILE
+
+FILJCL: SKIPE STRSW
+ JRST FILTRM
+ SETOM STRSW
+ MOVE [SIXBIT />/]
+ MOVEM FNAME2
+ SETZM JCLPTR
+ PUSHJ P,FPARSS
+ CAIA
+FILTRM: SUB P,[1,,1] ; FLUSH THIS PUSHJ TO FPARSS
+ MOVEM E,FJCLPT'
+ SETZ D,
+IFN ITS,[
+ .CALL DSKOPN
+ JRST FILOPF
+]
+IFE ITS,[
+ OASC UNIMPL
+ HALT
+]
+ PUSHJ P,NXTJCL
+ MOVE E,[440700,,JCLINB]
+ SETOM FJCLSW'
+ POPJ P,
+
+FILOPF: OASC [ASCIZ /Open of /]
+ PUSHJ P,PFNAME
+ OASCR [ASCIZ / failed./]
+ HALT
+
+; HERE TO GET ATOMS FROM JCL TO BE LOOKED FOR
+
+ASKHAK: SETZM MCHRFL
+ SETZM MPADFL
+ CAIA
+ASKCLP: AOS CMNMAX
+ ILDB C,E
+ PUSHJ P,SEP
+ JRST ASKSEP
+ CAIE C,"{
+ CAIN C,")
+ JRST ASKSP1
+ CAIN C,""
+ JRST ASKSP1
+ SETOM MCHRFL
+ SETZM MPADFL
+ IDPB C,CMNPTR
+ JRST ASKCLP+1
+
+ASKSEP: SKIPN MCHRFL
+ JRST ASKCLP+1
+ SKIPE MPADFL
+ JRST ASKCLP+1
+ SETOM MPADFL
+ASKSP1: SETZ B,
+ IDPB B,CMNPTR
+ MOVEI B,ASKPAD
+ IDPB B,CMNPTR
+ CAIN C,")
+ POPJ P,
+ CAIE C,"{
+ CAIN C,""
+ CAIA
+ JRST ASKCLP
+ DBP E
+ POPJ P,
+
+\f
+IFN ITS,[
+;HACK >-1
+;MOST OF THIS CODE FROM ARCDEV (I.E. FROM ITS)
+
+FPHACK: MOVE X,FNAME2(D)
+ MOVE A,FNAME1(D)
+ SETZ B,
+ SETZ C,
+ CAMN X,[SIXBIT /NBIN/]
+ JRST NHAIR
+HAIR: TLNE X,770000 ;LEFT JUSTIFY
+ JRST HAIR1
+ LSH X,6
+ JRST HAIR
+HAIR1: LDB F,[301400,,X]
+ CAMN F,[SIXBIT / <+/]
+ JRST HAIR2
+ CAME F,[SIXBIT / >-/]
+ POPJ P, ;CAN'T HACK THIS
+ SETO C,
+ LSH X,6
+HAIR2: LSH X,6 ;GET RID OF CRUFT
+ LDB F,[360600,,X]
+ JUMPE F,HAIR3
+ CAIL F,'0 ;GET THE ARGUMENT
+ CAILE F,'9
+ JRST HAIR2
+ IMULI B,10
+ SUBI F,'0
+ ADD B,F
+ JRST HAIR2
+HAIR3: SKIPE C
+ TLO B,400000 ;SET BIT
+
+;4.9 BIT IN B IS SET FOR >
+;RH OF B IS ARGUMENT FOR THE SEARCH
+
+QLOOK: MOVE [-2000,,DIRPAG]
+ .CALL DIROPN
+ JRST OPNFL1
+ .CALL DIRIOT
+ JRST LOST0 ;REPORT INTERNAL BUG
+ .CLOSE DSKI,
+QLOOKR: MOVEI E,DIRPAG+2000-5
+ PUSH P,D
+ PUSH P,[-1] ;BEST INDEX
+ PUSH P,[SETZ] ;BEST "NUMERIC" PART
+ PUSH P,[SETZ] ;BEST ALPHA PART
+QLOOK4: CAIGE E,DIRPAG
+ JRST QLOOK2
+ CAME A,UFN1(E)
+ JRST QLOOK3
+ SKIPE X,UFN2(E)
+QLOOK6: TRNE X,77
+ JRST QLOOK5
+ LSH X,-6
+ JRST QLOOK6
+QLOOK5: MOVEI F,0
+QLOOK8: LDB D,[600,,X]
+ CAIL D,'0
+ CAILE D,'9
+ JRST QLOOK7 ;NOT A DIGIT
+QLOK5B: TRNE F,77 ;RIGHT ADJ LOW NON NUM PART
+ JRST QLOK5A
+ LSH F,-6
+ JUMPN F,QLOK5B
+QLOK5A: TLC X,400000 ;AVOID CAM LOSSAGE
+ TLC F,400000
+ SKIPGE -2(P)
+ JRST QLOK5D ;FIRST MATCH
+ JUMPGE B,QLOK5E ;GET LEAST
+ CAMGE X,-1(P) ;GET GREATEST
+ JRST QLOOK3
+ CAME X,-1(P)
+ JRST QLOK5D
+ CAMGE F,(P)
+ JRST QLOOK3 ;NOT AS GOOD
+QLOK5D: HRRZM E,-2(P)
+ MOVEM X,-1(P)
+ MOVEM F,(P)
+QLOOK3: SUBI E,LUNBLK
+ JRST QLOOK4
+
+
+QLOK5E: CAMLE X,-1(P)
+ JRST QLOOK3
+ CAME X,-1(P)
+ JRST QLOK5D
+ CAMLE F,(P)
+ JRST QLOOK3
+ JRST QLOK5D
+
+QLOOK7: LSHC X,-6 ;LOW DIGIT NOT NUMERIC
+ JUMPN X,QLOOK8 ;NO NUMERIC DIGITS AT ALL ("BIN", MAYBE?)
+ JUMPL B,QLOK5B ;IF LOOKING FOR GREATEST, LET THIS BE LEAST
+ MOVNI X,1 ;GREATEST IF LOOKING FOR LEAST
+ JRST QLOK5B
+
+QLOOK2: SUB P,[1,,1]
+ POP P,C ;BEST "NUMERIC" PART
+ POP P,E ;ADR
+ JUMPL E,[POP P,D
+ POPJ P,]
+ HRRZ D,B
+ SOJL D,QFINIS ;KEEP GOING UNTIL REQUEST IS SATISFIED
+ POP P,D
+ SOJ B,
+ MOVE F,[SIXBIT /!!!!!!/]
+ MOVEM F,UFN1(E) ;MUNGE THE DIRECTORY
+ JRST QLOOKR ;START OVER
+
+QFINIS: POP P,D ;DONE!
+ MOVE B,UFN2(E)
+ MOVEM B,FNAME2(D)
+ POPJ P,
+
+;HERE TO HACK THE NBIN'AGE
+
+NHAIR: .CALL DIROPN
+ JRST OPNFL1
+ MOVE [-2000,,DIRPAG]
+ .CALL DIRIOT
+ JRST LOST0
+ PUSH P,D
+ SETZ C,
+ MOVEI E,DIRPAG+2000-5
+NBNFND: CAIGE E,DIRPAG
+ JRST NONBIN
+ MOVE X,UFN2(E)
+ CAMN A,UFN1(E)
+ CAME X,[SIXBIT /NBIN/]
+ JRST NBNNXT
+ MOVE B,UNDATE(E)
+ SETZ D,
+ .CALL DIROPN ; OPEN THE CORRECT DIRECTORY
+ JRST OPNFL1
+ MOVE [-2000,,DIRPAG]
+ .CALL DIRIOT
+ JRST LOST0
+ MOVEI E,DIRPAG+2000-5
+NLOOP: CAIGE E,DIRPAG
+ JRST NDONE
+ CAME A,UFN1(E)
+ JRST NLNXT
+ SKIPE X,UFN2(E)
+NLOOP1: TRNE X,77 ;RIGHT JUSTIFY NAME
+ JRST NLOOP2
+ LSH X,-6
+ JRST NLOOP1
+NLOOP2: LDB D,[600,,X] ;MAKE SURE NAME ENDS IN NUMERIC
+ CAIL D,'0
+ CAILE D,'9
+ JRST NLNXT
+NLOOP3: CAMLE B,UNDATE(E) ;COMPARE CREATION DATES
+ CAML C,UNDATE(E)
+ JRST NLNXT
+ MOVE C,UNDATE(E)
+ MOVE F,UFN2(E)
+ JRST NLNXT
+
+NDONE: JUMPL C,NBNLOS
+ POP P,D
+ MOVEM F,FNAME2(D)
+ MOVE F,SNAME
+ MOVEM F,SNAME(D)
+ POPJ P,
+
+NONBIN: OASC [ASCIZ /No NBIN file found./]
+ JRST OPNFL2
+
+NLNXT: SUBI E,LUNBLK
+ JRST NLOOP
+
+NBNNXT: SUBI E,LUNBLK
+ JRST NBNFND
+
+]
+
+NBNLOS: OASC [ASCIZ /No file created before NBIN./]
+ JRST OPNFL2
+
+\f
+;PRINT A FILE NAME. CHANNEL NUMBER IS IN D
+
+IFN ITS,[
+PFNAME: OSIX DEVICE(D)
+ OASCI ":
+ OSIX SNAME(D)
+ OASCI ";
+ OSIX FNAME1(D)
+ OASCI "
+ OSIX FNAME2(D)
+ POPJ P,
+]
+IFE ITS,[
+PFNAME: MOVE A,F1BLK(D)
+ MOVE B,(A)
+ OASC (B)
+ OASCI ":
+ OASCI "<
+ MOVE B,1(A)
+ OASC (B)
+ OASCI ">
+ MOVE B,2(A)
+ OASC (B)
+ OASCI ".
+ MOVE B,3(A)
+ OASC (B)
+ OASCI ".
+ MOVE B,4(A)
+ OASC (B)
+ POPJ P,
+]
+\f
+; TYPEOUT UUOS (STRAIGHT FROM DIRED, WITH SOME HELP FROM PDL)
+
+ZZZ==.
+ LOC 40
+ 0
+ JSR UUOH
+ LOC ZZZ
+UUOCT==0
+UUOTAB: JRST ILUUO
+ IRPS X,,[ODEC OBPTR OHPOS OCTLP OALIGN OSIX OASC OASCI OASCR OSIXS]
+ UUOCT==UUOCT+1
+ X=UUOCT_33
+ JRST U!X
+ TERMIN
+
+UUOMAX==.-UUOTAB
+
+UUOH: 0
+ PUSH P,A
+ PUSH P,B
+ PUSH P,C
+ PUSH P,D
+ MOVEI @40 ; GET EFF ADDR. OF UUO
+ MOVEM UUOE'
+ MOVE @0
+ MOVEM UUOD' ; CONTENTS OF EFF ADR
+ MOVE B,UUOE ; EFF ADR
+ LDB A,[270400,,40] ; GET UUO AC,
+ LDB C,[330600,,40] ; OP CODE
+ CAIL C,UUOMAX
+ MOVEI C,0 ; GRT=>ILLEGAL
+ JRST @UUOTAB(C) ; GO TO PROPER ROUT
+
+UUORET: POP P,D
+ POP P,C
+ POP P,B
+ POP P,A ; RESTORE AC'S
+ JRST 2,@UUOH
+
+IFN ITS,[
+ILUUO: .VALUE [ASCIZ /:\eILLEGAL UUO\e/]
+]
+IFE ITS,[
+ILUUO: HALT
+]
+UOBPTR: MOVEI C,0
+ MOVE B,UUOD
+ JRST UOASC1
+UOASCR: SKIPA C,[^M] ; CR FOR END OF TYPE
+UOASC: MOVEI C,0 ; NO CR
+ HRLI B,440700 ; MAKE ASCII POINTER
+UOASC1: ILDB A,B ; GET CHAR
+ JUMPE A,.+3 ; FINISH?
+ PUSHJ P,IOTA
+ JRST .-3 ; AND GET ANOTHER
+ SKIPN A,C ; GET SAVED CR?
+ JRST UUORET
+ PUSHJ P,IOTA
+ MOVEI A,^J
+ PUSHJ P,IOTA
+ JRST UUORET
+
+UOASCC: HRLI B,440700 ; MAKE ASCII POINTER
+UOAS1C: ILDB A,B ; GET CHAR
+ CAIN A,^C
+ JRST UUORET
+ PUSHJ P,IOTA
+ JRST UOAS1C ; AND GET ANOTHER
+
+UOCTLP: MOVEI A,^P
+ PUSHJ P,IOTA1
+
+UOASCI: MOVE A,B ; PRT ASCII IMMEDIATE
+ PUSHJ P,IOTA
+ JRST UUORET
+
+UOSIX: MOVE B,UUOD
+USXOOP: JUMPE B,UUORET
+ LDB A,[360600,,B]
+ ADDI A,40
+ PUSHJ P,IOTA
+ LSH B,6
+ JRST USXOOP
+
+UOSIXS: MOVE A,[440600,,UUOD]
+USLOOP: ILDB C,A
+ ADDI C,40
+ PUSHJ P,IOTC
+ TLNE A,770000
+ JRST USLOOP
+ JRST UUORET
+
+UOHPOS: SUB B,HPOS
+ JUMPLE B,UOASCI
+UOHPO1: MOVEI A,40
+ PUSHJ P,IOTA
+ SOJG B,UOHPO1
+ JRST UUORET
+
+POWER: 0 ? 1 ? 10. ? 100. ? 1000. ? 10000. ? 100000. ? 1000000.
+
+UOALIG: MOVE D,UUOD
+ ANDI A,7
+ MOVE A,POWER(A)
+ MOVEI C,40
+UOALI1: CAMLE A,D
+ PUSHJ P,IOTC
+ IDIVI A,10.
+ CAIE A,1
+ JRST UOALI1
+ SETZ A,
+
+UODEC: SKIPA C,[10.] ; GET BASE FOR DECIMAL
+UOOCT: MOVEI C,8. ; OCTAL BASE
+ MOVE B,UUOD ; GET ACTUAL WORD TO PRT
+ JRST .+3 ; JOIN CODE
+UODECI: SKIPA C,[10.] ; DECIMAL
+UOOCTI: MOVEI C,8.
+ MOVEM C,BASE'
+ SKIPN A
+ HRREI A,-1 ; A=DIGIT COUNT
+ PUSHJ P,UONUM ; PRINT NUMBR
+ JRST UUORET
+
+UONUM: IDIV B,BASE
+ HRLM C,(P) ; SAVE DIGIT
+ SOJE A,UONUM1 ; DONE IF 0
+ SKIPG A ; + => MORE
+ SKIPE B ; - => B=0 => DONE
+ PUSHJ P,UONUM ; ELSE MORE
+UONUM1: HLRZ C,(P) ; RETREIVE DIGITS
+ ADDI C,"0 ; MAKE TO ASCII
+ CAILE C,"9 ; IS IT GOOD DIG
+ ADDI C,"A-"9-1 ; MAKE HEX DIGIT
+ PUSHJ P,IOTC
+ POPJ P, ; RET
+
+IOTC: PUSH P,A
+ MOVE A,C
+ PUSHJ P,IOTA
+ JRST POPAJ
+
+IOTA: CAIN A,^P
+ JRST IOTAP
+IOTA1:
+IFN ITS,[
+ CAIN A,^J
+ POPJ P,
+ .IOT TYOC,A
+]
+IFE ITS,[
+ PBOUT
+]
+ CAIN A,^I
+ JRST [MOVE A,HPOS
+ ADDI A,10
+ ANDI A,7770
+ MOVEM A,HPOS
+ POPJ P,]
+ AOS HPOS
+ CAIE A,^M
+ POPJ P,
+ SETZM HPOS
+ POPJ P,
+IOTAP:
+IFN ITS,[
+ .IOT TYOC,["^]
+ ADDI A,100
+ JRST IOTA1
+]
+IFE ITS,[
+ POPJ P,
+]
+
+POPAJ: POP P,A
+ POPJ P,
+
+IFN ITS,[
+COMBAT: SETOM COMSW
+ JUMPL A,COMTTO
+ .CALL [SETZ
+ SIXBIT /OPEN/
+ 5000,,1
+ MOVEI TYOC
+ SETZ [SIXBIT /NUL/]]
+ JRST LOST0
+ JRST STARTX
+COMTTO: .CALL TTYOPN
+ .VALUE
+ .CALL [SETZ
+ SIXBIT /TTYGET/
+ MOVEI TYOC
+ MOVEM A
+ MOVEM B
+ SETZM C]
+ .LOSE 1000
+ TLO C,%TSMOR
+ .CALL [SETZ
+ SIXBIT /TTYSET/
+ MOVEI TYOC
+ A
+ B
+ SETZ C]
+ .LOSE 1000
+ .BREAK 16,100000
+ JRST STARTX
+]
+
+LOST0: MOVEI B,EINTER
+LOST: SKIPE COMSW
+ MOVE A,B
+ HALT
+
+
+; DISGUSTITUDE, R.E. MANIFESTS, ETC.
+
+INATOM: 0
+
+ATOM: SETZM WINNER
+ SETZM DEPTH
+ MOVEI ATOM1
+ MOVEM ACTIV
+ATOMSK: MOVE CH,[440700,,WRDBUF]
+ATOM1: NXTCHR C
+ SKIPE SKIPPR
+ JRST ATOM3
+ SETOM FUDGE ;TAA 5/31/78 OTHERWISE GOT DEPTH COUNT OFF
+ SKIPN DEPTH
+ PUSHJ P,GETSTT
+ATOM3: SKIPE QUOTSW
+ JRST AEXCLQ ;QUOTE SWITCH SET. CHECK FOR !"\\
+ CAIN C,"\
+ JRST AQUOTE ;QUOTE ONE CHARACTER
+ CAIN C,""
+ JRST ASTRIN ;TOGGLE STRSW AND CHECK FOR !"
+ CAIN C,"!
+ JRST AEXCL ;TOGGLE EXCLSW
+ SKIPE STRSW
+ JRST ATOM2 ;INSIDE STRING. IGNORE BRACKETS, ETC..
+ CAILE C,40
+ JRST ABRACK
+ CAIE C,40 ;SEP ROUTINE INCLUDED HERE FOR SPEED
+ CAIN C,TAB
+ JRST APAD
+ CAIE C,CR
+ CAIN C,LF
+ JRST APAD
+ CAIN C,FF
+ JRST APAD
+ABRACK: CAIE C,"< ;DO THE RIGHT THING WITH BRACKETS
+ CAIN C,"(
+ JRST APUSH
+ CAIE C,"[
+ CAIN C,"{
+ JRST APUSH
+ CAIE C,")
+ CAIN C,"}
+ JRST APOP
+ CAIE C,">
+ CAIN C,"]
+ JRST APOP
+ CAIN C,"'
+ JRST APAD
+ CAIN C,54
+ JRST NOATM
+ CAIE C,"#
+ CAIN C,".
+ JRST NOATM
+ATMCHR: SETOM INATOM
+ IDPB C,CH
+ATOM2: SETZM QUOTSW ;CLEAR RANDOM ONCE ONLY SWITCHES
+ SETZM EXCLSW
+ SETZM SPACSW
+ JRST ATOM1 ;NEXT
+
+NOATM: SKIPE INATOM
+ JRST ATMCHR
+ JRST ATOM2
+
+APUSH: AOS DEPTH
+ JRST APAD
+
+APOP: SOSLE DEPTH
+ JRST APAD
+ JRST POPJ1
+
+AEXCLQ: CAIN C,"\
+ SKIPN EXCLSW
+ JRST ATOM2
+ SETZM EXCLSW
+ JRST AQUOTE
+
+;COME HERE IF CHARACTER IS A SEPARATOR.
+
+APAD: SKIPE SPACSW ;HACK SEPARATORS CORRECTLY
+ JRST ATOM1
+ SETOM SPACSW
+ SKIPE INATOM
+ PUSHJ P,ATMHAK
+APAD1: SETZM INATOM
+ SETZM QUOTSW
+ SETZM EXCLSW
+ JRST ATOM1
+
+ATMHAK: PUSH P,A
+ SETZ B,
+ IDPB B,CH
+ MOVE B,[440700,,CMNBUF]
+ MOVE A,[440700,,WRDBUF]
+ MOVE CH,A
+ SKIPN WRDBUF
+ JRST POPAJ
+ MOVEI C,3
+ IDPB C,CMNPTR
+ PUSHJ P,ATMLKP
+ JRST POPDAJ
+ MOVE C,LSTTYP
+ CAILE C,1
+ JRST POPDAJ
+ MOVE A,OBJCNT
+ CAMN A,OBJSAV'
+ JRST POPDAJ
+ PUSH P,D
+ PUSHJ P,CHGOBJ
+ MOVEM A,OBJSAV
+ POP P,C
+ CAIN C,NMNPAD
+ MOVEI A,[ASCIZ / [New MANIFEST = /]
+ CAIN C,MACPAD
+ MOVEI A,[ASCIZ / [Changed MACRO = /]
+ CAIN C,CMNPAD
+ MOVEI A,[ASCIZ / [Changed MANIFEST = /]
+ CAIN C,ASKPAD
+ MOVEI A,[ASCIZ / [Requested ATOM = /]
+ OASC (A)
+ OASC WRDBUF
+ OASCR [ASCIZ /]/]
+ JRST POPDAJ
+
+POPDAJ: DBP CMNPTR
+ JRST POPAJ
+
+; LOOKUP ROUTINE FOR CHANGED MANIFESTS/MACROS
+; SIMILAR TO ENTLKP EXCEPT FOR PAD CODES
+
+ATMLKP: PUSH P,A
+ ILDB C,A
+ JUMPE C,POPAJ
+ATMLP: ILDB D,B
+ CAIN D,3
+ JRST POPAJ
+ SKIPA A,(P)
+ATMLP1: ILDB D,B
+ ILDB C,A
+ CAME C,D
+ JRST ATMLP2
+ JUMPN C,ATMLP1
+ ILDB D,B
+POPAJ1: POP P,A
+POPJ1: AOS (P)
+CPOPJ: POPJ P,
+
+ATMLP2: ILDB C,B
+ CAIN C,3
+ JRST POPAJ
+ JUMPN C,ATMLP2
+ ILDB C,B
+ JRST ATMLP
+
+WRDBUF: BLOCK 10.
+
+;HANDLE EXCL
+
+AEXCL: SKIPE STRSW
+ JRST ATOM2
+ SETOM EXCLSW
+ JRST ATOM1
+
+;HANDLE STRINGAGE
+
+ASTRIN: SKIPE EXCLSW
+ JRST AQUOTE ;MUST BE !"X
+ SETCMM STRSW ;ELSE TOGGLE STRING MODE
+ JRST ATOM2 ;NO. CONTINUE
+
+;QUOTE A CHARACTER
+
+AQUOTE: SETOM QUOTSW
+ JRST ATOM1
+
+ END START
\ No newline at end of file