From: CONRADUS@plearn.edu.pl (KMK)
Newsgroups: comp.sys.atari.8bit
Subject: A message to OS/DOSdevelopers
Date: 28 Dec 1995 15:20:18 -0500

A message to Operating Systems/Disk Operating Systems developers.

Dear developer!

We  are pleased to present you a preliminary document  about  our
IDE  hard  drive  interface  for  Atari  130XE  (and  compatible)
computers.  As existing Disk Operating Systems aren't able to use
all  the capabilities we provided,  we are kindly asking  you  to
upgrade  the  latest  versions of your  work  and  implement  the
specific IDE features,  those have been described below. The four
general  problems  we  found trying to use any  of  the  existing
DOSes, are as follows:

1) All DOSes we tested,  i.e.  SpartaDOS 3.2g,  SpartaDOS X 4.20,
MyDOS 4.53 and BWDOS 1.10,  when they have been executed, seem to
force  the  DUNIT  (›0301)  value to  ›01.  Such  action  is  not
necessary,  because the DUNIT is already set by the XL OS's RESET
routines,  and is obnoxious,  because,  as a result,  the DOS  is
unable to read its config files, when the system has been started
from a partition other, than D1:.
2)  All  the DOSes we tested are unable  to  read/write  512-byte
sectors,  so they are unable to work in the IDE native mode  (see
below).  The interface provides the emulation mode to handle 256-
byte sector operations,  but, as a result, the drive is unable to
reach its full speed. Especially any writes to the hard drive are
very  slow.  The implementation of the 512 byte allocation  units
may also be profitable in the future, if we decide to add support
for DMA transfers.
3)  All the DOSes we tested are unable to handle  big  partitions
(i.e.  over  16  MB limit).  The implementation of the  512  byte
allocation  units  may solve this problem in a  part  (the  limit
would  be  32  MB per partition then),  but,  if  you  decide  to
implement  big  partitions handling,  we advise you  to  consider
about  using the 23-bit sector addressing in conjuntion with  the
larger allocation units (see below for details).
4) All the DOSes we tested are unable to handle disks D10-D15.

Operating  Systems  developers  please note,  that  there  is  no
necessity to set the DUNIT value in the OS BOOT routine,  as  the
DUNIT is already set by previous RESET routines.

We  hope,  that you will take these problems into  consideration,
decide to support the features described below and don't hesitate
to send us your comments, if any.

                                                          Regards

                                             Konrad Kokoszkiewicz
                                   E-mail: conradus@plearn.edu.pl
                                    S-mail: ul. Tomaszowska 95/37
                                 PL-26-420 Nowe Miasto nad Pilica
                                                           POLAND

                               ***

     IDE Hard Drive Interface v.1.0 - a preliminary document

  Copyright (c) 1995-1996 by Jacek Zuk and Konrad Kokoszkiewicz

                         Made in Poland

                               ***

The IDE package contains:

1) the IDE interface
2) a power supply
3) a cable to connect the interface with a drive
4) utilities disk with MyDOS 4.53
5) this document

Index rerum

I.        Introduction
II.       Capabilities overview
III.      How to make it work (step by step)
IV.       Keystrokes
V.        Write-protection feature
VI.       Executing non-DOS software
VII.      Dual drive configuration
VIII.     Software development information
IX.       Memory usage
X.        Error messages

I. Introduction

Seven  years ago,  when I first heard about hard drives  for  the
Atari 8-bit, a 20 MB SCSI device's price was over 600 USD and, of
course,  was  out of reach for people in a country on  the  wrong
side  of  the Iron Courtain,  where wages were about 20  USD  per
month. The 1050 floppy drive was a dream - what would I say about
the hard one...?

Over  the  next six years many things have  been  changed.  Among
others, the Iron Courtain got rusty, we have started earning more
money,  got  some new Atari computers  and,  simultaneously,  the
prices of hard drives have gone down dramatically...  and one day
I realised,  that it is possible to obtain an IDE hard drive  for
the  beloved 8-bit Atari with very reasonable  price!  But  there
still was no documentation and the only one,  that I knew,  was a
theory  about writing 'new device' handlers for the XL  operating
system...

The  most  important  thing on my "way to  the  hard  drive"  has
happened,  when a friend of mine has found a "Technical Reference
Manual" for a Caviar WDAC2200.  I read this paper very carefully,
then went to Jack - a person,  who looks to know everything about
wires and other strange gadgets, those have been fixed inside and
seem to make it work.  About a week later Jack said,  that  there
was no objections (contraindications, as we used to say) to build
an interface - so the project started.

