Revenir au plan du site

Initialisation de l'écran de départ sur le scrolling multi-directionnel

Après adaptation pour rendre l'affichage paramétrable, un autre point n'avait pas été abordé précédemment : Pouvoir initialiser les écrans de départ à partir de n'importe quelle position dans la tileMap. Rien de bien compliqué, il faut juste changer l'adresse de la tileMap! C'est un placement à la tile. Pour un placement au pixel et à la ligne près, il faudra appeler les routines de scrolling (avec les encres au noir pour que ça soit transparent pour l'utilisateur).
;=====================================================
InitEcran
;=====================================================
; IX = structure buffer
; HL = position de départ dans la tileMap
; A = poids fort de la page vidéo
ld (ix+multi.nextBuffer),de
ld hl,depx : ld (hl),0
ld hl,depy : ld (hl),0
ld hl,tileMap
ld (ix+multi.mapOffset),hl
ld hl,0
ld (ix+multi.HSSR),h
ld (ix+multi.VSSR),h
ld (ix+multi.colonne),h
ld (ix+multi.ligne),h
ld (ix+multi.crtcHL),hl
ld h,a : ld (ix+multi.adresseDebut),hl
rrca : rrca : ld (ix+multi.crtc12),a

; Afficher les tuiles sur tout l'écran

ld de,(ix+multi.adresseDebut)
; on n'utilise plus la structure IX à partir de là
pop ix ; on récupère l'info de la position dans la tileMap
ld yh,256/ENGINE_TILE_HEIGHT ; 8 tuiles en hauteur de 32 lignes de haut

afficheLigne
ld yl,ENGINE_NBTILE_WIDTH ; nombre de tuiles en largeur octet (8x8=64)
push de ; sauvegarder l'adresse de début de ligne de l'écran
afficheTuile
push de ; sauvegarder l'adresse du début de la première tuile à l'écran à gauche
ld h,hi(tuiles_index) : ld l,(ix+0) : inc xl : ld a,(hl) : inc h : ld h,(hl) : ld l,a ; HL=tile start
ld bc,((ENGINE_TILE_HEIGHT+1)<<8)|ENGINE_TILE_WIDTH-1 ; ajuster C au maximum pour contrôler l'effet de bord des LDI (compatible tilesize==256)
afficheLigneTuile
ldi ENGINE_TILE_WIDTH
ld a,l : sub ENGINE_TILE_WIDTH : ld l,a : inc h ; note : calcul faux sur la dernière ligne si tilesize==256, mais le résultat ne sera pas utilisé
NextLineDE_width
ld a,e : sub ENGINE_TILE_WIDTH : ld e,a
ld a,d : sbc #F8 : ld d,a : and #38 : jr nz,_+
ld a,64 : add e : ld e,a
ld a,#C0 : adc d : ld d,a
res 3,d
_
djnz,afficheLigneTuile

pop hl : ld bc,ENGINE_TILE_WIDTH : add hl,bc : ex hl,de ; se placer juste à côté de la tuile précédente
dec yl
jr nz,afficheTuile

ld bc,ENGINE_MAP_WIDTH-ENGINE_NBTILE_WIDTH : add ix,bc ; revenir à la ligne de tuile (map de 128x128 et 8 tuiles en largeur)
pop hl : ld bc,64*ENGINE_TILE_HEIGHT/8 : add hl,bc : ex hl,de ; se placer sous les tuiles à gauche DE est nouvelle adresse
dec yh : jr nz,afficheLigne
ret

Vous pouvez télécharger le proof of concept complet [ ICI ] Niveau rendu visuel, c'est pareil, sauf que c'est plus rapide (et facile pour vous à utiliser)