Logicielsmoto.com http://www.logicielsmoto.com/phpBB/ |
|
Quizz: 5cube http://www.logicielsmoto.com/phpBB/viewtopic.php?f=3&t=504 |
Page 1 sur 3 |
Auteur: | Samuel Devulder [ 18 Mai 2014, 12:42 ] |
Sujet du message: | Quizz: 5cube |
Bon, au départ j'étais parti vers le codage d'un jeu de la vie performant (en asm avec des astuces de codage de de la mort); mais devant le volume du boulot (plus de 10k d'asm) j'ai réduit mon ambition à un truc plus petit que voici: Code: **************************************** * debut : $9000 * fin : $907C * taille : 125 **************************************** org $9000 init fcb $1A,$50,$5F,$CE,$40 fcb $00,$E7,$C0,$11,$83 fcb $5F,$68,$26,$F8,$6C fcb $C8,$EB,$6C,$C8,$C3 fcb $CE,$40,$28,$37,$76 fcb $33,$C8,$D8,$36,$76 fcb $33,$C8,$30,$37,$76 fcb $33,$C8,$D8,$36,$76 fcb $33,$C8,$30,$37,$76 fcb $33,$C8,$D8,$36,$76 fcb $33,$C8,$30,$37,$76 fcb $33,$C8,$D8,$36,$76 fcb $33,$C8,$30,$37,$76 fcb $33,$C8,$D8,$36,$76 fcb $33,$C8,$30,$11,$83 fcb $5F,$40,$25,$C8,$A6 fcb $C4,$48,$86,$27,$69 fcb $C6,$4A,$2C,$FB,$A6 fcb $5F,$44,$86,$D8,$66 fcb $C6,$4C,$26,$FB,$EC fcb $C8,$B0,$AA,$C4,$EA fcb $41,$A8,$C8,$D8,$E8 fcb $C8,$D9,$ED,$C8,$D8 fcb $ED,$C1,$11,$83,$5F fcb $68,$26,$E8,$20,$97 end init Alors le quizz du jours est: qu'est ce que fait ce programme de 5^3=125 octets. |
Auteur: | gilles [ 18 Mai 2014, 13:18 ] |
Sujet du message: | Re: Quizz: 5cube |
Il réveille un forum endormi? |
Auteur: | Samuel Devulder [ 18 Mai 2014, 13:26 ] |
Sujet du message: | Re: Quizz: 5cube |
ca serait bien En tout ca il m'a maintenu éveillé hier soir... |
Auteur: | gilles [ 18 Mai 2014, 13:29 ] |
Sujet du message: | Re: Quizz: 5cube |
l'effet est joli, avec 2 plans (dont un 2 fois plus rapide que l'autre) en mode 4 couleurs et une belle palette cela devrait rendre pas mal du tout non? |
Auteur: | Samuel Devulder [ 18 Mai 2014, 13:30 ] |
Sujet du message: | Re: Quizz: 5cube |
Il y a un (petit) indice dans mon message de 14:26 |
Auteur: | Prehisto [ 18 Mai 2014, 23:09 ] |
Sujet du message: | Re: Quizz: 5cube |
Je vois ce que ça fait, mais je ne sais pas s'il suffit de voir pour savoir. La vérité est-elle ailleurs ? |
Auteur: | Samuel Devulder [ 19 Mai 2014, 06:25 ] |
Sujet du message: | Re: Quizz: 5cube |
tout est présent sur cette page, mais l'indice est vraiment très très petit... |
Auteur: | Prehisto [ 19 Mai 2014, 10:39 ] |
Sujet du message: | Re: Quizz: 5cube |
Code: ORG $9000 9000 1A 50 ORCC #$50 =.F.I.... * Efface l'écran + 1 ligne 9002 5F CLRB 9003 CE 40 00 LDU #$4000 9006 E7 C0 STB ,U+ 9008 11 83 5F 68 CMPU #$5F68 900C 26 F8 BNE $9006 * Sème la graine 900E 6C C8 EB INC -21,U 9011 6C C8 C3 INC -61,U * Scroll vertical de l'écran vers le haut 9014 CE 40 28 LDU #$4028 9017 37 76 PULU A,B,X,Y,S 9019 33 C8 D8 LEAU -40,U 901C 36 76 PSHU S,Y,X,B,A 901E 33 C8 30 LEAU 48,U 9021 37 76 PULU A,B,X,Y,S 9023 33 C8 D8 LEAU -40,U 9026 36 76 PSHU S,Y,X,B,A 9028 33 C8 30 LEAU 48,U 902B 37 76 PULU A,B,X,Y,S 902D 33 C8 D8 LEAU -40,U 9030 36 76 PSHU S,Y,X,B,A 9032 33 C8 30 LEAU 48,U 9035 37 76 PULU A,B,X,Y,S 9037 33 C8 D8 LEAU -40,U 903A 36 76 PSHU S,Y,X,B,A 903C 33 C8 30 LEAU 48,U 903F 37 76 PULU A,B,X,Y,S 9041 33 C8 D8 LEAU -40,U 9044 36 76 PSHU S,Y,X,B,A 9046 33 C8 30 LEAU 48,U 9049 11 83 5F 40 CMPU #$5F40 904D 25 C8 BLO $9017 * Scrolle la ligne invisible d'un bit vers la gauche 904F A6 C4 LDA ,U 9051 48 ASLA 9052 86 27 LDA #$27 9054 69 C6 ROL A,U 9056 4A DECA 9057 2C FB BGE $9054 * Scrolle la dernière ligne d'un bit vers la droite 9059 A6 5F LDA -1,U 905B 44 LSRA 905C 86 D8 LDA #$D8 905E 66 C6 ROR A,U 9060 4C INCA 9061 26 FB BNE $905E * ligne-invisible = (avant-dernière-ligne | ligne-invisible) ^ dernière-ligne 9063 EC C8 B0 LDD -80,U 9066 AA C4 ORA ,U 9068 EA 41 ORB 1,U 906A A8 C8 D8 EORA -40,U 906D E8 C8 D9 EORB -39,U 9070 ED C8 D8 STD -40,U 9073 ED C1 STD ,U++ 9075 11 83 5F 68 CMPU #$5F68 9079 26 E8 BNE $9063 * Nouvel affichage 907B 20 97 BRA $9014 END $9000 Voilà grosso-modo le code commenté. Y a-t-il une conclusion philosophique à en tirer ? |
Auteur: | Samuel Devulder [ 19 Mai 2014, 10:40 ] |
Sujet du message: | Re: Quizz: 5cube |
Très bonne analyse du code (surtout la formule logique finale). Tu es sur la voie, mais je n'ajouterais point de mot supplémentaire pour expliquer, car tout est écrit dans mon message de 14:26 sam (<=== il fait tourner en bourrique!) |
Auteur: | Prehisto [ 19 Mai 2014, 10:44 ] |
Sujet du message: | Re: Quizz: 5cube |
Messire, je n'en peux mais Bon, tu remplis l'écran avec un seul point, c'est ça ? |
Auteur: | Samuel Devulder [ 19 Mai 2014, 10:51 ] |
Sujet du message: | Re: Quizz: 5cube |
Non l'écran n'est pas rempli, mais fait apparaitre un motif qui quoique irrégulier est assez reconnaissable par les initiés. Et c'est d'ailleurs le caractère irrégulier sortant de règles régulières qui en fait toute la particularité du bout de code. Coté TO c'est ennuyeux que le scroll d'une ligne ne puisse se faire en moins d'1VBL, du coup on voit une vague défiler à l'écran. C'est moche Si j'ajoute les tests sur $E7E7 la barre est stable au 1/3 inférieur de l'écran. C'est pas mieux non plus. J'ai vu que dans la ROM ils ne scrollent pas comme moi par bout de 8 octets à la fois, mais par 7 octets: Code: puls D,X,Y,DP mais ca ne tombe pas juste pour la dernière ligne. Je n'ai pas fait le compte mais je pense que la suppression d'un LEA dans la solution de la ROM apporte une légère accélération mais pas suffisante pour descendre en dessous de la VBL. (et en plus ca dépasse le 125 octets qui sont une belle puissance trois).
pshu D,X,Y,DP leau 14,u |
Auteur: | gilles [ 19 Mai 2014, 10:54 ] |
Sujet du message: | Re: Quizz: 5cube |
Serait-ce le codage de la mort? (Qui est une composante du jeu de la vie) |
Auteur: | Prehisto [ 19 Mai 2014, 11:29 ] |
Sujet du message: | Re: Quizz: 5cube |
En fait, même la méthode la plus rapide : Code: LDU #xxxx PULU A,B,DP,X,Y,S LDU #xxxx PSHU A,B,DP,X,Y,S qui t'obligerait à faire un programme pour générer le code, ne descend pas en dessous de la VBL |
Auteur: | Samuel Devulder [ 19 Mai 2014, 13:14 ] |
Sujet du message: | Re: Quizz: 5cube |
la méthode LDU #XXX;PSHU prend 10 octets pour en copier 8, il faut donc réserver 10Ko pour copier une page vidéo de 8ko. Damned, c'est pas compact tout ca. Il y a intérêt à réserver la zone $0000->$3FFF rien que pour cette routine. Et effectivement pour copier 8 octets il faut 28cycles donc 28ms pour l'écran "forme" au complet. Ca dépasse de peu, mais ca dépasse quand même. C'est à ce moment là qu'on envie l'instruction TFM du HITACHI 6309 (http://www.coco3.com/community/wp-conte ... n_Sets.pdf), copie de 8000octets en 6+3*8000= 24006.. ah ben zut c'est toujours plus long que les 20ms... mais au moins c'est compact (2 octets). @Gilles, non pour le jeu de la vie l'optim est d'inverser l'algo. Au lieu de compter les cellules autour de celle courante (donc au moins 8 accès mémoire pour décider s'il y a un changement d'état), on peut utiliser un codage qui "contient" déjà une grosse partie du comptage et n'accéder à la mémoire qu'en cas de changement d'état. Typiquement l'idée est d'encoder l'état d'une cellule sur 4 bits et de mettre l'état de deux cellules sur 1 seul octet comme suit: XYYYZUUU, X=1 si la cellule de gauche est vivante, et YYY=nombre de voisins vivants sur les 7 cellules adjacentes (l'état de la cellule de droite, la 8ème, est codée dans le Z)... Idem pour UUU qui compte les voisins vivants autour de la cellule de droite. Le calcul effectif du nombre de voisins vivants de la cellule de gauche d'un octet N=XYYYZUUU est : C = ((N & %01111000) + 8)>>4 (super rapide en ASM). En gros en ajoutant 8, on fait passer le Z sur les Y sans faire aucun décalage. Ensuite Si X=0, et C=3, alors X passe à 1 (soit N+=128) et il faut ajouter 1 à toutes les cellules voisines ce qui ne représente que 5 octets à mettre à jour. Si X=1, et C<2 ou C>3, alors X passe à 0 (soit N-=128) et il faut retirer 1 unit" aux 5 octets autour (car 1 octets = 2 cellules donc a pas 8 octets à mettre à jour). Sinon pour toutes les autres valeurs de X et C il n'y a rien de changé et on aura tout décidé en ne lisant qu'un seul octet. Évidemment les "Si" s'encodent dans une table précalculée indiquant pour chacun des 5 octets "autour" de l'octet courant l'incrément pour traiter simultanément la partie droite et la partie gauche, et c'est là que j'ai laissé tombé (momentanément?) ma réflexion car il y a plein de cas à précalculer. Il me faudrait écrire un générateur de code ASM pour être sur de ne pas oublier un cas, surtout dans les coins (car avec le "wrapping" sur le bord d'écran le calcul des offsets pour trouver l'octet à droite ou a gauche n'est pas de la tarte). Alors personne n'a encore trouvé l'indice ? Je vais attendre un peu avant de poster la solution de ce que calcule le code de 125 octets... |
Auteur: | Prehisto [ 19 Mai 2014, 16:33 ] |
Sujet du message: | Re: Quizz: 5cube |
Un calcul de CRC ? |
Page 1 sur 3 | Heures au format UTC + 1 heure |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |