Return to BSD News archive
Newsgroups: comp.bugs.2bsd
Path: euryale.cc.adfa.oz.au!newshost.anu.edu.au!harbinger.cc.monash.edu.au!news.mel.connect.com.au!munnari.OZ.AU!news.hawaii.edu!ames!usenet.kornet.nm.kr!news.kreonet.re.kr!europa.chnt.gtegsc.com!wlbr!sms
From: sms@wlv.iipo.gtegsc.com (Steven M. Schultz)
Subject: Standalone support for RX02 added (#282)
Sender: news@wlbr.iipo.gtegsc.com (System Administrator)
Organization: GTE Government Systems, Thousand Oaks CA USA
Message-ID: <DJ5HJG.Lsr@wlbr.iipo.gtegsc.com>
X-Nntp-Posting-Host: wlv.iipo.gtegsc.com
Date: Wed, 6 Dec 1995 05:50:03 GMT
Lines: 1043
Subject: Standalone support for RX02 added (#282)
Index: pdpstand/rx.c,mdec/rx0{1,2}uboot.s 2.11BSD
Description:
Support has been added to 'boot' and the rest of the standalone
utilities for the RX02 (in both single and double density modes).
Boot blocks have also been created for the RX02 (again in both
single and double density).
Repeat-By:
Try to boot from an RX02.
Fix:
Many thanks go to Tim Shoppa (shoppa@krl.caltech.edu) for the
latest addition to 2.11BSD - all I did was provide answers to a
few questions on what a standalone driver and bootblock needs to
do.
The shar archive which follows contains two files:
1) A shar archive containing new files to be added to the
system. The files which will be added are:
/usr/src/sys/mdec/rx01uboot.s
/usr/src/sys/mdec/rx02uboot.s
/usr/src/sys/pdpstand/rx.c
2) A patch file. The following files are modified:
/etc/disktab
/VERSION
/usr/src/sys/mdec/Makefile
/usr/src/sys/pdpstand/conf.c
/usr/src/sys/pdpstand/Makefile
To install this update cut where indicated, saving to a file
(/tmp/282) and then:
cd /tmp
sh 282
sh 282.shar
patch -p0 < 282.patch
cd /sys/mdec
make
make install
make clean
cd /sys/pdpstand
make clean
make
cp boot /boot
At this point if you have any RX02 diskettes you wish to make
into 'boot media' you can do so by simply:
newfs /dev/rrx0b
dd if=/mdec/rx02uboot of=/dev/rrx0b count=1
mount /dev/rx0b /mnt
cp boot icheck restor mkfs disklabel /mnt
umount /dev/rx0b
================================cut here===================
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create:
# 282.shar
# 282.patch
# This archive created: Tue Dec 5 21:00:18 1995
export PATH; PATH=/bin:/usr/bin:$PATH
if test -f '282.shar'
then
echo shar: "will not over-write existing file '282.shar'"
else
sed 's/^Y//' << \SHAR_EOF > '282.shar'
Y#! /bin/sh
Y# This is a shell archive, meaning:
Y# 1. Remove everything above the #! /bin/sh line.
Y# 2. Save the resulting text in a file.
Y# 3. Execute the file with /bin/sh (not csh) to create:
Y# /usr/src/sys/mdec/rx01uboot.s
Y# /usr/src/sys/mdec/rx02uboot.s
Y# /usr/src/sys/pdpstand/rx.c
Y# This archive created: Tue Dec 5 20:54:50 1995
Yexport PATH; PATH=/bin:/usr/bin:$PATH
Yif test -f '/usr/src/sys/mdec/rx01uboot.s'
Ythen
Y echo shar: "will not over-write existing file '/usr/src/sys/mdec/rx01uboot.s'"
Yelse
Ysed 's/^X//' << \SHAR_EOF > '/usr/src/sys/mdec/rx01uboot.s'
YXMAJOR = 8 / major # from bdevsw[]
YX
YX/ RX02 single-density bootstrap.
YX/
YX/ 1995/12/02 - Now we have a boot for RX02!
YX/ Based on the RK05 bootstrap. Only 8 bytes
YX/ to spare, though. Should prove useful for those
YX/ who have only RX02 boot ROM's and use a MSCP
YX/ or RP/RM type system disk.
YX/ -Tim(shoppa@altair.krl.caltech.edu)
YX/
YX/ disk boot program to load and transfer
YX/ to a unix entry.
YX/ for use with 1 KB byte blocks, CLSIZE is 8.
YX/ NDIRIN is the number of direct inode addresses (currently 4)
YX/ assembled size must be <= 512; if > 494, the 16-byte a.out header
YX/ must be removed
YX
YX/ options: none. all options of reading an alternate name or echoing to
YX/ the keyboard had to be removed to make room for the
YX/ code which understands the new directory structure on disc
YX
YX/ constants:
YXBSIZE = 1024. / logical block size
YXDENS = 0. / 1 for double density, 0 for single density
YX / This is the only place you should have
YX / to change to switch this bootstrap for
YX / some other density.
YXWC = 64.*[1.+DENS] / word count per floppy sector
YXBC = 2.*WC / byte count per floppy sector
YXBCSHFT = 7.+DENS / shift to multiply by BC
YXCLSIZE = BSIZE\/BC / physical floppy sectors per logical block
YXCLSHFT = 3.-DENS / shift to multiply by CLSIZE
YXCLMASK = CLSIZE-1. / mask for getting CLSHFT bits
YX
YXINOSIZ = 64. / size of inode in bytes
YXNDIRIN = 4. / number of direct inode addresses
YXADDROFF = 12. / offset of first address in inode
YXINOPB = BSIZE\/INOSIZ / inodes per logical block
YXINOFF = 31. / inode offset = (INOPB * (SUPERB+1)) - 1
YXPBSHFT = -4 / shift to divide by inodes per block
YX
YX/ The boot options and device are placed in the last SZFLAGS bytes
YX/ at the end of core by the kernel for autobooting.
YXENDCORE= 160000 / end of core, mem. management off
YXSZFLAGS= 6 / size of boot flags
YXBOOTOPTS= 2 / location of options, bytes below ENDCORE
YXBOOTDEV= 4
YXCHECKWORD= 6
YX
YX.. = ENDCORE-512.-SZFLAGS / save room for boot flags
YX
YX/ entry is made by jsr pc,*$0
YX/ so return can be rts pc
YX
YX/ establish sp, copy
YX/ program up to end of core.
YX
YX nop / These two lines must be present or DEC
YX br start / boot ROMs will refuse to run boot block!
YXstart:
YX mov r0,unit
YX mov r1,csr
YX mov $..,sp
YX mov sp,r1
YX clr r0
YX1:
YX mov (r0)+,(r1)+
YX cmp r1,$end
YX blo 1b
YX jmp *$2f
YX
YX/ On error, restart from here.
YXrestart:
YX clr r0
YX/ clear core to make things clean
YX2:
YX clr (r0)+
YX cmp r0,sp
YX blo 2b
YX
YX mov $bootnm, r1
YX mov $2,r0 / ROOTINO
YX jsr pc,iget
YX clr r2 / offset
YXagain:
YX jsr pc,readdir
YX beq restart / error - restart
YX mov 4(r0),r4 / dp->d_namlen
YX cmp r4,$bootlen / if (bootlen == dp->d_namlen)
YX bne again / nope, go try next entry
YX mov r0,r3
YX add $6,r3 / r3 = dp->d_name
YX mov r1,r5 / r5 = filename
YX9:
YX cmpb (r3)+,(r5)+
YX bne again / no match - go read next entry
YX sob r4,9b
YX mov (r0),r0 / r0 = dp->d_ino
YX jsr pc,iget / fetch boot's inode
YX br loadfile / 'boot'- go read it
YX
YX/ get the inode specified in r0
YXiget:
YX add $INOFF,r0
YX mov r0,r5
YX ash $PBSHFT,r0
YX bic $!7777,r0
YX mov r0,dno
YX clr r0
YX jsr pc,rblk
YX bic $!17,r5
YX mov $INOSIZ,r0
YX mul r0,r5
YX add $buf,r5
YX mov $inod,r4
YX1:
YX movb (r5)+,(r4)+
YX sob r0,1b
YX rts pc
YX
YXreaddir:
YX bit $BSIZE-1,r2
YX bne 1f
YX jsr pc,rmblk / read mapped block (bno)
YX br err / end of file branch
YX clr r2 / start at beginning of buf
YX1:
YX mov $buf,r0
YX add r2,r0 / dp = buf+offset
YX add buf+2(r2),r2 / dp += dp->d_reclen
YX tst (r0) / dp->d_ino == 0?
YX beq readdir / yes - go look at next
YX rts pc / return with r0 = &dp->d_ino
YXerr:
YX clr r0 / return with
YX rts pc / dp = NULL
YX
YXloadfile:
YX clr bno / start at block 0 of inode in 'inod'
YX/ read file into core until
YX/ a mapping error, (no disk address)
YX clr r1
YX1:
YX jsr pc,rmblk
YX br 1f
YX mov $buf,r2
YX2:
YX mov (r2)+,(r1)+
YX cmp r2,$buf+BSIZE
YX blo 2b
YX br 1b
YX/ relocate core around
YX/ assembler header
YX1:
YX clr r0
YX cmp (r0),$407
YX bne 2f
YX1:
YX mov 20(r0),(r0)+
YX cmp r0,sp
YX blo 1b
YX/ enter program and
YX/ restart if return
YX2:
YX mov ENDCORE-BOOTOPTS, r4
YX mov unit,r3
YX ash $3,r3 / unit # in bits 3-5, partition # is 0
YX bis $[MAJOR\<8.+DENS],r3 / Density bit is partition #.
YX mov ENDCORE-CHECKWORD, r2
YX mov csr,r1
YX jsr pc,*$0
YX br restart
YX
YX/ read a mapped block
YX/ offset in file is in bno.
YX/ skip if success, no skip if fail
YX/ the algorithm only handles a single
YX/ indirect block. that means that
YX/ files longer than NDIRIN+256 blocks (260kb) cannot
YX/ be loaded.
YXrmblk:
YX add $2,(sp)
YX mov bno,r0
YX cmp r0,$NDIRIN
YX blt 1f
YX mov $NDIRIN,r0
YX1:
YX ash $2,r0
YX mov addr+2(r0),dno
YX mov addr(r0),r0
YX bne 1f
YX tst dno
YX beq 2f
YX1:
YX jsr pc,rblk
YX mov bno,r0
YX inc bno
YX sub $NDIRIN,r0
YX blt 1f
YX ash $2,r0
YX mov buf+2(r0),dno
YX mov buf(r0),r0
YX bne rblk
YX tst dno
YX bne rblk
YX2:
YX sub $2,(sp)
YX1:
YX rts pc
YX
YXdmask = DENS*0400
YXread = dmask + 7 /density, read function, and go
YXempty = dmask + 3 /density, empty function, and go
YX
YX/ rx02 single and double density read block routine.
YX/ low order address in dno.
YX
YXrblk:
YX mov r1,-(sp)
YX mov r2,-(sp)
YX mov r3,-(sp)
YX mov r4,-(sp)
YX mov r5,-(sp) /we need a lot of registers for interleave
YX / calculations! Can certainly be improved on!
YX mov dno,r5 /count up the CLSIZE physical sectors in here.
YX /will use lowest CLSHFT bits to look for done
YX /and to compute position in buffer
YX.if CLSIZE-1
YX ash $CLSHFT,r5 / multiply by CLSIZE
YX.endif
YX8: mov r5,r1
YX clr r0
YX div $26.,r0
YX mov r0,r4
YX asl r1
YX cmp $26.,r1
YX bgt 1f
YX inc r1
YX1: mov r1,r3
YX mov r4,r1
YX mul $6,r1
YX add r3,r1
YX clr r0
YX div $26.,r0
YX inc r1 /physical sector
YX inc r4
YX cmp $77.,r4
YX bgt 3f
YX clr r4
YX3: /physical track now in r4
YX mov unit,r0
YX ash $4.,r0
YX bis $read,r0
YX mov csr,r3
YX mov r3,r2
YX mov r0,(r2)+ /now r3 is csr, r2 is db
YX1: tstb (r3)
YX bpl 1b
YX mov r1,(r2)
YX1: tstb (r3)
YX bpl 1b
YX mov r4,(r2)
YX1: bit (r3),$040
YX beq 1b
YX mov $empty,(r3)
YX1: tstb (r3)
YX bpl 1b
YX mov $WC,(r2)
YX1: tstb (r3)
YX bpl 1b
YX mov r5,r0
YX bic $!CLMASK,r0 /lowest bits of r5 had the section of buffer
YX ash $BCSHFT,r0
YX add $buf,r0
YX mov r0,(r2)
YX1: bit (r3),$040
YX beq 1b
YX inc r5
YX bit r5,$CLMASK
YX bne 8b
YX mov (sp)+,r5
YX mov (sp)+,r4
YX mov (sp)+,r3
YX mov (sp)+,r2
YX mov (sp)+,r1
YX rts pc
YX
YXbootnm: <boot\0\0>
YXbootlen = 4 / strlen(bootnm)
YXunit: 0
YXcsr: 0
YXend:
YX
YXinod = ..-512.-BSIZE / room for inod, buf, stack
YXaddr = inod+ADDROFF / first address in inod
YXbuf = inod+INOSIZ
YXbno = buf+BSIZE
YXdno = bno+2
YSHAR_EOF
Ychmod 640 '/usr/src/sys/mdec/rx01uboot.s'
Yfi
Yif test -f '/usr/src/sys/mdec/rx02uboot.s'
Ythen
Y echo shar: "will not over-write existing file '/usr/src/sys/mdec/rx02uboot.s'"
Yelse
Ysed 's/^X//' << \SHAR_EOF > '/usr/src/sys/mdec/rx02uboot.s'
YXMAJOR = 8 / major # from bdevsw[]
YX
YX/ RX02 bootstrap.
YX/
YX/ 1995/12/02 - Now we have a boot for RX02!
YX/ Based on the RK05 bootstrap. Only 8 bytes
YX/ to spare, though. Should prove useful for those
YX/ who have only RX02 boot ROM's and use a MSCP
YX/ or RP/RM type system disk.
YX/ -Tim(shoppa@altair.krl.caltech.edu)
YX/
YX/ disk boot program to load and transfer
YX/ to a unix entry.
YX/ for use with 1 KB byte blocks, CLSIZE is 4.
YX/ NDIRIN is the number of direct inode addresses (currently 4)
YX/ assembled size must be <= 512; if > 494, the 16-byte a.out header
YX/ must be removed
YX
YX/ options: none. all options of reading an alternate name or echoing to
YX/ the keyboard had to be removed to make room for the
YX/ code which understands the new directory structure on disc
YX
YX/ constants:
YXBSIZE = 1024. / logical block size
YXDENS = 1. / 1 for double density, 0 for single density
YX / This is the only place you should have
YX / to change to switch this bootstrap for
YX / some other density.
YXWC = 64.*[1.+DENS] / word count per floppy sector
YXBC = 2.*WC / byte count per floppy sector
YXBCSHFT = 7.+DENS / shift to multiply by BC
YXCLSIZE = BSIZE\/BC / physical floppy sectors per logical block
YXCLSHFT = 3.-DENS / shift to multiply by CLSIZE
YXCLMASK = CLSIZE-1. / mask for getting CLSHFT bits
YX
YXINOSIZ = 64. / size of inode in bytes
YXNDIRIN = 4. / number of direct inode addresses
YXADDROFF = 12. / offset of first address in inode
YXINOPB = BSIZE\/INOSIZ / inodes per logical block
YXINOFF = 31. / inode offset = (INOPB * (SUPERB+1)) - 1
YXPBSHFT = -4 / shift to divide by inodes per block
YX
YX/ The boot options and device are placed in the last SZFLAGS bytes
YX/ at the end of core by the kernel for autobooting.
YXENDCORE= 160000 / end of core, mem. management off
YXSZFLAGS= 6 / size of boot flags
YXBOOTOPTS= 2 / location of options, bytes below ENDCORE
YXBOOTDEV= 4
YXCHECKWORD= 6
YX
YX.. = ENDCORE-512.-SZFLAGS / save room for boot flags
YX
YX/ entry is made by jsr pc,*$0
YX/ so return can be rts pc
YX
YX/ establish sp, copy
YX/ program up to end of core.
YX
YX nop / These two lines must be present or DEC
YX br start / boot ROMs will refuse to run boot block!
YXstart:
YX mov r0,unit
YX mov r1,csr
YX mov $..,sp
YX mov sp,r1
YX clr r0
YX1:
YX mov (r0)+,(r1)+
YX cmp r1,$end
YX blo 1b
YX jmp *$2f
YX
YX/ On error, restart from here.
YXrestart:
YX clr r0
YX/ clear core to make things clean
YX2:
YX clr (r0)+
YX cmp r0,sp
YX blo 2b
YX
YX mov $bootnm, r1
YX mov $2,r0 / ROOTINO
YX jsr pc,iget
YX clr r2 / offset
YXagain:
YX jsr pc,readdir
YX beq restart / error - restart
YX mov 4(r0),r4 / dp->d_namlen
YX cmp r4,$bootlen / if (bootlen == dp->d_namlen)
YX bne again / nope, go try next entry
YX mov r0,r3
YX add $6,r3 / r3 = dp->d_name
YX mov r1,r5 / r5 = filename
YX9:
YX cmpb (r3)+,(r5)+
YX bne again / no match - go read next entry
YX sob r4,9b
YX mov (r0),r0 / r0 = dp->d_ino
YX jsr pc,iget / fetch boot's inode
YX br loadfile / 'boot'- go read it
YX
YX/ get the inode specified in r0
YXiget:
YX add $INOFF,r0
YX mov r0,r5
YX ash $PBSHFT,r0
YX bic $!7777,r0
YX mov r0,dno
YX clr r0
YX jsr pc,rblk
YX bic $!17,r5
YX mov $INOSIZ,r0
YX mul r0,r5
YX add $buf,r5
YX mov $inod,r4
YX1:
YX movb (r5)+,(r4)+
YX sob r0,1b
YX rts pc
YX
YXreaddir:
YX bit $BSIZE-1,r2
YX bne 1f
YX jsr pc,rmblk / read mapped block (bno)
YX br err / end of file branch
YX clr r2 / start at beginning of buf
YX1:
YX mov $buf,r0
YX add r2,r0 / dp = buf+offset
YX add buf+2(r2),r2 / dp += dp->d_reclen
YX tst (r0) / dp->d_ino == 0?
YX beq readdir / yes - go look at next
YX rts pc / return with r0 = &dp->d_ino
YXerr:
YX clr r0 / return with
YX rts pc / dp = NULL
YX
YXloadfile:
YX clr bno / start at block 0 of inode in 'inod'
YX/ read file into core until
YX/ a mapping error, (no disk address)
YX clr r1
YX1:
YX jsr pc,rmblk
YX br 1f
YX mov $buf,r2
YX2:
YX mov (r2)+,(r1)+
YX cmp r2,$buf+BSIZE
YX blo 2b
YX br 1b
YX/ relocate core around
YX/ assembler header
YX1:
YX clr r0
YX cmp (r0),$407
YX bne 2f
YX1:
YX mov 20(r0),(r0)+
YX cmp r0,sp
YX blo 1b
YX/ enter program and
YX/ restart if return
YX2:
YX mov ENDCORE-BOOTOPTS, r4
YX mov unit,r3
YX ash $3,r3 / unit # in bits 3-5, partition # is 0
YX bis $[MAJOR\<8.+DENS],r3 / Density bit is partition #.
YX mov ENDCORE-CHECKWORD, r2
YX mov csr,r1
YX jsr pc,*$0
YX br restart
YX
YX/ read a mapped block
YX/ offset in file is in bno.
YX/ skip if success, no skip if fail
YX/ the algorithm only handles a single
YX/ indirect block. that means that
YX/ files longer than NDIRIN+256 blocks (260kb) cannot
YX/ be loaded.
YXrmblk:
YX add $2,(sp)
YX mov bno,r0
YX cmp r0,$NDIRIN
YX blt 1f
YX mov $NDIRIN,r0
YX1:
YX ash $2,r0
YX mov addr+2(r0),dno
YX mov addr(r0),r0
YX bne 1f
YX tst dno
YX beq 2f
YX1:
YX jsr pc,rblk
YX mov bno,r0
YX inc bno
YX sub $NDIRIN,r0
YX blt 1f
YX ash $2,r0
YX mov buf+2(r0),dno
YX mov buf(r0),r0
YX bne rblk
YX tst dno
YX bne rblk
YX2:
YX sub $2,(sp)
YX1:
YX rts pc
YX
YXdmask = DENS*0400
YXread = dmask + 7 /density, read function, and go
YXempty = dmask + 3 /density, empty function, and go
YX
YX/ rx02 single and double density read block routine.
YX/ low order address in dno.
YX
YXrblk:
YX mov r1,-(sp)
YX mov r2,-(sp)
YX mov r3,-(sp)
YX mov r4,-(sp)
YX mov r5,-(sp) /we need a lot of registers for interleave
YX / calculations! Can certainly be improved on!
YX mov dno,r5 /count up the CLSIZE physical sectors in here.
YX /will use lowest CLSHFT bits to look for done
YX /and to compute position in buffer
YX.if CLSIZE-1
YX ash $CLSHFT,r5 / multiply by CLSIZE
YX.endif
YX8: mov r5,r1
YX clr r0
YX div $26.,r0
YX mov r0,r4
YX asl r1
YX cmp $26.,r1
YX bgt 1f
YX inc r1
YX1: mov r1,r3
YX mov r4,r1
YX mul $6,r1
YX add r3,r1
YX clr r0
YX div $26.,r0
YX inc r1 /physical sector
YX inc r4
YX cmp $77.,r4
YX bgt 3f
YX clr r4
YX3: /physical track now in r4
YX mov unit,r0
YX ash $4.,r0
YX bis $read,r0
YX mov csr,r3
YX mov r3,r2
YX mov r0,(r2)+ /now r3 is csr, r2 is db
YX1: tstb (r3)
YX bpl 1b
YX mov r1,(r2)
YX1: tstb (r3)
YX bpl 1b
YX mov r4,(r2)
YX1: bit (r3),$040
YX beq 1b
YX mov $empty,(r3)
YX1: tstb (r3)
YX bpl 1b
YX mov $WC,(r2)
YX1: tstb (r3)
YX bpl 1b
YX mov r5,r0
YX bic $!CLMASK,r0 /lowest bits of r5 had the section of buffer
YX ash $BCSHFT,r0
YX add $buf,r0
YX mov r0,(r2)
YX1: bit (r3),$040
YX beq 1b
YX inc r5
YX bit r5,$CLMASK
YX bne 8b
YX mov (sp)+,r5
YX mov (sp)+,r4
YX mov (sp)+,r3
YX mov (sp)+,r2
YX mov (sp)+,r1
YX rts pc
YX
YXbootnm: <boot\0\0>
YXbootlen = 4 / strlen(bootnm)
YXunit: 0
YXcsr: 0
YXend:
YX
YXinod = ..-512.-BSIZE / room for inod, buf, stack
YXaddr = inod+ADDROFF / first address in inod
YXbuf = inod+INOSIZ
YXbno = buf+BSIZE
YXdno = bno+2
YSHAR_EOF
Ychmod 640 '/usr/src/sys/mdec/rx02uboot.s'
Yfi
Yif test -f '/usr/src/sys/pdpstand/rx.c'
Ythen
Y echo shar: "will not over-write existing file '/usr/src/sys/pdpstand/rx.c'"
Yelse
Ysed 's/^X//' << \SHAR_EOF > '/usr/src/sys/pdpstand/rx.c'
YX/*
YX * RX02 Standalone disk driver.
YX * 95/12/02, Tim Shoppa (shoppa@altair.krl.caltech.edu)
YX *
YX * Layout of logical devices:
YX *
YX * name min dev unit density
YX * ---- ------- ---- -------
YX * rx0a 0 0 single
YX * rx1a 1 1 single
YX * rx0b 2 0 double
YX * rx1b 3 1 double
YX *
YX * the following defines use some fundamental
YX * constants of the RX02.
YX */
YX
YX#define NSPB (4-2*(pn)) /* sectors per block */
YX#define NRXBLKS (1001-501*(pn)) /* blocks on device */
YX#define NBPS (128+128*(pn)) /* bytes per sector */
YX#define DENSITY ((pn)) /* Density: 0 = single, 1 = double */
YX#define UNIT ((dn)) /* Unit Number: 0 = left, 1 = right */
YX#define RXGD (RX_GO | (DENSITY << 8))
YX
YX#define rxwait() while (((rxaddr->rxcs) & RX_XREQ) == 0)
YX#define rxdone() while (((rxaddr->rxcs) & RX_DONE) == 0)
YX
YX#include "../h/param.h"
YX#include "../pdpuba/rxreg.h"
YX#include "saio.h"
YX
YX#define NRX 2
YX
YX struct rxdevice *RXcsr[NRX+1]=
YX {
YX (struct rxdevice *)0177170,
YX (struct rxdevice *)0,
YX (struct rxdevice *)-1
YX };
YX
YXrxstrategy(io, func)
YX register struct iob *io;
YX{
YX register struct rxdevice *rxaddr;
YX daddr_t bn;
YX unsigned int sectno,sector,track,dn,pn,bae,lo16,lotemp,cc;
YX unsigned int bc,bs,retry;
YX
YX rxaddr = RXcsr[io->i_ctlr];
YX bn = io->i_bn;
YX dn = io->i_unit;
YX pn = io->i_part;
YX cc = io->i_cc;
YX iomapadr(io->i_ma, &bae, &lo16);
YX bc=0;
YX
YX for (sectno=0; bc<cc; sectno++) {
YX rxfactr((int)bn*NSPB+sectno,§or,&track);
YX if (func == READ) {
YX retry=0;
YXrxretry: rxaddr->rxcs=RX_RSECT|RXGD|(UNIT<<4);
YX rxwait();
YX rxaddr->rxsa=sector;
YX rxwait();
YX rxaddr->rxta=track;
YX rxdone();
YX if (rxaddr->rxcs & RX_ERR) {
YX if ((retry++) < 10) goto rxretry;
YX goto rxerr;
YX }
YX }
YX bs = ((cc-bc<NBPS) ? (cc-bc) : (NBPS));
YX rxaddr->rxcs=((func==READ)?RX_EMPTY:RX_FILL)|RXGD|(bae<<12);
YX rxwait();
YX rxaddr->rxwc=bs/2;
YX rxwait();
YX rxaddr->rxba=lo16;
YX rxdone();
YX if (rxaddr->rxcs & RX_ERR) goto rxerr;
YX if (func==WRITE) {
YX rxaddr->rxcs=RX_WSECT|RXGD|(UNIT<<4);
YX rxwait();
YX rxaddr->rxsa=sector;
YX rxwait();
YX rxaddr->rxta=track;
YX rxdone();
YX if (rxaddr->rxcs & RX_ERR) goto rxerr;
YX }
YX lotemp=lo16;
YX lo16=lo16+NBPS;
YX if (lo16 < lotemp)
YX bae=bae+1;
YX bc=bc+bs;
YX }
YX return(io->i_cc);
YX
YXrxerr: printf("rx error: rxcs %o rxes %o\n",rxaddr->rxcs,rxaddr->rxes);
YX return(-1);
YX}
YX
YX
YXrxopen(io)
YX struct iob *io;
YX{
YX return(genopen(NRX, io));
YX}
YX
YX/*
YX * rxfactr -- calculates the physical sector and physical
YX * track on the disk for a given logical sector.
YX * call:
YX * rxfactr(logical_sector,&p_sector,&p_track);
YX * the logical sector number (0 - 2001) is converted
YX * to a physical sector number (1 - 26) and a physical
YX * track number (0 - 76).
YX * the logical sectors specify physical sectors that
YX * are interleaved with a factor of 2. thus the sectors
YX * are read in the following order for increasing
YX * logical sector numbers (1,3, ... 23,25,2,4, ... 24,26)
YX * There is also a 6 sector slew between tracks.
YX * Logical sectors start at track 1, sector 1; go to
YX * track 76 and then to track 0. Thus, for example, unix block number
YX * 498 starts at track 0, sector 25 and runs thru track 0, sector 2
YX * (or 6 depending on density).
YX */
YXstatic
YXrxfactr(sectr, psectr, ptrck)
YX register int sectr;
YX int *psectr, *ptrck;
YX{
YX register int p1, p2;
YX
YX p1 = sectr / 26;
YX p2 = sectr % 26;
YX /* 2 to 1 interleave */
YX p2 = (2 * p2 + (p2 >= 13 ? 1 : 0)) % 26;
YX /* 6 sector per track slew */
YX *psectr = 1 + (p2 + 6 * p1) % 26;
YX if (++p1 >= 77)
YX p1 = 0;
YX *ptrck = p1;
YX}
YSHAR_EOF
Ychmod 644 '/usr/src/sys/pdpstand/rx.c'
Yfi
Yexit 0
Y# End of shell archive
SHAR_EOF
fi
if test -f '282.patch'
then
echo shar: "will not over-write existing file '282.patch'"
else
sed 's/^Y//' << \SHAR_EOF > '282.patch'
Y*** /etc/disktab.old Fri Aug 18 23:13:27 1995
Y--- /etc/disktab Tue Dec 5 20:25:33 1995
Y***************
Y*** 1,4 ****
Y! # @(#)disktab 1.2 (2.11BSD) 1995/07/13
Y #
Y # Disk geometry and partition layout tables.
Y # Key:
Y--- 1,4 ----
Y! # @(#)disktab 1.3 (2.11BSD) 1995/12/05
Y #
Y # Disk geometry and partition layout tables.
Y # Key:
Y***************
Y*** 601,610 ****
Y--- 601,612 ----
Y
Y rx01|RX01|DEC RX01:\
Y :ty=floppy:se#128:ns#13:nt#1:nc#77:\
Y+ :b0=/mdec/rx01uboot:\
Y :pa#500:ba#1024:fa#1024:\
Y
Y rx02|RX02|DEC RX02:\
Y :ty=floppy:se#256:ns#13:nt#1:nc#77:\
Y+ :b0=/mdec/rx02uboot:\
Y :pb#1001:bb#1024:fb#1024:
Y
Y #
Y*** /VERSION.old Mon Nov 27 23:44:49 1995
Y--- /VERSION Tue Dec 5 20:42:46 1995
Y***************
Y*** 1,4 ****
Y! Current Patch Level: 281
Y
Y 2.11 BSD
Y ============
Y--- 1,4 ----
Y! Current Patch Level: 282
Y
Y 2.11 BSD
Y ============
Y*** /usr/src/sys/mdec/Makefile.old Fri Apr 8 23:57:18 1994
Y--- /usr/src/sys/mdec/Makefile Tue Dec 5 20:38:50 1995
Y***************
Y*** 3,12 ****
Y # All rights reserved. The Berkeley software License Agreement
Y # specifies the terms and conditions for redistribution.
Y #
Y! # @(#)Makefile 1.1 (2.11BSD GTE) 4/8/94
Y #
Y ALL= bruboot dvhpuboot hkuboot hpuboot rauboot rkuboot rluboot \
Y! rm03uboot rm05uboot si51uboot si94uboot si95uboot
Y
Y all: ${ALL}
Y
Y--- 3,13 ----
Y # All rights reserved. The Berkeley software License Agreement
Y # specifies the terms and conditions for redistribution.
Y #
Y! # @(#)Makefile 1.2 (2.11BSD GTE) 1995/12/05
Y #
Y ALL= bruboot dvhpuboot hkuboot hpuboot rauboot rkuboot rluboot \
Y! rm03uboot rm05uboot si51uboot si94uboot si95uboot rx02uboot \
Y! rx01uboot
Y
Y all: ${ALL}
Y
Y***************
Y*** 30,35 ****
Y--- 31,38 ----
Y si51uboot: si51uboot.s
Y si94uboot: si94uboot.s
Y si95uboot: si95uboot.s
Y+ rx02uboot: rx02uboot.s
Y+ rx01uboot: rx01uboot.s
Y
Y clean:
Y rm -f x.s a.out b.out ${ALL}
Y*** /usr/src/sys/pdpstand/conf.c.old Mon Jul 17 21:43:26 1995
Y--- /usr/src/sys/pdpstand/conf.c Tue Dec 5 20:26:35 1995
Y***************
Y*** 3,9 ****
Y * All rights reserved. The Berkeley software License Agreement
Y * specifies the terms and conditions for redistribution.
Y *
Y! * @(#)conf.c 2.4 (2.11BSD) 1995/07/17
Y */
Y
Y #include "../h/param.h"
Y--- 3,9 ----
Y * All rights reserved. The Berkeley software License Agreement
Y * specifies the terms and conditions for redistribution.
Y *
Y! * @(#)conf.c 2.5 (2.11BSD) 1995/12/05
Y */
Y
Y #include "../h/param.h"
Y***************
Y*** 14,19 ****
Y--- 14,20 ----
Y extern int xpstrategy(), xpopen(), xpclose(), xplabel();
Y extern int brstrategy(), bropen();
Y extern int rkstrategy(), rkopen();
Y+ extern int rxstrategy(), rxopen();
Y extern int hkstrategy(), hkopen();
Y extern int rlstrategy(), rlopen(), rllabel();
Y extern int sistrategy(), siopen();
Y***************
Y*** 23,29 ****
Y extern int tsstrategy(), tsopen(), tsclose(), tsseek();
Y extern int tmscpstrategy(), tmscpopen(), tmscpclose(), tmscpseek();
Y
Y! extern caddr_t *XPcsr[], *BRcsr[], *RKcsr[], *HKcsr[], *RLcsr[];
Y extern caddr_t *SIcsr[], *RAcsr[], *TMcsr[], *HTcsr[], *TScsr[], *TMScsr[];
Y
Y /*
Y--- 24,30 ----
Y extern int tsstrategy(), tsopen(), tsclose(), tsseek();
Y extern int tmscpstrategy(), tmscpopen(), tmscpclose(), tmscpseek();
Y
Y! extern caddr_t *XPcsr[], *BRcsr[], *RKcsr[], *HKcsr[], *RLcsr[], *RXcsr[];
Y extern caddr_t *SIcsr[], *RAcsr[], *TMcsr[], *HTcsr[], *TScsr[], *TMScsr[];
Y
Y /*
Y***************
Y*** 48,54 ****
Y nullsys, nullsys,
Y "rl", rlstrategy, rlopen, nullsys, RLcsr, /* 7 */
Y rllabel, nullsys,
Y! "rx", nullsys, nullsys, nullsys, 0, /* 8 */
Y nullsys, nullsys,
Y "si", sistrategy, siopen, nullsys, SIcsr, /* 9 */
Y nullsys, nullsys,
Y--- 49,55 ----
Y nullsys, nullsys,
Y "rl", rlstrategy, rlopen, nullsys, RLcsr, /* 7 */
Y rllabel, nullsys,
Y! "rx", rxstrategy, rxopen, nullsys, RXcsr, /* 8 */
Y nullsys, nullsys,
Y "si", sistrategy, siopen, nullsys, SIcsr, /* 9 */
Y nullsys, nullsys,
Y*** /usr/src/sys/pdpstand/Makefile.old Wed Jun 7 21:11:57 1995
Y--- /usr/src/sys/pdpstand/Makefile Tue Dec 5 20:26:35 1995
Y***************
Y*** 17,22 ****
Y--- 17,23 ----
Y # to install /sys/pdpdist/dtab (or /etc/dtab.save) as ${ROOT}/etc/dtab
Y # so that the GENERIC kernel can find the tape device.
Y #
Y+ # 1995/12/05 - add RX02 driver.
Y # 1995/06/05 - add disklabel program to Makefile.
Y # 1995/06/01 - use split I/D for icheck and restor.
Y # 1995/05/30 - Begin adding disklabel support.
Y***************
Y*** 41,47 ****
Y BOOT= M.o boot.o ubmapset.o
Y DRIVERS=prf.o sys.o label.o \
Y ht.o tm.o ts.o tmscp.o \
Y! xp.o rk.o rl.o br.o hk.o si.o ra.o
Y
Y ALL= mtboot boot disklabel mkfs restor icheck maketape toyset
Y
Y--- 42,48 ----
Y BOOT= M.o boot.o ubmapset.o
Y DRIVERS=prf.o sys.o label.o \
Y ht.o tm.o ts.o tmscp.o \
Y! xp.o rk.o rl.o rx.o br.o hk.o si.o ra.o
Y
Y ALL= mtboot boot disklabel mkfs restor icheck maketape toyset
Y
Y***************
Y*** 167,172 ****
Y--- 168,174 ----
Y prf.o: prf.c
Y rk.o: rk.c
Y rl.o: rl.c
Y+ rx.c: rx.c
Y br.o: br.c
Y srt0.o: srt0.s
Y srt0-i.o: srt0.s
SHAR_EOF
fi
exit 0
# End of shell archive