/* HL: a sprite forrás adataira mutat D: X E: Y B: szélesség C: magasság Figyelem! A rutin nem végzi el a video memória belapozást (a játékokban úgy is érdemes a sprite-okat ciklikusan kezelni és csak a ciklus eleján egyszer belapozni a video lapot. IX tartalma megváltozik! */ Sprite16: push bc ld ixl,d // x koordináta átmenetileg ixl-be kerül ex de,hl // de-be mentjük a forrás adatok címét ld h,0 // hl-be kerül az y koordináta // a következő 6 db összeadással hl-t (vagyis az y koordinátát) szorozzuk 64-el add hl,hl add hl,hl add hl,hl add hl,hl add hl,hl add hl,hl ld c,ixl // bc immár az x koordinátát tartalmazza ld b,0 // hozzá adjuk hl-hez az x koordinátát (ugye eredetileg hl=64*y!) add hl,bc add hl,8000H // majd a video memcsi kezdőcímét pop ix // IXH a szélesség, IXL a magasság, DE a sprite forrás, HL pedig a poziciónak megfelelő vid. cím cikl1: push hl cikl2: ld b,0 // B lesz a maszk ld a,(de) ld c,a // C a forrás byte and f0H // Első pont a sprite adatban átlátszó-e? jnz tov1 ld b,f0H // ha igen, akkor a maszknak a felső 4 bitjét beállítjuk tov1: ld a,c // Másik pixel átlátszó-e? and 15 jnz tov2 ld a,b add 15 ld b,a tov2: // itt B a maszk, C pedig a forrás byte ld a,(hl) // itt jön a maszkolás ill. a forrás byte bemásolása and b or c ld (hl),a // itt kerül ki a byte fizikailag is a képernyőre // A cél mutatót ill. a forrás mutatót is növeljük eggyel, azaz vesszük a következő 2 pixelt inc hl inc de dec ixh // megismételjük "szélesség"-szer jnz cikl2 // HL-t visszamozgatjuk a 0-nak megfelelő x pozicióba, majd hozzá adunk 64-et, hogy vegyük a következő sort pop hl ld bc,64 add hl,bc dec ixl // majd a második ciklusban a vesszük az összes sort jnz cikl1 ret