The last year we spent thinking,  talking,  building the hardware
(Jack), writing the software (me), testing, fixing bugs, catching
incompatibilities,  and learning,  learning,  learning.  We  have
discovered  a  lot of strange things about Ataris  and  IDE  hard
drives (some of them have been mentioned below).  Finally, we are
pleased  to  present you our results - we tried to make  them  as
professional,  as  it have been allowed by the limited  (2k)  ROM
space,  not  very "elastic" operating system and not  very  great
processing  power of the Atari 8-bit computer.  I hope  you  will
agree, that we did a good job.

II. Capabilities overview

The Interface's internal software provides two modes:  native and
emulation.  The  native mode uses a 512 byte physical block as  a
logical data sector,  the emulation mode uses the physical  block
to  store two 256 byte logical data sectors.  ALL existing  DOSes
require the emulation mode to work properly.

Maximum drive capacity: 8388607 physical blocks on each device.
Maximum number of partitions: 15
Maximum capacity of a partition: 8388607 logical sectors
Logical  sector length:  256 or 512 bytes (larger blocks will  be
implemented in the future)
Average speed: 58 kilobytes per second (native mode, R/W)
               32 kilobytes per second (emulation mode, reading)
               7 kilobytes per second (emulation mode, writing)
Booting from any partition
Write protection capability
8 jumpers to set the device number for the operating system

Note, that ALL existing DOSes limit the partition size to 16 MB.

III. How to make it work (step by step)

1) Make sure, that the power on your computer is turned off.
2) Insert the interface to the connector at the back side of  the
computer.
3)  Connect  the interface and a 3,5" IDE drive with  the  cable.
Caution:  You may damage the drive if the interface cable is  not
connected properly. Make sure, that pin 1 on the cable (red line)
is  connected  to pin 1 on the drive and on  the  interface  (red
dot).
4) Connect the power supply and the drive.
5) Insert the utilities disk into drive 1.
6)  Turn  on  the power on the hard drive  and  on  the  computer
holding down the SHIFT key.  Make sure,  if the drive is spinning
up properly.  If not,  turn the power off,  check the connections
and  try again.  Note,  that some very old drives need A  LOT  of
power, so our power supply may not be sufficient.
7)  Be patient - the Interface waits some seconds when the  drive
is spinning up.
8) When the MyDOS is ready to use, execute the FDISK.COM file.
9)  A menu should appear.  If you see a message like "Device  not
found" instead,  please turn the power off,  check the connection
between the interface and the computer, then try again. Check the
jumper position.
10) Select the "Surface test" from the main menu. Your drive will
be  tested  for bad sectors.  If the test  finishes  without  any
message,  the  drive is in good condition - no bad  sectors  have
been found.
11)  Select the "Partitioning" from the main menu.  "Total"  will
indicate  you total amount of 512 byte sectors,  that  have  been
found  on the drive,  "Remain" - total amount  of  sectors,  that
haven't  been  allocated  yet,  "Specs" will  show  a  number  of
cylinders, heads and sectors per track.
12) Use arrows to select a drive you want to be a partition.
13)  Press the RETURN key and type in a number of  sectors,  that
you  want to be allocated to the partition.  Note,  that it is  a
number of real,  512 byte sectors,  so if you specify 32767,  the
DOS partition will have 65534 logical, 256-byte sectors.
14)  Press RETURN to confirm the number of sectors or  press  ESC
key to cancel.
15)  If you want to have more partitions,  repeat the last  three
steps as many as you want.
16) Press the TAB key and select a partition, that you want to be
the BOOT partition.  If you are the SpartaDOS X user and you want
to have the CONFIG.SYS on the hard drive, the BOOT partition must
be D1:,  so you should change the physical number of your  floppy
drive to D2: or another.
17) Press RETURN key to set the BOOT partition.
18)  Press  the  TAB key to move the cursor to the  menu  at  the
bottom right corner of the screen.
19) Select the "Opts" option.
20) Select the boot type according to your system configuration:
- "control",  if you want to boot up MyDOS (or another DOS)  from
other  partition than D1:  The interface will take  full  control
over  the boot process.
- "pass",  if you want to boot up MyDOS (or another DOS) from D1:
The interface will pass the control over the boot process to  the
operating system.  Select this option,  if you have any  troubles
with the "controlled" boot up - the interface, taking the control
over  the boot process,  uses some hints that may not  work  with
some  DOSes,   cartridges  or  upgraded  (customized)   operating
systems.  You MUST select this option, if you are the SpartaDOS X
user.
21) Press ESC to exit the "Options" menu
22) Select the "Write" option to write the new partition table to
the drive.
23) Press ESC to return to the main menu
24) Select the "Soft format" option from the menu. The FDISK will
attempt  to   build new directories on the  attached  partitions.
Note, that the SpartaDOS 3.2 does not provide such action - to do
it, you must use a separated formatter, as the P_FORMAT.COM.
25) Exit the FDISK.
26) Write the DOS file(s) to the BOOT partition.  If you are  the
MyDOS user,  select the "H" option from the DUP menu.  If you are
the  SpartaDOS 3.2 user,  copy the DOS to the BOOT partition  and
use the BOOT command to make the disk bootable.
27) Press SELECT/RESET to cause the cold boot.  The DOS will load
itself from the drive - the installation process is completed.

