home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 1 / crawlyvol1.bin / utility / disk / zorg_134 / autoconf / divers.s < prev   
Text File  |  1993-11-27  |  4KB  |  185 lines

  1. /********************************************************************
  2. *                                                                    *
  3. *        lit un ou plusieurs secteurs du disque dur sans driver        *
  4. *                                                                    *
  5. ********************************************************************/
  6.  
  7.     XDEF hard_read
  8.  
  9. /* int hard_read( long debut, int nombre, char *buffer, int control ) */
  10. /* les paramètres sont dans D0, D1, A0 et D2 dans l'ordre */
  11.  
  12. hard_read:
  13.     move.l a0,buffer
  14.     move.w d1,nombre
  15.     move.l d0,debut
  16.     move.w d2,control
  17.     pea    read
  18.     move.w #$26,-(a7)    ;Supexec
  19.     trap #14
  20.     addq.l #6,a7
  21.     rts
  22.  
  23. buffer:
  24.     ds.l 1
  25. nombre:
  26.     ds.w 1
  27. debut:
  28.     ds.l 1
  29. control:
  30.     ds.w 1
  31.  
  32. /* int hard_read */
  33.     
  34. /********************************************************************
  35. *                                                                    *
  36. *                    I/O du disque dur sans driver                    *
  37. *                                                                    *
  38. ********************************************************************/
  39.  
  40. wdc        = $ffff8604     ;FDC/HDC-Access, DMA-Sector-Count
  41. wdl        = wdc+2            ;DMA-Mode/Status
  42. dma        = $ffff8609     ;DMA-Adress HI
  43. flock    = $43E            ;Floppy-VBL-Flag
  44. port     = $fffffa01     ;Parallel-Port, Bit 5=HDC-IRQ
  45.  
  46. read:            ; * Lire secteurs *
  47.     lea wdc,a0
  48.     st flock            ;Mémoriser routine Floppy-VBL
  49.  
  50.     moveq #0,d0            ;efface D0
  51.     move.w control,d0    ;Numéro de contrôle
  52.     lsl #5,d0            ;bits 0, 1 et 2 dans 5, 6 et 7
  53.     swap d0
  54.     move.l #$08008a,d1    ;Commande READ du controleur 0
  55.     or.l d0,d1
  56.  
  57.     move.w #$88,2(a0)    ;Accès HDC, A1=0
  58.     nop
  59.     move.l d1,(a0)        ;Commande READ complète
  60.  
  61.     move.l buffer,-(a7)    ;buffer-Adress
  62.     bsr    setdma            ;Positionner DMA 
  63.     addq.l #4,a7
  64.  
  65.     bsr set_parameters    ;Nombre et numéros de secteurs 
  66.     bmi tout            ;Timeout    !
  67.  
  68.     move.w #$190,2(a0)
  69.     nop
  70.     move.w #$90,2(a0)    ;Remettre en READ
  71.     nop
  72.     move.w nombre,(a0)    ;Envoyer Sector-Count au DMA 
  73.     nop
  74.     move.w #$8a,2(a0)
  75.     nop
  76.     move.l #0,(a0)        ;Commencer transfert
  77.     bsr    waitl            ;Attendre max. 3 secondes
  78.     bmi    tout            ;Timeout !
  79.     move.w #$8a,2(a0)
  80.     bra    exec
  81.  
  82. write:                ; * Ecrire secteurs *
  83.     lea    wdc,a0
  84.     st flock            ;Mémoriser Floppy-VBL 
  85.     move.l buffer,-(a7)
  86.     bsr setdma            ;Positionner Adresse DMA
  87.     addq.l #4,a7
  88.  
  89.     move.w control,d0    ;Numéro de contrôle
  90.     lsl #5,d0            ;bits 0, 1 et 2 dans 5, 6 et 7
  91.     swap d0
  92.     move.l #$0a008a,d1    ;Commande WRITE du controleur 0
  93.     or.l d0,d1
  94.  
  95.     move.w #$88,2(a0)    ;Accès HDC, A1=0
  96.     nop
  97.     move.l d1,(a0);Commande WRITE complète
  98.  
  99.     moveq #0,d0
  100.  
  101.     bsr    set_parameters    ;Nombre et numéros de secteurs
  102.     bmi    tout            ;Timeout !
  103.  
  104.     move.w #$90,2(a0)
  105.     nop
  106.     move.w #$190,2(a0)    ;Mettre sur WRITE
  107.     nop
  108.     move.w nombre,(a0)    ;Envoyer Sector-Count au DMA 
  109.     nop
  110.     move.w #$18a,2(a0)
  111.     nop
  112.     move.l #$100,(a0)    ;Commencer transfert
  113.     bsr waitl            ;Attendre max. 3 secondes
  114.     bmi tout            ;Timeout !
  115.     move.w #$18a,2(a0)
  116.  
  117. exec:
  118.     nop
  119.     move.l (a0),d6        ;Recupérer HDC/DMA-Status dans D6 
  120.     and.l #$ff00ff,d6    ;HI=HDC, LO=DMA
  121. tout:
  122.     move.w #$80,2(a0)    ;Mettre sur FDC 
  123.     nop
  124.     move.l (a0),d7        ;Récupérer Completion-Byte 
  125.     and.l #$ff00ff,d7    ;HI=HDC (0), LO=DMA
  126.     clr flock            ;Libérer routine Floppy-VBL
  127.     rts                    ;fini
  128.  
  129. set_parameters:        ;Définir nombre de secteurs et Sector-Count 
  130.     move.w #$8a,2(a0)
  131.     bsr wait            ;Attendre que HDC-OK
  132.     bmi setpx            ;Timeout !
  133.  
  134.     clr.w d0
  135.     move.b debut+1,d0    ;Sectornr. HI
  136.     bsr send_byte
  137.     bmi setpx
  138.  
  139.     move.b debut+2,d0    ;Sectornr. MID
  140.     bsr send_byte
  141.     bmi setpx
  142.  
  143.     move.b debut+3,d0    ;Sectornr. LO
  144.     bsr send_byte
  145.     bmi setpx
  146.  
  147.     move.w nombre,d0    ;Nombre de secteurs
  148.     bsr send_byte
  149. setpx:
  150.     rts                ;fin
  151.  
  152. send_byte:        ; * Envoyer 1 octet au HDC *
  153.     swap d0
  154.     move.w #$8a,d0
  155.     move.l d0,(a0)
  156.     bra wait
  157.  
  158. waitl:        ;Attendre OK max. 3 secondes
  159.     move.l #450000,count
  160.     bra wait1
  161. wait:        ;Attendre OK max. 100 ms 
  162.     move.l #15000,count
  163. wait1:
  164.     subq.l #1,count
  165.     bmi timeout
  166.     move.b port,d0
  167.     and.b #$20,d0    ;HDC-Interrupt ?
  168.     bne wait1        ;non
  169.     moveq #0,d0        ;oui => OK
  170.     rts
  171.  
  172. timeout:
  173.     moveq #-1,d0    ;Timeout 
  174.     rts
  175.  
  176. setdma:        ; * Positionner adresse DMA *
  177.     move.b 7(a7),dma+4    ;LO
  178.     move.b 6(a7),dma+2    ;MID
  179.     move.b 5(a7),dma    ;HI
  180.     rts
  181.  
  182. even
  183. count:
  184.     dc.l 1        ;Timeout-Counter
  185.