.MCALL .MODULE .MODULE RF,VERSION=06,COMMENT=,AUDIT=YES ; Copyright (c) 1998 by Mentec, Inc., Nashua, NH. ; All rights reserved ; ; This software is furnished under a license for use only on a ; single computer system and may be copied only 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 except for use on such ; system and to one who agrees to these license terms. Title ; to and ownership of the software shall at all times remain ; in Mentec, Inc. ; ; The information in this document is subject to change without ; notice and should not be construed as a commitment by Digital ; Equipment Corporation, or Mentec, Inc. ; ; Digital and Mentec assume no responsibility for the use or ; reliability of its software on equipment which is not supplied ; by Digital or Mentec, and listed in the Software Product ; Description. .SBTTL CONDITIONAL ASSEMBLY SUMMARY ;+ ;COND ; ; $RFNUM (1) number of platters ; ; MMG$T std conditional ; TIM$IT std conditional (no code effects) ; ERL$G std conditional ;- .MCALL .DRDEF .ASSUME .GLOBL $RFNUM .IIF NDF $RFNUM, $RFNUM=1 ;DEFAULT TO ONE PLATTER .DRDEF RF,12,100012,2000*$RFNUM,177460,204,DMA=NO .DRPTR .DREST CLASS=DVC.DK RFCS = RF$CSR RFWC = RFCS+2 ;WORD COUNT RFMA = RFCS+4 ;MEMORY ADDR RFDA = RFCS+6 ;DISK ADDR RFAE = RFCS+10 ;ADDRESS EXTENTION CMAINH = 400 ;INHIBIT INCREMENT OF MEMORY ADDRESS ; CONSTANTS FOR MONITOR COMMUNICATION RD = 105 WR = 103 ; ERROR LOG CONSTANTS RFIDEN = 5000 ;RF DEVICE ID 12 IN HIGH BYTE ;0 IN LOW BYTE TO STORE CURRENT RETRY COUNT. RFIDS = 5377 ;RF DEVICE ID 12 IN HIGH BYTE ;-1 IN LOW BYTE FOR I/O SUCCESS RFRCNT = 3400 ;RETRY COUNT 7 IN HIGH BYTE RFNREG = 10 ;NUMBER OF REGISTERS TO READ FOR ERROR LOG. RFREGA = 177460 ;FIRST REGISTER TO READ FOR ERROR LOG. .SBTTL INSTALLATION CHECK .DRINS RF NOP ;NON-SYSTEM INSTALLATION SAME AS SYSTEM MOV INSCSR,R0 ;GET THE CSR TSTB -20(R0) ;IF MAYBE RK06 OR RC11, CHECK CONTROLLER READY BCS 1$ ;NO SUCH ADDRESS, THIS MUST BE RF! BPL 1$ ;RESPONDS, BUT POSSIBLE RK06/RC11 BUSY, PUNT MOV #-2,-6(R0) ;TRY TO LOAD RMDS IN CASE RK06 BCS 1$ ;NO SUCH ADDRESS, THIS IS PROBABLY THE RF CMP #-2,-6(R0) ;DID IT LOAD? (RC11 WILL, RK06 WON'T) BNE 2$ ;NO, THIS IS ALMOST CERTAINLY AN RK06 1$: TST (PC)+ ;CLEAR CARRY TO INSTALL RF 2$: SEC ;SET CARRY TO AVOID INSTALLING RK06 RTS PC .ASSUME . LE 400,<;INSTALL area overflow> .SBTTL DRIVER ENTRY POINT .DRBEG RF ENTRY: MOV #7,(PC)+ ;LOAD RETRY COUNT RFTRY: .WORD 0 AGAIN: JSR R0,RFCOMN ;DO COMMON STUFF TO START ZERO: .WORD 0 ;NO INHIBIT INCREMENT .IF EQ MMG$T MOV (R5)+,-(R4) ;BUFFER ADDRESS TO RFMA .IFF JSR PC,@$MPPTR ;MAP TO PHYSICAL ADDRESS MOV (SP)+,-(R4) ;STORE LOW 16 BITS IN RFMA MOV (SP)+,R3 ;GET HIGH-ORDER ADDRESS BITS <21:18> BIT #1700,R3 ;22-BIT ADDRESS SPECIFIED? BNE RFHER ;YES, NOT VALID FOR THIS CONTROLLER .ENDC ;EQ MMG$T MOV (R5)+,-(R4) ;WORD COUNT MOV #WR,R5 ;ASSUME WRITE TST @R4 ;CHECK WORD COUNT BEQ RFEXIT ;NO I/O ! BMI 1$ ;WRITE WAS RIGHT MOV #RD,R5 ;NO, READ NEG @R4 ;NEGATE WORD COUNT 1$: .IF NE MMG$T BIS R3,R5 ;SET EXTENDED MEMORY BITS. .ENDC ;NE MMG$T MOV R5,-(R4) ;START IT MOVING RTS PC ;OK, GANG ; INTERRUPT ROUTINE .DRAST RF,5,RFABORT ;DRIVER AST ENTRY TABLE MOV RFCQE,R5 ;R5=POINTER TO CQE TST @#RFCS ;TEST FOR ERROR BPL RFFILL ;IF B15 OFF GO HOME .FORK RFFBLK ;REQUEST A FORK ON AN ERROR. .IF NE ERL$G BIT #6000,@#RFCS ;DO NOT LOG USER ERRORS. BNE RFHER ;USER ERROR BIT #2000,@#RFAE BNE RFHER ;USER ERROR. MOV PC,R1 ;R1 -> BUFFER TO STORE REGISTERS. ADD #RFRBUF-.,R1 MOV R1,R2 ;SAVE ADDRESS IN R2 FOR CALL TO ERROR LOG. MOV #RFNREG,R4 ;R4 = # OF REGISTERS TO READ. MOV #RFREGA,R3 ;R3 = ADDRESS TO READ FROM RFRREG: MOV (R3)+,(R1)+ ;READ I/O PAGE DEC R4 BNE RFRREG MOV #RFNREG,R3 ;R3 = # OF REGISTERS FOR ERROR LOG TO FETCH IN LOW BYTE ADD #RFRCNT,R3 ;R3 = TOTAL RETRY COUNT IN HIGH BYTE MOVB RFTRY,R4 ;R4 = CURRENT RETRY COUNT IN LOW BYTE DEC R4 ;AFTER IT IS DECREMENTED BELOW. ADD #RFIDEN,R4 ;R4 = DEVICE ID IN HIGH BYTE. JSR PC,@$ELPTR ;R5 = RFCQE ADDRESS OF 3RD WORD OF QUEUE ELEMENTS. .ENDC ;NE ERL$G RFRETY: DEC RFTRY ;ANY RETRIES LEFT? BGT AGAIN ;YES, "ONE MORE TIME..." RFHER: MOV RFCQE,R5 ;R5->CURRENT QUEUE ELEMENT BIS #HDERR$,@-(R5) ;SET HARD ERROR FLAG IN CSW .IF NE ERL$G BR RFEXIT ;EXIT ON ERROR RFHOME: .FORK RFFBLK ;CALL ERROR LOG AT FORK LEVEL. MOV #RFIDS,R4 ;R4 = ID IN HIGH BYTE, -1 LOW MOV RFCQE,R5 ;R5 -> 3RD WORD OF QUEUE ELEMENT. JSR PC,@$ELPTR .IFF RFHOME: .ENDC ;NE ERL$G RFEXIT: .DRFIN RF ;GO TO I/O COMPLETION RFABORT:MOV #400,@#RFCS ;POWER CLEAR TO ABORT CLR RFFBLK+2 ;DON'T ENTER FORK SERVICE NOW BR RFEXIT RFFILL: JSR R0,RFCOMN ;DO COMMON START .WORD CMAINH MOV 2(R5),R5 ;GET WORD COUNT BPL RFHOME ;IT WAS A READ, NO NEED TO FILL TSTB R5 ;WAS IT AN EVEN # OF BLOCKS? BEQ RFHOME ;YEP NEG R5 ;MAKE IT POSITIVE ADD R5,@R4 ;FIX UP RF DISK ADDRESS ADC 2(R4) ;INCLUDING ADDRESS EXTENSION BIS #177400,R5 ;MAKE IT LESS THAN 256 WORDS MOV PC,-(R4) ;POINT MEMORY ADDRESS TO A 0 ADD #ZERO-.,@R4 ;(PIC) MOV R5,-(R4) ;SET WORD COUNT MOV #WR,-(R4) ;START IT WRITING RTS PC ;OUT POPHOM: MOV (SP)+,R0 ;RESTORE R0 BR RFHOME RFCOMN: MOV #RFAE,R4 ;POINT TO ADDRESS EXTENSION REG BIT @R0,@R4 ;DID WE JUST FINISH FILLING? BNE POPHOM ;YES. FILL CALLED US, BUT GO FINISH MOV #400,@#RFCS ;POWER CLEAR THE RF MOV RFCQE,R5 ;GET Q ELT POINTER MOV (R5)+,-(SP) ;GET BLOCK NUMBER SWAB @SP ; * 256 = ADDRESS ON DISK MOV @SP,@R4 ;SET ADDRESS EXTENSION FROM HIGH BITS BIC #177740,@R4 ;ONLY THE RELEVANT BITS BIS (R0)+,@R4 ;TURN ON INHIBIT IF NEEDED CLRB @SP ;ROUND ACTUAL ADDRESS TO BLOCK MOV (SP)+,-(R4) ;SET RFDA TST (R5)+ ;ADVANCE OVER UNIT # RTS R0 ;RETURN RFFBLK: .WORD 0,0,0,0 ;FORK QUEUE BLOCK .IF NE ERL$G RFRBUF: .BLKW RFNREG ;ERROR LOG STORAGE OF REGISTERS. .ENDC ;NE ERL$G .SBTTL BOOTSTRAP DRIVER .DRBOT RF,BOOT1,READ . = RFBOOT+40 ;PUT THE JUMP BOOT IN SYSCOM AREA BOOT1: JMP BOOT ;START THE BOOTSTRAP . = RFBOOT+120 READ: MOV #RFDA,R3 ;POINT TO DISK ADDRESS MOV R0,R5 ;COPY BLOCK NUMBER SWAB R5 ;MULTIPLY BY 256 TO GET WORD # ON DISK MOV R5,R4 ;SAVE HIGH ORDER DISK ADDRESS CLRB R5 ;MAKE DA AN EVEN BLOCK NUMBER MOV R5,(R3)+ ;PUT LOW ORDER ADDRESS IN CONTROLLER BIC #177740,R4 ;ISOLATE HIGH ORDER ADDRESS MOV R4,@R3 ;PUT IT IN CONTROLLER TST -(R3) ;RESET POINTER MOV R2,-(R3) ;BUFFER ADD. MOV R1,-(R3) ;WORD COUNT NEG @R3 ;(NEGATIVE) MOV #5,-(R3) ;START DISK READ 3$: TSTB @R3 ;WAIT UNTIL COMPLETE BPL 3$ TST @R3 ;ANY ERRORS? BMI 4$ ;HARD HALT ON ERROR CLC ;MAKE SURE CARRY BIT IS CLEAR BEFORE RETURN RETURN 4$: JMP BIOERR ;REPORT THE ERROR . = RFBOOT+614 BOOT: MOV #10000,SP ;SET STACK POINTER 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 MOV #READ-RFBOOT,@#B$READ ;STORE START LOCATION FOR READ ROUTINE MOV #B$DNAM,@#B$DEVN ;STORE RAD50 DEVICE NAME JSR PC,READ ;READ IN THE SECONDARY BOOT CLR @#B$DEVU ;STORE THE UNIT NUMBER JMP @#B$BOOT ;START SECONDARY BOOT .DREND RF .END