Some IDE drives used to clear the BUSY and assert the READY  bits
in  their internal status registers *before* the spin-up  process
is  finished - the drive looks to be ready,  but isn't  ready  in
fact  and  cannot  execute any commands  (very  strange,  by  the
way...).  To prevent such troubles during power up,  the internal
software waits about 5 seconds before taking any action with  the
IDE controller. This delay is not necessary during the cold boot,
that  has  been caused by pressing SELECT/RESET or via  OS  entry
RESETCD (›E477).  In such case the internal software uses a  fast
initialization method.  However, if you turn the power switch off
and on very quickly,  the initial routines may not recognize this
boot process as a real power up.  As a result,  the boot  process
will  crash.  To prevent such problems,  after turning the  power
off,  you  should always wait 10-15 seconds before turning it  on
again.  This  time  should be sufficient to  invalidate  internal
flags, that have been located in RAM.

IV. Keystrokes

SHIFT/RESET disables the drive.  The drive will remain  spinning,
but the partitions will not respond to operating system  requests
(error 138). To enable it again just press the RESET key.
SELECT/RESET forces the cold boot.

V. Write-protection feature

The  IDE  hard  drive  interface  provides  the  write-protection
feature  to minimize a risk of accidental data damage  caused  by
viruses,  damaged  software  or children.  When  a  partition  is
locked, there's NO POSSIBILITY to write data to this partition or
unlock it by asserting commands,  causing a cold boot or  turning
the  power off and on.  Damaging a write-protected  partition  by
writing  accidental  data  to random  memory  locations  is  also
*practically* impossible - the risk is very small.

VI. Executing non-DOS software with the hard drive

Some software,  especially games and demos,  have their own  disk
formats  and cannot be copied to a partition.  However,  the  IDE
software provides limited capabilities to execute such programs.

If   you   selected  the  "controlled"  hard  drive   boot   when
partitioning  the drive and your BOOT partition is not  the  D1:,
you  may run the non-DOS disk from the floppy drive.  To  do  it,
insert the disk into the floppy disk drive then press SELECT  and
RESET keys holding down the SHIFT key.  The internal software  of
the IDE Interface will pass its initialization routines and  your
computer  will boot up from the floppy.  The hard drive  will  be
"invisible" for the system.

If  you want to execute such software from the  hard  drive,  you
must provide a small partition to use it in such  manner.  Though
the  D10-D15  partitions  are invisible  for  existing  operating
systems  and  cannot be accessed by DOS,  they may be  booted  as
well. When you are partitioning your drive, create a small (up to
520 physical blocks) disk,  for example D10:.  When you  complete
the installation and make the drive work,  execute the FHCOPY.COM
file from the utilities disk,  then copy your floppy to the D10:.
Now execute the FDISK,  select the "Partitioning" option from the
main menu, then press the TAB key twice to move the cursor to the
menu at the bottom right corner of the screen.  Select the "Opts"
option,  then  set  the  "Drive  redirection"  to  D10:.  If  the
"controlled" boot-up has been selected, you must change it now to
the "pass" mode.  Write new partition table,  exit the FDISK  and
reboot the system - the non-DOS program will load itself from the
hard drive.  To return to the previous configuration,  insert the
utilities  disk  to your floppy disk  drive,  reboot  the  system
holding  down the SHIFT key,  then execute the FDISK,  reset  the
"Drive redirection" to D1: and "Boot type" to its previous state,
write  the  new partition table,  exit the FDISK and  reboot  the
system.

VII. Dual drive configuration

The  IDE  drive  interface  is able to  handle  two  IDE  devices
configured  as  master and slave drives (please refer  the  drive
manual to connect it and set up properly).  However, some drives,
when  they are configured to work as the slave  device,  used  to
wait  some seconds before they start spinning.  For this  reason,
the Interface DOES NOT INITIALIZE the slave drive during power up
or reset.  It would make little sense,  because the drive is  not
spinning (i.e. is not ready) at that time. As a result, the slave
drive remains not initialized,  even if the boot process has been
finished and the system looks to be ready to use.

