Partner WFG, 2FG, 1FG – CELOVIT OPIS STROJNE OPREME

11. KRMILNIK DISKETNIH ENOT (INTEL 8272)

==========================================

Intel 8272 (znan tudi kot NEC µPD765A) je krmilnik disketnih enot, ki podpira do štiri pogone. Na računalniku Partner upravlja branje in pisanje na diskete. Komunikacija s procesorjem poteka prek dveh V/I priključkov: registra stanja 0xF0 (samo branje) in podatkovnega registra 0xF1 (branje in pisanje). Vektor prekinitve FDC se nastavi prek priključka 0xE8.

11.1   Priključki

PriključekDecOpisSmerOpomba
0xF0240Glavni register stanja (MSR)VhodSamo branje
0xF1241Podatkovni registerV/IUkazi, parametri in rezultati
0xE8232Vektor prekinitve FDCIzhodZapiši vektor IRQ ob inicializaciji

11.2   Biti registra stanja MSR

BitImeOpis
7RQMZahteva za prenos: 1 = krmilnik pripravljen
6DIOSmer podatkov: 1 = FDC→CPU, 0 = CPU→FDC
5EXMNačin izvajanja: podatkovni prenos v teku
4CBFDC zaseden (ukaz v teku)
3–0D3B–D0BPosamezni pogon zaseden (bit N = pogon N)

11.3   Ukazi

KodaUkazParametriRezultati
0x03SPECIFY2 bajta
0x07RECALIBRATE1 bajt– (IRQ)
0x08SENSE INTERRUPT STATUSST0 + PCN
0x06READ DATA8 bajtovST0, ST1, ST2, C, H, R, N
0x05WRITE DATA8 bajtovST0, ST1, ST2, C, H, R, N
0x0FSEEK2 bajta– (IRQ)
0x04SENSE DRIVE STATUS1 bajtST3
Partner WFG, 2FG, 1FG – CELOVIT OPIS STROJNE OPREME

11.4   Primer: branje sektorja s diskete

Primer: Branje prvega sektorja (C=0, H=0, R=1, N=2) s pogona 0 v pomnilnik
; Makro za pošiljanje bajta na FDC (čaka na RQM=1, DIO=0)
; Izhod: bajt v akumulatorju
fdc_pošlji:
        in      a, (#0xF0)          ; Preberi MSR
        and     #0xC0                ; Preverimo RQM in DIO
        cp      #0x80                ; RQM=1, DIO=0?
        jr      nz, fdc_pošlji       ; Čakaj

        ld      a, (hl)             ; Bajt iz tabele
        out     (#0xF1), a          ; Zapiši na FDC
        inc     hl
        ret

; Makro za branje bajta iz FDC (čaka na RQM=1, DIO=1)
fdc_preberi:
        in      a, (#0xF0)          ; Preberi MSR
        and     #0xC0                ; Preverimo RQM in DIO
        cp      #0xC0                ; RQM=1, DIO=1?
        jr      nz, fdc_preberi      ; Čakaj

        in      a, (#0xF1)          ; Preberi bajt
        ret

beri_sektor:
        ; Pošlji ukaz READ DATA (9 bajtov)
        ld      hl, fdc_beri_ukaz
        call    fdc_pošlji          ; 0x06: ukaz READ DATA
        call    fdc_pošlji          ; 0x00: pogon 0, glava 0
        call    fdc_pošlji          ; 0x00: valj (C)
        call    fdc_pošlji          ; 0x00: glava (H)
        call    fdc_pošlji          ; 0x01: sektor (R)
        call    fdc_pošlji          ; 0x02: velikost sektorja (N=2 → 512 B)
        call    fdc_pošlji          ; 0x01: zadnji sektor (EOT)
        call    fdc_pošlji          ; 0x1B: medstrani vrzel (GPL)
        call    fdc_pošlji          ; 0xFF: dolžina podatkov (DTL, neuporabljeno pri N≠0)

        ; Preberi 512 bajtov podatkov
        ld      hl, cilj_pomnilnik  ; Ciljna lokacija
        ld      bc, #512
.preberi_zanka:
        call    fdc_preberi
        ld      (hl), a
        inc     hl
        dec     bc
        ld      a, b
        or      c
        jr      nz, .preberi_zanka

        ; Preberi 7 bajtov rezultata (ST0, ST1, ST2, C, H, R, N)
        ld      b, #7
.rezultat_zanka:
        call    fdc_preberi
        djnz    .rezultat_zanka

        ret

fdc_beri_ukaz: .db 0x06, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0x1B, 0xFF
cilj_pomnilnik: .equ 0x8000