*200 JMS I (WNA3) 1^100+30 0000 5070 HLT HLT PAGE / WINCHESTER NON-SYSTEM HANDLER / NON-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. / THIS ASSEMBLY PRODUCES A SET OF CO-RESIDENT HANDLERS FOR A GROUP OF UP TO / EIGHT REGIONS ON ONE PHYSICAL DRIVE UNIT. PARAMETERS ARE AVAILABLE TO ADJUST / THE GROUP NAME, DRIVE NUMBER, AND CHOICE OF ENTRY POINTS. / REQUIRES PDP-8/E PROCESSOR (OR BETTER). / DISK ORGANIZATION: / THIS HANDLER ADDRESSES ONE PHYSICAL DRIVE (EITHER ZERO OR ONE AS DETERMINED BY / THE "DRIVE" PARAMETER) AS A HANDLER GROUP. THE HANDLER GROUP ADDRESSES UP TO / EIGHT 4096 RECORD REGIONS (EACH IS TWO MEGABYTES). THE ASSEMBLY PARAMETER / "GROUP" DETERMINES WHICH 32768 RECORD HANDLER GROUP IS ADDRESSED BY THIS / HANDLER ASSEMBLY. LARGER DISKS WILL REQUIRE SEVERAL SETS OF HANDLER GROUPS. / THE "GROUP" PARAMETER WILL ALSO (PARTIALLY) DETERMINE THE NAME OF EACH HANDLER / ENTRY POINT: / GROUP A (OS/8 LOWER LIMIT VIA THIS METHOD) / WNA0: (OR RDA0:) RECORD 0000000-0007777 FIRST REGION / WNA1: (OR RDA1:) RECORD 0010000-0017777 SECOND REGION / WNA2: (OR RDA2:) RECORD 0020000-0027777 THIRD REGION / WNA3: (OR RDA3:) RECORD 0030000-0037777 FOURTH REGION / WNA4: (OR RDA4:) RECORD 0040000-0047777 FIFTH REGION / WNA5: (OR RDA5:) RECORD 0050000-0057777 SIXTH REGION / WNA6: (OR RDA6:) RECORD 0060000-0067777 SEVENTH REGION / WNA7: (OR RDA7:) RECORD 0070000-0077777 EIGHTH REGION / GROUP Z (OS/8 UPPER LIMIT VIA THIS METHOD) / WNZ0: (OR RDZ0:) RECORD 3200000-3207777 FIRST REGION / WNZ1: (OR RDZ1:) RECORD 3210000-3217777 SECOND REGION / WNZ2: (OR RDZ2:) RECORD 3220000-3227777 THIRD REGION / WNZ3: (OR RDZ3:) RECORD 3230000-3237777 FOURTH REGION / WNZ4: (OR RDZ4:) RECORD 3240000-3247777 FIFTH REGION / WNZ5: (OR RDZ5:) RECORD 3250000-3257777 SIXTH REGION / WNZ6: (OR RDZ6:) RECORD 3260000-3267777 SEVENTH REGION / WNZ7: (OR RDZ7:) RECORD 3270000-3277777 EIGHTH REGION / THIS METHOD ALLOWS ASSEMBLY OF ANY GROUP OF REGIONS FOR ANY ONE PHYSICAL DRIVE / UP TO 1507328 OS/8 RECORDS (OR 416 MEGABYTES). / DEVICE NAME CONSIDERATIONS: / THE OVERALL DEVICE NAME FOR EVERY HANDLER WITHIN THIS ASSEMBLY IS DETERMINED / BY THE "DEVTYPE" PARAMETER. DEVICE NAMES MAY BE EITHER OF THE FORM WNXY: OR / RDXY:, WHERE THE X MAY BE ANY GROUP LETTER FROM A-Z, AND Y IS ANY DIGIT FROM / 0-7. THE WNXY: DEVICE NAMES ARE TO BE USED FOR FIXED WINCHESTERS; THE RDXY: / DEVICE NAMES ARE TO BE USED FOR (PARTIALLY) REMOVABLE DISKS. / ENTRY POINT CONSIDERATIONS: / SINCE LARGER DISKS WILL REQUIRE ARBITRARY CHOICES OF HANDLERS (POSSIBLY FROM / SEVERAL GROUPS IN DIFFERENT ASSEMBLIES), A CHOICE IS AVAILABLE FOR ENTRY / POINTS TO MINIMIZE ANOMALIES. IT IS THE USER'S RESPONSIBILITY TO ENSURE / UNIQUE ENTRY POINTS WITHIN ANY BUILT OS/8 SYSTEM, AS WELL AS UNIQUE DEVICE / NAMES (WHICH CAN BE ALTERED BY OS/8 BUILD). / DEVICE SIZE CONSIDERATIONS: / ALL HANDLERS ARE PRESUMED TO ADDRESS A REGION OF 4096 RECORDS. (THE EXISTING / OS/8 LIMITATIONS IMPOSE A VALUE OF 4095 MAXIMUM, THUS WASTING ONE RECORD.) / DEPENDING ON THE ACTUAL DEVICE SIZE, THE HIGHEST POSSIBLE IMPLEMENTED REGION / OF THE DISK MAY NOT BE FULL SIZE, REQUIRING SPECIAL DIRECTORY HANDLING. TWO / SOLUTIONS TO THIS ARE: / 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). IN 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). / CHANGE "DEVTYPE" TO 0 IF FIXED, 1 IF REMOVABLE (DEFAULT IS 0). / CHANGE "DRIVE" TO 0 OR 1 TO MATCH THE DESIRED PHYSICAL DRIVE UNIT (DEFAULT IS / 0). / CHANGE "ENT30" TO 1 OR 0 TO CREATE ENTRY POINTS 030-037 OR OTHERWISE (DEFAULT / IS 0). / CHANGE "ENT40" TO 1 OR 0 TO CREATE ENTRY POINTS 040-047 OR OTHERWISE (DEFAULT / IS 1). / CHANGE "ENT50" TO 1 OR 0 TO CREATE ENTRY POINTS 050-057 OR OTHERWISE (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 TYPE DMA= 4000 /DMA INDICATOR IFNDEF DRIVE /DEFAULT IS PHYSICAL DRIVE 0 IFNDEF ENT30 /DON'T USE ENTRIES 030-037 BY DEFAULT IFNDEF ENT40 /DON'T USE ENTRIES 040-047 BY DEFAULT IFNDEF ENT50 /DON'T USE ENTRIES 050-057 BY DEFAULT IFZERO ENT30+ENT40+ENT50 < ENT40= 1 /DEFAULT TO USING ENTRIES 040-047 > IFNDEF GROUP /DEFAULT IS GROUP "A" HGROUP= GROUP-1 /ORIGIN 0 FORM OF GROUP IFNDEF IDNUM /DEFAULT IS SCSI ADDRESS 0 NL2000= CLA CLL CML RTR /LOAD AC WITH 2000 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! -10 /8 HANDLERS IN THIS GROUP IFZERO DEVTYPE < HN= "W^100+"N-300 /DEVICE WNXX > IFNZRO DEVTYPE < HN= "R^100+"D-300 /DEVICE RDXX > HN; "0+DRIVE^100+GROUP /GROUP NAME HN; GROUP^100+"0-200 /PERMANENT NAME DEVNUM^10+4000 /DCB WORD WNA0&177 /ENTRY POINT WORD ZBLOCK 2 /BUILD WANTS IT THIS WAY HN; "0+DRIVE^100+GROUP /GROUP NAME HN; GROUP^100+"1-200 /PERMANENT NAME DEVNUM^10+4000 /DCB WORD WNA1&177 /ENTRY POINT WORD ZBLOCK 2 /BUILD WANTS IT THIS WAY HN; "0+DRIVE^100+GROUP /GROUP NAME HN; GROUP^100+"2-200 /PERMANENT NAME DEVNUM^10+4000 /DCB WORD WNA2&177 /ENTRY POINT WORD ZBLOCK 2 /BUILD WANTS IT THIS WAY HN; "0+DRIVE^100+GROUP /GROUP NAME HN; GROUP^100+"3-200 /PERMANENT NAME DEVNUM^10+4000 /DCB WORD WNA3&177 /ENTRY POINT WORD ZBLOCK 2 /BUILD WANTS IT THIS WAY HN; "0+DRIVE^100+GROUP /GROUP NAME HN; GROUP^100+"4-200 /PERMANENT NAME DEVNUM^10+4000 /DCB WORD WNA4&177 /ENTRY POINT WORD ZBLOCK 2 /BUILD WANTS IT THIS WAY HN; "0+DRIVE^100+GROUP /GROUP NAME HN; GROUP^100+"5-200 /PERMANENT NAME DEVNUM^10+4000 /DCB WORD WNA5&177 /ENTRY POINT WORD ZBLOCK 2 /BUILD WANTS IT THIS WAY HN; "0+DRIVE^100+GROUP /GROUP NAME HN; GROUP^100+"6-200 /PERMANENT NAME DEVNUM^10+4000 /DCB WORD WNA6&177 /ENTRY POINT WORD ZBLOCK 2 /BUILD WANTS IT THIS WAY HN; "0+DRIVE^100+GROUP /GROUP NAME HN; GROUP^100+"7-200 /PERMANENT NAME DEVNUM^10+4000 /DCB WORD WNA7&177 /ENTRY POINT WORD ZBLOCK 2 /BUILD WANTS IT THIS WAY / PAGE *400 IFNZRO .&177 L6575, 6575 /CONSTANT 6575 TSTKBD, .-. /TEST FOR <^C> ROUTINE KSF /FLAG UP? JMP I TSTKBD /NO, RETURN TAD L1200/(1200) /YES, SET PARITY BIT, ETC. KRS /READ IT IN L1200, TAD L6575/(-1203) /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/(SBOOT) /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 SNA CLA /SKIP IF ANY ERRORS JMP I WAIT /ELSE RETURN / NL4000 /SET ERROR VALUE / JMP CALLRETURN /TAKE ERROR RETURN DSRS HLT COMPTR, TABLE-LOC8 /COMMAND TABLE POINTER ADJUSTMENT FACTOR ISZCONT,ISZ CONTRL /INSTRUCTION CONSTANT IFNZRO ENT30 < L37, 37 /CONSTANT 0037 > IFZERO ENT30 < / COMMAND TABLE. TABLE, IDNUM^400+6!DMA /TABLE LENGTH WITH DMA INDICATOR AND ID NUMBER 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, 000&377 /CONTROL WORD TRFLD, .-.&377 /BANK (0000) AND TRANSFER FIELD (0-7) TRADDR, .-. /TRANSFER ADDRESS > IFNZRO ENT50 < BUTOFFS,20^OFFSET /OFFSET FOR BOOT AREA DGFIXUP,DRIVE^40+HGROUP^10-INST /DRIVE AND GROUP+(FIXUP FOR "DCA WNA0") FIXUP, -INST /FIXUP FOR "DCA WNA0" L37, 37 /CONSTANT 0037 > ZBLOCK .+7&7770-. /EMPTY SPACE TO MAINTAIN ALIGNMENT IFNZRO .&7 WNA0, VERSION /REGION 0 ENTRY POINT WNA1, ISZ CONTRL /REGION 1 ENTRY POINT WNA2, ISZ CONTRL /REGION 2 ENTRY POINT WNA3, ISZ CONTRL /REGION 3 ENTRY POINT WNA4, ISZ CONTRL /REGION 4 ENTRY POINT WNA5, ISZ CONTRL /REGION 5 ENTRY POINT WNA6, ISZ CONTRL /REGION 6 ENTRY POINT WNA7, ISZ CONTRL /REGION 7 ENTRY POINT WNEND= . /END OF HANDLER ENTRY POINT LIST IFNZRO .-WNEND L7600, CLA!400 /CLEAN UP RDF /GET CALLING FIELD TAD LCIDF/(CIF CDF) /MAKE INTO CIF CDF RETURN INSTRUCTION DCA CALLRET /SAVE FOR EXIT LATER TAD CONTRL /GET CALLING UNIT L40, CMA /INVERT SENSE TAD TADWNEND/(TAD WNEND) /MAKE INTO "TAD WNA0+N" INSTRUCTION DCA GETINST /STORE IN-LINE NL2000 /TAD (DCA-TAD) /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/(ISZ CONTROL)/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 BSW /MOVE OVER AND L37/(37) /JUST PAGE BITS SNA /SKIP IF ANY TAD L40/(40) /ELSE USE MAXIMUM DCA SCTCNT /STASH SECTOR COUNT TAD I CALLPC /GET FUNCTION WORD AGAIN RAR /MOVE OVER AND L37/(34) /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 /CLEAR LINK NOW TAD BUTOFFSET /ADD ON OFFSET SZL /SKIP IF NO CARRY INTO NEXT REGION ISZ PUTINST /BUMP "DCA WNA0+N" TO NEXT REGION CLL RAL /DOUBLE TO PAGE-SIZE BLOCKS DCA SECTLO /STORE LOW-ORDER SECTOR ADDRESS TADWNEN,TAD L7600/(7400) /SETUP MASK AND SECTLO /GET BACK HIGH-ORDER BITS TAD PUTINST /ADD ON "DCA WNA0+N" TAD FIXUP /REMOVE EXTRANEOUS STUFF CML RTL;RTL;RAL /MOVE UP DCA SECTMD /STORE MIDDLE SECTOR ADDRESS TAD PUTINST /GET "DCA WNA0+N" TAD DGFIXUP /REMOVE EXTRANEOUS STUFF, ADD DRIVE AND GROUP CLL RTR;RAR /MOVE DOWN DCA SECTHI /STORE HIGH-ORDER SECTOR ADDRESS AND UNIT 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/(TABLE-LOC8) /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 IFZERO ENT50 < BUTOFFS,20^OFFSET /OFFSET FOR BOOT AREA DGFIXUP,DRIVE^40+HGROUP^10-INST /DRIVE AND GROUP+(FIXUP FOR "DCA WNA0") FIXUP, -INST /FIXUP FOR "DCA WNA0" IFZERO ENT30 < L37, 37 /CONSTANT 0037 > > IFNZRO ENT30 < / COMMAND TABLE. TABLE, IDNUM^400+6!DMA /TABLE LENGTH WITH DMA INDICATOR AND ID NUMBER 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, 000&377 /CONTROL WORD TRFLD, .-.&377 /BANK (0000) AND TRANSFER FIELD (0-7) TRADDR, .-. /TRANSFER ADDRESS > INST= DCA WNA0 /INSTRUCTION CONSTANT $ /THAT'S ALL FOLK!