If the slave drive have finished the spin-up process,  there  are
two ways to make it work properly:
1)  assert the ALL RESET command (see next section), or
2)  force the system to read a sector from  any  partition,  that
have  been allocated to the slave drive - if the drive is  ready,
it will be recalibrated automatically.

Please  DO  NOT start the operating system from the  slave  drive
partitions.

VIII. Software development information

The  IDE  drive  partitions operate as normal  floppy  drives  or
ramdisks  and can be accessed via OS DISKINT (›E453)  and  SIOINT
(›E459)  routines.  All  the partitions recognize  the  following
commands:

1) Standard subset

R - read a sector - this command reads a specified logical sector
from  a specified partition.  It reads ALWAYS THE  WHOLE  LOGICAL
SECTOR,  i.e. 256 or 512 bytes, according to the current mode and
regardless  of  the DBYT value.  The sector number  is  a  24-bit
value, the most significant byte (now called DAUX3) is located at
›0307  (this byte was unused by the XL OS).  Sector numbers  less
than  ›000001  or  greater than maximum  sector  number  for  the
specified partition are invalid and will cause the error 144.

P - put a sector - writes data to a specified logical sector on a
specified  partition.   There  are  the  same  restrictions,   as
mentioned  above.  This  command  will  return  status  144  when
attempting to execute on a write-protected partition.

W - write a sector - the same, as "P" command.

S  - read status block - transfers the 4-byte disk status to  the
memory. The bit of the first byte are as follows:
     7 - not used by the hard drive
     6 - write protection enabled
     5 - double density drive (always 1)
     4 - master present (usually 1)
     3 - slave present
     2 - not used by the hard drive
     1 - not used by the hard drive
     0 - not used be the hard drive
The second byte provides reversed (eor'ed with ›FF) value of  the
IDE controller error register. The bits are as follows:
     7 - BBD - Bad block detected
     6 - ECC - Error correction code (uncorrectable error)
     5 - NUL - unused, always 1
     4 - IDNF - ID not found (target sector could not be found)
     3 - NUL - unused, always 1
     2 - AC - Aborted command
     1 - TK0 - Track 0 error (unable to find a valid track 0)
     0 - DAMNF - Data address mark not found
The normal (default) value of this byte is ›FF. The next byte has
a  dummy value ›E0.  The last byte of the status block holds  the
number of retries for the software IDE handler in ROM.

N  - read configuration - reads the 12-byte PERCOM block  to  the
memory. The values returned by a partition are as follows:
     0 - number of tracks (always 1)
     1 - revision number (›10 = 1.0)
     2 - total number of logical sectors, the middle byte
     3 - total number of logical sectors, the low byte
     4 - total number of logical sectors, the high byte
     5 - additional information:
         bit 3 - IDE hard drive partition (always 1)
         bit 2 - double density drive (always 1)
         bit 1 - 8 inch floppy disk drive (always 0)
     6 - number of bytes per logical sector, high byte
     7 - number of bytes per logical sector, low byte
     8 - unused, always ›FF
     9 - value ›49
     10 - value ›44
     11 - value ›45
The last three bytes contain an identifier of the hard drive type
("IDE").

2) Specific ones

›E6  -  sleep  drive - stops the  drives  and  deactivates  their
internal controllers. See ALL RESET command for the DCB variables
details.

›E7  - all reset - resets,  recalibrates and  reinitializes  both
hard  drives.  It is the only way to exit the  Sleep  mode.  This
command  needs  the number of any partition stored to  the  DUNIT
(›0301).  The  master drive must be present while asserting  this
command, otherwise the timeout error will occur.

›EC  -  identify drive - transfers the 512 bytes  of  data,  that
specify  the drive's parameters.  The fields are as follows (F  =
fixed value, V = variable, R = reserved, should be zero):
     0 - vendor specific information, bits are as follows:
          15 - 0, reserved for non-magnetic devices (F)
          14 - vendor specific (F)
          13 - vendor specific (F)
          12 - vendor specific (F)
          11 - vendor specific (F)
          10 - vendor specific (F)
           9 - vendor specific (F)
           8 - vendor specific (F)
           7 - removable media device, if 1 (F)
           6 - removable controller and/or device, if 1 (F)
           5 - vendor specific (F)
           4 - vendor specific (F)
           3 - vendor specific (F)
           2 - vendor specific (F)
           1 - vendor specific (F)
           0 - reserved (R)
     2 - number of cylinders (F)
     4 - reserved (R)
     6 - number of heads (F)
     8 - vendor specific
     10 - vendor specific
     12 - number of sectors per track (F)
     14 - vendor specific
     16 - vendor specific
     18 - vendor specific
     20-39 - serial number, ASCII characters (F)
     40 - vendor specific
     42 - vendor specific
     44 - number of ECC bytes transferred on LONG operations (F)
     46-53 - firmware revision, ASCII characters (F)
     54-93 - controller model number, ASCII characters (F)
     94 - numbers of sectors/interrupt R/W multiples, bits:
          15-8 - vendor specific
           7-0 - ›00 = READ/WRITE MULTIPLE not implemented (F)
                 ›01-›FF = maximum number of sectors that can  be
