/RD51SY.PA OS/78 V4 RD51 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. / / / / / / / / / / /9-MAR-83 / / VER 001 / /THE RD51 CONTROLLER FOR THE DECMATE II OPERATES ON BLOCK NUMBERS, IT /PERFORMS ANY NECESSARY MAPPING TO CYLINDER, SURFACE AND SECTOR WITHIN A /LOGICAL VOLUME. /AS OS8 IS LIMITED TO 4096 BLOCKS, THIS IS THE LIMIT USED IN THIS HANDLER. / / DEVCOD=700 /RD51 DEVICE CODE / / RDSR=6001+DEVCOD /SKIP ON DATA TRANSFER REQ. CLEAR IF SET RDSC=6002+DEVCOD /SEND COMMAND TO RD CONTROLLER RDSD=6003+DEVCOD /SKIP ON COMMAND DONE, CLEAR FLAG IF SET RDTD=6004+DEVCOD /TRANSFER DATA TO-FROM RD<->AC /DIRECTION DETERMINED BY COMMAND IN PROGRESS RDWE=6005+DEVCOD /SET-CLEAR INTERRUPT ENABLE WITH AC<11> RDSE=6006+DEVCOD /SKIP ON ERROR, CLEAR FLAG IF SET / / /SOME DEFINITIONS / MINUS3=CLA CLL CMA RTL AC4000=CLA CLL CML RAR / /THE ONLY COMMANDS AVAILABLE THROUGH THIS HANDLER ARE : / :READ_A_BLOCK : PERFORMED AS READ THEN EMPTY BUFFER / :WRITE_A_BLOCK : PERFORMED AS FILL BUFFER THEN WRITE. /FOR BOTH OF THESE AN INITIAL SET_VOLUME_AND_BLOCK COMMAND IS ISSUED. /THE FORM OF THE COMMAND IS :- RDSC WITH AC=1 /IOT "SEND_COMMAND" /FOLLOWED BY SENDING THREE WORDS :- / WORD #1 - AC<8:11> VOLUME # (1 - 15), DEFINED / IN THE MOUNT COMMAND / WORD #2 - AC<00:11> LOW ORDER BLOCK NUMBER / WORD #3 - AC<04:11> HIGH ORDER BLOCK NUMBER / /AS THE SIZE OF EACH VOLUME IS LIMITED BY OS78 TO A 12-BIT BLOCK NUMBER /THE LOW ORDER BLOCK NUMBER ABOVE IS THE BLOCK NUMBER WITHIN A VOLUME /THE HIGH ORDER BLOCK NUMBER CAN BE ONLY 0 / VERSION=0161 /VERSION = A1 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 / HEADER BLOCK /RL02 DEVICE # IS ?? *0 -1 DEVICE RDSY DEVICE SYS 4270 /MULTI-TYPE RX HANDLER SYS&177+6000 /TWO PAGE HANDLER 0 /UNUSED 7777 /SIZE OF RX50 = 770 DECIMAL STBOOT-NDBOOT /-SIZE XR= 10 ZR= 11 RELOC 200 /WINCHESTER BOOT LOADS INTO 200 FIELD 0 STBOOT= . ZBLOCK 10 /FOR DISK ID STUFF TAD MOV1 /MOVE THE DATA AT 400 TO FIELD 2 DCA XR /SET UP AUTO INDEX TAD K7577 DCA ZR /ADDRESS TO MOVE IT TO XR1, TAD I XR /GET A WORD JMS SAVE JMP XR1 CLL CLA IAC /SET VOLUME AND BLOCK RDSC JMS LOAD TAD K66 /BLOCK 66 JMS LOAD JMS LOAD RDSD /NOW WAIT FOR DONE JMP .-1 CLL CLA IAC RTL /AC=4 FOR A READ RDSC RDSD JMP .-1 CDF 10 TAD K7577 DCA ZR TAD KK25 RDSC XR2, JMS LOAD /GET THE DATA JMS SAVE JMP XR2 CDF 20 TAD K7577 /NOW LOAD UP FIELD 2 DCA ZR XR3, JMS LOAD /GET THE DATA JMS SAVE JMP XR3 /AND DO IT AGAIN RDSD JMP .-1 CIF CDF JMP I .+1 7605 /GO START THE SYSTEM HANDLER MOV1, 377 K66, 66 /BLOCK 66 OF DISK K7577, 7577 KK25, 25 LOAD, 0 DCA XR RDSR JMP .-1 TAD XR RDTD /VOLUME NUMBER JMP I LOAD SAVE, 0 DCA I ZR /SAVE IT TAD ZR /SEE IF DONE IAC SNA CLA /SKIP FI DONE ISZ SAVE JMP I SAVE NDBOOT= . / /RETRIES ARE BUILT IN TO THE CONTROLLER. / / CODE THAT IS LOCATION SPECIFIC HAS !! IN COMMENTS 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 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 LM12, -12 L6, 6 *7640 RSTART, TAD SYS /HAS THE CALL ADDRESS /FLOPPY HAD DENISTY AND UNIT INFORMATION RESTOR, HLT /SET DATA FIELD TO CALLING ROUTINE CIF 20 /!! CDF,CIF OR CID MUST BE AT 7642 JMP PAGE2 /FOR FRTS TO WORK ZBLOCK 7744-. /!! 7743 IS THE LAST USABLE LOCATION /7744-7777 IS USED BY THE MONITOR / SECOND PAGE RELOC *0400 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 TAD K3 /SET UP TO DO READ OR WRITE DEPENDANT ON LINK SNL /SKIP IF DOING A WRITE CLL IAC /3=WRITE 4= READ DCA FN TAD I FETCH /MAKE CONTROL COUNT FOR TRANSFER RAL AND K7600 /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 DCA LREC /SAVE BLOCK # CLL CLA IAC RTL /AC=4 AND FN /DETERMINE IF READ OR WRITE FUNCTION SZA CLA /SKIP IF WRITE JMP STREAD /GO DO A READ / /WRITE FALL THROUGH / TOP, TAD K4 /AC TO READ BIT AND FN /AGAIN CHECK THE FUNCTION FOR THE SILO COMMAND SZA CLA /SKIP IF WRITE FUNCTION TAD K23 /MAKE EMPTY BUFFER COMMAND FOR READ TAD K2 RDSC /SEND THE COMMAND TAD DENSW /BYTE COUNT FOR A SECTOR DCA RDWC /SAVE IT FOR THE TRANSFER LOOP CLL /MAKE SURE LINK IS CLEARED FOR THE READ BUFCDF, HLT /DATA BUFFER FIELD TRLOOP, JMS WAIT /WAIT FOR A WORD SKP /TR SEEN JMP ERROR /ERROR FLAG FROM CONTROLLER TAD I BUF /GET A CHARACTER RDTD /TRANSFER IT SZL /SKIP IF A READ COMMAND JMP INCWC /GO UPDATE THE WORD COUNT DCA TEMP /SAVE THE AC FOR NOW. TAD FN /SEE IF A WRITE FUNCTION IN WHICH CASE LEAVE THE BUFFER /AS IS BECAUSE THE RD INSTRUCTIONS CLEAR THE AC AND K4 /MASK THE READ BIT SNA CLA /SKIP IF READ FUNCTION JMP .+3 /WAS A WRITE. LEAVE THE BUFFER ALLONE TAD TEMP DCA I BUF /STORE THE DATA READ FROM THE DISK ISZ BUF /MOVE BUFFER POINTER (IT MAY SKIP) L70, 70 /AND 70 WON'T BOTHER THE AC IF IT DOESN'T SKIP ISZ BC SKP STL /SO THE BUFFER DOES'T CHANGE ON HALF PAGE K7600, INCWC, 7600 ISZ RDWC /UPDATE THE WORD COUNT JMP TRLOOP /AND DO IT AGAIN JMS WAIT /NOW WAIT FOR DONE JMP ERROR /TR SEEN. ERROR CONDITION TAD BC /LOOP CONTROL TO FINISH READ. SZA CLA /SKIP IF ALL DONE JMP STREAD /GO PERFORM THE WRITE OPERATION CLL CLA IAC RTL /AC=4 FOR READ AND FN /MASK THE CURRENT FUNCTION SZA CLA /SKIP IF IT IS A WRITE JMP EXIT /ALL DONE STL /SET FOR READ / /MIDDLE OF MAIN LOOP / STREAD, CLA IAC /SET VOLUME AND BLOCK RDSC /AND DO THE COMMAND JMS WAIT /WAIT FOR TR SKP /TR SEEN JMP ERROR /DID NOT WANT TO SEE DONE RDTD /VOLUME NUMBER TO RD JMS WAIT /WAIT FOR TR SKP /TR SEEN JMP ERROR TAD LREC /THE LOW ORDER TWELVE BITS OF BLOCK NUMBER RDTD /SEND IT TO THE INTERFACE JMS WAIT SKP /TR SEEN. SEND THE FINAL PART OF SET VOLUME COMMAND JMP ERROR /DONE SEEN TO EARLY RDTD /ALWAYS ZERO JMS WAIT JMP ERROR TAD FN RDSC JMS WAIT JMP ERROR ISZ LREC /POINT TO NEXT RECORD. SNL CLA /SEE IF THERE IS MORE TO DO JMP TOP /GO BACK AND DO IT EXIT, ISZ FETCH /UPDATE THE RETURN EXFLD, HLT /USER FIELD JMP I FETCH /AND EXIT FETCH, 0 BC, 0 FN, 0 RDWC, 0 /BLOCK WORD COUNT BUF, 0 LREC, 0 /LOW WORD OF BLOCK NUMBER K2, 2 K3, 3 K4, 4 TEMP, 0 /TEMP STORAGE FOR DATA FROM CONTROLLER K23, 23 /NEEDED TO MAKE FILL OR EMPTY COMMAND LCDIF0, 6203 /CIF CDF 0 LCDF0, CDF 0 DENSW, 7400 / /WAIT FOR A FLAG FROM THE WINCHESTER / WAIT, 0 RDSR SKP /NOT TR JMP I WAIT RDSD /NOW FOR DONE JMP WAIT+1 /NOT YET ISZ WAIT /DONE SET UP RETURN TO CALLER +2 RDSE /NOW TEST FOR THE ERROR FLAG JMP I WAIT /NO ERROR FLAG ERROR, AC4000 /TAKE THE ERROR EXIT JMP EXFLD /AND RETURN TO CALLER $$$$$