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ček | Dec | Opis | Smer | Opomba |
0xF0 | 240 | Glavni register stanja (MSR) | Vhod | Samo branje |
0xF1 | 241 | Podatkovni register | V/I | Ukazi, parametri in rezultati |
0xE8 | 232 | Vektor prekinitve FDC | Izhod | Zapiši vektor IRQ ob inicializaciji |
11.2 Biti registra stanja MSR
| Bit | Ime | Opis |
| 7 | RQM | Zahteva za prenos: 1 = krmilnik pripravljen |
| 6 | DIO | Smer podatkov: 1 = FDC→CPU, 0 = CPU→FDC |
| 5 | EXM | Način izvajanja: podatkovni prenos v teku |
| 4 | CB | FDC zaseden (ukaz v teku) |
| 3–0 | D3B–D0B | Posamezni pogon zaseden (bit N = pogon N) |
11.3 Ukazi
| Koda | Ukaz | Parametri | Rezultati |
0x03 | SPECIFY | 2 bajta | – |
0x07 | RECALIBRATE | 1 bajt | – (IRQ) |
0x08 | SENSE INTERRUPT STATUS | – | ST0 + PCN |
0x06 | READ DATA | 8 bajtov | ST0, ST1, ST2, C, H, R, N |
0x05 | WRITE DATA | 8 bajtov | ST0, ST1, ST2, C, H, R, N |
0x0F | SEEK | 2 bajta | – (IRQ) |
0x04 | SENSE DRIVE STATUS | 1 bajt | ST3 |
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