/ BINCMP.PA PAL8-V10D NO DATE PAGE 1 / 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)? 00223 5220 JMP SKPLDR / YES: SKIP OVER IT / (THE PIDP-8/I (SIMH) HACK) 00224 1040 TAD M200 / NO: 00225 7650 SNA CLA / EARLIEST CHAR IS LEADER (200)? 00226 5220 JMP SKPLDR / YES: SKIP OVER IT 00227 1051 CKFLD, TAD CHAR0 / EARLIEST CHAR IS NOT LEADER 00230 1041 TAD M300 00231 7710 SPA CLA / IS IT A FIELD SETTING (3X0)? 00232 5240 JMP CKADDR / NO: SEE WHAT ELSE IT MIGHT BE 00233 1051 ISFLD, TAD CHAR0 / YES: GET THE NEW FIELD SETTING 00234 0021 AND K70 00235 1032 TAD CDF0 00236 3257 DCA CDFCMP / SAVE THE NEW FIELD SETTING 00237 5265 JMP RDNEXT / CONTINUE READING INPUT TAPE 00240 1051 CKADDR, TAD CHAR0 / IT IS NOT A FIELD SETTING 00241 1037 TAD M100 00242 7710 SPA CLA / IS IT AN ADDRESS SETTING (1XX)? 00243 5247 JMP CKDATA / NO: IT MUST BE DATA OR CHKSUM 00244 4455 ISADDR, ASSMBL / YES: ... 00245 3042 DCA MEMADR / ... SAVE THE NEW ADDRESS 00246 5265 JMP RDNEXT / CONTINUE READING INPUT TAPE 00247 1053 CKDATA, TAD CHAR2 / IT IS NOT A FIELD OR AN ADDRESS 00250 1040 TAD M200 00251 7650 SNA CLA / IS LOOKAHEAD CHARACTER TRAILER? 00252 5267 JMP ISTRLR / YES: DONE READING TAPE DATA 00253 4455 ISDATA, ASSMBL / NO: MUST STILL BE REAL DATA 00254 3043 DCA DATAWD / SAVE IN CASE OF MISMATCH 00255 1043 TAD DATAWD / PREPARE TO COMPARE MEMORY, TAPE / BINCMP.PA PAL8-V10D NO DATE PAGE 3-1 00256 7041 CIA 00257 7402 CDFCMP, HLT / GET MEMORY WORD FROM RIGHT FIELD 00260 1442 TAD I MEMADR 00261 7640 SZA CLA / DOES MEMORY WORD MATCH TAPE? 00262 4456 ISDIFF / NO: NOTIFY USER OF DIFFERENCE 00263 2042 NEXTWD, ISZ MEMADR / YES: POINT TO NEXT MEMORY ADDRESS 00264 7000 NOP / BE SAFE FOR WRAP AT ADDRESS X7777 00265 4454 RDNEXT, READC / READ THE NEXT INPUT TAPE CHAR 00266 5227 JMP CKFLD / CONTINUE PROCESSING INPUT TAPE 00267 1051 ISTRLR, TAD CHAR0 / LOOK AHEAD CHAR2 IS TRAILER (200) 00270 7106 CLL RTL / TAPE CHECKSUM HIGH NOW IN *CHAR0 00271 7006 RTL 00272 7006 RTL 00273 1052 TAD CHAR1 / TAPE CHECKSUM LOW NOW IN *CHAR1 00274 3047 DCA TAPSUM / SAVE CHECKSUM READ FROM TAPE 00275 1047 TAD TAPSUM 00276 7041 CIA 00277 1046 TAD CHKSUM 00300 7650 SNA CLA / TAPE CHECKSUM = COMPUTED CHECKSUM? 00301 5314 JMP GOODCS / YES: NO CHECKSUM ERROR 00302 4457 BADCS, PRNTLN / NO: COMPLAIN ABOUT CHECKSUM ERROR 00303 0725 CSERR0 00304 1047 TAD TAPSUM 00305 4461 WRITEW / SHOW CHECKSUM FROM TAPE 00306 4457 PRNTLN 00307 0756 CSERR1 00310 1046 TAD CHKSUM 00311 4461 WRITEW / SHOW COMPUTED CHECKSUM 00312 4457 PRNTLN 00313 0724 NEWLN 00314 1050 GOODCS, TAD NODIFS 00315 7650 SNA CLA / FOUND ANY DIFFERENCES? 00316 5321 JMP DONE / YES: THEY CAN SEE THE DIFFS 00317 4457 PRNTLN / NO: NOTIFY OF NO DIFFS FOUND 00320 0633 NODIFF 00321 4457 DONE, PRNTLN / NOTIFY THAT COMPARE IS FINISHED 00322 0766 FINISH 00323 7402 HLT 00324 5200 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 / BINCMP.PA PAL8-V10D NO DATE PAGE 3-2 / 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 / 00325 0000 ISDIFX, 0 00326 1050 TAD NODIFS 00327 7650 SNA CLA / ALREADY FOUND ANY DIFFERENCES? 00330 5335 JMP RPTDIF / YES: JUST GO TO REPORT THIS ONE 00331 4457 PRNTLN / NO: PRINT OUT DIFFERENCES HEADER 00332 0650 DIFHD1 00333 4457 PRNTLN 00334 0671 DIFHD2 00335 3050 RPTDIF, DCA NODIFS / CLEAR NO DIFFERENCES FLAG 00336 4457 PRNTLN / LEAD OFF WITH ONE SPACE 00337 0712 SPACE1 00340 1257 TAD CDFCMP 00341 7012 RTR 00342 7010 RAR 00343 4462 WRITED / WRITE MEMORY FIELD DIGIT 00344 1042 TAD MEMADR 00345 4461 WRITEW / WRITE MEMORY ADDRESS DIGITS 00346 4457 PRNTLN / ADD 6 SPACES 00347 0713 SPACE6 00350 1257 TAD CDFCMP 00351 3352 DCA .+1 00352 7402 HLT / GET DATA WORD FROM CORRECT FIELD 00353 1442 TAD I MEMADR 00354 4461 WRITEW / WRITE MEMORY DATA WORD DIGITS 00355 4457 PRNTLN / ADD ANOTHER 8 SPACES 00356 0717 SPACE8 00357 1043 TAD DATAWD 00360 4461 WRITEW / WRITE TAPE DATA WORD DIGITS 00361 4457 PRNTLN / , 00362 0724 NEWLN 00363 7404 OSR 00364 0030 AND K2000 00365 7650 SNA CLA / CONTINUE REPORTING DIFFERENCES? 00366 7402 HLT / NO: STOP FOR NOW 00367 5725 JMP I ISDIFX / CONTINUE / BINCMP.PA PAL8-V10D NO DATE PAGE 4 0400 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 / 00400 7300 COPY, CLA CLL 00401 6224 RIF 00402 1032 TAD CDF0 00403 3213 DCA FRMFLD / SET WHAT FIELD TO COPY FROM 00404 7404 OSR 00405 0021 AND K70 00406 1032 TAD CDF0 00407 3215 DCA TOFLD / SET WHAT FIELD TO COPY TO 00410 3233 DCA CPYPTR / START COPYING AT X0000 00411 1231 TAD CPYLEN 00412 3232 DCA CPYCNT / SET HOW MANY LOCATIONS TO COPY 00413 7402 FRMFLD, HLT / SET TO THIS DATA FIELD 00414 1633 TAD I CPYPTR / GET THIS WORD 00415 7402 TOFLD, HLT / SET TO DESTINATION FIELD 00416 3633 DCA I CPYPTR / PUT THIS WORD 00417 2233 ISZ CPYPTR / POINT AT NEXT WORD 00420 2232 ISZ CPYCNT / DONE COPYING? 00421 5213 JMP FRMFLD / NO: GO COPY MORE 00422 1215 TAD TOFLD / YES: PREPARE TO GO THERE 00423 0021 AND K70 00424 1033 TAD CIFDF0 00425 3226 DCA GOFLD / SET WHICH FIELD TO GO TO 00426 7402 GOFLD, HLT 00427 5630 JMP I .+1 / GO TO THE PRE-START ADDRESS 00430 0177 PSTART 00431 7007 CPYLEN, -END 00432 0000 CPYCNT, 0 00433 0000 CPYPTR, 0 / FUNCTION READC / READ THE NEXT CHAR FROM THE SELECTED INPUT PAPER / TAPE READER, EITHER TTY: OR PTR: / / REQUIRES / BINCMP.PA PAL8-V10D NO DATE PAGE 4-1 / 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 / 00434 0000 READCX, 0 00435 7300 CLA CLL 00436 1052 TAD CHAR1 / SHIFT THE LOOK-AHEAD QUEUE 00437 3051 DCA CHAR0 00440 1053 TAD CHAR2 00441 3052 DCA CHAR1 00442 1045 TAD READER 00443 7710 SPA CLA / READ FROM WHICH TAPE READER? 00444 5251 JMP RDHSPD / HIGH SPEED: 00445 6031 RDLSPD, KSF / LOW SPEED: 00446 5245 JMP .-1 / WAIT FOR LOW SPEED READER 00447 6036 KRB / GET THE CHARACTER, ADVANCE 00450 5254 JMP RDDUN 00451 6011 RDHSPD, RSF 00452 5251 JMP .-1 / WAIT FOR HIGH SPEED READER 00453 6016 RRB RFC / GET THE CHARACTER, ADVANCE 00454 3053 RDDUN, DCA CHAR2 / SAVE WHAT GOT READ IN QUEUE 00455 5634 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 / 00456 0000 ASSMBX, 0 00457 7300 CLA CLL 00460 1051 TAD CHAR0 00461 1046 TAD CHKSUM 00462 3046 DCA CHKSUM / ADD HIGH HALF TO RUNNING CHECKSUM 00463 1051 TAD CHAR0 00464 0022 AND K77 / BINCMP.PA PAL8-V10D NO DATE PAGE 4-2 00465 7100 CLL / CLEAR LINK TO BE SAFE 00466 7006 RTL 00467 7006 RTL 00470 7006 RTL 00471 3301 DCA ASMTMP / SAVE HIGH HALF OF FULL WORD 00472 4454 READC / MOVE THE LOOK-AHEAD QUEUE 00473 1051 TAD CHAR0 00474 1046 TAD CHKSUM 00475 3046 DCA CHKSUM / ADD LOW HALF TO RUNNING CHECKSUM 00476 1051 TAD CHAR0 00477 1301 TAD ASMTMP / COMBINE HIGH & LOW HALVES 00500 5656 JMP I ASSMBX 00501 0000 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 / 00502 0000 PRTLNX, 0 00503 7300 CLA CLL 00504 1044 TAD CDFTHS 00505 3306 DCA .+1 00506 7402 HLT / GET TEXT OUT OF THIS DATA FIELD 00507 7240 CLA CMA 00510 1702 TAD I PRTLNX / MAKE ADDRESS-1 OF TEXT STRING 00511 3010 DCA PRTPTR / SAVE IT IN AN AUTO-INDEX REG 00512 1410 NEXTC, TAD I PRTPTR / GET NEXT FULL WORD OF STRING 00513 3334 DCA PRTTMP / SAVE IT 00514 1334 TAD PRTTMP 00515 7012 RTR / FIRST CHARACTER IS IN HIGH BYTE 00516 7012 RTR 00517 7012 RTR 00520 4460 MKCHAR / TRY TO TURN IT INTO 8-BIT ASCII 00521 7450 SNA / END OF STRING (I.E., )? 00522 5332 JMP PRNTEX / YES: EXIT 00523 4463 PRNTC / NO: PRINT IT 00524 1334 TAD PRTTMP / SECOND CHARACTER IS IN LOW BYTE 00525 4460 MKCHAR / TRY TO TURN IT INTO 8-BIT ASCII 00526 7450 SNA / END OF STRING (I.E., )? 00527 5332 JMP PRNTEX / YES: EXIT 00530 4463 PRNTC / NO: PRINT IT 00531 5312 JMP NEXTC / BINCMP.PA PAL8-V10D NO DATE PAGE 4-3 00532 2302 PRNTEX, ISZ PRTLNX / SET NORMAL RETURN ADDRESS 00533 5702 JMP I PRTLNX 00534 0000 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) / 00535 0000 MKCHRX, 0 00536 0022 AND K77 / STRIP OFF HIGH 6 BITS 00537 7450 SNA 00540 5735 JMP I MKCHRX / ITS A (00), QUICK RETURN 00541 3361 DCA MKTMP / SAVE FOR NOW 00542 1361 TAD MKTMP 00543 1036 TAD M37 00544 7650 SNA CLA / IS IT 37? 00545 5355 JMP MKCRLF / YES: OUTPUT 00546 1361 TAD MKTMP / NO: 00547 1035 TAD M33 00550 7710 SPA CLA / IS IT 'Z' OR LESS? 00551 1023 TAD K100 / YES: PUT IT INTO ALPHA RANGE 00552 1024 TAD K200 / AT LEAST MAKE IT NON-ALPHA 00553 1361 TAD MKTMP 00554 5735 JMP I MKCHRX 00555 1026 MKCRLF, TAD KCR 00556 4463 PRNTC / FORCE THE 00557 1025 TAD KLF / MAKE PRNTLN THINK IT GOT 00560 5735 JMP I MKCHRX 00561 0000 MKTMP, 0 / BINCMP.PA PAL8-V10D NO DATE PAGE 5 0600 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 / 00600 0000 WRITWX, 0 00601 3217 DCA WDTMP / SAVE IT FOR NOW 00602 1034 TAD M4 00603 3216 DCA DGTCNT / SET FOR 4 OCTAL DIGITS 00604 1217 NXTDGT, TAD WDTMP / RECALL IT 00605 7006 RTL 00606 7004 RAL / ROTATE 3 RIGHT 00607 3217 DCA WDTMP / SAVE IT SO FAR 00610 1217 TAD WDTMP / GET IT BACK 00611 7004 RAL / ROTATE ONCE MORE 00612 4462 WRITED / WRITE THIS DIGIT 00613 2216 ISZ DGTCNT / DONE ALL 4 DIGITS? 00614 5204 JMP NXTDGT / NO: DO ANOTHER 00615 5600 JMP I WRITWX / YES: ALL DONE, RETURN 00616 0000 DGTCNT, 0 00617 0000 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 / 00620 0000 WRITDX, 0 00621 0020 AND K7 00622 1027 TAD K260 00623 4463 PRNTC 00624 5620 JMP I WRITDX / FUNCTION PRNTC / PRINTS THE ASCII CHAR IN AC ON THE CONSOLE (TTY:) / / BINCMP.PA PAL8-V10D NO DATE PAGE 5-1 / REQUIRES / AC = ASCII CHAR TO PRINT / GUARANTEES / ASCII CHAR IN AC HAS BEEN PRINTED / AC, LINK = 0 / 00625 0000 PRNTCX, 0 00626 6046 TLS 00627 6041 TSF 00630 5227 JMP .-1 00631 7300 CLA CLL 00632 5625 JMP I PRNTCX / TEXT MESSAGE STRINGS (IN 6-BIT PACKED FORMAT) 00633 3752 NODIFF, TEXT "_*** NO DIFFERENCES ***_" 00634 5252 00635 4016 00636 1740 00637 0411 00640 0606 00641 0522 00642 0516 00643 0305 00644 2340 00645 5252 00646 5237 00647 0000 00650 3701 DIFHD1, TEXT "_ADDRESS MEMORY DATA TAPE DATA_" 00651 0404 00652 2205 00653 2323 00654 4040 00655 1505 00656 1517 00657 2231 00660 4004 00661 0124 00662 0140 00663 4024 00664 0120 00665 0540 00666 0401 00667 2401 00670 3700 00671 5555 DIFHD2, TEXT "------- ----------- ---------_" 00672 5555 00673 5555 00674 5540 00675 4055 00676 5555 00677 5555 00700 5555 / BINCMP.PA PAL8-V10D NO DATE PAGE 5-2 00701 5555 00702 5555 00703 4040 00704 5555 00705 5555 00706 5555 00707 5555 00710 5537 00711 0000 00712 4000 SPACE1, TEXT " " 00713 4040 SPACE6, TEXT " " 00714 4040 00715 4040 00716 0000 00717 4040 SPACE8, TEXT " " 00720 4040 00721 4040 00722 4040 00723 0000 00724 3700 NEWLN, TEXT "_" 00725 3752 CSERR0, TEXT "_*** CHECKSUM ERROR ON INPUT TAPE ***_ READ: " 00726 5252 00727 4003 00730 1005 00731 0313 00732 2325 00733 1540 00734 0522 00735 2217 00736 2240 00737 1716 00740 4011 00741 1620 00742 2524 00743 4024 00744 0120 00745 0540 00746 5252 00747 5237 00750 4040 00751 4040 00752 2205 00753 0104 00754 7240 00755 0000 00756 4040 CSERR1, TEXT " COMPUTED: " 00757 4040 00760 0317 00761 1520 00762 2524 00763 0504 00764 7240 00765 0000 00766 3704 FINISH, TEXT "_DONE_" 00767 1716 / BINCMP.PA PAL8-V10D NO DATE PAGE 5-3 00770 0537 00771 0000 0771 END=.-1 / MARK THE END SO COPY KNOWS HOW BIG BINCMP IS $ PAL8-V10D NO DATE PAGE 6 $$ $ PAL8-V10D NO DATE PAGE 7 ASMTMP 0501 M33 0035 ASSMBL 4455 M37 0036 ASSMBX 0456 M4 0034 BADCS 0302 NEWLN 0724 CDFCMP 0257 NEXTC 0512 CDFTHS 0044 NEXTWD 0263 CDF0 0032 NODIFF 0633 CHAR0 0051 NODIFS 0050 CHAR1 0052 NXTDGT 0604 CHAR2 0053 PRNTC 4463 CHKSUM 0046 PRNTCX 0625 CIFDF0 0033 PRNTEX 0532 CKADDR 0240 PRNTLN 4457 CKDATA 0247 PRTLNX 0502 CKFLD 0227 PRTPTR 0010 COPY 0400 PRTTMP 0534 CPYCNT 0432 PSTART 0177 CPYLEN 0431 RDDUN 0454 CPYPTR 0433 RDHSPD 0451 CSERR0 0725 RDLSPD 0445 CSERR1 0756 RDNEXT 0265 DATAWD 0043 READC 4454 DGTCNT 0616 READCX 0434 DIFHD1 0650 READER 0045 DIFHD2 0671 RPTDIF 0335 DONE 0321 SKPLDR 0220 END 0771 SPACE1 0712 FINISH 0766 SPACE6 0713 FRMFLD 0413 SPACE8 0717 GOFLD 0426 START 0200 GOODCS 0314 TAPSUM 0047 ISADDR 0244 TOFLD 0415 ISDATA 0253 WDTMP 0617 ISDIFF 4456 WRITDX 0620 ISDIFX 0325 WRITED 4462 ISFLD 0233 WRITEW 4461 ISTRLR 0267 WRITWX 0600 KCR 0026 KLF 0025 K100 0023 K200 0024 K2000 0030 K260 0027 K4000 0031 K7 0020 K70 0021 K77 0022 MEMADR 0042 MKCHAR 4460 MKCHRX 0535 MKCRLF 0555 MKTMP 0561 M100 0037 M200 0040 M300 0041 ERRORS DETECTED: 0 LINKS GENERATED: 0