home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / mbug / mbug117.arc / WD2793.LBR / WD2793.DQC / WD2793.DOC
Text File  |  1979-12-31  |  12KB  |  271 lines

  1.                WD1793/2793 Floppy Disk Controller
  2.  
  3.   Thesσá note≤ wil∞ givσ brieµ detail≤ fo≥ programminτ thσ WD279│ 
  4. flopp∙á disδá controller«á Therσ arσ mino≥á difference≤á fo≥á thσ 
  5. WD197│ controller¼ bu⌠ wil∞ no⌠ bσ considereΣ here¼ anΣ thu≤ thi≤ 
  6. can be considered as valid for that controller too.
  7.  
  8.  
  9.   Notσ thesσ detail≤ havσ beeε tailoreΣ toward≤ thσ Impementatioε 
  10. iεá thσ microBeσ anΣ hencσ somσ detail≤ havσ beeε ignoreΣ a≤ the∙ 
  11. arσá oµ n∩ interes⌠ iε thi≤ situation¼á anΣ somσá specific≤á onl∙ 
  12. relatσá t∩á thσá MicroBeσá (sucΦ a≤ methoΣ oµá disδá anΣá densit∙ 
  13. selectioε)
  14.  
  15.                  ------$$$$$$------
  16.  
  17. Section One   Register Information
  18.  
  19.   Registers
  20.  ---------------------------------------------------------------
  21.  A0   A1     Read                  Write             'Bee Addr
  22.  ---------------------------------------------------------------
  23.   0    0    Status Register       Command Register       44H
  24.   0    1    Track  Register       Track   Register       45H
  25.   1    0    Sector Register       Sector  Register       46H
  26.   1    1    Data   Register       Data    Register       47H
  27.  ---------------------------------------------------------------
  28.  
  29.  
  30.   Commands (simplified)
  31.  ---------------------------------------------------------------
  32.   Command                         Bits
  33.                           7    6    5    4    3    2    1    0
  34.  ---------------------------------------------------------------
  35.  Restore                  0    0    0    0    h    V    r1   r0
  36.  Seek                     0    0    0    1    h    V    r1   r0
  37.  Step                     0    0    1    T    h    V    r1   r0
  38.  Step-in                  0    1    0    T    h    V    r1   r0
  39.  Step-out                 0    1    1    T    h    V    r1   r0
  40.  Read Sector              1    0    0    m    1*   E    0*   0
  41.  Write Sector             1    0    1    m    1*   E    0*   0
  42.  Read Address             1    1    0    0    0    E    0    0
  43.  Read Track               1    1    1    0    0    E    0    0
  44.  Write Track              1    1    1    1    0    E    0    0
  45.  Force Interrupt          1    1    0    1    I3   I2   I1   I0
  46.  ---------------------------------------------------------------
  47.  * use these values for compatibility with 2795/7
  48.  
  49.  Flag Summary
  50.  
  51.  r1 r0 Stepping Rates       see chart below
  52.  
  53.  ╓á    TracδáNumbe≥áVerif∙  ╓ ╜ 0¼án∩ verif∙
  54.                             ╓á╜á1, verify destination track
  55.  
  56.  h     Head Load Flag       h = 0, unload head at beginningè                            h = 1, load head at beginning
  57.  
  58.  T     Track Update Flag    T = 0, no update
  59.                             T = 1, update Track Register
  60.  
  61.  E     Delay                E = 0, no delay
  62.                             E = 1, 30 msecs delay
  63.  
  64.  m     Multiple Record      m = 0, single record (sector)
  65.        Flag                 m = 1, multiple records (sectors)
  66.  
  67.  Ix    Interrupt Conditions see chart below
  68.  
  69.  --------------------------------------
  70.  r1 r0             Head Stepping Rates
  71.  --------------------------------------
  72.  0  0                 6 msecs
  73.  0  1                12 msecs
  74.  1  0                20 msecs
  75.  1  1                30 msecs
  76.  ---------------------------------------
  77.  
  78.  
  79.  ------------------------------------------------------
  80.  Ix = Interrupt Condition Flags
  81.  ------------------------------------------------------
  82.  I0 = 1      Interrupt on Not Ready to Ready Transition
  83.  I1 = 1      Interrupt on Ready to Not Ready Transition
  84.  I2 = 1      Interrupt on Index Pulse
  85.  I3 = 1      Interrupt Immediate (requires a reset)
  86.  I3 - I0 = 0 Terminate with NO Interrupt
  87.  ------------------------------------------------------
  88.  
  89.  
  90.  
  91. ---------------------------------------------------------------
  92.   Status Register Bit meanings
  93. ---------------------------------------------------------------
  94. S7 after all commands         1 = not ready      
  95.                               0 = ready
  96.  
  97. S6 after seek/write command   1 = write protected
  98.                               0 = not write protected
  99.  
  100. S5 after seek command         1 = head loaded
  101.                               0 = head not loaded
  102.  
  103. S╡ afte≥ reaΣ commanΣ         ▒ ╜ deleteΣ datß addres≤ mark
  104.                               0 = Data Mark
  105.  
  106. S┤áafte≥áseeδácommanΣá        ▒á╜áseeδáerro≥á(tracδ no⌠ verified)
  107.                               0 = OK or verify not requested
  108.  
  109. S4 after read/write           1 = Record (Sector) Not found
  110.    sector command             0 = OKè
  111. S3 after seek, read/write     1 = CRC error
  112.    secor command              0 = OK
  113.  
  114. S2 after seek command         1 = Track Zero
  115.                               0 = Not Track Zero
  116.  
  117. S2 after read/write           1 = Lost Data
  118.    command                    0 = OK
  119.  
  120. S1 after after seek command   1 = Index Pulse
  121.                               0 = no Index Pulse detected
  122.  
  123. S1 after read/write command   1 = Data Transfer Request Active
  124.                               0 = no Data Transfer Request Active
  125.  
  126. S0 all commands               1 = Busy (command in progress)
  127.                               ░á╜ No⌠áBus∙
  128. ---------------------------------------------------------------
  129.  
  130.  
  131.  
  132. -----------------------------------------------------------
  133. Select/Side/Density Latch (MicroBee Only)   Write Addr 48H
  134. -----------------------------------------------------------
  135. bit 0                LSB Drive Address
  136. bit 1                MSB Drive Address
  137. bit 2                Side Select (0 = side 0, 1 = side 1)
  138. bit 3                Density Select (0 = SD, 1 = DD)
  139. ------------------------------------------------------------
  140. Drive Addresses  00 = A, 01 = B, 10 = C, 11 = D
  141.  
  142.  
  143.  
  144. ------------------------------------------------------------
  145. Transfer Status Bit (MicroBee Only)          Read Addr 48H
  146. ------------------------------------------------------------
  147. bit 7                bit = 1 Data or Interrupt Request Active
  148.                      bit = 0 No Data or Interrupt Request
  149. ------------------------------------------------------------
  150.  
  151.  
  152.  
  153.                  ------$$$$$$------
  154.  
  155.  
  156.  
  157. Section Two    Code Examples
  158.  
  159. ;code to restore head of currently selected disk to track zero
  160.         ld      a,00bh          ; restore, load head, slow step rate
  161. cmd_out:out     (044h),a        ; send to command register
  162.         call    delay           ; call mandatory delay
  163. ready:  in      a,(044h)        ; read status registerè        bit     0,a             ; still busy ?
  164.         jr      nz,ready        ; yes, go back and try again
  165.         ret                     ; complete
  166.  
  167. ╗á dela∙ mus⌠ allo≈ time betweeε commanΣ writσ anΣ statu≤ 
  168. ;   read
  169. delay:  ld      a,010h          ; number of loops
  170. loop:   dec     a               ; decrement count
  171.         jr      nz,loop         ; finished ?
  172.         ret
  173.  
  174.  
  175.  
  176. ; code to seek to a given track/sector
  177. ;  ( assume track in D register, sector in E register)
  178.         ld     a,d              ; load a with track
  179.         out    (047h),a         ; load track into floppy data reg
  180.                                 ╗ yes¼ thi≤ i≤ correct. Thσ tracδ 
  181.                                 ; register contains current track
  182.                                 ╗áposition«áI⌠ái≤áuseΣáb∙ control
  183.                                 ; ler to calculate direction and
  184.                                 ; number of steps needed.....
  185.         ld     a,01dh           ; seek command, 12 msecs steps
  186.         call   cmd_out          ; 
  187.         ld     b,00ah           ; delay value
  188.         call   big_delay        ; wait awhile
  189.         in     a,(044h)         ; read floppy status register
  190.         and    018h             ; look at seek and crc bits only
  191.         push   af               ; save
  192.         ld     a,e              ; get sector address
  193.         out    (046h),a         ; write to floppy sector register
  194.         pop    af               ; go and examine status
  195.                                 ;  (not shown)
  196.  
  197. big_delay:
  198.         push   hl               ; save register
  199. delay1: ld     hl,0007ah        ; inner loop value
  200. delay2: dec    hl
  201.         ld     a,h              ; bug in 8080/Z80 dec hl
  202.         or     l                ;  does not set flags
  203.         jr     nz,delay2        ; finished inner loop ?
  204.         djnz   delay1           ; finished outer loop ?
  205.         pop    hl               ; restore
  206.         ret                     ; complete
  207.  
  208.  
  209. ╗ácodσát∩áreaΣá51▓ bytσ secto≥á (assume≤ádrive/track/sector» 
  210. ;  selected⌐
  211.         ld     b,000h            ; count of 256 times 2 bytes
  212.         ld     c,048h            ; data transfer request port
  213.         lΣ     hl,data_addres≤   ╗álocation iε memor∙ for data
  214.         dΘá                      ╗ canno⌠áafforΣáinterrupt≤ 
  215.         ld     a,088h            ; read sector command
  216.         call   cmd_out           ; as above
  217. loop1:  in     a,(c)             ; get transfer port status
  218.         jp     p,loop1           ; bit 7 = 1 ?, no try againè        in     a,(047h)          ; yes, read the data register
  219.         ld     (hl),a            ; store byte in memory
  220.         inc    hl                ; increment address
  221. loop2:  in     a,(c)             ; get transfer port status
  222.         jp     p,loop1           ; bit 7 = 1 ?, no try again
  223.         in     a,(047h)          ; yes, read the data register
  224.         ld     (hl),a            ; store byte in memory
  225.         inc    hl                ; increment address
  226.         djnz   loop1             ; loop till all 512 bytes read
  227.         ei                       ; time critical part is over now
  228.         call   ready             ; get floppy status
  229. ╗á wσ woulΣ theε examinσ thσ stau≤ fo≥ success¼á iµ no⌠ retr∙ thσ 
  230. ;   operation until the retry count (typically 16x) is exhausted
  231. ;   (code not shown for this)
  232.  
  233.  
  234.                  ------$$$$$$------
  235.  
  236.  
  237.  Section Three     Formatting
  238.  
  239.   T∩á forma⌠á ßá tracδá ß ful∞ tracδá writσá operatioεá i≤á giveε 
  240. followed by data bytes in a given sequence. Certain rules must be 
  241. addherred to, a typical sequence for double density is :-
  242.  
  243.  
  244.     80 bytes of 4e hex     for clock sync and gap
  245. AAA 12 bytes of 00 hex     clock sync
  246.     3  bytes of f5 hex     writes special a1 on floppy
  247.     1  byte  of fe hex     ID address mark
  248.     1  byte  of xx hex     track number goes here
  249.     1  byte  of xx hex     00 or 01, the side number (MicroBee
  250.                            always uses 0 for both sides!)
  251.     1  byte  of xx hex     sector number goes here
  252.     1  byte  of xx hex     sector length 00=128 01=256 02=512 
  253.                                          03=1024
  254.     1  byte  of f7 hex     write CRC character
  255.     22 bytes of 4e hex     for clock sync and gap
  256.     12 bytes of 00 hex     clock sync
  257.     3  bytes of f5 hex     writes special a1 on floppy
  258.     1  byte  of fb hex     data address mark
  259.     xx bytes of e5 hex     data - 128, 256, 512 or 1024 bytes long
  260.     1  byte  of f7 hex     write CRC character
  261.     50 bytes of 4e hex     for clock sync and gap
  262. loop to AA┴ unti∞ al∞ sector≤ donσ then paΣ res⌠ oµ tracδ witΦ 4e's
  263.  
  264.  Thσá numbe≥á oµ byte≤ oµ 4E anΣ 0░ varie≤ dependinτ oε ho≈á man∙ 
  265. sector≤á onσ i≤ tryinτ t∩ squasΦ ont∩ ß track.....MicroBeσ value≤ 
  266. arσálower. See disassemblyáof DDFORMAT fo≥ aε eas∙á t∩áunderstanΣ 
  267. format program. You will see some of the examples above used.....
  268.  
  269.                                                 Tony Ellis VK2ZNH
  270.                                                          13.09.87
  271.