Logicielsmoto.com

Nous sommes le 29 Mar 2024, 11:22

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 22 messages ]  Aller à la page Précédente  1, 2
Auteur Message
 Sujet du message:
MessagePosté: 22 Oct 2010, 09:06 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Prehisto a écrit:
A ce compte là, utilise carrément le registre X comme pointeur :
Code:
..
LOOP:
   ...
   RORA
   ...
   CMPX #$5400
   BNE  LOOP

... et tu auras gagné encore un octet.

Hélas non, car le CMPX positionne le bit C qui est utilisé dans le RORA du début de boucle :L C'est tout le pb: préserver le bit C le long de l'algo alors qu'en asm il peut vite être trashé. Si on s'autorise à utiliser une ram video en $0, alors on peut même éviter le cmpx en tracant la fractale du bas vers le haut et en utilisant un "leax -1,x; bne loop".. mais ca ne marchera que sur MO5 qui pour le coup montre une organisation mémoire plus pratique. Alors on peut faire ca aussi sur TO8, mais le code pour mettre la ram video en zone rom vont sans doute exploser le nombre d'octets à moins qu'il existe une adresse en rom-basic ou moniteur qui fasse cela.

Je sens que le code minimal tourne autour de 19octets. Je doute qu'on arrive à le faire en 10octets (4-5 instructions ?).

J'ai bien une version en 17octets, mais elle travaille au niveau octet (une sorte de chunky bitmap en fait) au lieu de travailler au niveau bit, donc le dessin est moins beau, mais pour le fun il pourrait être exploité pour afficher la fractale avec des caractères ASCII. A suivre... (mais la marge est petite: on dépasse vite les 19octets de cette version).


Dernière édition par Samuel Devulder le 22 Oct 2010, 09:36, édité 4 fois.

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

Inscription: 27 Juin 2006, 19:44
Messages: 1061
Localisation: France (24)
Samuel Devulder a écrit:
Hélas non, car le CMPX positionne le bit C qui est utilisé dans le RORA du début de boucle :L

Oui, j'ai d'ailleurs tellement eu honte de ma remarque (il faut croire que je n'avais pas lu les tiennes jusqu'au bout) que je l'ai effacée avant que tu ne répondes. Mais tu as été plus rapide...


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

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Samuel Devulder a écrit:
.. mais ca ne marchera que sur MO5 qui pour le coup montre une organisation mémoire plus pratique. Alors on peut faire ca aussi sur TO8, mais le code pour mettre la ram video en zone rom vont sans doute exploser le nombre d'octets à moins qu'il existe une adresse en rom-basic ou moniteur qui fasse cela.

Héhé, mais non en fait. On peut faire la même chose sur TOx aussi et sans commuter de page du gate-array (donc ca marchera sur TO7 de base aussi). En vertu du principe "on peut le faire si ca marche", je me rend compte que rien n'empêche l'algo de s'arrêter en $4000.. on peut le laisser continuer jusqu'en $0 car la rom ne craint pas d'être trashée. Oulà il va falloir que je regarde ca de près.. on peut peut être gagner 1 ou 2 octets. :love:


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

Inscription: 27 Juin 2006, 19:44
Messages: 1061
Localisation: France (24)
Samuel Devulder a écrit:
on peut le laisser continuer jusqu'en $0 car la rom ne craint pas d'être trashée.

Ben en fait, sur TO8 et consort, elle craint. D'un côté les 4 premiers octets sont utilisés pour commuter les ROMs de logiciels ($0000-$0003), de l'autre, il y a l'espace des registres système ($6000-$60FF), les registres hardware, la pile, et j'en passe et des meilleurs.


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

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Prehisto a écrit:
Samuel Devulder a écrit:
on peut le laisser continuer jusqu'en $0 car la rom ne craint pas d'être trashée.

