/MDC8 WINCHESTER NON-SYSTEM HANDLER / LAST EDIT: 17-FEB-1985 03:00:00 CJL / OS/8 NON-SYSTEM HANDLER FOR ST506 TYPE WINCHESTER DRIVES ON / UNIT ZERO AND ONE OF OMTI 20-D CONTROLLER WITH CESI MDC8. / HANDLER ASSUMES MDC802 FIRMWARE. / REQUIRES PDP-8/I PROCESSOR (OR BETTER). / (C) 1985 CHARLES LASNER ASSOCIATES. / THIS HANDLER MAPS BOTH WINCHESTERS INTO EIGHT REGIONS OF / 4096 OS/8 RECORDS EACH. / DEPENDING ON ACTUAL DEVICE SIZE, THE HIGHEST ACTUALLY IMPLEMENTED REGION / OF EITHER DISK MAY NOT BE FULL SIZE, REQUIRING SPECIAL HANDLING OF / ITS DIRECTORY. THERE ARE TWO SOLUTIONS TO THIS PROBLEM: / 1) PATCH PIP SO A SPECIAL VARIANT VERSION CONTAINS THE PROPER LENGTH / FOR THE HIGHEST REGION (ALL LOWER REGIONS ARE / IDENTICALLY SET TO 4095 BLOCKS). / 2) RE-ASSEMBLE THE HANDLER FOR A DIFFERENT DEVICE NUMBER AND / INSERT THAT HANDLER INTO THE SYSTEM THUS NOT CO-RESIDENT WITH THE / OTHER HANDLERS. THIS WAY PIP CAN BE PATCHED TO HAVE BOTH LENGTHS. / ASSEMBLY INSTRUCTIONS: / CHANGE "DEVCODE" TO PROPER DEVICE CODE AS NECESSARY (DEFAULT IS 70). / CHANGE "DEVNUM" TO PROPER OS/8 DEVICE NUMBER AS NECESSARY (DEFAULT IS 63). / MAY BE ASSEMBLED WITH '/J' (OS/8 PAL8 '/F') SWITCH SET. / ASSEMBLY DEFINITIONS, ETC. / MDC8 IOT DEFINITIONS. IFNDEF DEVCODE /USES 670X BY DEFAULT DSEI= DEVCODE^10+6000 /INTERRUPT ENABLE/DISABLE PER AC[11] DSSF= DEVCODE^10+6001 /SKIP ON DONE FLAG DSCF= DEVCODE^10+6002 /CLEAR DONE FLAG DSHI= DEVCODE^10+6003 /LOAD HIGH-ORDER COMMAND ADDRESS DSGO= DEVCODE^10+6004 /LOAD LOW-ORDER COMMAND AND GO / = DEVCODE^10+6005 /UNUSED DSRS= DEVCODE^10+6006 /READ STATUS DSIM= DEVCODE^10+6007 /INTERFACE MAINTENANCE INSTRUCTION / OTHER DEFINITIONS. IFNDEF DEVNUM /USE 63 FOR DEFAULT OS/8 DEVICE NUMBER DMA= 4000 /DMA INDICATOR NL2000= CLA CLL CML RTR /LOAD AC WITH 2000 NL4000= CLA CLL CML RAR /LOAD AC WITH 4000 VERSION="E&77 /VERSION NUMBER FOR RESORC / BUILD HEADER, ETC. *0 /THAT'S WHERE BUILD WANTS IT! -20 /16 HANDLERS IN THIS GROUP DEVICE MDWN /GROUP NAME DEVICE WNA0 /PERMANENT NAME DEVNUM^10+4000 /DCB WORD WNA0&177 /ENTRY POINT WORD ZBLOCK 2 /BUILD WANTS IT THIS WAY DEVICE MDWN /GROUP NAME DEVICE WNA1 /PERMANENT NAME DEVNUM^10+4000 /DCB WORD WNA1&177 /ENTRY POINT WORD ZBLOCK 2 /BUILD WANTS IT THIS WAY DEVICE MDWN /GROUP NAME DEVICE WNA2 /PERMANENT NAME DEVNUM^10+4000 /DCB WORD WNA2&177 /ENTRY POINT WORD ZBLOCK 2 /BUILD WANTS IT THIS WAY DEVICE MDWN /GROUP NAME DEVICE WNA3 /PERMANENT NAME DEVNUM^10+4000 /DCB WORD WNA3&177 /ENTRY POINT WORD ZBLOCK 2 /BUILD WANTS IT THIS WAY DEVICE MDWN /GROUP NAME DEVICE WNA4 /PERMANENT NAME DEVNUM^10+4000 /DCB WORD WNA4&177 /ENTRY POINT WORD ZBLOCK 2 /BUILD WANTS IT THIS WAY DEVICE MDWN /GROUP NAME DEVICE WNA5 /PERMANENT NAME DEVNUM^10+4000 /DCB WORD WNA5&177 /ENTRY POINT WORD ZBLOCK 2 /BUILD WANTS IT THIS WAY DEVICE MDWN /GROUP NAME DEVICE WNA6 /PERMANENT NAME DEVNUM^10+4000 /DCB WORD WNA6&177 /ENTRY POINT WORD ZBLOCK 2 /BUILD WANTS IT THIS WAY DEVICE MDWN /GROUP NAME DEVICE WNA7 /PERMANENT NAME DEVNUM^10+4000 /DCB WORD WNA7&177 /ENTRY POINT WORD ZBLOCK 2 /BUILD WANTS IT THIS WAY DEVICE MDWN /GROUP NAME DEVICE WNB0 /PERMANENT NAME DEVNUM^10+4000 /DCB WORD WNB0&177 /ENTRY POINT WORD ZBLOCK 2 /BUILD WANTS IT THIS WAY DEVICE MDWN /GROUP NAME DEVICE WNB1 /PERMANENT NAME DEVNUM^10+4000 /DCB WORD WNB1&177 /ENTRY POINT WORD ZBLOCK 2 /BUILD WANTS IT THIS WAY DEVICE MDWN /GROUP NAME DEVICE WNB2 /PERMANENT NAME DEVNUM^10+4000 /DCB WORD WNB2&177 /ENTRY POINT WORD ZBLOCK 2 /BUILD WANTS IT THIS WAY DEVICE MDWN /GROUP NAME DEVICE WNB3 /PERMANENT NAME DEVNUM^10+4000 /DCB WORD WNB3&177 /ENTRY POINT WORD ZBLOCK 2 /BUILD WANTS IT THIS WAY DEVICE MDWN /GROUP NAME DEVICE WNB4 /PERMANENT NAME DEVNUM^10+4000 /DCB WORD WNB4&177 /ENTRY POINT WORD ZBLOCK 2 /BUILD WANTS IT THIS WAY DEVICE MDWN /GROUP NAME DEVICE WNB5 /PERMANENT NAME DEVNUM^10+4000 /DCB WORD WNB5&177 /ENTRY POINT WORD ZBLOCK 2 /BUILD WANTS IT THIS WAY DEVICE MDWN /GROUP NAME DEVICE WNB6 /PERMANENT NAME DEVNUM^10+4000 /DCB WORD WNB6&177 /ENTRY POINT WORD ZBLOCK 2 /BUILD WANTS IT THIS WAY DEVICE MDWN /GROUP NAME DEVICE WNB7 /PERMANENT NAME DEVNUM^10+4000 /DCB WORD WNB7&177 /ENTRY POINT WORD ZBLOCK 2 /BUILD WANTS IT THIS WAY / PAGE *200 /BUILD NEEDS THIS! IFNZRO .&177 L37, 37 /CONSTANT 0037 TSTKBD, .-. /TEST FOR <^C> ROUTINE KSF /FLAG UP? JMP I TSTKBD /NO, RETURN TAD L200 /YES, SET PARITY BIT KRS /READ IT IN TAD L7575 /COMPARE TO <^C> SZA CLA /SKIP IF IT MATCHES JMP I TSTKBD /ELSE JUST RETURN LCIDF, CIF CDF 00 /BACK TO FIELD 0 JMP I L7600 /BACK TO OS/8 MONITOR WAIT, .-. /WAIT ROUTINE DSSF /FLAG UP? JMP .-1 /NO, WAIT FOR IT DSCF /YES, CLEAR IT DSRS /GET STATUS NOW CLL RAL /REMOVE BUSY BIT COMPTR, SNA CLA /SKIP IF ANY ERRORS JMP I WAIT /ELSE RETURN NL4000 /SET ERROR VALUE JMP CALLRETURN /TAKE ERROR RETURN L7575, 7575 /CONSTANT 7575 ISZCONT,ISZ CONTRL /INSTRUCTION CONSTANT / COMMAND TABLE. TABLE, 6!DMA /TABLE LENGTH WITH DMA INDICATOR RWCOM, .-.&377 /0010 IF READING, 0012 IF WRITING SECTHI, .-.&377 /UNIT BITS AND HIGH-ORDER SECTOR ADDRESS SECTMD, .-.&377 /MIDDLE SECTOR ADDRESS SECTLO, .-.&377 /LOW-ORDER SECTOR ADDRESS SCTCNT, .-.&377 /SECTOR COUNTER (1-40) CONTRL, 0&377 /CONTROL WORD TRFLD, .-.&377 /BANK (0000) AND TRANSFER FIELD (0-7) TRADDR, .-. /TRANSFER ADDRESS ZBLOCK .+17&7760-. /EMPTY SPACE TO MAINTAIN ALIGNMENT IFNZRO .&17 WNA0, VERSION /WINCHESTER 0 REGION 0 ENTRY POINT WNA1, ISZ CONTRL /WINCHESTER 0 REGION 1 ENTRY POINT WNA2, ISZ CONTRL /WINCHESTER 0 REGION 2 ENTRY POINT WNA3, ISZ CONTRL /WINCHESTER 0 REGION 3 ENTRY POINT WNA4, ISZ CONTRL /WINCHESTER 0 REGION 4 ENTRY POINT WNA5, ISZ CONTRL /WINCHESTER 0 REGION 5 ENTRY POINT WNA6, ISZ CONTRL /WINCHESTER 0 REGION 6 ENTRY POINT WNA7, ISZ CONTRL /WINCHESTER 0 REGION 7 ENTRY POINT WNB0, ISZ CONTRL /WINCHESTER 1 REGION 0 ENTRY POINT WNB1, ISZ CONTRL /WINCHESTER 1 REGION 1 ENTRY POINT WNB2, ISZ CONTRL /WINCHESTER 1 REGION 2 ENTRY POINT WNB3, ISZ CONTRL /WINCHESTER 1 REGION 3 ENTRY POINT WNB4, ISZ CONTRL /WINCHESTER 1 REGION 4 ENTRY POINT WNB5, ISZ CONTRL /WINCHESTER 1 REGION 5 ENTRY POINT WNB6, ISZ CONTRL /WINCHESTER 1 REGION 6 ENTRY POINT WNB7, ISZ CONTRL /WINCHESTER 1 REGION 7 ENTRY POINT WINEND= . /END OF HANDLER ENTRY POINT LIST L7600, CLA!400 /CLEAN UP IFNZRO L7600-WINEND RDF /GET CALLING FIELD TAD LCIDF /MAKE INTO CIF CDF RETURN INSTRUCTION DCA CALLRET /SAVE FOR EXIT LATER TAD CONTRL /GET CALLING UNIT L40, CMA /INVERT SENSE TAD TADWIN /MAKE INTO "TAD WNA0+N" INSTRUCTION DCA GETINST /STORE IN-LINE TAD GETINST /GET IT BACK AND L37/7 /REMOVE BAD BITS CLL RTL;RTL;RAL /MOVE UP DCA SECTMD /STORE IN COMMAND FOR NOW TAD GETINST /GET IT AGAIN RTL /MOVE UP AND L40 /JUST DRIVE BIT DCA SECTHI /STORE IN COMMAND NL2000 /GET "DCA-TAD" TAD GETINST /FORM "DCA WNA0+N" INSTRUCTION DCA PUTINST /STORE IN-LINE CALLPC, /CALLING ADDRESS STORED HERE GETINST,.-. /WILL BE "TAD WNA0+N" DCA CALLPC /SAVE ACTUAL CALLER TAD ISZCONTRL /GET RESTORING INSTRUCTION PUTINST,.-. /WILL BE "DCA WNA0+N" DCA CONTRL /CLEAR CONTROL WORD NL4000 /SET READ/WRITE MASK AND I CALLPC /GET READ/WRITE BIT CLL IAC RTL /4 IF READING, 5 IF WRITING RAL /10 IF READING, 12 IF WRITING DCA RWCOM /STASH COMMAND TAD I CALLPC /GET FUNCTION WORD RTR;RTR;RTR /MOVE OVER L200, AND L37 /JUST PAGE BITS SNA /SKIP IF ANY TAD L40 /ELSE USE MAXIMUM DCA SCTCNT /STASH SECTOR COUNT TAD I CALLPC /GET FUNCTION WORD AGAIN RAR /MOVE OVER AND L37 /JUST FIELD BITS (MOSTLY) CLL RTR /MOVE DOWN DCA TRFLD /STORE (BANK AND) FIELD ISZ CALLPC /BUMP TO TRANSFER ADDRESS TAD I CALLPC /GET TRANSFER ADDRESS DCA TRADDRESS /STASH IN COMMAND ISZ CALLPC /BUMP TO RECORD NUMBER TAD I CALLPC /GET RECORD NUMBER CLL RAL /DOUBLE TO PAGE-SIZE BLOCKS DCA SECTLO /STORE LOW-ORDER SECTOR ADDRESS TADWIN, TAD L7600/7400 /SETUP MASK AND SECTLO /GET BACK HIGH-ORDER BITS RTL;RTL;RAL /MOVE UP TAD SECTMD /ADD ON REGION BITS DCA SECTMD /STORE MIDDLE SECTOR ADDRESS JMS TSTKBD /CHECK FOR <^C> DSRS /GET STATUS SPA CLA /SKIP IF CONTROLLER IS IDLE JMP .-3 /ELSE WE MIGHT AS WELL WAIT JMS LOC8 /FIND OUT WHERE WE ARE LOADED LOC8, .-. /WILL BE OUR OWN PC ISZ CALLPC /BUMP TO ERROR RETURN DSHI /SEND HIGH-ORDER COMMAND ADDRESS DSRS /GET STATUS SMA CLA /SKIP IF BUSY JMP .-2 /ELSE KEEP WAITING DSCF /CLEAR DONE FLAG NOW TAD LOC8 /GET OUR PC TAD COMPTR /ADJUST TO COMMAND TABLE DSGO /GO START IT UP JMS WAIT /WAIT FOR COMMAND TO TAKE DSIM /FINISH THE COMMAND JMS WAIT /WAIT FOR COMMAND TO COMPLETE JMS TSTKBD /CHECK FOR <^C> ISZ CALLPC /BUMP RETURN ADDRESS CALLRET,.-. /WILL BE CIF CDF RETURN INSTRUCTION JMP I CALLPC /RETURN TO CALLER FOO= TABLE-LOC8 /RELOCATION FACTOR IFNZRO SNA CLA-FOO $ /THAT'S ALL FOLK!