/ SDSKNS OS/8 NON-SYSTEM HANDLER / SERIAL INTERFACE-BASED DISK NON-SYSTEM DEVICE HANDLER [USE WITH PC SERVER]. / LAST EDIT: 01-FEB-2021 VRS / EDIT HISTORY. / 01-FEB-2021 VINCE SLYNGSTAD / 1) REMOVED RKIE INSTRUCTION, REPLACING IT WITH A FAMILY-OF-EIGHT / COMPATIBLE SOLUTION TO THE FORTRAN HANG ISSUE. / 2) REMOVED IOT DEFINITIONS INCONSISTENT WITH USAGE ACROSS THE ENTIRE / FAMILY-OF-EIGHT LINE. / A WORD ABOUT THE FORTRAN ISSUE IS PROBABLY APROPRIATE. FORTRAN (AND / POSSIBLY OTHER SOFTWARE) WORKS BY DISABLING INTERRUPTS, CALLING US / (THE OS/8 DRIVER), THEN RE-ENABLING INTERRUPTS ON RETURN. EVEN IF / THEY DON'T EXPLICITLY CALL US, BUT WE'VE RUN SINCE THE SYSTEM BOOT, / THE FORTRAN INTERRUPT SERVICE ROUTINE KNOWS NOTHING ABOUT OUR DEVICE, / SO IF WE LEFT A FLAG SET ON RETURN, THAT ISR WILL BE CALLED, WILL / FAIL TO CLEAR OUR DEVICE FLAG, WILL RETURN, AND IMMEDIATELY TAKE / ANOTHER INTERRUPT, ESSENTIALLY HANGING THERE. THE FLAG REMAINS / SET, AND NO FORWARD PROGRESS IS MADE. EARLIER VERSIONS OF THIS / DRIVER USED MASKING TO PREVENT THESE INTERRUPTS, BUT ONLY OMNIBUS / AND LATER MACHINES IMPLEMENT MASKING INSTRUCTIONS. IT IS THEREFORE / ESSENTIAL THAT THIS DRIVER NOT LEAVE FLAGS SET, IF IT IS TO RUN ON / OLDER SERIAL PORTS (OR NEWER ONES THAT DON'T IMPLEMENT MASKING). / 08-FEB-2018 CHARLES LASNER SMALL CHANGES IN PREPARATION FOR SPEED-UP. / NOTABLE CHANGES. / 1) MODIFIES THE 12-BIT WORD SEND AND RECEIVE ROUTINES IN PREPARATION FOR A / POTENTIAL FUTURE CHANGE TO SPEED UP THE HANDLER AT THE EXPENSE OF REQUIRING / OMNIBUS MACHINES. / 2) MINOR COSMETIC CHANGES TO CONFORM TO SOURCE CODE WIDTH LIMITATIONS OF PAL8. / 3) RELEASE UPDATED TO VERSION H. / 13-NOV-2016 CHARLES LASNER BUG FIX AND MAJOR SOURCE CODE CLEANUP. / NOTABLE CHANGES. / 1) FIXES BUG ASSOCIATED WITH PRE-OMNIBUS SERIAL INTERFACES BY REORDERING THE / CODE THUS OVERALL LENGTH IS UNCHANGED. / 2) THE LONG AWAITED MAJOR SOURCE CODE CLEANUP TO INCLUDE [BETTER] COMMENTS AND / CONFORMANCE WITH PDP-8 SOURCE CODE CONVENTIONS. / 6) RELEASE UPDATED TO VERSION G. / 06-AUG-2016 CHARLES LASNER CODE CLEANUP. / NOTABLE CHANGES. / 1) ADDS THIS EDIT HISTORY. / 2) REMOVES MINOR INCOMPATIBLE SOURCE CODE QUIRKS. [NOTE: ALL CHANGES MADE / ARE COSMETIC, BUT TECHNICALLY THE ORIGINAL CODE VIOLATED THE PAL LANGUAGE / SPECIFICATION. OS/8 PAL8 IS DEFICIENT AT FLAGGING CERTAIN ERRORS THAT WILL / BE PROPERLY DETECTED BY OTHER ASSEMBLY PROGRAMS SUCH AS PAL III, P?S/8 PAL, / THE LAP6-DIAL/DIAL-MS ASSEMBLER AND TOPS1O PAL10.] / 3) REMOVES INCOMPATIBILITY WITH LANGUAGE EXTENSIONS FOUND IN OTHER ASSEMBLERS / [SUCH AS THE ERROR DIRECTIVE]. / 4) DEVICE GROUP NAMES ARE MODIFIED FOR CONSISTENCY WITH THE SYSTEM HANDLER. / 5) MAJOR SOURCE CODE CLEANUP DEFERRED PENDING TESTING OF THE PROGRAM. [NOTE: / AMONG OTHER PROBLEMS, THE SOURCE CODE APPEARS TO BE A RECOVERY FROM A / LISTING FILE AND DOES NOT CONFORM TO PDP-8 SOURCE CODE STANDARDS; OTHER / THAN MORE RECENT MINOR EDITS, THERE ARE NO HORIZONTAL TAB CHARACTERS.] / 6) RELEASE UPDATED TO VERSION F. / 16-NOV-2015 BOB ADAMSON FIRST MAJOR UPDATE. / NOTE: THIS RELEASE DATE IS APPROXIMATE. IT IS MORE LIKELY AN EARLY DATE IN A / PERIOD THAT SPANS SEVERAL MONTHS. / NOTABLE CHANGES: / 1) REMOVES REDUNDANT CDF INSTRUCTIONS TO SHORTEN THE CODE. / 2) REPLACES BSW INSTRUCTIONS WITH THREE ROTATE INSTRUCTIONS EACH TO MAINTAIN / COMPATIBILITY WITH ALL "FAMILY OF 8" MACHINES INSTEAD OF OMNIBUS AND NEWER. / 3) DISABLES INTERRUPTS FROM WITHIN THE HANDLER. / 4) ADDS CONTROL-C CHECKING TO ABORT TO OS/8 KEYBOARD MONITOR. / 5) LIMITS CONTROL-C CHECKING TO READ OPERATIONS ONLY TO PREVENT THE SERVER / FROM HANGING. / 6) SUPPORT NOW EXTENDED TO FOUR DISKS [REQUIRES UPDATED SERVER SOFTWARE]. / 7) RELEASE UPDATED TO VERSION E. / 17-FEB-2014 KYLE OWEN INITIAL RELEASE AND UPDATES. / NOTABLE FEATURES: / 1) RUNS ON OMNIBUS MACHINES ONLY. / 2) HANDLES TWO DISKS. / 3) HANDLER RELEASED AT VERSION D. / NUMERIC LOAD DEFINITIONS. NL2000= CLA CLL CML RTR /LOAD AC WITH 2000. / MISCELLANEOUS DEFINITIONS. BLKNUM= 6260 /COUNT OF OS/8 RECORDS PER LOGICAL DEVICE. DEVCNT= 10 /EIGHT LOGICAL DEVICES SUPPORTED. VERS= "I&77 /RELEASE VERSION. / REMOTE LINE IOT DEFINITIONS. REC= 40 /DEVICE 40 FOR REMOTE RECEIVE. SEN= 41 /DEVICE CODE 41 FOR REMOTE SEND. / RECEIVE DEFINITIONS. RKCC= REC^10+6002 /CLEAR AC, RECEIVE FLAG. RKRB= REC^10+6006 /LOAD DATA -> AC, CLEAR RECEIVE FLAG. RKRS= REC^10+6004 /LOAD RECEIVE DATA .OR. AC -> AC. RKSF= REC^10+6001 /SKIP IF RECEIVE FLAG SET. / TRANSMIT DEFINITIONS. RTCF= SEN^10+6002 /CLEAR TRANSMIT FLAG. RTLS= SEN^10+6006 /SEND TRANSMIT CHARACTER, CLEAR FLAG. RTPC= SEN^10+6004 /SEND TRANSMIT CHARACTER. RTSF= SEN^10+6001 /SKIP ON TRANSMIT FLAG SET. / TO DIFFERENTIATE BETWEEN LOGICAL DISK REGIONS, THE HANDLER SENDS AN / INITIATING CHARACTER: / ASCII TEXT CHARACTER DISK REGION / A DISK 0 FIRST HALF. / B DISK 0 SECOND HALF. / C DISK 1 FIRST HALF. / D DISK 1 SECOND HALF. / E DISK 2 FIRST HALF. / F DISK 2 SECOND HALF. / G DISK 3 FIRST HALF. / H DISK 3 SECOND HALF. *0 /HANDLER BLOCK STARTS HERE. -DEVCNT /DEVICE HANDLER COUNT. DEVICE SDNS;DEVICE SDA0;4640;SDA0&177;0;0 DEVICE SDNS;DEVICE SDB0;4640;SDB0&177;0;0 DEVICE SDNS;DEVICE SDA1;4640;SDA1&177;0;0 DEVICE SDNS;DEVICE SDB1;4640;SDB1&177;0;0 DEVICE SDNS;DEVICE SDA2;4640;SDA2&177;0;0 DEVICE SDNS;DEVICE SDB2;4640;SDB2&177;0;0 DEVICE SDNS;DEVICE SDA3;4640;SDA3&177;0;0 DEVICE SDNS;DEVICE SDB3;4640;SDB3&177;0;0 *200 /CODE DEFINED HERE. SENDC, .-. /TRANSMIT A CHARACTER ROUTINE. RTLS /SEND THE CHARACTER IN THE AC. RTSF /SEND FLAG UP? JMP .-1 /NO, WAIT FOR IT. RTCF /DON'T LEAVE THE FLAG SET (FORTRAN) DCA SNDTMP /CLEAN UP AND SAVE FOR SOME CALLERS. JMP I SENDC /YES, RETURN TO CALLER WITH AC INTACT. SNDNUM, .-. /SEND C(AC) AS TWO CHARACTERS ROUTINE. JMS SENDC /SEND LOW-ORDER 8 BITS. TAD SNDTMP /GET THEM BACK. RTR;RTR;RTR /MOVE DOWN HIGH-ORDER BITS. JMS SENDC /SEND HIGH-ORDER BITS [AND SOME JUNK BITS]. JMP I SNDNUM /RETURN TO CALLER. GETNUM, .-. /RECEIVE 12-BIT WORD IN TWO CHARACTERS ROUTINE. SNDTMP= .-1 /ALSO USED AS STORAGE TEMPORARY. RKSF /RECEIVE FLAG UP? JMP .-1 /NO, WAIT FOR IT. RKRB /YES, READ IN FIRST SIXBIT CHARACTER. CLL RTL;RTL;RTL /MOVE UP TO HIGH-ORDER BITS. DCA SNDNUM /SAVE IT FOR A MOMENT. RKSF /RECEIVE FLAG UP? JMP .-1 /NO, WAIT FOR IT. RKRB /GET SECOND SIXBIT CHARACTER INTO AC. TAD SNDNUM /MERGE IN THE OTHER HALF. JMP I GETNUM /RETURN TO CALLER. CTRLC, .-. /CONTROL-C CHECK ROUTINE. S7600, CLA!400 /CLEAR AC; ALSO CONSTANT 7600. KSF /KEYBOARD FLAG UP? JMP I CTRLC /NO, RETURN NOW. KRS /YES, GET THE LATEST CHARACTER. AND S177/(177) /REMOVE PARITY BIT. TAD M3/(-3) /COMPARE TO CONTROL-C. SZA CLA /SKIP IF IT MATCHES. JMP I CTRLC /RETURN IF DIFFERENT FROM CONTROL-C. SCDI, CIF CDF 00 /GOING TO FIELD 0 ON ABORT. JMP I S7600/(7600) /EXIT TO OS/8. / HANDLER ENTRY POINTS. / NOTE: ALL HANDLER ENTRY POINTS FOLLOW IN REVERSE ORDER. SDB3, VERS /FIRST ENTRY POINT CONTAINS VERSION NUMBER. SDA3, ISZ SDCNT /SECOND ENTRY POINT. SDB2, ISZ SDCNT /THIRD ENTRY POINT. SDA2, ISZ SDCNT /FOURTH ENTRY POINT. SDB1, ISZ SDCNT /FIFTH ENTRY POINT. SDA1, ISZ SDCNT /SIXTH ENTRY POINT. SDB0, ISZ SDCNT /SEVENTH ENTRY POINT. SDA0, ISZ SDCNT /EIGHTH ENTRY POINT. / AT THIS POINT, "SDCNT" HAS BEEN BUMPED 0 THROUGH 7 TIMES DEPENDING ON WHICH / ENTRY POINT WAS USED. WE USE THIS COUNT TO DETERMINE WHICH ENTRY WAS USED. / THE NEXT WORD EXECUTES AS A HARMLESS "AND" INSTRUCTION TO PROVIDE PARTIAL / PROTECTION FROM CALLS MADE FROM LOCATIONS NEAR THE END OF THE CALLING FIELD. / WHILE THIS IS NOT FOOLPROOF, CALLS IN OS/8 ARE SELDOM MADE FROM LOCATIONS PAST / X7600 FOR ANY FIELD X IN THE RANGE OF 0-7. / ADDITIONALLY, "WKUP" MUST BE JUST AFTER THE ENTRY POINT CHAIN TO HELP DEFINE / REFERENCES TO THE PROPER ENTRY POINT. IFNZRO SDA0+1-. /ASSEMBLES ONLY IF THE LOGIC IS BUNGLED. WKUP, "A&177 /CONSTANT 0101; ALSO HARMLESS "AND" INSTRUCTION. CLA CLL /CLEAN UP. TAD SDCNT /GET ENTRY POINT COUNTER CMA /INVERT TAD SDTAD/(TAD WKUP) /NOW HAVE "TAD" TO THE PROPER ENTRY POINT. DCA SDGET /STORE INLINE FOR USE LATER. NL2000 /SET AC TO "DCA" - "TAD" OFFSET. TAD SDGET /NOW HAVE "DCA" TO THE PROPER ENTRY POINT. DCA SRESTR /STORE INLINE TO RESTORE CALLED ENTRY POINT. RDF /GET THE CALLER'S FIELD. TAD SCDI/(CIF CDF) /TURN INTO "CIF CDF" RETURN FIELD INSTRUCTION. DCA SFIELD /STORE INLINE FOR RETURN LATER. SDGET, HLT /THIS IS NOW "TAD" TO THE CHOSEN ENTRY POINT. DCA SDENT /SAVE IT TO GET THE INLINE ARGUMENTS. TAD SDISZ/(ISZ SDCNT) /GET THE NORMAL CONTENTS SRESTR, HLT /SAVE OVER THE CALLED ENTRY POINT. JMS CTRLC /CHECK FOR CONTROL-C ABORT NOW. SDTAD, TAD WKUP/("A&177) /GET THE DRIVE BASE CHARACTER. TAD SDCNT /ADD OFFSET TO THE DESIRED [HALF] DRIVE. JMS SENDC /TELL IT TO THE SERVER. DCA SDCNT /RESET THE ENTRY COUNTER FOR NEXT TIME. TAD I SDENT /GET THE FUNCTION WORD. JMS SNDNUM /SEND IT TO THE SERVER. ISZ SDENT /BUMP PAST FUNCTION WORD. TAD I SDENT /GET THE CALLER'S BUFFER ADDRESS. JMS SNDNUM /TELL IT TO THE SERVER [THIS COULD GO AWAY]. TAD I SDENT /GET THE CALLER'S BUFFER ADDRESS AGAIN. DCA SLOC /STORE FOR TRANSFERS LATER. ISZ SDENT /BUMP TO RECORD ARGUMENT. TAD I SDENT /GET THE STARTING RECORD NUMBER. JMS SNDNUM /SET TO SERVER. ISZ SDENT /BUMP TO ERROR RETURN. JMS GETNUM /GET "CDF" TO BUFFER FIELD FROM SERVER. DCA .+1 /STORE INLINE. HLT /CHANGE DATA FIELD TO USER'S BUFFER FIELD. JMS GETNUM /GET NEGATED WORD COUNT FROM SERVER. DCA WORDCT /STASH IT. GETACK, JMS GETNUM /GET STATUS FROM SERVER. SNA /ARE WE DONE? [0000 IS GOOD COMPLETION CODE.] JMP EXIT /YES, TAKE GOOD EXIT NOW. CLL RAL /MOVE UP TO LINK AND AC[0]. SNL /SKIP IF READ OR WRITE. JMP DSKERR /JUMP IF THERE WAS AN ERROR [CODE 2000]. SZA CLA /SKIP IF READING [4000]. JMP TXLP /JUMP IF WE ARE WRITING [4001]. / FALLS THROUGH IF READING. GET THE DATA FROM THE SERVER AND STORE INTO THE / USER'S BUFFER. RXLP, JMS GETNUM /GET A WORD FROM THE SERVER. DCA I SLOC /PUT A WORD INTO THE BUFFER. ISZ SLOC /BUMP UP THE BUFFER POINTER. JMS CTRLC /CHECK FOR CONTROL-C [MIGHT BE SKIPPED]. ISZ WORDCT /DONE ENOUGH WORDS? JMP RXLP /NO, KEEP GOING. JMP GETACK /GET THE FINAL STATUS BEFORE EXITING. / COMES HERE IF WRITING. GET THE DATA FROM THE USER'S BUFFER AND SEND IT TO THE / SERVER. TXLP, TAD I SLOC /GET A WORD FROM THE USER'S BUFFER. JMS SNDNUM /SEND THE WORD TO THE SERVER. ISZ SLOC /BUMP TO NEXT LOCATION. S177, 177 /CONSTANT 0177; HERE IN CASE THE PREVIOUS SKIPS. ISZ WORDCT /DONE ENOUGH WORDS? JMP TXLP /NO, KEEP GOING. JMP GETACK /GET THE FINAL STATUS BEFORE EXITING. / COMES HERE FOR SUCCESSFUL EXIT TO CALLER. EXIT, ISZ SDENT /BUMP TO NORMAL RETURN. JMS CTRLC /CHECK FOR CONTROL-C ONE LAST TIME. SFIELD, HLT /THIS WILL BE "CIF CDF" TO CALLER'S FIELD. JMP I SDENT /TAKE GOOD RETURN TO CALLER. / COMES HERE IF THERE WAS AN ERROR. /BUGBUG: IF THERE IS AN ERROR, AND WE ARE CALLED FROM FORTRAN, WE CAN /ESCAPE WITH THE INPUT FLAG SET! DSKERR, STL RAR /FORCE ERROR CONDITION, MOVE DOWN STATUS BITS. JMP SFIELD /TAKE ERROR RETURN. SDCNT, 0 /THIS IS USED TO DETERMINE THE ACTIVE CALLER. SDENT, .-. /POINTER TO INLINE ARGUMENTS. SDISZ, ISZ SDCNT /INSTRUCTION CONSTANT NEEDED FOR RESTORATION. M3, -3 /CONSTANT 7775. SLOC, .-. /POINTER TO USER'S BUFFER. WORDCT, .-. /WORD COUNT FOR DATA TRANSFER. $ /THAT'S ALL, FOLK!