Par ci par la , vous verrez un commentaire IMP suivi d'un numéro , cela signifie que cette partie du listing est spécifique à un déplacement par pixels . » SOURCE ASSEMBLEUR/Z80 REMARQUES SUR LE PROGRAMME D'ANIMATION PIXEL PAR PIXEL L'essentiel porte sur la structure du programme , on remarque en effet que tous les paramètres sont calculés à partir de variables . Ceci a l'avantage de rendre ce programme compatible avec tous les usages possibles mais ralentit son exécution ! Bref , en tant que démonstration et programme de test pour visualiser l'effet d'un déplacement sur un fond et un plan donné c'est idéal mais inutilisable pour un programme de jeu . Ce que l'on peut faire pour accélérer le programme : 1 Supprimer STEPX et STEPY et définir l'incrément de déplacement une bonne fois pour toute . Ceci permet de : a : Economiser un peu de temps dans le chargement des registres . b : Restructurer les boucles de ENHAUT , ENBAS , ADROIT , AGAUCH qui doivent tenir compte de toutes les positions possibles dans la version présentée . c : La mise en constantes de STEPX , STEPY permet aussi de supprimer quelques calculs et LDIR - LDDR dans les transferts . d : Dans le même esprit , LINEMOV et COLOMOV peuvent être supprimés puisque le nombre de déplacements devient invariable . Ceci n'est qu'un début ! En mode 0 , un déplacement pixel par pixel correspond à ½ case mémoire . Réécrivons le tout pour un déplacement case par case ! L'animation est sera tout aussi fluide , le mouvement 2 fois plus rapide et le programme plus court . Difficile à faire ? Surement pas , les listings qui suivent vous montreront comment faire . Mais avant de les aborder voyons ce qui peut encore freiner l'exécution du programme . 2 : Le test JOYSTYCK &BB24 et la série des CALL #BB1E ! Les routines système c'est pratique mais c'est lent ! On dirait un troupeau d'escargots en train de pousser une brouette de machefer ! Si vous vous sentez de taille , remplacez les par un test direct des lignes claviers comme nous l'avons montré dans SOS3 . 3 : La couleur du fond : Là , c'est plus épineux , si l'on veut une image colorée on n'a pas le choix , mais si tout le fond est uni (SPACE INVADER) ou que le sprite se déplace dans des couloirs uniformes , plus besoin de calculs complexes pour composer un nouveau sprite on peut supprimer les routines de composition et renvoyer une suite de 0 pour effacer les traces du sprite ce qui du même coup supprime tous les calculs se rapportant à la table écran puisqu'elle n'est plus nécéssaire . Dans ce cas , le dessin semble passer d'un bord à l'autre de l'écran sans transition ! Il y-a bien d'autres astuces dont nous reparlerons .... Maintenant nous vous représentons le même programme mais avec des constantes en place de STEPX , STEPY et en mode case par case . Rassurez vous , plus de la moitié du programme ne change pas . Nous ne montrons que les sections qui doivent être changées . Quelques variables ont disparu , STEPX - STEPY - LINEMOV - COLOMOV et MASK qui ne sert qu'en mode pixel par pixel . ; XPOS DW 304 ;35003-04 YPOS DW 200 ;35005-06 NUMSP DB 1 ;35007 LSP DB 0 ;35008 HSP DB 0 ;35009 ADSP DW 0 ;35010-11 VISAD DW 0 ;35012-13 COINBD DW 0 ;35014-15 LONGLTA DW 0 ;35016-17 LTABL DW 0 ;35018-19 FINTAB DW 0 ;35020-21 LTRTAB DW 0 ;35022-23 ADPROV DW 0 ;35024-25 FLAGAF DB 0 ;35026 OLDADV DW 0 ;35027-28 DIRJOY DB 0 ;35029 ;-------------------------- La disparition de LINEMOV et COLOMOV va nous géner car c'est par ces variables que l'on faisait le test de position de la ligne et colonne à restituer après affichage . Pour y suppléer , on mémorise la direction donnée par le joystick lors du test . Juste une ligne et une variable à ajouter . ; NOFIRE LD (DIRJOY),A ;Memoriser position joystick LD HL,(VISAD) LD (OLDADV),HL ;RRCA PUSH AF ;............--------------------------- Le gros morceau est bien modifié , dans les tests en haut et en bas on ne teste plus la validité du mouvement ligne à ligne mais par paquets de 4 . On se déplace en effet de 4 lignes d'un coup pour conserver un rapport de 45 degrés en diagonnale . Cela à un petit inconvénient : La position d'origine du 1er affichage doit se faire sur une ligne multiple de 4 sinon le dessin n'ira jamais jusqu'aux limites verticales de l'écran . Dans les déplacements latéraux , on se ne déplace que d'une case , donc , plus de DJNZ et plus grand chose d'autre d'ailleurs . En revanche , on annulera les bits de mouvement latéral si le mouvment est impossible pour ne pas avoir un mauvais affichage en butée horizontale . Observez une certaine simplification dans les routines qui vous donnent des maux de tête ... Tous les commentaires ne concernant pas les modifications effectuées ont été supprimés . ; ;- Routines de calcul pour les 4 déplacements possibles du sprite - ; ;- En bas - *** ; ENBAS LD B,4 ;4 lignes d'office LD HL,(COINBD) ; B1 LD A,H ;Voir si on peut bouger de 4 d'un coup ;SUB #FF JR NZ,OKBAS LD A,L CP #80 RET NC ;Non ; OKBAS CALL ADINF ;On bouge DJNZ B1 LD (COINBD),HL ; LD HL,(VISAD) LD B,4 B2 CALL ADINF DJNZ B2 LD (VISAD),HL ; STOPB CALL PARAVE ; ;- Transferer dans un buffer les lignes superieures de la table qui seront - ;- a renvoyer dans l'ecran lors du prochain affichage - ; LD HL,TABLE LD DE,LINES PUSH BC LDIR POP BC ; ;- Remonter la table de sauvegarde écran de nb.lignes sur elle même - ; LD DE,TABLE LD HL,TABLE ADD HL,BC LD BC,(LTRTAB) LDIR ; ;- Passer lignes écran a recouvrir en fin de table - ; LD HL,(COINBD) LD DE,(FINTAB) LD BC,(LONGLTA) LD B,4 ;Nombre lignes 4 d'office SLBAS PUSH HL PUSH BC LD B,0 LDDR POP BC POP HL CALL ADSUP DJNZ SLBAS ; LD HL,(OLDADV) LD (ADPROV),HL RET ; ;- Mouvement en haut - ; ENHAUT LD HL,(VISAD) ;Comme en bas , 4 lignes d'office LD B,4 ; H1 LD A,H ;SUB #C0 JR NZ,OKHAUT LD A,L CP #50 RET C ; OKHAUT CALL ADSUP DJNZ H1 LD (VISAD),HL ; LD HL,(COINBD) LD B,4 H2 CALL ADSUP DJNZ H2 LD (COINBD),HL CALL PARAVE ; ;- Transferer dans un buffer les lignes inferieures de la table qui seront - ;- a renvoyer dans l'ecran lors du prochain affichage - ; LD DE,LINES LD HL,TABLE PUSH BC LD BC,(LTRTAB) ADD HL,BC POP BC PUSH BC PUSH HL LDIR POP HL POP BC ; ;- Descendre la table de sauvegarde écran de nb.lignes sur elle même - ; LD HL,(FINTAB) LD E,L LD D,H AND A ;SBC HL,BC LD BC,(LTRTAB) LDDR ; ;- Passer lignes écran a recouvrir en debut de table - ; LD HL,(VISAD) LD DE,TABLE LD BC,(LONGLTA) LD B,4 ;4 lignes d'office BCLTH PUSH HL PUSH BC LD B,0 LDIR POP BC POP HL CALL ADINF DJNZ BCLTH ; LD HL,(COINBD) INC HL LD BC,(LONGLTA) AND A ;SBC HL,BC CALL ADINF LD (ADPROV),HL RET ; ;- Calcul des longueurs de transfert pour déplacements verticaux - ; PARAVE LD HL,0 LD BC,(LONGLTA) ; ;SLA B ;BC=Longueur d'une ligne * 4 ;RL C ;Soit BC=BC*4 ;SLA B ;RL C ; LD HL,(LTABL) AND A ;SBC HL,BC LD (LTRTAB),HL ;Nombre de lignes table a deplacer RET ; ;- Ici commencent les déplacements lateraux . Les testes du masque - ;- sont elimines et comme on a qu'une colonne , les DJNZ sont - ;- supprimes . Dans les transferts , des LDIR et LDDR ont ete otes - ;- pour les memes raisons - ; ;- A DROITE - ; STOPLAT LD A,(DIRJOY) ;Remise a 0 des bits de direction lateraux AND %00000011 ;si mouvement impossible (evite clignotement) LD (DIRJOY),A ;en bordure d'ecran . RET ; ADROIT LD HL,(COINBD) CALL TSTLAT CP #4F JR Z,STOPLAT ; INC HL LD (COINBD),HL LD HL,(VISAD) LD (OLDADV),HL INC HL LD (VISAD),HL ; ;- Transfert table->colons,rotation table,colonnes écran->table simultane - ;- Ensemble de routines considerablement simplifiees si on utilise le mode - ;- case par case - ; LD HL,(LONGLTA) ;Longueur d'une ligne table DEC HL ;Moins 1 colonne a deplacer LD (LTRTAB),HL ; = Longueur a transferer ; LD DE,(VISAD) ADD HL,DE PUSH HL POP IY ; LD IX,TABLE INC IX ; LD DE,COLONS LD HL,TABLE LD A,(HSP) ; TRCSD PUSH AF LDIR a saute ! PUSH HL LD A,(HL) LD (DE),A INC DE PUSH DE EX DE,HL ; PUSH IX POP HL ; LD BC,(LTRTAB) LDIR ; PUSH IY ;LDIR a saute ! POP HL LD A,(HL) LD (DE),A INC DE PUSH IY POP HL CALL ADINF PUSH HL POP IY POP DE LD BC,(LONGLTA) ; ADD IX,BC POP HL ADD HL,BC POP AF DEC A JR NZ,TRCSD RET ; ;- A gauche - ; AGAUCH LD HL,(VISAD) CALL TSTLAT OR A JR Z,STOPLAT ; DEC HL LD (VISAD),HL LD HL,(COINBD) DEC HL LD (COINBD),HL ; ;- Transferts table . Comme le precedent dans l'autre sens - ; LD DE,(LONGLTA) ;Comme il n'y a pas d'addition on prend DEC DE ;directement DE LD (LTRTAB),DE LD HL,TABLE ADD HL,DE ; LD DE,COLONS PUSH HL LD BC,(LONGLTA) LD A,(HSP) ; BCLRCG PUSH AF LDIR a saute ! LD A,(HL) LD (DE),A INC DE ADD HL,BC POP AF DEC A JR NZ,BCLRCG ; ;- Decaler la table de 1 colonne a droite - ; LD HL,TABLE LD BC,(LONGLTA) ADD HL,BC DEC HL EX DE,HL POP HL DEC HL LD BC,(LTRTAB) LD A,(HSP) ; ROTDR PUSH BC PUSH HL PUSH DE LDDR POP HL LD BC,(LONGLTA) ADD HL,BC EX DE,HL POP HL ADD HL,BC POP BC DEC A JR NZ,ROTDR ; ;- Passer colonnes écran dans colonnes gauche table - ; LD DE,TABLE LD HL,(VISAD) LD A,(HSP) LD B,A ; ECTDR PUSH BC LDIR a saute ! PUSH HL LD A,(HL) LD (DE),A LD HL,(LONGLTA) ADD HL,DE EX DE,HL POP HL CALL ADINF POP BC DJNZ ECTDR RET ;------------------------ La copie du sprite dans le buffer est réduite à sa plus simple expression ! ; ;- Passer sprite dans buffer - ; AFFISP1 LD HL,(ADSP) ;La routine buffer impair est supprimee LD BC,(LSP) ;La case supplementaire pour cas impairs aussi . LD DE,BUFSPT ;Les 3 routines de composition sont identiques ; BCLBP PUSH BC LD B,0 LDIR POP BC DJNZ BCLBP ; ;- Composer le rectangle a afficher - ; COMPO LD BC,(LSP) ;........... Etc ...------------------------ La sortie d'affichage est modifiée . ; ;- Afficher les lignes écran stockees pour recouvrir les traces de - ;- l'ancien affichage - ; LD A,(DIRJOY) ;Valeur renvoyee par #BB24 memorisee en NOFIRE AND %00000011 ;Remplace les tests sur LINEMOV - COLOMOV JR Z,TSTCOL ;Si 0 il n'y a pas eu de mouvement vertical ; LD DE,(ADPROV) LD HL,LINES LD BC,(LONGLTA) ; AFLINE LD B,4 ;Toujours 4 lignes BCLINE PUSH DE PUSH BC LD B,0 LDIR POP BC POP DE ; LD A,D ADD A,8 LD D,A JR NC,F1 PUSH HL LD HL,#C050 ADD HL,DE EX DE,HL POP HL ; F1 DJNZ BCLINE ; ;- COLONNES GAUCHE - ; TSTCOL LD A,(DIRJOY) ;Tester mouvement lateral AND %00001100 JR Z,EXIT ;Si 0 aucun mouvement lateral c'est fini ; ;BIT 3,A JR NZ,CG ;a bouge a droite , restituer colonne gauche ; LD HL,(VISAD) LD DE,(LONGLTA) ADD HL,DE EX DE,HL JR COLON1 ; ;- COLONNE DROITE - ; CG LD DE,(OLDADV) ;Pour 1 seule colonne pas besoin de LDIR COLON1 LD HL,COLONS LD A,(HSP) LD B,A BCLCOL LD A,(HL) LD (DE),A INC HL ; LD A,D ADD A,8 LD D,A JR NC,F2 PUSH HL LD HL,#C050 ADD HL,DE EX DE,HL POP HL ; F2 DJNZ BCLCOL ; EXIT XOR A ;Raz des 2 déplacements LD (DIRJOY),A JP RECU38 ;----------------------- En passage de paramètres , juste un petit détail très important ! INC C et DEC C qui ne servent que dans les cas impairs sont supprimés . ----------------------- ; ;- Passer les parametres - ; PARAM INC HL ;Le INC C pour cas impairs est supprime INC HL INC HL LD B,(HL) INC HL LD C,(HL) LD (LSP),BC LD A,C LD (LONGLTA),A INC HL LD (ADSP),HL ; PUSH BC PUSH BC LD B,0 DEC C LD HL,(VISAD) ADD HL,BC POP BC DEC B COIN CALL ADINF DJNZ COIN LD (COINBD),HL POP BC LD HL,0 LD D,0 LD E,C BCLT ADD HL,DE DJNZ BCLT LD (LTABL),HL LD DE,TABLE ADD HL,DE DEC HL LD (FINTAB),HL RET ;------------------------ Et voilà , il suffit de remplacer les lignes correspondantes du programme précédent et réassembler le tout pour obtenir une autre version du même programme . Si vous n'ètes pas outillé pour le faire , consolez vous , les 3 codes binaires sont présents dans la démonstration correspondante ! Le 3ème code souce ? Passez au chapitre suivant ... SOS PROGRAMMEURS
★ AMSTRAD CPC ★ DOWNLOAD ★ |
|
CPCrulez[Content Management System] v8.73-desktop/c Page créée en 029 millisecondes et consultée 2912 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. |
|
|