.NLIST .INCLUDE /ASCII.MAC/ .INCLUDE /HWDF.MAC/ .INCLUDE /DSMAC.MAC/ .INCLUDE /MYMAC.MAC/ .LIST MODULE NAME=, VER=<01>, COMM=, TYPE= .NLIST .INCLUDE /XXDPCM.MAC/ .INCLUDE /XXDPDF.MAC/ .LIST FROM DZQUDE IMPORT BEGIN FROM DZQUDE IMPORT SAV04, RESR7 FROM DZQUDE IMPORT BMOVE FROM DZQUDE IMPORT CMPNAM FROM DZQUDE IMPORT UPKNAM FROM DZQUDE IMPORT BKREAD, NXTBLK FROM DZQUDE IMPORT DELAY FROM DZQUDE IMPORT DEVERR, INVCMD FROM DZQUDE IMPORT $TXNAM, $BUF, $BUF2 FROM DZQUDE IMPORT DIRECT FROM DZQUDE IMPORT D$RUNI EXPORT QUALIFIED X$XDRV, DR$TRA EXPORT QUALIFIED SETPRM, LOOKUP .SBTTL RK05 device structure ; Registers DKCSR. =: ^O<177404> ; csr DK.STS =: ^O<-4> ; drive status register ; ; Status ; DK.RDY =: ^O<100> DK.ERR =: ^O<-2> ; error register DK.CSR =: ^O<0> ; control status register ; ; CSR definitions ; DKERR$ =: ^O<100000> ; Error DKHER$ =: ^O<40000> ; Hard error DKRDY$ =: ^O<200> ; Operation complete ("drive ready") DKWL. =: ^O<7*2> ; 16 ; Write Lock DKDRS. =: ^O<6*2> ; 14 ; Drive Reset DKRDC. =: ^O<5*2> ; 12 ; Read Check DKSIK. =: ^O<4*2> ; 10 ; Seek DKWRC. =: ^O<3*2> ; 06 ; Write Check DKRID. =: ^O<2*2> ; 04 ; Read DKWRT. =: ^O<1*2> ; 02 ; Write DKRST. =: ^O<0*2> ; 00 ; Controller Reset DKGO$ =: ^O<1> ; Go DK.WC =: ^O<2> ; word count (negative, increment until 0) DK.BUF =: ^O<4> ; current bus address register DK.DA =: ^O<6> ; disk address register ; ; Disk Addr ; DKSECC =: ^D<12> ; Sectors on track DKSEC. =: ^O<17> ; sector address bits (3..0) DKHID. =: ^O<20> ; head (4) DKCYL. =: ^O<40> ; cylinder (n*DKCYL.) (12..5) DKDN. =: ^C<^O<160000>> ; disk No (mask) (15..13) .PSECT XXDP9 PARAM: ; ; Boot, Directory, Zero, Delete, Close, Enter, Lookup, Allocate, Service routine (driver), Driver number index ; $PDDB1 GBOOT, DIRECT, INVCMD, INVCMD, INVCMD, INVCMD, LOOKUP, INVCMD, DR$TRA, 0 ; ; Command register, Word count, Bus address, Block number, Command, Read, Write ;, Request block count, 1st directory block, Last block # allocated ; $PDDB2 DKCSR., 0, 0, 0, 0, 5, 3, 0, X$XDRV, 0 X$XDRV: ; UFD start block, UFD block count, BITMAP start block, BITMAP block count, MFD1, MFD2 ; , Size, Preallocated block, Interleave, Boot block, Monitor core image block $FSDEF 3, 16, 4795, 5, 1, 4794, 4800, 69, 5, 0, 24 PROCEDURE SETPRM BEGIN LET R0 := #PARAM RETURN END SETPRM PROCEDURE DR$TRA BEGIN JSR R4, SAV04 LOOP LET R3 := (R5) ; XCM - Command register LET R1 := XDT(R5) ; Block number LET R2 := #DKSECC ; 12 sectors LET R0 := #0 ; Cylinder and head LOOP LET R1 := R1 - R2 ; Next 12 sectors IF RESULT IS LO LEAVE LOOP LET R0 := R0 + #DKHID. END LET R1 := R1 + R2 ; Correct sector LET R0 := R0 + R1 ; Cylinder, head, sector LET R1 := XDN(R5) ; Driver number index CCC LET R1 := R1 R.ROTATE 4 ; Drive number into correct place LET R0 := R0 SET.BY R1 ; Drive number, cylinder, head, sector LET DK.DA(R3) := R0 ; To RK11 register LET DK.WC(R3) := XWC(R5) ; Word count LET DK.WC(R3) := - DK.WC(R3) ; Negative LET DK.BUF(R3) := XBA(R5) ; Bus address LET (R3) := XCO(R5) ; Command CALL RKWAIT ; Wait - ready or error ;GOTO LoopBegin ; skipped on success END JUMPTO RESR7 END DR$TRA PROCEDURE RKWAIT BEGIN REPEAT ; Wait UNTIL #DKERR$!DKRDY$ SET.IN (R3) ; Until ready or error IF RESULT IS PL THEN ; If not error LET TOP := TOP + #2 ; Skip next command after call 10$: RETURN ; End return END ; Else LET R0 := (R3) ; CSR LET (R3) := #DKRST.!DKGO$ ; Controller reset CALL DELAY ; Delay IF #DKHER$ OFF.IN R0 GOTO 10$ ; If not hard error - return JUMPTO DEVERR ; Else - Device Error END RKWAIT ; ; Lookup file ; PROCEDURE LOOKUP BEGIN CALL GBOOT ; Set first block of UFD LET XDT(R5) := @XDR(R5) ; @Index to 1st directory (UFD) block pointer -> Index to block number LET R0 := #0 LET R2 := #0 CALL BKREAD LOOP LET R1 := $BUF2 ; Pointer to buffer at 2 word (skip link word) LET R2 := R2 + #^D ; next 28. entries per block LOOP IF XFLMOD(R5) EQ #0 GOTO 20$ ; File mode indicator IF R0 HIS XFLCNT(R5) GOTO 20$ ; File count 10$: LET R0 := R0 + #1 ; Current file index IF R0 HIS R2 LEAVE LOOP ; If current file index > Max file index LET R1 := R1 + #EN.BBS ; Next entry END CALL NXTBLK GOTO 70$ ; Error exit END 20$: LET XFLCNT(R5) := XFLCNT(R5) + #1 ; Index to file count IF (R1) EQ #0 THEN ; if empty/deleted entry? IF EN.DAT(R1) EQ #0 GOTO 70$ ; ?? GOTO 10$ END LET 40$ := R1 ; Name at UFD pointer LET 30$ := $TXNAM ; Buffer for name JSR R5, UPKNAM ; Unpack name 30$: .WORD 0 40$: .WORD 0 JSR R5, CMPNAM ; Compare name GOTO 10$ ; No match exit LET 50$ := R5 + #XSVNAM ; Destination LET 60$ := R1 ; Source JSR R5, BMOVE ; Move 50$: .WORD 0 60$: .WORD 0 .WORD EN.BBS LET TOP := TOP + #2 ; Matched exit 70$: RETURN END LOOKUP ; ; Get into File System definition block - first block of UFD, first block of monitor core image ; R0 - boot block number ; R1 - first block of monitor core image ; PROCEDURE GBOOT BEGIN LET R4 := XDR(R5) ; Index to 1st directory block pointer - UFD block LET XDT(R5) := H2.MFD(R4) ; MFD CALL BKREAD ; Read LET R0 := $BUF ; Buffer pointer IF (R0) EQ #0 THEN ; If link to MFD2 zero (variety 2) TST (R0)+ ; Skip first word LET H2.UFD(R4) := H2.UFD(R0) ; Get first UFD block LET H2.MON(R4) := H2.MON(R0) ; Get first block of monitor core image ELSE END LET R0 := H2.BOO(R4) ; 0 LET R1 := H2.MON(R4) ; Get first block of monitor core image RETURN END GBOOT .ASECT .=^O<0> BBSZ =: ^O<1000> ; boot block size BBCNT =: ^O ; boot block count X$XLOW: PROCEDURE BO$PRI BEGIN NOP GOTO BO$ENG END BO$PRI .WORD .+2 ; V4 HALT .WORD .+2 ; V10 HALT B.LKB <^O<70-14>> ; 14..66 PROCEDURE BO$ENG BEGIN LET R2 := @#DKCSR.+DK.DA LOOP LET R2 := R2 OFF.BY #DKDN. SET.BY #DKCYL. LET @#DKCSR.+DK.DA := R2 LET SP := #40000 LET @#DKCSR.+DK.WC := #-MONCNT LET @#DKCSR.+DK.BUF := #0 LET @#DKCSR. := #DKRID.!DKGO$ REPEAT BIT #DKERR$!DKRDY$, @#DKCSR. IF RESULT IS MI GOTO 10$ UNTIL RESULT IS NE GOTO 20$ 10$: LET R0 := @#DKCSR. LET R1 := @#DKCSR.+DK.ERR LET @#DKCSR. := #DKRST.!DKGO$ HALT LET @#DKCSR.+DK.DA := R2 LET @#DKCSR. := #DKDRS.!DKGO$ REPEAT UNTIL #DK.RDY SET.IN @#DKCSR.+DK.STS END 20$: LET @#DKCSR. := #DKWL.!DKGO$ LET R2 := R2 OFF.BY #DKDN. CLC LET R2 := R2 L.ROTATE 4 LET D$RUNI := R2 LET @#DKCSR. := #DKRST.!DKGO$ JUMPTO BEGIN END BO$ENG B.LKB <^O> ; boot round-up END RKDRV .END