/P?S/8 DSD-240-8/DYNEX SYSTEM HANDLER / LAST EDIT: 21-NOV-1986 06:00:00 CJL XLIST OFF IFNDEF OFF IFNDEF ON XLIST ON / MUST BE ASSEMBLED WITH '/J' SWITCH SET. / P?S/8 HANDLER FOR DSD-240-8 DISK CONTROLLER AND WESTERN DYNEX CONTROLLER. / CAN BE ASSEMBLED FOR UPPER (REMOVABLE) OR LOWER (FIXED) DISK. / CAN BE BOOTSTRAPPED TO ANY UNIT. / ASSEMBLY INSTRUCTIONS. / SETTING UPPER=4000 GENERATES A HANDLER FOR THE UPPER DISK. / SETTING UPPER=0000 GENERATES A HANDLER FOR THE LOWER DISK. / SETTING BTUNIT=0000-0007 GENERATES THE HANDLER FOR THE RESPECTIVE UNIT. / P?S/8 MONITOR GENERATION RESTRICTIONS REQUIRE BTUNIT=0 FOR THE INITIAL / MONITOR, HOWEVER THE OTHER UNITS SHOULD BE PATCHED TO REFLECT THE / CHANGES INTRODUCED BY SETTING BTUNIT TO 0001-0007. / SETTING DRIVE=0000 GENERATES A HANDLER FOR DRIVE ZERO. / SETTING DEVCODE=0062 GENERATES DEVICE 62 IOT'S. / CONDITIONAL ASSEMBLY DEFINITIONS. IFNDEF BTUNIT /GENERATE A UNIT ZERO SYSTEM IFNDEF DEVCODE /GENERATE DEVICE 62 IOT'S. IFNDEF DRIVE /GENERATE A DRIVE ZERO SYSTEM IFNDEF UPPER /GENERATE AN UPPER DISK SYSTEM // 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 FILBLB= 0023 /BLURB FILL ROUTINE GENAD1= 7400 /SYSIO GENERATION ADDRESS 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 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. / DSD-240-8 EQUATED SYMBOLS. DTST= DEVCODE^10+6000 /READ TEST STATUS DSKF= DEVCODE^10+6001 /SKIP ON DONE FLAG DCLF= DEVCODE^10+6002 /CLEAR DONE FLAG DSBY= DEVCODE^10+6003 /SKIP IF CONTROLLER NOT BUSY DEXC= DEVCODE^10+6004 /EXECUTE COMMAND BUFFER DLBP= DEVCODE^10+6005 /LOAD BUFFER POINTER REGISTER DRDS= DEVCODE^10+6006 /READ STATUS DCON= DEVCODE^10+6007 /LOAD DRIVE CONTROL REGISTER / MISCELLANEOUS EQUATED SYMBOLS. DYNSIZE=6260 /LOGICAL UNIT SIZE NL0000= CLA /LOAD AC WITH 0000 NL0001= CLA IAC /LOAD AC WITH 0001 NL0002= CLA CLL CML RTL /LOAD AC WITH 0002 NL0003= CLA STL IAC RAL /LOAD AC WITH 0003 NL4000= CLA CLL CML RAR /LOAD AC WITH 4000 NL7777= CLA CMA /LOAD AC WITH 7777 SBOFF= SLUPAGE-SBOOT /OFFSET VALUE SYSNUM= 0003 /SYSTEM ID NUMBER **** MUST BE UNIQUE **** / ANY DRIVE BOOTSTRAP. NOPUNCH /TURN OFF BINARY OUTPUT *0000 /BOOTSTRAP ADDRESS BTUNIT%2^626+UPPER /CYLINDER WORD BTUNIT&1^400 /SECTOR WORD 0000 /WORD COUNT 0000 /CURRENT ADDRESS 0000 /RESERVED WORD DEXC /RETURNED CYLINDER WORD JMP . /ZEROED WORD /STATUS RETURNED HERE / ENABLE DISK AND START AT 00001-00005 (OR 00000 IF UPPER=0000). 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 DYNSIZE /DEFINE OUR DEVICE SIZE / 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, CLA /CLEAN UP DLBP /LOAD BUFFER POINTER BUTLUP, TAD BUTCYL /GET A WORD BUTSTR, DCA 0000 /PUT A WORD ISZ BUTLUP /BUMP TO NEXT ISZ BUTSTR /LIKEWISE ISZ BUTCNT /DONE ENOUGH YET? JMP BUTLUP /NO, GO BACK JMP 0005 /YES, GO START IT UP BUTCYL, .-. /WILL BE BTUNIT%2^626+UPPER BUTSCT, .-. /WILL BE BTUNIT&1^400 0 /WORD COUNT 0 /CURRENT ADDRESS BUTCNT, -7 /RESERVED WORD DEXC /RETURNED CYLINDER WORD JMP 0006 /ZEROED WORD / 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 BNUNIT/[SBTFUN] /GET BOOTSTRAP UNIT RTR;RAR /MOVE TWO HIGHEST UNIT BITS TO LINK, AC[0] SPA CLA /HALF UNIT? TAD BN626/[626] /YES SZL /UPPER UNIT? TAD BN1454/[1454] /YES DCA BUTCYL /STORE FOR NOW TAD I BNUPPER/[SUPPER] /GET UPPER INDICATOR WORD AND BN20/[20] /JUST INDICATOR BIT SZA /SKIP IF OFF NL4000 /ELSE SET UPPER DRIVE BIT TAD BUTCYL /NOW HAVE COMPOSITE DCA BUTCYL /SAVE FINAL CYLINDER WORD VALUE NL0001 /SET LOW-ORDER MASK AND I BNUNIT/[SBTFUN] /GET LOW-ORDER BOOTSTRAP UNIT BIT CLL RAR;RTR;RTR /MOVE TO AC[3] DCA BUTSCT /STORE SECTOR WORD JMP I BUTSETUP /RETURN BNUNIT, SBTFUN /SYSTEM BOOTSTRAP UNIT POINTER BNUPPER,SUPPER /WHERE UPPER/LOWER INDICATOR WORD IS BN1454, 1454 /CONSTANT 1454 BN20, 20 /CONSTANT 0020 BN626, 626 /CONSTANT 0626 / 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 DSD-240-8. / 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 XLIST OFF IFZERO UPPER-4000 < XLIST ON DEVICE DSDU /SYSTEM DEVICE NAME XLIST OFF > IFZERO UPPER < XLIST ON DEVICE DSDL /SYSTEM DEVICE NAME XLIST OFF > XLIST ON / I/O ADDRESSES. ADRLST, SERR /NORMALLY HLT OR 7401 SERR+1 /NORMALLY AND S40/(40) SYSIO+4 /NORMALLY RDF SYSIO+5 /NORMALLY TAD SCIF/(CIF) 0 /THIS ENDS THE SHORT LIST ZBLOCK ADRLST+12-. /EMPTY SPACE / I/O NORMAL CONTENTS. CNTLST, HLT/OR 7401 /SERR AND S40/(40) /SERR+1 RDF /SYSIO+4 TAD SCIF/(CIF) /SYSIO+5 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 NL0001 /SET CIF BIT TAD TRPINST /NOW HAVE CIF CALLING FIELD CIF 00 /GOTO MONITOR FIELD JMP I (SYSIO+6) /CONTINUE THERE / ERROR BLURBS. DLERR, TEXT " TRANSFER LATE"/DATA LATE ERROR BLURB SEEK, TEXT " CYLINDER SEEK"/SEEK ERROR BLURB PARITY, TEXT " READ PARITY"/PARITY ERROR BLURB NONEXIS,TEXT " DISK EXCEEDED"/NON-EXISTANT TRACK ERROR BLURB DRVERR, TEXT " INTERNAL DISK"/INTERNAL DRIVE ERROR BLURB WRILOCK,TEXT " WRITE PROTECT"/WRITE-LOCK ERROR BLURB DRVBSY, TEXT " DRIVE BUSY"/DRIVE BUSY ERROR BLURB BLBLEN= .-DRVBSY /LENGTH OF ERROR BLURBS PAGE / ERRORS COME HERE. TRPERR, DCA ESTATUS /SAVE ERROR STATUS DCA ERRADR /CLEAR RELATIVE ERROR ADDRESS TAD ESTATUS /GET ERROR STATUS SPA /FIFO ERROR? TAD (4100) /YES, MAKE IT LOOK LIKE OTHERS CLL RTL;RTL /MOVE OVER TO INITIAL POSITION JMP ERRENT /CONTINUE THERE ERRLUP, TAD ETEMP /GET LATEST SPA /FOUND ERROR? JMP ERRFND /YES ERRENT, CLL RAL /MOVE ON TO NEXT POTENTIAL ERROR DCA ETEMP /SAVE LATEST TAD ERRADR /GET ERROR ADDRESS TAD (BLBLEN) /UPDATE TO NEXT ERROR DCA ERRADR /STORE IT BACK JMP ERRLUP /KEEP GOING ERRFND, CLA /CLEAN UP CDF 00 /GOTO MONITOR FIELD JMS ERLOC8 /FIND OURSELVES ERLOC8, .-. /OUR ADDRESS STORED HERE TAD ERLOC8 /GET OUR ADDRESS TAD (DLERR-ERLOC8-BLBLEN) /ADJUST TO BLURB ADDRESS TAD ERRADR /NOW HAVE PROPER 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 TAD ESTATUS /GET STATUS BACK AND (40) /ISOLATE SEEK ERROR BIT ETEMP, .-. /GOTO CALLING FIELD CIF 00 /GOTO MONITOR FIELD JMP I (SERR+2) /TRY, TRY AGAIN ERRADR, .-. /ERROR ADDRESS CREATED HERE PAGE / DSD-240-8/DYNEX DISK SYSTEM HANDLER. FIELD 0 /WHERE IT GENERATES *GENAD1 /WHERE SYSGEN WANTS IT RELOC SBOOT /WHERE IT EXECUTES SBOOT, JMS SYSIO /CALL I/O ROUTINES TO BOOTSTRAP S7600, 7600 /READ INTO 007600 SBTFUN, 20^100+BTUNIT /READ 20 BLOCKS PLUS BOOTSTRAP UNIT BITS SBRET, 0000 /FROM BLOCK 0000 SWAL, .-. /SWITCHES /A-/L SWMX, JMP SWMX&177+1 /SWITCHES /M-/X; INITIALIZED FOR COLD BOOTSTRAP SWY9, .-. /SWITCHES /Y-/9 SOUTFLS,JMP SPARM&177+1 /OUTPUT FILE COUNT; INITIALIZED FOR COLD BOOTSTRAP SDATE, .-. /SYSTEM DATE WORD SCRSIZE,.-. /SOFTWARE CORE SIZE S1454, 1454 /CONSTANT 1454 SBFPTR, SBUF+2 /COMMAND POINTER AND FILE MODE BIT SWAIT, MONSTRT /DISK WAIT ROUTINE; INITIALIZED FOR BOOTSTRAP SWTAGN, DEXC /EXECUTE THE COMMAND DSBY /SKIP IF CONTROLLER NOT BUSY JMP .-1 /ELSE WAIT FOR IT TAD S4070/(4070) /GET PARTIAL STATUS MASK TAD S7/(7) /COMPLETE THE MASK AND STATUS /GET RETURNED STATUS SNA /SKIP ON ANY ERROR SET JMP I SWAIT /RETURN IF ALL IS OK SERR, HLT /HALT WITH BAD BITS IN AC AND S40/(40) /ISOLATE SEEK ERROR BIT SNA /RECALIBRATE NEEDED? JMP SWTAGN /NO, JUST RETRY THE CURRENT COMMAND JMP SRETRY /YES, RECALIBRATE AND TRY AGAIN SLOAD, JMS SYSIO /SYSTEM LOADER HAS DEFAULTS TO SAVE CORE SCORE, 0000 /CORE ARGUMENT SFUN, WRITE /NUMBER OF BLOCKS TO READ OR WRITE, FIELD, UNIT SBLOCK, BINADR /STARTING BLOCK NUMBER JMP I .+1/(SYSTART) /START AT SYSTART,SBOOT /THIS STARTING ADDRESS / I/O ROUTINES ENTER HERE. SYSIO, SBRET /I/O ENTRY POINT; INITIALIZED FOR BOOTSTRAP RETRY NL7777 /BACKUP TAD I SYSIO /ADD ON CURRENT ADDRESS VALUE DCA SCAA /SAVE AS TRANSFER ADDRESS FOR LATER RDF /GET CALLING FIELD TAD SCIF/(CIF) /MAKE INTO CIF CALLING FIELD INSTRUCTION DCA SEXIT /STORE IN EXIT ROUTINE ISZ SYSIO /BUMP TO FUNCTION WORD TAD I SYSIO /GET THE FUNCTION WORD DCA SFUNCT /SAVE IT FOR LATER ISZ SYSIO /BUMP TO BLOCK NUMBER SRETRY, SNA CLA /RECALIBRATE NEEDED? JMP SNORMAL /NO, JUST NORMAL CALL TAD S300/(300) /GET RECALIBRATE FUNCTION DCA SBUF2 /SET IT UP JMS SWAIT /ATTEMPT TO RECALIBRATE SNORMAL,TAD SFUNCT /GET THE FUNCTION WORD RAL /MOVE UP AND S7600/(7600) /ISOLATE PAGE BITS CIA /INVERT DCA SWC /SAVE AS WORD COUNT FOR LATER XLIST OFF IFZERO DRIVE < XLIST ON NL0000 /GET DRIVE NUMBER XLIST OFF > IFZERO DRIVE-1 < XLIST ON NL0001 /GET DRIVE NUMBER XLIST OFF > IFZERO DRIVE-2 < XLIST ON NL0002 /GET DRIVE NUMBER XLIST OFF > IFZERO DRIVE-3 < XLIST ON NL0003 /GET DRIVE NUMBER XLIST OFF > XLIST ON DCON /SETUP DRIVE CONTROL TAD SBFPTR/(SBUF+2) /GET COMMAND POINTER DLBP /LOAD REGISTER TAD I SYSIO /GET THE BLOCK NUMBER CLL RAR;CLL RAR /%4 SUPPER, UPPER%4000^CML CLL RAR /%8 DCA SBUF /SAVE FOR NOW SCIF, CIF /CIF CONSTANT S626, 626 /CONSTANT 0626 IFNZRO 7700-. S7, 7 /CONSTANT 0007 TAD I SYSIO /GET BLOCK NUMBER AGAIN S300, AND S7/(7) /JUST THREE LOW-ORDER BLOCK BITS DCA STEMP1 /SAVE FOR NOW TAD SFUNCT /GET FUNCTION AGAIN RAR;CLA RAR /LOW-ORDER UNIT BIT TO AC[0] DCA STEMP2 /SAVE IT TAD SFUNCT /GET FUNCTION WORD AGAIN AND S4070/(4070) /L W 0 0 0 0 0 F F F 0 0 0 SPA /SKIP IF READ TAD S6000/(6000) /MOVE OVER WRITE BIT TAD STEMP2 /L U W 0 0 0 0 F F F 0 0 0 CLL RAL /U W 0 0 0 0 F F F 0 0 0 0 TAD STEMP1 /U W 0 0 0 0 F F F 0 S S S RTR;RTR /0 S S S U W 0 0 0 0 F F F DCA SBUF2 /SETUP THE COMMAND WORD TAD SFUNCT /GET FUNCTION AGAIN RTR;RAR /MOVE HIGH-ORDER UNIT BITS TO LINK, AC[0] SPA CLA /HALF UNIT? TAD S626/(626) /YES SZL /UPPER UNIT? TAD S1454/(1454) /YES TAD SBUF /ADD ON TRUNCATED BLOCK NUMBER DCA SBUF /SAVE COMPOSITE CYLINDER WORD JMS SWAIT /GO EXECUTE THE COMMAND S40, ISZ SYSIO /BUMP PAST BLOCK NUMBER SEXIT, CIF 00 /WILL BE CIF RETURN FIELD JMP I SYSIO /RETURN TO CALLER S6000, 6000 /CONSTANT 6000 / DISK COMMAND TABLE. IFNZRO .&17 SBUF, .-. /DISK, CYLINDER, HEAD, HIGH SECTOR SBUF2, .-. /LOW SECTOR, OPCODE, CHAIN, INTERRUPT, FIELD SWC, .-. /WORD COUNT SCAA, SBOOT-1 /CURRENT ADDRESS; INITIALIZED FOR BOOTSTRAP S4070, 4070 /CONSTANT 4070; NOT MODIFIED BY COMMAND STEMP1, .-. /RETURNED CYLINDER ADDRESS AFTER TRANSFER STEMP2, .-. /ZEROED BY HARDWARE DURING A TRANSFER STATUS, .-. /RETURNED STATUS AFTER TRANSFER SFUNCT, 20^100 /FUNCTION WORD ZBLOCK SPARM-. /EMPTY SPACE SPARM, CLA!400 /EQUALS PARAMETER; CLEAN UP SFILES, TAD SBOOT&177+1 /FILE LIST STARTS HERE; GET A WORD DCA I SPARM&177+1 /PUT A WORD ISZ SFILES&177+1 /BUMP TO NEXT ISZ SPARM&177+1 /ANY MORE TO MOVE? JMP SFILES&177+1 /NO, GO BACK JMP I S7600&177+1/[SBOOT] /YES, NO GO DO A WARM BOOTSTRAP RELOC /TURN OFF RELOCATION $ /THAT'S ALL FOLK!