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: CALLI 0 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,"_" 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 CRFL: 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 ;ROUTINES FOR OUTPUTING ERROR MESSAGES ERRO: SKIPA 11,[[ASCIZ /?OUTPUT INITIALIZATION ERROR/]] ERRS: MOVEI 11,[ASCIZ /?FILES 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, ;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, ;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 NAME1: 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,[XWD 700,AZD+1] ;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,"_" ;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. DEVICE: 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 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