/ COMMUNICATIONS PORT TEST / DECMATE II COMMUNICATIONS PORT TEST ROUTINES. / LAST EDIT: 23-JUL-1989 11:00:00 CJL / THIS IS A COLLECTION OF ROUTINES DESIGNED TO TEST THE VIABILITY OF THE DECMATE / II COMMUNICATIONS PORT. IT IS BEING WRITTEN WITH A LOT OF GUESSWORK, SINCE / THE DOCUMENTATION FROM THE DECMATE II REFERENCE MANUAL (EK-DECM2-RM-001) IS / CONTRARY TO THE CODING PRESENT IN K278 AND OTHER ALLEDGEDLY WORKING DECMATE / II/III PROGRAMS. THE FINAL VERSION OF THIS PROGRAM WILL REVEAL HOW IT / *REALLY* WORKS! / THIS VERSION MAY NOT WORK ON THE DECMATE III OR III+, AS IT IS BEING WRITTEN / EXPLICITLY FOR THE DECMATE II WITHOUT III OR III+ HARDWARE AVAILABLE FOR / TESTING. SUBSEQUENT VERSIONS WILL BE ADAPTED FOR THESE MACHINES AS NECESSARY. / EQUATED SYMBOLS. / COMMUNICATIONS PORT DEFINITIONS. PORTIN= 30 /COMMUNICATIONS PORT INPUT DEVICE CODE IFL= PORTIN^10+6000 /SET COMMUNICATIONS PORT INPUT/OUTPUT FLAG ISF= PORTIN^10+6001 /SKIP ON, CLEAR COMMUNICATIONS PORT INPUT/OUTPUT FLAG ICF= PORTIN^10+6002 /NOP (CLEAR THE AC?) INOP1= PORTIN^10+6003 /(NOP?) IRS= PORTIN^10+6004 /READ COMMUNICATIONS PORT RECEIVE BUFFER IIE= PORTIN^10+6005 /COMMUNICATIONS PORT I/O INTERRUPT ENABLE PER AC[11] IRB= PORTIN^10+6006 /READ COMMUNICATIONS PORT RECEIVE BUFFER INOP2= PORTIN^10+6007 /(NOP?) PORTOUT=31 /COMMUNICATIONS PORT OUTPUT DEVICE CODE DUMBFL= PORTOUT^10+6000 /SET COMMUNICATIONS PORT DUMMY FLAG DUMBSF= PORTOUT^10+6001 /SKIP ON, CLEAR COMMUNICATIONS PORT DUMMY FLAG DUMBCF= PORTOUT^10+6002 /NOP (CLEAR THE AC?) ONOP1= PORTOUT^10+6003 /(NOP?) OPC= PORTOUT^10+6004 /LOAD COMMUNICATIONS PORT TRANSMIT BUFFER DUMBIE= PORTOUT^10+6005 /COMMUNICATIONS PORT DUMMY INTERRUPT ENABLE PER AC[11] OLS= PORTOUT^10+6006 /LOAD COMMUNICATIONS PORT TRANSMIT BUFFER ONOP2= PORTOUT^10+6007 /(NOP?) PORTCON=36 /COMMUNICATIONS PORT CONTROL DEVICE CODE MFL= PORTCON^10+6000 /SET MODEM CHANGE FLAG MSF= PORTCON^10+6001 /SKIP ON, CLEAR MODEM CHANGE FLAG MLC= PORTCON^10+6002 /LOAD MODEM CONTROL REGISTER MSB= PORTCON^10+6003 /LOAD BAUD RATE REGISTER MRS= PORTCON^10+6004 /READ MODEM STATUS REGISTER MIE= PORTCON^10+6005 /MODEM CHANGE INTERRUPT ENABLE PER AC[11] MPSCC= PORTCON^10+6006 /ACCESS MULTIPROTOCOL SERIAL COMMUNICATIONS CONTROLLER MPRESET=PORTCON^10+6007 /RESET MULTIPROTOCOL SERIAL COMMUNICATIONS CONTROLLER / ADDITIONAL DEFINITIONS. / MISCELLANEOUS DEFINITIONS. PRQ3= 6236 /TYPE THREE PANEL REQUEST R3L= 7014 /ROTATE AC LEFT 3 SBOOT= 7600 /SYSTEM EXIT ADDRESS / NUMERIC LOAD DEFINITIONS. NL0000= CLA /LOAD AC WITH 0000 NL0001= CLA IAC /LOAD AC WITH 0001 NL0002= CLA CLL CML RTL /LOAD AC WITH 0002 NL0003= CLA STL IAC RAL /LOAD AC WITH 0003 (8/I ON UP) NL0004= CLA CLL IAC RTL /LOAD AC WITH 0004 (8/I ON UP) NL0006= CLA STL IAC RTL /LOAD AC WITH 0006 (8/I ON UP) NL0010= CLA IAC R3L /LOAD AC WITH 0010 (6120) NL0100= CLA IAC BSW /LOAD AC WITH 0100 (8/E ON UP) NL3777= CLA CLL CMA RAR /LOAD AC WITH 3777 NL4000= CLA CLL CML RAR /LOAD AC WITH 4000 NL5777= CLA CLL CMA RTR /LOAD AC WITH 5777 NL6000= CLA STL IAC RTR /LOAD AC WITH 6000 (8/I ON UP) NL7775= CLA CLL CMA RTL /LOAD AC WITH 7775 NL7776= CLA CLL CMA RAL /LOAD AC WITH 7776 NL7777= CLA CMA /LOAD AC WITH 7777 *0 /START AT THE BEGINNING *10 /DEFINE AUTO-INDEX AREA *20 /GET PAST AUTO-INDEX AREA BAUD, 12 /BAUD RATE (12=2400 BAUD) INFLAG, .-. /INPUT AVAILABLE FLAG OUTEMP, .-. /OUTPUT TEMPORARY OUTFLAG,.-. /OUTPUT READY FLAG *200 /THE USUAL PLACE START, CAF /CLEAN UP TLS /RAISE OUTPUT FLAG JMS I [INIPORT] /INITIALIZE THE COMMUNICATIONS PORT LOOP, CLA /CLEAN UP KSF /ANY INPUT? JMP TRYCOMM /NO, TRY COMMUNICATIONS PORT KRB /YES, GET THE CHARACTER AND [177] /JUST SEVEN-BIT TAD (-"C&37!7740) /COMPARE TO <^C> SNA /SKIP IF OTHER JMP I [SBOOT] /LEAVE IF IT MATCHES TAD ("C&37) /RESTORE THE CHARACTER AGAIN, JMS I [OUTEST] /OUTPUT READY? JMP .-1 /NO, WAIT FOR IT JMS I [OUTPUT] /YES, OUTPUT THE CHARACTER JMP LOOP /KEEP GOING TRYCOMM,JMS I [INTEST] /ANY INPUT? JMP LOOP /NO, TRY OTHER JMS I [INPUT] /GET THE COMMUNIATIONS PORT CHARACTER TSF /FLAG UP? JMP .-1 /NO, WAIT FOR IT TLS /OUTPUT IT JMP LOOP /KEEP GOING PAGE / PORT INITIALIZE ROUTINE. / THIS ROUTINE IS MOSTLY "DARK GREY MAGIC" WHICH IS PRIMARILY DERIVED FROM THE / "OFFICIAL" INFORMATION TAKEN FROM THE ONLY KNOWN DOCUMENTATION, THE DECMATE II / PROGRAMMER'S REFERENCE MANUAL: EK-DECM2-RM-001. VARIOUS EMPLOYEES OF DIGITAL / EQUIPMENT CORPORATION (A MULTI-NATIONAL COMPANY) HAVE ADDITIONALLY CONTRIBUTED / TO THIS EFFORT BY PROVIDING PORTIONS OF THE "SACRED SLUSHWARE NOTES" ON A NOT / NECESSARILY WILLING BASIS THROUGH THEIR RELEASED WORKS, SUCH AS, BUT NOT / LIMITED TO, THE SOURCES OF THE PARTICULAR VERSION OF KERMIT-8 KNOWN AS K278. / IT IS ASSUMED THAT THESE PEOPLE HAVE ACCESS TO BETTER DOCUMENTATION OF THE / HARDWARE, AND ESPECIALLY DOCUMENTATION OF THE THREE DIFFERENT MODELS OF / DECMATE (II, III, III+) THAT THESE ISSUES APPLY TO. / SINCE IT IS NOT KNOWN WHETHER THE K278, ETC. CODE IS SPECIFIC AND PRECISE, OR / MERELY SLOPPY, VARIOUS "QUIRKY" CODING TECHNIQUES HAVE BEEN LEFT "AS IS", WITH / COMMENTS REGARDING POTENTIAL VARIANCE WITH DOCUMENTATION NOTED WHERE / NECESSARY. THE ORDER OF ACCESS TO THE REGISTERS HAS BEEN LEFT INTACT IN CASE / OF POTENTIAL INTERACTION. SEVERAL CHANGES HAVE BEEN MADE BEYOND THIS WORK AS / A RESULT OF TRIAL-AND-ERROR, AND ALSO HAND DIS-ASSEMBLY OF SEVERAL DECMATE / DISKETTES' CONTENTS. / IT IS HOPED THAT FUTURE "NEGOTIATIONS" WITH DEC ALLOW FOR PROPER DISCLOSURE OF / THESE ISSUES TO AVOID POTENTAIL SOFTWARE FAILURES EVIDENT IN THESE ROUTINES / DUE TO LACK OF PROPER DOCUMENTATION. INIPORT,.-. /COMMUNICATIONS PORT INITIALIZE ROUTINE CLA /CLEAN UP / ACCORDING TO THE DECMATE II MANUAL, THE FOLLOWING INSTRUCTION IS UNDEFINED. MPRESET /RESET MULTIPROTOCOL COMMUNICATIONS CONTROLLER CHIP / THE DECMATE III HAS AN INTERNAL MODEM OPTION WHICH IS NOT AVAILABLE IN THE / DECMATE II. THE INTERFACE TO THIS DEVICE IS APPARENTLY SHARED WITH THE MPSCC / MODEM INTERFACE WE NORMALLY USE, SO THE REGISTER ACCESS MUST BE MORE CAREFULLY / DEFINED. THE APPARENT DIFFERENTIATION IS THE CURRENT VALUE OF THE DATA FIELD, / NAMELY EITHER FIELD 0 OR 1. IT IS NOT KNOWN WHETHER THE THREE-BIT VALUE OF / THE DATA FIELD IS SIGNIFICENT (PRESUMABLY FOR FUTURE EXPANSION), OR MERELY THE / DATA FIELD'S LOW-ORDER BIT IS USED, AS ALL KNOWN EXAMPLES OF ALLEDGEDLY / FUNCTIONAL CODE USE APPROPRIATE CDF 00 AND CDF 10 ONLY. APPARENTLY THE MODEM / INTERFACE IS REFERRED TO AS "A" AND THE MPSCC INTERFACE IS REFERRED TO AS "B". TAD (030) /GET RESET VALUE CDF 00 /TALKING TO REGISTER 0A MPSCC /RESET COMMUNICATIONS CHIP CDF 10 /TALKING TO REGISTER 0B MPSCC /RESET COMMUNICATIONS CHIP / ACCORDING TO THE DECMATE II MANUAL, CONTROL REGISTER 2 "HAS NO RELEVANT / BITS... IF IT IS EVER WRITTEN, IT MUST BE WRITTEN WITH ALL ZEROS." APPARENTLY / THE MODEM INTERFACE DEMANDS A NON-ZERO VALUE BE WRITTEN TO REGISTER 2 / (PRESUMABLY TO DISABLE IT). TO SATISFY THE ABOVE REQUIREMENT (WHATEVER THIS / IMPLIES!), REGISTER 2(B) IS WRITTEN WITH ALL ZEROS *LAST* IN CASE THIS IS A / DECMATE II WHERE THE DATA FIELD CONSIDERATIONS ARE MEANINGLESS. CDF 00 /TALKING TO REGISTER 0A NL0002 /WANT REGISTER 2A MPSCC /SELECT IT TAD (020-2) /GET RESET VALUE MPSCC /LOAD IT CDF 10 /TALKING TO REGISTER 0B NL0002 /WANT REGISTER 2B MPSCC /SELECT IT NL0000 /GET RESET VALUE (000) MPSCC /LOAD IT / THE K278 CODE DOES NOT HAVE SETUP CODE FOR REGISTER 4B, PRESUMABLY BECAUSE THE / CODE PERFORMS A PANEL REQUEST (PRQ3) WHICH SETS UP THE EQUIVALENT VALUES FOR / ASYNCHRONOUS OPERATION WITH ONE STOP BIT AND NO PARITY. IT IS NOT KNOWN IF / THE DECMATE III EVEN *HAS* A REGISTER 4B, BUT PRESUMABLY IT IS AVAILABLE FOR / LOADING THE RIGHT VALUES COMPATIBLE WITH THE DECMATE II, OR ATTEMPTING TO LOAD / IT IS INNOCUOUS. CDF 00 /TALKING TO REGISTER 0A NL0004 /WANT REGISTER 4A MPSCC /SELECT IT TAD (104-4) /SETUP FOR ASYNCHRONOUS, ONE STOP BIT, NO PARITY MPSCC /LOAD IT CDF 10 /TALKING TO REGISTER 0B NL0004 /WANT REGISTER 4B MPSCC /SELECT IT TAD (104-4) /SETUP FOR ASYNCHRONOUS, ONE STOP BIT, NO PARITY MPSCC /LOAD IT / THE DOCUMENTED VALUES (FOR DECMATE II) REGARDING CONTROL REGISTER 1 INDICATE / THE PROPER VALUE OF 022, WHERE BIT[9] IS DEFINED AS A ZERO. THE VALUE OF 026 / IS TAKEN FROM K278 WHERE PRESUMABLY THE EXTRA BIT IS NECESSARY FOR SOME / DECMATE III OBSCURITY. / THE FOLLOWING CODE IS REDUNDANT FOR LOADING REGISTER 0A BEFORE AND AFTER / LOADING REGISTER 0B. THIS IS EITHER A MISTAKE OR OBSCURELY NECESSARY (TAKEN / FROM K278). CDF 00 /TALKING TO REGISTER 0A NL0001 /WANT REGISTER 1A MPSCC /SELECT IT TAD (026-1) /GET SETUP VALUE MPSCC /LOAD IT CDF 10 /TALKING TO REGISTER 0B NL0001 /WANT REGISTER 1B MPSCC /SELECT IT TAD (026-1) /GET SETUP VALUE MPSCC /LOAD IT CDF 00 /TALKING TO REGISTER 0A NL0001 /WANT REGISTER 1A MPSCC /SELECT IT TAD (026-1) /GET SETUP VALUE (?) MPSCC /LOAD IT / THE DECMATE III INTERNAL MODEM IS PROBABLY ASYNCHRONOUS 8 BIT ONLY. ASSUMING / THE RECEIVE SIDE OF THE INTERNAL MODEM IS ALWAYS "ENABLED", REGISTER 3A WOULD / BE UNNECESSARY. THE K278 CODE DOES NOT ADDRESS REGISTER 3 AS AN A/B PAIR, / PRESUMABLY BECAUSE REGISTER 3 IS NOT DECODED AND IS EFFECTIVELY REGISTER 3B / REGARDLESS OF THE DATA FIELD. THIS IS EITHER TRUE, OR THE K278 FAILS TO / PROPERLY INITIALIZE THE DECMATE III MPSCC PORT. NL0003 /WANT REGISTER 3 MPSCC /SELECT IT TAD (301-3) /SETUP FOR 8 BITS AND ENABLE RECIVER MPSCC /LOAD IT / A SIMILAR SITUATION EXISTS FOR THE TRANSMITTER SIDE OF THE DECMATE III INTERNAL / MODEM. REGISTER 5 IS UTILIZED ACCORDINGLY. TAD (5-301) /WANT REGISTER 5 MPSCC /SELECT IT TAD (150-5) /GET TRANSMITTER ENABLE, 8 BITS VALUE MPSCC /LOAD IT / THE DECMATE II REFERENCE MANUAL INDICATES THE PROPER SETTING FOR THE MODEM / CONTROL REGISTER AS EITHER 030 OR 130 DEPENDING ON WHETHER BIT[5] INDICATES / INTERNAL OR EXTERNAL TIMING (WHERE ONE OF THESE IS ILLEGAL FOR ASYNCHRONOUS / OPERATION!). THE SETTING OF BITS [10] AND [11] WOULD INDICATE ENABLING OF / BOTH LOCAL AND REMOTE LOOPBACKS, YET WE SET ONLY THESE BITS (ALA K278) / ALLEDGEDLY FOR THE PURPOSE OF SETTING RTS AND DTR (WHICH ARE DOCUMENTED AS / BEING BITS[7] AND [8] RESPECTIVELY). NL0003 /SET VALUE MLC /LOAD IT CLA /CLEAN UP TAD BAUD /GET BAUD RATE MSB /LOAD IT NL0001 /SET AC DCA OUTFLAG /INDICATE OUTPUT IS AVAILABLE DCA INFLAG /INDICATE INPUT IS NOT AVAILABLE JMP I INIPORT /RETURN / INPUT TEST ROUTINE. INTEST, .-. /INPUT TEST CLA /CLEAN UP TAD INFLAG /GET OUR FLAG SZA CLA /SKIP IF NOT AVAILABLE JMP INAVAIL /JUMP IF IT IS JMS COMSTATUS /UPDATE THE I/O STATUS SKP /DON'T BUMP INAVAIL,ISZ INTEST /BUMP RETURN JMP I INTEST /RETURN EITHER WAY / INPUT CHARACTER ROUTINE. INPUT, .-. /INPUT CLA /CLEAN UP DCA INFLAG /INPUT NO LONGER AVAILABLE IRB /GET THE CHARACTER JMP I INPUT /RETURN / OUTPUT TEST ROUTINE. OUTEST, .-. /OUTPUT TEST DCA OUTEMP /SAVE PASSED CHARACTER TAD OUTFLAG /GET OUR FLAG SZA CLA /SKIP IF NOT AVAILABLE JMP OUTAVAIL /JUMP IF IT IS AVAILABLE NOW JMS COMSTATUS /UPDATE I/O STATUS SKP /DON'T BUMP OUTAVAI,ISZ OUTEST /BUMP RETURN TAD OUTEMP /RESTORE AC JMP I OUTEST /RETURN EITHER WAY / OUTPUT ROUTINE. OUTPUT, .-. /OUTPUT OLS /OUTPUT THE CHARACTER CLA /CLEAN UP DCA OUTFLAG /OUTPUT NO LONGER AVAILABLE JMP I OUTPUT /RETURN / STATUS UPDATE ROUTINE. COMSTAT,.-. /COMMUNICATIONS PORT STATUS ROUTINE ISF /FLAG UP? JMP I COMSTATUS /NO, JUST RETURN NL4000 /LET'S READ STATUS REGISTER ZERO MPSCC /TELL THE MPSCC CHIP CLA /CLEAN UP MPSCC /GET THE VALUE AND (5) /JUST INPUT AND OUTPUT BITS CLL RAR /MOVE INPUT TO LINK SNA CLA /SKIP IF OUTPUT INTERRUPT JMP INCHK /JUMP IF NOT TAD (050) /GET OUTPUT CLEAR VALUE MPSCC /CLEAR OUTPUT INTERRUPT DCA OUTFLAG /INDICATE OUTPUT IS AVAILABLE NOW INCHK, CLA RAL /GET RECEIVE STATUS SZA /SKIP IF INPUT NOT AVAILABLE DCA INFLAG /ELSE UPDATE FLAG CLA /CLEAN UP EITHER WAY TAD (070) /GET END OF INTERRUPT VALUE MPSCC /CLEAR THE INTERRUPT CLA /CLEAN UP JMP I COMSTATUS /RETURN PAGE $ /THAT'S ALL FOLK!