/ SDSKSY OS/8 SYSTEM HANDLER / SERIAL INTERFACE-BASED DISK 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. / 19-NOV-2016 CHARLES LASNER BUG FIX AND OTHER THINGS. / NOTABLE CHANGES. / 1) FIXES BUG ASSOCIATED WITH PRE-OMNIBUS SERIAL INTERFACES. / 2) REMOVES LAST REMNANTS OF CONTROL-C CHECKING CODE ALREADY DEACTIVATED. / 3) THE EMBEDDED MANUAL BOOTSTRAP CODE IS NOW ONE WORD SHORTER; A WORD THAT IS / MERELY READ IN BY RUNNING THE BOOTSTRAP WAS INCLUDED WITHIN THE BOOTSTRAP. / 4) THE LONG AWAITED MAJOR SOURCE CODE CLEANUP TO INCLUDE [BETTER] COMMENTS AND / CONFORMANCE WITH PDP-8 SOURCE CODE CONVENTIONS. / 5) 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) REMOVAL OF CONTROL-C DETECTION. THIS IS A DESIGN FLAW: WHEN CONTROL-C IS / DETECTED, THE KEYBOARD INPUT FLAG IS LEFT SET [WHICH IS THE PROPER ACTION / PER SE]. THE SYSTEM HANDLER WILL BE IMMEDIATELY ENTERED AT 07600 WITH A / CALL TO WRITE OUT A PORTION OF MEMORY TO THE SYSTEM SCRATCH BLOCKS; WHILE / THE KEYBOARD FLAG IS NOT CHECKED DURING THE WRITE OPERATION, THE FLAG IS / STILL SET. THE NEXT INTERNAL CALL TO THE SYSTEM DEVICE HANDLER IS AN / ATTEMPT TO RELOAD THE KEYBOARD MONITOR [WHICH WOULD DISPOSE OF THE KEYBOARD / FLAG BY VARIOUS APPROPRIATE MEANS AFTER CLEARING THE FLAG]; HOWEVER, SINCE / THIS LATEST CALL IS A READ OPERATION, THE KEYBOARD FLAG IS DETECTED CAUSING / ANOTHER REBOOT TO 07600. THUS, THE KEYBOARD FLAG IS NEVER CLEARED AS THE / CODE THAT IS DESIGNED TO HANDLE IT NEVER GAINS CONTROL; THIS RESULTS IN AN / INFINITE LOOP SITUATION. [NOTE: NO OFFICIAL DEC OS/8 SYSTEM HANDLERS CHECK / FOR CONTROL-C; THIS FUNCTION IS AN OPTION FOR NON-SYSTEM HANDLERS ONLY.] / 5) DEVICE GROUP NAMES MODIFIED FOR CONSISTENCY WITH THE NON-SYSTEM HANDLERS. / 6) 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.] / 7) 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) RELEASE UPDATED TO VERSION E. / 17-FEB-2014 KYLE OWEN INITIAL RELEASE AND UPDATES. / NOTABLE FEATURES: / 1) RUNS ON OMNIBUS MACHINES ONLY. / 2) HANDLER RELEASED AT VERSION D. / 3) INCLUDES CO-RESIDENT HANDLER FOR SDB0:. / 4) INCLUDES CO-RESIDENT HANDLER DUMMY FOR SDA0: [SAME AS SYS]. / NOTE: AS ALSO APPLIES TO THE OS/8 RK8E SYSTEM HANDLER, THE CO-RESIDENT ENTRY / POINTS ONLY FUNCTION AS DESCRIBED IF THE SYSTEM IS BOOTED TO DRIVE UNIT 0. / PRESENTLY, THIS RESTRICTION IS IRRELEVANT TO THE SERIAL DISK SYSTEM HANDLER AS / NO EXTENDED DISK BOOTUP IS CURRENTLY SUPPORTED; HOWEVER, THE RESTRICTIONS / SHOULD BE DOCUMENTED SHOULD FUTURE RELEASES SUPPORT ADDITIONAL BOOTUP DRIVES. / NUMERIC LOAD DEFINITIONS. NL7777= CLA CMA /LOAD AC WITH 7777. / MISCELLANEOUS DEFINITIONS. BLKNUM= 6260 /COUNT OF OS/8 RECORDS PER LOGICAL DEVICE. DEVCNT= 3 /THREE LOGICAL DEVICES SUPPORTED. SBOOT= 7600 /STANDARD SYSTEM RESTART ADDRESS. 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 RECEIVE 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. / SEND BOOT CODE BY SPECIAL PROTOCOL. *0 /HANDLER BLOCK STARTS HERE. -DEVCNT /DEVICE HANDLER COUNT. DEVICE SDSY;DEVICE SYS; 4640;SYSENT&177+2000;0;BLKNUM DEVICE SDSY;DEVICE SDA0;4640;SYSENT&177+1000;0;BLKNUM DEVICE SDSY;DEVICE SDB0;4640;ENTRY2&177+1000;0;BLKNUM BOOT-ENDB /BOOT CODE LENGTH [NEGATED]. RELOC 0 /WHERE THIS LOADS. / WHEN CONTROL IS TRANSFERRED HERE, THE SYSTEM DEVICE HANDLER IS IN 00200-00377 / AND THE CODE TO BE LOADED INTO 17647-17777 IS IN 00047-0177. WE CAN BE / SLOPPY AND COPY A FEW EXTRA WORDS PAST WHAT IS NEEDED [WASTES A FEW MS.]. BOOT, CLA /CLEAN UP. TAD I BTXR13 /GET A WORD FROM 0200 AND ONWARD. DCA I BTXR14 /STORE INTO 07600 AND ONWARD. TAD I BTXR15 /GET A WORD FROM 0047 AND ONWARD. CDF 10 /STORING INTO FIELD 1. DCA I BTXR16 /STORE INTO 17647 AND ONWARD. CDF 00 /BACK TO FIELD 0. TAD BTXR14 /GET HANDLER CODE POINTER. SZA CLA /SKIP IF WE WENT TOO FAR. JMP BOOT+1 /GO BACK AND DO MORE. JMP I B7605/(SBOOT+5) /DONE, GO START UP OS/8. / AUTO-INDEX REGISTERS; ALL MUST BE IN THE RANGE OF 0013-0017. IFNZRO 13-. /POINTERS ASSEMBLED WRONG IF THIS HAPPENS. BTXR13, 0200-1 /CURRENT POINTER TO SYSTEM HANDLER CODE. BTXR14, SBOOT-1 /WHERE SYSTEM HANDLER CODE MUST GO. BTXR15, 47-1 /CURRENT POINTER TO FIELD 1 CODE [IN FIELD 0]. BTXR16, 7647-1 /WHERE THE FIELD 1 CODE MUST GO. STXR17, . /BOOTUP STORE POINTER; MUST POINT TO ITSELF. ZBLOCK 20-. /EMPTY SPACE [IF ANY]. / WHAT FOLLOWS IS ACTUALLY THE BOOTUP CODE [BUT ALSO EMBEDDED HERE]. BUTUP, NL7777 /SET AC TO 0000 LESS AUTO-INDEX BACKUP FACTOR. DCA STXR17 /STASH THE POINTER. TAD BOOTMSG/(100) /SETUP SERVER COMMAND BOOT VALUE. RTLS /SEND IT. RTSF /DONE YET? JMP .-1 /NO, WAIT FOR IT. BTLP, RKCC /CLEAR THE FLAG AND THE AC. RKSF /FLAG UP? JMP .-1 /NO, WAIT FOR IT. RKRB /YES, READ IN THE FIRST CHARACTER. CLL RTL;RTL /MOVE UP. SPA /SKIP IF NOT END OF DATA. JMP BOOT /ALL DATA IN, NOW GO START IT UP. RTL /NO HAVE FIRST HALF IN HIGH-ORDER. RKSF /FLAG UP? JMP .-1 /NO, WAIT FOR IT. RKRS /.OR. IN THE LOW-ORDER HALF. DCA I STXR17 /STORE THE LATEST WORD. JMP BTLP /KEEP GOING. BOOTMS, "A&177-1 /BOOTUP CHARACTER. / THE STANDALONE BOOTSTRAP IS ALL WORDS FROM 0020 THROUGH HERE. ENDBUT= . /END OF MANUAL BOOTSTRAP. B7605, SBOOT+5 /WHERE OS/8 STARTS WITHOUT WRITING. ENDB= . /END OF BOOT CODE. RELOC /TURN OFF RELOCATION FOR NOW. *200 /THIS IS WHERE THE SYSTEM HANDLER LOADS. RELOC SBOOT /THIS IS WHERE IT EXECUTES. ZBLOCK SBOOT+7-. /BUILD WILL FILL THIS IN. / THIS IS THE ENTRY FOR THE SYSTEM DEVICE [AND THE CO-RESIDENT SDA0: HANDLER]. SYSENT, VERS /ENTRY POINT; BUILD WANTS THE VERSION HERE. CLA CLL /CLEAN UP. / THE CURRENT VERSION DOESN'T LEAVE THE R FLAG SET, BUT SOME OLDER VESRIONS / DO. CLEAR THE FLAG, JUST IN CASE. RKCC /CLEAR FLAG FROM OLDER DRIVER, IF ANY SETUP1, TAD WKUP/("A&177-1) /GET [OR ADD] INITIAL DRIVE CHARACTER. JMS SENDC /TELL IT TO THE SERVER. RDF /GET CALLER'S FIELD. TAD SCDI/(CIF CDF 00) /TURN INTO "CIF CDF" TO CALLER'S FIELD. DCA SFIELD /STORE IN-LINE FOR RETURN LATER. TAD I SYSENT /GET THE FUNCTION WORD. JMS SNDNUM /SEND IT TO THE SERVER. ISZ SYSENT /BUMP PAST FUNCTION WORD. TAD I SYSENT /GET THE CALLER'S BUFFER ADDRESS. JMS SNDNUM /TELL IT TO THE SERVER [THIS COULD GO AWAY]. TAD I SYSENT /GET THE CALLER'S BUFFER ADDRESS AGAIN. DCA SLOC /STORE FOR TRANSFERS LATER. ISZ SYSENT /BUMP TO RECORD ARGUMENT. TAD I SYSENT /GET THE STARTING RECORD NUMBER. JMS SNDNUM /SET TO SERVER. ISZ SYSENT /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 SYSERR /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. WKUP, "A&177 /CONSTANT 0101; ALSO HARMLESS "AND" INSTRUCTION. ISZ WORDCT /DONE ENOUGH WORDS? JMP RXLP /NO, KEEP GOING. JMP GETACK /GET THE FINAL STATUS BEFORE EXITING. ENTRY2, VERS /ENTRY POINT FOR "B" SIDE. SLOC= .-1 /ALSO USED AS STORAGE POINTER. CLA /CLEAN UP. TAD ENTRY2 /GET OUR CALLER. DCA SYSENT /MAKE IT THEIRS. CLA CLL IAC /SET AC TO 1 FOR "B" SIDE OFFSET. JMP SETUP1 /CONTINUE THERE. 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 FIRST HALF FOR A MOMENT. RKSF /RECEIVE FLAG UP? JMP .-1 /NO, WAIT FOR IT. RKRB /GET SECOND SIXBIT CHARACTER INTO AC. TAD SNDNUM /MERGE IN FIRST HALF. JMP I GETNUM /RETURN TO CALLER. / 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. ISZ SLOC /BUMP TO NEXT LOCATION. NOP /HERE IN CASE IT SKIPS. JMS SNDNUM /SEND THE WORD TO THE SERVER. 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 SYSENT /BUMP TO NORMAL RETURN. SFIELD, HLT /THIS WILL BE "CIF CDF" TO CALLER'S FIELD. JMP I SYSENT /TAKE GOOD RETURN TO CALLER. / COMES HERE IF THERE WAS AN ERROR. SYSERR, STL RAR /FORCE ERROR CONDITION, MOVE DOWN STATUS BITS. JMP SFIELD /TAKE ERROR RETURN. SCDI, CIF CDF 00 /CONSTANT 6203. WORDCT, .-. /WORD COUNT FOR DATA TRANSFER. ZBLOCK 7744-. /EMPTY SPACE. RELOC /TURN OFF RELOCATION. $ /THAT'S ALL, FOLK!