Ben en fait, sur TO8 et consort, elle craint. D'un côté les 4 premiers octets sont utilisés pour commuter les ROMs de logiciels ($0000-$0003), de l'autre, il y a l'espace des registres système ($6000-$60FF), les registres hardware, la pile, et j'en passe et des meilleurs.

Il faut sans doute positionner divers bits sur le regs de controle du gate array pour rendre la zone 0-3 sensible à l'écriture donc par défaut l'écriture en $0-$3 ne fait rien depuis un exec lancé en basic?

Sinon on peut tenter "sta ,x; cmpa ,x" qui n'est pas nul dès qu'on touche $3FFF, on remplace un cmpx #$3FFF (3 octets) par cmpa ,x donc un gain de 1 octet. C'est déjà ça.


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

Inscription: 27 Juin 2006, 19:44
Messages: 1061
Localisation: France (24)
Samuel Devulder a écrit:
Il faut sans doute positionner divers bits sur le regs de controle du gate array pour rendre la zone 0-3 sensible à l'écriture donc par défaut l'écriture en $0-$3 ne fait rien depuis un exec lancé en basic?

Normalement, elles sont sensibles à tout coup. Essaie toujours.


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

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Prehisto a écrit:
Normalement, elles sont sensibles à tout coup. Essaie toujours.

Ben ca marche super bien.
Image
Image
Et voici le prog en ASM:
Image
16 octets de langage machine. :love: (8E5414A61FA801A789FEC0301F26F439)

Et pour ceux qui ne veulent pas saisir le prog, voici le fichier K7 à charger avec un loadm"cass:",,r (ou loadm"",,r pour les machines sans lecteur de D7).

Quelques explications
En fait le code ASM ne fait pas grand chose, c'est juste la formule du tableau de pascal tab[n] = tab'[n] + tab'[n+1] avec un XOR comme opérateur d'addition et tab/tab' les lignes consécutives de l'écran. Pour les matheux, le triangle de Sierpinski est caché dans les nombre impairs représentant les coefs du polynôme (x+y)^n.

Pour que ca marche il faut initialiser le tableau (==l'écran) à 0 et placer une graine en de 1 ou deux 8 octets verticaux (1 ou 2 caractère) en $5414. On pourrait le faire en ASM, mais rien que l'écriture des caratères triplerait la taille du code). Du coup il faut ruser.... La ruse consiste à stocker des commandes ANSI dans le nom du fichier binaire et tirer profit que le basic affiche le nom des fichiers binaires à l'écran quand la commande LOADM ne le précise pas (LOADM ""). Dans le code d'échappement, j'ai choisi une amorce égale à 2 caractères pleins, mais on peut faire des variations en prenant par exemple "\/":
Image

On peut aussi se passer d'un "cmpx #$4000" de l'algo théorique en laissant l'algo déborder en ROM jusqu'à l'adresse zero qui est détectée via le leax (2 octets au lieu de 3). Apparemment ca passe très bien en basic. J'aurais bien tenté le coup du "cmpa" juste après le "sta" de fin de boucle, mais comme l'offset est tellement gros qu'il faudrait 4 octets pour "cmpa -320,x" au lieu de deux pour "leax -1,x". C'est dommage ca aurait été joli conceptuellement que l'algo découvre par lui même la ROM.

A noter que puisque que le basic utilise la routine PUTC pour afficher les caractères du nom de fichier, la valeur initiale du registre X est aussi stockée en $605a-$605b (SCRPT, pointeur courant dans l'écran). Si on faisait un accès direct "LDX <$5B" avec un registre direct-page DP=$60 (page 0 du moniteur), il suffirait de 2 octets au lieu de 3 pour initialiser X. Mais c'est trop demander car le basic place le registre de page 1 du moniteur ($61) dans DP lors d'un exec. C'est dommage.

A présent je vois mal comment gagner 1 octet ou plus. Les instructions sont quasiment les plus compactes possibles. Seul le "sta -320,x" me désole car il prend 4 octets (25% du code) à lui tout seul!


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 Précédente  1, 2

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 32 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