/ P?S/8 WINCHESTER SYSTEM HANDLER / P?S/8 SYSTEM HANDLER FOR ANY (FIXED OR REMOVABLE) MDC8 DISKS. / LAST EDIT: 11-DEC-1989 06:00:00 CJL / THIS IS THE SYSTEM HANDLER FOR HARD DISKS ATTACHED TO THE MDC8. THE DISK / STORAGE IS PARTITIONED INTO NAMED GROUPS (GROUP) OF 65,536 BLOCKS EACH OF / WHICH IS CONTROLLED BY TWO HANDLERS. HANDLER DETERMINATION IS CONTROLLED BY A / HANDLER SET BIT (HSET) WHICH INDICATES WHICH HANDLER IS IN EFFECT. (0=LOWER / HANDLER, 1=UPPER HANDLER). EACH HANDLER IS RESPONSIBLE FOR 32,768 BLOCKS / BROKEN DOWN INTO 8 UNITS OF 4,096 BLOCKS EACH. THIS IS THE P?S/8 LIMIT OF / ADDRESSABILITY FOR MINIMUM GRANULARITY HANDLERS (A REQUIREMENT FOR SYSTEM / HANDLERS), AND IS COMPATIBLE WITH NORMAL P?S/8 SYSTEM HANDLER REQUIREMENTS. / SUPPORTED HARDWARE: / 1) CESI SCSI HOST ADAPTER (MINIMUM FIRMWARE REVISION 02). ONE ADAPTER IS / REQUIRED PER SYSTEM ATTACHED TO AS MANY AS EIGHT CONTROLLERS. / 2) OMTI 20-C, 20-D, OR COMPATIBLE SCSI CONTROLLER (5X00 SERIES) WITH / SUITABLE DRIVES ATTACHED. / 3) SYQUEST 555 REMOVABLE CARTRIDGE (SQ400 TYPE) WITH IMBEDDED SCSI / CONTROLLER. / OMTI 20-C, 20-D AND 5X00 (5100, 5200, 5300, 5400) SERIES CONTROLLERS EACH / SUPPORT UP TO TWO ST-506-COMPATIBLE DRIVES. / REQUIRES PDP-8/I PROCESSOR OR BETTER. / THIS ASSEMBLY PRODUCES A SYSTEM HANDLER WHICH CAN DYNAMICALLY CONFIGURE FOR A / SPECIFIC HANDLER SET WITHIN A SPECIFIC GROUP ON ANY PHYSICAL DRIVE ON ANY / CONTROLLER ADDRESS (ID). THE HANDLER WILL ADDRESS 32,768 LOGICAL BLOCKS OF / CONTIGUOUS STORAGE ON THE DEVICE AS EIGHT UNITS OF 4,096 BLOCKS EACH. / THE SYSTEM HANDLER REQUIRES EXTENDED MEMORY (THIS IS AN ADJUSTABLE CORE-SIZE / LIMITING HANDLER). / CONFIGURATION CONSIDERATIONS. / THIS SYSTEM HANDLER IS CONFIGURED TO ADDRESS A PARTICULAR GROUP AND / HSET VALUE ON THE DEVICE AND IS TOTALLY COMPATIBLE WITH THE CORRESPONDING / NON-SYSTEM HANDLER SIMILARLY CONFIGURED. WHEN USED IN A STAND-ALONE MANNER / (WITHOUT MENU-8 OR EQUIVALENT), THE HANDLER ADDRESSES THE DESIGNATED PORTION / OF THE DEVICE (AS WOULD THE CORRESPONDING NON-SYSTEM HANDLER) INDICATED BY / THESE PARAMETERS. IN ADDITION, THESE VALUES APPLY DURING STAND-ALONE SYSTEM / GENERATION. (SEE BELOW FOR A DETAILED DESCRIPTION OF THE GROUP AND HSET / PARAMETERS.) DURING EITHER STAND-ALONE OPERATION OR STAND-ALONE SYSTEM / GENERATION THE P?S/8 LOGICAL UNIT MUST BE ZERO. THE IDNUM (SCSI ID) AND / LOGUNIT (SCSI LOGICAL UNIT) PARAMETERS APPLIED TO THIS ASSEMBLY ARE FOR SYSTEM / GENERATION PURPOSES ONLY (SEE BELOW FOR A MORE COMPLETE DESCRIPTION OF THE / IDNUM AND LOGUNIT PARAMETERS.) / SHOULD THE HANDLER BE USED IN A STAND-ALONE ENVIRONMENT THIS IS THE / ONLY CONFIGURATION POSSIBLE (THIS IS PARTIALLY DUE TO RESTRICTIONS AND / LIMITATIONS OF THE BOOTSTRAP ARCHITECTURE OF THE MDC8). ASSUMING AN EXTENDED / BOOTSTRAP IS PERFORMED, THE LOGICAL UNIT AND SCSI ID NUMBER PARAMETERS WILL BE / DYNAMICALLY DETERMINED, BUT THE GROUP AND HSET VALUES WILL BE TAKEN AS GIVEN / IN THE GENERATION-SPECIFIC ASSEMBLY PARAMETERS, ALONG WITH THE RESTRICTION OF / BOOTSTRAP CAPABILITY TO P?S/8 LOGICAL UNIT ZERO ONLY. / IF MENU-8 (OR A COMPATIBLE MECHANISM) IS USED TO INITIALLY LOAD THIS / HANDLER (AFTER SYSTEM GENERATION), THE P?S/8 LOGICAL UNIT, GROUP AND HSET / PARAMETERS CAN ALSO BE DYNAMICALLY DETERMINED. THIS ALLOWS A RELOCATABLE / VOLUME WITHOUT RECONFIGURING (AND GENERALLY REQUIRES ASSERTING THE OFFSET / PARAMETER; SEE BELOW FOR A DESCRIPTION OF THE OFFSET PARAMETER). THE MENU-8 / VOLUME PARAMETER INDICATING MENU-8 BOOTSTRAP PROCEDURES BEING REQUIRED SHOULD / BE SET ACCORDINGLY WHEN USING THIS HANDLER UNDER MENU-8 (SEE MENU-8 / DOCUMENTATION FOR ALLOCATION UNIT FLAGS AND VOLUME FLAGS FOR FURTHER DETAILS). / CONFIGURATION PARAMETERS. / THIS ASSEMBLY SHOULD BE CONFIGURED FOR THE INTENDED HANDLER REQUIRED BY THE / USER'S SYSTEM FOR STAND-ALONE SYSTEM GENERATION AND/OR STAND-ALONE OPERATION. / THE FOLLOWING ARE PARAMETERS FOR CONSIDERATION: / A) GROUP - THE HANDLER CREATED BY THIS ASSEMBLY SPECIFICALLY ADDRESSES / HALF OF A DESIGNATED REGION OF 65,536 CONTIGUOUS BLOCKS WHICH IS KNOWN AS A / GROUP. ANY GROUP SUPPORTS 8 MWORDS (8,388,608 WORDS) OR 16 MBYTES (16,777,216 / BYTES). EACH HANDLER SUPPORTS 32,768 BLOCKS OF 128 WORDS AS EIGHT HANDLER / UNITS OF 4,096 BLOCKS PER UNIT. EACH UNIT THUS SUPPORTS .5 MWORDS (524,288 / WORDS) OR 1 MBYTES (1,048,576 BYTES). TOTAL HANDLER SUPPORT IS 4 MWORDS / (4,194,304 WORDS) OR 8 MBYTES (8,388,608 BYTES). THIS IS THE UPPER LIMIT OF / ADDRESSABILITY OF ANY INDIVIDUAL P?S/8 HANDLER COMPATIBLE WITH THE P?S/8 / SYSTEM HANDLERS. / TWO HANDLERS ARE USED TO ADDRESS THE STORAGE GROUP. THE SPECIFIC / GROUP CHOSEN WILL BE IDENTIFIED BY A CHARACTERISTIC LETTER ("A"-"Z") WHICH / WILL DETERMINE WHICH 8 MWORDS IS ADDRESSED BY THE GROUP OUT OF 208 MWORDS / (218,103,808 WORDS) OR 416 MBYTES (436,207,616 BYTES). (THIS METHOD PREVENTS / STATIC ACCESS TO THE ADDITIONAL SPACE THEORETICALLY AVAILABLE ON THE DEVICE / WHICH IS HARDWARE-LIMITED TO 256 MWORDS (268,435,456 WORDS) OR 512 MBYTES / (536,870,912 BYTES). THIS HANDLER MUST BE RE-WRITTEN TO SPECIFICALLY ADDRESS / THIS STORAGE IF REQUIRED.) / B) HSET - THE HANDLER SET MUST BE INDICATED AS EITHER UPPER (HSET= 1) OR / LOWER (HSET= 0) FOR STATIC PURPOSES (STAND-ALONE SYSTEM GENERATION OR / STAND-ALONE OPERATION). / C) IDNUM - EVERY CONTROLLER WITHIN THIS SYSTEM (KNOWN AS SASI OR SCSI) / REQUIRES AN ID NUMBER OR UNIQUE TARGET DEVICE ADDRESS. THE HANDLER MUST BE / ASSEMBLED FOR A KNOWN ID NUMBER WHICH WILL BE USED FOR STAND-ALONE SYSTEM / GENERATION PURPOSES ONLY. UP TO EIGHT ID NUMBERS (0-7) ARE ALLOWED. / D) OFFSET - THE HANDLER CAN BE ASSEMBLED WITH NO OFFSET, I.E., IT WOULD / ADDRESS THE ABSOLUTE BEGINNING OF THE DEVICE (POSSIBLY BIASED BY AN INTEGER / MULTIPLE OF A POWER OF TWO BLOCKS INTO THE DEVICE) AND IS MEANT TO HAVE / INDEPENDENT DOMAIN OVER THE DEVICE. THIS OPTION EXISTS FOR COMPATIBILITY WITH / VARIOUS OBSOLETE MECHANISMS WHICH ARE NOT RECOMMENDED FOR CURRENT / APPLICATIONS. / THE PROPER MANAGEMENT OF DISK DEVICES SUCH AS ARE USUALLY ATTACHED TO / THE MDC8 REQUIRES THAT A DEVICE MAINTAINENCE AREA BE RESERVED ON THE DEVICE / FOR DEFECT MANAGEMENT, ETC. THE MOST COMPREHENSIVE OF THESE IS THE MENU-8 / UTILITY SYSTEM WHICH ALLOWS SUBORDINATE SYSTEMS (SUCH AS P?S/8) TO BE LOADED / INDIRECTLY. PROPER ASSEMBLY OF THE HANDLER FOR THIS ENVIRONMENT REQUIRES / SETTING THE OFFSET PARAMETER. ALL LOGICAL BLOCKS ARE CONVERTED TO PHYSICAL / BLOCKS BY ADDING A SMALL FIXED OFFSET (WHICH PLACES THE AFFECTED BLOCKS PAST A / PROTECTED AREA WHERE THE MENU SYSTEM RESIDES). / E) LOGUNIT - THE LOGICAL UNIT PARAMETER WILL BE USED FOR STAND-ALONE / SYSTEM GENERATION PURPOSES ONLY. VARIOUS CONTROLLERS ALLOW LOGICAL UNIT / VALUES TO BE ASSERTED FROM 0 THROUGH 7. CERTAIN CONTROLLERS SUPPORT THE UNIT / FIELD WITHIN THE I/O COMMAND, BUT RESTRICT USEFUL ACCESS TO LOGICAL UNIT 0 / ONLY. (ON THESE CONTROLLERS, OTHER LOGICAL UNIT VALUES RETURN "NOT READY", / "NOT SELECTED" OR OTHER SUCH ERRORS.) / THE SUPPORTED OMTI CONTROLLERS ALLOW FOUR LOGICAL UNITS (0-3), AS THE / HIGH-ORDER LOGICAL UNIT BIT IS IGNORED. CONTROLLER CONFIGURATION RULES EITHER / RESTRICT OR RECOMMEND (FOR COMPATIBILITY WITH MORE RESTRICTIVE CONTROLLERS) / THE USE OF LOGICAL UNITS 0 AND 1 FOR WINCHESTER DISK DRIVES. OTHER UNITS MAY / BE ASSIGNED TO OTHER DEVICES SUCH AS DISKETTE DRIVES, ETC.; THE CONTROLLERS / GENERALLY SUPPORT ONLY TWO WINCHESTER DRIVES MAXIMUM. THE OMTI 20 SERIES / CONTROLLERS RESTRICT THE USE OF LOGICAL UNITS 0 AND 1 TO WINCHESTERS ONLY, AND / SPECIFY LOGICAL UNITS 2 AND 3 FOR DISKETTES. / THE SUPPORTED SYQUEST 555 REMOVABLE CARTRIDGE DRIVES (WITH PROPERLY / FORMATTED SQ400 CARTRIDGES) MUST BE ADDRESSED AS LOGICAL UNIT ZERO ONLY, AS / THE SCSI CONTROLLER IS "IMBEDDED" IN THE HARDWARE OF THE PHYSICAL DRIVE, I.E., / IT IS AN INTEGRAL PART OF THE DRIVE ITSELF. THE SCSI ID NUMBER MAY BE / STRAPPED FOR ANY NON-CONFLICTING VALUE FROM 0 THROUGH 7 VIA JUMPERS ON THE / OUTSIDE OF THE DRIVE (SEE SYQUEST DOCUMENTATION ELSEWHERE). / ASSEMBLY INSTRUCTIONS: / CHANGE "DEVCODE" TO PROPER MDC8 DEVICE CODE AS NECESSARY (DEFAULT IS 70). / 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 "HSET" TO 0 OR 1 AS NECESSARY TO ADDRESS THE PROPER HALF OF THE / SELECTED GROUP WITH THE PROPER HANDLER SET (DEFAULT IS 0). / CHANGE "LOGUNIT" TO 0 THROUGH 7 AS NECESSARY TO ADDRESS THE PROPER LOGICAL / UNIT (DEFAULT IS 0). / CHANGE "OFFSET" TO 0 OR 1 AS NECESSARY (DEFAULT IS 1; OFFSET=1 DEFINES A / RESERVED BOOT AREA ON THE DISK FOR MENU-8, ETC.). / MAY BE ASSEMBLED WITH '/J' (OS/8 PAL8 '/F') SWITCH SET. // P?S/8 EQUATED SYMBOLS. ADRLST= 7603 /ZAP ADDRESS LIST BBLEN= 0043 /SLURP LOADER BOOTSTRAP LENGTH BINADR= 0020 /"%" BLOCK BINIT= 0020 /SLURP INITIALIZE ROUTINE BINITLN=0020 /LENGTH OF SLURP INITIALIZE CODE BINIT2= 0031 /SECONDARY SLURP INITIALIZE ADDRESS CALADR= 0020 /CALLING ADDRESS CALFLD= 0021 /CALLING FIELD CNTLST= 7615 /CONTENTS LIST FOR ZAPPED ADDRESSES DEVSIZE=6760 /DEVICE SIZE WORD IN SYSGEN ROUTINE DSPBLB= 0024 /BLURB DISPLAY ROUTINE ERRTRP= 0046 /ERROR TRAP POINTER ESTATUS=0077 /ERROR STATUS EXHGEN= 4010 /EXTENDED HANDLER GENERATION FIELD AND ADDRESS EXHRUN= 6010 /EXTENDED HANDLER INITIAL LOADING FIELD AND ADDRESS EXIGEN= 3410 /EXTENDED HANDLER INITIALIZE GENERATION FIELD, ADDRESS EXIRUN= 5400 /EXTENDED HANDLER INITIALIZE LOADING FIELD, ADDRESS FILBLB= 0023 /BLURB FILL ROUTINE GENAD1= 7400 /SYSIO GENERATION ADDRESS HBLOCK= 0101 /LOWEST "HELPER" BLOCK HIDWRD= 7600 /SYSTEM HANDLER ID WORD IOTRAP= 0045 /I/O TRAP POINTER MONSTRT=0353 /KEYBOARD MONITOR STARTUP ADDRESS MOVBLB= 0022 /ERROR BLURB MOVE ROUTINE PCHLOOP=0162 /POINTER TO CHARACTER INPUT ROUTINE REWIND= 1335 /REWIND ROUTINE ADDRESS SBLOCK= 7635 /SYSTEM LOADER BLOCK ARGUMENT SBOOT= 7600 /MONITOR RESTART ADDRESS SBTFUN= 7602 /SYSTEM BOOTSTRAP FUNCTION SCORE= 7633 /SYSTEM LOADER TRANSFER ADDRESS SCRSIZE=7611 /SYSTEM MEMORY SIZE, ETC. WORD SDATE= 7610 /SYSTEM LOW-ORDER DATE WORD SFILES= 7757 /FILE LIST PASSED HERE SFUN= 7634 /SYSTEM LOADER FUNCTION WORD SLOAD= 7632 /SYSTEM LOADER ADDRESS SLPGEN= 4420 /SLURP LOADER GENERATION FIELD AND ADDRESS SLPSA= 7777 /SLURP LOADER STARTING ADDRESS WORD SLUPAGE=2600 /SLURP LOADING PAGE SOUTFLS=7607 /OUTPUT FILE COUNT PASSED HERE SPARM= 7756 /EQUALS PARAMETER PASSED HERE STHFIX= 7300 /SYSGEN TIME FIXUP ROUTINE SWAL= 7604 /SWITCHES /A-/L SWMX= 7605 /SWITCHES /M-/X SWY9= 7606 /SWITCHES /Y-/9 SYSIO= 7640 /SYSTEM I/O ENTRY POINT SYSTART=7637 /SYSTEM LOADER STARTUP ADDRESS TRAPIO= 1041 /ENTRY POINT FOR I/O TRAPS TRPERR= 1200 /ENTRY POINT FOR I/O ERROR TRAPS TRPGEN= 1020 /TRAP ROUTINE GENERATION FIELD AND ADDRESS WRITE= 4000 /SYSIO WRITE BIT ZAPLST= 7627 /REPLACEMENT LIST FOR ZAPPED ADDRESSES // END OF P?S/8 EQUATED SYMBOLS. / 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 / MISCELLANEOUS DEFINITIONS. DMA= 4000 /DMA INDICATOR IFNDEF GROUP /HANDLER GROUP IFNDEF HSET /HANDLER SET IFNDEF IDNUM /SCSI ID IFNDEF LOGUNIT /LOGICAL UNIT NL0001= CLA IAC /LOAD AC WITH 0001 NL0002= CLA CLL CML RTL /LOAD AC WITH 0002 NL4000= CLA CLL CML RAR /LOAD AC WITH 4000 NL7775= CLA CLL CMA RTL /LOAD AC WITH 7775 IFNDEF OFFSET /DEVICE OFFSET (FOR MENU-8) SBOFF= SLUPAGE-SBOOT /OFFSET VALUE SYSADJ= 0001 /ADJUSTABLE CORE SIZE HANDLER SYSNUM= 0011 /SYSTEM ID NUMBER **** MUST BE UNIQUE **** WINSIZE=10000 /LOGICAL UNIT SIZE / MANUAL BOOTSTRAP FOR DIRECT LOADING OF WINCHESTER SYSTEM VOLUME. NOPUNCH /FOOL THE ASSEMBLER *0 /WHERE THE CODE IS READ IN 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,LOGUNIT^40+IDNUM^10+1 /BOOTSTRAP VALUE DSCOM, COMAND /POINTER TO COMMAND TABLE / COMMAND TABLE. COMAND, IDNUM^400+DMA+6 /DMA, ID AND COMMAND LENGTH 10&377 /READ LOGUNIT^40+GROUP-1&377 /HIGH-ORDER SECTOR WORD HSET^10+0^20&377 /MIDDLE SECTOR WORD (P?S/8 UNIT MUST BE ZERO) OFFSET^40&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 BTEXTRN&177 /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,LOGUNIT^40+IDNUM^10+1 /BOOTSTRAP DRIVE VALUE EDSCOM, DCOMAND /POINTER TO COMMAND TABLE / COMMAND TABLE. DCOMAND,IDNUM^400+DMA+6 /DMA, ID AND COMMAND LENGTH 10&377 /READ LOGUNIT^40+GROUP-1&377 /HIGH-ORDER SECTOR WORD HSET^10+0^20&377 /MIDDLE SECTOR WORD (P?S/8 UNIT MUST BE ZERO) OFFSET^40&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. / SHOULD THIS BE THE CASE, THE BLOCKS RESERVED FOR THE BOOTSTRAP MONITOR AREA / MUST NOT BE ADDRESSED BY THESE HANDLERS. THIS IS A SAFETY FEATURE TO PREVENT / ACCIDENTAL DESTRUCTION OF THE 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 AND / THE MENU UTILITIES (MENU-8), ETC. THE BOOTSTRAP MONITOR (MENU-8) IS / RESPONSIBLE FOR MAINTAINING THE ASSIGN DISK PARAMETERS COMMANDS FOR THE / CONTROLLER, THE FLAW MANAGEMENT TABLES, DRIVE SERIAL NUMBER AND CREATION DATE / ETC. MUCH OF THIS DATA IS CREATED BY THE DMU PROGRAM. MENU-8 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 MENU-8 ELSEWHERE.) / IF THE "OFFSET" PARAMETER IS SET TO ZERO (INDICATING ABSOLUTE USE OF THE DISK / FOR P?S/8 WITHOUT THE BOOTSTRAP MONITOR WHICH IS NOT RECOMMENDED), OR IT IS / DESIRABLE TO USE A SIMPLER BOOTSTRAP TO LOAD IN THE BOOTSTRAP MONITOR AND THE / "IDNUM" PARAMETER IS SET TO ZERO, 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, LOGUNIT^400+1 /BOOTSTRAP VALUE / 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 BTEXTRN&177 /CONTINUE THERE EXTUNIT,LOGUNIT^400+1 /BOOTSTRAP VALUE / MENU-8 GENERIC BOOTSTRAP PROCEDURES. / BY RIGOROUSLY FOLLOWING THE MENU-8 PROCEDURES FOR BOOTSTRAPPING A VOLUME, A / TOTALLY GENERIC BOOTSTRAP (INCLUDING DYNAMIC DETERMINATION OF GROUP, HSET AND / P?S/8 LOGICAL UNIT) IS ALSO POSSIBLE: *0 /WHERE THE CODE IS READ IN 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,LOGUNIT^40+IDNUM^10+4001/BOOTSTRAP VALUE; INCLUDES MENU-8 BIT[0] SET DSCOM, COMAND /POINTER TO COMMAND TABLE / COMMAND TABLE. COMAND, IDNUM^400+DMA+6 /DMA, ID AND COMMAND LENGTH 10&377 /READ LOGUNIT^40+GROUP-1&377 /HIGH-ORDER SECTOR WORD HSET^10+.-.^20&377 /MIDDLE SECTOR WORD (P?S/8 UNIT CAN BE FILLED IN) OFFSET^40&377 /LOW-ORDER SECTOR WORD 2&377 /READ TWO SECTORS 000&377 /CONTROL WORD 000&377 /BANK AND FIELD 0000 /TRANSFER ADDRESS *400 /ANYWHERE PAST 0377 AND BEFORE 7577 IS ACCEPTABLE OFFSET^40 /LOW-ORDER BOOTSTRAP ADDRESS (DOUBLE-PRECISION FORM) HGHADR, GROUP-1^2+HSET^10+.-. /HIGH-ORDER BOOTSTRAP ADDRESS; P?S/8 LOGICAL UNIT /CAN BE FILLED IN IF DESIRED *SYSIO /OVER MENU-8 I/O ENTRY POINT HGHADR+2 /POINTS TO BOOTSTRAP ADDRESS (BUMPED TWICE) / IT IS ALSO POSSIBLE TO GENERICALLY BOOTSTRAP THE SYSTEM EXTERNALLY: *400 /ANYWHERE PAST 0377 AND BEFORE 7532 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 BTEXTRN&177 /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,LOGUNIT^40+IDNUM^10+4001/BOOTSTRAP DRIVE VALUE; INCLUDES MENU-8 BIT[0] SET EDSCOM, DCOMAND /POINTER TO COMMAND TABLE / COMMAND TABLE. DCOMAND,IDNUM^400+DMA+6 /DMA, ID AND COMMAND LENGTH 10&377 /READ LOGUNIT^40+GROUP-1&377 /HIGH-ORDER SECTOR WORD HSET^10+.-.^20&377 /MIDDLE SECTOR WORD (P?S/8 UNIT CAN BE FILLED IN) OFFSET^40&377 /LOW-ORDER SECTOR WORD 2&377 /READ TWO SECTORS 000&377 /CONTROL WORD 000&377 /BANK AND FIELD 0000 /TRANSFER ADDRESS OFFSET^40 /LOW-ORDER BOOTSTRAP ADDRESS (DOUBLE-PRECISION FORM) HIGHADR,GROUP-1^2+HSET^10+.-. /HIGH-ORDER BOOTSTRAP ADDRESS; P?S/8 LOGICAL UNIT /CAN BE FILLED IN IF DESIRED *SYSIO /OVER MENU-8 I/O ENTRY POINT HIGHADR+2 /POINTS TO BOOTSTRAP ADDRESS (BUMPED TWICE) ENPUNCH /RESTORE BINARY OUTPUT / P?S/8 MONITOR COMPONENTS. / REWIND/UNLOAD ROUTINE. *REWIND-1 /DEFINE REWIND/UNLOAD ROUTINE ZBLOCK 1377-. /EMPTY SPACE JMP I PCHLOOP/[CHLOOP]/CONTINUE THERE / DEVICE SIZE. *DEVSIZE /OVER SYSGEN ROUTINES WINSIZE /DEFINE OUR DEVICE SIZE / SYSGEN TIME HANDLER FIXUP. / THIS CODE IS USED BY THE MONITOR SYSGEN ROUTINES ONLY. IT MAKES THE HANDLER / VIABLE FOR WRITING OUT THE SYSTEM IMAGE, AS THE CODE TO BE WRITTEN OUT ISN'T / USABLE UNTIL IT IS COLD-BOOTSTRAPPED AND READ BACK IN. *STHFIX /OVER SYSGEN FIXUP CODE STHFIX, .-. /SYSGEN TIME FIXUP ROUTINE DCA I STHBFUN/(SBTFUN)/CLEAR BOOTSTRAP UNIT FOR GENASYS TAD SLG/(LOGUNIT^40)/GET LOGICAL UNIT VALUE DCA I STHUNIT/(UNIT) /STORE IN HANDLER JMP I STHFIX /RETURN STHBFUN,SBTFUN /POINTER TO BOOTSTRAP FUNCTION SLG, LOGUNIT^40 /LOGICAL UNIT VALUE STHUNIT,UNIT /POINTER TO UNIT WORD / P?S/8 BINARY SLURP LOADER. FIELD SLPGEN&70%10 /GENERATION FIELD *SLPGEN&7600 /GENERATION ADDRESS SLPCORE,NOPUNCH /FOOL THE ASSEMBLER FIELD 0 /WHERE IT LOADS *SLPCORE /RESET ORIGIN ENPUNCH /UN-FOOL THE ASSEMBLER RELOC SBOOT /WHERE IT EXECUTES SBOOT, DSRS /GET CURRENT STATUS SPA CLA /SKIP IF IDLE JMP SBOOT /JUMP IF NOT DSHI /START THE COMMAND (HIGH-ORDER) DSRS /GET STATUS SMA CLA /SKIP IF NOW BUSY JMP .-2 /ELSE WAIT FOR IT DSCF /CLEAR FLAG NOW TAD BCOM/(BCOMMAND) /GET COMMAND POINTER DSGO /START THE COMMAND (LOW-ORDER) DSSF /FLAG UP? JMP .-1 /NO, WAIT FOR IT DSCF /CLEAR FLAG NOW B7600, CLA!400 /CLEAN UP DSIM /FINISH THE COMMAND TAD BJMP/(JMP BOVRLAY)/GET WAIT INSTRUCTION DCA BOVRLAY /STORE WHERE IT'S NEEDED TAD BDRIVE /GET DRIVE CONFIGURATION, ETC. BJMP, JMP BOVRLAY /WAIT THERE TO GET OVERLAYED BCOM, BCOMMAND /COMMAND POINTER BDRIVE, .-.^40+.-.^10+4001 /LOGICAL UNIT AND ID WILL BE FILLED IN BCOMMAN,.-.^400+DMA+6 /COMMAND LENGTH + DMA; ID WILL BE FILLED IN 10&377 /READ COMMAND BHI, .-.^40+.-.&377 /LOGICAL UNIT AND GROUP WILL BE FILLED IN BMD, .-.^10+.-.^20&377 /HSET AND P?S/8 UNIT WILL BE FILLED IN BLO, OFFSET^40&377 /LOW-ORDER SECTOR ADDRESS 2&377 /SECTOR COUNT 000&377 /CONTROL WORD 000&377 /BANK AND FIELD 0000 /TRANSFER ADDRESS ZBLOCK SYSIO-. /EMPTY SPACE SYSIO, SBHI+2 /ARGUMENT POINTER SBLO, OFFSET^40 /LOW-ORDER ARGUMENT SBHI, .-.^2+.-.^10+.-. /GROUP, HSET, P?S/8 UNIT WILL BE FILLED IN / ALL BOOTSTRAP CODE MUST BE WITHIN 7600-7642. / ENSURE THIS SIZE CONVENTION IS MET. IFNZRO SBOOT+BBLEN-.&4000 / BOOTSTRAP UNIT SETUP ROUTINE. / THIS CODE WILL BE AVAILABLE TO THE BINARY LOADER (AND SYSGEN ROUTINES) WHEN / IT IS LOADED INTO "SLUPAGE". IT INITIALIZES THE SLURP LOADER BOOTSTRAP AND / THEN RETURNS TO THE BINARY LOADER INITIALIZE ROUTINE. BUTSETU,.-. /BOOTSTRAP UNIT SETUP ROUTINE TAD I BTABLE/(IDNUM^400+DMA+6)/GET TABLE HEADER VALUE DCA BCOMMAND /STORE IN TABLE HEADER TAD I BSBTFUN/(SBTFUN) /GET BOOTSTRAP FUNCTION AND B7/(7) /ISOLATE P?S/8 UNIT BITS TAD I BCONFIG/(CONFIG) /GET GROUP AND HSET BITS DCA SBHI /STORE IN HIGH-ORDER BLOCK ARGUMENT TAD SBHI /GET IT BACK CLL RTL;RTL /MOVE UP DCA BMD /STORE HSET AND P?S/8 UNIT BITS TAD I BCONFIG/(CONFIG) /GET GROUP AND HSET BITS CLL RTR;RTR /MOVE DOWN GROUP BITS TAD I BUNIT/(UNIT) /ADD ON LOGICAL UNIT BITS DCA BHI /STORE LOGICAL UNIT AND GROUP BITS TAD I BTABLE/(BTABLE) /GET TABLE HEADER VALUE RTR;RTR;RAR /MOVE DOWN AND AND B70/(70) /ISOLATE ID BITS TAD BDRIVE/(4001) /ADD ON BASE BITS DCA BDRIVE /STORE FOR NOW TAD I BUNIT/(UNIT) /GET LOGICAL UNIT BITS CLL RTL;RAL /MOVE UP TAD BDRIVE /NOW HAVE ALL REQUIRED BITS DCA BDRIVE /STORE COMPOSITE JMP I BUTSETUP /RETURN BCONFIG,CONFIG /POINTER TO GROUP AND HSET CONFIGURATION WORD BSBTFUN,SBTFUN /POINTER TO BOOTSTRAP FUNCTION BTABLE, TABLE /COMMAND TABLE POINTER BUNIT, UNIT /POINTER TO LOGICAL UNIT WORD B7, 7 /CONSTANT 0007 B70, 70 /CONSTANT 0070 / SLURP INITIALIZE CODE. ZBLOCK SFILES-. /EMPTY SPACE SFILES, RELOC BINIT2 /WHERE THIS EXECUTES BINIT2, JMS I BNSETUP/[BUTSETUP+SBOFF]/SETUP THE BOOTSTRAP UNIT STUFF JMP I BINIT /RETURN BNSETUP,BUTSETUP+SBOFF /BOOTSTRAP UNIT SETUP ROUTINE POINTER ZBLOCK BINIT2+BINITLN-. /EMPTY SPACE RELOC SFILES+BINITLN /RESET ORIGIN SLPSA, 0000 /NO SLURP LOADER HENCE NO STARTING ADDRESS RELOC /TURN OFF RELOCATION / MONITOR I/O INTERCEPT BLOCKS FOR HARD DISK SYSTEM. / PAGE AND FIELD RELOCATABLE CODE TO BE LOADED BY CONSOLE OVERLAY, ETC. FOR / I/O AND ERROR TRAP PURPOSES. FIELD TRPGEN&70%10 /GENERATES HERE *TRPGEN&7600 /SYSGEN WANTS IT HERE NOPUNCH /FOOL THE ASSEMBLER FIELD 1 /WHERE IT MIGHT LOAD *TRPGEN&7600 /RESET ORIGIN ENPUNCH /UN-FOOL THE ASSEMBLER RELOC SBOOT /FOOL THE ASSEMBLER HIDWRD, SYSNUM /SYSTEM DEVICE HANDLER ID NUMBER DEVICE HARD /SYSTEM DEVICE NAME / I/O ADDRESSES. ADRLST, SERR /NORMALLY HLT OR 7401 SERR+1 /NORMALLY JMP SRETRY SYSIO+3 /NORMALLY RDF SYSIO+4 /NORMALLY TAD SCIDF/(CIF CDF) 0 /THIS ENDS THE SHORT LIST ZBLOCK ADRLST+12-. /EMPTY SPACE / I/O NORMAL CONTENTS. CNTLST, HLT/OR 7401 /SERR JMP SRETRY /SERR+1 RDF /SYSIO+3 TAD SCIDF/(CIF CDF) /SYSIO+4 0 /THIS ENDS THE SHORT LIST ZBLOCK CNTLST+12-. /EMPTY SPACE / I/O REPLACEMENT CONTENTS. ZAPLST, CIF 10 /WILL BE TO CORRECT FIELD JMP ERRTRP /JMP THERE ON ANY ERROR CIF 10 /WILL BE TO CORRECT FIELD JMP IOTRAP /JMP THERE ON ANY CALL 0 /THIS ENDS THE SHORT LIST ZBLOCK ZAPLST+12-. /EMPTY SPACE RELOC /UN-FOOL THE ASSEMBLER / I/O TRAPS COME HERE. TRAPIO, RDF /GET CALLING FIELD TAD TRPCDF/(CDF) /MAKE INTO CDF CALLING FIELD DCA TRPINST /STORE IN-LINE TRPCDF, CDF 00 /GOTO MONITOR FIELD TAD I (SYSIO) /GET CALLING ADDRESS DCA CALADR /SAVE FOR ERROR HANDLER TRPINST,.-. /GOTO CALLING FIELD TAD TRPINST /GET CDF CALLING FIELD DCA CALFLD /SAVE FOR ERROR HANDLER NL0002 /SET CIF BIT TAD TRPINST /NOW HAVE CIF CDF CALLING FIELD CIF 00 /GOTO MONITOR FIELD JMP I (SYSIO+5) /CONTINUE THERE / ERROR BLURB. TYPCODE,TEXT " CODE " /TYPE CODE ERROR BLURB BLBLEN= .-TYPCODE /LENGTH OF ERROR BLURBS PAGE / ERRORS COME HERE. TRPERR, DSRS /GET ERROR STATUS DCA ESTATUS /SAVE ERROR STATUS RIF /GET OUR FIELD TAD ERRCDF/(CDF) /FORM CDF OUR FIELD DCA EINLINE /STORE IN-LINE EINLINE,.-. /WILL BE CDF OUR FIELD JMS ERLOC8 /FIND OURSELVES ERLOC8, .-. /OUR ADDRESS STORED HERE TAD ERLOC8 /GET OUR ADDRESS TAD (TYPCODE+3-ERLOC8) /ADJUST TO DIGIT FIELD IN BLURB DCA ETEMP /STASH THE POINTER TAD ESTATUS /GET ERROR STATUS RTR;RAR /MOVE DOWN AND (700) /JUST HIGH-DIGIT DCA I ETEMP /STORE IN BLURB FOR NOW TAD ESTATUS /GET ERROR STATUS AGAIN AND (700) /JUST SECOND DIGIT CLL RTR;RTR;RTR /MOVE DOWN TAD I ETEMP /ADD ON FIRST DIGIT TAD ("0^100+"0-200) /MAKE IT ASCII DCA I ETEMP /STORE BACK IN BLURB ISZ ETEMP /BUMP TO NEXT PAIR TAD ESTATUS /GET ERROR STATUS AGAIN RTL;RAL /MOVE UP AND (700) /ISOLATE THIRD DIGIT DCA I ETEMP /STORE IN BLURB FOR NOW TAD ESTATUS /GET ERROR STATUS AGAIN AND (7) /JUST FOURTH DIGIT TAD I ETEMP /ADD ON THIRD DIGIT TAD ("0^100+"0-200) /MAKE IT ASCII DCA I ETEMP /STORE BACK IN BLURB ERRCDF, CDF 00 /GOTO FIELD ZERO TAD ERLOC8 /GET OUR ADDRESS TAD (TYPCODE-ERLOC8) /ADJUST TO BLURB ADDRESS JMS I MOVBLB /MOVE IT INTO ERROR MESSAGE -BLBLEN /PASSED BLURB LENGTH IN WORDS JMS I FILBLB /FILL IN I/O PARTICULARS JMS I DSPBLB /DISPLAY BLURB AND POSSIBLY COME BACK TAD CALFLD /GET CALLING FIELD DCA ETEMP /STORE IN-LINE ETEMP, .-. /GOTO CALLING FIELD CIF 00 /GOTO MONITOR FIELD JMP I (SRETRY) /TRY, TRY AGAIN PAGE / MDC8 WINCHESTER DISK SYSTEM HANDLER. FIELD 0 /WHERE IT GENERATES *GENAD1 /WHERE SYSGEN WANTS IT RELOC SBOOT /WHERE IT EXECUTES SBOOT, JMP SBOOT2 /CONTINUE THERE TO RELOAD THE KEYBOARD MONITOR BTSAVE, DCA BTSAVE&177 /SAVE BOOTSTRAP INFORMATION SBTFUN, DSRS /GET STATUS; WILL BE 17^100 + P?S/8 BOOTSTRAP UNIT SPA /SKIP IF NOT BUSY SWAL, JMP SBTFUN&177 /SWITCHES /A-/L; ELSE WAIT FOR IT SWMX, SZA /SWITCHES /M-/X; SKIP IF NO ERRORS SWY9, HLT /SWITCHES /Y-/9; BARF SOUTFLS,JMP BTINIT&177 /OUTPUT FILE COUNT; CONTINUE THERE SDATE, .-. /SYSTEM DATE WORD SCRSIZE,SYSADJ^4 /SYSTEM CORE SIZE WORD SWAIT, 17 /DISK WAIT ROUTINE; INITIALIZED FOR COLD BOOTSTRAP DSSF /FLAG UP? JMP .-1 /NO, WAIT FOR IT DSCF /YES, CLEAR IT DSRS /GET STATUS NOW CLL RAL /REMOVE BUSY BIT SNA /SKIP IF ANY ERRORS JMP I SWAIT /ELSE RETURN SERR, HLT /HALT WITH BAD BITS IN AC JMP SRETRY /TRY, TRY AGAIN / COMES HERE TO OVERLAY WAITING PRIMARY BOOTSTRAP. IFNZRO .&177-24 BTOVER, JMP BTSAVE&177 /CONTINUE THE WAIT THERE / COMES HERE AFTER OUR CODE IS ALREADY READ IN. IFNZRO .&177-25 BTEXTRN,DCA BTSAVE&177 /SAVE BOOTSTRAP INFORMATION JMP BTINIT&177 /CONTINUE THERE CONFIG, GROUP-1^2+HSET^10 /DEFAULT GROUP, HSET VALUES; USED ONLY DURING SYSGEN /OR IF COLD BOOTSTRAPPED WITHOUT MENU-8 SCIDF, CIF CDF 00 /CONSTANT 6203 UNIT, .-.^40 /LOGICAL UNIT VALUE WILL BE FILLED IN DURING SYSGEN OR /BY COLD BOOTSTRAP ROUTINES / SYSTEM LOADER. SLOAD, JMS SYSIO /SYSTEM LOADER HAS DEFAULTS TO SAVE CORE SCORE, 0000 /TRANSFER ADDRESS SFUN, WRITE /WRITE, BLOCK COUNT, FIELD, UNIT SBLOCK, BINADR /BLOCK NUMBER JMP I .+1/(SYSTART) /START IT UP SYSTART,SBOOT /AT THIS STARTING ADDRESS; COLD BOOTSTRAP INITIALIZED / I/O ROUTINE ENTRY POINT. SYSIO, SBINIT /ENTRY POINT; INITIALIZED FOR COLD BOOTSTRAP STABLE, SMA SZA CLA /TABLE POINTER; THIS CLEARS THE AC SOFFSET,OFFSET^40 /DEVICE OFFSET; THIS CAN BE SKIPPED RDF /GET CALLING FIELD TAD SCIDF/(CIF CDF) /TURN INTO CIF CDF CALLING FIELD DCA SEXIT /STORE FOR EXIT LATER TAD I SYSIO /GET THE TRANSFER ADDRESS DCA TRADDRESS /STORE IN COMMAND SCIFINS,CIF EXHGFLD /WILL BE CIF TO HELPER FIELD JMP SYSMORE /CONTINUE THERE / COMES HERE TO EXECUTE (OR RETRY) THE COMMAND. SRETRY, DSRS /GET STATUS SPA CLA /SKIP IF CONTROLLER IS IDLE JMP SRETRY /ELSE WE MIGHT AS WELL WAIT DSHI /SEND HIGH-ORDER COMMAND ADDRESS SBUSY, DSRS /GET STATUS SMA CLA /SKIP IF BUSY JMP SBUSY /ELSE KEEP WAITING DSCF /CLEAR DONE FLAG NOW TAD STABLE/(TABLE) /POINT TO COMMAND TABLE DSGO /GO START IT UP JMS SWAIT /WAIT FOR COMMAND TO TAKE DSIM /FINISH THE COMMAND JMS SWAIT /WAIT FOR COMMAND TO COMPLETE SEXIT, CIF CDF EXIRFLD /WILL BE CIF CDF RETURN FIELD; COLD BOOT INITIALIZED JMP I SYSIO /RETURN TO CALLER / COMES HERE TO RELOAD THE KEYBOARD MONITOR. SBOOT2, JMS SYSIO /CALL I/O ROUTINES 0000 /TRANSFER ADDRESS SBTFN2, 17^100+.-. /UNIT BITS WILL BE FILLED IN 1 /BLOCK NUMBER JMP I .+1/(MONSTRT) /GO START IT UP MONSTRT /THROUGH HERE / COMES HERE IF MENU-8 BOOTSTRAP WAS PERFORMED. BTMENU, NL7775 /BACKUP TAD I BTSYSIO&177/[SYSIO] /GET BLOCK ARGUMENT POINTER FROM MENU-8 DCA SOUTFLS&177 /STASH THE POINTER TAD I SOUTFLS&177 /GET THE LOW-ORDER BLOCK ARGUMENT CIA /INVERT FOR TESTING TAD SOFFSET&177/[OFFSET^40] /COMPARE TO DESIGNATED OFFSET VALUE BTSYSIO,SZA CLA /SKIP IF THEY MATCH HLT /BARF! ISZ SOUTFLS&177 /BUMP TO HIGH-ORDER TAD I SOUTFLS&177 /GET HIGH-ORDER BLOCK ARGUMENT AND SWAIT&177/[17] /GET HSET AND P?S/8 UNIT BITS CLL RTL;RTL /MOVE UP DCA SWAL&177 /STORE FOR NOW TAD SECTMD&177 /GET MIDDLE SECTOR ADDRESS AND SWAIT&177/[17] /ISOLATE HIGH-ORDER BLOCK BITS TAD SWAL&177 /ADD ON HSET AND P?S/8 UNIT BITS DCA SECTMD&177 /STORE BACK TAD I SOUTFLS&177 /GET HIGH-ORDER BLOCK ARGUMENT AGAIN RTR;RTR /MOVE DOWN AND AND BT37&177/[37] /ISOLATE GROUP BITS DCA SWMX&177 /STORE FOR NOW TAD SECTHI&177 /GET LOGICAL UNIT, HIGH-ORDER SECTOR ADDRESS AND BT340&177/[340] /ISOLATE LOGICAL UNIT BITS TAD SWMX&177 /ADD ON GROUP BITS DCA SECTHI&177 /STORE BACK JMP BTMOVE&177 /REJOIN THE CODE TO MOVE IT DOWN BT3400, 3400 /CONSTANT 3400 BT340, 340 /CONSTANT 0340 BT37, 37 /CONSTANT 0037 ZBLOCK 7740-. /EMPTY SPACE / COMMAND TABLE; NON-VOLATILE LOCATIONS MUST BE BEFORE 7750 TO PREVENT / INTERACTION WITH THREE-CYCLE DATA BREAK DEVICES. / THE TABLE IS PRE-LOADED FOR COLD BOOTSTRAP; SEVERAL VALUES WILL BE CHANGED AS / DICTATED BY THE SPECIFIC BOOTSTRAP METHOD (STAND-ALONE OR MENU-8). IFNZRO 7740-. TABLE, .-.^400+DMA+6 /TABLE LENGTH, DMA INDICATOR, SCSI ID; THE ID VALUE /WILL BE INSERTED DURING SYSGEN OR COLD BOOTSTRAP. RWCOM, 10&377 /010 IF READING, 012 IF WRITING. SECTHI, .-.^40+GROUP-1&377 /LOGICAL UNIT BITS AND HIGH-ORDER SECTOR ADDRESS; THE /LOGICAL UNIT BITS WILL BE INSERTED DURING SYSGEN OR /COLD BOOTSTRAP; THE DEFAULT GROUP BITS WILL BE USED /FOR SYSGEN OR COLD BOOTSTRAP (AND NORMAL OPERATION) /WITHOUT MENU-8; A MENU-8 COLD BOOTSTRAP WILL INSERT /REPLACEMENT GROUP BITS CORRESPONDING TO THE VALUE FOR /THE DESIGNATED MENU-8 VOLUME. SECTMD, HSET^10+.-.^20+HBHI&377 /MIDDLE SECTOR ADDRESS; INITIALIZED FOR ANY FORM /OF COLD BOOTSTRAP; THE DEFAULT HSET BIT WILL BE BE /USED FOR SYSGEN OR COLD BOOTSTRAP (AND NORMAL /OPERATION) WITHOUT MENU-8; P?S/8 UNIT BITS MUST BE /ZERO FOR SYSGEN OR ANY NON-MENU-8 FUNCTION; A MENU-8 /COLD BOOTSTRAP WILL INSERT A REPLACEMENT HSET BIT AND /P?S/8 UNIT BITS CORRESPONDING TO THE VALUE FOR THE /DESIGNATED MENU-8 VOLUME. SECTLO, OFFSET^40+HBLOCK&377 /LOW-ORDER SECTOR ADDRESS; INITIALIZED TO LOAD IN /THE HELPER BLOCKS FOR ANY COLD BOOTSTRAP. SCTCNT, 2&377 /SECTOR COUNTER (1-40); THE COUNT IS INITIALIZED TO /LOAD IN THE HELPER BLOCKS DURING THE COLD BOOTSTRAP. CONTROL,0&377 /CONTROL WORD (MUST BE ZERO). TRFLD, EXIRFLD%10&377 /(BANK AND) TRANSFER FIELD (0-7); INITIALIZED TO LOAD /IN THE HELPER BLOCKS DURING THE COLD BOOTSTRAP. TRADDR, EXIRUN&7600 /TRANSFER ADDRESS; INITIALIZED TO LOAD IN THE HELPER /BLOCKS DURING THE COLD BOOTSTRAP. / COMES HERE TO INITIALIZE THE CODE TO READ IN THE HELPER BLOCKS. BTINIT, TAD BTSAVE&177 /GET PASSED BOOTSTRAP INFORMATION CLL RTL;RTL;RAL /MOVE UP AND AND BT3400&177/[3400] /ISOLATE ID BITS SPARM, TAD TABLE&177/[DMA+6] /EQUALS PARAMETER; ADD ON DMA AND LENGTH VALUE SFILES, DCA TABLE&177 /PASSED FILE LIST; STORE BACK TAD BTSAVE&177 /GET PASSED BOOTSTRAP INFORMATION AGAIN CLL RTR;RAR /MOVE DOWN AND AND BT340&177/[340] /ISOLATE LOGICAL UNIT BITS TAD SECTHI&177/[GROUP-1] /ADD ON DEFAULT GROUP BITS DCA SECTHI&177 /STORE BACK / CHECK IF MENU-8 BOOTSTRAP WAS EXECUTED. TAD BTSAVE&177 /GET PASSED BOOTSTRAP INFORMATION AGAIN SPA CLA /SKIP IF NON-MENU-8 LOAD JMP BTMENU8 /JUMP IF MENU-8 LOAD / COMES HERE TO MOVE THE CODE FROM 000000-000177 TO 007600-007777. BTMOVE, TAD SBOOT&177+.-. /GET A WORD DCA I SYSTART&177 /PUT A WORD ISZ BTMOVE&177 /BUMP TO NEXT ISZ SYSTART&177 /DONE ALL YET? JMP BTMOVE&177 /NO, KEEP GOING / THE MOVED CODE WILL NOW ATTEMPT TO LOAD IN THE HELPER BLOCKS. JMP I .+1&177/[SRETRY] /GO READ THEM IN SRETRY /THROUGH HERE HBHI= OFFSET^40+HBLOCK%400 /HIGH-ORDER BITS OF HELPER BLOCK RELOC /TURN OFF RELOCATION / EXTENDED HANDLER INITIALIZATION CODE. EXIGFLD=EXIGEN&70 /EXTENDED HANDLER INITIALIZATION GENERATION FIELD EXIRFLD=EXIRUN&70 /EXTENDED HANDLER INITIALIZATION EXECUTION FIELD FIELD EXIGFLD%10 /WHERE THIS GENERATES *EXIGEN&7600 /GENERATION ADDRESS EXIGADR,NOPUNCH /FOOL THE ASSEMBLER FIELD EXIRFLD%10 /WHERE THIS EXECUTES *EXIGADR /RESET GENERATION ADDRESS ENPUNCH /UN-FOOL THE ASSEMBLER RELOC EXIRUN&7600 /WHERE IT EXECUTES EXIRADR=. /EXECUTION ADDRESS / COMES HERE AFTER WE ARE READ IN BY THE COLD BOOTSTRAP CODE. SBINIT, TAD I (SECTMD) /GET MIDDLE SECTOR ADDRESS RTR;RTR /MOVE DOWN AND AND (10) /ISOLATE HSET BIT DCA I (CONFIG) /SAVE FOR NOW TAD I (SECTHI) /GET HIGH-ORDER SECTOR ADDRESS AND (37) /ISOLATE GROUP BITS CLL RTL;RTL /MOVE UP TAD I (CONFIG) /ADD ON HSET BIT DCA I (CONFIG) /STORE COMPOSITE TAD I (SECTHI) /GET HIGH-ORDER SECTOR ADDRESS AND (340) /ISOLATE LOGICAL UNIT BITS DCA I (UNIT) /STASH THE VALUE TAD I (SECTMD) /GET MIDDLE SECTOR ADDRESS RTR;RTR /MOVE DOWN AND AND (7) /ISOLATE P?S/8 UNIT BITS TAD I (SBTFN2) /ADD ON READ BITS (17^100) DCA I (SBTFN2) /STORE COMPOSITE TAD I (SBTFN2) /GET IT BACK DCA I (SBTFUN) /STORE AS MAIN BOOTSTRAP UNIT VALUE ALSO TAD I (SBTFUN) /GET IT BACK TAD (-17^100+WRITE) /UPDATE TO WRITE FUNCTION VALUE DCA I (SFUN) /STORE IN DEFAULT SYSTEM LOADER TAD (SBOOT) /RESTORE THE DCA I (SYSTART) /DEFAULT STARTING ADDRESS / SETUP MEMORY TEST TRAP FOR FIELD ZERO FAILURES. TAD (NOP) /GET TEST VALUE DCA I (7000) /SETUP TEST LOCATION / TRY TO LOCATE MORE MEMORY. STRYNXT,CDF EXIRFLD /ALWAYS RESET DATA FIELD IN CASE PDP-8/L SCDFNXT,CDF 10 /ATTEMPT TEST CDF INSTRUCTION TAD I (7000) /(ATTEMPT TO) GET CURRENT TEST WORD DCA EXIRADR /THIS MIGHT BE SKIPPED ON PDP-8 OR LINC-8! TAD (1234) /GET TEST VALUE DCA I (7000) /(ATTEMPT TO) STORE IT TAD I (7000) /(ATTEMPT TO) GET IT BACK TAD (-1234) /COMPARE TO DESIRED VALUE SZA CLA /SKIP IF POSSIBLE JMP SCORDONE /JUMP IF NOT POSSIBLE CDF EXIRFLD /RESET TO OUR FIELD TAD I (7000) /GET OUR TEST VALUE TAD (-NOP) /COMPARE TO UNDISTURBED VALUE SZA CLA /SKIP IF STILL OK JMP SCORDONE /JUMP IF NOT TAD SCDFNXT /GET CURRENT VALID CDF INSTRUCTION DCA SINLN1 /STORE IN-LINE SINLN1, .-. /WILL BE CDF TEST FIELD TAD EXIRADR /GET PREVIOUS CONTENTS DCA I (7000) /RESTORE IT TAD SCDFNXT /GET CURRENT CDF INSTRUCTION TAD (10) /BUMP TO NEXT FIELD DCA SCDFNXT /STORE BACK ISZ SFLDCNT /DONE ALL FIELDS? JMP STRYNXT /NO, KEEP GOING / NOW CHECK IF ANY ADDITIONAL MEMORY WAS ACTUALLY FOUND. SCORDON,CDF EXIRFLD /RESET TO OUR FIELD TAD SFLDCNT /GET FIELD COUNTER TAD (7) /COMPARE TO ORIGINAL VALUE SZA CLA /SKIP IF IT DIDN'T CHANGE JMP SMEMOK /JUMP IF IT DID CHANGE / NO ADDITIONAL MEMORY FOUND, SO COMPLAIN. SBCMPLN,TAD I SBCMPTR /GET A CHARACTER SNA /SKIP IF NOT AT END OF LIST JMP SBARF /JUMP IF SO TLS /PRINT IT CLA /CLEAN UP ISZ SBCMPTR /BUMP TO NEXT TSF /WAIT FOR THE CHARACTER JMP .-1 /TO PRINT JMP SBCMPLN /KEEP GOING SBARF, HLT /DISPLAY BOOTSTRAP (MEMORY) ERROR JMP SBARF /JUST IN CASE / COMES HERE IF SOME EXTENDED MEMORY IS AVAILABLE. SMEMOK, TAD SCDFNXT /GET TOO-HIGH CDF INSTRUCTION TAD (CIF-CDF-10) /BACKUP TO HIGHEST FIELD AVAILABLE AS CIF DCA I (SCIFINS) /STORE CIF HIGHEST FIELD TAD I (SCIFINS) /GET IT BACK RTR;RAR /MOVE DOWN AND AND (7) /ISOLATE FIELD BITS DCA I (TRFLD) /STORE IN COMMAND TAD (SBOOT) /SETUP THE DCA I (TRADDR) /TRANSFER ADDRESS TAD I (SECTLO) /GET LOW-ORDER SECTOR AND (377) /JUST LOW-ORDER BITS TAD (11) /ADD ON OFFSET DCA I (SECTLO) /STORE BACK TAD I (SECTLO) /GET IT AGAIN AND (400) /CHECK FOR CARRY SZA CLA /SKIP IF NO CARRY ISZ I (SECTMD) /ELSE BUMP MIDDLE SECTOR ADDRESS NL0001 /SETUP FOR DCA I (SCTCNT) /SINGLE SECTOR TAD (SBOOT) /SETUP THE DCA I (SYSIO) /RETURN ADDRESS JMP I (SRETRY) /GO START IT UP SBCMPTR,SCBLURB /COMPLAINT MESSAGE POINTER SFLDCNT,-7 /TEST FIELD COUNTER PAGE / ONLY 4K MEMORY COMPLAINT BLURB. SCBLURB,"G&37 / "G&37 / "M&37 / "J&37 / "D&177 /D "I&177 /I "S&177 /S "K&177 /K " &177 / "S&177 /S "Y&177+40 /Y "S&177+40 /S "T&177+40 /T "E&177+40 /E "M&177+40 /M " &177 / "B&177 /B "O&177+40 /O "O&177+40 /O "T&177+40 /T "S&177+40 /S "T&177+40 /T "R&177+40 /R "A&177+40 /A "P&177+40 /P " &177 / "I&177 /I "M&177+40 /M "P&177+40 /P "O&177+40 /O "S&177+40 /S "S&177+40 /S "I&177+40 /I "B&177+40 /B "L&177+40 /L "E&177+40 /E ",&177 /, " &177 / "O&177+40 /O "N&177+40 /N "L&177+40 /L "Y&177+40 /Y " &177 / "4&177 /4 "K&177 /K " &177 / "M&177 /M "E&177+40 /E "M&177+40 /M "O&177+40 /O "R&177+40 /R "Y&177+40 /Y "!&177 /! "G&37 / "G&37 / "M&37 / "J&37 / 0 /THIS ENDS THE LIST PAGE RELOC /TURN OFF RELOCATION / EXTENDED HANDLER CODE. EXHGFLD=EXHGEN&70 /EXTENDED HANDLER GENERATION FIELD EXHRFLD=EXHRUN&70 /EXTENDED HANDLER EXECUTION FIELD FIELD EXHGFLD%10 /WHERE THIS GENERATES *EXHGEN&7600 /GENERATION ADDRESS EXHGADR,NOPUNCH /FOOL THE ASSEMBLER FIELD EXHRFLD%10 /WHERE THIS EXECUTES *EXHGADR /RESET GENERATION ADDRESS ENPUNCH /UN-FOOL THE ASSEMBLER RELOC EXHRUN&7600 /WHERE IT EXECUTES EXHRADR,ZBLOCK SBOOT-. /EMPTY SPACE / COMES HERE TO CONTINUE PARSING ARGUMENTS. SYSMORE,RDF /GET CALLING FIELD TAD SYSCDF/(CDF) /MAKE IT CDF CALLING FIELD DCA SCLCDF /STORE IN-LINE SYSCDF, CDF 00 /GOTO MAIN FIELD ISZ I (SYSIO) /BUMP TO FUNCTION WORD TAD I (SYSIO) /GET POINTER TO FUNCTION WORD DCA SARGPTR /STASH THE POINTER JMS SETCALL /BACK TO CALLING FIELD TAD I SARGPTR /GET FUNCTION WORD DCA SFUNCT /STASH IT CDF 00 /BACK TO MAIN FIELD TAD SFUNCT /GET FUNCTION WORD RTR;RAR /MOVE DOWN AND AND (7) /ISOLATE FIELD BITS DCA I (TRFLD) /STORE (BANK AND) FIELD IN COMMAND TAD SFUNCT /GET FUNCTION WORD AND (3700) /ISOLATE PAGE BITS SNA /SKIP IF ANY SET NL4000 /ELSE USE MAXIMUM CLL RTR;RTR;RTR /MOVE DOWN DCA I (SCTCNT) /STORE SECTOR COUNT IN COMMAND TAD SFUNCT /GET FUNCTION WORD AND (7) /ISOLATE UNIT BITS DCA STEMP /SAVE FOR NOW NL4000 /SET READ/WRITE MASK AND SFUNCT /GET READ/WRITE BIT CLL IAC RTL;RAL /10 IF READING, 12 IF WRITING DCA I (RWCOM) /STORE IN COMMAND ISZ I (SYSIO) /BUMP TO BLOCK NUMBER ISZ SARGPTR /BUMP OUR POINTER AS WELL JMS SETCALL /BACK TO CALLING FIELD TAD I SARGPTR /GET BLOCK NUMBER (NOTE: LINK IS CLEAR!) CDF 00 /BACK TO MAIN FIELD TAD I (SOFFSET) /ADD ON OFFSET DCA I (SECTLO) /STORE IN COMMAND RAL /GET CARRY TAD STEMP /ADD ON UNIT BITS TAD I (CONFIG) /ADD ON GROUP, PAIR BITS DCA STEMP /STORE UPDATED VALUE TAD I (SECTLO) /GET LOW-ORDER BLOCK BITS AND (7400) /JUST HIGHEST FOUR BITS CLL RAL /MOVE UP TAD STEMP /NOW HAVE HIGHEST 13 BITS RTL;RTL /MOVE UP DCA I (SECTMD) /STORE IN COMMAND TAD I (SECTMD) /GET IT BACK AND (7400) /ISOLATE GROUP BITS RTL;RTL;RAL /MOVE DOWN TAD I (UNIT) /ADD ON PHYSICAL DRIVE BIT DCA I (SECTHI) /STORE IN COMMAND ISZ I (SYSIO) /BUMP PAST BLOCK NUMBER JMS SETCALL /BACK TO CALLING FIELD CIF 00 /GOING TO MAIN FIELD JMP SRETRY /CONTINUE THERE SETCALL,.-. /SET CALLING FIELD ROUTINE SCLCDF, .-. /WILL BE CDF CALLING FIELD JMP I SETCALL /RETURN SARGPTR,.-. /LOCAL ARGUMENT POINTER SFUNCT, .-. /FUNCTION WORD STORED HERE STEMP, .-. /TEMPORARY PAGE RELOC /TURN OFF RELOCATION $ /THAT'S ALL FOLK!