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

10. NEPOSREDNI DOSTOP DO POMNILNIKA (Z80 DMA)

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

Zilog Z80 DMA (Direct Memory Access) omogoča hitro prenašanje blokov podatkov med pomnilniškimi naslovi ali med pomnilnikom in V/I napravami brez neposrednega posredovanja procesorja. Na računalniku Partner je DMA krmilnik preslikan na en sam priključek 0xC0.

DMA se programira s pisanjem zaporedja bajtov na priključek 0xC0. Vsak bajt se interpretira glede na predhodno poslan nadzorni bajt; z njim se nastavijo registri WR0–WR6, ki določajo izvorno in ciljno naslov, dolžino bloka, smer prenosa ter prekinitve.

10.1   Priključki

PriključekDecOpisSmerOpomba
0xC0192DMA registerV/IPisanje zaporedja registrov WR0–WR6

10.2   Registri WR0–WR6

RegisterOpis
WR0Naslov izvora, dolžina bloka, smer (pomnilnik↔pomnilnik ali pomnilnik↔V/I)
WR1Lastnosti vrat A (korak naslova, tip: pomnilnik ali V/I)
WR2Lastnosti vrat B (korak naslova, tip: pomnilnik ali V/I)
WR3Maske, iskanje, prekinitve
WR4Naslov cilja, način prenosa (enojni, paketni, neprekinjen)
WR5Avtomatski ponovni zagon, signal READY
WR6Ukaz: Reset, Omogoči DMA, Onemogoči DMA, Stanje
Primer: Kopiranje 256 bajtov iz 0x8000 v 0x9000
dma_kopiraj:
        ; --- WR6: Ponastavi DMA ---
        ld      a, #0xC3            ; Ukaz: ponastavi DMA
        out     (#0xC0), a

        ; --- WR0: Naslov izvora = 0x8000, dolžina = 256, pomnilnik → pomnilnik ---
        ld      a, #0x7D            ; WR0: naslov A, dolžina, bit 2=prenos
        out     (#0xC0), a
        ld      a, #0x00            ; Naslov A nizki bajt (0x8000)
        out     (#0xC0), a
        ld      a, #0x80            ; Naslov A visoki bajt
        out     (#0xC0), a
        ld      a, #0x00            ; Dolžina nizki bajt (256)
        out     (#0xC0), a
        ld      a, #0x01            ; Dolžina visoki bajt
        out     (#0xC0), a

        ; --- WR1: Vrata A – pomnilnik, korak +1 ---
        ld      a, #0x14            ; WR1
        out     (#0xC0), a

        ; --- WR2: Vrata B – pomnilnik, korak +1 ---
        ld      a, #0x28            ; WR2
        out     (#0xC0), a

        ; --- WR4: Naslov cilja = 0x9000, neprekinjen način ---
        ld      a, #0x85            ; WR4: naslov B, neprekinjen način
        out     (#0xC0), a
        ld      a, #0x00            ; Naslov B nizki bajt (0x9000)
        out     (#0xC0), a
        ld      a, #0x90            ; Naslov B visoki bajt
        out     (#0xC0), a

        ; --- WR6: Zaženi DMA ---
        ld      a, #0x87            ; Ukaz: omogoči DMA
        out     (#0xC0), a

        ; Počakaj na konec prenosa
.cakaj:
        in      a, (#0xC0)          ; Preberi stanje DMA
        bit     1, a                 ; Bit 1: prenos v teku
        jr      nz, .cakaj           ; Čakaj, dokler ni zaključen

        ret