Uživatelské nástroje

Nástroje pro tento web


lnxspectrum:dma

Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

Obě strany předchozí revizePředchozí verze
Následující verze
Předchozí verze
Následující verzeObě strany příští revize
lnxspectrum:dma [2014/11/02 11:18] lanexlnxspectrum:dma [2014/11/02 12:29] lanex
Řádek 5: Řádek 5:
 === Z80-DMA a ZX Spectrum === === Z80-DMA a ZX Spectrum ===
  
-DMA čip standardně v ZX Spectru použitý nebyl. Objevil se jen jako přídavný interface, například v **MB02+**, nebo v **DataGear**. Pokud se aktivuje přenos pomocí DMA, procesor Z80 mu přenechá všechen strojový čas, a sám stojí, dokud DMA přenos nedokončí. Konstrukce ZX Spectra není k využívání DMA příliš nakloněna.+DMA čip standardně v ZX Spectru použitý nebyl. Objevil se jen jako přídavný interface, například v **MB02+**, nebo v **DataGear**. Pokud se aktivuje přenos pomocí DMA, procesor Z80 mu přenechá všechen strojový čas, a sám stojí, dokud DMA přenos nedokončí. DMA se ovládá pomocí jediného portu, u MB02+ je to port 11, u DataGearu je to port 107. LnxSpectrum ho emuluje na portu 11
  
-Nejvýhodnější by samozřejmě bylo DMA použít pro scrollování obrazovky. Bohužel u ZX díky svému rozložení VideoRam lze DMA použít jen pro horizontální scroll, a to ještě jen v případě scrollování vždy celých třetin obrazovky. Vertikální scroll není pro jistotu možný vůbec, nebo by spotřeboval větší množství strojového času, než jaký by potřeboval ke stejnému přenosu samotný procesor Z80. V čem je problém? Vždyť přenos jednoho bajtu trvá DMA 6 taktů, a nejrychlejší přenos Z80 (LDI) sežere 16 taktů na 1 bajt. Problém je v inicializaci DMA čipu, která se pro přesun malých bloků prostě nevyplatí. U vertikálního scrollingu potřebujeme přenášet bloky o velikosti 32 bajtů:+Nejvýhodnější by samozřejmě bylo DMA použít pro scrollování obrazovky. Jenže v tomto případě není konstrukce ZX Spectra k využívání DMA příliš nakloněna. Díky svému rozložení VideoRam lze DMA použít jen pro horizontální scroll, a to ještě jen v případě scrollování vždy celých třetin obrazovky. Vertikální scroll není pro jistotu možný vůbec, nebo by spotřeboval větší množství strojového času, než jaký by potřeboval ke stejnému přenosu samotný procesor Z80. V čem je problém? Vždyť přenos jednoho bajtu trvá DMA 6 taktů, a nejrychlejší přenos Z80 (LDI) sežere 16 taktů na 1 bajt. Problém je v inicializaci DMA čipu, která se pro přesun malých bloků prostě nevyplatí. U vertikálního scrollingu potřebujeme přenášet bloky o velikosti 32 bajtů:
  
 |Přenos 32 bajtů |taktů | |Přenos 32 bajtů |taktů |
Řádek 18: Řádek 18:
  
 Pro přenos větších bloků však DMA nemá v ZX Spectru konkurenta. DMA přenese kopii obrazovky za 41472 taktů, procesor Z80 to zvládne za 110592 taktů, tedy skoro 3x pomaleji. Pro přenos větších bloků však DMA nemá v ZX Spectru konkurenta. DMA přenese kopii obrazovky za 41472 taktů, procesor Z80 to zvládne za 110592 taktů, tedy skoro 3x pomaleji.
 +
 +=== Jak v Z80 Assembleru přenést blok pomocí DMA ===
 +
 +V tomto příkladu přeneseme z adresy 0 do VideoRam 2048 Bajtů včetně barev:
 +<code>
 +; Created by LnxSpectrum emulator (www.ilnx.cz)
 +
 + org 50000
 +
 +start: ld hl,0 ;z adresy 0
 + ld (odkud),hl
 + ld hl,2047 ;o délce 2048 (-1)
 + ld (delka),hl
 + ld hl,16384 ;na adresu Videoram (16384)
 + ld (kam),hl
 + ld hl,dma
 + ld b,len_initblok ;délka inicializačního bloku DMA
 + ld c,11 ;DMA je na portu 11
 + otir ;pošli inicializační blok do DMA,
 + ;tím se i DMA spustí
 +
 +;tady se procesor Z80 zastaví, a nebude provádět žádné instrukce, dokud
 +;DMA nedokončí přenos všech bajtů.
 +
 + ld hl,0 ;opět z adresy 0
 + ld (odkud),hl
 + ld hl,255 ;o délce 256 bajtů (-1)
 + ld (delka),hl
 + ld hl,22528 ;na adresu barev ve videoram (22528)
 + ld (kam),hl
 + ld hl,dma
 + ld b,len_initblok ;délka inicializačního bloku DMA
 + ld c,11 ;DMA je na portu 11
 + otir ;pošli inicializační blok do DMA,
 + ;tím se i DMA spustí
 +
 +;tady se procesor Z80 zastaví, a nebude provádět žádné instrukce, dokud
 +;DMA nedokončí přenos všech bajtů.
 +
 + ret ;hotovo, návrat
 +
 +dma: defb #C3,#C7,#CB,#7D ;inicializační instrukce pro DMA
 +odkud: defw 0 ;adresa bloku urceneho pro prenos
 +delka: defw 0 ;delka prenaseneho bloku
 + defb #14,#10,#C0,#AD ;instrukce pro DMA
 +kam: defw 0 ;adresa kam se ma prenest
 + defb #92,#CF,#B3,#87 ;instrukce pro DMA
 +len_initblok: equ $-dma
 +</code>
lnxspectrum/dma.txt · Poslední úprava: 2018/07/31 10:05 autor: 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki