home *** CD-ROM | disk | FTP | other *** search
/ The Unsorted BBS Collection / thegreatunsorted.tar / thegreatunsorted / programming / misc_programming / hd.spc < prev    next >
Text File  |  1989-12-26  |  14KB  |  417 lines

  1.  
  2.  
  3. function:
  4.                  Fixed Disk I/O
  5.                ------------------
  6.                                                       L.H. KUNG     04/10/1989
  7.                                                 
  8. description:    
  9.  
  10.         AH = 00h  Reset disk system
  11.         AH = 01h  Read status of last operation
  12.         AH = 02h  Read desired sectors into memory
  13.         AH = 03h  Write desired sectors from memory
  14.         AH = 04h  Verify desired sectors
  15.         AH = 05h  Format desired cylinder
  16.         AH = 06h  Invalid function call
  17.         AH = 07h  Invalid function call
  18.         AH = 08h  Read drive parameters
  19.         AH = 09h  Initialize drive pair characteristics
  20.         AH = 0ah  Read long
  21.         AH = 0bh  Write long
  22.         AH = 0ch  Seek
  23.         AH = 0dh  Alternate disk reset
  24.         AH = 0eh  Invalid function call
  25.         AH = 0fh  Invalid function call
  26.         AH = 10h  Test drive ready
  27.         AH = 11h  Recalibrate
  28.         AH = 12h  Invalid function call
  29.         AH = 13h  Invalid function call
  30.         AH = 14h  Invalid function call
  31.         AH = 15h  Read DASD type
  32.         AH = 16h  Invalid function call
  33.         AH = 17h  Invalid function call
  34.         AH = 18h  Invalid function call
  35.         AH = 19h  Park heads
  36.  
  37. Input:
  38.  
  39.         AH = function number   (value check)
  40.         AL = number of sectors (non-value check)
  41.         DH = head number       (non-value check)
  42.         DL = drive number      (80H based, value check)
  43.         CH = cylinder number - low 8 bits  (non-value check)
  44.         CL = sector number - bits 0-5      (non-value check)
  45.              bits 6-7 are high 2 cylinder bits
  46.         ES:BX = transfer buffer address
  47.  
  48. Output:
  49.  
  50.         40:74 = last fixed disk operation status
  51.            AH = status of operation
  52.            CF = 1 - status is non 0
  53.                 0 - status is 0
  54.  
  55. Referenced BIOS data area:
  56.  
  57.         40:72 = reset flag
  58.         40:74 = last fixed disk operation status
  59.         40:75 = number of fixed disk drives attached
  60.         40:8c = dixed disk drive controller status
  61.         40:8d = dixed disk drive controller error status
  62.         40:8e = fixed disk drive interrupt control
  63.  
  64. Port definition: 
  65.  
  66.         port 1F0h -- Data Register                         R/W
  67.         port 1F1h -- Error Register                        R
  68.         port 1F2h -- Sector Count Register                 R/W
  69.         port 1F3h -- Sector Number Register                R/W
  70.         port 1F4h -- Cylinder Low                          R/W
  71.         port 1F5h -- Cylinder High                         R/W
  72.         port 1F6h -- SDH Register                          R/W
  73.         port 1F7h -- Status Register                       R
  74.                      Command Register                      W
  75.         port 3F6h -- Alternate Status Register             R
  76.         port 3F7h -- Drive Address Register                R
  77.  
  78. Note 1 :   Enter this software interrupt service routine, the value of
  79.            function number (ah) and drive number (dl) must be checked
  80.            before executing relative service request. Error return code 01
  81.            -- invalid function request will return when value invalid.
  82.  
  83. Note 2 :   The status of fixed disk can be get from port 3F6H or 1F7H. The
  84.        Difference between port 3F6H and 1F7H is taht fixed disk interrupt
  85.        pending signal can be clear by using port 1F7H, but port 3F6H can
  86.        not.
  87.  
  88. Note 3 :   For power saving consideration in laptop machine, user can set
  89.        desired time to make WDC enter idle mode after last read/write/
  90.        verify/seek operation.
  91.  
  92. Note 4 :   There are three modes for WDC in laptop machine : READ/WRITE,
  93.        SEEKING, and IDLE mode. The READ/WRITE mode occurs when data is 
  94.        being read from or written to the disk. The SEEKING mode while 
  95.        the head is in motion. The IDLE mode occurs when the drive is not 
  96.        reading,writing or seeking.  The motor is up to speed and DRIVE
  97.        READY condition exists.  Head is residing on last accessed track.
  98.  
  99. Note 5 :   For seeking command, some WDC support parameters to change seek
  100.        speed. But new WDC will use top seek speed and don't care parameter
  101.        in seek command.
  102.  
  103. Note 6 :   The Conner WDD will turn off motor automaticlly when power supply 
  104.        unstable, and turn on motor after about 1 minute.
  105.  
  106. Note 7 :   For performance consideration, disk service routine does not use
  107.        DMA in data transfer.
  108.  
  109. Note 8 :   For performance consideration, please use in/out string instruction
  110.        in data transfer.
  111.  
  112. Note 9 :   The fixed disk service routine support 2 WDD drive only.
  113.  
  114. Note 10:   The WDC use IRQ 0EH to acknowlege the fixed disk service that the
  115.        command completion or data transfer completion.
  116.  
  117. Note 11:   The fixed disk type information stores in CMOS. Please reference
  118.        CMOS definition.
  119.  
  120.  
  121.  
  122. RESET DISK SYSTEM
  123.  
  124.         input :      AH = 00h, 0Dh
  125.                   DL = drive no. (bit 7 = 1 - fixed disk drive
  126.                                           0 - diskette drive   )
  127.  
  128.         output:   AH = status of operation
  129.                   CF = 1 - status is non 0 (error occured)
  130.                        0 - status is 0 (no error)
  131.  
  132. Note 1 :   The diskette system is also reset for all values of dl.
  133.  
  134. Note 2 :   Prior to waiting for the fixed disk reset, call INT 15,
  135.            ah = 90h (device bysy) with al = 00h (type = disk)
  136.            informing the operating system of the wait.
  137.  
  138. Note 3 :   This function include 3 sub-functions : reset disk, initialize
  139.        disk, and recalibrate.
  140.  
  141.  
  142. READ STATUS OF LAST OPERATION
  143.  
  144.         input :   AH = 01h
  145.                   DL = drive no. bit 7 = 1 for fixed disk drive (80H - base)
  146.  
  147.         output:   AH = status of operation
  148.                   AL = last fixed disk operation status
  149.                   CF = 1 - status is non 0 (error occured)
  150.                        0 - status is 0 (no error)
  151.  
  152. Note 1 :   Disk status(40:74H) is reset to 0
  153.  
  154.  
  155. READ DESIRED SECTORS INTO MEMORY
  156.  
  157.  
  158.         input :   AH = 02h
  159.                   DL = drive no. bit 7 = 1 for fixed disk drive (80H-base)
  160.                   DH = head no. (0-base)
  161.                   CH = cylinder low (0-base)
  162.                   CL = bit 7, 6 - cylinder high
  163.                        bit 5 - 0 - sector no. (1-base)
  164.                   AL = number of sector
  165.                ES:BX = address of buffer
  166.  
  167.         output:      AH = status of operation
  168.                   CF = 1 - status is non 0 (error occured)
  169.                        0 - status is 0 (no error)
  170.  
  171. Note 1 :   Wait interrupt before transfer 512 bytes.
  172.  
  173.  
  174.  
  175. WRITE DESIRED SECTORS FROM MEMORY
  176.  
  177.  
  178.         input :   AH = 03h
  179.                   DL = drive no. bit 7 = 1 for fixed disk drive (80H-base)
  180.                   DH = head no. (0-base)
  181.                   CH = cylinder low (0-base)
  182.                   CL = bit 7, 6 - cylinder high
  183.                        bit 5 - 0 - sector no. (1-base)
  184.                   AL = number of sector
  185.                ES:BX = address of buffer
  186.  
  187.         output:   AH = status of operation
  188.                   CF = 1 - status is non 0 (error occured)
  189.                        0 - status is 0 (no error)
  190.  
  191. Note 1 :    Wait interrupt after transfer 512 bytes.
  192.  
  193.  
  194.  
  195. VERIFY DESIRED SECTORS
  196.  
  197.  
  198.         input :   AH = 04h
  199.                   DL = drive no. bit 7 = 1 for fixed disk drive (80H-base)
  200.                   DH = head no. (0-base)
  201.                   CH = cylinder low (0-base)
  202.                   CL = bit 7, 6 -cylinder high
  203.                        bit 5 - 0 - sector no. (1-base)
  204.                   AL = number of sector
  205.  
  206.         output:      AH = status of operation
  207.                   CF = 1 - status is non 0 (error occured)
  208.                        0 - status is 0 (no error)
  209.  
  210.  
  211.  
  212. FORMAT DESIRED CYLINDER
  213.  
  214.  
  215.         input :   AH = 05h
  216.                   DL = drive no. bit 7 = 1 for fixed disk drive (80H-base)
  217.                   DH = head no. (0-base)
  218.                   CH = cylinder low (0-base)
  219.                   CL = bit 7, 6 -cylinder high
  220.                ES:BX = point to a 512-byte buffer.
  221.                        The first 2 x (sectors per cylinder) bytes
  222.                        contain F, N for each sector :
  223.                                F = 00h - good sector
  224.                                N - sector no.
  225.  
  226.         output:   AH = status of operation
  227.                   CF = 1 - status is non 0 (error occured)
  228.                        0 - status is 0 (no error)
  229.  
  230. Note 1 :   For MS-DOS limitation, this function only support WDD that have
  231.        cylinders below 1024. So please check cylinder before execution.
  232.  
  233.  
  234.  
  235. READ DRIVE PARAMETERS
  236.  
  237.  
  238.         input :   AH = 08h
  239.                   DL = drive no. bit 7 = 1 for fixed disk drive (80-base)
  240.  
  241.         output:   AH = status of operation
  242.                   DL = number of consecutive drives attached
  243.                   DH = maximum head number
  244.                   CH = cylinder low
  245.                   CL = cylinder high (high order 2 bits)
  246.                   CF = 1 - status is non 0 (error occured)
  247.                        0 - status is 0 (no error)
  248.  
  249.  
  250.  
  251. INITIALIZE DRIVE PAIR CHARACTERISTICS
  252.  
  253.  
  254.         input :   AH = 09h
  255.                   DL = drive no. bit 7 = 1 for fixed disk drive (80-base)
  256.  
  257.         output:   AH = status of operation
  258.                   CF = 1 - status is non 0 (error occured)
  259.                        0 - status is 0 (no error)
  260.  
  261. note 1 :    INT 41H point to a parameter table for drive 0.
  262.  
  263. note 2 :    INT 46H point to a parameter table for drive 1.
  264.  
  265.  
  266. READ LONG
  267.  
  268.  
  269.         input :   AH = 0ah
  270.                   DL = drive no. bit 7 = 1 for fixed disk drive (80-base)
  271.                   DH = head no. (0-base)
  272.                   CH = cylinder low (0-base)
  273.                   CL = bit 7, 6 -cylinder high
  274.                        bit 5 - 0 - sector no. (1-base)
  275.                   AL = no. of sector to be transfered
  276.                ES:BX = address of buffer
  277.  
  278.         output:      AH = status of operation
  279.                   CF = 1 - status is non 0 (error occured)
  280.                        0 - status is 0 (no error)
  281.  
  282. note 1 :    The read long request read 512-byte data and 4-byte ECC.
  283.  
  284. note 2 :    In this function WDC would not do ECC check.
  285.  
  286. note 3 :    The data bytes and ECC bytes must be read seperately.
  287.  
  288.  
  289.  
  290. WRITE LONG
  291.  
  292.  
  293.         input :   AH = 0bh
  294.                   DL = drive no. bit 7 = 1 for fixed disk drive (80-base)
  295.                   DH = head no. (0-base)
  296.                   CH = cylinder low (0-base)
  297.                   CL = bit 7, 6 -cylinder high
  298.                        bit 5 - 0 - sector no. (1-base)
  299.                   AL = no. of sector to be transfered
  300.                ES:BX = address of buffer
  301.  
  302.         output:      AH = status of operation
  303.                   CF = 1 - status is non 0 (error occured)
  304.                        0 - status is 0 (no error)
  305.  
  306. note 1 :    The write long request write 512-byte data and 4-byte ECC.
  307.  
  308. note 2 :    In this function WDC would not do ECC check.
  309.  
  310. note 3 :    The data bytes and ECC bytes must be write seperately.
  311.  
  312.  
  313.  
  314. SEEK
  315.  
  316.  
  317.         input :   AH = 0ch
  318.                   DL = drive no. bit 7 = 1 for fixed disk drive (80-base)
  319.                   DH = head no. (0-base)
  320.                   CH = cylinder low (0-base)
  321.                   CL = bit 7, 6 -cylinder high
  322.  
  323.         output:      AH = status of operation
  324.                   CF = 1 - status is non 0 (error occured)
  325.                        0 - status is 0 (no error)
  326.  
  327.  
  328.  
  329. ALTERNATE DISK RESET
  330.  
  331.  
  332.         input :   AH = 0dh
  333.                   DL = drive no. bit 7 = 1 for fixed disk drive (0 - base)
  334.  
  335.         output:      AH = status of operation
  336.                   AL = last fixed disk operation status
  337.                   CF = 1 - status is non 0 (error occured)
  338.                        0 - status is 0 (no error)
  339.  
  340. note 1 :    The disk status is reset to 0
  341.  
  342. note 2 :    This function same as ah = 00h
  343.  
  344.  
  345.  
  346. TEST DRIVE READY
  347.  
  348.  
  349.         input :   AH = 10h
  350.                   DL = drive no. bit 7 = 1 for fixed disk drive (80-base)
  351.  
  352.         output:      AH = status of operation
  353.                   CF = 1 - status is non 0 (error occured)
  354.                        0 - status is 0 (no error)
  355.  
  356.  
  357.  
  358. RECALIBRATE
  359.  
  360.  
  361.         input :   AH = 11h
  362.                   DL = drive no. bit 7 = 1 for fixed disk drive (80-base)
  363.  
  364.         output:      AH = status of operation
  365.                   CF = 1 - status is non 0 (error occured)
  366.                        0 - status is 0 (no error)
  367.  
  368.  
  369.  
  370. READ DASD TYPE
  371.  
  372.  
  373.         input :   AH = 15h
  374.                   DL = drive no. (bit 7 = 1 - fixed disk drive
  375.                                           0 - diskette drive  )
  376.  
  377.         output:      AH = 00h - drive not present or (dl) invalid
  378.                        01h - reserved for diskette interface
  379.                        02h - reserved for diskette interface
  380.                        03h - fixed disk
  381.                CX,DX = number of 512-byte blocks
  382.                        if AH = 0 then CX = DX = 0
  383.                   CF = 0 - operation successfully completed
  384.  
  385.  
  386.  
  387. PARK HEADS
  388.  
  389.  
  390.         input :   AH = 19h
  391.                   DL = drive no. bit 7 = 1 for fixed disk drive (80-base)
  392.  
  393.         output:      AH = status of operation
  394.                   CF = 1 - status is non 0 (error occured)
  395.                        0 - status is 0 (no error)
  396.  
  397.  
  398.  
  399. INVALID FUNCTION REQUEST
  400.  
  401.  
  402.         input :   AH = 06h, 07h, 12h, 13h, 14H, 0eh, 0fh
  403.                        16h to 18h,
  404.                        19h to FFh
  405.                   DL = greater than number of fixed disk drive attached
  406.  
  407.         output:   AH = 1 -- invalid function request
  408.  
  409. note 1 :    The INT 13H check the value of AH and DL, and return 01 if
  410.             invalid.
  411.  
  412. note 2 :    The bit 7 of DL must be cleared before checking, and DL is
  413.             0-based, it must be increased one before compared to number of
  414.             drive attached.
  415.  
  416.  
  417.