home *** CD-ROM | disk | FTP | other *** search
- Path: sparky!uunet!bonnie.concordia.ca!daily-planet.concordia.ca!davinci!steve
- From: steve@concordia.ca
- Newsgroups: comp.unix.bsd
- Subject: Using Mtools with DOS fixed disk
- Message-ID: <4621@daily-planet.concordia.ca>
- Date: 28 Jul 92 03:40:02 GMT
- Sender: usenet@daily-planet.concordia.ca
- Organization: Concordia University, Montreal, Quebec
- Lines: 102
- Originator: steve@davinci
-
-
- Despite all the talk about getting mtools to work with a DOS fixed
- disk, none of it seemed to work. I ended up getting things working
- by taking the following approach:
-
- 1) Get a decent disk/sector editor ( I used 'DiskEdit', available
- on wuarchives as /mirrors/msdos/dskutl/diskedt.zip ). Use this
- to find out what's in cylinder 0, head 0, sector 1. The magic
- offsets are 01EE, 01DE, O1CE and 01BE for the 4 possible partitions
- that fdisk will report in that order.
-
- My disk looked like this:
- 0 1 2 3 4 5 6 7 8 9 A B C D E F
- -------------------------------------------------
- 1B | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <- Unused
- 1C | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <- Unused
- 1D | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 <- DOS
- ^^
- 1E | 01 00 06 0C B3 50 33 00 00 00 94 FF 05 00 80 00 <- 386BSD
- ^^ ^^ ^^
- || BIGDOS System Indicator (32 bit sectors)
-
- 1F | 81 51 A5 OC B3 D2 C7 FF 05 00 AE 50 01 00 55 AA
- ^^ ^^^^^
- 386BSD System Indicator End of MBR
-
- Now, offset 01DE to 01ED is for my DOS partition, which is
- indicated by the hex value 06 at offset 01E2. Other valid
- DOS System Indicators are 01 for DOS 12 bit FAT and 04 for
- DOS 16 bit FAT (16 bit sectors).
-
- 2) Enough background. At offset 01DF the value indicates
- the head(track) on which the DOS partition starts, which in
- my case is track #1. At offsets 01E0-01E1 the values are
- interpreted as follows:
-
- 01E0 01E1
-
- 00 000001 00000000
- ^^ ^^^^^^
- | |
- | -> Starting sector of DOS partition = 1.
- |
- |-> Add to value at 01E1 to get 00 00000000 = 0,
- the starting cylinder # of the DOS partition.
-
- 3) Therefore we get the start of the DOS partition to be at
- Cylinder # 0, Head # 1 and Sector # 1. The same calculation
- for the 386BSD partition would yield Cylinder # 593, Head # 1
- and Sector #1. To turn these values into an offset usable by
- the mtools device structure, we need to know a bit of the disk
- geometry. This can be obtained by looking at your disktab entry
- (or by executing disklabel -r wd?). My disktab looks like:
-
- qlp240A|Quantum 245MB IDE (DOS in cyl. 0-592): \
- :dt=ST506:ty=winchester:se#512:nt#13:ns#51:nc#723: \
- :pa#21216:oa#393159:ta=4.2BSD:ba#4096:fa#512: \
- :pb#42432:ob#414375:tb=swap: \
- :pc#84864:oc#393159: \
- :pd#478023:od#0: \
- :ph#21216:oh#456807:th=4.2BSD:bh#4096:fh#512:
-
- Note that the entry for partition d spans the WHOLE disk,
- and partition c only spans the 386BSD portion of the disk.
-
- You need the value for ns which is the number of sectors/head,
- and nt which is the number of heads/cylinder, and se which is the
- sector size in bytes. The final calculation is:
-
- offset = [(Cyl# * nt *ns) + (Head# * ns) + Sect# - 1] * se
-
- which in my case yields 26112, giving the following device
- description in the mtools devices.c file
-
- #ifdef __386BSD__
- struct device devices[] = {
- {'C', "/dev/rwd0d", 26112L, 16, 0, (int (O) ()) 0, 0, 0, 0},
- {'A', "/dev/rfd0a", 0L, 12, 0, (int (*) ()) 0, 80, 2, 18}, /* 1.44m */
- {'A', "/dev/rfd0a", 0L, 12, 0, (int (*) ()) 0, 80, 2, 15}, /* 1.2m */
- {'A', "/dev/rfd0a", 0L, 12, 0, (int (*) ()) 0, 80, 2, 9}, /* 720k */
- {'A', "/dev/rfd0a", 0L, 12, 0, (int (*) ()) 0, 40, 2, 9}, /* 360k */
- {'A', "/dev/rfd0a", 0L, 12, 0, (int (*) ()) 0, 40, 2, 8}, /* 320k */
- {'B', "/dev/rfd1a", 0L, 12, 0, (int (*) ()) 0, 80, 2, 18}, /* 1.44m */
- {'B', "/dev/rfd1a", 0L, 12, 0, (int (*) ()) 0, 80, 2, 15}, /* 1.2m */
- {'B', "/dev/rfd1a", 0L, 12, 0, (int (*) ()) 0, 80, 2, 9}, /* 720k */
- {'B', "/dev/rfd1a", 0L, 12, 0, (int (*) ()) 0, 40, 2, 9}, /* 360k */
- {'B', "/dev/rfd1a", 0L, 12, 0, (int (*) ()) 0, 40, 2, 8}, /* 320k */
- {'\0', (char O) NULL, 0L, 0, 0, (int (*) ()) 0, 0, 0, 0}
- };
- #endif /* __386BSD__ */
-
- It works for me. If there is an easier way to get this information,
- I don't know about it. The closest I can get is INT 21,32 but this
- doesn't seem to get me the information I want.
-
- Hope this helps.
-
- --
- Steve Biedlingmaier
- Tel. : (514) 682-3400 ext. 284
- Fax : (514) 686-1990
- E-mail : sbiedling@ccrit.doc.ca, steve@davinci.concordia.ca
-