transferred per interrupt on READ/WRITE MULTIPLE commands (F).
     96 - reserved (R)
     98 - capabilities, bits:
          15 - reserved (R)
          14 - reserved (R)
          13 - 1 = standard standby timer values are supported
               0 = standby timer values are vendor specific (F)
          12 - reserved (R)
          11 - 1 = IORDY supported (F)
               0 = IORDY may be supported (F)
          10 - 1 = IORDY can be disabled (F)
           9 - 1 = LBA supported (F)
           8 - 1 = DMA supported (F)
          7-0 - vendor specific (F)
     100 - reserved (R)
     102 - PIO data transfer cycle timing (F)
     104 - DMA data transfer cycle timing (F)
     106-511 - reserved
All values are in standard low/high convention.  Some  parameters
are  defined  as a string of ASCII  characters.  For  the  string
"Copyright",  the  character "C" is the first byte,  "o"  is  the
second byte etc.  When such fields are transferred,  the order of
transmission is:
- the 1st character ("C") is on bits 15 through 8 of the 1st word
- the 2nd character ("o") is on bits 7 through 0 of the 1st word
- the 3rd character ("p") is on bits 15 through 8 of the 2nd word
- the 4th character ("y") is on bits 7 through 0 of the 2nd word
  etc.
Note,  that the DMA transfers,  although may be supported by  the
drive itself,  may not be supported by the current version of the
interface's hardware.  Please also refer the SLEEP DRIVE  command
to get an information about the DCB variables.

›EE  - force media change - forces the interface to  re-read  the
partition table from the drive.

All  other commands will cause error 139 (negative  acknowledge).
Note,  that the software does not provide a FORMAT DISK command -
it hasn't been implemented to prevent an accidental data  damage.
The drive must be formatted using a separated program.

Operating  system  developers  should  note,  that  the  internal
software  of the IDE Interface changes the DUNIT (›0301)  to  the
BOOT partition number during boot up.

IX. Memory usage

The   Interface's  internal  software  uses  the  following   RAM
locations: ›01 and ›34-›3C. The PDVMSK (›0247), PDVRS (›0248) and
DCB  variables  (especially DAUX3 ›0307) should be used  only  in
their proper functions (please DO NOT use them as temporary  data
registers!).  The  ›0400-›06FF  area should  also  remain  intact
during the cold boot.

X. Error messages

You can get the following error reports from the IDE drive:

138  -  Timeout  error - attempting to read or write  data  to  a
partition, that is physically allocated to the slave drive, while
the slave drive is busy,  not ready or does not exist at all;  or
attempting  to  assert the ALL RESET command,  while  the  master
drive  is  not  present.   It  may  occur,  if  you  accidentally
disconnect the master drive or disconnect the slave drive without
reconfiguring  your  system.  It  may  also  indicate  a  damaged
partition  table  - please reboot your  system.  If  this  action
doesn't  cause any effect,  you must use the FDISK to repair  the
partition   table.   See  also  section  VII.   -   "Dual   drive
configuration".

139 - Invalid command

144 - Device done error:
1)  the  software attempted to write data  to  a  write-protected
partition.
2)  the software attempted to read or write data outside  of  the
limits, those are valid for the partition.
3) there is a bad sector on the partition.  Please assert the "S"
command to get the value of the internal IDE error register.
4)  the  interface's  software is unable to  handle  your  drive.
Please run the FDISK and select the "Surface test" from the  main
menu.  If the test fails and you know, that your drive is in good
condition  (no bad blocks) for sure,  please assert the  IDENTIFY
DRIVE command (from a BASIC,  for example),  copy the buffer to a
file and send the file to us.

Konrad M.Kokoszkiewicz (KMK)
E-mail: conradus@plearn.edu.pl


Craig Lisowski (clisowsk@mcs.kent.edu)