1

Bonjour smile

Je dispose de la documentation officielle de motorola pour le 68 k, et je m'exerce dans un 1er temps à traduire différentes instructions asm en hexa; mais je me heurte à un petit problème :

je sais que pour coder [code]move.b #10, d0[/code]; il faut commencer par l'instruction binaire 0001101000111100 soit 1A3C en hexa; sauf que je ne sais pas
-> comment lui préciser le 10 décimal (je suppose que cela doit se faire juste après)
-> quelle taille de données lui accorder réellement dans la suite hexadecimale

Quelqu'un peut-il m'aider ?

2

1) Le 10 décimal est en effet à préciser juste après, c'est ce que l'on appelle une valeur immédiate.

2) Les tailles d'instructions 68k sont multiples de deux.
Les valeurs immédiates .b et .w (et les adresses absolues xxx.w) sont stockées sur deux octets, les valeurs immédiates .l (et les adresses absolues xxx.l) sont stockées sur 4 octets.
1 bis) quand il y a une valeur immédiate en source, et une adresse absolue en destination, je suis quasiment sûr que la valeur immédiate est stockée avant l'adresse absolue.


Ton instruction sera 1A3C (je te fais confiance, je ne connais pas par coeur l'assemblage des opcodes move grin) suivi de 000A.
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

3

Tiens, tu connais ce tableau de GoldenCrystal ? tromb Fichier joint : M68kOpcodes-v2.2.pdf
Un excellent document, tenant sur une page (sur un fond d'écran chez moi grin).

4

Oh, bonne suggestion, je n'y avais pas pensé smile
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

5

Merci beaucoup smile

D'ailleurs : n'y a-t-il pas une erreur sur le document de GoldenCrystal ? La doc de motorola me donne que l'absolute long est {Mode = 111, Register = 001} et non {Mode = 111, Register = 000} (car il a répété cette dernière configuration 2 fois : 1 pour absolute word et une pour absolute long) .

6

Ouep, j'ai repéré un ou deux trucs de ce genre dans la doc, mais oublié de te le dire. grin

7

Ce n'est pas grave smile
En tous cas, merci beaucoup smile

8

Au passage :

!call GoldenCrystal
--- Call : GoldenCrystal appelé(e) sur ce topic ...
(cf. ./5)

9

Raah zut encore un truc qui m'est passé sous le nez !
Bon je corrige ça dès que j'en ai l'occasion, ça fera une v2.3 tongue
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

10

top

11

Fixed => http://goldencrystal.free.fr/M68kOpcodes-v2.3.pdf
Il semblerait que j'aie utilisé la table 2-4 de M68kPM qui est visiblement fausse... Mais les explications sur plusieurs pages du dessus étaient correctes cheeky
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

12

Merci smile
Sinon, j'ai besoin d'une autre information capitale ... juste pour savoir : comment coderiez-vous la chaine aseembleur suivante en chaine exec :
chaine asm = "move.l 20(a7, d3.w),d5" ?
En utilisant la doc de GoldenCrystal, je demarrerais par un 00 10 101 000 110 111 (car 00 | 10 pécise une taille de transfert long | 101 précise une valeur de registre destinaition = 5 | 000 précise un mode de registre destination à Dn | 110 précise un mode de registre de source à (d8,An,Xn) | 111 précise la valeur 7 comme registre de source {An} ) 0010 1010 0011 0111 soit $2A37
problèmes = je dois certainnement préciser à la suite le d3 et le 20 : est-ce que la suite 0014 0003 est exacte (0014 => 20 en hexa sur un format word; de même pour 0003 qui code un ... 3) ? Et comment pourrais-je coder le fait que d3 soit un Dn et soit utilisé en word ?

13

Le fait qu'il y ait un déplacement de (d3.w [interprété comme un entier signé] + 20) par rapport à a7 est codé dans un seul mot.
C'est le "Brief extension word format" décrit dans la section sur les capacités d'adressage du M68000 Programmers' Reference Manual. Dans la version que j'ai, ce sont la figure 2.2 et la table 2.1. Sur 68000, 68010 et leurs dérivés (probablement les ColdFire), "scale" est toujours égal à 1, donc les deux bits scale seront toujours 0. Seuls CPU32 et 68020+ peuvent avoir des scale différents de 1.

Je dirais que le mot correspondant à un déplacement de (d3.w [interprété comme un entier signé] + 20) est $3014.
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

14

Merci smile
J'ai compris pour le Breif extension word (j'ai regardé sur la doc de GoldenCrystal)
En fait je continue par 0 011 0 000 00010100 soit $3014

Sinon, pourrais-tu me passer la page du 68kPM.pdf où tu as toutes ces infos (on ne peut pas lancer de recherche précise sur les PDF avec le logiciel que j'ai) , si c'est bien à partir de ce document ?

15

Dans la version que j'ai, pages 43-44.
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

16

Je l'ai smile
Merci beaucoup smile

J'ai bien noté aussi que, ainsi que tu me l'as précisé, la doc de GoldenCrystal précise une scale de 00 .
(Je désires programmer sur une TI89 HW2, et plus précisément par chaines exec, un programme que j'aurais écrit sur PC devrais me fournir la séquence d'un programme ASM SANS librairie exterieure) .

17

Ah, c'est pour faire des chaînes Exec, pas juste pour apprendre à assembler des instructions à la main...
On peut faire des programmes ASM qui ne nécessitent pas de librairie extérieure. De nos jours, c'est le cas de la majorité des programmes TI-68k wink
Si tu veux quand même faire des chaînes Exec, je sais qu'il y a au moins un programme qui peut transformer un programme ASM (.89z) en une chaîne Exec: ça te faciliterait beaucoup l'écriture de tes programmes ^^
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

18

C'est parce que je ne peux plus passer mes programmes par ordi : le port de ma ti doit être défectueux .
Sinon c'est peut être meilleur de passer par un convertisseur 89z=>chaines exec.

19

OK, mais le programme qui traduit les .??z en chaînes Exec t'éviterait au moins de tout assembler à la main wink
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

20

Je suis d'accord : et est-ce qu'il le fait (ca serait juste un bonus) directement à partir des fichiers sources ?
Et est-il disponible sous LINUX ?

Ah oui : (tu verras mon raisonnement purement idiot) mettons que j'écrive le programme en JAVA => il ne manquerait plus grand chose pour l'adapter en j2ME pour les téléphones portables => Plus besoin de PC !!!

21

J'ai fait quelques recherches, et je vois que le MakeExec de Zeljko Juric est un programme qui tourne sur la calculette elle-même. Zut.

Sous Linux, c'est plus simple que sous Windows, parce qu'on dispose (sauf distro très bizarre...) de Perl. Un coup de pack et/ou unpack, et voilà, c'est fini. Il faut que j'essaie, tiens.
L'automatisation de la compilation à partir des fichiers source est scriptable elle aussi: il suffit d'utiliser l'interface en ligne de commande de TIGCC / GCC4TI (les outils tigcc et tprbuilder).
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

22

Ubuntu 8.04 (que j'utilise) dispose de Perl : il est même pré-installé .
ok : tout ça c'est bon signe smile (à part pour MakeExec)

Sinon, que penses-tu d'une version j2ME de MakeExec ?

23

Bof pour une version Java, parce que Java n'a pas le sucre syntaxique qu'a Perl pour faire la conversion de format...
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

24

Oui mais pour les mobiles ... c'est pratiquement du Java obligé sad (Je sais qu'il y a aussi Symbian)
Et passer de Java Edition Standard à Java Edition Mobile serait ainsi moins difficile .
Mais aussi beaucoup de mobilles peuvent traiter Java Mobile Edition avec les spécifiacations MIDP 2.0 => c'est qu'ils seraient plus abilités pour ce genre de compilation que le simple TI-BASIC.
Et enfin, les connexions mobiles étant USB, elles sont plus fiables que ma TI 89 HW2.

Sinon, je te fais confiance pour la fiabilité du PERL, je ne l'ai jamais appris .

25

Sauvegarde ce qui suit dans un fichier, et lance-le avec `perl ...` dans un terminal.
Si tu fais chmod +x sur le fichier auparavant, tu peux te passer de mettre "perl " devant l'invocation, il faut juste invoquer "./..."]
Peut-être devras-tu enlever les espaces dans "[ 0 ]", j'ai dû les mettre pour que les couleurs du forum ne m'embêtent pas.

#!/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;

    (   ($#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: tifile_to_exe.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 90 header bytes).\n";

        if ($length <= 90) { # 86 bytes for the header, 2 size bytes and 2 bytes for the trailing checksum.
            die "$ARGV[ 0 ] is too short to be a valid file suitable for TI-68k calculators";
        }
        $length -= 90;
        
        $filecontents = substr($filecontents, 88, $length);

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

        print "Exec \"" . unpack ("H[$length]", $filecontents) . "\"\n";
    } while (0);


41 lignes, dont 10 lignes blanches. Ce n'est pas en Java, en C ou en C++ qu'on peut faire ça avec une telle compacité (et surtout pas si on se préoccupe de la gestion des erreurs) grin
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

26

Merci beaucoup smile

Je télécharge TIGCC, je compile le Hello world 1ere version et je teste smile

27

Je n'arrive pas à installer tigcc . J'ai téléchargé le Install.sh et le tarball, mais il me met "mkdir : opération manquante".
J'ai essayé plusieures fois .

28

La version que j'ai postée tout à l'heure sortait l'ASM_TAG final (ça, il me semble que ce n'est pas grave) et ne vérifiait pas que le fichier semblait être un programme assembleur valide (anti-utilisateur vilain qui donnerait un fichier TI non ASM au programme... ça risque TRES fort de produire une chaîne ASM qui va crasher la calculette). Utilise plutôt la version suivante (en enlevant les espaces dans "[ 0 ]", si nécessaire):

#!/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: tifile_to_exe.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);

48 lignes, dont 10 lignes blanches.
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

29

Vu qu'Ubuntu est assez différente de Debian (contrairement à, par exemple, SimplyMEPIS), les packages dispo à http://repo.calcforge.org/debian/ risquent de ne pas fonctionner pour toi => tu risques de devoir compiler TIGCC.

!call Kevin Kofler
--- Call : Kevin Kofler appelé(e) sur ce topic ...

pour les problèmes avec les scripts d'installation de TIGCC wink
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

30

Ok, merci smile Je télécharge les sources smile