Logicielsmoto.com

Nous sommes le 19 Avr 2024, 10:53

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 22 messages ]  Aller à la page 1, 2  Suivante
Auteur Message
MessagePosté: 13 Oct 2010, 23:32 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1804
Localisation: Brest
Que fait le code machine suivant (32 octets):
Code:
B6E7C38A01B7E7C3CE40008E14001A01ECC44656A8C0E8C0EDC826301E26F139

Ou celui-ci (28octets, mais c'est quasi la même chose):
Code:
B6E7C38A01B7E7C38E1400CE40001A01A6C446A8C0A7C827301F26F439

Question subsidiaire: peut on faire encore plus court?


Dernière édition par Samuel Devulder le 14 Oct 2010, 12:56, édité 1 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 14 Oct 2010, 08:08 
Hors ligne

Inscription: 27 Avr 2006, 09:04
Messages: 101
Code:
39

Y a pas plus court comme code et tu peux tester, ça marche!
;)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 14 Oct 2010, 11:34 
Hors ligne
M. DCMOTO

Inscription: 06 Juin 2004, 08:23
Messages: 681
Localisation: Provence (France)
1) dessine une fractale triangulaire
2) dessine la même fractale triangulaire
3) en 20 octets : CE40008E14001A01ECC44656A8C0E8C0EDC826301E26F139
Résultat :
Image
Oui, je le reconnais, ne pas modifier E7C3 c'est un peu tricher. Mais c'est 8 octets de moins et ça marche :tourne:
Sur MO5, le SWI #$06 permet de gagner 6 octets.


Dernière édition par Daniel Coulom le 14 Oct 2010, 11:48, édité 1 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 14 Oct 2010, 11:40 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1804
Localisation: Brest
Daniel Coulom a écrit:
1) dessine une fractale triangulaire
2) dessine la même fractale triangulaire

Exact, c'est le triangle de Sierpinski. Bravo!
Citation:
3) en 20 octets : CE40008E14001A01ECC44656A8C0E8C0EDC826301E26F139

Héhé.. Squizage du passage en mode forme ($E7C3). C'est pas mal.

Le truc que je voudrais faire c'est le même mais plus symétrique horizontalement.
Image


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 14 Oct 2010, 22:08 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1804
Localisation: Brest
Samuel Devulder a écrit:
Le truc que je voudrais faire c'est le même mais plus symétrique horizontalement.
Image

Ben j'ai trouvé une façon de le faire en 48 octets tout pile:
Code:
B6E7C38A01B7E7C38E13D8CC0180CE4028EDC8EC31C8D85FA6A44456A8C4EDC44FE6A05849E8C4A8C2EDC1301F26E839
(en pilotant $E7C3 sinon ca merdouille sous ASSEMBLER):
ImageImage
Sur MO5 on pourrait optimiser en partant du bas de l'écran et en remontant car le pointeur video servirait aussi de compteur jusqu'à zero. Est-ce optimisable sur TO ?

sam (le quizz continue)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 15 Oct 2010, 14:43 
Hors ligne
M. DCMOTO

Inscription: 06 Juin 2004, 08:23
Messages: 681
Localisation: Provence (France)
Bravo !

C'est passionnant d'optimiser le code. Un peu comme au temps des deulignes d'Hebdogiciel. Je n'ai pas trop le temps aujourd'hui, mais c'est un exercice que j'aime bien. Prehisto doit aussi être très fort à ce petit jeu, il va sûrement trouver un code plus court.
Dans le même genre, j'avais fait à l'époque une routine PAINT pour le remplissage d'un contour quelconque, avec appel récursif. Et, toujours avec des procédures récursives, la résolution des tours de Hanoï.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 15 Oct 2010, 16:02 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1804
Localisation: Brest
Ah ben j'ai encore optimisé: 44 octets (gain 4) et maintenant tout le code tient à l'écran
Image
On peut peut être se passer de la manip sur E7C3 et aussi effacer l'écran en générant un fichier BIN pour K7 dont le nom contient les codes d'echappement monitor pour effacer l'écran et en utilisant
Code:
LOADM "",r
pour le lancer. Mais je ne sais pas faire cela à partir d'assembler.

