File: IDESYS.TXT - 26/07/2000 Subject: Sunrise MSX ATA/IDE Bios 1.9x/2.xx system documentation By: Jon De Schrijder (jon@msx.ch) IDESYS.TXT history list: ************************ *26/07/2000 -IMPORTANT NOTICES FOR IDE SOFTWARE DEVELOPERS -!!! new definition of IDE system workarea !!! *18/06/2000 -info concerning bios 2.xx added -locking bit is not used for FAT16 driver *14/05/2000 -new diskrom entry #7FBF description (since bios 1.92) -new bit5 (locked) in devicecodebyte -More accurate info on interrupt/registerchanges *12/04/1999 added more info about the ROM IDENTIFICATION added more info about the device codebyte (bit 3,4) *26/03/1999 correction: 'additional partition info' bit 7 and 6 were swapped *21/03/1999 release first version Actual document starts here: THE ROM IDENTIFICATION ---------------------- All IDE biosses have the following 3 characters at address #7F80/1/2: ID# Since IDE bios 1.8, also the bios version number can be obtained. It is situated at address #7FB6/7/8: Examples: #01 #80 #00 =version 1.80=version 1.8 #01 #80 #04 =version 1.80beta4 #01 #91 #00 =version 1.91 Older biosses have #FF #FF #FF. The following piece of code can be used to see if the bios is at least version #1.80: ... LD HL,(#7FB5) ;#7FB6 to H LD A,(#7FB7) LD L,A ;#7FB7 to L INC HL ;!!! if it is #FFFF, it will turn to #0000 LD DE,#0180+1 ;when comparing also #0180 should be increased by 1 OR A ;clear carry SBC HL,DE ;compare JR C,too_old ... THE WORKSPACE ------------- During the bootprocess the IDE interface allocates approx. 74 bytes of workspace in page 3 to store its system variables. The address of the first byte can be found in the SLTWRK (#FD09) table. The element corresponding with the slot the IDE is in, will contain the start address of the IDE workspace. For easy programming, this address can be also be obtained by calling the 'get Drivefield address' entry at #7FBF with A=0. (see below) * IDE workspace consists of: -6 Drivefields of X bytes, related to the max. 6 possible driveletters used by the interface The first Drivefield corresponds with local drive 0 The second Drivefield corresponds with local drive 1, ... The 'local drive number' is the one that is used for DISKIO For more info on 'MSX drive numbers' read the text DRIVENUM.TXT X=8 for bios 1.9x and 2.xx, X>8 for bios 3.xx and higher -a number of Y device info bytes (Y=6 for bios 1.9x and 2.xx) -18 bytes free space (internally used for ATAPI command packets) IMPORTANT NOTICE FOR IDE SOFTWARE DEVELOPERS: The startaddresses of these 8 fields (6 drivefields, device info and free space) MUST BE OBTAINED BY CALLING THE 'get Drivefield address' entry. It must *not* be assumed that the Drivefields are 8 bytes in length because this is likely to change in version 3.00 of the IDE bios. It must *not* be assumed that the 6 Drivefields are stored behind each other in memory. IDE utilities which rely on the successive 8-bytesized drivefields, should be modified in order to be compatible with the IDE bios in future. All IDEbiosses 1.9x and 2.xx only support 24 bit sector numbers: this means maximum 8 GB harddisks. You can also use bigger harddisks, but only the first 8 GB can be accessed. IDE harddisks can use maximum 28 bit sector numbers (=128 GB) and this will be supported by IDE bios 3.xx in future. This requires some extra bytes in the drivefields and that means that also IDE software that makes use of these system variables have to be changed. The changes are rather small. Without changes the software will still work with bios 2.xx, but not in the future with bios 3.xx. * Drivefield consists of: +0 :device codebyte +1/2/3:partition start (24 bit absolute sector number) +4/5/6:partition length minus 1 (24 bit sector count) +7 :additional partition info since bios 3.00 and up: +8 :partition start (bit 24-31) +9 :partition length minus 1 (bit 24-31) The last two bytes should be used when bios 3.xx or higher is detected. * Device codebyte consists of: bit 0: 0=this partition is located on the Master device 1=this partition is located on the Slave device bit 21: 00=this partition is located on an ATA device (=harddisk) 10=this partition is located on an ATAPI direct access device 11=this partition is located on an ATAPI CDROM bit 3: 0=the medium of this partition has been changed 1=the medium of this partition has not been changed bit 4: 0=this partition is in use 1=this partition is not in use/disabled (see note) bit 5: 0=this drive is not 'locked' 1=this drive is locked by an external program This locking info is used by IDEPAR: if the locking bit is set, you can't change the settings for that drive. The locking bit is set by devicehandlers like IDECDEX. bit 6/7: not used yet, don't alter them You can NOT assume these bits to be 0, nor to be 1. notes: -bit 2 indicates if it is an ATAPI device -ATAPI direct access devices: Iomega ZIP, LS120SuperDisk, ... -Bit 3 is used as disk-changed-flag for DOS2 -When bit 4=1 and bit 3=1: unexisting drive, not in use -When bit 4=1 and bit 3=0: no medium present in drive * Additional partition info consists of: bit 0: 0=this partition is disabled during boot 1=this partition is enabled during boot bit 1..5: not used yet, don't alter them bit 6: 0=this partition is the boot partition (not used yet) 1=this partition is not the boot partition (not used yet) bit 7: 0=this partition is logically write-protected 1=this partition is not logically write-protected * device info bytes consist of: +0: number of heads Master (in case of ATA device) +1: number of heads Slave (in case of ATA device) +2: number of sectors/cylinder Master (in case of ATA device) +3: number of sectors/cylinder Slave (in case of ATA device) +4: devicetype codebyte Master device +5: devicetype codebyte Slave device +6...: undefined yet, don't use them *Devicetype codebyte consists of: bit 0: 1=this device is an ATA device (harddisk) bit 1: 1=this device in an ATAPI device (CDROM, ZIP, LS120, ...) bit 2: 0=this device uses only CHS addressing 1=this device supports also LBA addressing bit 43: 00=this device is a direct-access device (harddisk, ZIP, ...) 01=this device is a CDROM 10=reserved 11=reserved bit 765: not used yet, don't alter them SOME USEFUL ROUTINES -------------------- The following addresses are entries to some useful routines when doing tests with the IDE. ALL ENTRIES BELOW CHANGE THE IX REGISTER. 7F89: absolute sector read input: A=device codebyte (see above for description) CDE=24 bit sector number (E=lowbyte) B=number of sectors to read HL=destination address output: Carry=error, errorcode in A register (same as DISKIO) changes: all, interrupt is left unchanged or set to DI Notes: - can also be used to read CDROM sectors (2048 bytes/sector) - routines for 32 bit sectornumbers are not defined yet 7F8C: absolute sector write input: A=device codebyte (see above for description) CDE=24 bit sector number (E=lowbyte) B=number of sectors to write HL=source address output: Carry=error, errorcode in A register (same as DISKIO) changes: all, interrupt is left unchanged or set to DI Notes: - routines for 32 bit sectornumbers are not defined yet *If data is transferred in page 0 or 1, this can only be in the primary mapper ramslot: DOS hook #F36E and buffer #F34D should be available. (is the case in MSX-DOS environment, not in BASIC environment, but in BASIC you don't need transfers in page 0 or 1) *For the absolute sector read/write routines it is necessary that the IDE bios is installed during the MSX boot process. If a medium changed condition is encountered, all necessary flags of the appropriate devicecodebytes are set automatically. 7FB9: select device: selects the Master or Slave device for ATAPIpacket input: bit0 of A register: 0=Master 1=Slave output: Carry if controller time-out error changes: A,BC,IX, interrupt is left unchanged (bios 1.9x) interrupt will automatically be DI (bios 2.xx) Notes: if you want to issue several ATAPI packets to the same device, you only need to call this routine once. When using bios 1.9x you have to set DI yourself before calling select device. This to prevent interrupt driven TSR's from changing the selected device. (like a CD audio player) 7FBC: issue ATAPI packet (packet is sent to the selected device) input: HL=pointer to 12-byte ATAPI command packet (not in page1!) DE=transfer address for data (if any) (page 1 allowed) output: NC=succesful C+NZ=error, A contains IDE errorregister contents C+Z=error, controller time-out changes: all, interrupt is left unchanged or set to DI Notes: *If data is transferred in page 0 or 1, this can only be in the primary mapper ramslot: DOS hook #F36E and buffer #F34D should be available. (is the case in MSX-DOS environment, not in BASIC environment, but in BASIC you don't need transfers in page 0 or 1) *If the ATAPI packet routine returns with a 'Unit Attention' error condition, then you have to set the 'medium changed flags' (in the devicecodebytes) yourselves to ensure that the system keeps track of medium changes: so you need to check the 6 devicecodebytes, look for bit 0 to see if they are located on the device you've just tried to access and was changed, and then set bit 4 and bit 3 as follows: bit43: 00: change to 10 01: change to 10 10: leave it 10 11: don't change anything, unused drive The next time DISKIO is called, appropriate system variables for the new medium will automatically be loaded. (for example if an unpartitioned ZIP disk is replaced by a partitioned one, the unused IDE drives will be set in use to represent the new partitions) *Example of the use of ATAPI command packet: ld a,1 call selectdevice ;select slave device ld hl,open call packet ;this will open your CDROM tray! ... open db #1b,0,0,0,#02,0,0,0,0,0,0,0 More info about ATAPI command packets can be found on the Internet. A very good place of the complete IDE and ATAPI docs can be found on the following anonymous FTP server: ftp://fission.dt.wdc.com 7FBF: get Drivefield address (available since bios 1.92) input: A=Drivefield number (0,1,2,3,4,5) or 6 or 7 output: HL=address changes: IX,BC,DE,HL,AF, interrupt is left unchanged Note: Use A=0 to obtain the start of the IDE workspace (since this is the same as Drivefield 0). Use A=6 to obtain the address of the Y device infobytes. Use A=7 to obtain the address of the 18 bytes free space. NEW FUNCTIONALITY SINCE BIOS 2.00 --------------------------------- In order to support a FAT16 driver, the standard DISKIO entry (#4010) was expanded to support 23 bit sector numbers. If bit 7 of the C register is 1, then DISKIO works like usual: a MediaType devicecode is passed in the C register. The IDE bios only checks if this code is >= #F0. So you can always use #F0. Values #80..#EF will return with an error condition. You can use 23 bit sector numbers if bit 7 of the C register is 0. Bit 0..6 of the C register must contain bit 16..22 of the 23 bit sector number. DE contains bit 0..15 (like usual). Have fun with your IDE ! Jon