π
<-

Commande Exec : Comment réaliser un "poke" ?

Programmation et implémentation d'algorithmes.

Commande Exec : Comment réaliser un "poke" ?

Unread postby Loulou 54 » 28 May 2012, 14:43

Est-t-il possible de réaliser un poke à partir d'une chaîne Exec, comme en C lorsque l'on veut modifier la valeur d'une certaine adresse mémoire ?

(faut-il que je poste sur Yaronet peut-être ?)

Merci :)
Mes programmes => ici !
User avatar
Loulou 54Premium
Niveau 13: CU (Calculateur Universel)
Niveau 13: CU (Calculateur Universel)
Level up: 1.6%
 
Posts: 1985
Images: 8
Joined: 02 Aug 2009, 00:00
Location: 54, près de Metz
Gender: Male
Calculator(s):
MyCalcs profile
Class: Ingé Logiciel chez Amazon

Re: Commande Exec : Comment réaliser un "poke" ?

Unread postby Lionel Debroux » 28 May 2012, 18:05

Est-t-il possible de réaliser un poke à partir d'une chaîne Exec, comme en C lorsque l'on veut modifier la valeur d'une certaine adresse mémoire ?

Bien sûr :)
Les chaînes Exec ne sont que la sérialisation hexa d'un programme ASM, sans les deux octets de taille et l'ASM_TAG final.

(faut-il que je poste sur Yaronet peut-être ?)

Ce n'est pas nécessaire.
Quand j'ai dû construire une chaîne Exec pour je ne sais plus quoi/qui (mais c'était en 2009, d'après le commentaire), j'ai créé un script Perl (car c'est plus vite fait que du C/C++) qui traduit le contenu du programme ASM (fichier *.??z, issu du build de sources C / ASM - comme ça, tu mets ce que tu veux dedans) en chaîne Exec.
Cependant, bien sûr, il faut Perl pour tourner ce script. Ce n'est pas un problème sous *nix, mais c'est moins immédiat sous Windows, bien que des distributions comme ActivePerl soient faciles à installer.

Voici une copie de ttasm2exec.pl, qui est dans les sources de GCC4TI:
Code: Select all
#!/usr/bin/perl -W
use strict;

# Trivial program to convert a TI-68k assembly file (.??z) to a TI-BASIC Exec string.
# Copyright (C) 2009 Lionel Debroux.

package main;
    my $length;
    my $filecontents;
    my $unpackedfilecontents;

    (   ($#ARGV == 0) # A single argument...
     && (($ARGV[0] =~ m#.89z$#) || ($ARGV[0] =~ m#.9xz$#) || ($ARGV[0] =~ m#.v2z$#)) # ... which ends with {89z,9xz,v2z} and ...
     && (-f $ARGV[0]) # ... which is a path representing an actual file.
    )
    or die "Usage: ttasm2exec.pl <infile.{89z,9xz,v2z}>\n";

    open(INFILE, $ARGV[0]) or die "Can't open $ARGV[0]: $!";
    read(INFILE, $filecontents, -s INFILE);
    close(INFILE);

    if ((index ($filecontents, "**TI89**") != 0) && (index ($filecontents, "**TI92P*") != 0)) {
        die "$ARGV[0] doesn't seem to be a file suitable for TI-68k calculators";
    }

    do {
        use bytes;
        # Get file size in bytes.
        $length = length($filecontents);
        print "Input file is $length bytes long (of which 91 bytes will be stripped).\n";

        if ($length <= 93) { # 86 bytes for the header, 2 size bytes, 2 bytes for the empty relocation, 1 byte for the tag and 2 bytes for the trailing checksum.
            die "$ARGV[0] is too short to be a valid ASM file";
        }
        $length -= 90;
       
        $filecontents = substr($filecontents, 88, $length);

        $length *= 2; # Number of hex digits is twice that of bytes.

        $unpackedfilecontents = unpack ("H[$length]", $filecontents);
        if (rindex($unpackedfilecontents, "f3") != $length - 2) {
            warn "$ARGV[0] doesn't seem to be an assembly file, the Exec string that will be generated is unlikely to work !";
        }
        $length = length($unpackedfilecontents);
        $unpackedfilecontents = substr($unpackedfilecontents, 0, $length - 2);
        print "Exec \"$unpackedfilecontents\"\n";
    } while (0);
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
User avatar
Lionel DebrouxSuper Modo
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 11.3%
 
Posts: 6869
Joined: 23 Dec 2009, 00:00
Location: France
Gender: Male
Calculator(s):
MyCalcs profile
Class: -
GitHub: debrouxl

Re: Commande Exec : Comment réaliser un "poke" ?

Unread postby Loulou 54 » 02 Jun 2012, 21:10

Trop fort, Lionel ! :D

Justement, comme un "poke" est une instruction assez basique, il n'y a pas moyen de l'écrire directement en hexa ?
(de toutes façons, je ne saurais pas le faire en ASM non plus..)
C'est à dire : une chaîne exec qui me permet de donner la valeur n à l'adresse add ?

Merci encore ;)
Mes programmes => ici !
User avatar
Loulou 54Premium
Niveau 13: CU (Calculateur Universel)
Niveau 13: CU (Calculateur Universel)
Level up: 1.6%
 
Posts: 1985
Images: 8
Joined: 02 Aug 2009, 00:00
Location: 54, près de Metz
Gender: Male
Calculator(s):
MyCalcs profile
Class: Ingé Logiciel chez Amazon

Re: Commande Exec : Comment réaliser un "poke" ?

Unread postby Lionel Debroux » 03 Jun 2012, 06:35

Justement, comme un "poke" est une instruction assez basique, il n'y a pas moyen de l'écrire directement en hexa ?

Si, bien sûr :)

(de toutes façons, je ne saurais pas le faire en ASM non plus..)

C'est un problème pour l'écriture directe en hexa ;)

C'est à dire : une chaîne exec qui me permet de donner la valeur n à l'adresse add ?

Ce que tu veux, c'est une instruction move.b / move.w / move.l (suivant la taille: 8, 16 ou 32 bits) #value (écrite en hexadécimal), xxx.l (également écrite en hexadécimal). Le manuel programmeur du 68000 (M68000PRM.pdf) indique comment assembler à la main, tu vas avoir une instruction de 8 octets si tu veux écrire 8 ou 16 bits, ou 10 octets si tu veux écrire 32 bits :)
Assembler à la main reste quand même moins facile que demander à l'assembleur de le faire pour nous, et d'utiliser un outil de conversion.
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
User avatar
Lionel DebrouxSuper Modo
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 11.3%
 
Posts: 6869
Joined: 23 Dec 2009, 00:00
Location: France
Gender: Male
Calculator(s):
MyCalcs profile
Class: -
GitHub: debrouxl

Re: Commande Exec : Comment réaliser un "poke" ?

Unread postby Loulou 54 » 12 Jun 2012, 10:36

Mmh.. à creuser. ;)
C'était pour un projet de faire quelques sons, en Basic, pour mon programme TI-drum pour le TI-Concours. ^^
Ce serait donc pour modifier les adresses 60000C et 60000E si je me souviens bien. ^^

