/ BINCMP.PA / DO A WORD-BY-WORD COMPARISON BETWEEN THE CONTENTS / OF IN-MEMORY LOCATIONS AND WHAT BINARY LOADER / WOULD HAVE LOADED INTO THOSE SAME LOCATIONS BASED / ON WHAT IS ON AN INCOMING BINARY FORMAT PAPER TAPE. / ALL DIFFERENCES ARE REPORTED, INCLUDING ADDRESS, / IN-MEMORY CONTENTS, AND TAPE CONTENTS. IF NO / DIFFERENCES ARE FOUND, THAT IS REPORTED. / / VERSION OF 15-MAR-2020 / / / BUILD NOTES: / TO ASSEMBLE, BUILD, SAVE: / / .R PAL8 / *BINCMP (000)? JMP SKPLDR / YES: SKIP OVER IT / (THE PIDP-8/I (SIMH) HACK) TAD M200 / NO: SNA CLA / EARLIEST CHAR IS LEADER (200)? JMP SKPLDR / YES: SKIP OVER IT CKFLD, TAD CHAR0 / EARLIEST CHAR IS NOT LEADER TAD M300 SPA CLA / IS IT A FIELD SETTING (3X0)? JMP CKADDR / NO: SEE WHAT ELSE IT MIGHT BE ISFLD, TAD CHAR0 / YES: GET THE NEW FIELD SETTING AND K70 TAD CDF0 DCA CDFCMP / SAVE THE NEW FIELD SETTING JMP RDNEXT / CONTINUE READING INPUT TAPE CKADDR, TAD CHAR0 / IT IS NOT A FIELD SETTING TAD M100 SPA CLA / IS IT AN ADDRESS SETTING (1XX)? JMP CKDATA / NO: IT MUST BE DATA OR CHKSUM ISADDR, ASSMBL / YES: ... DCA MEMADR / ... SAVE THE NEW ADDRESS JMP RDNEXT / CONTINUE READING INPUT TAPE CKDATA, TAD CHAR2 / IT IS NOT A FIELD OR AN ADDRESS TAD M200 SNA CLA / IS LOOKAHEAD CHARACTER TRAILER? JMP ISTRLR / YES: DONE READING TAPE DATA ISDATA, ASSMBL / NO: MUST STILL BE REAL DATA DCA DATAWD / SAVE IN CASE OF MISMATCH TAD DATAWD / PREPARE TO COMPARE MEMORY, TAPE CIA CDFCMP, HLT / GET MEMORY WORD FROM RIGHT FIELD TAD I MEMADR SZA CLA / DOES MEMORY WORD MATCH TAPE? ISDIFF / NO: NOTIFY USER OF DIFFERENCE NEXTWD, ISZ MEMADR / YES: POINT TO NEXT MEMORY ADDRESS NOP / BE SAFE FOR WRAP AT ADDRESS X7777 RDNEXT, READC / READ THE NEXT INPUT TAPE CHAR JMP CKFLD / CONTINUE PROCESSING INPUT TAPE ISTRLR, TAD CHAR0 / LOOK AHEAD CHAR2 IS TRAILER (200) CLL RTL / TAPE CHECKSUM HIGH NOW IN *CHAR0 RTL RTL TAD CHAR1 / TAPE CHECKSUM LOW NOW IN *CHAR1 DCA TAPSUM / SAVE CHECKSUM READ FROM TAPE TAD TAPSUM CIA TAD CHKSUM SNA CLA / TAPE CHECKSUM = COMPUTED CHECKSUM? JMP GOODCS / YES: NO CHECKSUM ERROR BADCS, PRNTLN / NO: COMPLAIN ABOUT CHECKSUM ERROR CSERR0 TAD TAPSUM WRITEW / SHOW CHECKSUM FROM TAPE PRNTLN CSERR1 TAD CHKSUM WRITEW / SHOW COMPUTED CHECKSUM PRNTLN NEWLN GOODCS, TAD NODIFS SNA CLA / FOUND ANY DIFFERENCES? JMP DONE / YES: THEY CAN SEE THE DIFFS PRNTLN / NO: NOTIFY OF NO DIFFS FOUND NODIFF DONE, PRNTLN / NOTIFY THAT COMPARE IS FINISHED FINISH HLT JMP START / IF THEY WANT TO GO AGAIN ... / FUNCTION ISDIFF / REPORT THAT A DIFFERENCE WAS FOUND BETWEEN MEMORY, TAPE / / REQUIRES / MEMORY ADDRESS OF DIFFERENCE IS IN *MEMADR / DATA WORD READ FROM BINARY TAPE IS IN *DATAWD / FUNCTION ISDIFF MUST BE ON SAME PAGE AS *CDFCMP / GUARANTEES / IF NO PREVIOUS DIFFERENCES HAVE BEEN FOUND / THEN A DIFFERENCE HEADER HAS BEEN PRINTED / THIS ONE DIFFERENCE HAS BEEN REPORTED / IF THE USER WANTS TO HALT BETWEEN DIFFERENCES / THEN WAIT UNTIL THEY ARE READY TO CONTINUE / NO DIFFERENCES FLAG HAS BEEN CLEARED / ISDIFX, 0 TAD NODIFS SNA CLA / ALREADY FOUND ANY DIFFERENCES? JMP RPTDIF / YES: JUST GO TO REPORT THIS ONE PRNTLN / NO: PRINT OUT DIFFERENCES HEADER DIFHD1 PRNTLN DIFHD2 RPTDIF, DCA NODIFS / CLEAR NO DIFFERENCES FLAG PRNTLN / LEAD OFF WITH ONE SPACE SPACE1 TAD CDFCMP RTR RAR WRITED / WRITE MEMORY FIELD DIGIT TAD MEMADR WRITEW / WRITE MEMORY ADDRESS DIGITS PRNTLN / ADD 6 SPACES SPACE6 TAD CDFCMP DCA .+1 HLT / GET DATA WORD FROM CORRECT FIELD TAD I MEMADR WRITEW / WRITE MEMORY DATA WORD DIGITS PRNTLN / ADD ANOTHER 8 SPACES SPACE8 TAD DATAWD WRITEW / WRITE TAPE DATA WORD DIGITS PRNTLN / , NEWLN OSR AND K2000 SNA CLA / CONTINUE REPORTING DIFFERENCES? HLT / NO: STOP FOR NOW JMP I ISDIFX / CONTINUE PAGE / FUNCTION COPY / COPY BINCMP FROM ITS CURRENT FIELD INTO THE USER- / SPECIFIED FIELD / / REQUIRES / FIELD TO COPY INTO ACTUALLY EXISTS IN COMPUTER / SR BITS 6-8 (00X0) IDENTIFY FIELD TO COPY INTO / DON'T COPY THROUGH ADDRESS X7777 / GUARANTEES / BINCMP HAS BEEN COPIED INTO THE SPECIFIED FIELD / PC = X0200 FOR EASY RE-START / COPY, CLA CLL RIF TAD CDF0 DCA FRMFLD / SET WHAT FIELD TO COPY FROM OSR AND K70 TAD CDF0 DCA TOFLD / SET WHAT FIELD TO COPY TO DCA CPYPTR / START COPYING AT X0000 TAD CPYLEN DCA CPYCNT / SET HOW MANY LOCATIONS TO COPY FRMFLD, HLT / SET TO THIS DATA FIELD TAD I CPYPTR / GET THIS WORD TOFLD, HLT / SET TO DESTINATION FIELD DCA I CPYPTR / PUT THIS WORD ISZ CPYPTR / POINT AT NEXT WORD ISZ CPYCNT / DONE COPYING? JMP FRMFLD / NO: GO COPY MORE TAD TOFLD / YES: PREPARE TO GO THERE AND K70 TAD CIFDF0 DCA GOFLD / SET WHICH FIELD TO GO TO GOFLD, HLT JMP I .+1 / GO TO THE PRE-START ADDRESS PSTART CPYLEN, -END CPYCNT, 0 CPYPTR, 0 / FUNCTION READC / READ THE NEXT CHAR FROM THE SELECTED INPUT PAPER / TAPE READER, EITHER TTY: OR PTR: / / REQUIRES / NONE / GUARANTEES / IF *READER = 4000 / THEN THE NEXT CHARACTER HAS BEEN READ FROM / THE HI-SPEED READER (PTR:) / OTHERWISE THE NEXT CHAR HAS BEEN READ FROM / THE LOW-SPEED READER (TTY:) / THE INPUT TAPE HAS ADVANCED ONE CHARACTER / THE LOOK-AHEAD QUEUE HAS BEEN SHIFTED ONE CHAR / THE CHARACTER JUST READ IS IN *CHAR2 / RETURNS WITH AC=0, L=0 / READCX, 0 CLA CLL TAD CHAR1 / SHIFT THE LOOK-AHEAD QUEUE DCA CHAR0 TAD CHAR2 DCA CHAR1 TAD READER SPA CLA / READ FROM WHICH TAPE READER? JMP RDHSPD / HIGH SPEED: RDLSPD, KSF / LOW SPEED: JMP .-1 / WAIT FOR LOW SPEED READER KRB / GET THE CHARACTER, ADVANCE JMP RDDUN RDHSPD, RSF JMP .-1 / WAIT FOR HIGH SPEED READER RRB RFC / GET THE CHARACTER, ADVANCE RDDUN, DCA CHAR2 / SAVE WHAT GOT READ IN QUEUE JMP I READCX / FUNCTION ASSMBL / ASSEMBLE A FULL WORD FROM HALVES IN *CHAR0, *CHAR1 IN THE / LOOK-AHEAD QUEUE, WHILE ADDING TO THE RUNNING CHECKSUM / / REQUIRES / HIGH HALF OF WORD TO ASSEMBLE IS IN 00XX OF *CHAR0 / LOW HALF OF WORD TO ASSEMBLE IS IN 00XX OF *CHAR1 / GUARANTEES / OLD *CHAR0, *CHAR1 HAVE BEEN ADDED TO RUNNING CHECKSUM / OLD *CHAR0 HAS BEEN SHIFTED OUT OF THE LOOK-AHEAD QUEUE / OLD *CHAR1 IS NOW IN *CHAR0 / OLD *CHAR2 IS NOW IN *CHAR1 / NEXT CHARACTER READ FROM TAPE IS IN *CHAR2 / ASSEMBLED WORD IS RETURNED IN AC / ASSMBX, 0 CLA CLL TAD CHAR0 TAD CHKSUM DCA CHKSUM / ADD HIGH HALF TO RUNNING CHECKSUM TAD CHAR0 AND K77 CLL / CLEAR LINK TO BE SAFE RTL RTL RTL DCA ASMTMP / SAVE HIGH HALF OF FULL WORD READC / MOVE THE LOOK-AHEAD QUEUE TAD CHAR0 TAD CHKSUM DCA CHKSUM / ADD LOW HALF TO RUNNING CHECKSUM TAD CHAR0 TAD ASMTMP / COMBINE HIGH & LOW HALVES JMP I ASSMBX ASMTMP, 0 / FUNCTION PRNTLN / PRINT A STRING OF 6-BIT PACKED TEXT ON THE CONSOLE (TTY:) / / REQUIRES / *CALL+1 IS IN-THIS-FIELD ADDRESS OF THE PACKED TEXT / STRING TO PRINT / PACKED TEXT STRING TO PRINT IS TERMINATED BY A / BYTE / GUARANTEES / PACKED TEXT STRING HAS BEEN PRINTED / AC, LINK = 0, DATA FIELD = THIS FIELD / RETURNS TO CALL+2 / PRTLNX, 0 CLA CLL TAD CDFTHS DCA .+1 HLT / GET TEXT OUT OF THIS DATA FIELD CLA CMA TAD I PRTLNX / MAKE ADDRESS-1 OF TEXT STRING DCA PRTPTR / SAVE IT IN AN AUTO-INDEX REG NEXTC, TAD I PRTPTR / GET NEXT FULL WORD OF STRING DCA PRTTMP / SAVE IT TAD PRTTMP RTR / FIRST CHARACTER IS IN HIGH BYTE RTR RTR MKCHAR / TRY TO TURN IT INTO 8-BIT ASCII SNA / END OF STRING (I.E., )? JMP PRNTEX / YES: EXIT PRNTC / NO: PRINT IT TAD PRTTMP / SECOND CHARACTER IS IN LOW BYTE MKCHAR / TRY TO TURN IT INTO 8-BIT ASCII SNA / END OF STRING (I.E., )? JMP PRNTEX / YES: EXIT PRNTC / NO: PRINT IT JMP NEXTC PRNTEX, ISZ PRTLNX / SET NORMAL RETURN ADDRESS JMP I PRTLNX PRTTMP, 0 / FUNCTION MKCHAR / CONVERTS 6-BIT CHARACTER CODE IN AC INTO 8-BIT ASCII / PRESUMABLY FOR PRINTING / / REQUIRES / 6-BIT CHARACTER CODE IN LOW BYTE OF AC (XX00-XX77) / GUARANTEES / WHEN 6-BIT BYTE CODE = 00 / THEN RETURNS WITH AC = 0000 / WHEN 6-BIT BYTE CODE = 37 / THEN PRINTS , RETURNS WITH AC = / WHEN 6-BIT BYTE CODE IS IN 'A' .. 'Z' / THEN RETURNS WITH AC = ASCII 'A' .. 'Z' (ADDS 300) / WHEN 6-BIT BYTE CODE IS NOT IN 'A' .. 'Z' / THEN RETURNS WITH NON-ALPHA ASCII CODE (ADDS 200) / MKCHRX, 0 AND K77 / STRIP OFF HIGH 6 BITS SNA JMP I MKCHRX / ITS A (00), QUICK RETURN DCA MKTMP / SAVE FOR NOW TAD MKTMP TAD M37 SNA CLA / IS IT 37? JMP MKCRLF / YES: OUTPUT TAD MKTMP / NO: TAD M33 SPA CLA / IS IT 'Z' OR LESS? TAD K100 / YES: PUT IT INTO ALPHA RANGE TAD K200 / AT LEAST MAKE IT NON-ALPHA TAD MKTMP JMP I MKCHRX MKCRLF, TAD KCR PRNTC / FORCE THE TAD KLF / MAKE PRNTLN THINK IT GOT JMP I MKCHRX MKTMP, 0 PAGE / FUNCTION WRITEW / WRITES THE WORD IN AC AS 4 OCTAL DIGITS ON THE / CONSOLE (TTY:) / / REQUIRES / AC = WORD VALUE TO PRINT / GUARANTEES / WORD HAS BEEN PRINTED AS 4 OCTAL DIGITS / AC, LINK = 0 / WRITWX, 0 DCA WDTMP / SAVE IT FOR NOW TAD M4 DCA DGTCNT / SET FOR 4 OCTAL DIGITS NXTDGT, TAD WDTMP / RECALL IT RTL RAL / ROTATE 3 RIGHT DCA WDTMP / SAVE IT SO FAR TAD WDTMP / GET IT BACK RAL / ROTATE ONCE MORE WRITED / WRITE THIS DIGIT ISZ DGTCNT / DONE ALL 4 DIGITS? JMP NXTDGT / NO: DO ANOTHER JMP I WRITWX / YES: ALL DONE, RETURN DGTCNT, 0 WDTMP, 0 / FUNCTION WRITED / WRITES THE DIGIT IN AC AS A NUMERIC CHARACTER ON / THE CONSOLE (TTY:) / / REQUIRES / AC = DIGIT TO PRINT (0..7) / GUARANTEES / NUMERIC CHARACTER HAS BEEN PRINTED / AC, LINK = 0 / WRITDX, 0 AND K7 TAD K260 PRNTC JMP I WRITDX / FUNCTION PRNTC / PRINTS THE ASCII CHAR IN AC ON THE CONSOLE (TTY:) / / REQUIRES / AC = ASCII CHAR TO PRINT / GUARANTEES / ASCII CHAR IN AC HAS BEEN PRINTED / AC, LINK = 0 / PRNTCX, 0 TLS TSF JMP .-1 CLA CLL JMP I PRNTCX / TEXT MESSAGE STRINGS (IN 6-BIT PACKED FORMAT) NODIFF, TEXT "_*** NO DIFFERENCES ***_" DIFHD1, TEXT "_ADDRESS MEMORY DATA TAPE DATA_" DIFHD2, TEXT "------- ----------- ---------_" SPACE1, TEXT " " SPACE6, TEXT " " SPACE8, TEXT " " NEWLN, TEXT "_" CSERR0, TEXT "_*** CHECKSUM ERROR ON INPUT TAPE ***_ READ: " CSERR1, TEXT " COMPUTED: " FINISH, TEXT "_DONE_" END=.-1 / MARK THE END SO COPY KNOWS HOW BIG BINCMP IS $