ATR: chpt.9: Resident Disk Handler

From: Craig Lisowski (aa853@cleveland.Freenet.Edu)
Date: 01/04/94-02:38:40 PM Z

From: aa853@cleveland.Freenet.Edu (Craig Lisowski)
Subject: ATR: chpt.9: Resident Disk Handler
Date: Tue Jan  4 14:38:40 1994

                                   CHAPTER 9
                           THE RESIDENT DISK HANDLER
     The resident disk handler is separate from DOS and is part of the
     permanent operating system ROM.  The disk handler does not use CIO.
     The resident disk handler works with one sector at a time.  It is used
     by setting the drive number, sector number, and operation code in the
     device control block.  The program then jumps (JSR) to the handler
     entry vector, DSKINV [$E453 (58451)].
               Device control block (for resident disk handler)
     DDEVIC [$0300 (768)]
          Serial bus I.D.  Set by handler
     DUNIT  [$0301 (769)]
          Drive number
     DCOMND [$0302 (770)]
          Command byte
     DSTATS [$0303 (771)]
          status byte
     DBUFLO [$0304 (772)]
     DBUFHI [$0305 (773)]
     Pointer to 128 byte memory block for data storage.
     DTIMLO [$0306 (774)]
          Timeout value (response time limit) in seconds
     DBYTLO [$0308 (776)]
     DBYTHI [$0309 (777)]
          number of bytes transferred, set by handler
     DAUX1  [$030A (778)]
     DAUX2  [$030B (779)]
          sector number
     Before the JSR to DSKINV is made the following parameters are set.
                             GET SECTOR parameters
          DCOMND = $52 (82)
          DUNIT  = (1 - 4)
          DBUFLO = address of 128 byte buffer
          DAUX2  = Sector number (LSB,MSB)
     This operation will read the specified sector and put the data into
     the specified buffer.
     PUT SECTOR is used the same as GET SECTOR except for DCOMND.
                             PUT SECTOR parameters
          DCOMND = $50 (80)
     This operation sends the data in the specified buffer to the specified
     disk sector.
     PUT SECTOR WITH VERIFY is used the same as PUT SECTOR except for
                       PUT SECTOR WITH VERIFY parameters
          DCOMND = $57 (87)
     This operation sends the data in the specified buffer to the specified
     disk sector then checks for errors.
     Only the DUNIT and DCOMND need to be set
                             GET STATUS parameters
          DCOMND = $53 (83)
          DUNIT  = (1 - 4)
     The status information will be put in three bytes starting at DVSTAT
     [$02EA (746)].
                                 Status format
                          7 6 5 4 3 2 1 0
          DVSTAT + 0     | command stat   |
                 + 1     | hardware stat  |
                 + 2     | timeout value  |
     The command status byte gives the following information.
          0    1 = invalid command frame received
          1    1 = invalid data frame received
          2    1 = unsuccessful PUT operation
          3    1 = disk is write protected
          4    1 = active/standby
     The hardware status byte contains the status register of the ISN1771-1
     disk controller chip.
     The timeout byte contains the maximum allowable response time for the
     drive in seconds.
     The handler will format then verify the the disk.  The numbers of all
     bad sectors (up to 63) will be put into the specified buffer followed
     by two bytes of $FF.
     The following parameters are set before the call.
                               FORMAT parameters
          DCOMND = $21 (33)
          DUNIT  = (1 - 4)
          DBUFHI = address of bad sector list (buffer)

     After the operation the status byte is set.  Also, DBYTLO and DBYTHI
     will contain the number of bytes of bad sector information (not
     including the two $FF bytes).
                   Useful data base variables and OS equates
     DVSTAT $02EA,3      (746): device status block, 3 bytes
     DDEVIC $0300        (768): serial bus I.D.
     DUNIT  $0301        (769): device number
     DCOMND $0302        (770): command byte
     DSTATS $0303        (771): status byte
     DBUFLO $0304        (772): data buffer
     DBUFHI $0305        (773):  pointer
     DTIMLO $0306        (774): timeout value
     DBYTLO $0308        (776): number of bytes transfered
     DBYTHI $0309        (777):
     DAUX1  $030A        (778): sector
     DAUX2  $030B        (779):  number
     DSKINV $E453      (58451): disk handler entry vector

Return to message index