/MDC8 WINCHESTER SYSTEM HANDLER / LAST EDIT: 17-FEB-1985 03:00:00 CJL / OS/8 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 SUPPORTS THE FIRST THREE REGIONS OF EITHER / WINCHESTER DISK AND IS COMPATIBLE WITH THE EQUIVALENT / NON-SYSTEM HANDLER. / THE HANDLER CAN BE BOOTSTRAPPED TO EITHER DRIVE ZERO OR ONE; / ALL HANDLERS WILL REFER TO THE BOOTSTRAPPED UNIT'S REGIONS: / SYS: WNA0: (IF DRIVE 0) WNB0: (IF DRIVE 1) / WSYS: WNA0: (IF DRIVE 0) WNB0: (IF DRIVE 1) / WDSK: WNA1: (IF DRIVE 0) WNB1: (IF DRIVE 1) / WDS2: WNA2: (IF DRIVE 0) WNB2: (IF DRIVE 1) / 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 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! -4 /4 HANDLERS IN THIS GROUP DEVICE MDWS /GROUP NAME DEVICE SYS /PERMANENT NAME DEVNUM^10+4000 /DCB WORD SYSENT&177+2000 /ENTRY POINT WORD 0 /BUILD WANTS IT THIS WAY 7777 /DEVICE LENGTH FOR ZEROING SYS: /4095 DECIMAL BLOCKS DEVICE MDWS /GROUP NAME DEVICE WSYS /PERMANENT NAME DEVNUM^10+4000 /DCB WORD SYSENT&177+1000 /ENTRY POINT WORD ZBLOCK 2 /BUILD WANTS IT THIS WAY DEVICE MDWS /GROUP NAME DEVICE WDSK /PERMANENT NAME DEVNUM^10+4000 /DCB WORD WDSK&177+1000 /ENTRY POINT WORD ZBLOCK 2 /BUILD WANTS IT THIS WAY DEVICE MDWS /GROUP NAME DEVICE WDS2 /PERMANENT NAME DEVNUM^10+4000 /DCB WORD WDSK2&177+1000 /ENTRY POINT WORD ZBLOCK 2 /BUILD WANTS IT THIS WAY BSTART-BEND /BOOTSTRAP LENGTH / THE BOOTSTRAP CODE FOLLOWS (WHEN BINARY OUTPUT RESUMES). / MANUAL BOOTSTRAP FOR WINCHESTER SYSTEM. HERE, NOPUNCH /FOOL THE ASSEMBLER *0 /WHERE THE CODE IS READ IN SCNDBT, *21 /GET TO TOGGLE-IN REGION SHORTBT,CAF /POWER CLEAR IS GOOD ENOUGH TO CLEAR AC TAD BTUNIT /GET BOOTSTRAP VALUE DSIM /START IT UP BOVRLAY,JMP . /WAIT FOR OVERLAY BTUNIT, 0001 /0401 FOR UNIT 1/BOOTSTRAP VALUE / IT IS ALSO POSSIBLE TO BOOTSTRAP THE SYSTEM BY EXECUTING A BOOT COMMAND / FROM AN EXTERNAL LOCATION: *1000 /ANYWHERE PAST 377 WILL DO EXTRNBU,CAF /POWER CLEAR IS GOOD ENOUGH TO CLEAR AC TAD EXTUNIT /GET BOOTSTRAP VALUE DSIM /START IT UP ISZ .-2 /WAIT FOR JMP .-1 /AWHILE DSRS /GET STATUS NOW SPA /SKIP IF NOT BUSY JMP .-2 /ELSE WAIT FOR IT SZA /SKIP IF OK HLT /ELSE COMPLAIN TAD EXTUNIT /GET UNIT BITS AGAIN JMP BEXTERN /CONTINUE THERE EXTUNIT,0001 /0401 FOR UNIT 1/BOOTSTRAP VALUE *HERE /RESTORE ORIGIN HERE, ENPUNCH /RESTORE BINARY OUTPUT RELOC SCNDBT /WHERE THIS CODE COMES IN BSTART, DCA BOVRLAY /SAVE PASSED UNIT DSRS /GET CURRENT STATUS SPA /SKIP IF NOT BUSY JMP .-2 /ELSE WAIT FOR IT SZA /BETTER BE CLEAR HLT /ELSE BARF! BLOOP, TAD I BFROM1 /GET A FIELD ONE WORD CDF 10 /GOTO FIELD ONE DCA I BCOUNT /STORE IT CDF 00 /BACK TO FIELD ZERO TAD I BFROM2 /GET A FIELD ZERO WORD DCA I BCOUNT /STORE IT ISZ BCOUNT /DONE ALL YET? JMP BLOOP /NO, GO BACK FOR MORE / THE FOLLOWING TWO WORDS MUST BE HERE (TO BE AUTO-INDEX REGISTERS) / AND EXECUTE AS AND INSTRUCTIONS. BFROM1, BSTART-1 /WHERE FIELD ONE CODE IS NOW BFROM2, BSTART+200-1 /WHERE FIELD ZERO CODE IS NOW B400, 400 /CONSTANT 0400 TAD BOVRLAY /GET BOOTSTRAP UNIT AND B400 /JUST ODD UNIT BIT JMP BMORE /CONTINUE THERE BOVRLAY,JMP BSTART /OVERLAYS WAITING MACHINE HERE IFNZRO 25-. BEXTERN,DCA BOVRLAY /EXTERNAL BOOTSTRAP STARTS HERE;SAVE PASSED UNIT JMP BLOOP /CONTINUE THERE BMORE, CLL RTR;RAR /MOVE DOWN DCA I BSECTHI /STORE EITHER WAY JMP I B7605 /GO START IT UP BCOUNT, SBOOT /COUNTER AND POINTER BSECTHI,SECTHI /POINTER TO HIGH-ORDER SECTOR ADDRESS B7605, 7605 /WHERE TO RESTART OS/8 BEND= . /END OF BOOTSTRAP OVERLAY CODE RELOC /RESTORE REAL ORIGIN PAGE /ACTUAL HANDLER CODE HERE RELOC 7600 /WHERE IT EXECUTES SBOOT, ZBLOCK 7 /BUILD WANTS IT THIS WAY SYSENT, VERSION /SYSTEM HANDLER ENTRY POINT S7600, CLA!400 /CLEAN UP TAD SYSENTRY /GET OUR CALLER DCA WDSK2 /MAKE IT THEIRS JMP SYSCOMMON /CONTINUE THERE WDSK, VERSION /REGION ONE ENTRY POINT CLA /CLEAN UP TAD WDSK /GET OUR CALLER DCA WDSK2 /MAKE IT THEIRS JMP WDSKCOMMON /CONTINUE THERE WDSK2, VERSION /REGION TWO ENTRY POINT SCMPTR, SPA SZL CLA /COMMAND POINTER;THIS CLEARS THE AC SCIF, CIF 00 /CIF CONSTANT;THIS CAN BE SKIPPED TAD S40 /GET ADDITIONAL REGION TWO OFFSET WDSKCOM,TAD S40 /GET REGION ONE OFFSET SYSCOMM,DCA SECTMD /SAVE IN COMMAND FOR NOW RDF /GET CALLING FIELD TAD SCIF /TURN INTO CIF RETURN FIELD INSTRUCTION DCA SYSRETURN /STORE IN-LINE NL4000 /SET READ/WRITE MASK AND I WDSK2 /GET THE BIT CLL IAC RTL /4 IF READING, 5 IF WRITING RAL /10 IF READING, 12 IF WRITING DCA RWCOM /STORE IN COMMAND TAD I WDSK2 /GET FUNCTION WORD RTR;RTR;RTR /MOVE OVER AND S37 /JUST PAGE BITS SNA /SKIP IF ANY TAD S40 /ELSE USE MAXIMUM DCA SCTCNT /STORE IN COMMAND TAD I WDSK2 /GET FUNCTION WORD AGAIN RAR /MOVE OVER AND S37 /JUST FIELD BITS (MOSTLY) CLL RTR /MOVE DOWN DCA TRFLD /STORE (BANK AND) FIELD ISZ WDSK2 /BUMP TO TRANSFER ADDRESS TAD I WDSK2 /GET TRANSFER ADDRESS DCA TRADDRESS /STORE IN COMMAND ISZ WDSK2 /BUMP TO RECORD NUMBER TAD I WDSK2 /GET RECORD NUMBER CLL RAL /DOUBLE TO PAGE-SIZE BLOCKS DCA SECTLO /STORE IN COMMAND TAD SECTLO /GET IT BACK AND S7600/7400 /JUST HIGH-ORDER BITS RTL;RTL;RAL /MOVE UP TAD SECTMD /GET REGION BIT DCA SECTMD /STORE IN COMMAND ISZ WDSK2 /BUMP TO ERROR RETURN DSRS /GET STATUS NOW SPA CLA /SKIP IF IDLE JMP .-2 /ELSE WAIT FOR IT DSHI /SEND HIGH-ORDER COMMAND ADDRESS DSRS /GET STATUS SMA CLA /SKIP IF BUSY JMP .-2 /ELSE WAIT FOR IT DSCF /CLEAR DONE FLAG NOW TAD SCMPTR /POINT AT OUR COMMAND DSGO /GO START IT UP JMS SWAIT /WAIT FOR COMMAND TO TAKE DSIM /FINISH THE COMMAND JMS SWAIT /WAIT FOR COMMAND TO COMPLETE ISZ WDSK2 /BUMP TO GOOD RETURN SYSRETU,.-. /WILL BE CIF RETURN FIELD JMP I WDSK2 /RETURN TO CALLER SWAIT, .-. /WAIT ROUTINE DSSF /FLAG UP? JMP .-1 /NO, WAIT FOR IT DSCF /YES, CLEAR IT DSRS /GET STATUS NOW CLL RAL /REMOVE BUSY BIT SNA CLA /SKIP IF ANY ERRORS JMP I SWAIT /ELSE RETURN NL4000 /SET ERROR VALUE JMP SYSRETURN /TAKE FAILING RETURN ZBLOCK SPA SZL CLA-. /EMPTY SPACE / COMMAND TABLE. TABLE, 6!DMA /TABLE LENGTH PLUS DMA INDICATOR RWCOM, .-.&377 /0010 IF READING, 0012 IF WRITING SECTHI, 0&377 /OR 040&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 S37, 37 /CONSTANT 0037 S40, 40 /CONSTANT 0040 RELOC /TURN OFF RELOCATION $ /THAT'S ALL FOLK!