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


DISK HANDLER COMMANDS


GET SECTOR

Before the JSR to DSKINV is made the following parameters are set.

          GET SECTOR parameters

          DCOMND = $52 (82)
          DUNIT  = (1 - 4)
          DBUFHI
          and
          DBUFLO = address of 128 byte buffer
          DAUX1
          and
          DAUX2  = Sector number (LSB,MSB)

This operation will read the specified sector and put the data into the specified buffer.


PUT SECTOR

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

PUT SECTOR WITH VERIFY is used the same as PUT SECTOR except for DCOMND.

          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.


GET STATUS

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.

        Bit

          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.


FORMAT DISK

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)
          DBUFLO
          and
          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


Go to chapter 8
Go to chapter 10