/ P?S/8 RX01, ETC. SYSTEM HANDLER / LAST EDIT: 23-FEB-1988 20:00:00 CJL / MUST BE ASSEMBLED WITH '/J' SWITCH SET. / P?S/8 RX01/RX02/RX03/DSD-210/440 SINGLE DENSITY SYSTEM HANDLER. / SUPPORTS DOUBLE-SIDED DISKS ON RX03. / SUPPORTS SECONDARY DRIVES ON DSD-210 OR VT78/VT278. / SUPPORTS RX01/RX02/RX03 PRIMARY AND SECONDARY DRIVES ON DECMATE II / (PROPER BOOTSTRAP SOFTWARE MUST BE PROVIDED BY THE USER). / USES OS/8 COMPATIBLE DISK FORMAT FOR FILE CONVERSION COMPATIBILITY. // P?S/8 EQUATED SYMBOLS. ADRLST= 7603 /ZAP ADDRESS LIST BBLEN= 0043 /SLURP LOADER BOOTSTRAP LENGTH BCIF= 7746 /SLURP LOADER FIELD START LOCATION BINADR= 0020 /"%" BLOCK BINIT= 0020 /SLURP INITIALIZE ROUTINE BINITLN=0020 /SLURP INITIALIZE CODE LENGTH BINIT2= 0031 /SECONDARY SLURP INITIALIZE LOCATION BISTRT= 7776 /DEFAULT STARTING ADDRESS IF /I OR /V CALADR= 0020 /CALLING ADDRESS CALFLD= 0021 /CALLING FIELD CNTLST= 7615 /ZAPPED ADDRESS CONTENTS LIST DEVSIZE=6760 /SYSGEN ROUTINES DEVICE SIZE WORD DSPBLB= 0024 /BLURB DISPLAY ROUTINE ERRTRP= 0046 /ERROR TRAP POINTER ESTATUS=0077 /ERROR STATUS EXHGEN= 4010 /EXTENDED HANDLER GENERATION FIELD, ADDRESS EXHRUN= 6010 /EXTENDED HANDLER INITIAL LOADING FIELD, ADDRESS EXIGEN= 3410 /EXTENDED HANDLER INITIALIZE GENERATION FIELD, ADDRESS EXIRUN= 5400 /EXTENDED HANDLER INITIALIZE LOADING FIELD, ADDRESS FILBLB= 0023 /BLURB FILL ROUTINE GENAD1= 7400 /FIELD ZERO SYSTEM HANDLER SYSGEN ADDRESS HBLOCK= 0101 /FIRST HELPER BLOCK HIDWRD= 7600 /SYSTEM HANDLER ID WORD IGEN= 4020 /I GENERATION ADDRESS IOTRAP= 0045 /I/O TRAP POINTER L3= 0005 /CONSTANT 0003 LOCATION L6= 0157 /CONSTANT 0006 LOCATION L7600= 0113 /CONSTANT 7600 LOCATION MONSTRT=0353 /KEYBOARD MONITOR STARTUP ADDRESS MOVBLB= 0022 /ERROR BLURB MOVE ROUTINE PCHLOOP=0162 /CHARACTER INPUT ROUTINE POINTER REWIND= 1335 /REWIND/UNLOAD ADDRESS SBLOCK= 7635 /SYSTEM LOADER BLOCK ARGUMENT SBOOT= 7600 /MONITOR RESTART ADDRESS SBTFUN= 7602 /SYSTEM BOOTSTRAP FUNCTION WORD SCORE= 7633 /SYSTEM LOADER TRANSFER ADDRESS SCRSIZE=7611 /SYSTEM MEMORY SIZE, ETC. WORD SDATE= 7610 /SYSTEM LOW-ORDER DATE WORD SFILES= 7757 /FILE LIST STARTS HERE SFUN= 7634 /SYSTEM LOADER FUNCTION WORD SLOAD= 7632 /SYSTEM LOADER ADDRESS SLPGEN= 4420 /SLURP LOADER GENERATION FIELD, ADDRESS SLPSA= 7777 /SLURP LOADER STARTING ADDRESS WORD SLUPAGE=2600 /SLURP LOADING PAGE SOUTFLS=7607 /SYSTEM OUTPUT FILE COUNT SPARM= 7756 /EQUALS PARAMETER ADDRESS 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, ADDRESS UNIT= 0000 /KEYBOARD MONITOR UNIT WRITE= 4000 /SYSIO WRITE BIT ZAPLST= 7627 /ZAPPED ADDRESS REPLACEMENT LIST // END OF P?S/8 EQUATED SYMBOLS. / RX8B EQUATED SYMBOLS. DEVCODE=75^10+6000 /SKELETON IOT CODE OF DISK SEL= DEVCODE+0 /LOAD DRIVE PAIR PER AC[11] LCD= DEVCODE+1 /LOAD COMMAND REGISTER XDR= DEVCODE+2 /TRANSFER DATA REGISTER STR= DEVCODE+3 /SKIP ON, CLEAR TRANSFER FLAG SER= DEVCODE+4 /SKIP ON, CLEAR ERROR FLAG SDN= DEVCODE+5 /SKIP ON, CLEAR DONE FLAG INTR= DEVCODE+6 /INTERRUPT ENABLE/DISABLE PER AC[11] INIT= DEVCODE+7 /INITIALIZE CONTROLLER, RECALIBRATE DRIVES / MISCELLANEOUS EQUATED SYMBOLS. NL0000= CLA /LOAD AC WITH 0000 NL0001= CLA IAC /LOAD AC WITH 0001 NL0002= CLA CLL CML RTL /LOAD AC WITH 0002 NL0006= CLA STL IAC RTL /LOAD AC WITH 0006 **** NOT USED IN HANDLER **** NL4000= CLA CLL CML RAR /LOAD AC WITH 4000 NL5777= CLA CLL CMA RTR /LOAD AC WITH 5777 NL7775= CLA CLL CMA RTL /LOAD AC WITH 7775 NL7776= CLA CLL CMA RAL /LOAD AC WITH 7776 NL7777= CLA CMA /LOAD AC WITH 7777 RXSIZE= 114^32%2 /SIZE OF ONE DISK SBOFF= SLUPAGE-SBOOT /OFFSET VALUE SYSADJ= 0001 /ADJUSTABLE CORE SIZE HANDLER SYSNUM= 0002 /SYSTEM DEVICE ID NUMBER **** MUST BE UNIQUE **** / P?S/8 DEC-COMPATIBLE FLOPPY DISK HANDLER. / A HANDLER FOR THAT BLECHEROUS PIECE OF HARDWARE, THE DEC VERSION OF THE / IBM-COMPATIBLE FLOPPY DISC, AND ANY OTHER DISC INTERFACE TO A PDP-8 TYPE / MACHINE FOOLISHLY DESIGNED TO BE COMPATIBLE WITH IT! / GENERAL WARNING TO ANYONE FOOLISH ENOUGH TO WRITE CODE FOR THIS HUNK OF JUNK: / THE HARDWARE IS SO INCREDIBLY CRUDE THAT STRANGE OPERATIONS MUST BE PERFORMED / ON THIS DEVICE TO GET THE HANDLER TO FIT EVEN THOUGH DISC THROUGHPUT AND / ERROR HANDLING ARE GROSSLY INEFFICIENT. / A LIST OF GRIPES FOLLOWS: / GRIPE LIST FOR RX-TYPE DEVICES. / A) THE DEC-SUPPLIED BOOTSTRAP FOR THIS DEVICE WAS SELFISHLY AND / EXPEDIENTLY WRITTEN TO GET UP OS/8 WITHOUT REGARD FOR THE CONSEQUENCES / TO OTHER SYSTEMS. CONTRADICTORY ATTEMPTS AT BOTH BREVITY AND FRILL / FEATURES YIELD A BOOTSTRAP FOR EITHER DRIVE ZERO OR ONE THAT ONLY / BRINGS IN PART OF A SINGLE SECTOR ON TOP OF THE PRIMARY CODE! THERE / IS EVEN A DEPENDENCY UPON A PORTION OF THE PRIMARY CODE WHICH IS / NEVER OVERLAYED! THE 8K OS/8 RX01 SYSTEM HANDLER IS ALSO HANDICAPPED / BY THIS AND HAS A PROBLEM WITH WRITE-LOCKED DISKS. SINCE OS/8 WRITES / ON THE DISK WHEN COLD-BOOTSTRAPPING IT, THE USER CAN'T WRITE-PROTECT / THE DISK BECAUSE: / 1) SOME MACHINES CAN'T "CONTINUE". / 2) SOME MACHINES DON'T HAVE A FRONT PANEL AND THEREFORE CAN'T / TELL WHAT'S HAPPENING. / 3) THE USER HAS TO UNDERSTAND THE BOOTSTRAP PROCESS TO DECIDE / THAT THE HALT AT 007605 IS ACCEPTABLE TO CONTINUE FROM AND / USERS HARDLY EVER APPRECIATE THIS. / OS/8 USERS ARE THEREFORE LOCKED OUT OF THE USEFULNESS OF WRITE- / PROTECTED BOOTSTRAPPING BECAUSE OS/8 CAN'T COME UP WITHOUT WRITING / DUE TO LACK OF ROOM IN THE HANDLER. SINCE OS/8 HAS LARGE SECONDARY / BOOTSTRAP SPACE, THIS BOOTSTRAP IS OBVIOUSLY SLOPPY, AND WILL TAX / OTHER SYSTEMS EVEN FURTHER. / B) AS A CONSEQUENCE OF A), THE P?S/8 SYSTEM HANDLER IS SIMILARLY / COMPROMISED AS MUCH OF THE CODE NORMALLY RESIDING ON BLOCK 0000 / FIRST HALF MUST BE PERVERTED TO A SECONDARY BOOTSTRAP OF NO USE / TO THE HANDLER WHEN IT FINALLY COMES UP. A COPY OF THE CODE WANTING / TO BE IN THE SAME RELATIVE LOCATIONS AS ARE USED BY THE BOOTSTRAP / MUST BE RESERVED IN THE ADDITIONAL BLOCKS THAT MAKE UP THE HANDLER. / THESE WORDS ARE BROUGHT IN LATER BY THE SECONDARY CODE, WHICH / ULTIMATELY SETS EVERYTHING RIGHT. / C) THE WHOLE PROBLEM COULD BE ELIMINATED FOR ALL OPERATING SYSTEMS / BY UTILIZING A BETTER SCHEME SUCH AS FULL PAGE LOADING BY A TRACK / ZERO RESIDENT PROGRAM (DEC DOESN'T USE TRACK ZERO). AN EXAMPLE OF / THIS CAN BE FOUND IN THE "PQSRXH" HANDLER. / D) THE RX INTERFACE, EVEN THOUGH IT IS A MICROPROCESSOR-BASED CONTROLLER, / DOES NOT DO ANY ERROR RECOVERY FOR YOU. IN ADDITION, THE USUAL HANDLER / CAN'T SENSE INDIVIDUAL ERRORS, AS THE ERROR RECOVERY SCHEME IS TOO / COMPLICATED, AND SPACE IS AT A PREMIUM. THE ONLY POSSIBLE ERROR / RECOVERY IS TO "INIT" THE DRIVES, WHICH DESTROYS THE SILO (WHY?) / IN THE PROCESS. UNLESS THE SILO IS RELOADED BEFORE TRYING TO WRITE / OUT THE CURRENT SECTOR AGAIN, THE CURRENT SECTOR WILL WIND UP BEING / A COPY OF TRACK ONE, SECTOR ONE! THE CURRENT DESIRED MEMORY CONTENTS / WILL BE LOST AND NO ERRORS WILL EVER BE DETECTED, EVEN WHEN READING / IT BACK LATER (ONLY A DIRECT WRITE/READ-VERIFY OPERATION WOULD BE / SECURE THROUGH THIS OPERATION; OS/8, P?S/8, AND MOST OF THE OTHER / DEC-TYPE SYSTEMS DON'T USUALLY DO THIS!). THIS HANDLER (THROUGH / MUCH SQUEEZING), WILL OVERCOME THESE PROBLEMS BY RETRYING THE I/O / TRANSACTION, "INIT"-ING THE SYSTEM ONLY WHEN NECESSARY. / E) THE RX IS TOO SLOW TO TRANSFER CONTIGUOUS SECTORS, SO AN INTERLEAVING / SCHEME IS USED. DEC UNWISELY CHOSE TO ARBITRATE THE USE OF NON- / INTERLEAVED IBM FORMAT AS THEIR STANDARD FOR ALL USES EVEN THOUGH / IBM ITSELF ALLOWS FOR INTERLEAVING, AND IN ANY CASE STAND-ALONE / PROGRAMS COULD HAVE WRITTEN IBM COMPATIBLE DATA ANYWAY IF ANYONE / CARED! DEC FORCES YOU TO SOFTWARE INTERLEAVE THE NON-INTERLEAVED / SECTORS. THE SIMPLEST APPROACH TO THIS INTERLEAVING ALGORITHM IS / TO USE CORRECTED REPETITIVE SUBTRACTING, HOWEVER THIS LEADS TO A / FAILURE TO KEEP IN STEP WITH THE TWO-WAY INTERLEAVED SECTORS WHEN / ACCESSING THE HIGHER TRACKS, ESPECIALLY ON THE SLOWER CPU'S (IM6100 / BASED). THIS LEADS TO THROUGHPUT DEGRADED BY A FACTOR OF 13! THIS / APPROACH IS THE ONE THAT DEC USES WITHIN OS/8 AS THEY HAVE NO OTHER / CHOICE (IN 8K) BUT TO USE THE SMALLEST PIECE OF CODE. THIS HANDLER / USES A HIGH-SPEED ALGORITHM TO ALLOW EVEN THE SLOWEST CPU TO KEEP / UP WITH THE TWO-WAY INTERLEAVE. / THE PRICE PAID FOR ALL OF THESE FEATURES IS THE NEED FOR EXTENDED MEMORY / (THIS IS A SOFTWARE CORE SIZE LIMITING HANDLER.) / RX BOOTSTRAPS. / ALL RX SYSTEMS EMERGE FROM A SHORT BOOTSTRAP WHICH EITHER ASSUMES THE / (EVENTUAL) RAISING OF THE DONE FLAG OR (IN THE CASE OF THE TINY / RX01/DSD-210 DRIVE ZERO ONLY BOOTSTRAP) THE EXECUTION OF THE SELF-DIAGNOSTIC / FUNCTION (WHICH RAISES THE DONE FLAG.) / THIS HANDLER IS COMPATIBLE WITH THE FOLLOWING BOOTSTRAPS: / (DEC) RX01 ONLY: LOOKS FOR DRIVE ZERO OR ONE IN SINGLE DENSITY MODE / ONLY. STORES UNIT^20+7004 IN 000060. / (DEC) RX01/RX02/RX03: LOOKS FOR DRIVE ZERO OR ONE IN SINGLE OR DOUBLE / DENSITY MODE. STORES UNIT^20+7004 IN 000060 AND / + IN 000061. / TINY RX01 DRIVE 0 ONLY: HARDWARE "INIT" READS IN BOOT SECTOR ON DRIVE ZERO. / STORES 0^20+7004 IN 000060. / MASTER: LOOKS FOR DRIVES 0-3 ON DSD-210 OR DRIVES 0-1 ON / MAIN PAIR AND 2-3 ON SECONDARY PAIR OF DRIVES OF / VT78, VT278, PC278 (ALSO RX50 DRIVES 0-3 ON PC278) / IN SINGLE OR DOUBLE DENSITY. STORES UNITS^20+7004 / IN 000060 AND + IN 000061. / NOTES ON (DEC) RX01 ONLY BOOTSTRAP: / A) STORES AN "RAL" INSTRUCTION OR "CML RAL" INSTRUCTION IN 000060 FOR / THE BENEFIT OF CERTAIN DEC SYSTEMS WHICH LOCATE THE BOOT UNIT BY / THIS METHOD. THIS IS NOT A COMPLETELY VALID ASSUMPTION AND IS NOT / USED BY THIS HANDLER. / B) THIS IS THE STANDARD BOOTSTRAP ON HARDWARE BOOTSTRAP LOADERS FOR / PDP-8/E, F, M, A AND VT-78. / C) THIS BOOTSTRAP IS VALID ON DRIVES ZERO AND ONE ONLY ON ANY HARDWARE / WHICH IGNORES THE RX02/RX03 HEAD BIT. THIS BIT IS EXTRANEOUSLY SET / DURING EXECUTION OF THIS BOOTSTRAP AND WILL FAIL ON AN RX02/RX03 / SETUP FOR RX02/RX03 MODE. / NOTES ON (DEC) RX01/RX02/RX03 BOOTSTRAP: / A) BOOTSTRAP CAN'T RUN ON CLASSIC PDP-8 AS SUPPLIED DUE TO NL0006 / ("IAC RTL" PROBLEM). / B) IF GENERALITY IS DESIRED, PATCH LOCATION SRBOOT TO: / TAD S6 (24/ 7327 1017). INCLUDE LOCATION 0017 IN THE BOOTSTRAP, / MAKING IT ONE WORD LONGER. / C) IF DSD-210/440 SYSTEM (WITH THREE OR FOUR DRIVES) COMPATIBILITY / CAN BE FORGONE, THEN RX01/RX02/RX03 AND ONE OR TWO DRIVE DSD-210/440 / SYSTEMS ON ANY PROCESSOR CAN BE SUCCESSFULLY BOOTSTRAPPED BY PATCHING / LOCATION SRBOOT TO TAD S46 (24/ 7327 1043). THIS DOES NOT CHANGE / THE BOOTSTRAP LENGTH. / D) THIS BOOTSTRAP FUNCTIONS IDENTICALLY TO THE RX01 ONLY BOOTSTRAPS / FOR THE PURPOSES OF THIS HANDLER AS THE ONLY FEATURE ADDED IS THE / ABILITY TO BOOTSTRAP DOUBLE-DENSITY DRIVES WHICH IS IMPOSSIBLE FOR / THIS HANDLER. THE ADDITIONAL INFORMATION IN 000061 IS IGNORED AS / IT MIGHT NOT BE THERE. / E) THIS BOOTSTRAP IS STANDARD ON VT-278 AND CAN BE USED ON THE DECMATE / II IF THE RX01/RX02 IS PROPERLY SELECTED FIRST. / NOTES ON TINY RX01 DRIVE 0 ONLY BOOTSTRAP: / A) THIS IS THE SHORTEST MANUAL BOOTSTRAP FOR THIS HANDLER. / B) DRIVE ZERO MUST BE READY AND THEN INITIALIZED BY THE SELF-DIAGNOSTIC / OPERATION WHICH DOES THE READ. THE BOOTSTRAP MERELY ASSUMES NO ERROR / AND EMPTIES THE SILO INTO MEMORY. / C) THIS BOOTSTRAP WORKS ON DRIVE ZERO ONLY ON RX01 COMPATIBLES ONLY. / THIS INCLUDES RX02 DRIVES WITH THE SWITCH THROWN TO RX01 POSITION / TO ALLOW THE SELF-DIAGNOSTIC TO BE PERFORMED IN SINGLE-DENSITY MODE. / NOTES ON MASTER BOOTSTRAP: / A) THIS IS THE ONLY BOOTSTRAP FOR SECONDARY DRIVES SUCH AS THE DSD-210 / DRIVES 2-3 AND THE SECONDARY PAIR OF DRIVES ON VT-78, VT-278, AND / FOR ALL EIGHT DRIVES ON DECMATE II. / B) THIS BOOTSTRAP WILL PROBABLY NOT WORK ON DEC OPERATING SYSTEMS (OS/8) / ON SECONDARY DRIVES DUE TO THE "RAL" INSTRUCTION QUIRK NOTED ABOVE. / SINCE THIS HANDLER JUST LOOKS AT 000060 FOR THE UNIT BITS AND / MANIPULATES THE HARDWARE FOR EITHER DSD-210 OR VT-78/VT-278 MODE / AS NECESSARY, THIS IS THE PREFERRED BOOTSTRAP TO BE USED WHEN / TRANSFERRING CONTROL BETWEEN SYSTEMS. / C) THIS BOOTSTRAP WILL BOOTSTRAP ALL 12-BIT RX01/RX02/RX03 OPERATING / SYSTEMS KNOWN (AT LEAST ON DRIVES ZERO AND ONE.) INCLUDING / RX01/RX02/RX03 ON THE DECMATE II. / D) THIS BOOTSTRAP WILL ALSO BOOTSTRAP RX50 SYSTEMS (ON DECMATE II ONLY). / OTHER NOTES OF INTEREST: / A) THE RX02 SUPPORTS AN RX01-COMPATIBLE SUBSET KNOWN AS RX8E. IT IS / TOTALLY COMPATIBLE WITH RX01 OPERATIONS EXCEPT FOR THE ANOMALOUS / "RX02" BIT[8] WHICH INDICATES THE DRIVE IS AN RX02 ONLY ON AN RX02! / IT MEANS WRITE-PROTECT ON AN RX01 OR DSD-210. SINCE THIS BIT IS / THEREFORE WORTHLESS, THIS SEEMS UNIMPORTANT. HOWEVER, MANY EXISTING / SOFTWARE PACKAGES HANDLE THIS SITUATION WRONG AND BELIEVE BIT[8] TO / ALWAYS INDICATE RX02 VALIDITY. THIS HANDLER WILL NOT "SCREW UP" ON / THIS BIT, ALWAYS CHECKING THE DRIVE TYPE BY THE "READ-STATUS / DOUBLE-DENSITY" METHOD. / B) IF ACTUAL RX03 DRIVES EXIST (CESI, DSD, ETC.), THE PARITY BIT[10] / OF THE RX01 MUST BE INTERPRETED AS "DOUBLE-SIDED DISK PRESENT" AND / MUST BE HANDLED PROPERLY. THIS HANDLER WILL NOT "SCREW UP" ON THIS / BIT EITHER, AS IN A) ABOVE. / C) THE RX01/RX02 CONTROLLER CANNOT BE USED DIRECTLY ON A DECMATE II / AS ONLY THE RX50 (OR RD50, RD51) IS SELECTED BY THE CP MEMORY FIRMWARE. / ONCE A DIFFERENT OPERATING SYSTEM HAS GAINED CONTROL OF THE MACHINE / (ON RD50, RD51 OR RX50), THE MASTER BOOTSTRAP CAN BE USED TO BOOTSTRAP / ANY RX-TYPE SYSTEM ON ANY DRIVE. / (DEC) RX01 ONLY BOOTSTRAP. NOPUNCH /THIS IS NOT PART OF THE HANDLER *24 /WHERE THIS LOADS SRBOOT, STL RTL /SET AC TO 0002 TAD SBU /NOW HAVE UNIT^20+7000+6 LCD /LOAD "READ SECTOR" COMMAND CLA IAC /SET AC TO 0001 JMS SLODE /ASK FOR SECTOR ONE JMS SLODE /ASK FOR TRACK ONE CLL RAL /SET AC TO 0002 SHANGG, SDN /BOOTSTRAP STARTS HERE; IS DONE FLAG UP? JMP SLODE1 /NO, TRY TRANSFER FLAG SER /SKIP IF ANY ERRORS SNA /ARE WE HERE FROM INITIAL WAIT? SKP CLA /SKIP NEXT IF FIRST TIME OR ERROR JMP SDOTR /ELSE GO LOAD THE NEXT COMMAND TAD SBU /GET CURRENT UNIT CIA /INVERT IT TAD SSUM/(CML RAL+RAL) /ADD ON MAGIC SUM DCA SBU /STORE BACK OTHER UNIT VALUE JMP SRBOOT /TRY AGAIN SDOTR, LCD /LOAD "EMPTY SECTOR" COMMAND SLP, JMS SLODE /GET A WORD SLPSTR, DCA SBOOT&177+2 /PUT A WORD ISZ SLPSTR /PUT TO NEXT JMP SLP /KEEP GOING UNTIL OVERLAYED / THE FOLLOWING WORDS ARE NEVER OVERLAYED. ALL OPERATING SYSTEMS PRIMARY / BOOTSTRAP BLOCKS MUST ASSUME THEIR PRESENCE IN ORDER TO LOAD AT ALL. / DEPENDENCE ON THESE WORDS PREVENTS SIGNIFICENT IMPROVEMENT OR ALTERATION / OF THE BOOTSTRAP CONVENTION IN THE FUTURE. SLODE, .-. /LOAD A WORD ROUTINE SLODE1, STR /TRANSFER FLAG UP? JMP SHANGG /NO, BUT DONE FLAG MAY BE UP XDR /DO TRANSFER IN PREVAILING DIRECTION JMP I SLODE /RETURN SBU, CML RAL /WILL BE UNIT^20+7004 ON SUCCESSFULL BOOT SSUM, CML RAL+RAL /MAGIC SUM FOR FLIPPING UNITS / (DEC) RX01/RX02/RX03 BOOTSTRAP. *17 /THIS IS NOT PART OF THE HANDLER S6, 6 /CONSTANT 0006; THIS IS NOT OFFICIALLY IN THE BOOTSTRAP /HOWEVER IT IS NEEDED FOR COMPATIBILITY WITH /CLASSIC PDP-8. *20 /OFFICIAL LOADING ADDRESS OF THIS BOOTSTRAP SBREAD, TAD SRXU /GET CURRENT UNIT^20+DENSITY WORD TAD SGDCON/(360) /UPDATE TO NEXT CANDIDATE AND SBU/(420) /KEEP ONLY NEW DENSITY AND UNIT BITS DCA SRXU /STORE BACK SRBOOT, NL0006 /TAD S6 /TAD S46/SET AC TO SIX TAD SRXU /ADD ON DENSITY AND UNIT BITS LCD /LOAD "READ SECTOR" COMMAND CLA CLL IAC /SET AC TO ONE AND CLEAR LINK JMS SLODE /ASK FOR SECTOR ONE JMS SLODE /ASK FOR TRACK ONE SRAL, RAL /AC NOW 0002 SHANGG, SDN /BOOTSTRAP STARTS HERE; DONE FLAG UP? JMP SLODE1 /NO, TRY TRANSFER FLAG SER /SKIP IF ANY ERRORS SNA /FIRST TIME THROUGH? JMP SBREAD /JUMP IF FIRST TIME THROUGH OR ERRORS TAD SRXU /GET CURRENT DENSITY SETTING; UNIT IS IGNORED LCD /LOAD "EMPTY SECTOR" COMMAND TAD SRXU /GET GOOD DRIVE S46, AND SGDCON/(360) /REMOVE DENSITY BIT TAD SRAL/(RAL) /ADD ON "RAL" INSTRUCTION DCA SBU /STORE FOR COMPATIBILIY WITH RX01 ONLY BOOTSTRAP SGDCON, 0360 /CONSTANT 0360 SLP, JMS SLODE /GET A WORD SLPSTR, DCA SBOOT&177+2 /PUT A WORD ISZ SLPSTR /PUT TO NEXT JMP SLP /KEEP GOING UNTIL OVERLAYED / THE FOLLOWING WORDS ARE NEVER OVERLAYED. ALL OPERATING SYSTEMS PRIMARY / BOOTSTRAP BLOCKS MUST ASSUME THEIR PRESENCE IN ORDER TO LOAD AT ALL. / DEPENDENCE ON THESE WORDS PREVENTS SIGNIFICENT IMPROVEMENT OR ALTERATION / OF THE BOOTSTRAP CONVENTION IN THE FUTURE. SLODE, .-. /LOAD A WORD ROUTINE SLODE1, STR /TRANSFER FLAG UP? JMP SHANGG /NO, BUT DONE FLAG MAY BE UP XDR /DO TRANSFER IN PREVAILING DIRECTION JMP I SLODE /RETURN SBU, 0420 /DENSITY AND UNIT MASK /WILL BE UNIT^20+7004 ON SUCCESSFULL BOOT SRXU, 0020 /WILL BE UNIT^20+DENSITY^400 ON SUCCESSFULL BOOT / TINY RX01 DRIVE ZERO ONLY BOOTSTRAP. *33 /STARTS LOADING HERE SHANGG, SDN /BOOTSTRAP STARTS HERE; DONE FLAG UP? JMP SLODE1 /TRY TRANSFER FLAG IF DONE FLAG IS NOT UP NL0002 /SETUP FOR EMPTYING LCD /LOAD THE COMMAND ZBLOCK SLP-. /0000'S WILL EXECUTE AND FALL THROUGH TO SLP! SLP, JMS SLODE /GET A WORD SLPSTR, DCA SBOOT&177+2 /PUT A WORD ISZ SLPSTR /BUMP TO NEXT WORD JMP SLP /KEEP GOING UNTIL SLP IS OVERLAYED! / THE FOLLOWING WORDS ARE NEVER OVERLAYED. ALL OPERATING SYSTEMS PRIMARY / BOOTSTRAP BLOCKS MUST ASSUME THEIR PRESENCE IN ORDER TO LOAD AT ALL. / DEPENDENCE ON THESE WORDS PREVENTS SIGNIFICENT IMPROVEMENT OR ALTERATION / OF THE BOOTSTRAP CONVENTION IN THE FUTURE. SLODE, .-. /LOAD A WORD ROUTINE SLODE1, STR /WORD READY? JMP SHANGG /NO, TRY DONE XDR /YES, GET A WORD JMP I SLODE /RETURN SBU, 0^20+7004 /INDICATE UNIT ZERO TO NEXT LEVEL / MASTER BOOTSTRAP. *10 /START LOADING HERE SBOK, NL0002 /SET MASK BIT RAL /MOVE IT OVER AND SCNT /JUST PAIR BIT RTL;RAL /MOVE TO DSD EXTRA UNIT BIT DCA SCONTRL /SAVE FOR NOW TAD SRXU /GET CURRENT UNIT AND DENSITY AND SBU/(420) /REMOVE PAIR BIT TAD SGDCON/(360) /UPDATE TO NEXT CANDIDATE AND SBU/(420) /KEEP ONLY DENSITY, UNIT BITS TAD SCONTRL /ADD ON PAIR UNIT BIT DCA SRXU /STORE BACK TAD SB6/(6) /GET "READ SECTOR" COMMAND TAD SRXU /ADD ON DENSITY, UNIT BITS LCD /LOAD THE READ SECTOR COMMAND CLA CLL IAC /CLEAR LINK FOR LATER, SET AC TO 0001 JMS SLODE /ASK FOR SECTOR ONE JMS SLODE /ASK FOR TRACK ONE SRAL, RAL /AC NOW 0002 SHANGG, SDN /BOOTSTRAP STARTS HERE; TEST FOR DONE JMP SLODE1 /NOT YET, TEST FOR TRANSFER AND COME BACK SER /DONE, ANY ERRORS? SNA /NO, ARE WE JUST STARTING UP? JMP SNXREAD /YES, GO DO NEXT CASE TAD SRXU /ADD ON DENSITY, UNIT BITS LCD /LOAD "EMPTY SECTOR" COMMAND TAD SRXU /GET CURRENT DENSITY, UNIT BITS AND SGDCON/(360) /JUST UNIT BITS TAD SRAL/(RAL) /NOW HAVE UNITS^20+7004 FOR COMPATIBILITY WITH RX01 BOOT DCA SBU /STORE IN RX01 BOOT WORD SGDCON, 0360 /UPDATE AND MASK CONSTANT SLP, JMS SLODE /GET A WORD SLPSTR, DCA SBOOT&177+2 /PUT A WORD ISZ SLPSTR /PUT TO NEXT JMP SLP /KEEP GOING UNTIL OVERLAYED / THE FOLLOWING WORDS ARE NEVER OVERLAYED. ALL OPERATING SYSTEMS PRIMARY / BOOTSTRAP BLOCKS MUST ASSUME THEIR PRESENCE IN ORDER TO LOAD AT ALL. / DEPENDENCE ON THESE WORDS PREVENTS SIGNIFICENT IMPROVEMENT OR ALTERATION / OF THE BOOTSTRAP CONVENTION IN THE FUTURE. SLODE, .-. /LOAD A WORD ROUTINE SLODE1, STR /TRANSFER FLAG UP? JMP SHANGG /NO, BUT DONE FLAG MAY BE UP XDR /DO TRANSFER IN PREVAILING DIRECTION JMP I SLODE /RETURN SBU, 0420 /DENSITY AND UNIT MASK; WILL BE UNITS^20+RAL SRXU, 0020 /DENSITY, UNIT WORD; WILL BE UNITS^20+DENSITY^400 / COMES HERE TO STARTUP THE NEXT CANDIDATE. SNXREAD,ISZ SCNT /BUMP COUNTER S14, 14 /CONSTANT 0014; THIS CAN BE SKIPPED JMS SCONTRL /SETUP CONTROLLER BITS SZL /EVEN PAIR? IAC /NO, USE ODD PAIR JMS SSEL /SELECT LATEST PAIR TAD S16/(16) /GET "READ ERROR REGISTER" VALUE LCD /LOAD COMMAND TO POSSIBLY LISTENING PAIR DCA SLODE /INITIALIZE THE TIMER / THE FOLLOWING CODE IS USED TO DETERMINE IF THE SELECTED PAIR ACTUALLY EXISTS. / IF THE DONE FLAG NEVER COMES UP, THE INTERFACE MUST BE REINITIALIZED / AND THE OTHER DRIVE PAIR SELECTED. SINCE THE OTHER PAIR MAY EXIST IN A / DSD-210 EXTENDED CONFIGURATION (SINGLE CONTROLLER WITH FOUR DRIVES) / THE EXTENDED UNIT BIT WILL BE PRESERVED. SDNTST, SDN /DONE FLAG UP? SKP /SKIP IF NOT JMP SBOK /JUMP IF SO ISZ SLODE /WAITED TOO LONG? JMP SDNTST /NO, GO BACK JMS SCONTRL /SETUP CONTROLLER BITS SNL /WAS IT ODD CONTROLLER? IAC /NO, MAKE IT SO JMS SSEL /SELECT OTHER PAIR INIT /INITIALIZE THE DRIVES SDN /WAIT FOR JMP .-1 /FLAG TO COME UP JMP SBOK /KEEP GOING SSEL, .-. /SELECT ROUTINE DCA SCONTRL /SAVE FOR NOW TAD S16/(16) /GET "READ ERROR REGISTER" VALUE LCD /LOAD THE COMMAND TAD SWTVALUE/(-600) /SETUP THE DCA SLODE /TIME-OUT ISZ SLODE /WASTE JMP .-1 /SOME TIME TAD SCONTRL /GET THE SELECT VALUE BACK SEL /SELECT THE PAIR NOW SWTVALU,CLA /CLEAN UP SDN /CLEAR DONE FLAG NOW S16, 16 /CONSTANT 0016; THIS CAN BE SKIPPED JMP I SSEL /RETURN SCONTRL,.-. /CONTROLLER BITS ROUTINE CLA CLL /CLEAN UP TAD SCNT /GET CURRENT COUNT AND S14/(14) /JUST PAIR BITS RTR;RAR /MOVE OVER SZA CLA /SKIP IF RX50 QUAD TAD S4000/(4000) /ELSE SELECT RX01/RX02 QUAD JMP I SCONTRL /RETURN FOR PAIR DISPOSITION BY LINK TEST S4000, 4000 /CONSTANT 4000 SB6, 6 /CONSTANT 0006 SCNT, 10-1 /CONTROLLER COUNTER ENPUNCH /RESTORE BINARY OUTPUT / P?S/8 MONITOR COMPONENTS. / REWIND/UNLOAD ROUTINE. *REWIND-1 /DEFINE REWIND/UNLOAD ROUTINE PRWSEL, REWSELECT /POINTER TO SELECT AND LOAD ROUTINE REWIND, SDN /FLAG UP? JMP REWIND /NO, WAIT FOR IT TAD I L7600/[SBTCIF] /GET CIF HIGHEST FIELD INSTRUCTION DCA REWINLINE /STORE IN-LINE TAD UNIT /GET UNIT BITS RTL;RTL /*20 REWINLI,.-. /WILL BE CIF HIGHEST FIELD JMS I PRWSEL/(REWSELE)/CALL SELECT AND LOAD ROUTINE TAD UNIT /GET UNIT BITS AGAIN AND L3/[3] /JUST USEFUL UNIT BITS CLL RTL;RTL /*20 TAD L6/[6] /ADD ON READ BITS LCD /LOAD THE COMMAND NL0001 /+1 STR /FLAG UP? JMP .-1 /NO, WAIT FOR IT XDR /ASK FOR SECTOR ONE NL0000 /0 STR /FLAG UP? JMP .-1 /NO, WAIT FOR IT XDR /ASK FOR TRACK ZERO ZBLOCK .!177-. /EMPTY SPACE JMP I PCHLOOP/[CHLOOP]/KEEP GOING / DEVICE SIZE. *DEVSIZE /OVER SYSGEN ROUTINES RXSIZE /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 STHFX3/(SBTFUN) /CLEAR BOOTSTRAP UNIT FOR GENASYS STHFLP, CDF EXHGFLD /WHERE MISSING CODE IS TAD I STHFX1 /GET A WORD CDF 00 /GOTO SYSIO FIELD DCA I STHFX2 /PUT A WORD ISZ STHFX1 /BUMP INPUT POINTER ISZ STHFX2 /BUMP OUTPUT POINTER ISZ STHCNT /DONE ALL YET? JMP STHFLP /NO, GO BACK TAD I STHFX4/(SETCIF) /GET CIF HIGHEST FIELD DCA I STHFX5/(SBTCIF) /STORE OVER OVERLAYED WORD TAD I STHFX5/(SBTCIF) /GET IT BACK DCA I STHFX6/(DNWCIF) /STORE OVER OVERLAYED WORD JMP I STHFIX /RETURN STHCNT, S7600-OEND /COUNT OF WORDS TO MOVE STHFX1, S7600-EXHRADR+EXHGADR /WHERE THE CODE IS STHFX2, S7600 /WHERE IT SHOULD BE MOVED TO STHFX3, SBTFUN /POINTER TO BOOTSTRAP UNIT FUNCTION STHFX4, SETCIF /WHERE CIF EXHGFLD IS STHFX5, SBTCIF /WHERE IT'S NEEDED STHFX6, DNWCIF /LIKEWISE / 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 TAD BUN4 /GET OUR UNIT^20+RAL BHCIF, CIF EXHGFLD+.-. /WILL BE CIF HIGHEST FIELD AVAILABLE JMS BUTSEL /SELECT OUR PAIR AND READ SECTOR ONE, TRACK ONE BHANG, SDN /DONE FLAG UP? JMP BLDIT1 /NO, TRY TRANSFER FLAG SNA /ARE WE EMPTYING? JMP BUTEND /NO, WE'RE DONE LCD /YES, LOAD EMPTYING COMMAND IFNZRO SCRSIZE-. SCRSIZE,0 /THIS CAN BE INCREMENTED BTRLUP, JMS BLODIT /GET A WORD DCA BTOBEG+.-. /PUT A WORD ISZ .-1 /BUMP TO NEXT JMP BTRLUP /KEEP GOING UNTIL DONE FLAG RAISES BGRPCT, .-. /GROUP COUNTER BLINK, .-. /LINK SAVED HERE SECTOR, .-. /LATEST SECTOR BLOC, .-. /STORAGE POINTER BRLBTS, .-. /FLAG WORD BUN4, .-.^20+RAL /BOOTSTRAP UNIT^20+RAL; UNIT BITS WILL BE FILLED IN TRACK, .-. /LATEST TRACK BWC, .-. /SECTOR WORD COUNT BWDCT, .-. /WORD COUNTER / COMES HERE WHEN DONE FLAG COMES UP. BUTEND, TAD SCRSIZE /GET <^C> BIT STL RAR /LOAD INTO LINK AND MAKE AC NEGATIVE B7770, SPA SNA SZL CLA /CONSTANT 7770; THIS CLEARS THE AC AND CANNOT SKIP TAD BUN4 /GET BOOTSTRAP UNIT^20+RAL JMP BTNEXT /CONTINUE THERE / WORD TRANSFER ROUTINE. BLODIT, .-. /WORD TRANSFER ROUTINE BLDIT1, STR /TRANSFER FLAG UP? JMP BHANG /NO, TRY DONE FLAG XDR /YES, TRANSFER A WORD JMP I BLODIT /RETURN / ALL BOOTSTRAP CODE MUST BE WITHIN 7600-7642. / ENSURE THIS SIZE CONVENTION IS MET. IFNZRO SBOOT+BBLEN-.&4000 / THE SLURP LOADER STARTS HERE. BREAD, ISZ BFLPTR /BUMP TO NEXT FILE TAD I BFLPTR /GET A FILE ARGUMENT AND B7770/(7770) /JUST BLOCK BITS BRDZP1, SNA /END OF LIST? **** /I **** SKP CLA JMP BENDSLURP /YES, GO FINISH UP CLL RAL /NO, ADJUST TO LOGICAL SECTOR DCA SBLK /SAVE IT BRDZP2, TAD I BFLPTR /GET UNIT; **** /I **** TAD BTUNIT BNCIF1, CIF EXHGFLD+.-. /WILL BE CIF HIGHEST FIELD AVAILABLE JMS BINSETUP /GET DONE FLAG UP, SETUP PAIR AND SECTOR, TRACK BNWREC, NL7777 /SETUP THE NEW DCA BWC /SECTOR READ TAD B7756/(-22) /RESET THE DCA BGRPCTR /GROUP COUNTER BNWGRP, TAD B7772/(-6) /RESET THE DCA BWDCT /WORD COUNTER JMS BGETWD /GET A WORD CLL RAR /DO INITIAL SHIFT SKP /DON'T GET STORED FLAG WORD FIRST TIME! BGRPLP, TAD BRLBTS /GET FLAGS WORD RTL /ROTATE TO NEXT WORD DCA BRLBTS /STORE FOR NEXT TIME TAD BRLBTS /GET IT BACK B7700, SMA CLA /SKIP IF OR FIELD SETTING JMP BSTORE /JUMP IF DATA WORD OR ORIGIN SETTING BEOF, SNL CLA /SKIP IF FIELD SETTING JMP BREAD /ELSE GET NEXT FILE JMS BGETWD /GET NEXT WORD DCA BCDF /SAVE FIELD SETTING JMP BNXTWD /CONTINUE THERE BSTORE, JMS BGETWD /GET A WORD BCDF, CDF 00+.-. /GOTO CURRENT FIELD SNL /SKIP IF ORIGIN SETTING DCA I BLOC /STORE THE WORD CDF 00 /BACK TO FIELD 0 ISZ BLOC /BUMP STORAGE POINTER SZL /SKIP IF DATA WORD; CAN BE HARMLESSLY SKIPPED! DCA BLOC /STORE NEW ORIGIN SETTING BNXTWD, ISZ BWDCT /DONE ALL WORDS IN THIS GROUP YET? JMP BGRPLP /NO, KEEP GOING ISZ BGRPCTR /YES, DONE ALL GROUPS IN THIS BLOCK? JMP BNWGRP /NO, KEEP GOING JMS BGETWD /WASTE THE JMS BGETWD /EXTRA WORDS JMP BNWREC /GO DO ANOTHER BLOCK BGETWD, .-. /GET A WORD ROUTINE RAR /GET THE LINK DCA BLINK /SAVE IT ISZ BWC /DONE WITH THIS SECTOR YET? JMP BGETIT /NO, GO GET THE NEXT WORD TAD B7700/(-100) /YES, RESET THE DCA BWC /WORD COUNT BRDZP3, TAD I BFLPTR /GET FILE ARGUMENT; **** /I **** TAD BTUNIT BNCIF2, CIF EXHGFLD+.-. /WILL BE CIF HIGHEST FIELD AVAILABLE JMS BLOAD /GET LATEST SECTOR LOADED BGETIT, JMS BLODIT /GET LATEST WORD; **** /I **** JMP BILOAD TAD BLINK /ADD ON SAVED LINK TO LATEST WORD TAD BLINK /ADDING TWICE RESTORES OLD LINK VALUE JMP I BGETWD /RETURN / COMES HERE AFTER /I HAS READ IN SECTOR ONE, TRACK ONE OVER 007600-007677. / MUST BE ON SECOND HALF OF PAGE. IFZERO .&100 BIDONE, CIF EXHGFLD+.-. /WILL BE CIF HIGHEST FIELD AVAILABLE JMS I BISEC3/(BISCT3) /LOAD SECTOR THREE, TRACK ONE TAD BIDONE /GET CIF HIGHEST FIELD AVAILABLE DCA BICIF1 /SETUP /I ENDUP ROUTINE TAD BCIF /GET CIF CDF STARTING FIELD DCA BICIF /STORE IN-LINE FOR LATER JMP BILOAD /CONTINUE LOADING I/O ROUTINES ZBLOCK BCIF-3-. /EMPTY SPACE / DEFAULT STARTING ADDRESS. BERR, /DEFAULT STARTING ADDRESS B7772, SPA SNA SZL CLA HLT /NEVER EVER SKIPS BUT HALTS / COMES HERE AT OF LAST FILE. BENDSLU,CIF EXHGFLD+.-. /WILL BE CIF HIGHEST FIELD AVAILABLE JMS BSLEND /GO FINISH UP BCIF, CIF CDF 00+.-. /WILL BE STARTING FIELD INSTRUCTION / THE FOLLOWING WORD IS USED AS AN END OF LOAD FLAG BY /I CODE. THIS WORD / WILL BE NEGATIVE UNTIL "S70" IN THE HANDLER IS LOADED OVER IT. IFNZRO 7747-. S70, JMP I SPARM /STARTUP THE USER CODE SBLK, .-. /LOGICAL SECTOR BFLPTR, SFILES-1 /POINTER TO PASSED FILES / POINTER TO BISCT3. / MUST BE ON SECOND HALF OF PAGE. IFZERO .&100 BISEC3, BISCT3 /POINTER TO BISCT3 / BOOTSTRAP UNIT FOR /I. / MUST BE IN SECOND HALF OF PAGE. IFZERO .&100 BTUNIT, .-. /WILL BE BOOTSTRAP UNIT FOR /I B7756, 7756 /CONSTANT 7756 ZBLOCK SPARM-. /EMPTY SPACE SPARM, BERR /STARTING ADDRESS; INITIALIZED FOR DEFAULT SFILES, /FILE SPECIFICATIONS PASSED HERE / SLURP INITIALIZE CODE. RELOC BINIT2 /WHERE THIS EXECUTES BINIT2, TAD I BNSBCIF/(SBTCIF)/GET CIF HIGHEST FIELD INSTRUCTION DCA .+1 /STORE IN-LINE .-. /WILL BE CIF HIGHEST FIELD AVAILABLE JMS I BNINIT/(BSINIT) /CALL SLURP INITIALIZE ROUTINE JMP I BINIT /RETURN BNINIT, BSINIT /SLURP INITIALIZE POINTER BNSBCIF,SBTCIF /WHERE CIF HIGHEST FIELD AVAILABLE IS ZBLOCK BINIT2+BINITLN-./EMPTY SPACE RELOC SFILES+BINITLN /RESET ORIGIN SLPSA, BREAD /SLURP LOADER STARTING ADDRESS /N. B. NON-ZERO MEANS SLURP LOADER EXISTS! RELOC /TURN OFF RELOCATION / P?S/8 SYSTEM I/O ROUTINE LOADER. / CORE IMAGE OF A BINARY FORMAT FILE WHICH WILL BE WRITTEN OUT TO THE /I BLOCK. / THE FOLLOWING PAGE OF CODE IS AN EXAMPLE OF A P?S/8 BINARY FORMAT FILE. / IT WILL BE WRITTEN OUT AT SYSGEN TIME AS A CORE IMAGE OF A "FILE" TO BE / USED LATER AS THE LAST LOADED "FILE" WHEN INVOKING THE '/I' OPTION OF THE / SLURP LOADER. AT RUN TIME, IT WILL BE LOADED OVER AND NEXT TO THE SLURP / LOADER (BY THE SLURP LOADER!), CAUSING THE SYSTEM I/O ROUTINES TO BE RELOADED; / THE FINAL EFFECT IS AS IF THE VIRTUAL LOADER (/V) HAD BEEN USED, BUT WITHOUT / THE OVERHEAD AND WRITING (THE SLURP LOADER AND /I CODING CAN BE USED WITH / WRITE-LOCKED DEVICES.) / THE ONLY RESTRICTION ON USE OF THE /I OPTION IS THAT IT IS PASSED AS A FILE / ARGUMENT TO THE LOADER, AND THUS LIMITS THE LOADER TO ONLY SIXTEEN FILES / MAXIMUM INSTEAD OF THE NORMAL SEVENTEEN. BY USING THE /I OPTION, THE USER / CAN MAINTAIN DEVICE INDEPENDENCE, YET TAKE ADVANTAGE OF THE BENEFITS OF / THE SLURP LOADER OVER THE VIRTUAL (/V) LOADER. / P?S/8 BINARY FORMAT AND CORE IMAGE FORMAT ARE RELATIVELY SIMILAR, BUT THE / DIFFERENCES WILL BE DESCRIBED. / P?S/8 BINARY FORMAT DESCRIPTION. / THE P?S/8 BINARY FILE FORMAT CONSISTS OF A SEQUENTIAL LIST OF BLOCKS, EACH / BLOCK CONTAINING 128 LOGICAL WORDS. THE WORDS BREAKDOWN FURTHER INTO EIGHTEEN / GROUPS OF SEVEN WORDS PLUS TWO WASTE WORDS. IF ANY PHYSICAL ADDITIONAL WORDS / EXIST, IT IS THE LOADER'S RESPONSIBILITY TO PROPERLY IGNORE THEM, JUST AS / IN SEVERAL SYSTEM HANDLERS. / EACH GROUP OF SEVEN WORDS CONSISTS OF A CONTROL WORD AND SIX DATA WORDS. / THE CONTROL WORD CONSISTS OF SIX BIT PAIRS EACH OF WHICH CONTROLS THE / CORRESPONDING FOLLOWING DATA WORDS. THE ORDERING IS LEFT TO RIGHT, I.E. / THE HIGH-ORDER TWO BITS OF THE CONTROL WORD CONTROL THE DATA WORD IMMEDIATELY / FOLLOWING THE CONTROL WORD; THE LOW-ORDER TWO BITS OF THE CONTROL WORD CONTROL / THE SIXTH DATA WORD FOLLOWING THE CONTROL WORD. SINCE EACH GROUP (AND / THEREFORE BLOCK) IS AUTONOMOUS EXCEPT FOR IMPLIED ORIGIN AND FIELD, ANY / SINGLE BLOCK CAN BE LOADED INDEPENDENTLY. / THIS /I BLOCK CONFORMS TO THIS CONVENTION, AND WILL BE TREATED AS A ONE / BLOCK LONG "FILE" COMPLETE WITH . / ALL ACTUAL DATA WORDS ARE IDENTICAL TO THEIR CORE IMAGE COUNTERPARTS, HOWEVER, / NOT ALL WORDS IN A GROUP ARE ACTUAL DATA WORDS. / BIT CONVENTION FOR CONTROL WORDS. / EACH OF THE CONTROL WORD'S BIT PAIRS CONTROLS THE CORRESPONDING DATA WORD / IN THE FOLLOWING MANNER: / 00 ACTUAL DATA WORD; THE CORRESPONDING WORD IS AN ACTUAL DATA WORD / TO BE LOADED ACCORDING TO THE CURRENT ORIGIN ADDRESS; LOAD IT AND / ADVANCE THE ORIGIN ADDRESS BY ONE. / 01 END OF FILE; IGNORE CORRESPONDING WORD (AND REST OF FILE!). / 10 ORIGIN SETTING; SET CURRENT ORIGIN ADDRESS TO THE VALUE OF THE / CORRESPONDING DATA WORD. / 11 FIELD SETTING; THE CORRESPONDING WORD IS A CDF INSTRUCTION TO THE / NEW FIELD; EXECUTE IT WHEN LOADING DATA WORDS INDIRECTLY THROUGH / THE CURRENT ORIGIN ADDRESS. THIS ALLOWS LOADING TO OCCUR IN FIELDS / 0-7. / TYPICAL P?S/8 BINARY FORMAT FILES ARE CREATED BY EITHER AN ASSEMBLER PROGRAM / OR THE BINARY UTILITIES (BIN, BSAVE, ETC.). SEVERAL SYSTEM PROGRAMS CHECK / BINARY FILE FORMAT VALIDITY BY LOOKING FOR INITIAL DATA OF AN ORIGIN TO / 0200, THUS MAKING THE CONTROL WORD OF THE FORM 10 XX XX XX XX XX, AND THE / FIRST DATA WORD 0200. / THE /I "FILE" WAS NOT CREATED DIRECTLY BY ANY ASSEMBLER, AND THIS LACKS THE / (UNNECESSARY) "*200" CONVENTION OF A DEFAULT ORIGIN. ONLY THE SLURP LOADER / WILL EVER LOOK AT THE /I "FILE", AND THE LOADER DOESN'T VALIDATE THE FILE / FORMAT. / A TYPICAL BINARY FILE IS SLIGHTLY GREATER THAN 7/6 OF THE EQUIVALENT CORE / IMAGE FILE SIZE. / SINCE NO CHECKSUM SCHEME IS USED IN THE FILE FORMAT, THE USER CAN PATCH / FREELY ANY BINARY FILE. THIS IS USEFUL WHEN MODIFYING OLD PAPER-TAPE BINARY / FILES WHICH LACK FIELD SETTINGS, ETC. WHEN ATTEMPTING TO LOAD THEM INTO / EXTENDED MEMORY FIELDS THEY WERE NOT INTENDED FOR, ETC. / THE /I CODE COULD BE IMPLEMENTED BY A USER PROGRAM, BUT WOULD THEN NOT BE / DEVICE INDEPENDENT. / SPECIAL NOTE ON SELF-STARTING. / SINCE THE USER CAN DIRECTLY OVERLAY THE LOADER (INDEED THE /I OPTION USES / THIS VERY METHOD!), IT IS POSSIBLE TO CREATE A "SELF-STARTING" PROGRAM BY / SELECTIVE OVERLAY OF THE STARTUP LOCATIONS: / BCIF (07746) STARTING FIELD AS A CIF CDF INSTRUCTION. / SPARM (07756) STARTING ADDRESS IN THE STARTING FIELD. / USER LOADING OF THESE LOCATIONS WILL ALWAYS OVERRIDE ANY AND ALL OTHER METHODS / (DEFAULT VALUES, DEFAULT VALUES WITH /I IN EFFECT, "GET" VALUES, EXPLICIT / COMMAND OPTION SWITCHES, EQUALS PARAMETERS, PRIOR USER LOADING OF THESE / SAME LOCATIONS IN AN EARLIER PASSED BINARY FILE, ETC.). / N. B. THIS SELF-STARTING ABILITY IS TOTALLY IGNORED WHEN USING THE VIRTUAL / (/V) LOADER; SEE "BIN" FOR A DISCUSSION OF THE DISPOSITION OF USER LOADING / INTO 07600-07777, ETC. WHEN THE VIRTUAL LOADER IS IN EFFECT. / BINARY LOADER /I CODING. FIELD IGEN&70%10 /I GENERATION FIELD *IGEN&7600 /I GENERATION ADDRESS ICOR, NOPUNCH /FOOL THE ASSEMBLER FIELD 0 /WHERE THIS LOADS *ICOR /RESET ORIGIN ENPUNCH /UN-FOOL THE ASSEMBLER / BIT DEFINITIONS FOR BINARY CONTROL WORDS. DA1= 0000 /DATA IN WORD 1 DA2= 0000 /DATA IN WORD 2 DA3= 0000 /DATA IN WORD 3 DA4= 0000 /DATA IN WORD 4 DA5= 0000 /DATA IN WORD 5 DA6= 0000 /DATA IN WORD 6 DATALL= DA1+DA2+DA3+DA4+DA5+DA6 /DATA IN ALL WORDS EF1= 2000 /END OF FILE IN WORD 1 EF2= 0400 /END OF FILE IN WORD 2 EF3= 0100 /END OF FILE IN WORD 3 EF4= 0020 /END OF FILE IN WORD 4 EF5= 0004 /END OF FILE IN WORD 5 EF6= 0001 /END OF FILE IN WORD 6 OR1= 4000 /ORIGIN SETTING IN WORD 1 OR2= 1000 /ORIGIN SETTING IN WORD 2 OR3= 0200 /ORIGIN SETTING IN WORD 3 OR4= 0040 /ORIGIN SETTING IN WORD 4 OR5= 0010 /ORIGIN SETTING IN WORD 5 OR6= 0002 /ORIGIN SETTING IN WORD 6 FL1= 6000 /FIELD SETTING IN WORD 1 FL2= 1400 /FIELD SETTING IN WORD 2 FL3= 0300 /FIELD SETTING IN WORD 3 FL4= 0060 /FIELD SETTING IN WORD 4 FL5= 0014 /FIELD SETTING IN WORD 5 FL6= 0003 /FIELD SETTING IN WORD 6 FL1+OR2+DA3+DA4+DA5+DA6 /NEW CONTROL WORD CDF 00 /FIELD 0 SFILES /*SFILES RELOC SFILES /FOOL THE ASSEMBLER BILOAD, STR /TRANSFER FLAG UP? JMP BITRYDONE /NO, TRY DONE FLAG XDR /YES, GET THE WORD DCA SBOOT+.-. /STORE OVER LAST PAGE DATALL /NEW CONTROL WORD RELOC .-1 /FOOL THE ASSEMBLER ISZ .-1 /BUMP TO NEXT TAD S70/(70) /GET LAST LOADING WORD SPA SNA CLA /SKIP IF WE LOADED IT JMP BILOAD /ELSE JUST KEEP GOING BICIF1, CIF EXHGFLD+.-. /WILL BE CIF HIGHEST FIELD AVAILABLE JMS SLIEND /GET DONE FLAG UP AND FIXUP FIELD ZERO DATALL /NEW CONTROL WORD RELOC .-1 /FOOL THE ASSEMBLER BICIF, CIF CDF 00+.-. /WILL BE CIF CDF STARTING FIELD JMP I SPARM /GO STARTUP THE USER PROGRAM BITRYDO,SDN /DONE FLAG UP? JMP BILOAD /NO, TRY TRANSFER FLAG JMP BIDONE /YES, CONTINUE THERE BISTRT, HLT /DEFAULT STARTING ADDRESS DA1+OR2+DA3+OR4+DA5+OR6 /NEW CONTROL WORD RELOC .-1 /FOOL THE ASSEMBLER JMP BISTRT /JUST IN CASE / THE FOLLOWING PATCH THE SLURP LOADER TO SERVE THE /I CODE NOW RESIDENT IN / 007757-007777. BRDZP1 /*BRDZP1 RELOC BRDZP1 /FOOL THE ASSEMBLER SKP CLA /MAKE IT READ IN LOGICAL BLOCK ZERO BRDZP2 /*BRDZP2 RELOC BRDZP2 /FOOL THE ASSEMBLER TAD BTUNIT /MAKE IT USE BOOTSTRAP UNIT IN SETUP ROUTINES BRDZP3 /*BRDZP3 RELOC BRDZP3 /FOOL THE ASSEMBLER DA1+OR2+DA3+EF4+EF5+EF6 /NEW CONTROL WORD RELOC .-1 /FOOL THE ASSEMBLER TAD BTUNIT /MAKE IT USE BOOTSTRAP UNIT IN SECTOR READ ROUTINE BGETIT /*BGETIT RELOC BGETIT /FOOL THE ASSEMBLER JMP BILOAD /GO START /I CODE INSTEAD OF SLURP LOADER / HERE / END OF /I CODING WHICH MUST FIT IN ONE PAGE. RELOC /TURN OFF RELOCATION IFNZRO ICOR+200-.&4000 / MONITOR I/O INTERCEPT BLOCKS FOR RX01, ETC. / 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 RX01 /SYSTEM DEVICE NAME / I/O ADDRESSES. ADRLST, OEND+2 /NORMALLY CML RTL OEND+3 /NORMALLY DCA SFUNCT SERR /NORMALLY HLT OR 7401 SERR+1 /NORMALLY NOP 0 /THIS ENDS THE SHORT LIST ZBLOCK ADRLST+12-. /EMPTY SPACE / I/O NORMAL CONTENTS. CNTLST, CML RTL /OEND+2 DCA SFUNCT /OEND+3 HLT/OR 7401 /SERR NOP /SERR+1 0 /THIS ENDS THE SHORT LIST ZBLOCK CNTLST+12-. /EMPTY SPACE / I/O REPLACEMENT CONTENTS. ZAPLST, CIF 10 /WILL BE TO CORRECT FIELD JMP IOTRAP /JMP THERE ON ANY CALL CIF 10 /WILL BE TO CORRECT FIELD JMP ERRTRP /JMP THERE ON ANY ERROR 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 CML RTL /MOVE UP INVERTED LINK DCA I (SFUNCT) /STORE AS READ/WRITE FUNCTION NL7777 /BACKUP TAD I (SYSIO) /GET CALLING ADDRESS DCA CALADR /SAVE FOR ERROR HANDLER TAD TRPINST /GET CDF CALLING FIELD DCA CALFLD /SAVE FOR ERROR HANDLER TRPINST,.-. /GOTO CALLING FIELD CIF 00 /GOTO MONITOR FIELD JMP I (OEND+4) /CONTINUE THERE / ERROR BLURBS. DENS, TEXT " DENSITY" /DENSITY ERROR BLURB PAR, TEXT " PARITY" /PARITY ERROR BLURB CRC, TEXT " CRC" /CRC ERROR BLURB REDERR, TEXT " READY" /DRIVE NOT READY ERROR BLURB TYPCODE,TEXT "CODE " /ERROR CODE-ORIENTED ERROR BLURB WRIERR, TEXT " PROTECT" /WRITE-LOCK ERROR TEXERR, TEXT "HIGH TRK" /TRACK EXCEEDED ERROR TIMO, TEXT "TIME OUT" /TIME-OUT ERROR (2 REVOLUTIONS) HARD, TEXT "HARDWARE" /HARDWARE TIME-OUT ERROR BLBLEN= .-HARD /LENGTH OF ERROR BLURBS PAGE / ERRORS COME HERE. TRPERR, DCA ESTATUS /SAVE ERROR STATUS RIF /GET OUR FIELD TAD ERRCDF/(CDF) /MAKE INTO CDF INSTRUCTION DCA ERSTATUS /SAVE IN-LINE ERRCDF, CDF 00 /GOTO MONITOR FIELD JMS ERLOC8 /LOCATE OUR CODE ERLOC8, .-. /OUR PC STORED HERE TAD ERLOC8 /GET OUR ADDRESS TAD (DENS-ERLOC8) /FORM LOWEST BLURB ADDRESS DCA ERLOC8 /SAVE FOR LATER TAD I (SECODE) /GET EXPLICIT ERROR CODE DCA ECODE /STASH IT TAD I (SYSTATUS) /GET SYSTEM STATUS WORD ERSTATU,.-. /WILL BE CDF OUR FIELD DCA ERSTATUS /STASH IT TAD ERSTATUS /GET SYSTEM STATUS BACK AND (200) /JUST DRIVE READY BIT SNA CLA /SKIP IF DRIVE READY JMP NOTREDY /JUMP IF NOT READY ERROR TAD ECODE /GET ERROR CODE SPA /SKIP IF NORMAL CASE JMP HRDERR /BARF IF HARDWARE FAILURE TAD (-40) /COMPARE TO TRACK EXCEEDED VALUE SNA /SKIP IF DIFFERENT JMP XCDERR /JUMP IF EXCEEDED ERROR TAD (-100+40) /COMPARE TO WRITE-LOCK VALUE SNA /SKIP IF OTHER JMP WRILOCK /JUMP IF WRITE-LOCK ERROR TAD (-70+100) /COMPARE TO TIME-OUT VALUE SNA CLA /SKIP IF OTHER JMP TIMERR /JUMP IF TIME-OUT ERROR TAD ERSTATUS /GET STATUS WORD AGAIN AND (60) /JUST DOUBLE-DENSITY BITS SZA CLA /SKIP IF RX01 TAD (21-3) /MAKE IT CHECK RX02, RX03 DENSITY, CRC TAD (3) /ELSE RX01 PARITY, CRC AND ESTATUS /ISOLATE ORIGINAL ERROR SNA /SKIP IF DETECTED ERROR JMP GETCODE /ELSE USE EXPLICIT ERROR CODE RAR /MOVE CRC ERROR BIT TO LINK SZL /SKIP IF NOT CRC ERROR JMP CRCERR /JUMP IF CRCERR RAR /MOVE PARITY ERROR BIT TO LINK SZL CLA /SKIP IF DENSITY ERROR IAC /ELSE SET PARITY ERROR VALUE DENSERR,CLL RTL /MULTIPLY ERROR VALUE BY BLBLEN TAD ERLOC8 /ADD ON ERROR BLURB BASE ADDRESS JMS I MOVBLB /MOVE PASSED BLURB INTO MESSAGE -BLBLEN /BLURB LENGTH IN WORDS JMS I FILBLB /FILL IN I/O PARTICULARS JMS I DSPBLB /DISPLAY BLURB AND POSSIBLY COME BACK CIF CDF 00 /GOING TO FIELD ZERO JMP I (SERFLD) /CONTINUE THERE WRILOCK,NL0001 /INDICATE WRITE-LOCK ERROR NOTREDY,STL IAC /2 IF WRITE-LOCK ERROR, 1 IF READY ERROR CODERR, RAL /5 IF WRITE-LOCK ERROR, 3 IF READY ERROR, /4 IF CODE ERROR SKP /DON'T USE CRC VALUE CRCERR, NL0002 /INDICATE CRC ERROR JMP DENSERR /CONTINUE THERE HRDERR, NL0001 /+1 SKP /DON'T USE -1 XCDERR, NL7777 /-1 TIMERR, TAD (7) /6 IF EXCEEDED ERROR, 7 IF TIME-OUT ERROR, /10 IF HARDWARE ERROR JMP DENSERR /CONTINUE THERE GETCODE,TAD ERLOC8 /GET DENSITY BLURB ADDRESS TAD (TYPCODE+2-DENS)/POINT TO LOCATION IN CODE ERROR BLURB DCA ETEMP /STASH THE POINTER TAD ECODE /GET ERROR CODE VALUE RTR;RTR;RTR /MOVE THE FIRST DIGIT DOWN AND (7) /ISOLATE DIGIT TAD (4060) /ADD ON ASCII , "0" BITS DCA I ETEMP /STORE IN BLURB ISZ ETEMP /BUMP TO NEXT PAIR TAD ECODE /GET CODE VALUE AGAIN AND (70) /ISOLATE SECOND DIGIT CLL RTL;RAL /MOVE THE DIGIT UP DCA ERSTATUS /STASH IT TAD ECODE /GET VALUE AGAIN AND (7) /ISOLATE THIRD DIGIT TAD ERSTATUS /ADD ON SHIFTED SECOND DIGIT TAD ("0^100+"0-200) /MAKE THEM ASCII DCA I ETEMP /STORE IN BLURB NL0002 /INDICATE CODE ERROR JMP CODERR /CONTINUE THERE ECODE, .-. /EXPLICIT ERROR CODE STORED HERE ETEMP, .-. /TEMPORARY PAGE / P?S/8 RX01, ETC. SINGLE-DENSITY SYSTEM HANDLER. FIELD 0 /WHERE THIS LOADS *GENAD1 /WHERE SYSGEN WANTS IT RELOC SBOOT /WHERE IT EXECUTES LATER SBOOT, /SYSTEM WARM BOOTSTRAP ADDRESS SBTCIF, CIF EXHGFLD+.-. /WILL BE CIF HIGHEST FIELD JMP SBOOT2 /CONTINUE THERE SBTFUN, .-. /BOOTSTRAP UNIT; WILL BE FILLED IN SUNIT, .-. /UNIT COMPOSITE TEMPORARY SWAL, .-. /SWITCHES /A-/L SWMX, .-. /SWITCHES /M-/X SWY9, .-. /SWITCHES /Y-/9 SOUTFLS,.-. /OUTPUT FILE COUNT SDATE, .-. /LOW-ORDER SYSTEM DATE WORD SCRSIZE,SYSADJ^4 /SOFTWARE CORE-SIZE WORD /<^C> STATUS MAY BE PUT IN BIT[11] DNWAIT, .-. /WAIT FOR DONE FLAG ROUTINE NL7777 /INDICATE DONE CALLING DNWCIF, CIF EXHGFLD+.-. /WILL BE CIF HIGHEST FIELD JMS RXWAIT /WAIT FOR DONE FLAG JMP I DNWAIT /RETURN SECODE, .-. /RX SYSTEM ERROR CODE DURING ERROR RECOVERY SECTOR, .-. /LATEST SECTOR SFUNCT, .-. /READ/WRITE FUNCTION SSTAT, .-. /RX ERROR STATUS WORD DURING ERROR RECOVERY SYSTAT, .-. /RX SYSTEM STATUS WORD DURING ERROR RECOVERY TRACK, .-. /LATEST TRACK TRWAIT, .-. /WAIT FOR TRANSFER FLAG ROUTINE S7600, CLA!400 /CONSTANT 7600; INDICATE TRANSFER CALLING TRWCIF, CIF EXHGFLD+.-. /WILL BE CIF HIGHEST FIELD JMS RXWAIT /WAIT FOR TRANSFER FLAG JMP I TRWAIT /RETURN / SYSTEM LOADER. SLOAD, JMS SYSIO /CALL I/O ROUTINES SCORE, 0000 /TRANSFER ADDRESS SFUN, WRITE+.-. /FUNCTION WORD; BOOTSTRAP UNIT WILL BE FILLED IN SBLOCK, BINADR /BLOCK NUMBER JMP I SYSTART /GO START IT UP SYSTART,SBOOT /STARTING ADDRESS / I/O ENTRY POINT. SYSIO, .-. /I/O ENTRY POINT S7700, 7700 /CONSTANT 7700; THIS CLEARS THE AC S3, 3 /CONSTANT 0003; THIS CAN BE SKIPPED TAD I SYSIO /GET TRANSFER ADDRESS DCA SBUFF /STASH IT ISZ SYSIO /BUMP TO FUNCTION WORD TAD I SYSIO /GET FUNCTION WORD AND S70/(70) /JUST FIELD BITS TAD SCDF/(CDF) /MAKE IT CDF TRANSFER FIELD DCA SCDFBF /STORE IN-LINE TAD I SYSIO /GET FUNCTION WORD RAL /READ/WRITE BIT TO LINK AND S7600/(7600) /JUST PAGE BITS OFINAL, SZA /FULL FIELD TRANSFER? OEND, CIA /NO, INVERT SAVING LINK EITHER WAY DCA SWC /STASH WORD COUNT CML RTL /INVERT AND MOVE OVER FUNCTION DCA SFUNCT /STASH IT TAD I SYSIO /GET FUNCTION WORD AGAIN AND S3/(3) /JUST USEFUL UNIT BITS CLL RTL;IAC;RTL /FORM UNIT^20+4 DCA SUNIT /STASH IT ISZ SYSIO /BUMP TO BLOCK NUMBER TAD I SYSIO /GET BLOCK NUMBER SETCIF, CIF EXHGFLD+.-. /WILL BE CIF HIGHEST FIELD JMP SSET1 /CONTINUE THERE / GO ACCOMPLISH THE EQUIVALENT OF: / CLL RAL /*2 FOR LOGICAL SECTOR NUMBER / DCA SBLK /STASH THE SECTOR / ISZ SYSIO /BUMP TO RETURN ADDRESS / RDF /GET CALLING FIELD / TAD (CIF CDF) /FORM CIF CDF CALLING FIELD / DCA SEXIT /STORE IN-LINE / NL7775 /SETUP THE / DCA STRYCT /ERROR RETRY COUNT / TAD (FLGBARF) /GET TIME-OUT ERROR ADDRESS / JMS I (RXSYNC) /GET DONE FLAG T0 COME UP / TAD SUNIT /GET UNIT BITS / JMS I (RXSEL) /SELECT PROPER PAIR OF DRIVES / DCA I (SECSW) /INITIALIZE SECTOR CALCULATION / JMS SECALC /CALCULATE INITIAL SECTOR / TAD SFUNCT /GET READ/WRITE FUNCTION / SZA CLA /SKIP IF WRITING / JMP STREAD /JUMP IF READING SETSLO, TAD SFUNCT /GET FUNCTION LCD /LOAD THE COMMAND TAD S7700/(-100) /SETUP THE DCA SCTCNT /SECTOR COUNTER STRNLP, JMS TRWAIT /WAIT FOR TRANSFER FLAG SCDFBF, .-. /WILL BE CDF TRANSFER FIELD TAD I SBUFF /GET A WORD XDR /TRANSFER IT DCA I SBUFF /PUT A WORD IN CASE READING ISZ SBUFF /BUMP TO NEXT S77, 77 /CONSTANT 0077; HERE IN CASE IT SKIPS ISZ SCTCNT /DONE ALL WORDS? JMP STRNLP /NO, GO BACK JMS DNWAIT /WAIT FOR DONE FLAG TAD SWC /GET WORD COUNT TAD S77/(77) /UPDATE IT SNA /SKIP IF NOT FINISHING LAST READ JMP SDONE /JUMP IF DONE READING LAST TIME DCA SWC /STORE UPDATED COUNT STREAD, CIF EXHGFLD+.-. /WILL BE CIF HIGHEST FIELD JMP SSET2 /CONTINUE THERE / GO ACCOMPLISH THE EQUIVALENT OF: / JMS I (SHEAD) /CHECK IF SECOND HEAD NEEDED / TAD (1000) /SET SECOND HEAD BIT IF SO NEEDED / TAD SFUNCT /GET READ OR WRITE FUNCTION / TAD SUNIT /GET UNIT COMPOSITE WORD SBACK2, LCD /LOAD THE COMMAND JMS TRWAIT /WAIT FOR TRANSFER FLAG TAD SECTOR /GET CALCULATED SECTOR XDR /SEND IT JMS TRWAIT /WAIT FOR TRANSFER FLAG TAD TRACK /GET CALCULATED TRACK XDR /SEND IT ISZ SBLK /BUMP SECTOR FOR NEXT TIME SECCIF, CIF EXHGFLD+.-. /WILL BE CIF HIGHEST FIELD JMS SECALC /GO CALCULATE NEXT SECTOR NOW FOR NEXT TIME JMS DNWAIT /WAIT FOR DONE FLAG ISZ SWC /DONE WITH LAST WRITE? JMP SETSLO /NO, GO FILL (EMPTY) ANOTHER SECTOR / COMES HERE WHEN DONE READING (OR WRITING). SDONE, TAD S77/(16) /GET "READ ERROR REGISTER" VALUE LCD /LOAD THE COMMAND WHICH RAISES DONE FLAG EVENTUALLY SEXIT, .-. /WILL BE CIF CDF RETURN FIELD JMP I SYSIO /RETURN TO CALLER / COMES HERE ON ERRORS. SERR, HLT /OR 7401 IF SYSTEM RETRIES INDEFINITELY NOP /FOR CONSOLE OVERLAYS, ETC. SERFLD, CIF EXHGFLD+.-. /WILL BE CIF HIGHEST FIELD JMP SRETRY /CONTINUE THERE SCDF, CDF 00 /CONSTANT 6201 IFNZRO 7747-. S70, 70 /CONSTANT 0070; MUST BE HERE FOR /I ZBLOCK 7750-. /EMPTY SPACE SBLK, .-. /LOGICAL SECTOR NUMBER SBUFF, .-. /TRANSFER ADDRESS SCTCNT, .-. /SECTOR COUNT STRYCT, .-. /ERROR RETRY COUNTER SWC, .-. /WORD COUNT ZBLOCK SPARM-. /EMPTY SPACE SPARM, .-. /EQUALS PARAMETER SFILES, ZBLOCK -. /FILES PASSED HERE / THE FOLLOWING CODE IS READ IN BY THE COLD BOOTSTRAP. NOTICE THAT THESE WORDS / OVERLAY HANDLER CODE FROM "S7600" THROUGH "OEND" (OTHER OVERLAYED WORDS / ARE UNIMPORTANT TEMPORARIES) WHICH MUST BE RESTORED ELSEWHERE! *SBOOT /RESET ORIGIN TO TOP OF PAGE RELOC 2 /WHERE THIS WILL COME IN BTOBEG= . /OVERLAY OF SYSTEM HANDLER BEGINS HERE *2 /LOADS OVER SBTCIF BT1002, -RAL+6 /CONSTANT 1002 *4 /LOADS OVER SBTFUN THROUGH SOUTFLS / COMES HERE TO FINISH THE BINARY LOADER BOOTSTRAP. BTMORE, TAD BT5377/[EXIRADR-1] /SETUP DCA BOOTXR /LOADING INDEX BTINIT, JMS BTREAD /CALL READ ROUTINE TO READ INTO 005400 JMP I BTHINIT/[HNINIT] /BRANCH TO LOADED CODE BTTRACK,HBLOCK%15+1 /LATEST TRACK; INITIALIZED TO READ TRACK SIX BT5377, EXIRADR-1 /CONSTANT 5377 *14 /LOADS OVER DNWAIT BOOTXR, OSTOP-BTOBEG-100+EXIRADR-1 /AUTO-INDEX REGISTER FOR BOOTSTRAP LOADING /PRELOADED FOR READING INTO 05400 *16 /LOADS OVER DNWCIF BTSECTO,1-2 /LATEST SECTOR; INITIALIZED TO READ SECTOR ONE *21 /LOADS OVER SECODE THROUGH OFINAL / PRIMITIVE READ ROUTINE; INITIALIZED TO RETURN TO PRELOADED CALLER. BTREAD, BTINIT /PRIMITIVE READ ROUTINE TAD SBU /GET OUR UNIT^20+RAL TAD BT1002/(-RAL+6) /MAKE IT OUR UNIT^20+6 LCD /LOAD READ COMMAND NL0002 /SET SECTOR UPDATE TAD BTSECTOR /UPDATE LATEST SECTOR JMS SLODE /LOAD IT BTOFRST,DCA BTSECTOR /STORE BACK TAD BTTRACK /GET LATEST TRACK JMS SLODE /LOAD IT SHANGG, SDN /DONE FLAG UP? JMP SLODE1 /NO, TRY TRANSFER FLAG SER /YES, ANY ERRORS? SKP /SKIP IF NOT HLT /BARF ON ERRORS SNA /ARE WE DONE READING? BTHINIT,JMP I BTREAD /YES, RETURN TO CALLER NL0002 /NO, SETUP "EMPTY SECTOR" COMMAND VALUE LCD /LOAD THE COMMAND BTCDFZP,CDF 00 /GOTO TRANSFER FIELD; BECOMES CDF HIGHEST FIELD BTLODLP,JMS SLODE /GET A WORD OURLOAD,DCA I BOOTXR /PUT A WORD JMP BTLODLP /KEEP GOING OSTOP= . /PRIMARY OVERLAY STOPS HERE / THE FOLLOWING THREE WORDS ARE AVAILABLE TO THE BINARY LOADER BOOTSTRAP, / SINCE WE MAINTAIN A SEQUENTIAL LIST OF ALL WORDS OVERLAYED BY THE COLD / BOOTSTRAP LOADER. / COMES HERE FROM THE BINARY LOADER BOOTSTRAP. / AC CONTAINS BOOTSTRAP UNIT^20+RAL; LINK CONTAINS <^C> BIT. BTNEXT, DCA SBU /STORE BOOTSTRAP UNIT^20+RAL RAL /GET <^C> BIT DCA SCRSIZE&177+2 /SAVE FOR LATER / THE FOLLOWING ROUTINE IS ORDINARILY ASSUMED TO EXIST WHEN THE COLD BOOTSTRAP / COMES IN, BUT MUST BE PROVIDED FOR THE BINARY LOADER BOOTSTRAP WHICH READS / IN THIS CODE EXTERNALLY (WITHOUT OVERLAY) AND THEN TRANSFERS CONTROL TO IT. SLODE, JMP BTMORE/.-. /WORD LOAD ROUTINE; INITIALIZED FOR BINARY BOOT SLODE1, STR /TRANSFER FLAG UP? JMP SHANGG /NO, GO CHECK DONE FLAG XDR /YES, TRANSFER A WORD JMP I SLODE /RETURN BTOEND= . /END OF BOOTSTRAP CODE TO BE ACCOUNTED FOR BTOLEN= BTOEND-BTOBEG /OVERALL BOOTSTRAP LENGTH SYSOLEN=BTOEND-BTOFRST /OVERLAYED CODE LENGTH IFNZRO BTOLEN+SBOOT-OEND IFNZRO SYSOLEN+S7600-OEND IFNZRO S7600&177-BTOFRST+2 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 SBSEL, -4+1/.-. /SELECTION ROUTINE; PRELOADED FOR BOOT LOADING TAD SBU /ADD ON BOOTSTRAP UNIT TO PASSED VALUE AND SB40/(40) /JUST PAIR SELECT CLL RTR;RTR;STL RAR /MOVE OVER AND SET PC278 BIT SEL /SELECT THE PAIR SEL /SELECT IT AGAIN TO BE SURE SB7770, 7770 /CONSTANT 7770; THIS CLEARS THE AC SB40, 40 /CONSTANT 0040; THIS CAN BE SKIPPED SDN /SKIP ON, CLEARING THE DONE FLAG SB10, 10 /CONSTANT 0010; THIS CAN BE SKIPPED SER /SKIP ON, CLEARING THE ERROR FLAG SB60, 60 /CONSTANT 0060; THIS CAN BE SKIPPED JMP I SBSEL /RETURN / COMES HERE IF ONLY 4K MEMORY. SBARF1, HLT /DISPLAY BOOTSTRAP (MEMORY) ERROR JMP SBARF1 /JUST IN CASE / COMES HERE AFTER WE ARE READ IN BY THE COLD BOOTSTRAP CODE. HNPOINT=JMP I BTREAD /INSTRUCTION USED TO GET HERE IFNZRO HNPOINT-. HNINIT, JMS BTREAD /READ IN ANOTHER HALF-PAGE ISZ SBSEL /OUR TWO PAGES IN YET? JMP HNINIT /NO, KEEP GOING / 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 SBSEL /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 SBCDF0, 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 SBSEL /GET PREVIOUS CONTENTS DCA I (7000) /RESTORE IT TAD SCDFNXT /GET CURRENT CDF INSTRUCTION TAD SB10/(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 SBTOK /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 SBARF1 /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 SBTOK, TAD SCDFNXT /GET TOO-HIGH CDF INSTRUCTION TAD SB7770/(-10) /BACKUP TO HIGHEST FIELD AVAILABLE DCA BTCDFZP /STORE IN READ ROUTINE JMS BTREAD /READ IN AN ODD SECTOR HALF-PAGE ISZ ODDCNT /DONE ALL ODD SECTORS? JMP .-2 /NO, KEEP GOING DCA BTSECTOR /SETUP FOR SECTOR TWO JMS BTREAD /READ IN AN EVEN SECTOR HALF-PAGE ISZ EVENCNT /DONE ALL EVEN SECTORS? JMP .-2 /NO, KEEP GOING TAD BTCDFZP /GET CDF HIGHEST FIELD AVAILABLE DCA SINLN2 /STORE IN-LINE TAD SBCDF0/(CDF EXIRFLD)/GET CDF 00 INSTRUCTION DCA BTCDFZP /STORE IN READ ROUTINE TAD (SBOOT-1) /POINT AT DCA BOOTXR /NORMAL ADDRESS NL7777 /SETUP FOR DCA BTSECTOR /SECTOR ONE NL0001 /SETUP FOR DCA BTTRACK /TRACK ONE JMS BTREAD /READ SECTOR ONE, TRACK ONE INTO 07600 JMS BTREAD /READ SECTOR THREE, TRACK ONE INTO 07600 TAD SINLN2 /GET CDF HIGHEST FIELD AVAILABLE DCA BTCDFZP /STORE IN READ ROUTINE FOR OTHERS NL0001 /SETUP <^C> BIT MASK AND SCRSIZE&177+2 /GET THE <^C> BIT TAD I (SCRSIZE) /OR IN OTHER BITS DCA I (SCRSIZE) /STORE COMPOSITE IN HANDLER SINLN2, .-. /WILL BE CDF HIGHEST FIELD AVAILABLE TAD SBU /GET BOOTSTRAP UNIT AGAIN AND SB60/(60) /JUST UNIT BITS CLL RTR;RTR /MOVE DOWN TO AC[10-11] TAD I (SBUFUN)/(17^100) /ADD ON BOOTSTRAP READ FUNCTION DCA I (SBUFUN) /STORE BACK COMPOSITE TAD I (SBUFUN) /GET IT BACK AGAIN TAD (0-17^100+WRITE) /TURN INTO WRITE FUNCTION DCA I (SFUN) /STORE DEFAULT LOADER FUNCTION WORD IN LIST NL0001 /TAD (CIF-CDF) /GET CIF-CDF TAD BTCDFZP /NOW HAVE CIF HIGHEST FIELD AVAILABLE DCA I (SHCIF) /STORE FOR FIXUP ROUTINE TAD I (SHCIF) /GET IT BACK DCA I (TRWCIF) /STORE OVER CIF IN RECOVERY LIST TAD BTCDFZP /GET CDF HIGHEST FIELD AVAILABLE DCA I (SHCDF1) /STORE IN BOOTSTRAP RELOADING CODE TAD BTCDFZP /GET CDF HIGHEST FIELD AVAILABLE DCA I (SHCDF2) /STORE IN RECOVERY ROUTINE JMP I (SBTEST) /CONTINUE THERE EVENCNT,-7 /COUNT OF EVEN SECTORS IN EXTENDED HANDLER ODDCNT, -11 /COUNT OF ODD SECTORS IN EXTENDED HANDLER SBCMPTR,SCBLURB /COMPLAINT MESSAGE POINTER SFLDCNT,-7 /COUNT OF MEMORY FIELDS TO TEST PAGE / TEST DRIVE CONFIGURATION. SBTEST, SDN /SKIP ON, CLEARING THE DONE FLAG SB16, 16 /CONSTANT 0016; THIS CAN BE SKIPPED TAD SB16/(16) /GET "READ ERROR REGISTER" VALUE LCD /LOAD THE COMMAND JMS SBTMSETUP /SETUP THE TIME-OUT STR /TRANSFER FLAG UP? SBTCNT, SKP CLA /SKIP IF NOT XDR /TRANSFER A WORD IF TRANSFER FLAG IS UP SDN /DONE FLAG UP? JMP SBSTIMOUT /NO, CHECK IF WAITING TOO LONG SB7200, NL0000 /INDICATE BOOTSTRAP PAIR JMS I (SBSEL) /SELECT BOOTSTRAP PAIR TAD SBU /GET BOOTSTRAP UNIT AND (60) /JUST UNIT BITS TAD SB412/(412) /ADD ON DOUBLE-DENSITY "READ STATUS" VALUE LCD /LOAD THE COMMAND JMS SBTMSETUP /SETUP THE TIME-OUT SDN /DONE YET? JMP SBSTIMOUT /NO, CHECK IF WAITING TOO LONG XDR /YES, GET THE STATUS AND (60) /JUST DENSITY, DENSITY ERROR BITS SZA CLA /SKIP IF RX01 JMP SBHEDOK /JUMP IF POSSIBLE RX03 TAD SB7200/(CLA) /GET ELIMINATION INSTRUCTION DCA I (SRX01ZAP) /PREVENT HEAD CHECK ON RX01 SBHEDOK,TAD SB40A/(40) /SET INVERSION BIT JMS I (SBSEL) /SELECT OTHER PAIR FROM BOOTSTRAPPED ONE TAD SB16/(16) /GET "READ ERROR REGISTER" VALUE LCD /LOAD THE COMMAND SBRXTST,SDN /DONE FLAG UP? JMP SBTMOUT /NO, TIME IT OUT SBNORM, /NL0000 /SETUP FOR BOOTSTRAPPED PAIR JMS I (SBSEL) /SELECT NORMAL PAIR TAD BTCDFZP /GET CDF HIGHEST FIELD AVAILABLE DCA I (TMECDF) /STORE IN ERROR TIME-OUT ADDRESS SETUP ROUTINE TAD BTCDFZP /GET IT AGAIN DCA I (BNSCDF) /STORE IN SLURP LOADER SETUP ROUTINE TAD BTCDFZP /GET IT AGAIN DCA I (SETCDF) /STORE IN SYSIO SETUP ROUTINE NL0002 /TAD (CIF CDF-CDF) /GET (CIF CDF)-CDF TAD BTCDFZP /FORM CIF CDF HIGHEST FIELD AVAILABLE DCA SINLN3 /STORE IN-LINE SINLN3, .-. /WILL BE CIF CDF HIGHEST FIELD AVAILABLE JMP I (SBOOT3) /CONTINUE THERE / COMES HERE WHILE WAITING FOR THE ALTERNATE PAIR OF DISKS TO SELECT. SBTMOUT,ISZ SBTEST /WAITED TOO LONG? JMP SBRXTST /NO, KEEP GOING / NL0000 /SETUP FOR BOOTSTRAPPED PAIR JMS I (SBSEL) /SELECT NORMAL PAIR INIT /RESET THE HARDWARE TAD SBU /GET BOOTSTRAPPED UNIT AND SB40A/(NL7777-NL0000) /JUST PAIR BIT TAD SB7200/(CLA) /NOW HAVE "NL0000" OR "NL7777" DCA I (SUNZAP) /PREVENT UNIT SELECT ON NON-BOOTSTRAPPED PAIR JMS SBTMSETUP /SETUP THE TIME-OUT SDN /DONE FLAG UP YET? JMP SBSTIMOUT /NO, CHECK IF WAITING TOO LONG JMP SBNORM /YES, CONTINUE THERE SBTMSET,.-. /TIME-OUT SETUP ROUTINE TAD SBTCNT/(-170) /SETUP THE DCA SBTOCNT /TIME-OUT COUNTER / COMES HERE IF FLAG(S) ARE NOT UP YET. SBSTIMO,ISZ SBTEST /WAITED ENOUGH? JMP I SBTMSETUP /NO, KEEP GOING ISZ SBTOCNT /WAITED TOO MUCH? JMP I SBTMSETUP /NO, KEEP GOING TAD SBTMSETUP /GET TIME-OUT CALLER SBARF2, HLT /DISPLAY PROBLEM CALLER JMP SBARF2 /JUST IN CASE / ONLY 4K MEMORY COMPLAINT BLURB. SCBLURB,"G&37 / "M&37 / SB412, "J&37!400 / "R&177 /R "X&177 /X SB40A, " &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 / "M&37 / "J&37 / SBTOCNT,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 6600-. /EMPTY SPACE / SLURP LOADER INITIALIZE ROUTINE. BSINIT, .-. /SLURP LOADER INITIALIZE ROUTINE TAD I (SBTFUN) /GET BOOTSTRAP FUNCTION AND (3) /JUST VALID UNIT BITS DCA I (BTUNIT+SBOFF) /STORE IN SLURP LOADER UNIT TAD I (BTUNIT+SBOFF) /GET IT BACK CLL RTL;RTL /NOW HAVE UNIT^20 TAD (RAL) /MAKE IT UNIT^20+RAL DCA I (BUN4+SBOFF) /STORE IN SLURP BOOTSTRAP UNIT WORD TAD I (SBTCIF) /GET CIF HIGHEST FIELD AVAILABLE DCA I (BHCIF+SBOFF) /STORE IN SLURP LOADER BOOTSTRAP TAD I (SBTCIF) /GET IT AGAIN DCA I (BNCIF1+SBOFF) /STORE IN SLURP LOADER TAD I (SBTCIF) /GET IT AGAIN DCA I (BNCIF2+SBOFF) /STORE IN SLURP LOADER TAD I (SBTCIF) /GET IT AGAIN DCA I (BIDONE+SBOFF) /STORE IN /I ROUTINE TAD I (SBTCIF) /GET IT AGAIN DCA I (BENDSLUR+SBOFF)/STORE IN SLURP ENDUP ROUTINE CIF 00 /GOING TO FIELD ZERO JMP I BSINIT /RETURN / /I ENDUP ROUTINE. ENDSLI, .-. /I ENDUP ROUTINE JMS BSLPEND /GET THE DONE FLAG UP JMS I (SFIXUP) /FIXUP FIELD ZERO OF HANDLER JMP I ENDSLI /RETURN / SLURP LOADER ENDUP ROUTINE. BSLPEND,.-. /SLURP LOADER ENDUP ROUTINE TAD (BNENDERROR) /GET TIME-OUT ERROR ADDRESS JMS I (RXSYNC) /GET DONE FLAG UP TAD (16) /GET "READ ERROR REGISTER" VALUE LCD /LOAD THE COMMAND JMP I BSLPEND /RETURN / COMES HERE IF DONE FLAG WON'T RAISE. BNENDER,NL7777 /INDICATE PROBLEM HLT /BARF JMP .-1 /JUST IN CASE PAGE / BINARY BOOTSTRAP SELECT AND LOAD ROUTINE. BSLOAD, .-. /SELECT PAIR AND LOAD ROUTINE DCA BNSETUP /SAVE PASSED UNITS^20+RAL SDN /SKIP ON, CLEARING THE DONE FLAG BS16, 16 /CONSTANT 0016; THIS CAN BE SKIPPED TAD BS16/(16) /GET "READ ERROR REGISTER" VALUE LCD /LOAD THE COMMAND BTAGAIN,JMS I (TMESETUP) /SETUP TIME-OUT ROUTINE AND ERROR RETURN BTRESET /ERROR RETURN ADDRESS SDN /DONE FLAG UP? JMP I (RXSTIMOUT) /NO, CHECK IF WAITING TOO LONG TAD BNSETUP /GET UNIT BITS, ETC. JMS I (RXSEL) /SELECT PROPER PAIR TAD BNSETUP /GET UNITS^20+RAL TAD (-RAL+6) /TURN INTO READ VALUE LCD /LOAD THE COMMAND JMS I (TMSETUP) /SETUP TIME-OUT ROUTINE NL0001 /SETUP FOR SECTOR ONE STR /TRANSFER FLAG UP? JMP I (RXSTIMOUT) /NO, CHECK IF WAITING TOO LONG XDR /SEND FOR SECTOR ONE JMS I (TMSETUP) /SETUP TIME-OUT ROUTINE NL0001 /SETUP FOR TRACK ONE STR /TRANSFER FLAG UP? JMP I (RXSTIMOUT) /NO, CHECK IF WAITING TOO LONG XDR /SEND FOR TRACK ONE NL0002 /SETUP EMPTYING VALUE JMP I BSLOAD /RETURN / COMES HERE IF WAITING TOO LONG. BTRESET,INIT /CLEAR OUT ERRORS JMP BTAGAIN /TRY AGAIN / SLURP LOADER READ ROUTINE. BNREAD, .-. /SLURP LOADER READ ROUTINE SDN /DONE FLAG UP? JMP BDNERROR /JUMP IF NOT JMS BNLOAD /READ IN LATEST SECTOR JMP I BNREAD /RETURN BDNERRO,NL5777 /INDICATE PROBLEM HLT /BARF JMP BDNERROR /JUST IN CASE / SLURP LOADER SETUP ROUTINE. BNSETUP,.-. /SLURP LOADER SETUP ROUTINE DCA BSLOAD /SAVE PASSED UNIT TAD (BNSETERROR) /GET TIME-OUT ERROR ADDRESS JMS I (RXSYNC) /GET DONE FLAG UP TAD BSLOAD /GET THE UNIT RTL;RTL /NOW HAVE UNIT^20 JMS I (RXSEL) /SELECT PROPER PAIR TAD BS16/(16) /GET "READ ERROR REGISTER" VALUE LCD /LOAD THE COMMAND BNSCDF, CDF EXHGFLD+.-. /WILL BE CDF HIGHEST FIELD AVAILABLE DCA I (SECSW) /INITIALIZE SECTOR CALCULATION ROUTINE CDF 00 /BACK TO FIELD ZERO JMS I (SECTCALCULATE) /CALCULATE SECTOR AND TRACK JMP I BNSETUP /RETURN / COMES HERE IF DONE FLAG WON'T RAISE. BNSETER,NL7775 /INDICATE PROBLEM HLT /BARF JMP .-1 /JUST IN CASE / /I SECTOR THREE, TRACK ONE READ ROUTINE. BISCT3, .-. /SECTOR THREE READ ROUTINE / WE MUST RESTORE THE TRACK AND SECTOR, SINCE THEY WERE JUST OVERLAYED BY / THE FIRST HALF-PAGE OF THE I/O ROUTINES. TAD (3) /GET A THREE DCA I (SECTOR) /RESET SECTOR NL0001 /GET A ONE DCA I (TRACK) /RESET TRACK TAD I (BTUNIT) /GET BOOTSTRAP UNIT JMS BNLOAD /READ IN SECTOR THREE, TRACK ONE CIF 00 /GOING TO FIELD ZERO JMP I BISCT3 /RETURN / SLURP LOADER SECTOR READ ROUTINE. BNLOAD, .-. /SLURP LOADER READ A SECTOR ROUTINE RTL;RTL /MOVE UP PASSED UNIT AND (60) /JUST UNIT BITS DCA BSLOAD /SAVE FOR NOW JMS I (SHEAD) /CHECK FOR SECOND HEAD USAGE TAD (1000) /SET SECOND HEAD BIT TAD BSLOAD /ADD ON UNIT BITS TAD (6) /ADD ON "READ SECTOR" VALUE LCD /LOAD THE COMMAND JMS I (TMESETUP) /SETUP TIME-OUT AND ERROR RETURN BNLDERROR /ERROR RETURN ADDRESS STR /TRANSFER FLAG UP? JMP I (RXSTIMOUT) /NO, CHECK IF WAITING TOO LONG TAD I (SECTOR) /GET CURRENT SECTOR XDR /SEND IT JMS I (TMSETUP) /SETUP TIME-OUT STR /TRANSFER FLAG UP? JMP I (RXSTIMOUT) /NO, CHECK IF WAITING TOO LONG TAD I (TRACK) /GET CURRENT TRACK XDR /SEND IT ISZ I (SBLK) /BUMP SECTOR FOR NEXT TIME JMS I (SECTCALCULATE) /CALCULATE NEXT SECTOR WHILE WAITING JMS I (TMESETUP) /SETUP TIME-OUT AND ERROR RETURN BNRDERROR /ERROR RETURN ADDRESS SDN /DONE FLAG UP? JMP TRYTRANS /NO, TRY TRANSFER FLAG SER /ERROR FLAG UP? SKP /SKIP IF NOT JMP BNRDERROR /JUMP IF SO NL0002 /GET EMPTYING VALUE LCD /LOAD THE COMMAND JMP I BNLOAD /RETURN / COMES HERE WHILE WAITING FOR DONE FLAG TO COME UP. TRYTRAN,STR /TRANSFER FLAG UP? JMP I (RXSTIMOUT) /NO, CHECK IF WAITING TOO LONG / COMES HERE IF TRANSFER OR ERROR FLAGS CAME UP, OR IT TIMED OUT. BNRDERR,NL4000 /INDICATE PROBLEM HLT /BARF JMP .-1 /JUST IN CASE / COMES HERE IF TRANSFER FLAG WON'T RAISE. BNLDERR,NL7776 /INDICATE PROBLEM HLT /BARF JMP .-1 /JUST IN CASE PAGE / FLAG WAIT ROUTINE. WAITRX, .-. /FLAG WAIT ROUTINE CDF 00 /ENSURE FIELD ZERO DCA WAITSW /SAVE PASSED VALUE SDN /DONE FLAG UP NOW? SKP /SKIP IF NOT JMP TRYERR /YES, GO TEST FOR ERRORS STR /TRANSFER FLAG UP NOW? SKP /SKIP IF NOT JMP TRTEST /YES, GO TEST IF EXPECTED JMS TMESETUP /SETUP TIME-OUT AND ERROR RETURN FLGBARF /ERROR RETURN ADDRESS STR /TRANSFER FLAG UP? JMP TRYDONE /NO, TRY DONE FLAG TRTEST, ISZ WAITSW /YES, WAS THAT EXPECTED? JMP I WAITRX /YES, RETURN / COMES HERE IF THE FLAG(S) TIME OUT, OR THE WRONG ONE(S) COME UP. FLGBARF,NL7777 /INDICATE BARFED STATUS DCA I (SSTAT) /STORE IN STATUS WORD NL7777 /INDICATE BARFED ERROR DCA I (SECODE) /STORE IN ERROR CODE JMP RXBARF /ATTEMPT TO CLEAR THE PROBLEM THERE / COMES HERE IF THE TRANSFER FLAG IS NOT UP. TRYDONE,SDN /DONE FLAG UP? JMP RXSTIMOUT /NO, CHECK IF WAITING TOO LONG TRYERR, SER /YES, ANY ERRORS? JMP TESTFLG /NO, CHECK IF THAT WAS EXPECTED XDR /YES, GET CURRENT ERROR STATUS AND (377) /JUST VALID BITS DCA I (SSTAT) /STORE ERROR STATUS FOR OTHERS TAD (16) /GET "READ ERROR REGISTER" VALUE LCD /LOAD THE COMMAND JMS TMSETUP /SETUP THE TIME-OUT ROUTINE SDN /DONE FLAG UP? JMP RXSTIMOUT /NO, CHECK IF WAITING TOO LONG XDR /YES, GET ERROR CODE AND (377) /JUST VALID BITS DCA I (SECODE) /SAVE FOR OTHERS TAD I (SUNIT) /GET UNIT BITS+4 TAD S406/(412-4) /TURN INTO "READ STATUS" VALUE LCD /LOAD THE COMMAND JMS TMSETUP /SETUP TIME-OUT ROUTINE SDN /FLAG UP? JMP RXSTIMOUT /NO, CHECK IF WAITING TOO LONG XDR /YES, GET THE STATUS AND (377) /JUST VALID BITS DCA I (SYSTATUS) /SAVE CURRENT STATUS FOR OTHERS TAD I (SYSTATUS) /GET IT BACK AND (200) /JUST READY BIT SNA CLA /SKIP IF DRIVE READY JMP RXERR /JUMP IF NOT TAD I (SECODE) /GET ERROR CODE TAD (-100) /COMPARE TO WRITE-LOCK VALUE SNA CLA /SKIP IF OTHER ERROR JMP RXERR /JUMP IF WRITE-LOCK ERROR TAD I (SYSTATUS) /GET SYSTEM STATUS AND (60) /JUST DENSITY, DENSITY ERROR BITS SZA CLA /SKIP IF RX01 TAD (21-3) /ELSE SET DENSITY, CRC ERROR BITS TAD (3) /USE PARITY, CRC BITS IF RX01 AND I (SSTAT) /ISOLATE PROPER ERROR BITS SNA CLA /SKIP IF NORMAL ERROR RXBARF, INIT /ELSE CLEAR THE WORLD OF ERRORS / COMES HERE AFTER HANDLING THE ERROR TO DECIDE WHAT TO DO NEXT. RXERR, ISZ I (STRYCT) /TOO MANY ERRORS? JMP I (SRETR2) /NO, TRY AGAIN TAD I (SSTAT) /YES, GET THE ERROR STATUS CIF 00 /GOING TO FIELD ZERO JMP I (SERR) /GO COMPLAIN THERE / COMES HERE IF DONE FLAG CAME UP. TESTFLG,ISZ WAITSW /SHOULD DONE FLAG HAVE COME UP? JMP FLGBARF /JUMP IF NOT JMP I WAITRX /RETURN IF SO / TIME-OUT AND ERROR RETURN SETUP ROUTINE. TMESETU,.-. /TIME-OUT AND ERROR ROUTINE TMECDF, CDF EXHGFLD+.-. /WILL BE CDF HIGHEST FIELD AVAILABLE NL0001 /SET INCREMENT PAST ERROR RETURN TAD TMESETUP /ADD TO OUR CALLER DCA TMSETUP /MAKE IT THEIR CALLER TAD I TMESETUP /GET ERROR RETURN ADDRESS DCA TMESETUP /SETUP IN CASE ERROR CDF 00 /RESET TO FIELD ZERO SKP /DON'T EXECUTE HEADER! / TIME-OUT ONLY SETUP ROUTINE. TMSETUP,.-. /TIME-OUT SETUP ROUTINE CLA /CLEAN UP TAD RXTCNT/(-170) /SETUP THE DCA TMCNT1 /TIME-OUT COUNTER / COMES HERE IF THE FLAG(S) ARE NOT UP YET. RXSTIMO,ISZ TMCNT2 /WAITED ENOUGH? JMP I TMSETUP /NO, KEEP TRYING ISZ TMCNT1 /WAITED TOO MUCH? JMP I TMSETUP /NO, KEEP TRYING JMP I TMESETUP /YES, RETURN TO ORIGINAL ERROR ADDRESS / REWIND PAIR SELECT ROUTINE. REWSELE,.-. /REWIND PAIR SELECT ROUTINE JMS I (RXSEL) /CALL OUR SELECT ROUTINE CIF 00 /GOING TO FIELD ZERO JMP I REWSELECT /RETURN RXSYNC, .-. /DISK DONE FLAG SYNC ROUTINE DCA RXSERRADRRESS /STORE PASSED TIME-OUT ERROR ADDRESS IN-LINE SDN /SKIP ON, CLEARING THE DONE FLAG NOW (IF POSSIBLE) S406, 406 /CONSTANT 0406; THIS CAN BE SKIPPED TAD (16) /GET "READ ERROR REGISTER" VALUE LCD /LOAD THE COMMAND JMS TMESETUP /SETUP TIME-OUT AND ERROR ADDRESS RXSERRA,.-. /WILL BE TIME-OUT ERROR ADDRESS STR /TRANSFER FLAG UP? RXTCNT, SKP CLA /SKIP IF NOT XDR /TRANSFER A WORD IF TRANSFER FLAG IS UP SDN /DONE FLAG UP? JMP RXSTIMOUT /NO, CHECK IF WAITING TOO LONG CLA /CLEAN UP JMP I RXSYNC /RETURN TMCNT1, .-. /TIME-OUT TMCNT2, .-. /TEMPORARIES WAITSW, .-. /FLAG WAIT SWITCH PAGE SECTCAL,.-. /SECTOR CALCULATION ROUTINE / SECONDARY SECTOR CALCULATION ROUTINE; USED AFTER INITIAL TRACK AND SECTOR / ARE CREATED BY PRIMARY CALCULATION ROUTINE. ISZ SFIXUP /ARE WE CALCULATING LAST SECTOR ON FIRST SIDE? SECSW, SKP CLA /CLEAN UP AND SKIP IF NOT; **** FIRST CALL **** 0000 JMP S7770 /JUMP IF SWITCHING DISKETTE SIDES OR FIRST CALL ISZ I (SECTOR) /BUMP TO THE ISZ I (SECTOR) /NEXT SECTOR TAD I (SECTOR) /GET THE SECTOR NOW TAD (-33) /COMPARE TO LIMIT SPA /SKIP IF TOO FAR JMP SCLRIT /JUMP IF NOT SZA /SKIP IF GOING TO EVEN SECTORS ON SAME TRACK SETSECT,ISZ I (TRACK) /ELSE BUMP TRACK SINCE AC CONTAINS (SECTOR) ONE SNA /SKIP IF GOING TO SECTOR ONE NEXT NL0002 /ELSE WE'RE GOING TO SECTOR TWO DCA I (SECTOR) /STORE NEW SECTOR SCLRIT, CLA /CLEAN UP JMP I SECTCALCULATE /RETURN / COMES HERE TO INITIALLY CALCULATE ABSOLUTE SECTOR AND TRACK, OR AT END OF / DISKETTE FIRST SIDE DURING SECONDARY CALCULATION. S7770, SPA SNA SZL CLA /CONSTANT 7770; THIS CLEARS THE AC S100, 100 /CONSTANT 0100; THIS CAN BE SKIPPED TAD (SKP CLA) /SETUP THE SECONDARY DCA SECSW /ROUTINE FOR LATER CALLS TAD I (SECTOR) /GET SECTOR NUMBER TAD (-114^32) /TURN INTO COUNTER LIMITING SECONDARY ROUTINE USAGE DCA SFIXUP /STASH THE COUNTER TAD S7770/(-10) /SETUP THE DCA RXSEL /SHIFT COUNT JMS SHEAD /CHECK FOR SECOND HEAD USAGE TAD (-114^32) /REDUCE SECTOR NUMBER IF ON SECOND HEAD TAD I (SBLK) /GET LOGICAL SECTOR NUMBER EITHER WAY / OBSOLETE DIVIDE ROUTINE; SMALLER, BUT SLOWER THAN CURRENT ROUTINE. / DCA SECTOR /SAVE AS DIVIDEND / TAD (-15^400^2) /-13*256*2 / DCA SDIVSOR /SETUP INITIAL DIVISOR VALUE / STL /NOTE: SHIFTING DIVISOR RIGHT FIRST TIME SHIFTS IN A /ZERO! EVERY SUBSEQUENT TIME A ONE IS SHIFTED IN! / TAD (10) /SET BIT[8] AS A STOP BIT /SDIVLP,DCA TRACK /STORE QUOTIENT / TAD SDIVSOR /GET DIVISOR / CML RAR /DIVIDE BY 2 (BE CAREFUL OF LINK) / DCA SDIVSOR /STORE BACK / TAD SDIVSOR /GET DIVISOR AGAIN / TAD SECTOR /COMPARE TO DIVIDEND / SZL /CARRY? / DCA SECTOR /NO, SAVE AS NEW DIVIDEND / CLA /CLEAN UP / TAD TRACK /GET QUOTIENT / RAL /SHIFT IT / SNL /STOP? / JMP SDIVLP /NO, KEEP GOING / OBSOLETE DIVIDE ROUTINE; LONGER THAN PREVIOUS, BUT FASTER. /SDIVLP,CLL RAL /MOVE UP / DCA TRACK /SAVE NEW QUOTIENT, REMAINDER / TAD TRACK /GET IT BACK / TAD (-15^400) /COMPARE TO -13*256 / SZL /SKIP IF TOO LARGE / DCA TRACK /ELSE STORE CORRECTED VALUE BACK / SZL CLA /SKIP IF TOO LARGE / ISZ TRACK /BUMP QUOTIENT IF WE HAD THIS ONE / TAD TRACK /GET UPDATED VALUE / ISZ SDIVSOR /SHIFTED ENOUGH? / JMP SDIVLP /NO, KEEP GOING / DIVIDE ROUTINE; LONGER THAN ORIGINAL, BUT MUCH FASTER. SDIVLP, CLL RAL /MOVE UP TAD (-15^400) /COMPARE TO -13*256 SNL /SKIP IF NOT TOO LARGE TAD (15^400-1) /RESTORE IF TOO LARGE IAC /ADD ONE TO QUOTIENT OR JUST FINISH RESTORING SCNTIT, ISZ RXSEL /SHIFTED ENOUGH? JMP SDIVLP /NO, KEEP GOING / OBSOLETE ADJUSTMENT ROUTINE; NEEDED TO INTERFACE FASTER DIVIDE ROUTINE TO / ORIGINAL TWO-WAY INTERLEAVE ROUTINE. / RTL;RTL;RAL /MOVE DOWN / AND (17) /JUST REMAINDER / DCA SECTOR /SAVE IT / TAD TRACK /GET QUOTIENT / AND (377) /REMOVE REMAINDER BITS / OBSOLETE TWO-WAY INTERLEAVE ROUTINE; INTERFACES WELL WITH ANCIENT REPETITIVE / SUBTRACTING METHOD AND SMALLEST DIVIDE ROUTINE ABOVE. / CLL RAR /GET LOW-ORDER QUOTIENT BIT TO LINK / DCA TRACK /SAVE QUOTIENT / TAD SECTOR /GET REMAINDER / SZL /ODD? / IAC /YES, FIX IT FOR / CML RAL /TWO-WAY INTERLEAVE / TWO-WAY INTERLEAVE ROUTINE; INTERFACES DIRECTLY WITH NEWER DIVIDE ROUTINES. / EXPECTS QUOTIENT IN AC[5-11] AND REMAINDER IN AC[1-4] CLL RAR /GET LOW-ORDER QUOTIENT BIT TO LINK DCA RXSEL /STORE FOR NOW TAD RXSEL /GET IT BACK AND S177/(177) /REMOVE REMAINDER BITS DCA I (TRACK) /STORE AS LATEST TRACK TAD RXSEL /GET IT AGAIN AND (3600) /ISOLATE REMAINDER BITS SZL /SKIP IF EVEN TAD S100/(100) /ELSE ADD ONE MORE CLL RTR;RTR;RTR /MOVE DOWN TO AC[7-11] IAC /INCREMENT TO FINAL VALUE JMP SETSECTOR /CONTINUE THERE TO STORE SECTOR AND BUMP TRACK / COMES HERE TO FIXUP FIELD ZERO OF HANDLER AND THEN LOADS THE KEYBOARD MONITOR. SBOOT3, JMS SFIXUP /FIXUP FIELD ZERO STUFF SHCDF1, CDF EXHGFLD+.-. /WILL BE CDF HIGHEST FIELD AVAILABLE CIF 00 /GOING TO FIELD ZERO JMS I (SYSIO) /CALL I/O ROUTINES 0000 /TRANSFER ADDRESS SBUFUN, 17^100+.-. /FUNCTION WORD; UNIT BITS WILL BE FILLED IN 1 /BLOCK NUMBER CIF CDF 00 /GOING TO FIELD ZERO JMP I (MONSTRT) /GO START IT UP / PAIR SELECTION ROUTINE. RXSEL, .-. /PAIR SELECTION ROUTINE SUNZAP, NOP /**** ZAPPED **** NL0000 OR NL7777 AND S40/(40) /JUST PAIR BIT CLL RTR;RTR;STL RAR /MOVE DOWN AND SET PC278 BIT SEL /SELECT THE PAIR SEL /ONCE MORE TO ENSURE THAT IT TAKES SDN /SKIP ON, CLEARING THE DONE FLAG S177, 177 /CONSTANT 0177; THIS CAN BE SKIPPED SER /SKIP ON, CLEARING THE ERROR FLAG S40, 40 /CONSTANT 0040; THIS CAN BE SKIPPED CLA /CLEAN UP JMP I RXSEL /RETURN / FIELD ZERO FIXUP ROUTINE. / THIS ROUTINE RESTORES THE WORDS LOST TO THE BOOTSTRAP LOADER, AND ALSO / CORRECTS ALL "CIF" INSTRUCTIONS TO THE HIGHEST FIELD AVAILABLE. ALSO SETS / UP THE BOOTSTRAP UNIT BITS IN "SBTFUN". SFIXUP, .-. /FIELD ZERO FIXUP ROUTINE CLA /CLEAN UP TAD (S7600-OEND) /SETUP THE DCA RXSEL /FIXUP COUNT TAD (S7600) /POINT AT DCA SHEAD /MOVE LIST SHCDF2, CDF EXHGFLD+.-. /WILL BE CDF HIGHEST FIELD AVAILABLE TAD I SHEAD /GET A WORD CDF 00 /GOING TO FIELD ZERO DCA I SHEAD /PUT A WORD ISZ SHEAD /BUMP TO NEXT ELEMENT ISZ RXSEL /DONE YET? JMP SHCDF2 /NO, KEEP GOING TAD SBUFUN /GET BOOTSTRAP FUNCTION WITH CORRECTED UNIT BITS DCA I (SBTFUN) /STORE IN BOOTSTRAP FUNCTION WORD TAD (TAD SHLST) /GET SETUP INSTRUCTION DCA STADLUP /STORE IN-LINE STADLUP,TAD SHLST+.-. /GET LATEST POINTER SNA /END OF LIST? JMP I SFIXUP /YES, RETURN DCA SHEAD /NO, STASH THE POINTER TAD SHCIF /GET CIF HIGHEST FIELD AVAILABLE DCA I SHEAD /STORE WHERE IT BELONGS ISZ STADLUP /BUMP TO GET NEXT ELEMENT JMP STADLUP /KEEP GOING SHEAD, .-. /HEAD TEST ROUTINE TAD I (SBLK) /GET LOGICAL SECTOR CLL /CLEAR LINK FOR TEST TAD (-114^32) /COMPARE TO LIMIT SRX01ZA,SNL CLA /SKIP IF ON SECOND HEAD **** RX01 **** CLA ISZ SHEAD /TAKE SKIP RETURN IF FIRST HEAD (OR RX01) JMP I SHEAD /RETURN EITHER WAY / FIELD ZERO CIF FIXUP LIST. SHLST, SBTCIF /BOOTSTRAP CIF DNWCIF /DONE WAIT CIF / TRWCIF /TRANSFER WAIT CIF SETCIF /SSET1 CIF STREAD /STREAD ROUTINE CIF SECCIF /SECCIF ROUTINE CIF SERFLD /SERR CIF 0 /THIS ENDS THE LIST SHCIF, CIF EXHGFLD+.-. /WILL BE CIF (OUR) HIGHEST FIELD AVAILABLE PAGE / COMES HERE TO CONTINUE BOOTSTRAP PROCESS STARTED AT 007600. SBOOT2, JMP I (SBOOT3) /CONTINUE THERE / FIELD ZERO FLAG WAIT ROUTINE. RXWAIT, .-. /FIELD ZERO FLAG WAIT ROUTINE JMS I (WAITRX) /CALL OUR FLAG WAIT ROUTINE CIF 00 /GOING TO FIELD ZERO JMP I RXWAIT /RETURN TO FIELD ZERO CALLER / SLURP BOOTSTRAP SELECT AND LOAD ROUTINE. BUTSEL, .-. /SLURP BOOT ROUTINE JMS I (BSLOAD) /CALL OUR ROUTINE CIF 00 /GOING TO FIELD ZERO JMP I BUTSEL /RETURN TO SLURP BOOTSTRAP / FIELD ZERO SLURP LOADER FILE SETUP ROUTINE. BINSETU,.-. /SLURP LOADER FILE SETUP ROUTINE JMS I (BNSETUP) /CALL OUR ROUTINE CIF 00 /GOING TO FIELD ZERO JMP I BINSETUP /RETURN TO SLURP LOADER / FIELD ZERO SLURP LOADER SECTOR LOAD ROUTINE. BLOAD, .-. /SLURP LOADER SECTOR LOAD ROUTINE JMS I (BNREAD) /CALL OUR ROUTINE CIF 00 /GOING TO FIELD ZERO JMP I BLOAD /RETURN TO SLURP LOADER / FIELD ZERO SLURP LOADER ENDUP ROUTINE BSLEND, .-. /SLURP LOADER ENDUP ROUTINE JMS I (BSLPEND) /CALL OUR ROUTINE CIF 00 /GOING TO FIELD ZERO JMP I BSLEND /RETURN TO SLURP LOADER ZBLOCK S7600-. /EMPTY SPACE / RECOVERY LIST FOR OVERLAYED WORDS IN FIELD ZERO. S7600= . /RECOVERY LIST STARTS HERE S7600, CLA!400 /CONSTANT 7600; INDICATE TRANSFER CALLING TRWCIF, CIF EXHGFLD+.-. /WILL BE CIF HIGHEST FIELD JMS RXWAIT /WAIT FOR TRANSFER FLAG JMP I TRWAIT /RETURN TO CALLER / SYSTEM LOADER (RECOVERY COPY). SLOAD, JMS SYSIO /CALL I/O ROUTINES SCORE, 0000 /TRANSFER ADDRESS SFUN, WRITE+.-. /FUNCTION WORD; BOOTSTRAP UNIT WILL BE FILLED IN SBLOCK, BINADR /BLOCK NUMBER JMP I SYSTART /GO START IT UP SYSTART,SBOOT /STARTING ADDRESS / I/O ENTRY POINT (RECOVERY COPY). SYSIO, .-. /I/O ENTRY POINT S7700, 7700 /CONSTANT 7700; THIS CLEARS THE AC S3, 3 /CONSTANT 0003; THIS CAN BE SKIPPED TAD I SYSIO /GET TRANSFER ADDRESS DCA SBUFF /STASH IT ISZ SYSIO /BUMP TO FUNCTION WORD TAD I SYSIO /GET FUNCTION WORD AND S70/(70) /JUST FIELD BITS TAD SCDF/(CDF) /MAKE IT CDF TRANSFER FIELD DCA SCDFBF /STORE IN-LINE TAD I SYSIO /GET FUNCTION WORD RAL /READ/WRITE BIT TO LINK AND S7600/(7600) /JUST PAGE BITS OFINAL, SZA /FULL FIELD TRANSFER? OEND, OEND= . /END OF RECOVERY LIST / FIELD ZERO SECTOR CALCULATION ROUTINE. SECALC, .-. /FIELD ZERO SECTOR CALCULATION ROUTINE JMS I (SECTCALCULATE) /CALL OUR SECTOR CALCULATION ROUTINE SCIDF, CIF CDF 00 /GOING TO FIELD ZERO JMP I SECALC /RETURN TO FIELD ZERO CALLER / FIELD ZERO /I ENDUP ROUTINE. SLIEND, .-. /FIELD ZERO /I ENDUP ROUTINE JMS I (ENDSLI) /CALL OUR ROUTINE CIF 00 /GOING TO FIELD ZERO JMP I SLIEND /RETURN TO FIELD ZERO CALLER / COMES HERE TO CONTINUE I/O CALL. SSET1, CLL RAL /*2 FOR LOGICAL SECTOR NUMBER DCA SYSIO /SAVE IT IN CASE ERRORS RDF /GET CALLING FIELD TAD SCIDF/(CIF CDF) /TURN INTO CIF CDF CALLING FIELD CDF 00 /GOING TO FIELD ZERO DCA I (SEXIT) /STORE IN-LINE FOR EXIT LATER TAD I (SWC) /GET WORD COUNT DCA BINSETUP /SAVE IN CASE ERRORS TAD I (SBUFF) /GET TRANSFER ADDRESS DCA BLOAD /SAVE IN CASE ERRORS ISZ I (SYSIO) /BUMP TO FINAL RETURN ADDRESS SRETRY, NL7775 /SETUP THE DCA I (STRYCT) /RETRY COUNTER SRETR2, TAD SYSIO /GET SECTOR NUMBER DCA I (SBLK) /(RE)STORE AS LOGICAL SECTOR NUMBER TAD BINSETUP /GET WORD COUNT DCA I (SWC) /RESTORE IT TAD BLOAD /GET TRANSFER ADDRESS DCA I (SBUFF) /RESTORE IT TAD (FLGBARF) /GET TIME-OUT ERROR ADDRESS JMS I (RXSYNC) /GET DONE FLAG TO COME UP TAD I (SUNIT) /GET UNIT, ETC. BITS JMS I (RXSEL) /GO SELECT PROPER PAIR OF DRIVES SETCDF, CDF EXHGFLD+.-. /WILL BE CDF HIGHEST FIELD AVAILABLE DCA I (SECSW) /INITIALIZE SECTOR CALCULATION ROUTINE CDF 00 /BACK TO FIELD ZERO JMS I (SECTCALCULATE) /GO CALCULATE FIRST SECTOR REQUIRED TAD I (SFUNCT) /GET READ/WRITE FUNCTION SNA CLA /SKIP IF READING JMP STWRITE /JUMP IF WRITING SSET2, JMS I (SHEAD) /CHECK IF SECOND SIDE NEEDED TAD (1000) /SET SECOND HEAD BIT ON RX03 TAD I (SFUNCT) /GET READ OR WRITE FUNCTION TAD I (SUNIT) /ADD ON UNITS^20+4 TO FORM READ OR WRITE CIF 00 /GOING TO FIELD ZERO JMP SBACK2 /CONTINUE THERE / WE MUST LOAD THE SILO BEFORE WRITING. STWRITE,CIF 00 /GOING TO FIELD ZERO JMP SETSLO /CONTINUE THERE PAGE RELOC $ /THAT'S ALL FOLK!