/ WINCHESTER DISK SYSTEM HANDLER / SYSTEM HANDLER FOR FIXED OR REMOVABLE WINCHESTER DISK. / LAST EDIT: 03-OCT-1988 22:00:00 CJL / COPYRIGHT (C) 1985, 1988 CHARLES LASNER ASSOCIATES. / SUPPORTED HARDWARE: / 1) CESI MDC8 HOST ADAPTER (MINIMUM FIRMWARE REVISION 02). / 2A) OMTI 20-C, D, OR 5000 SERIES DISK CONTROLLER (5100, 5200, 5300, 5400). / 3A) ST506-TYPE DRIVE ON PHYSICAL UNIT ZERO OR ONE. / 2B) SYQUEST 555 REMOVABLE DRIVE WITH IMBEDDED CONTROLLER. / REQUIRES PDP-8/E PROCESSOR (OR BETTER). / THIS ASSEMBLY PRODUCES A SET OF HANDLERS FOR SYS AND UP TO TWO ADDITIONAL / CO-RESIDENT HANDLERS. THE SYSTEM HANDLER CAN BE BOOTSTRAPPED ON EITHER DRIVE / ZERO OR ONE; THE ASSOCIATED NON-SYSTEM CO-RESIDENT HANDLERS WILL ADDRESS THE / PHYSICAL UNIT ESTABLISHED AT BOOTSTRAP TIME. THIS IS A CONSIDERATION ONLY FOR / REMOVABLE DRIVES, OR FOR OFTEN RESTRAPPED DRIVES ONLY, AS MOST CONFIGURATIONS / ARE RELATIVELY STABLE. IF THE PHYSICAL DRIVE IS SUBJECT TO CONSIDERABLE / DYNAMIC CHANGE (SAME REMOVABLE MEDIA MOVED BETWEEN DIFFERENT SYSTEMS WHERE ONE / IS PHYSICAL DRIVE ZERO AND ANOTHER IS PHYSICAL DRIVE ONE), IT IS RECOMMENDED / THAT THE CORRESPONDING NON-SYSTEM HANDLERS BE USED TO AVOID ANOMALY. IF THE / ADVANTAGE OF "MOVABLE" HANDLERS IS DESIRED (OR THE CO-RESIDENCY IS NEEDED), / THEN THESE TWO ADDITIONAL HANDLERS ARE AVAILABLE. AN ALIAS TO SYS (WN*0 OR / RD*0) IS ALSO AVAILABLE FOR COMPLETENESS. / PHYSICAL DRIVE ZERO OR ONE (AS DETERMINED AT BOOTSTRAP TIME) IS BROKEN DOWN / INTO ONE OR MORE GROUPS OF UP TO EIGHT 4096 RECORD REGIONS (EACH IS TWO / MEGABYTES). NON-SYSTEM HANDLERS EXIST TO ADDRESS ALL OF THE EIGHT REGIONS PER / HANDLER GROUP (SEE THE NON-SYSTEM HANDLERS ELSEWHERE). THIS SET OF HANDLERS / ADDRESSES THE FIRST THREE REGIONS (12288 RECORDS) OF ANY ONE GROUP, AS / DETERMINED BY THE "GROUP" PARAMETER, WHICH DETERMINES WHICH 32768 RECORD GROUP / IS SELECTED. THE DEVICE NAMES ARE AS FOLLOWS: / GROUP A (OS/8 LOWER LIMIT VIA THIS METHOD) / SYS: RECORD 0000000-0007777 FIRST REGION / WNA0: (OR RDA0:) RECORD 0000000-0007777 FIRST REGION / WNA1: (OR RDA1:) RECORD 0010000-0017777 SECOND REGION / WNA2: (OR RDA2:) RECORD 0020000-0027777 THIRD REGION / GROUP Z (OS/8 UPPER LIMIT VIA THIS METHOD) / SYS: RECORD 3200000-3207777 FIRST REGION / WNZ0: (OR RDZ0:) RECORD 3200000-3207777 FIRST REGION / WNZ1: (OR RDZ1:) RECORD 3210000-3217777 SECOND REGION / WNZ2: (OR RDZ2:) RECORD 3220000-3227777 THIRD REGION / DEVICE NAME CONSIDERATION: / THE OVERALL DEVICE NAME FOR EVERY HANDLER WITHIN THIS ASSEMBLY (EXCEPT "SYS") / IS DETERMINED BY THE "DEVTYPE" PARAMETER. DEVICE NAMES MAY EITHER BE OF THE / FORM WNXY: OR RDXY:, WHERE THE X MAY BE ANY GROUP LETTER FROM A-Z, AND Y IS / ANY DIGIT FROM 0-2 AS NECESSARY. THE WNXY: DEVICE NAMES ARE TO BE USED FOR / FIXED WINCHESTERS; THE RDXY: DEVICE NAMES ARE TO BE USED FOR (PARTIALLY) / REMOVABLE DISKS. / 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). / CHANGE "DEVTYPE" TO 0 IF FIXED, 1 IF REMOVABLE (DEFAULT IS 0). / CHANGE "GROUP" TO"A&37 THROUGH "Z&37 AS NECESSARY TO ADDRESS THE PROPER GROUP / OF HANDLERS (DEFAULT IS "A&37). / CHANGE "IDNUM" TO 0 THROUGH 7 AS NECESSARY TO ADDRESS THE PROPER SCSI PORT / ADDRESS (DEFAULT IS 0). / CHANGE "OFFSET" TO 0 OR 1 AS NECESSARY (DEFAULT IS 1; OFFSET=1 DEFINES A / RESERVED BOOT AREA ON THE DISK). / 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 IFNDEF DEVTYPE /DEFAULT IS FIXED DISK DEVICE TYPE DMA= 4000 /DMA INDICATOR IFNDEF GROUP /DEFAULT GROUP IS "A" HGROUP= GROUP-1 /ORIGIN 0 FORM OF GROUP IFNDEF IDNUM /DEFAULT IS SCSI ADDRESS 0 NL4000= CLA CLL CML RAR /LOAD AC WITH 4000 IFNDEF OFFSET /DEFAULT IS TO OFFSET PAST BOOT AREA VERSION="I&77 /VERSION NUMBER FOR RESORC / BUILD HEADER, ETC. *0 /THAT'S WHERE BUILD WANTS IT! -4 /4 HANDLERS IN THIS GROUP IFZERO DEVTYPE < GNHI= "W^100+"D-300 /HIGH-ORDER GROUP NAME HN= "W^100+"N-300 /DEVICE WNXY > IFNZRO DEVTYPE < GNHI= "R^100+"D-300 /HIGH-ORDER GROUP NAME HN= "R^100+"D-300 /DEVICE RDXY > GNLO= "S^100+"K-300 /LOW-ORDER GROUP NAME GNHI; GNLO /GROUP NAME DEVICE SYS /PERMANENT NAME DEVNUM^10+4000 /DCB WORD SYSENT&177+2000 /ENTRY POINT WORD 0 /BUILD WANTS IT THIS WAY 7777 /ZERO SYS: TO 4095 BLOCKS GNHI; GNLO /GROUP NAME HN; GROUP^100+"0-200/PERMANENT NAME DEVNUM^10+4000 /DCB WORD SYSENT&177+1000 /ENTRY POINT WORD ZBLOCK 2 /BUILD WANTS IT THIS WAY GNHI; GNLO /GROUP NAME HN; GROUP^100+"1-200/PERMANENT NAME DEVNUM^10+4000 /DCB WORD WDSK&177+1000 /ENTRY POINT WORD ZBLOCK 2 /BUILD WANTS IT THIS WAY GNHI; GNLO /GROUP NAME HN; GROUP^100+"2-200/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= . /SECONDARY BOOT CODE READS IN HERE CAF /POWER CLEAR IS GOOD ENOUGH TO CLEAR AC DSRS /GET STATUS NOW SPA CLA /SKIP IF IDLE JMP .-2 /ELSE JUST WAIT FOR IT DSHI /START THE COMMAND NOW DSRS /GET STATUS SMA CLA /SKIP IF NOW BUSY JMP .-2 /ELSE WAIT FOR IT DSCF /CLEAR THE FLAG NOW TAD DSCOM/(COMAND) /POINT TO COMMAND DSGO /START IT UP DSSF /FLAG UP? JMP .-1 /NO, WAIT FOR IT DSCF /YES, CLEAR IT DSRS /GET STATUS NOW CLL RAL /REMOVE BUSY BIT SZA /SKIP IF OTHERWISE OK HLT /ELSE BARF DSIM /FINISH THE COMMAND TAD BUTDRIVE /GET DRIVE BITS BOVRLAY,JMP . /WAIT FOR OVERLAY BUTDRIV,0001 /OR 0401 FOR DRIVE ONE DSCOM, COMAND /POINTER TO COMMAND TABLE / COMMAND TABLE. COMAND, 6!DMA /LENGTH WITH DMA INDICATOR 10&377 /READ HGROUP&377 /OR HGROUP!40&377 FOR DRIVE 1 000&377 /MIDDLE SECTOR WORD 40^OFFSET&377 /LOW-ORDER SECTOR WORD 2&377 /READ TWO SECTORS 000&377 /CONTROL WORD 000&377 /BANK AND FIELD 0000 /TRANSFER ADDRESS / IT IS ALSO POSSIBLE TO BOOTSTRAP THE SYSTEM BY EXECUTING A BOOT COMMAND FROM / AN EXTERNAL LOCATION: *400 /ANYWHERE PAST 0377 WILL DO EXTRNBU,CAF /POWER CLEAR IS GOOD ENOUGH TO CLEAR AC DSRS /GET STATUS NOW SPA CLA /SKIP IF IDLE JMP .-2 /ELSE JUST WAIT FOR IT DSHI /START THE COMMAND NOW DSRS /GET STATUS SMA CLA /SKIP IF NOW BUSY JMP .-2 /ELSE WAIT FOR IT DSCF /CLEAR THE FLAG NOW TAD EDSCOM/(COMAND) /POINT TO COMMAND DSGO /START IT UP JMS DSWAIT /WAIT FOR COMMAND TO TAKE DSIM /FINISH THE COMMAND JMS DSWAIT /WAIT FOR COMMAND TO COMPLETE TAD EBTDRIVE /GET DRIVE BITS JMP BEXTERN /CONTINUE THERE DSWAIT, .-. /WAIT ROUTINE DSSF /FLAG UP? JMP .-1 /NO, WAIT FOR IT DSCF /YES, CLEAR IT DSRS /GET STATUS NOW CLL RAL /REMOVE BUSY BIT SZA /SKIP IF OTHERWISE OK HLT /ELSE BARF JMP I DSWAIT /RETURN EBTDRIV,0001 /OR 0401 FOR DRIVE ONE EDSCOM, DCOMAND /POINTER TO COMMAND TABLE / COMMAND TABLE. DCOMAND,6!DMA /LENGTH WITH DMA INDICATOR 10&377 /READ HGROUP&377 /OR HGROUP!40&377 FOR DRIVE 1 000&377 /MIDDLE SECTOR WORD 40^OFFSET&377 /LOW-ORDER SECTOR WORD 2&377 /READ TWO SECTORS 000&377 /CONTROL WORD 000&377 /BANK AND FIELD 0000 /TRANSFER ADDRESS / OTHER BOOTSTRAPPING METHODS. / IT IS NOT LIKELY THIS HANDLER WILL EVER BE DIRECTLY INVOLVED IN BOOTSTRAPPING / THE WINCHESTER DISK DRIVE: / IF THE "OFFSET" PARAMETER IS SET TO ONE, A BOOTSTRAP MONITOR MUST BE PRESENT / ON THE ABSOLUTE BEGINNING (CYLINDER ZERO) OF THE WINCHESTER DISK DRIVE. IN / THIS CASE, THE BLOCKS RESERVED FOR THE BOOTSTRAP MONITOR AREA CANNOT BE / ADDRESSED BY THESE HANDLERS. THIS IS A SAFETY FEATURE TO PREVENT ACCIDENTAL / DESTRUCTION OF THIS INFORMATION NEEDED TO MAINTAIN THE VIABILITY OF THE ENTIRE / DISK DRIVE. **NOTE** USING THIS HANDLER WITH "OFFSET" SET TO ZERO (OR ANY OF / ITS PREDECESSORS WHICH DIDN'T SUPPORT THE CONCEPT OF AN OFFSET, AND / EFFECTIVELY RAN WITH "OFFSET" SET TO ZERO) WILL DESTROY THE BOOTSTRAP MONITOR / AREA THUS INVALIDATING ITS USE WITH THE CURRENT DIAGNOSTIC (DMU) PROGRAMS, / ETC. THE BOOTSTRAP MONITOR IS RESPONSIBLE FOR MAINTAINING THE ASSIGN DISK / PARAMETERS COMMANDS FOR THE CONTROLLER, THE FLAW MANAGEMENT TABLES, DRIVE / SERIAL NUMBER AND CREATION DATE ETC. IT CAN BE CONFIGURED TO BOOTSTRAP THE / VOLUME WHERE THIS HANDLER RESIDES (OR ANY OTHER BOOTSTAPPABLE VOLUME) EITHER / AUTOMATICALLY OR MANUALLY AS DESIRED. SEE DOCUMENTATION ON THE BOOTSTRAP / MONITOR AVAILABLE SEPARATELY. / IF THE "OFFSET" PARAMETER IS SET TO ZERO (INDICATING THE ABSOLUTE USE OF THE / DISK FOR OS/8 WITHOUT THE BOOTSTRAP MONITOR WHICH IS NOT RECOMMENDED) OR IT IS / DESIRABLE TO USE A SIMPLER BOOTSTRAP TO LOAD IN THE BOOTSTRAP MONITOR, THE / FOLLOWING (SHORTER) PROGRAM CAN BE USED: *21 /WHERE TO LOAD THIS 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 /BOOTSTRAP VALUE; 0401 FOR UNIT 1 / IT IS ALSO POSSIBLE TO BOOTSTRAP THE SYSTEM BY EXECUTING A BOOT COMMAND FROM / AN EXTERNAL LOCATION: *400 /ANYWHERE PAST 0377 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 /BOOTSTRAP VALUE; 0401 FOR UNIT 1 *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/(400) /JUST ODD UNIT BIT JMP BMORE /CONTINUE THERE BOVRLAY,JMP BSTART /OVERLAYS WAITING MACHINE HERE IFNZRO 25-. BEXTERN,DCA BOVRLAY /EXTERNAL BOOTSTRAP COMES HERE; SAVE PASSED UNIT JMP BLOOP /CONTINUE THERE BMORE, CLL RTR;RAR /MOVE DOWN TAD I BSECTHI/(SECTHI)/GET HANDLER GROUP DCA I BSECTHI/(SECTHI)/STORE BACK JMP I B7605/(7605) /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; ALSO CONSTANT 7600 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 ISZ CONTRL /SET ADDITIONAL REGION TWO OFFSET WDSKCOM,ISZ CONTRL /SET REGION ONE OFFSET SYSCOMM,RDF /GET CALLING FIELD TAD SCIF/(CIF) /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 BSW /MOVE OVER AND S37/(37) /JUST PAGE BITS SNA /SKIP IF ANY TAD S40/(40) /ELSE USE MAXIMUM DCA SCTCNT /STORE IN COMMAND TAD I WDSK2 /GET FUNCTION WORD AGAIN RAR /MOVE OVER AND S37/(34) /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 /CLEAR LINK NOW TAD BUTOFFSET /ADD ON OFFSET SZL /SKIP IF NO CARRY INTO NEXT REGION ISZ CONTRL /BUMP TO NEXT REGION CLL RAL /DOUBLE TO PAGE-SIZE BLOCKS DCA SECTLO /STORE IN COMMAND TAD SECTLO /GET IT BACK AND S7600/(7400) /JUST HIGH-ORDER BITS TAD CONTRL /ADD ON REGION BITS RTL;RTL;RAL /MOVE UP DCA SECTMD /STORE IN COMMAND ISZ WDSK2 /BUMP TO ERROR RETURN DCA CONTRL /CLEAR CONTROL WORD 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/(TABLE) /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 BUTOFFS,20^OFFSET /OFFSET FOR BOOT AREA ZBLOCK SPA SZL CLA-. /EMPTY SPACE / COMMAND TABLE. TABLE, IDNUM^400+6!DMA /TABLE LENGTH PLUS DMA INDICATOR AND ID NUMBER RWCOM, .-.&377 /0010 IF READING, 0012 IF WRITING SECTHI, HGROUP&377 /HIGH-ORDER SECTOR (GROUP) (+40 IF UNIT 1) 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!