.MCALL .MODULE .MODULE DS,VERSION=06,COMMENT=,AUDIT=YES ; COPYRIGHT (c) 1984,1985,1986 BY ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ALL RIGHTS RESERVED. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ; ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE ; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER ; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ; OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY ; TRANSFERRED. ; ; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ; AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT ; CORPORATION. ; ; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. .SBTTL CONDITIONAL ASSEMBLY SUMMARY ;+ ;COND ; RJS0$3 (1) RJS03/4 support (only changes dev size) ; 0 RJS0? support ; 1 RJS0? support ; ; DS$CSR (172040) CSR ; DS$VEC (204) Vector ; ; MMG$T std conditional ; TIM$IT std conditional (no code effects) ; ERL$G std conditional ;- .SBTTL MACROS AND DEFINITIONS .MCALL .DRDEF .ADDR .ASSUME .IIF NDF RJS0$3, RJS0$3 == 1 ;DEFAULT TO RJS03 .IIF NE RJS0$3, RJS0$3=1 ;ENSURE 1 OR 0 .DRDEF DS,16,FILST$,2000*<2-RJS0$3>,172040,204 .DRPTR .DREST CLASS=DVC.DK ; RS CONTROL & STATUS REGISTERS, ETC. RSCS2 =: DS$CSR+10 ;CONTROL & STATUS 2 RSER =: DS$CSR+14 ;ERROR SUMMARY RSDT =: DS$CSR+26 ;DRIVE TYPE RSNREG =: 12. ;# OF REGISTERS TO READ FOR ERROR LOG. RSCNT =: 8. ;RETRY COUNT .SBTTL CONTROLLER REGISTER DEFINITIONS ; FUNCTION CODE DEFINITIONS FNNOP =: 00*2 ;NO OPERATION FNCLR =: 04*2 ;DRIVE CLEAR FNSCH =: 14*2 ;SEARCH FNWCK =: 24*2 ;WRITE CHECK FNWRT =: 30*2 ;WRITE FNRED =: 34*2 ;READ ; BITS IN RSCS (CONTROL AND STATUS REGISTER) CSSC =: 100000 ;SPECIAL CONDITION CSTRE =: 40000 ;TRANSFER ERROR CSMCPE =: 20000 ;MASSBUS I/O CONTROL BUS PARITY ERROR CSDVA =: 4000 ;DRIVE AVAILABLE CSPSEL =: 2000 ;PORT SELECT CSA17 =: 1000 ;UNIBUS ADDRESS BIT 17 CSA16 =: 400 ;UNIBUS ADDRESS BIT 16 CSRDY =: 200 ;READY CSIE =: 100 ;INTERRUPT ENABLE ;BITS 5-1 ARE FUNCTION CODE CSGO =: 1 ;GO BIT ; BITS IN RSCS2 (CONTROL AND STATUS REGISTER 2) C2DLT =: 100000 ;DATA LATE C2WCE =: 40000 ;WRITE CHECK ERROR C2PE =: 20000 ;PARITY ERROR C2NED =: 10000 ;NON-EXISTENT DRIVE C2NEM =: 4000 ;NON-EXISTENT MEMORY C2PGE =: 2000 ;PROGRAM ERROR C2MXF =: 1000 ;MISSED TRANSFER C2MDPE =: 400 ;MASSBUS I/O DATA BUS PARITY ERROR C2OR =: 200 ;OUTPUT READY C2IR =: 100 ;INPUT READY C2CLR =: 40 ;CONTROLLER CLEAR C2PAT =: 20 ;PARITY TEST C2BAI =: 10 ;UNIBUS ADDRESS INCREMENT INHIBIT ;BITS 2-0 ARE UNIT SELECT ; BITS IN RSDS (DRIVE STATUS REGISTER) DSATA =: 100000 ;ATTENTION ACTIVE DSERR =: 40000 ;ERROR SUMMARY DSPIP =: 20000 ;POSITIONING IN PROGRESS DSMOL =: 10000 ;MEDIUM ON LINE DSWRL =: 4000 ;WRITE LOCKED DSLBT =: 2000 ;LAST BLOCK TRANSFERRED DSDPR =: 400 ;DRIVE PRESENT DSDRY =: 200 ;DRIVE READY ;BITS 6-0 ARE UNUSED ; BITS IN RSER (ERROR REGISTER) ERDCK =: 100000 ;DATA CHECK ERUNS =: 40000 ;UNSAFE EROPI =: 20000 ;OPERATION INCOMPLETE ERDTE =: 10000 ;DRIVE TIMING ERROR ERWLE =: 4000 ;WRITE LOCK ERROR ERIAE =: 2000 ;INVALID ADDRESS ERROR ERAO =: 1000 ;ADDRESS OVERFLOW ERPAR =: 10 ;BUS PARITY ERROR ERRMR =: 4 ;REGISTER MODIFICATION REFUSED ERILR =: 2 ;ILLEGAL REGISTER ERILF =: 1 ;ILLEGAL FUNCTION ; BITS IN RSDT (DRIVE TYPE REGISTER) DTRS04 =: 2 ;DRIVE IS RS04 DTINTL =: 1 ;SECTOR INTERLEAVE ; RMON REFERENCES SYSPTR =: 54 ; SYSCOM pointer to RMON CONFG2 =: 370 ; second configuration word PROS$ =: 020000 ; Running on PRO3xx .SBTTL INSTALLATION CODE .DRINS DS BR 10$ ;Data device installation check .ASSUME . EQ INSSYS BR 20$ ;System device installation check (none) 10$: MOV @#SYSPTR,R0 ; get address of RMON BIT #PROS$,CONFG2(R0) ; is this a PRO3xx? BNE 30$ ; yes, don't install 20$: TST (PC)+ ; clear carry, skip setting carry 30$: SEC ; set carry RETURN .Assume . LE 400,MESSAGE=<;Install area overflow> .SBTTL DRIVER ENTRY .ENABL LSB .DRBEG DS MOV #RSCNT,(PC)+ ;SET RETRY COUNT RSTRY: .WORD 0 RSINIT: MOV DSCQE,R5 ;R5 -> CURRENT QUEUE ELEMENT MOV (R5)+,R3 ;R3 = BLOCK NUMBER .ASSUME Q$BLKN+2 EQ Q$FUNC MOV (R5)+,-(SP) ;GET UNIT NUMBER SWAB @SP ;PUT IT IN THE LOW BYTE BIC #^C<7>,@SP ;ISOLATE IT MOV #RSCS2,R4 ;R4 -> CONTROL & STATUS REG 2 MOV #C2CLR,@R4 ;CONTROLLER CLEAR MOV (SP)+,@R4 ;SET UNIT NUMBER MOV #1,(PC)+ ;ASSUME RS04 RSTYPE: .WORD 0 ;1 IS RS04, 3 IS RS03 BIT #DTRS04,@#RSDT ;CHECK DRIVE TYPE BNE 1$ ;BRANCH IF RS04 MOV #3,RSTYPE ;SET TYPE TO RS03 ASL R3 ;RS03, ACCOUNT FOR 64 WORD SECTORS BCS RSERR ;IF TOO BIG, GIVE IMMEDIATE ERROR 1$: CMP #2048.,R3 ;VALID BLOCK NUMBER? BLOS RSERR ;NOPE ASL R3 ;CONVERT TO SECTOR AND TRACK ADDRESS MOV R3,-(R4) ;SET BLOCK NUMBER .IF EQ MMG$T .ASSUME Q$FUNC+2 EQ Q$BUFF MOV (R5)+,-(R4) ;SET BUFFER ADDRESS .IFF CALL @$MPPTR ;COVERT TO PHYSICAL ADDRESS MOV (SP)+,-(R4) ;LOAD LOW 16 BITS MOV (SP)+,R2 ;GET HIGH-ORDER ADDRESS BITS <21:18> BIT #1700,R2 ;22-BIT ADDRESS SPECIFIED? BNE RSERR ;YES, NOT VALID FOR THIS CONTROLLER ASH #4,R2 ;NO, SHIFT BITS <05:04> TO ; POSITIONS <09:08> .ENDC ;EQ MMG$T .ASSUME Q$BUFF+2 EQ Q$WCNT MOV @R5,R5 ;GET WORD COUNT INTO R5 RSFIX: MOV #CSIE!FNWRT!CSGO,R3 ;ASSUME WRITE OPERATION MOV R5,-(R4) ;SET WORD COUNT BEQ RSEXIT ;SEEK EXITS IMMEDIATELY BMI 2$ ;NEGATIVE COUNT MEANS WRITE, GOOD GUESS NEG @R4 ;READ, FIX WORD COUNT TO BE NEGATIVE MOV #CSIE!FNRED!CSGO,R3 ;SET READ CODE 2$: .IF NE MMG$T BIS R2,R3 ;SET IN EXTENSION ADDRESS BITS .ENDC ;NE MMG$T MOV R3,-(R4) ;START THE TRANSFER RETURN .DSABL LSB .SBTTL INTERRUPT SERVICE ENTRY POINT .ENABL LSB .DRAST DS,5 .FORK RSFBLK ;GO TO FORK LEVEL MOV #RSCS2,R4 ;POINT TO CSR 2 MOV DSCQE,R5 ;POINT TO CURRENT QUEUE ELEMENT TST @#DS$CSR ;ANY ERRORS? BMI 1$ ;YES, RECOVER IF POSSIBLE TST Q$WCNT(R5) ;ARE WE DOING A READ OR WRITE? BPL RSDONE ;ALL DONE IF READ BIT RSTYPE,-(R4) ;ARE WE AT END OF 256 WORD BLOCK? BEQ RSDONE ;BRANCH IF SO .ADDR #RSZERO,R3 ; ZERO WORD MOV R3,-(R4) ;SET BUS ADDRESS MOV #-1,R5 ;SET WORD COUNT OF 1 WORD .IF NE MMG$T CLR R2 ;DTW .ENDC ;NE MMG$T BR RSFIX ;START WRITE ; ERROR IN TRANSFER. LOG IT IF NECESSARY, RETRY IF POSSIBLE 1$: DEC RSTRY ;COUNT DOWN NUMBER OF RETRIES BLE RSFATL ;OUT OF TRIES, THERE IS NO HOPE BIT #C2NED!C2NEM,@R4 ;FATAL ERROR IN CONTROLLER? BNE RSFATL ;YES, DO NOT RETRY IF NO HOPE BIT #ERUNS!ERWLE!ERIAE!ERAO!ERRMR!ERILR!ERILF,@#RSER ;FATAL DISK? .IF EQ ERL$G BEQ RSINIT ;NO, GO TRY AGAIN RSFATL: .IFF BEQ 2$ ;MIGHT BE WORTH A RETRY RSFATL: CLR RSTRY ;CLEAR RETRY COUNTER TO AVOID RETRIES 2$: .ADDR #RSRBUF,R2 ;GET ADDRESS TO SAVE REGISTERS. MOV R2,R1 ;COPY ADDRESS TO USE FOR MOVING MOV #RSCNT*400+RSNREG,R3 ;R3 = # REGS/TOTAL RETRY COUNT MOV R3,R4 ;COPY NUMBER OF REGISTERS MOV #DS$CSR,R0 ;GET ADDRESS OF REGISTERS 3$: MOV (R0)+,(R1)+ ;MOVE REGISTERS TO BUFFER DECB R4 ;TEST IF DONE BNE 3$ ;NO MOV #DS$COD*400,R4 ;GET DEVICE ID IN HIGH BYTE. BISB RSTRY,R4 ;MERGE IN THE RETRY COUNT CALL @$ELPTR ;CALL ERROR LOGGER AT FORK LEVEL. TSTB RSTRY ;SHOULD WE RETRY? BGT RSINIT ;YES .ENDC ;NE ERL$G RSERR: MOV DSCQE,R4 ;R4 -> CURRENT QUEUE ELEMENT .ASSUME Q$BLKN-2 EQ Q$CSW BIS #HDERR$,@-(R4) ;INDICATE HARD ERROR MOV #C2CLR,@#RSCS2 ;ISSUE CONTROLLER CLEAR .IF NE ERL$G BR RSEXIT ; AND GET OUT RSDONE: MOV #DS$COD*400+377,R4 ;SUCESS, -1 IN LOW BYTE, ID IN HIGH BYTE CALL @$ELPTR ;LOG THE SUCCESS .IFF RSDONE: .ENDC ;NE ERL$G RSEXIT: .DRFIN DS ;GO TO I/O COMPLETION .DSABL LSB RSZERO: .WORD 0 ;USED FOR ZERO FILL AT END OF BLOCK RSFBLK: .WORD 0,0,0,0 ;FORK QUEUE BLOCK .IF NE ERL$G RSRBUF: .BLKW RSNREG ;ERROR LOG STORAGE OF REGISTERS .ENDC ;NE ERL$G .SBTTL BOOTSTRAP DRIVER .DRBOT DS,BOOT1,READ . = DSBOOT+40 ;PUT THE JUMP BOOT INTO SYSCOM AREA BOOT1: JMP @#BOOT-DSBOOT ;START THE BOOTSTRAP . = DSBOOT+210 READ: MOV R0,R4 ;COPY BLOCK NUMBER MOV #RSCS2,R5 ;POINT TO REGISTERS MOV @R5,-(SP) ;SAVE UNIT # MOV #C2CLR,@R5 ;CONTROLLER CLEAR BIT #DTRS04,16(R5) ;WHAT IS IT? BNE 1$ ;IT'S AN RS04 ASL R4 ;IT'S AN RS03 1$: ASL R4 ;CONVERT TO TRACK/SECTOR BIC #^C<7>,@SP ;STRIP TO UNIT BITS MOV (SP)+,@R5 ;SET UNIT MOV R4,-(R5) ;SET BLOCK MOV R2,-(R5) MOV R1,-(R5) NEG @R5 MOV #FNRED!CSGO,-(R5) ;GO, READ, NO INTERRUPT 2$: BIT #CSSC!CSRDY,@R5 ;WAIT FOR DONE OR ERROR BEQ 2$ BMI BIOERR ;HARD HALT ON ERROR CLC ;MAKE SURE CARRY BIT IS CLEAR BEFORE RETURN RETURN . =DSBOOT+604 BOOT: MOV #10000,SP ;SET STACK POINT MOV @#RSCS2,-(SP) ;GET THE UNIT NUMBER BIC #^C7,@SP ;STRIP TO THREE BITS MOV #2,R0 ;READ IN SECOND PART OF BOOT MOV #<4*400>,R1 ;EVERY BLOCK BUT THE ONE WE ARE IN MOV #1000,R2 ;INTO LOCATION 1000 CALL READ ;GO READ IT IN MOV #READ-DSBOOT,@#B$READ ;STORE START LOCATION OF READ ROUTINE MOV #B$DNAM,@#B$DEVN ;STORE RAD50 DEVICE NAME MOV (SP)+,@#B$DEVU ;STORE THE UNIT NUMBER TO BOOT FROM JMP @#B$BOOT ;START SECONDARY BOOT .DREND DS .END