Merci en tout cas ! :D
Mes programmes => ici !
User avatar
Loulou 54Premium
Niveau 13: CU (Calculateur Universel)
Niveau 13: CU (Calculateur Universel)
Level up: 1.6%
 
Posts: 1985
Images: 8
Joined: 02 Aug 2009, 00:00
Location: 54, près de Metz
Gender: Male
Calculator(s):
MyCalcs profile
Class: Ingé Logiciel chez Amazon


Return to Programmation

Who is online

Users browsing this forum: ClaudeBot [spider] and 0 guests

-
Search
-
Social TI-Planet
-
Featured topics
Comparaisons des meilleurs prix pour acheter sa calculatrice !
"1 calculatrice pour tous", le programme solidaire de Texas Instruments. Reçois gratuitement et sans aucune obligation d'achat, 5 calculatrices couleur programmables en Python à donner aux élèves les plus nécessiteux de ton lycée. Tu peux recevoir au choix 5 TI-82 Advanced Edition Python ou bien 5 TI-83 Premium CE Edition Python.
Enseignant(e), reçois gratuitement 1 exemplaire de test de la TI-82 Advanced Edition Python. À demander d'ici le 31 décembre 2024.
Aidez la communauté à documenter les révisions matérielles en listant vos calculatrices graphiques !
1234
-
Donations / Premium
For more contests, prizes, reviews, helping us pay the server and domains...
Donate
Discover the the advantages of a donor account !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partner and ad
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
958 utilisateurs:
>922 invités
>27 membres
>9 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Other interesting websites
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)