/RX50SY.PA OS/78 V4 RX50 SYSTEM HANDLER / / / / / / / / /COPYRIGHT (C) 1982 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / VERSION=0262 /VERSION = B2 AC0001=CLL CLA IAC AC0002=CLL CLA CML RTL AC0006=CLL CLA CML IAC RTL AC4000=CLL CLA CML RAR AC3777=CLL CLA CMA RAR AC7775=CLL CLA CMA RTL / / DEVICE IOT EQUATES / LCD=6751 /LOAD COMMAND XDR=6752 /TRANSFER DATA STR=6753 /SKIP IF READY TO TRANSFER SER=6754 /SKIP ON ERROR SDN=6755 /SKIP ON DONE INIT=6757 / HEADER BLOCK /RX50 DEVICE # IS 30 *0 -1 DEVICE RX50 DEVICE SYS 4300 /MULTI-TYPE RX HANDLER SYS&177+6000 /TWO PAGE HANDLER 0 /UNUSED DECIMAL 767 /SIZE OF RX50 = 770 DECIMAL OCTAL STBOOT-NDBOOT+12 /-SIZE (+12 FOR GAP) / / PRIMARY BOOT / NOPUNCH *20 READ, TAD UNIT /TRY NEXT COMBINATION OF DENSITY AND UNIT TAD CON360 /ADDING IN 360 AND CON420 /KEEPING ONLY 420 BITS DCA UNIT /CYCLES 400,420,0,20,400....... AC0006 /COMMON TO READ DISK TAD UNIT /UNIT AND DENSITY LCD /COMMAND TO CONTROLLER AC0001 /TO SET SECTOR AND TRACK TO 1 JMS LOAD /SECTOR TO CONTROLLER, LEAVES AC ALONE JMS LOAD /AND TRACK LITRAL, 7004 /LEAVING A 2 IN AC SERVES AS A LITERAL START, SDN /HAS DONE COME UP? CODE STARTS HERE! JMP LOAD+1 /NO, GO CHECK FOR READY TO TRANSFER SER /SKIP ON ERROR, TRY ANOTHER DENSITY ECT. SNA /AC=2 FOR ABOUT TO DO SILO, 0 ON START-UP JMP READ /START-UP, GO SET UP UNIT, THEN READ TO SILO TAD UNIT /AC ALREADY 2, PUT IN UNIT, DENSITY LCD /TO EMPTY THE SILO TAD UNIT /SET UP LOC 60 FOR OLD SECONDARY BOOT AND CON360 /KEEPING ONLY DENSITY BIT TAD LITRAL /ADDING IN 7004, BECAUSE THAT'S WHAT SYS WANTS DCA RX1SAV /OLD SECONDARY BOOT MOVES IT TO HANDLER CON360, 0360 /LITERAL; EXECUTES IN LINE AS A NO-OP /FALLS INTO NEXT PAGE OF LISTING JMS LOAD /GRAB NEXT ITEM FROM SILO DCA 2 /TRADITION; SECONDARY BOOT STARTS AT 2 ISZ 50 /INCREMENT LOAD ADDRESS JMP 47 /GO BACK FOR ANOTHER / /SECONDARY BOOT LOADS OVER PRIMARY BOOT UNIT LOC 47 IS LOADED, /THEN CONTROL PASSES TO SECONDARY BOOT LOAD, 0 /SUBROUTINE TO GIVE AND TAKE DATA FROM CONTROLLER STR /IS RX READY JMP START /NO, PERHAPS DONE WITH SILO, OR ERROR XDR /YES,DATA IN OR OUT;IF DATA TO CONTROLLER,AC UNCHANGED JMP I LOAD /NO MAGIC, JUST EXIT FROM SUBROUTINE / /61 GOES TO SECONDARY BOOT /61 HAS DENSITY AND UNIT THAT BOOTED SUCCESSFULLY / CON420, /USE IT TO HOLD 420 LITERAL TO START OUT RX1SAV, 420 /UNIT^20+7004 TO GO TO SYS HANDLER UNIT, 20 /+ THAT BOOTED OK ENPUNCH / /SECONDARY BOOT / RELOC 2 /SECTION LOADING OVER PRIMARY BOOT 2 - 47 STBOOT=. 0000 /SAVE ROOM FOR DISK ID. 0000 0000 0000 0000 0000 0000 0000 / /ONLY-ONCE CODE AFTER FIRST SECTOR IS TRANSFERED / /SET UP AUTO INDEX REGISTERS XR, 61 /CONTINUE TO LOAD FIRST SECTOR AT 62 YR, DAT02 /POINTER TO DATA AREA FOR NOW ZR, 0 /ACCOUNT FOR THIS LOCATION USED BY MOVE / /SECTOR DONE, SETUP FOR NEXT / NEXSEC, JMP ONCE /END OF FIRST SECTOR, DO SET-UP CODE CDF 0 /DATA FIELD HERE TO USE AUTO INCR REGISTERS TAD I YR /GET DATA FIELD FOR PLACEMENT SMA /SKIP IF MORE TO DO JMP MOVE2 /MOVE SECOND HALF OF BLOCK 66 TO FIELD 2 DCA XFIELD /PLACE IN LINE TO SET DATA FIELD AC0006 /GET AC OF 6 TO SET UP FLOPPY READ TAD UNIT /ADD DENSITY AND UNIT LCD TAD I YR /SECTOR FOR NEXT READ JMS LOAD /LOAD LEAVES AC ALONE TAD I YR /TRACK-SECTOR FOR NEXT READ JMS LOAD /LOAD REMAINS FROM PRIMARY BOOT TAD I YR /ADDRESS - TRACK - 1 FOR NEXT READ /FALL TO HANGGG WITH AC NON0 TO SHWO READ / /THE FOLLOWING TWO LOCATIONS MUST MATCH PRIMARY BOOT / HANGGG, SDN /!! REQUIRED AT 33!! SKIP IF DONE JMP LOAD+1 /NO, GO CHECK FOR TRANSFER READY /SORT OUT ERROR, SILO DONE, READ DONE SER /SKIP IF ERROR SKP /IS GOOT, CHECK WHETHER READ OR SILO HLT /******* FATAL ERROR ******* SNA /SKIP IF READY TO SILO (AC HAS LOAD ADDR) JMP NEXSEC /DONE WITH SILO AC=0 GOTO NEXT SECTOR DCA XR /USE AUTO INCR TO LOAD CORE JMP OVRFLW /GO TO LOCATIONS NOT FITTING UNDER 47 /CODE TO EMPTY SILO INTO CORE XFIELD, CDF 0 /FIELD FOR TRANSFER PLACED HERE JMS LOAD /LOAD REMAINS FROM PRIMARY BOOT DCA I XR /PLACE NEXT WORD JMP XFIELD /WHEN THIS LOCATION IS PLACED, SECONDARY BOOT /TAKES CONTROL, CONTINUE FIRST SECTOR AT 62 /PRIMARY BOOT LOCATIONS 50-61 REMAIN INTACT STATUS=. /REUSE FOR TEMPORY /REST OF SECONDARY BOOT RELOC 62 /SECTION LOADING 62 - 213 /LOCATIONS NO FITTING WITHIN 2-47 SPACE OVRFLW, XDR /FETCH READ STATUS FOR LATER DCA STATUS /TO FIGURE OUT IF A DOUBLE SIDED FLOPPY AC0002 /CODE FOR SILO OPERATION TAD UNIT /UNIT AND DENSITY LCD /SET TO EMPTY SILO JMP XFIELD /GO TO SILO UNLOADING LOOP ONCE, JMS MOVE1 /TO MOVE SECOND HALF OF BLOCK 0 TO 07600 ON. JMS NEXSEC /DESTROY LINKAGE TO ONCE ONLY CODE MOVE1, 0 /MOVE 214-413 TO 7600-7777 TAD MOV1 DCA ZR TAD K7577 DCA XR TAD I ZR /FROM DCA I XR /TO TAD XR /TEST DONE IAC /ENDS AT 7777 SZA CLA JMP .-5 JMP I MOVE1 MOVE2, CLA CMA /MOVING FROM 10000-10177 DCA ZR TAD K7577 /TO27600-27777 DCA XR MOVE3, CDF 10 TAD I ZR CDF 20 DCA I XR TAD XR IAC SZA CLA JMP MOVE3 TAD K12 CDF 0 JMP EBOOT /DOUBLE DENSITY LOADING DATA DAT02, 1374 /MAKE 400_UNIT WHEN ADDED TO 70X4 CDF 10 11 /LOAD BLOCK 66 6-11 /SECTOR 11 TRACK 6 7600-6-1 K12, 12 /MARKER TO STOP WHOLE THING, ALSO LITERAL 12 /I/O DONE GO TO HANDLER EBOOT, CLA TAD UNIT /REST OF CONTROL WORD DCA I MAGIC /TO BOOTYP OF SYSTEM HANDLER JMP I L7605 /START SYSTEM MAGIC, BOOTYP L7605, 7605 K7577, 7577 MOV1, 213 NDBOOT=. / CODE THAT IS LOCATION SPECIFIC HAS !! IN COMMENTS QUO=7750 /QUOTIENT FOR DIVIDE == TRACK REMD=7751 /REMAINDER FOR DIVIDE == SECTOR REC=7752 /CURRENT LOGICAL SECTOR NUMBER RETRY=7753 /RETRIES COUNT RELOC *0200 RELOC 7600 /USUALLY THE FIRST 7 LOCATIONS ARE FILLED WITH A ZBLOCK 7 /ALTHOUGH THESE COMMANDS ARE COMPILED WITH THE HANDLER THE /SYSTEM WILL OVER WRITE THESE LOCATIONS WITH THE SAME INFORMATION /THIS WAS DONE FOR CONVIENCE JMS SYS /CALL SYSTEM HANDLER 5000 /WRITE 10 PAGES -- 5 BLOCKS 0000 /START AT MEM ADDRESS 0 0033 /PUT INFO INTO SYSTEM SCRATCH AREA BLK 33 CLA HLT CIF CDF 10 /CHANGE FIELD TO 1 JMP 7667 /THIS JMP IS A CALL TO LOAD THE KEYBOARD MONITOR /ENTRY SYS, VERSION CLL CLA L12, 12 3 /!!REQUIRED AT 7612!! TO SHOW OS78 2 PAGE HANDLER TAD LM6 DCA RETRY RDF /GET FIELD OF CALLING ROUTINE TAD LLCDF0 /MAKE A CDF OUT OF IT DCA RESTOR /PUT IT BACK, GO TO I/O ROUTINE ON PAGE 2 JMP RSTART /GO CALL SECOND PAGE, IOTYP FALLS THRU TO HERE IOTYP, 0 LLCDF0, CDF 0 BOOTYP, 0 /!!MUST BE AT 7623 GETS HIT BY SECONDARY BOOT LM12, -12 L6, 6 LM6, -6 *7635 RSTART, AC3777 /MAKE A WORD WITH DENSITY AND UNIT BITS ONLY AND BOOTYP /FOR CONSTRUCTING LCD ARGUMENTS DCA IOTYP /ALSO SHUTS OFF PATH TO ONCE-ONLY CODE! TAD SYS /AC HAS THE CALL ADDR RESTOR, HLT /SET DATA FIELD TO CALLING ROUTINE CIF 20 /!! CDF,CIF OR CID MUST BE AT 7642 JMP PAGE2 /FOR FRTS TO WORK / / ERROR RECOVERY ROUTINE / RETRACT HEAD TO TRACK 0 / RETRY HANDLER CALL FROM SCRATCH / RECOVR, TAD L6 /DO A READ TAD IOTYP /ADD DRIVE NUMBER LCD /LOAD IT STR JMP .-1 CLA IAC /READ SECTOR 1 XDR STR JMP .-1 CLL CLA /TRACK 0 XDR SDN /WAIT FOR OPERATION TO FINISH JMP .-1 SER /CLEAR ANY ERROR CONDITIONS NOP JMP RSTART /RETRY LAST OPERATION *7677 / CALL WITH AC <> 0 TO DO DIVIDE / CALL WITH AC = 0 TO DO I/O RETRY (WHOLE OPERATION) DIVSUB, 0 SKP /!!FAULTY USR CALL DOES JMS HERE (7700)!! HLT /**************************************** SNA CLA /SKIP IF REALLY A DIVIDE REQUEST JMP RECOVR /NO, IT WAS AN ERROR RETRY!! RAR DCA SAVL /SAVE THE LINK DCA QUO /CLEAR DIVIDE QUOTIENT TAD REC /THIS FOR TRACK-SECTOR DIVLOO, ISZ QUO /MAIN DIVIDE BY 12 TO GET TRACK TAD LM12 /DIVIDE BY 12 TO GET TRACK SMA /SKIP IF DONE JMP DIVLOO TAD L12 /REMAINDER 0-11 DCA REMD /USE AS TEMPORY UNTIL FINAL VALUE TAD REMD /*2 FOR INTERLEAVE TAD REMD CLL IAC /LINK CLEAR FOR FINAL TEST; +1 TO START AT 1 NOT 0 TAD LM12 /DIVIDE BY 12 TO GET SECTOR SMA SZA /SKIP IF DONE JMP .-2 TAD L12 /RESTORE POSITIVE VALUE TO BE SECTOR DCA REMD SNL CLA ISZ REMD /COMPENSATE FOR ODD SECTOR TAD SAVL /RESTORE LINK CLL RAL CIF 20 /GO BACK TO OTHER PAGE JMP I DIVSUB SAVL, 0 ZBLOCK 7744-. /!! 7743 IS THE LAST USABLE LOCATION /7744-7777 IS USED BY THE MONITOR / SECOND PAGE RELOC *400 RELOC 7600 / / FETCH ARGUMENTS, ETC. / PAGE2, DCA FETCH /ENTER WITH ARGUMENT LIST ADDR IN AC RDF /SAFE HERE? TAD LCDIF0 /SET UP EXIT TO CALLER DCA EXFLD AC4000 /SET UP TO PUT R/W BIT TO LINK TAD I FETCH /FIRST ARGUMENT HAS FIELD FOR TRANSFER AND L70 /KEEPING ONLY FIELD TAD LCDF0 /MAKE CDF TO TRANSFER FIELD DCA BUFCDF /PLACE IN LINE FOR SILO LOOP CML RTL /0=WRITE, 2=READ DCA FN TAD I FETCH /MAKE CONTROL COUNT FOR TRANSFER RAL AND L7600 /COUNT OF WORDS CIA /0 FOR WHOLE FIELD DCA BC ISZ FETCH /NEXT ARGUMENT TAD I FETCH /BUFFER ADDRESS DCA BUF ISZ FETCH /NEXT TAD I FETCH /BLOCK ADDRESS ISZ FETCH /MOVING POINTER TO ERROR EXIT CDF 0 /INDIRECT TO FIRST PAGE FOR CONSTANTS DCA I LREC /SAVE BLOCK # CLA IAC /DIVSUB WANTS A NON ZERO AC FOR DIVIDE LCDIF0, CIF CDF 0 /GO BACK TO FIRST PAGE JMS DIVSUB /SET UP TRACK AND SECTOR AC0002 AND FN /SPLIT READ AND WRITE SZA CLA /WRITE SKIPS JMP STREAD /READ STARTS IN MIDDLE OF LOOP /WRITE FALLS TO NEXT LISTING PAGE /WRITE FALLS THRU TO THIS LOOP / TOP OF MAIN LOOP TOP, TAD FN /SET SILO TO LOAD-UNLOAD JMS LDCMD /COMMAND TO CONTROLLER TAD DENSW /MAKE SILOCOUNT TO 7400 DCA FLPWC CLL /FOR HALF BLOCK TRANSFERS BUFCDF, HLT /CDF TO BUFFER FIELD PLACED HERE TRLOOP, JMS WAIT /WAIT UNTIL READY TO PASS DATA SKP /STR NORMAL RETRUN JMP ERROR /ERROR TRY AGAIN TAD I BUF /IN CASE OF WRITE, FETCH A WORD XDR /TO OR FROM AC SZL JMP INCWC DCA I BUF /PLACE WORD FOR READ, WRITE REPLACES SAME ISZ BUF /MOVE BUFFER POINTER, (MAY SKIP) L70, 70 ISZ BC /FOR HALF PAGE SKP STL INCWC, CLA ISZ FLPWC /DONE YET JMP TRLOOP JMS WAIT /WAIT FOR SDN JMP ERROR TAD BC /LOOP CONTROL TO FINISH READ SZA CLA JMP STREAD AC0002 /SET AC = 2 AND FN /IF BC = 0 AND DOING A READ THEN WERE DONE SZA CLA JMP EXIT STL / / MIDDLE OF MAIN LOOP / STREAD, TAD FN /READ STARTS HERE TAD L4 /TURN SILO COMMAND INTO READ-WRITE COMMAND JMS LDCMD /I/O COMMAND TO CONTROLLER JMS WAIT /WAIT FOR STR SKP JMP ERROR TAD I LREMD /PRECOMPUTED SECTOR #; LDCMD SET FIELD TO 0 XDR L7600, 7600 /CLEAR AC, AND IS LITERAL JMS WAIT /WAIT FOR STR SKP JMP ERROR TAD I LQUO /TRACK # XDR /TRACK # IS ALWAYS NON0 !! ISZ I LREC /MOVE TO NEXT RECORD NUMBER BACKER, CDF CIF 0 /GO BACK TO FIRST PAGE JMS DIVSUB /FOR TRACK AND SECTOR AC=0 SAYS RETRY JMS WAIT /WAIT FOR SDN JMP ERROR SNL CLA JMP TOP /STILL MORE EXIT, ISZ FETCH /KICK TO OK EXIT EXFLD, HLT /CDF CIF TO CALLER JMP I FETCH /OUT / LDCMD SUBROUTINE FLPWC=. /ENTRY POINT A SAFE COUNT TEMPORARY LDCMD, 0 /CALL TO GIVE COMMAND TO CONTROLLER LCDF0, CDF 0 /INDIRECTS BACK TO FIRST PAGE TAD I LIOTYP /PUT IN UNIT, DENSITY, HEAD LCD /COMMAND JMP I LDCMD WAIT, 0 STR /TEST XFER FLAG SKP JMP I WAIT /IF XFER FLAG SET GOTO CALLER +1 SDN /TEST DONE FLAG JMP WAIT+1 /LOOP UNTIL STR OR SDN HAVE COMPLETED ISZ WAIT /DONE SET SET UP RETURN TO CALLER +2 SER /SKIP IF AN ERROR JMP I WAIT /RETURN ERROR, CDF 0 CLA ISZ I LRETRY /TRIED ENOUGH TIMES ALREADY? JMP BACKER /TO DIVSUB WITH AC=0 TO RETRY !!!!! AC4000 /HARD ERROR, GIVE BACK MINUS RESULT JMP EXFLD / / VARIABLES ETC. / BUF, 0 /POINTER TO CALLER'S BUFFER FETCH, 0 /POINTER TO CALL BC, 0 /CONTROL COUNT, WORDS TO TRANSFER FN, 0 /0 FOR WRITE, 2 FOR READ DENSW, 7400 / / LITERALS / L4, 4 LIOTYP, IOTYP /POINTERS BACK TO FIRST PAGE LRETRY, RETRY LQUO, QUO LREC, REC LREMD, REMD $