Imaging RX02 disks for simh (was: Re: MU-BASIC V2 and RT-11 V03B distribution disks.)
Glen Slick
glen.slick at gmail.com
Sun Mar 6 16:47:55 CST 2016
On Sun, Mar 6, 2016 at 2:17 PM, Brian Walenz <thebri at gmail.com> wrote:
>
>
> http://www.dbit.com/putr/putr.asm has the following:
>
> ;
> ; RX01 interleave routine.
> ;
> ; bp logical device rec
> ; ch cylinder (0-75.)
> ; cl logical sector (0-25.)
> ;
> ; On return:
> ; ch cylinder (1-76.)
> ; cl sector (1-26.)
> ;
> ; From RT-11 V04 DY.MAC:
> ;
> ; ISEC=(ISEC-1)*2
> ; IF(ISEC.GE.26) ISEC=ISEC-25
> ; ISEC=MOD(ISEC+ITRK*6,26)+1
> ; ITRK=ITRK+1
> ;
>
There is also yet another implementation of this in the 2.11BSD source
code file src\sys\pdpstand\rx.c
/*
* rxfactr -- calculates the physical sector and physical
* track on the disk for a given logical sector.
* call:
* rxfactr(logical_sector,&p_sector,&p_track);
* the logical sector number (0 - 2001) is converted
* to a physical sector number (1 - 26) and a physical
* track number (0 - 76).
* the logical sectors specify physical sectors that
* are interleaved with a factor of 2. thus the sectors
* are read in the following order for increasing
* logical sector numbers (1,3, ... 23,25,2,4, ... 24,26)
* There is also a 6 sector slew between tracks.
* Logical sectors start at track 1, sector 1; go to
* track 76 and then to track 0. Thus, for example, unix block number
* 498 starts at track 0, sector 25 and runs thru track 0, sector 2
* (or 6 depending on density).
*/
static
rxfactr(sectr, psectr, ptrck)
register int sectr;
int *psectr, *ptrck;
{
register int p1, p2;
p1 = sectr / 26;
p2 = sectr % 26;
/* 2 to 1 interleave */
p2 = (2 * p2 + (p2 >= 13 ? 1 : 0)) % 26;
/* 6 sector per track slew */
*psectr = 1 + (p2 + 6 * p1) % 26;
if (++p1 >= 77)
p1 = 0;
*ptrck = p1;
}
More information about the cctalk
mailing list