Prochain challenge: avoir un triangle (presque) équilatéral.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 15 Oct 2010, 20:08 
Hors ligne

Inscription: 27 Juin 2006, 19:44
Messages: 1062
Localisation: France (24)
Samuel Devulder a écrit:
On peut peut être se passer de la manip sur E7C3 et aussi effacer l'écran en générant un fichier BIN pour K7 dont le nom contient les codes d'echappement monitor pour effacer l'écran et en utilisant
Code:
LOADM "",r
pour le lancer. Mais je ne sais pas faire cela à partir d'assembler.

Sous ASSEMBLER, la commande pour assembler sur cassette est :

>AC:xxxxxxxx

ou xxxxxxxx est le nom de fichier, avec ou sans suffixe 'BIN'.

Si tu veux que ton programme rende la main au Basic une fois exécuté, les registres S, CC et DP doivent être restaurés dans leur état initial avant le RTS de fin. Car bien évidemment, le programme rend la main au Basic par un RTS. SWI, c'est seulement pour l'Assembleur.

Enfin, si tu veux que ton programme soit exécuté en LOADM,,R, il faut définir l'adresse d'exécution en argument de la directive END :

Code:
DEBUT   ...
              ...
              END   DEBUT


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 15 Oct 2010, 20:26 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1804
Localisation: Brest
Oui, mais c'est la création d'un fichier binaire dont le nom n'est pas de l'ascii mais qui soit
Code:
chr$(&h14)+chr$(27)+chr$(&h60)+chr$(27)+chr$(&h47)+chr$(27)+chr$(&h50)+"."+chr$(12)
que je voudrais exploiter (C'est la séquence ansi(?) pour éteindre le curseur, passer le tour en noir et l'écran en blanc sur noir). Il faudrait probablement générer le fichier binaire en basic.

Si l'écran forme est à 0, sans le curseur qui clignotte, on peut probablement se passer du b pour stocker le bit du 1er rora et utiliser la zone video pour cela.
Code:
loop set *
   lda  -40,x
   tfr  a,b   ! on économise un ldb -40,x
   lsra
   ror  1,x   ! plus de clrb, rorb
   eora ,x
   sta  ,x
   clra
   lslb
   rola
   eorb ,x
   eora ,-x
   std  ,x++
   cmpx #$5400
   bne  loop
