/ P?S/8 RK8E TWO DRIVE SYSTEM HANDLER / LAST EDIT: 21-NOV-1986 06:00:00 CJL / MUST BE ASSEMBLED WITH '/J' SWITCH SET. / P?S/8 HANDLER FOR RK-8/E WITH ANY TWO DRIVES (0 AND 1) OR (2 AND 3). / THIS HANDLER ADDRESSES THE ENTIRE CONTENTS OF TWO DISKS, BUT REQUIRES / EXTENDED MEMORY (ADJUSTABLE CORE-SIZE LIMITING HANDLER). / CAN BE BOOTSTRAPPED TO ANY UNIT. / UNIT CONVENTIONS: / IF THE SYSTEM IS BOOTSTRAPPED ON AN EVEN DISK (0 OR 2), THEN THE UNITS ON THAT / DISK ARE 0, 1, 2, 3 (ANY UNIT CAN BE BOOTSTRAPPED TO). IF THE SAME DISK IS / BOOTSTRAPPED ON AN ODD DISK (1 OR 3), THEN THE UNITS ON THAT DISK ARE / 4, 5, 6, 7 (ANY UNIT CAN BE BOOTSTRAPPED TO). BOOTSTRAPPING TO ANY DRIVE / CAUSES ADDRESSING OF THE OTHER DISK IN THE PAIR (IF BOOTSTRAP IS TO DRIVE ONE, / DRIVE ZERO IS THE OTHER FOUR UNITS; BOOTSTRAPPING TO DRIVE TWO MAKES DRIVE / THREE THE OTHER FOUR UNITS, ETC.). / ASSEMBLY INSTRUCTIONS. / SETTING BTUNIT=0000-0003 GENERATES THE HANDLER FOR THE RESPECTIVE UNIT. THE / HIGH-ORDER BIT OF THE LOGICAL UNIT IS DETERMINED AT BOOTSTRAP TIME ACCORDING / TO THE LOW-ORDER DRIVE BIT (EVEN UNITS=0-3, ODD UNITS=4-7). / 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-0003. / CONDITIONAL ASSEMBLY DEFINITIONS. IFNDEF BTUNIT /GENERATE A UNIT ZERO 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 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 /FIRST HELPER INITIALIZATION 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 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. / RK-8/E EQUATED SYMBOLS. RKCODE= 6740 /DEVICE CODE OF RK-8/E DSKP= RKCODE+1 /SKIP ON DONE DCLR= RKCODE+2 /CLEAR STATUS DLAG= RKCODE+3 /LOAD AND GO DLCA= RKCODE+4 /LOAD CURRENT ADDRESS DRST= RKCODE+5 /READ STATUS DLDC= RKCODE+6 /LOAD COMMAND DMAN= RKCODE+7 /MAINTAINENCE / MISCELLANEOUS EQUATED SYMBOLS. 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 NL7777= CLA CMA /LOAD AC WITH 7777 RKSIZE= 6260 /LOGICAL UNIT SIZE SBOFF= SLUPAGE-SBOOT /OFFSET VALUE SYSADJ= 0001 /ADJUSTABLE CORE SIZE HANDLER SYSNUM= 0004 /SYSTEM ID NUMBER **** MUST BE UNIQUE **** / DRIVE-ZERO ONLY (UNIT ZERO ONLY) BOOTSTRAP. NOPUNCH /TURN OFF BINARY OUTPUT *0030 /SHORT BOOTSTRAP STARTS HERE DLAG /POWER CLEAR USES RECORD 0, DRIVE 0, LOCATION 000000 JMP . /WAIT FOR OVERLAY / ANY DRIVE (BTUNIT&3=0) BOOTSTRAP. *0025 /LONGER BOOTSTRAP STARTS HERE LAS /GET DRIVE FROM BITS[9-10] DLDC /LOAD READ COMMAND WITH POWER-CLEARED VALUES AS BEFORE DLAG /START READ OF SECTOR ZERO LAS /GET DRIVE AGAIN TO TELL HANDLER JMP . /WAIT FOR OVERLAY / ANY DRIVE, ANY BTUNIT BOOTSTRAP. *0024 /LONGEST BOOTSTRAP STARTS HERE LAS /GET DRIVE FROM BITS[9-10], SET BIT[11] IF BTUNIT&3=3 DLDC /LOAD READ COMMAND TAD BUTRCD /GET BTUNIT'S LOW-ORDER SECTOR ADDRESS DLAG /START THE READ ON THE PROPER SECTOR LAS /GET DRIVE AGAIN TO TELL HANDLER JMP . /WAIT FOR OVERLAY BUTRCD, BTUNIT&3^3130 /PROPER SECTOR FOR BOOTSTRAP 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 RKSIZE /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 BTEMP, CDF 00 /MAKE SURE FIELD 0 BT4, 4 /CONSTANT 0004 BUPPER, .-. /UPPER DISK BIT WILL BE IN BIT[9] BUTFUN, .-. /UNIT BITS WILL BE STORED HERE BDISK, TAD BUTFUN /GET UNIT BITS AND BT4/(4) /JUST UNIT[0] CLL RAR /MOVE TO BIT[10] DCA BDISK /SAVE EVEN/ODD DISK BIT IFNZRO SCRSIZE-. SCRSIZE,0000 /THIS CAN BE INCREMENTED FOR <^C>! TAD BUTFUN /GET UNIT BITS AGAIN RTR /UNIT[1] TO LINK, UNIT[2] TO BIT[0] SPA CLA /SKIP IF EVEN UNIT TAD BT1454/(1454) /ADD ON SINGLE UNIT SZL /SKIP IF NOT DOUBLE UNIT TAD BT3130/(3130) /ADD ON DOUBLE UNIT CLL RAL /DOUBLE EVERYTHING DCA BTEMP /SAVE LOW-ORDER SECTOR ADDRESS RAL /GET HIGH-ORDER SECTOR ADDRESS TAD BUPPER /ADD ON UPPER DISK BIT TAD BDISK /ADD ON EVEN/ODD DISK BIT DLDC /LOAD READ COMMAND DLCA /LOAD ZERO TRANSFER ADDRESS TAD BTEMP /GET LOW-ORDER SECTOR ADDRESS DLAG /START THE READ DSKP /FLAG UP? JMP .-1 /NO, WAIT FOR IT TAD SCRSIZE&177 /GET CORE SIZE WORD FROM BOOTSTRAP TAD SCRSIZE /GET <^C> INDICATOR DCA SCRSIZE&177 /STORE OVER CORE SIZE WORD IN BOOTSTRAP TAD BUPPER /GET UPPER DISK BIT TAD BDISK /GET EVEN/ODD DISK BIT JMP SJMP&177 /GO FINISH IT THERE BT1454, 1454 /CONSTANT 1454 BT3130, 3130 /CONSTANT 3130 / ALL BOOTSTRAP CODE MUST BE WITHIN 7600-7642. / ENSURE THIS SIZE CONVENTION IS MET. IFNZRO SBOOT+BBLEN-.&4000 / SLURP INITIALIZE CODE. ZBLOCK SFILES-. /EMPTY SPACE SFILES, RELOC BINIT2 /WHERE THIS EXECUTES BINIT2, TAD I BNUNIT/[SBTFUN] /GET BOOTSTRAP UNIT DCA I BNFUN/[BUTFUN+SBOFF] /SAVE IT IN BOOTSTRAP NL7777 /BACKUP TAD I BNCIF/[SWTFLD] /NOW HAVE CDF HELPER FIELD DCA .+1 /STORE IN-LINE .-. /AND EXECUTE IT TAD I BNUDSK/[SPHDSK] /GET UPPER DISK BIT CDF 00 /BACK TO FIELD 0 DCA I BNUPPER/[BUPPER+SBOFF] /STORE IN BOOTSTRAP JMP I BINIT /RETURN BNCIF, SWTFLD /CIF HELPER FIELD THERE BNFUN, BUTFUN+SBOFF /WHERE BUTFUN IS AT ONCE-ONLY TIME BNUDSK, SPHDSK /WHERE UPPER DRIVE BIT IS BNUNIT, SBTFUN /SYSTEM BOOTSTRAP UNIT POINTER BNUPPER,BUPPER+SBOFF /WHERE BUPPER IS AT ONCE-ONLY TIME 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 RK-8/E. / 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 RK8E /SYSTEM DEVICE NAME / I/O ADDRESSES. ADRLST, SERR /NORMALLY HLT OR 7401 SERR+1 /NORMALLY AND S401/(401) SYSIO+2 /NORMALLY RDF SYSIO+3 /NORMALLY TAD SCDF/(CDF) 0 /THIS ENDS THE SHORT LIST ZBLOCK ADRLST+12-. /EMPTY SPACE / I/O NORMAL CONTENTS. CNTLST, HLT/OR 7401 /SERR AND S401/(401) /SERR+1 RDF /SYSIO+2 TAD SCDF/(CDF) /SYSIO+3 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, CLA /CLEAN UP 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+4) /CONTINUE THERE / ERROR BLURBS. SEEK, TEXT "SEEK FAILURE" /SEEK FAILURE ERROR BLURB NREADY, TEXT " NOT READY" /NOT READY ERROR BLURB BUSY, TEXT "CONTROL BUSY" /CONTROLLER BUSY ERROR BLURB TIM, TEXT " TIME-OUT" /TIME-OUT ERROR BLURB WRILOC, TEXT " WRITE-LOCK" /WRITE-LOCK ERROR BLURB PAR, TEXT " READ PARITY" /CRC ERROR BLURB DRL, TEXT " DATA LATE" /FIFO ERROR BLURB DSTAT, TEXT "DRIVE STATUS" /DRIVE STATUS ERROR BLURB BLBLEN= .-DSTAT /LENGTH OF ERROR BLURBS PAGE / ERRORS COME HERE. TRPERR, DCA ESTATUS /SAVE ERROR STATUS TAD (BLBLEN) /INITIALIZE DCA ERRADR /RELATIVE ERROR ADDRESS TAD ESTATUS /GET ERROR STATUS AND (401) /SEEK ERROR? SZA CLA /SKIP IF NOT JMP ERRFND /JUMP IF IT MATCHES TAD ESTATUS /GET STATUS AGAIN RTL;RAL /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 (SEEK-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 ESTATUS /GET STATUS AGAIN AND (401) /JUST SEEK ERROR BITS CIF CDF 00 /BACK TO MONITOR FIELD JMP I (SERR+2) /TRY, TRY AGAIN ERRADR, .-. /ERROR ADDRESS CREATED HERE ETEMP, .-. /STATUS TEMPORARY PAGE / RK-8/E TWO FULL DISK SYSTEM HANDLER. FIELD 0 /WHERE THIS LOADS *GENAD1 /WHERE SYSGEN WANTS IT RELOC SBOOT /WHERE IT EXECUTES SBOOT, JMP SBUTMORE /CONTINUE THERE SMONSTR,MONSTRT /POINTER TO KEYBOARD MONITOR START SBTFUN, .-. /UNIT BITS WILL BE FILLED IN S401, 401 /CONSTANT 0401 SWAL, DSKP /SWITCHES /A-/L; INITIALIZED /FOR COLD BOOTSTRAP SWMX, JMP SWAL&177 /SWITCHES /M-/X; INITIALIZED /FOR COLD BOOTSTRAP SWY9, JMP SCLBUT&177 /SWITCHES /Y-/9; INITIALIZED /FOR COLD BOOTSTRAP SOUTFLS,HBLOCK%2 /OUTPUT FILE COUNT; INITIALIZED /FOR COLD BOOTSTRAP SDATE, .-. /SYSTEM DATE WORD SCRSIZE,SYSADJ^4 /SYSTEM CORE SIZE WORD SWAIT, 6 /WAIT ROUTINE; INITIALIZED FOR COLD BOOTSTRAP DLDC /LOAD PASSED COMMAND TAD SECT /GET DESIRED SECTOR DLAG /START IT UP DSKP /FLAG UP? JMP .-1 /NO, WAIT FOR IT DRST /YES, READ IN STATUS CLL RAL /GET RID OF DONE BIT SZA CLA /SKIP IF OK JMP SERR2 /BARF IF NOT SWTFLD, CIF EXHGFLD+.-. /WILL BE CIF TO HIGHEST FIELD JMP I SWAIT /RETURN S3130, 3130 /CONSTANT 3130 S3700, 3700 /CONSTANT 3700 S4, 4 /CONSTANT 0004 IFNZRO .&177-31 SJMP, JMP SWAL&177 /INITIALIZED FOR COLD BOOTSTRAP SLOAD, JMS SYSIO /SYSTEM LOADER SCORE, 0000 /CORE ARGUMENT SFUN, WRITE /FUNCTION WORD SBLOCK, BINADR /BLOCK NUMBER JMP I SYSTART/(SYSTART) /START IT UP SYSTART,SBOOT /THROUGH HERE SYSIO, BTUNIT&3 /SYSTEM I/O ENTRY; INITIALIZED FOR COLD BOOTSTRAP NL0002 /GET CIF BIT RDF /GET CALLING FIELD TAD SCDF/(CDF) /MAKE INTO CIF CDF CALLER DCA SEXIT /SAVE FOR EXIT LATER JMP SINIT /CONTINUE THERE SERR2, DRST /GET ERROR STATUS SERR, HLT /OR EAE NOP AND S401/(401) /ISOLATE RECALIBRATE BITS SZA CLA /SKIP IF OFF IAC /ELSE SET RECALIBRATE INCREMENT IAC /SET CONTROLLER CLEAR BIT OR RECALIBRATE DCLR /DO RECALIBRATE OR JUST CLEAR DRST /GET STATUS BACK NOW CLL RTL /MOVE THE "IN MOTION" BIT TO LINK SZA CLA /SKIP IF OTHERWISE OK JMP SERR2 /BARF!! SZL /DONE YET? JMP .-6 /NO, CONTINUE WAITING NL7775 /SET THE BACKUP AND RETRY VALUE SDONE, ISZ SYSIO /BUMP TO FINAL RETURN ADDRESS SEXIT, CIF CDF 00 /WILL BE CIF CDF TO CALLING FIELD SNA /SKIP IF ERRORS JMP I SYSIO /RETURN IF NOT TAD SYSIO /BACKUP THE CALLER DCA SYSIO /TO BEGINNING SINIT, TAD I SYSIO /GET CORE ARGUMENT DCA SBUFF /SAVE IT ISZ SYSIO /BUMP TO NEXT TAD I SYSIO /GET FUNCTION WORD DCA SFUNCT /SAVE IT ISZ SYSIO /BUMP TO NEXT TAD I SYSIO /GET BLOCK ARGUMENT CLL RAR /REDUCE TO DISK SECTOR DCA SECT /SAVE IT TAD SFUNCT /GET FUNCTION WORD BACK AND S3700/(3700) /JUST PAGE BITS SNA /SKIP IF ANY NL4000 /INDICATE 40 PAGE TRANSFER DCA SPAGCT /SAVE FOR COUNTING PAGES LATER TAD SFUNCT /GET FUNCTION AGAIN AND S4/(4) /JUST HIGH-ORDER UNIT BIT CLL RAR /MOVE TO AC[10] DCA SDISK /SAVE IT TAD SFUNCT /GET FUNCTION AGAIN RTR /UNIT[2] TO LINK, UNIT[1] TO AC[0] SPA CLA /SKIP IF EVEN UNIT TAD S1454/(1454) /ADD ON A UNIT LENGTH (HALF-SIZE AT PRESENT) SZL /SKIP IF NOT DOUBLE UNIT TAD S3130/(3130) /ADD ON DOUBLE UNIT LENGTH (ALSO HALF-SIZE) CLL RAL /DOUBLE THE UNIT SIZE TAD SECT /ADD ON BASE SECTOR DCA SECT /SAVE COMPOSITE DISK SECTOR TAD SFUNCT /GET FUNCTION AGAIN AND S4070/(4070) /JUST READ/WRITE AND FIELD BITS SZL /DID WE OVERFLOW? IAC /YES, SET HIGH-ORDER SECTOR BIT DCA SFUNCT /SAVE IT TAD I SYSIO /GET THE BLOCK ARGUMENT RAR /PUT ODD BIT IN THE LINK CLA /CLEAN UP SCDF, CDF 00 /USE FIELD 0 SFXCIF, CIF EXHGFLD+.-. /WILL BE CIF HIGHEST FIELD JMP SODCHK /DO THE REST THERE SBUTMOR,JMS SYSIO /READ IN THE KEYBOARD MONITOR 0000 /TRANSFER ADDRESS SBFUN2, 17^100+.-. /UNIT BITS WILL BE FILLED IN 0001 /KEYBOARD MONITOR STARTS HERE JMP I SMONSTR/(MONSTRT) /GO START IT UP S1454, 1454 /CONSTANT 1454 S4070, 4070 /CONSTANT 4070 ZBLOCK SPA SNA CLA-1-. /EMPTY SPACE / COMES HERE FOR COLD BOOTSTRAP. SCLBUT, AND SWAIT&177/[6] /ISOLATE UNIT BITS IFNZRO SPA SNA CLA-. SCOMD, DCA SCLBUT&177 /COMMAND TEMPORARY; SAVE UNIT BITS SDISK, NL7775 /UNIT[0] DRIVE BIT IN BIT[10]; SET -3 SECT, TAD SYSIO&177 /DISK SECTOR; LINK IS 0 IFF BTUNIT&3=3 SFUNCT, CLA CML RAL /FUNCTION WORD; AC[11] IS 1 IFF BTUNIT&3=3 SPAGCT, TAD SCLBUT&177 /PAGE COUNT; ADD ON DRIVE BITS SBUFF, DLDC /TRANSFER ADDRESS; LOAD READ COMMAND SPARM, TAD SBINIT&177/[EXIRADR-200]/EQUALS PARAMETER; GET TRANSFER ADDRESS SFILES, DLCA /PASSED FILE LIST; LOAD TRANSFER ADDRESS TAD SYSIO&177 /GET LOW-ORDER UNIT BITS CMA /INVERT FOR COUNTING DCA SWAIT&177 /STORE COUNTER VALUE SKP /DON'T ADD YET! SMULUP, TAD S3130&177/[3130] /ADD ON ONE UNIT'S WORTH ISZ SWAIT&177 /DONE YET? JMP SMULUP&177 /NO, KEEP GOING TAD SOUTFLS&177/[HBLOCK%2] /YES, ADD ON OFFSET VALUE DLAG /START THE READ DSKP /FLAG UP? JMP .-1&177 /NO, WAIT FOR IT DRST /GET READ STATUS CLL RAL /REMOVE DONE BIT JMP I SBSTART&177/[EXIRADR] /BRANCH INTO IT SBINIT, EXIRADR-200 /NEXT ROUTINE TRANSFER ADDRESS SBSTART,EXIRADR /NEXT ROUTINE ENTRY ADDRESS 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. EXIRADR,SNA /SKIP IF ANY ERRORS JMP SBTOK1 /JUMP IF OK SBARF1, HLT /DISPLAY FIRST BOOTSTRAP (READ) ERROR JMP SBARF1 /JUST IN CASE / COMES HERE TO READ IN OUR SECOND PAGE OF INITIALIZATION CODE. SBTOK1, NL7775 /SET -3 TAD SYSIO&177 /LINK IS 0 IFF BTUNIT&3=3 CLA CML RAL /AC[11] IS 1 IFF BTUNIT&3=3 TAD SCLBUT&177 /ADD ON DRIVE BITS DLDC /LOAD READ COMMAND TAD (EXIRADR+200) /GET TRANSFER ADDRESS DLCA /LOAD IT TAD SYSIO&177 /GET LOW-ORDER UNIT BITS CMA /INVERT FOR COUNTING DCA EXIRADR /STASH THE COUNTER SKP /DON'T ADD YET! SBMULP, TAD (3130) /ADD ON ONE UNIT'S WORTH ISZ EXIRADR /DONE YET? JMP SBMULP /NO, KEEP GOING TAD (HBLOCK+1%2) /ADD ON OFFSET VALUE DLAG /START THE READ OPERATION DSKP /FLAG UP? JMP .-1 /NO, WAIT FOR IT DRST /YES, GET READ STATUS CLL RAL /GET RID OF DONE BIT SNA /SKIP IF ANY ERRORS JMP SBTOK2 /JUMP IF OK SBARF2, HLT /DISPLAY SECOND BOOTSTRAP (READ) ERROR JMP SBARF2 /JUST IN CASE / COMES HERE TO SETUP BOOTSTRAP, READ UNIT BITS. SBTOK2, NL0002 /SET UNIT MASK AND SCLBUT&177 /GET LOW-ORDER DRIVE BIT CLL RAL /BECOMES HIGH-ORDER UNIT BIT TAD SYSIO&177 /ADD ON LOW-ORDER UNIT BITS DCA SBTFUN&177 /STORE SYSTEM UNIT TAD SBTFUN&177 /GET IT BACK TAD SBFUN2&177/(17^100) /ADD ON READ BITS DCA SBFUN2&177 /STORE BOOTSTRAP READ FUNCTION / 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 SBTOK3 /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 SBARF3 /JUMP IF SO TLS /PRINT IT SB7600, CLA!400 /CLEAN UP ISZ SBCMPTR /BUMP TO NEXT TSF /WAIT FOR THE CHARACTER JMP .-1 /TO PRINT JMP SBCMPLN /KEEP GOING SBARF3, HLT /DISPLAY THIRD BOOTSTRAP (MEMORY) ERROR JMP SBARF3 /JUST IN CASE / COMES HERE IF SOME EXTENDED MEMORY IS AVAILABLE. SBTOK3, TAD SCDFNXT /GET TOO-HIGH CDF INSTRUCTION TAD (-10) /BACKUP TO HIGHEST FIELD AVAILABLE DCA I (SINLN2) /STORE IN-LINE FOR LATER TAD I (SINLN2) /GET IT BACK AND (70) /JUST FIELD BITS DCA EXIRADR /STORE FOR LATER / NOW READ IN REST OF HANDLER INTO HIGHEST AVAILABLE FIELD. NL7775 /SET -3 TAD SYSIO&177 /LINK IS 0 IFF BTUNIT&3=3 CLA CML RAL /AC[11] IS 1 IFF BTUNIT&3=3 TAD SCLBUT&177 /ADD ON DRIVE BITS TAD EXIRADR /ADD ON TRANSFER FIELD BITS TAD (100) /ADD ON HALF-SECTOR BIT DLDC /LOAD READ COMMAND TAD SB7600/(SBOOT) /GET TRANSFER ADDRESS DLCA /LOAD IT TAD SYSIO&177 /GET LOW-ORDER UNIT BITS CMA /INVERT FOR COUNTING DCA EXIRADR /STASH THE COUNTER SKP /DON'T ADD YET! SBMLUP, TAD (3130) /ADD ON ONE UNIT'S WORTH ISZ EXIRADR /DONE YET? JMP SBMLUP /NO, KEEP GOING TAD (HBLOCK+11%2) /ADD ON OFFSET VALUE DLAG /START THE READ DSKP /FLAG UP? JMP .-1 /NO, WAIT FOR IT DRST /YES, GET READ STATUS CLL RAL /GET RID OF DONE BIT SNA /SKIP IF ANY ERRORS JMP I (SBTOK4) /JUMP IF OK SBARF4, HLT /DISPLAY FOURTH BOOTSTRAP READ ERROR JMP SBARF4 /JUST IN CASE SBCMPTR,SCBLURB /COMPLAINT BLURB POINTER SFLDCNT,-7 /TEST FIELD COUNTER PAGE / COMES HERE IF REST OF HANDLER IS NOW READ IN. SBTOK4, TAD SCLBUT&177 /GET PHYSICAL DRIVE BITS AND (4) /JUST DISK PAIR BIT SINLN2, .-. /WILL BE CDF HIGHEST AVAILABLE FIELD DCA I (SPHDSK) /STORE IN HANDLER CDF EXIRFLD /RESET TO OUR FIELD TAD SINLN2 /GET CDF HIGHEST AVAILABLE FIELD IAC/ TAD (CIF-CDF) /MAKE IT CIF HIGHEST AVAILABLE FIELD DCA SWTFLD&177 /STORE IN HANDLER TAD SWTFLD&177 /GET IT BACK DCA SFXCIF&177 /STORE IN HANDLER / NOW MOVE THE UPDATED HANDLER FROM 00000 TO 07600. SBMVINS,TAD SBOOT&177 /GET A WORD DCA I SBMVPTR /PUT A WORD ISZ SBMVINS /BUMP TO NEXT ISZ SBMVPTR /DONE YET? JMP SBMVINS /NO, KEEP GOING JMP I (SBUTMORE) /YES, CONTINUE THERE SBMVPTR,SBOOT /BOOTSTRAP MOVE POINTER AND COUNTER / ONLY 4K MEMORY COMPLAINT BLURB. SCBLURB,"G&37 / "G&37 / "M&37 / "J&37 / "R&177 /R "K&177 /K "-&177 /- "8&177 /8 "/&177 // "E&177 /E " &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 IFNZRO .&177 S37, 37 /CONSTANT 0037 SODCHK, DCA SCHKBIT /ALWAYS CHECK THE FIRST TIME! DCA SBAKUP /CLEAR INITIAL BACKUP FACTOR SZL /IS IT AN ODD HALF? JMP SECTODD /YES, FIXUP THERE SECLUP, TAD I (SBUFF) /GET THE TRANSFER ADDRESS DLCA /SETUP THE ADDRESS COUNTER TAD I (SPAGCT) /GET THE CURRENT PAGE COUNT TAD S7700/(-100) /COMPARE TO ONE PAGE TRANSFER SCMDBF, SCOMD&SPA SNA CLA /SKIP IF LARGER; SPA IS USED TO FORM ADDRESS JMP S1PAGE /JUMP IF SINGLE PAGE S1READ, TAD SCHKBIT /GET CHECK BIT IN CASE SECONDARY TRANSFER TAD I (SFUNCT) /GET BASIC COMMAND TAD SPHDSK /ADD ON PHYSICAL DISK EXTENSION BIT TAD I (SDISK) /GET DRIVE BIT DUE TO UNIT[0] SWRITIN,CIF 00 /BACK TO FIELD 0 JMS SWAIT /START IT UP AND WAIT FOR IT TO FINISH SODRDIN,ISZ I (SECT) /BUMP UP DISK SECTOR SKP /DIDN'T OVERFLOW ISZ I (SFUNCT) /BUMP HIGH-ORDER SECTOR BIT TAD SBAKUP /GET ADDRESS BACKUP FACTOR TAD (400) /ACCOUNT FOR TWO PAGES NORMALLY TAD I (SBUFF) /GET OLD ADDRESS VALUE DCA I (SBUFF) /SAVE UPDATED VALUE DCA SBAKUP /REMOVE HALF-SECTOR BACKUP TAD I (SPAGCT) /GET PAGE COUNTER TAD SS7600/(-200) /SUBTRACT TWO PAGES SPA SNA /SKIP IF NOT DONE JMP SOVER /JUMP IF FINISHED DCA I (SPAGCT) /SAVE UPDATED COUNT TAD I (SECT) /GET NEXT SECTOR S200, AND S37/(37) /JUST ON-TRACK BITS SZA CLA /SKIP IF NEW TRACK NEEDED TAD (1000) /ALLOW NON-CHECK FOR SPEED'S SAKE DCA SCHKBIT /SAVE CHECK BIT EITHER WAY JMP SECLUP /GO DO ANOTHER SECTOR SOVER, CLA /CLEAN UP CIF 00 /BACK TO FIELD 0 JMP SDONE /WE'RE DONE! SMOVE, .-. /BUFFER MOVE ROUTINE TAD SS7600/(-200) /SETUP THE DCA SBUFRD /MOVE COUNT SFRCDF, .-. /WILL BE "FROM" CDF TAD I SFRPTR /GET A WORD STOCDF, .-. /WILL BE "TO" CDF DCA I STOPTR /PUT A WORD ISZ SFRPTR /BUMP INPUT POINTER S7400, 7400 /CONSTANT 7400 HERE JUST IN CASE ISZ STOPTR /BUMP OUTPUT POINTER SS7600, SBOOT /CONSTANT 7600 HERE JUST IN CASE ISZ SBUFRD /DONE ALL YET? JMP SFRCDF /NO, GO DO ANOTHER ONE SSCDF, CDF 00 /YES, BACK TO FIELD 0 JMP I SMOVE /RETURN SECTODD,TAD I (SPAGCT) /GET CURRENT PAGE COUNT TAD (100) /ADD ONE TO COUNTER DECREMENT LATER DCA I (SPAGCT) /STORE IT BACK TAD SS7600/(-200) /SETUP THE DCA SBAKUP /BACKUP FACTOR TAD I (SFUNCT) /GET THE READ/WRITE FUNCTION S7700, SMA CLA /SKIP IF WRITING JMP SODREAD /JUMP IF READING SODWRIT,TAD S200/(200) /ODD WRITING AFFECTS THE SECOND HALF S1WRITE,TAD SOVER/(7200) /GET WORKING BUFFER POINTER DCA STOPTR /BECOMES MOVE DESTINATION POINTER JMS SBUFRD /READ IN THE CURRENT DISK CONTENTS DCA SFRCDF /SAVE SOURCE CDF INSTRUCTION TAD I (SBUFF) /GET TRANSFER ADDRESS DCA SFRPTR /USE AS MOVE SOURCE POINTER RIF /GET THIS FIELD TAD SSCDF/(CDF) /MAKE INTO CDF INSTRUCTION DCA STOCDF /SAVE AS DESTINATION CDF JMS SMOVE /MOVE USER PAGE TO WORK BUFFER TAD SOVER/(7200) /SETUP THE DLCA /CURRENT ADDRESS NL4000 /GET A WRITE BIT TAD I SCMDBF/(SCOMD) /ADD ON TO FORMER READ JMP SWRITIN /GO WRITE IT OUT SODREAD,JMS SBUFRD /READ IN THE WHOLE SECTOR DCA STOCDF /SETUP DESTINATION CDF INSTRUCTION TAD I (SBUFF) /GET THE TRANSFER ADDRESS DCA STOPTR /BECOMES DESTINATION POINTER TAD S7400/(7400) /SETUP THE DCA SFRPTR /SOURCE POINTER RIF /GET THIS FIELD TAD SSCDF/(CDF) /MAKE INTO CDF INSTRUCTION DCA SFRCDF /SAVE AS SOURCE CDF INSTRUCTION JMS SMOVE /MOVE FIRST WORK PAGE TO USER BUFFER JMP SODRDIN /CONTINUE THERE S1PAGE, TAD I (SFUNCT) /GET READ/WRITE FUNCTION SPA CLA /SKIP IF ONE PAGE READ JMP S1WRITE /JUMP IF WRITING TAD (100) /GET "HALF-SECTOR" BIT JMP S1READ /CONTINUE THERE SBUFRD, .-. /READ A WORK BUFFER ROUTINE TAD SOVER/(7200) /GET WORK POINTER DLCA /LOAD CURRENT ADDRESS NL0001 /SETUP HIGH-ORDER SECTOR BIT MASK AND I (SFUNCT) /GET THE HIGH-ORDER SECTOR BIT TAD SPHDSK /GET PHYSICAL DISK EXTENSION BIT TAD I (SDISK) /ADD ON DISK EXTENSION DUE TO UNIT[0] RIF /ADD ON THIS FIELD DCA I SCMDBF/(SCOMD) /SAVE FOR LATER TAD I SCMDBF/(SCOMD) /GET COMMAND BACK CIF 00 /BACK TO FIELD 0 JMS SWAIT /GO READ AND WAIT FOR IT TO FINISH TAD I (SFUNCT) /GET FUNCTION AGAIN AND (70) /JUST TRANSFER FIELD TAD SSCDF/(CDF) /MAKE INTO CDF INSTRUCTION JMP I SBUFRD /RETURN SBAKUP, .-. /BACKUP FACTOR FOR ODD SINGLE TRANSFERS SCHKBIT,.-. /HEADER CHECK BIT SFRPTR, .-. /MOVE "FROM" POINTER SPHDSK, .-. /PHYSICAL DISK EXTENSION (0,1 OR 2,3 IN BIT[9]) STOPTR, .-. /MOVE "TO" POINTER PAGE RELOC /TURN OFF RELOCATION $ /THAT'S ALL FOLK!