Debut: DB #DD INC H ; Rotation dans la map LD BC,TabStruct BclAffiche: LD A,(BC) LD L,A INC BC LD A,(BC) DEC A ; (HL = #101 en fin de table) JR Z,Debut LD H,A ; Adresse INC BC LD A,(BC) LD E,A INC BC LD A,(BC) INC BC LD D,A LD A,E DB #DD ADD A,H ; maxp + rotation AND #7F RLA RR D ; mapy << 7 == ( DE ) >> 1 RRA LD E,A LD A,(DE) ; Lecture couleur point LD (HL),A ; Ecriture en mémoire écran SET 3,H LD (HL),A SET 4,H LD (HL),A RES 3,H LD (HL),A JR BclAffiche
Qui me permet d'afficher une planète en rotation. Au début du programme, BC pointe sur un tableau de structures qui contient: - une adresse vidéo - une adresse vers le bitmap de la planète donc 4 octets pour afficher un point à l'écran Je ne peux pas utiliser la pile vu que j'ai besoin des interruptions Si vous avez des idées d'optimisations, dites le moi
Inscription : 26 Nov 2008, 10:04 Message(s) : 174 Localisation : Saint Ouen l'Aumône
A vu de nez d'un néophyte en assembleur Z80 (en fait je commence à connaître quelques instructions en essayant d'optimiser leur émulation), une optimisation ne semble pas aisée car il semble que chacune de tes instructions prennent peu de cycles. Aussi, j'ai l'impression qu'il faut vraiment être imprégné de l'algo et de sa finalité pour savoir s'il n'y a pas plus simple...
Debut: LD SP,TabStruct INC C ; Rotation BclAffiche: POP HL ; HL = adresse mémoire écran DEC H ; (HL = #101 en fin de table) JR Z,Debut POP DE ; E = mapx, D = mapy LD A,E ADD A,C ; maxp + rotation AND B ;B = #7F RLA RR D ; mapy << 7 == ( DE ) >> 1 RRA LD E,A LD A,(DE) ; Lecture couleur point LD (HL),A ; Ecriture en mémoire écran SET 3,H LD (HL),A SET 4,H LD (HL),A RES 3,H LD (HL),A JR BclAffiche
Et la version "C" :
Code :
int yc = 0; // Position dans le bitmap pour rotation do { for ( int i = 0; TabMap[ i ].adr != 0x101; i++) { d = ( ( TabMap[ i ].MapX + yc ) & 0x7F ) + ( TabMap[ i ].MapY << 7 ); memCpc[ TabMap[ i ].adr ] = Bitmap[ d ]; } yc++; } while( ! fin );
Moi je ne m'y preendrais pas comme cela du tout. Je genererai du code directement a partir de courbe et transformerai celle-ci directement en incrementations...
En mémoire j'aurai pour le bitmap: 1 pixel=1octet.
Une des courbes du globe (par exemple celle du milieuà ce résumerait en des incrémentations de pointeur sur le GFX... optimisable dans certains cas par des addition au lieu des INC... Ensuite suffit aussi de bien placer le gfx en RAM afin d'optimiser les inc etc... Donc juste du mapping. Plus rapide mais prend plus de place en RAM.
Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 27 invité(s)
Vous ne pouvez pas publier de nouveaux sujets dans ce forum Vous ne pouvez pas répondre aux sujets dans ce forum Vous ne pouvez pas éditer vos messages dans ce forum Vous ne pouvez pas supprimer vos messages dans ce forum Vous ne pouvez pas insérer de pièces jointes dans ce forum