ca fait gagner quelques octets (j'ai la flemme de compter) :love:


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 15 Oct 2010, 20:47 
Hors ligne

Inscription: 27 Juin 2006, 19:44
Messages: 1062
Localisation: France (24)
Samuel Devulder a écrit:
Oui, mais c'est la création d'un fichier binaire dont le nom n'est pas de l'ascii mais qui soit
Code:
chr$(&h14)+chr$(27)+chr$(&h60)+chr$(27)+chr$(&h47)+chr$(27)+chr$(50)+chr$(12)+".BIN"

A quoi vous jouez, là ? :lol:
Tout ça pour gagner de la place sur quelques dizaines d'octets ?

Samuel Devulder a écrit:
Si l'écran forme est à 0,

Malheureusement, tout affichage (et en l'occurence l'effacement de l'écran), met l'écran en mémoire couleur. Donc un traitement préalable pour passer en mémoire forme est nécessaire.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 15 Oct 2010, 21:04 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1804
Localisation: Brest
Prehisto a écrit:
A quoi vous jouez, là ? :lol:
Tout ça pour gagner de la place sur quelques dizaines d'octets ?

Ouais.. et c'est aussi fun que les mots croisés. A la base la formule c'est dans le genre:
Code:
for y=0 to 127: for x=0 to 319:pset(x,y),2*((point(x-1,y-1)>0) xor (point(x+1,y-1)>0))-1:next x,y
ou avec un "and":
Code:
for y=0 to 127: for x=0 to 127: if (x and y)<>0 then pset(x,y):next x,y
(de mémoire). Le truc que j'aimerais réaliser en peu de code machine c'est ceci:
Code:
for x=0 to 255: for y=0 to 127: if ((x+y@2-128) and (y@2-x+128))=0 then pset(x,y):next:next
qui produit un triangle plus équilatéral:
Image
Tiens il suffirait d'afficher l'image en mode 80cols. A creuser...
___
(*) les "one lines" sont faux comme ils sont écrit tels quels car pour l'interpréteur basic le next fait parti de la branche "then". Or si on ajoute un else avec un next, l'interpréteur croit qu'il y a un next de trop et sort une error "next without for" car il ne fait pas de disjonction dans le flot de contrôle (ca sent le bug).


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 16 Oct 2010, 12:16 
Hors ligne

Inscription: 27 Avr 2006, 09:04
Messages: 101
Il est très fort ce Sam :)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 16 Oct 2010, 19:49 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1804
Localisation: Brest
Bon ca y est j'ai réussi, sans passer par le mode 80 cols, et en 44 octets:
ImageImage
Le truc rigolo est le inc $E7C3 pour faire basculer en mode forme après l'affichage du chr$(12) par le moniteur!

@tomix3 bah tu sais, il n'y a rien de neuf sur le triangle de sierpinski en quelques octets. Les autres machines font cela depuis un certain temps déjà. Sur amiga ca se faisait à coup de blitter car c'est une formule finalement simple au niveau des bits (décalage + xor).

sam (il est quand même très cool l'asm 6809.)

PS: Je viens d'apprendre le décés de B.Mandelbrot grâce auquel je me suis mis à l'asm 6809 pour optimiser le calcul de son célèbre ensemble :cry: Et dire qu'il apparaissait Samedi dernier dans la rediffusion d'un documentaire (ou ici) sur ARTE (encore visible sur youtube). RIP.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 19 Oct 2010, 21:09 
Hors ligne

Inscription: 24 Juil 2010, 16:08
Messages: 455
Localisation: France
http://pouet.net/prod.php?which=56079

26 octets sur Atari XL/XE... :)
Qui dit mieux ? :)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 19 Oct 2010, 22:21 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1804
Localisation: Brest
PulkoMandy a écrit:
http://pouet.net/prod.php?which=56079

26 octets sur Atari XL/XE... :)
Qui dit mieux ? :)

Ben Daniel à réduit l'une de mes 1eres versions à 20octets, mais on peut encore faire un peu mieux (19 octets):
Code:
   LDU #$4000
   COMB           !! astuce 1
LOOP:
   LDA  ,U
   RORA
   EORA ,U+
   STA  39,U
   LEAX -$5400,U  !! astuce 2
   BNE  LOOP
   RTS
ou en langage machine
Code:
CE400053A6C446A8C0A7C82730C9AC0026F239

Les trucs: bon bien sur sous basic le plan forme est actif par défaut (même technique que Gilles), mais l'astuce 1 positionne le bit C à 1 en avec seul octet au lieu du "ORCC #1" (B vaut 0 implicitement au début), ensuite l'astuce 2 compare U avec $5400 sans altérer le bit C ce qui est super important pour l'algo. On peut réduire le code si on trouve un bout de ROM qui charge un des registres d'adresse avec $4000, positionne C place la mémoire video en mode forme. ($EEB2 semble positionner la ram video) Mais c'est limite non reproductible d'une version de ROM sur l'autre.


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 22 messages ]  Aller à la page 1, 2  Suivante

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 59 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages
Vous ne pouvez pas joindre des fichiers

Rechercher:
Aller à:  
cron
Développé par phpBB® Forum Software © phpBB Group
Traduction par phpBB-fr.com