Hi all,
when cleaning up my email, I came across the following:
Maarten ter Huurne wrote:
>
> At 01:20 AM 07/25/99 +0200, you wrote:
>
> >] By the way, do you know a way to find the DiskROM slot ID for a drive under
> >] DOS2? Under DOS1 you can use the #FB21 table, but I doubt that will work
> >] under DOS2, which supports re-arragning drive letters, gaps in drive
> >] letters (A,B,H) etc.
> >
> >I think that the FB21 table is the only viable method. Though, it will
> indeed
> >only give a mapping of the physical drive to the interface. Not of the
> >logical drive to the interface. Stupid DOS2...
>
> Anyone knows of a mapping from logical drive to physical drive?
>
> Bye,
> Maarten
>
I've written a text about it and attached to this mail,
Greetz,
jon
ps. the new IDE interface is almost finished
pps. I'll continue my work on Compass 2.0 (I will do my best to have a
beta ready at Bussum fair)
File: DRIVENUM.TXT - 22/08/1999
Subject: Informative text about drivenumbers in the MSX system
By: [EMAIL PROTECTED] / Compjoetania TNG
There are 3 different kinds of 'driveletters' or 'drivenumbers':
1. the local drivenumber
2. the physical drivenumber
3. the logical drivenumber
Storage media are connected to the MSX by means of a diskinterface in a system slot.
The software in such an interface is called a 'diskrom'. There can be a maximum of 4
diskinterfaces connected to one MSX. Each diskinterface can be used to control more
than one drive.
Example 1: in most MSX2 models there is already an internal diskrom present to control
two floppydrives.
Example 2: the partitions on a harddisk are treated as separate drives connected to
one (hard)diskinterface
The drives connected to each diskinterface are identified with their 'local
drivenumber'. This is a number counting from 0 without any 'gaps'. If there are 5
drives connected to a diskinterface, their local drivenumbers *must* be 0, 1, 2, 3 and
4.
When using the standard diskrom routines like DISKIO (#4010), the local drivenumber is
passed in the A register.
When the MSX computer is turned on, all diskinterfaces install themselves into the
system. There is an 8-byte table at address #FB21:
#FB21: number of drives connected to the 1st interface
#FB22: slotcode of the 1st interface
#FB23: number of drives connected to the 2nd interface
#FB24: slotcode of the 2nd interface
#FB25: number of drives connected to the 3rd interface
#FB26: slotcode of the 3rd interface
#FB27: number of drives connected to the 4th interface
#FB28: slotcode of the 4th interface
Each drive is given a physical drivenumber starting from the first interface. Example:
if there are 3 drives connected to the first interface and two drives connected to the
second and none to the other interfaces, then the situation is as follows:
local drive 0 on the 1st interface = physical drive 1
local drive 1 on the 1st interface = physical drive 2
local drive 2 on the 1st interface = physical drive 3
local drive 0 on the 2nd interface = physical drive 4
local drive 1 on the 2nd interface = physical drive 5
The number of physical drives is limited to 8. (When a diskrom installs itself, it
should check that no more than 8 physical drives are created.)
Driveletters (e.g. A: B: ...) used in programs represent *always* logical
drivenumbers. (There is one exception, see below)
A: =always logical drive 1
B: =always logical drive 2
C: =always logical drive 3
...
H: =always logical drive 8
In DOS1 environment there is no difference between the logical and the physical
drivenumber. So logical drive 1 corresponds with physical drive 1, etc. (Also in the
case of 1 floppydrive with logical drives A: and B:, there are two physical drives 1
and 2.)
In native DOS2 environment there can be difference between the logical and the
physical drivenumber. This is achieved by using the command ASSIGN or by the DOS
function call #6A. With ASSIGN you can remap a logical drive to another physical
drive. Example:
ASSIGN C: A:
This will redirect all access to logical drive C: to the first physical drive. Note
that in this case 'A:' represent the first *physical* drive. This is the only
exception, in all other cases 'X:' represent a logical drive.
When you want to access a drive directly, this is by using the standard
diskromroutines like DISKIO (#4010), you need two things: the slotcode of the diskrom
the drive is connected to and the local drivenumber of the drive you want to access.
The following code can be used to do this:
;input: (drive) contains logical drivenumber (A:=1 B:=2 ...)
;output: (drive) contains physical drivenumber (A:=1 B:=2 ...)
; No Carry=diskrom found
; (local) contains local drivenumber on the interface
; (slot) contains slotcode of corresponding diskrom
; Carry=error diskrom not found
LD C,#6F ;get DOS kernel version
CALL BDOS
LD A,B
CP 2
JR C,DOS1 ;in DOS1 physical=logical number
LD BC,(drive-1) ;C contains #6A
LD D,#FF
CALL BDOS ;get physical drivenumber
JR NZ,DOS1 ;error ?!
LD A,D
LD (drive),A
DOS1:
LD A,(drive) ;get physical drivenumber (1..8)
DEC A
LD HL,#FB21
LD B,4
GETSLT: SUB (HL)
JR C,FOUND
INC L
INC L
DJNZ GETSLT
SCF ;no diskrom found
RET ;(unexisting logical drive or DOS2 ramdisk)
FOUND: ADD A,(HL)
LD (local),A
INC L
LD A,(HL)
LD (slot),A
OR A
RET
DB #6A
drive DB 0
slot DB 0
local DB 0
Have fun with it!