C'est sous ce jeu de mots douteux que je vais vous parler des scrolls hards verticaux, encore appelés scrolling-Registre 5 en raison de l'aide précieuse que fournit ce registre du CRTC pour décaler vers le haut (ou vers le bas), et avec fluidité, tout un écran.Cette technique que nous allons vous décrire est employée dans le jeu Mission Genocide (un budget de Firebird que je ne saurais trop vous conseiller) ou dans quelques démos (comme le menu et la Nega-part de The Demo ou la BSC Megademo par exemple). La méthode est relativement simple (encore fallait-il la trouver), et je m'en va vous l'expliquer de ce pas. Il suffit en fait de séparer l'écran en deux parties au moins, comme pour une rupture toute simple, ainsi que papy Longshot vous l'a expliqué il ya quelque temps dans un précédent numéro. Ce n'est qu'ensuite que le registre 5 intervient: grâce à lui. on décale sans se fatiguer d'une ligne ou plus un des écrans de la rupture, vers le haut ou vers le bas. Comme le registre 5 ne peut varier qu'entre 0 et 31, on ne se sert, en réalité, que des valeurs 0 à 7, et on décale alors l'écran également à l'aide du pointeur Video, autrement dit, les registres 12 et 13 du CRTC. Il faut juste faire attention à une chose, ne pas oublier de changer également la valeur du registre 5 des autres écrans de la rupture. Celle-ci doit être égale au complément à 7 de la valeur du registre 5 de l'écran qui scrolle. Cela doit être fait pour stabiliser les écrans et éviter qu'ils ne sautillent. Voilà pour la partie hard, mais il reste encore la partie soft, autrement dit l'affichage des motifs du scroll. Eh bien, il suffit de descendre, à chaque balayage d'une ligne sur l'écran, si le scrolling est ascendant et réciproquement, afin de compenser le décalage généré par le scrolling hard. Sous des aspects compliqués, ce système est en réalité très simple, et il est beaucoup plus rapide qu'un scrolling vertical réalisé en soft. Son seul inconvénient est la nécessité d'une rupture, mais ce problème disparaît avec un usage avisé des interruptions, ce qui est en quelque sorte réalisé dans le programme ci-contre puisqu'il se synchronise sur des HALTs. Voilà justement une parfaite transition pour vous parler du programme de cette fois-ci, mais je trouve qu'il est suffisamment commenté pour ne pas avoir à l'expliquer; disons simplement qu'il fait défiler un message à caractères géants grâce à un scrolling hard vertical. Par contre, je vais vous parler de la façon dont est générée la fonte géante du scrolling. Etant donné que chaque caractère ne prend que 64 octets en mémoire et fait 256 lignes de haut sur 64 octets (256 pixels en mode 1) sur j'écran, soit 16 Ko, je crois que le mot « géant» n'est pas de trop. Nous avons déjà vaguement parlé de cette technique de compression lors du listing d'une démo. Chaque octet des caractères en mémoire correspond, en fait, à un morceau du caractère géant, un « bloc»utilisé par plusieurs caractères. Dans le programme, ces blocs sont définis grâce à des caractères Ascii assemblés pour ne pas prendre trop de place. Pour la même raison, il n'y a dans le programme que les matrices des caractères qui composent le mot « 100% ». Toutefois, il y a bien une gestion de texte, c'est-à-dire que vous pouvez très bien vous amuser à définir les matrices des autres caractères, avec une restriction cependant: ces caractères doivent être dans l'ordre Ascii. Voilà pourquoi, dans le programme, le « % » de « 1 00% » est remplacé par un « / » (slash), code qui est juste avant le « 0 » et le « 1 » dans l'ordre Ascii. Je rajouterai enfin que ce type de compression par bloc est utilisé, non seulement, dans les démos pour faire défiler des caractères, mais également dans les jeux pour les scrollings de décor. Donc, le programme fait défiler l'écran du haut vers le bas à raison d'une ligne par balayage. Je vous laisse le soin de voir comment changer le sens ou la vitesse, ce n'est pas compliqué, mais cela demande rigueur et attention. De toute façon, on ne possède que ce dont on a l'expérience... Sur ces paroles hautement philosophiques (si! si !) je vous laisse méditer. A bientôt! ; ; SCROLLING HARD VERTICAL ; ; (c)Pict / Logon system Mai 1993 ; ; Assemble avec DAMS ; ; charge en banque #c4 (#4000) ; ORG #3000 ; ENT $ ; ; largeur en mots de l'ecran: ; r1 EQU 32 ; ; Initialisation mode et texte ; LD a,1 CALL #bc0e CALL #bb4e ; ; Dessin de la matrice ; des blocs ; (6 blocs de 4 caracteres ; de hauteur) ; LD b,6*4 LD hl,tabchr lpaff1 PUSH bc LD b,4lpaff2 ; ; on affiche une ligne ; de chaque bloc ; LD a, (hl) INC hl CALL #bb5a DJNZ lpaff2 POP bc ; ; on passe au debut de ; la ligne suivante grace ; aux codes de controle ; LD a,10 CALL #bb5a LD a,13 CALL #bb5a DJNZ lpaffl ; ; On sauve les blocs ; LD b,24*8 LD hl,#c000 LD de , matrix lcopy PUSH bc LD bC,8 LDIR LD bc,#800-8 ADD hl,bc JP nC,nocarry LD bC,#c050 ADD hl,bc nocarry POP bc DJNZ lcopy ; ; Affiche le message ; en bas de l'ecran ; XOR a CALL #bc0e LD h,15 LD 1,2 CALL #bb75 LD hl,mess LD e,2 affmess LD a,e PUSH hl CALL #bb90 POP hl INC e LD a, (hl) OR a JP z,messaff INC hl CALL #bb5a JP affmess messaff ; configure le format ; de l'ecran ; LD bc,#bc01 OUT (C),C LD BC,#BD00+r1 OUT (C),C LD bc,#bc02 OUT (c),c LD bC,#bd00+43 OUT (c) ,c ; ; On interrompt le ; firmware ; DI LD hl, (#38) LD (syst+1),hl LD hl,#c9fb LD (#38) ,hl ; ; Passe en Banque #cO ; qui est en fait une ; partie de l'ecran. ; LD bc,#7fc0 OUT (c) ,c ; Efface l'ecran en #4000 LD hl,#4000 LD (hl),0 PUSH hl POP de PUSH de POP bc INC de DEC bc LDIR ; ; Change les couleurs ; des encres ; LD hl ,mess LD bC,#7f00+13 colorip OUT (c),c DEC hl LD a, (hl) OUT (c),a DEC c JP nz,colorlp ; ; Boucle principale ; BCLP DI ; ; on attend la synchro Verticale LD B,#F5 vs IN A, (C) RRA JP NC,vs ; ; Aussitot apres,on configure ; les registres pour la rupture ; ; On affiche 256 lignes LD BC,#BC06 OUT (C),C LD BC,#BD20 OUT (C),C LD BC,#BC07 OUT (C),C LD BC,#BD7F OUT (C),C ; ; On passe en mode 1 ; et on initialise le ; diviseur d'interruption ; LD BC,#7F9d EI ; ; On met en noir l'encre 1 ; afin de cacher l'effet de ; saccade creer par le decalage ; de l'ecran LD de,#0154 OUT (c),c OUT (c) ,d OUT (c) ,e ; ; Gestion Scroll Vertical ; ; on envoie l'adresse Hard ; de l'ecran aux registres ; du CRTC ; OFFSET LD HL,#1000 LD BC,#BC0C OUT (C),C INC B OUT (C) ,H DEC b INC c OUT (C),C INC B OUT (C),L ; ; On fait monter l'ecran ; d'une ligne grace au ; registre 5,et toutes ; les 8 lignes,on change ; l'adresse Hard de l'ecran ; charup LD de,rl VERTY LD A,8 speed SUB 1 AND 7 LD (VERTY+1) ,A JP nZ,ver ADD HL,de ver ; ; On s'assure que l'adresse ; hard de l'ecran scrollant ; ne deborde pas ; LD c,a LD a,h AND %11 OR #10 LD h,a LD (OFFSET+1) ,HL ; ; On envoie la valeur de ; decalage au registre 5 ; du crtc ; LD a,c xor1 XOR 0 LD BC,#BC05 OUT (C),C INC B OUT (C) ,A ; ; on attend quelques lignes ; LD bC,260 tempo DEC bc LD a,b OR c JP nz,tempo ; ; puis on initialise ; le reg 4 du CRTC LD BC,#BCP4 OUT (C),C LD BC,#BD1B OUT (C),C ; ; ainsi que l'adresse ; du second écran ; OFFSET2 LD HL,#3000 LD BC,#BC0C OUT (C),C INC B OUT (C),H DEC b INC c OUT (C),C INC B OUT (C) ,L ; ; Il faut alors ; complementer le ; registre 5 ; VERTICAL LD A, (VERTY+l) LD BC,#BC05 OUT (C),C INC B xor2 XOR 7 OUT (C) ,A ; puis on affiche ; le 1er raster LD bC,3 temp1 DEC bc LD a,b OR c JP nz,temp1 LD hl,raster1 LD a,10 LD bC,#7f01 OUT (c) ,c rastlp1 LD c, (hl) OUT (c),c INC hl LD e,12 tempr1 DEC e JP nz,temprl NOP NOP DEC a JP nz,rastlpl ; ; On a plus qu'a attendre ; Nl HALT N2 HALT N3 HALT N4 HALT ; ; ...attendre encore... ; LD bC,324 temp2 DEC bc LD a,b OR c JP nz,temp2 ; ; et afficher le 2nd raster ; LD hl,raster2 LD a,10 LD bC,#7f01 OUT (c),c rastlp2 LD c, (hl) OUT (c) ,c INC hl LD e,12 tempr2 DEC e JP nz,tempr2 NOP NOP DEC a JP nz,rastlp2 N5 HALT ; ; Passe en mode 0 1 LD bc,#7f8c OUT (c) ,c ; ; Reconfigure les ; registres du CRTC ; pour le 2eme écran ; LD BC,#BC04 OUT (C),C LD BC,#BD07 OUT (C) ,C LD BC,#BC07 OUT (C) ,C LD BC,#BD05 OUT (C),C LD BC,#BC06 OUT (C),C LD BC,#BD05 OUT (C),C ; ; Gestion de l'affichage ; ; les blocs font 32 lignes ; de hauteur ; ctmat LD a,#lf INC a AND #H LD (ctmat+l),a JP nZ,cnty ; ; les caracteres font 8 blocs de hauteur ; ctchr LD a,7 INC a AND 7 LD (ctchr+l) ,a JP nz,chline ; ; gestion du texte ; ctxt LD hl,text LD a, (hl) INC hl OR a JP nZ,charok LD hl,text LD a, (hl) INC hl charok LD (ctxt+l) ,hl CP 32 JP nz,nospace ; ; si c'est un caractere ; d'espacement,on affiche ; des octets nuls (qui sont ; en fait dans le 1er bloc) LD hl,matrix LD (chline+l) ,hl ; ; et on s'arrange pour qu'il ; fasse 4 blocs de haut ; LD a,4 LD (ctchr+l),a JP chline ; ; sinon gn trouve quelle ; matrice lui correspond ; (on multiplie par 64, ; ce qui est la taille ; de la matrice d'un ; caractere) ; nospace SUB 47 LD h,0 LD l,a ADD hl,hl ADD hl,hl ADD hl,hl ADD hl,hl ADD hl,hl ADD hl,hl LD de,tabchar ADD hl,de LD (chline+l) ,hl ; ; on copie l'adresse de la ; des blocs dans un buffer ; chline LD hl,tabchar LD bC,matrix PUSH iy LD iy,buffer LD a,8 nline LD d, (hl) LD e,0 EX de,hl ADD hl,bc EX de,hl INC hl LD (iy+1) ,d LD (iy+0) ,e INC iy INC iy DEC a JP nZ,nline POP iy LD (chline+l) ,hl ; ; On descend sur llecran . ; d'une ligne pour compenser ; l'effet de scrolling ; cnty LD hl,#4000 LD a,h ADD a,8 LD h,3 AND #38 JP nZ,noca LD a,h SUB #40 LD h,a LD a,l ADD a,rl*2 LD l,a JP nC,noca INC h LD a,h AND 7 JP nZ,noca LD a,h SUB 8 LD h,a noca LD (cnty+l) ,hl ; ; on affiche une ligne de ; chacun des blocs du ; caractere grace a la pile ; qui pointe sur le buffer ; decrit plus haut ; EX de,hl DI LD (stack+l),sp LD sp,buffer LD a,8 mlp POP hl LDI LDI LDI LDI LDI LDI LDI LDI PUSH hl POP hl DEC a JP nz,mlp stack LD sp,0 ; ; Test de la barre espace ; scan LD BC,#F40E OUT (C),C LD BC,#F6C0 OUT (C) ,C XOR a OUT (c) ,a LD BC,#F792 OUT (C),C DEC b LD C,#45 OUT (C),C LD B,#F4 IN A, (C) LD BC,#F782 OUT (C),C DEC b LD C,#00 OUT (C),C EI AND #80 JP NZ,BCLP ; ; Fin du programme: ; on restaure les registres ; du CRTC,les banques de ; memoire et le systeme ; sys DI LD bC,#7fc4 LD de,#014b OUT (c),c OUT (c) ,d OUT (c) ,e LD BC,#BC04 OUT (C),C INC B LD C,38 OUT (C) ,C LD BC,#BC02 OUT (C) ,C INC B LD C,46 OUT (C),C LD BC,#BC01 OUT (C),C INC B LD C,40 OUT (C),C LD BC,#BC07 OUT (C),C INC B LD C,30 OUT (C) ,C LD bc,#bc06 OUT (c),c INC b LD c,25 OUT (c),c syst LD HL,#0000 LD (#38) ,hl EI RET ; ; table des couleurs ; du raster du haut ; raster1 DEFB #44,#44 DEFB #55 DEFB #57 DEFB #5f,#5f DEFB #53,#4b,#5b DEFB #4b ; ; table des couleurs ; du raster du bas raster2 DEFB #43,#4b,#43 DEFB #4a,#4a DEFB #4e DEFB #4c DEFB #5C,#5c ; ; Table des couleurs ; des encres ; DEFB #54,#4b,#44,#55 DEFB #57,#5f,#53,#54 DEFB #4b,#43,#4a,#4e DEFB #4c,#5c ; ; Message du bas de l'ecran ; mess DEFM Logon system DEFB 0 ; ; Message scrollant ; text DEFM 100/ DEFB 0 ; Matrices des blocs ; tabchr v EQU 128 DEFB v,v,v,v DEFB v,v,v,v DEFB v,v,v,v DEFB v,v,v,v p EQU 143 DEFB p,p,p,p DEFB p,p,p,p DEFB p,p,p,p DEFB p,p,p,p q EQU 212 DEFB p,p,p,q DEFB p,p,q,v DEFB p,q,v,v DEFB q,v,v,v s EQU 213 DEFB s,p,p,p DEFB v,s,p,p DEFB v,v,s,p DEFB v,v,v,s t EQU 214 DEFB V,V,v,t DEFB V,v,t,p DEFB v,t,p,p DEFB t,p,p,p u EQU 215 DEFB u,v,v,v DEFB p,u,v,v DEFB p,p,u,v DEFB p,p,p,u ; ; Matrices des caracteres ; tabchar ;% (Attention,on prend en ; fait le code ASCII du ; caractere "/"-slash") ; DEFB 0,4,1,5,0,0,4,0 DEFB 0,1,0,1,0,4,2,0 DEFB 0,3,1,2,4,2,0,0 DEFB 0,0,0,4,2,0,rend en ; fait le code ASCII du ; caractere "/"-slash-) ; DEFB 0,4,1,5,0,0,4,0 DEFB 0,1,0,1,0,4,2,0 DEFB 0,3,1,2,4,2,0,0 DEFB 0,0,0,4,2,0,0,0 DEFB 0,0,4,2,4,1,5,0 DEFB 0,4,2,0,1,0,1,0 DEFB 0,2,0,0,3,1,2,0 DEFB 0,0,0,0,0,0,0,0 ;0 DEFB 0,4,1,1,1,1,5,0 DEFB 0,1,1,0,0,1,1,0 DEFB 0,1,1,0,4,1,1,0 DEFB 0,1,1,4,2,1,1,0 DEFB 0,1,1,2,0,1,1,0 DEFB 0,1,1,0,0,1,1,0 DEFB 0,3,1,1,1,1,2,0 DEFB 0,0,0,0,0,0,0,0 ;1 DEFB 0,0,4,1,1,0,0,0 DEFB 0,0,1,1,1,0,0,0 DEFB 0,0,0,1,1,0,0,0 DEFB 0,0,0,1,1,0,0,0 DEFB 0,0,0,1,1,0,0,0 DEFB 0,0,0,1,1,0,0,0 DEFB 0,1,1,1,1,1,1,0 DEFB 0,0,0,0,0,0,0,0 ;espace ; ; Buffer pour les blocs matrix DEFS 64*24 ; ; buffer pour l'affichage ; des lignes buffer DEFS 2*8,0 endPict / Logon System, ACPC n°48 Juillet 93, p 20-21-22-23 ★ AMSTRAD CPC ★ DOWNLOAD ★ |
|
CPCrulez[Content Management System] v8.7-desktop/c Page créée en 068 millisecondes et consultée 2805 foisL'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko. |
|
|