Imaging RX02 disks for simh (was: Re: MU-BASIC V2 and RT-11 V03B distribution disks.)
Brian Walenz
thebri at gmail.com
Sun Mar 6 16:17:20 CST 2016
On Sun, Mar 6, 2016 at 5:06 PM, Don North <north at alum.mit.edu> wrote:
> From the SIMH pdp11 RX driver (pdp11_rx.c) the disk size is computed as
> follows,
> and the byte offset into the file is computed by CALC_DA(trk,sec) given
> the PHYSICAL
> track (0..76) and sector (1..26) addresses used in accessing the
> controller.
>
> So the SIMH disk image should be 77*26*128 = 256,256 bytes for an RX01
> format.
> RX02 format is same number of tracks and sectors, but has 256 byte sectors.
>
> So if you image an RX disk using logical operating system 512B blocks
> there are
> 494 of them (76*26*128/512 = 494) numbered 0..493. Track 0 is skipped in
> the
> filesystem (block 0 is at track=1 sector=1) for legacy compatibility
> reasons (with IBM).
>
> However, since the SIMH file is in physical track/sector order, if you
> read the disk image
> using logical device blocks, you have to know how the driver interleaves
> logical blocks
> onto physical track/sectors, as you must de-interleave to build the SIMH
> file.
>
> Or else you must run a program on the PDP-11 side that reads the RX drive
> as physical
> tracks and sectors, not using file system access commands.
>
> It's not pretty, but if you think about it enough it is the only way for
> SIMH to simulate the
> RX/RY devices and be operating system agnostic.
>
> Don
>
> From PDP11/pdp11_rx.c:
>
> #define RX_NUMTR 77 /* tracks/disk */
> #define RX_NUMSC 26 /* sectors/track */
> #define RX_NUMBY 128 /* bytes/sector */
> #define RX_SIZE (RX_NUMTR * RX_NUMSC * RX_NUMBY) /* bytes/disk */
>
> #define CALC_DA(t,s) (((t) * RX_NUMSC) + ((s) - 1)) * RX_NUMBY
>
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
;
(and then some assembly code to implement that)
I didn't try anything based on this. I was confused about "ISEC-1".
Assuming sectors started at zero, this gave a negative result. Plus, I was
wrong about the sector size.
Thanks! This seems like enough hints to figure it out.
b
More information about the cctalk
mailing list