--- /dev/null
+TITLE BINCOM V.003
+ XALL
+ LIST
+
+JOBVER=137
+LOC JOBVER
+3
+RELOC
+
+CTL==0
+IN1==1
+IN2==2
+
+ACDEV=1
+ACFILE=2
+ACEXT=3
+ACDEL=4
+ACPNTR=5
+C=7 ;CHARACTER FOR PROCESSING
+PP=17 ;PUSH DOWN POINTER
+LPDL=20
+
+COMP: CLOSE CTL,
+ RELEAS CTL,
+ RELEAS IN1,
+ RELEAS IN2,
+COMPGO: RESET
+ SETZM PPSET ;THIS IS THE ZERO WHICH WILL
+ ;BE "BLT"ED TO CLEAR STORAGE
+ MOVE [XWD PPSET,PPSET+1] ;ZERO STORAGE AREA
+ BLT ENDP-1
+ MOVE PP,[IOWD LPDL,PPSET+1] ;SET UP PUSH DOWN LIST
+ MOVSI (SIXBIT /REL/)
+ MOVEM INDIR1+1
+ MOVEM INDIR2+1
+ MOVSI (SIXBIT /TTY/)
+ MOVEM OUTDEV
+ SETZM AZD
+ PUSHJ PP,INITTY
+ PUSHJ PP,CRFL
+ MOVEI 10,"*" ;TELL USER WE ARE READY FOR COMMAND
+ IDPB 10,CTOBUF+1
+ OUTPUT CTL, ;OUT GOES THE "*"
+ INPUT CTL, ;HERE COMES THE COMMAND STRING
+ PUSHJ PP,NAME1 ;ANALYIZE OUTPUT DEVICE AND NAME
+ CAIE C,137
+ JRST INDEV+1
+ JUMPE ACDEV,INDEV
+ MOVE 13,AZDEV ;GET ASCII NAME OF OUTPUT DEVICE
+ MOVEM 13,AZD ;SAVE IT SO IT WON'T BE
+ MOVE 13,AZDEV+1 ;DESTROYED BY INPUT NAMES
+ MOVEM 13,AZD+1
+ MOVEM ACDEV,OUTDEV
+ MOVEM ACFILE,OUTDIR ;PUT SIXBIT FILE NAME IN
+ MOVEM ACEXT,OUTDIR+1 ;AND EXTENSION
+INDEV: PUSHJ PP,NAME1 ;GET INPUT FROM COMMAND
+ JUMPN ACDEV,.+4
+ HRLI ACDEV,(SIXBIT/DSK/)
+ MOVE 13,[ASCIZ/DSK/]
+ MOVEM 13,AZDEV
+ MOVEM ACDEV,INDEV1
+ MOVEM ACDEV,INDEV2
+ MOVEM ACFILE,INDIR1
+ SKIPE ACEXT
+ MOVEM ACEXT,INDIR1+1
+ INIT IN1,14
+INDEV1: SIXBIT /DSK/
+ XWD INBUF1
+ JRST ERRI
+ INBUF IN1,2 ;DO LOOKUP ON FIRST FILE NAME
+ LOOKUP IN1,INDIR1
+ JRST ERRIA ;ERROR RETURN
+ PUSHJ PP,NAME1
+ SKIPN ACDEV
+ MOVE ACDEV,INDEV1
+ MOVEM ACDEV,INDEV2
+ MOVEM ACFILE,INDIR2
+ SKIPE ACEXT
+ MOVEM ACEXT,INDIR2+1
+ INIT IN2,14
+INDEV2: SIXBIT /DSK/
+ XWD INBUF2
+ JRST ERRI
+ INBUF IN2,2 ;LOOKUP ON SECOND FILE NAME
+ LOOKUP IN2,INDIR2
+ JRST ERRIA
+ MOVE 13,INDEV1 ;GET INPUT DEV
+ CAME 13,INDEV2 ;SAME FOR BOTH?
+ JRST .+6
+ CALLI 13,4
+ AND 13,[200000000000]
+ HLRZ 13,13
+ CAIE 13,200000
+ JRST ERRS
+ INIT CTL,0
+OUTDEV: 0
+ XWD CTOBUF,0
+ JRST ERRA
+ MOVE 13,OUTDEV
+ CALLI 13,4
+ TLNN 13,1
+ JRST ERRO
+ ENTER OUTDIR
+ JRST ERRO
+ OUTPUT CTL,
+ MOVEI 16,0
+MAIN: PUSHJ PP,GCHAR1 ;GET NEXT CHARACTER
+ JRST MAIN1 ;ERROR FINISH
+ PUSHJ PP,GCHAR2 ;GET SECOND FILE.
+ JRST MAIN2
+ CAME 1,2 ;CHECK IF SAME.
+ PUSHJ PP,DIFF
+ AOJA 16,MAIN ;COUNT RECORDS.
+
+; PRINT OUT DIFFERENCE REPORT.
+DIFF: AOS 0,ERRCNT ;CHARACTERS DIFFER, INCREASE COUNT
+ HRLZ 11,16 ;PRINT OUT LOCATION.
+ PUSHJ PP,OCTOUT
+ MOVE 11,1 ;PRINT FIRST ONE
+ PUSHJ PP,SPTOCT
+ MOVE 11,2 ;PRINT SECOND ONE
+ PUSHJ PP,SPTOCT
+ MOVE 11,1 ;PRINT OUT DIFFERENCE
+ XOR 11,2
+ PUSHJ PP,SPTOCT
+ JRST CRFL
+
+; HANDLE END OF FILES.
+MAIN1: PUSHJ PP,GCHAR2 ;END OF FILE 1.
+ JRST MAIN3
+ SETZM 1 ;COMPARE TO ZERO
+ CAME 1,2
+ PUSHJ PP,DIFF
+ AOJA 16,MAIN1
+
+MAIN2: SETZM 2 ;END OF FILE 2.
+ CAME 1,2 ;COMPARE TO ZERO
+ PUSHJ PP,DIFF
+ PUSHJ PP,GCHAR1
+ JRST MAIN3
+ AOJA 16,MAIN2
+MAIN3: SKIPE 0,ERRCNT
+ JRST COMP
+ MOVEI 11,[ASCIZ /NO ERRORS ENCOUNTERED/]
+ JRST ERROUT
+
+\fCRFL: MOVEI 10,15 ;OUTPUT A CARRIAGE RETURN-LINE FEED
+ PUSHJ PP,TYO
+ MOVEI 10,12
+
+TYO: SOSG CTOBUF+2 ;DECREMENT BUFFER COUNT
+ OUTPUT CTL, ;BUFFER WAS EMPTY
+DEP: IDPB 10,CTOBUF+1 ;DEPOSIT CHAR
+ CAIN 10,12 ;CHECK IF LINE FEED.
+ OUTPUT CTL,
+ POPJ PP,
+
+OCTOUT: MOVEI 12,6 ;NUMBER OF CHARACTERS TO CONVERT
+ MOVEI 10,0 ;RESULTS
+ LSHC 10,3 ;DOUBLE SHIFT LEFT, 11.
+ ADDI 10,"0"
+ PUSHJ PP,TYO
+ SOJG 12,.-4 ; UNTIL COUNT REACHED.
+ POPJ PP,
+
+SPCOUT: MOVEI 10," " ;TYPE OUT A SPACE
+ JRST TYO
+
+TABOUT: MOVEI 10,11 ;TYPE OUT A TAB
+ JRST TYO
+
+SPTOCT: PUSHJ PP,TABOUT ;PRINT OUT NUMBER IN SPLIT OCTAL
+ PUSHJ PP,OCTOUT
+ PUSHJ PP,SPCOUT
+ JRST OCTOUT
+
+\f;ROUTINES FOR OUTPUTING ERROR MESSAGES
+ERRO: SKIPA 11,[[ASCIZ /?OUTPUT INITIALIZATION ERROR/]]
+ERRS: MOVEI 11,[ASCIZ /?FILE BEING COMPARED ON SAME INPUT DEVICE/]
+ERROUT: PUSHJ 17,TYPMSG
+ JRST CARR
+
+TYPMSG: PUSHJ PP,INITTY ;INITIALIZE TTY
+ PUSHJ PP,CRFL ;OUTPUT A CARRIAGE RETURN
+ TLOA 11,(POINT 7,,) ;THIS IS POINTER FOR ERROR MESSAGE
+TYPMS1: PUSHJ PP,TYO ;OUTPUT CHAR.
+ ILDB 10,11 ;LOAD A CHAR. FROM ERROR MESSAGE
+ JUMPN 10,TYPMS1 ;ALL ERROR MESSAGES END WITH A ZERO
+ POPJ PP, ;THROUGH WITH ERROR MESSAGE
+
+CARR: PUSHJ PP,CRFL ;COMMON EXIT FOR ERROR MESSAGES
+ PUSHJ PP,CRFL
+ JRST COMP
+
+;INITIALIZE TTY FOR ERROR MESSAGES
+INITTY: CLOSE CTL
+ RELEAS CTL
+ INIT CTL,1
+ SIXBIT /TTY/
+ XWD CTOBUF,CTIBUF
+ HALT
+ INBUF CTL,1
+ OUTBUF CTL,1
+ OUTPUT CTL,
+ POPJ PP,
+
+\f;ROUTINE TO GET NEXT CHARACTER
+GCHAR1: SOSG 0,INBUF1+2
+ JRST GCH1FL ;FILL BUFFER IF EMPTY
+ SKIPN 0,INBUF1+2
+ JRST .-2 ; TRY AGAIN
+ ILDB 1,INBUF1+1
+ JRST GCH1OK
+GCH1FL: INPUT IN1, ;INPUT FOR FILE 1
+ STATO IN1,762000 ;ERRORS OR END OF FILE?
+ JRST GCHAR1+2 ;NO
+ STATO IN1,742000 ;YES, EOF?
+ POPJ PP,
+ MOVEI 11,[ASCIZ /?FILE 1 READ ERROR/]
+ JRST ERROUT
+GCH1OK: AOS 0,(PP)
+ POPJ PP,
+
+GCHAR2: SOSG 0,INBUF2+2
+ JRST GCH2FL ;FILL BUFFER IF EMPTY
+ SKIPN 0,INBUF2+2
+ JRST .-2 ; TRY AGAIN
+ ILDB 2,INBUF2+1
+ JRST GCH2OK
+GCH2FL: INPUT IN2,
+ STATO IN2,762000
+ JRST GCHAR2+2
+ STATO IN2,742000
+ POPJ PP,
+ MOVEI 11,[ASCIZ /?FILE 2 READ ERROR/]
+ JRST ERROUT
+GCH2OK: AOS 0,(PP)
+ POPJ PP,
+
+\f;THE CODE ON THIS PAGE IS FOR HANDLING INPUT ERRORS
+;THERE ARE TWU TYPES OF ERRORS--EITHER THE FILE IS NOT FOUND
+;OR THE DEVICE IS NOT AVAILABLE--THE FORMAT FOR THESE MESSAGES
+;IS THE SAEM FORMAT USED FOR THE "TECO" MESSAGES.
+
+ERRA: MOVE 13,AZD
+ MOVEM 13,AZDEV
+ MOVE 13,AZD+1
+ MOVEM 13,AZDEV+1
+ JRST ERRI
+
+ERRIA: MOVEI 11,[ASCIZ /?INPUT ERROR.../]
+ PUSHJ PP,TYPMSG ;TYPE FIRST PART OF MESSAGE
+ MOVEI 11,AZFIL ;ADR. OF ASCII FILE NAME
+ PUSHJ PP,TYPMS1-1 ;TYPE FILE NAME
+ SKIPN 0,AZEXT ;IS THERE AN EXTENSION
+ JRST NOEXT ;NO EXTENSION
+ MOVEI 10,"." ;FOR EXTENSION
+ XCT DEP ;THIS PUTS IT IN
+ MOVEI 11,AZEXT ;GET ADR OF ASCII EXTENSION
+ PUSHJ PP,TYPMS1-1
+NOEXT: MOVEI 11,[ASCIZ / FILE NOT FOUND/] ;FINISH MESSAGE
+ PUSHJ PP,TYPMS1-1
+ JRST CARR ;THIS WILL OUTPUT TWO C.R. AND EXIT
+
+ERRI: MOVEI 11,[ASCIZ /?DEVICE /]
+ PUSHJ PP,TYPMSG ;TYPE BEGINNING OF MESSAGE
+ MOVEI 11,AZDEV ;ADR OF DEVICE NAME
+ PUSHJ PP,TYPMS1-1 ;OUTPUT DEVICE NAME
+ MOVEI 11,[ASCII / NOT AVAILABLE/]
+ PUSHJ PP,TYPMS1-1 ;TYPE REST OF MESSAGE
+ JRST CARR ;INSERT CARRIAGE RETURNS AND EXIT
+
+\fNAME1: SETZB ACDEV,AZDEV ;ZERO THE REGISTERS WHICH WILL RETURN THE NAMES
+ SETZB ACDEL,AZFIL
+ SETZM AZTEM
+ SETZB ACFILE,AZEXT
+ SETZB ACEXT,AZTEM+1
+
+NAME3: MOVE 16,[POINT 7,AZTEM] ;THIS IS A POINTER FOR DEPOSITING THE
+ ;ASCII CHARACTERS IN CASE AN INPUT
+ ;ERROR IS DECTECTED--FOR THEN WE WILL
+ ;HAVE TO PRINT THESE NAMES OUT
+ MOVSI ACPNTR,(POINT 6,0) ;SET POINTER
+ SETZ 13,
+ MOVEI 0,0 ;THE SIXBIT NAME WILL BE STORED IN THE AC0
+
+GETIOC: PUSHJ PP,TTYIN ;GET INPUT CHARACTER
+ CAIN C,":" ;HAVE WE BEEN GETTING A DEVICE NAME
+ JRST DEVICE ;YES
+ CAIN C,"." ;OR A FILE NAME
+ JRST NAME ;YES
+ CAIN C,"," ;THIS IS ANOTHER WAY TO GET A FILE NAME
+ JRST TERM
+ CAIE C,137 ;ONE KIND OF SEPERATOR
+ CAIG C,15 ;THIS ALSO MEANS WE HAVE FINISHED A TERM
+ JRST TERM ;TERM HAAS BEEN READ
+ SUBI C,40 ;CONVERT TO 6-BIT
+ TLNE ACPNTR,770000 ;HAVE WE STORED SIX BYTES?
+ IDPB C,ACPNTR ;NO, STORE IT
+ ADDI C,40 ;CONVERT BACK TO ASCII FOR ERROR MESSAGES.
+ IDPB C,16 ;STORE IN AC13
+ JRST GETIOC ;GET ANOTHER CHAR.
+
+\fDEVICE: MOVE 13,AZTEM
+ MOVEM 13,AZDEV ;STORE ASCII DEVICE NAME
+ MOVE 13,AZTEM+1
+ MOVEM 13,AZDEV+1
+ MOVE ACDEV,0
+ JRST .+6
+NAME: MOVE ACFILE,0 ;FILE NAME
+ MOVE 13,AZTEM
+ MOVEM 13,AZFIL ;STORE ASCII NAME
+ MOVE 13,AZTEM+1
+ MOVEM 13,AZFIL+1
+ SETZM AZTEM
+ SETZM AZTEM+1
+ MOVE ACDEL,C ;SET DELIMITER
+ JRST NAME3 ;GET NEXT SYMBOL
+
+TERM: CAIN ACDEL,0 ;IF NO PREVIOUS DELIMITOR, OR
+ JRST .+3
+ CAIE ACDEL,":" ;IF PREVIOUS DELIMITER
+ JRST TERM1
+ MOVE 13,AZTEM
+ MOVEM 13,AZFIL
+ MOVE 13,AZTEM+1
+ MOVEM 13,AZFIL+1
+ SETZM AZTEM
+ SETZM AZTEM+1
+ MOVE ACFILE,0 ;SET FILE
+TERM1: CAIE ACDEL,"." ;IF PERIOD,
+ POPJ PP,
+ MOVE 13,AZTEM
+ MOVEM 13,AZEXT ;STORE ASCII EXTENSION
+ HLLZ ACEXT,0 ;SET EXTENSION
+ POPJ PP, ;EXIT
+
+TTYIN: ILDB C,CTIBUF+1 ;GET CHARACTER
+ CAIE C,40 ;SKIP BLANKS
+ CAIN C,11 ;AND TABS
+ JRST TTYIN
+ POPJ PP, ;NO, EXIT
+\f
+PPSET: BLOCK 20
+INDIR1: BLOCK 4
+INDIR2: BLOCK 4
+AZD: BLOCK 2 ;OUTPUT FILE NAME
+AZTEM: BLOCK 2
+AZFIL: BLOCK 2 ;FOR ASCII FILE NAME
+AZDEV: BLOCK 2 ;FOR ASCII DEVICE NAME
+AZEXT: BLOCK 1 ;FOR ASCII EXTENSION
+CTIBUF: BLOCK 3
+CTOBUF: BLOCK 3
+INBUF1: BLOCK 3
+INBUF2: BLOCK 3
+ERRCNT: BLOCK 1
+OUTDIR: BLOCK 4
+ ENDP:
+ END COMPGO