Cadeau pour la comu des jukebox atari TMS1300 mp2012 enfin dump!!!
Modérateur : Resp. Jukeboxes
- Pet
- Dept: 33
- Rech/Achete: 0 flip
- Messages : 2599
- Enregistré le : 05/01/2010
- Pas vu depuis 3 mois
- Niveau : Expert
- Pro / revendeur : non
- Localisation : Léognan
Re: Cadeau pour la comu des jukebox atari TMS1300 mp2012 enfin dump!!!
J ai essayé de lire le code asm, ca ne me semble pas cohérent (mais ce type d assembleur m'est inconnu)
Et je ne trouve pas de doc sur l assembleur tms1000 si quelqu un avait un lien ca me comblerait de bonheur.
Edit : trouvé!
Et je ne trouve pas de doc sur l assembleur tms1000 si quelqu un avait un lien ca me comblerait de bonheur.
Edit : trouvé!
Un clavier AZERTY en vaut deux
- noflip95
- Dept: 95
- Rech/Achete: 0 flip
- Messages : 377
- Enregistré le : 11/09/2010
- Niveau : Expert
- Pro / revendeur : non
- Localisation : Franconville
- Contact :
Re: Cadeau pour la comu des jukebox atari TMS1300 mp2012 enfin dump!!!
Les docs TMS1000/1300 on les trouve encore, et on les avaient sur notre site : https://www.flipprojets.fr/DocsCircuits_FR.php (voir onglet CPU)
Tu as deux doc indispensables : la première c'est le datasheet, plutôt orienté hardware. Mais dedans, tu n'as pas le détail des "opcodes" et comment fonctionne le bidule. Il te faut impérativement le "programming ref" (ou qq chose comme ça) qui est le gros bouquin dédié à la programmation, orienté software. Là, tu as les opcodes, mais tu va aussi découvrir que ce CPU est encore plus exotique qu'on ne le soupçonne.
Déjà, quand tu regarde un DUMP mémoire d'un CPU, il faut se méfier car tout n'est pas que du code. Tu peux très bien avoir des tables diverses de données et donc ça, ce n'est pas vraiment à désassembler. Selon les CPU, l'adresse de départ n'est pas toujours 0. Sur du Z80, oui, les adresses de démarrage/interruption (sauf mode 8080) sont fixes.
Sur du 6502/6800/6809 tu dois plutôt regarder le contenu des vecteurs pour savoir à partir de où commencer le désassemblage.
Je me rappelle plus bien sur les TMS1000, mais il ne me semble pas qu'il y ait de "vecteur" et que ca démarre toujours à l'adresse 0.
Mais ça, c'est encore du fonctionnement "classique".
Ce qui l'est beaucoup moins, c'est que dans le TMS 1000 tu as un PLA. En fait... il y en a deux !!!
Le plus connu, c'est le PLA "output". En gros, ca permet de programmer des sorties "à la demande". L'utilisation classique, c'est le décodeur "7-segments". Tu présente une donnée binaire/hexa (0 à 9 - A à F) sur 4 bits, et derrière le PLA décode ça pour piloter 7 sorties.
Celui-là est simple, facile à comprendre et souvent utilisé pour la même chose .
C'est fait pour limiter le nombre de circuits à implanter, là par exemple, on économise des décodeurs BCD/7-Segments. En plus, vu les tensions supportées par le CPU, on peut brancher des afficheurs direct en sortie, sans avoir besoin de buffers/amplificateurs comme en CMOS ou TTL.
L'autre partie plus exotique du PLA, c'est que l'on peut programmer ses propres instructions
Sur un CPU classique, Z80, 6800/6500, PIC, ATR,... le jeu d'instructions est fixe et connu.
En interne, chaque instruction est décodée en "micro-code" qui correspondent aux opérations "hardware" de base. Par exemple, lire le bus d'adresses, lire le bus de données, charger la valeur dans l'ALU.
Normalement, quand on programme - même au plus bas niveau - en assembleur, on ne s'occupe pas de cela. On a le jeu d'instructions normal du CPU et ç'est tout.
Sur le TMS1000, tu as aussi le jeu d'instructions "fixes" comme n'importe quel CPU, mais tu as aussi des instructions personnalisables
Dans le datasheet, c'est mentionné au §2.7 "The instruction programmable logic array".
Tu peux définir tes propres instructions en utilisant les 16 micro-instructions du cœur du CPU.
C'est le genre de fonction que je n'ai jamais vu sur aucun autre CPU ou micro-contrôleur.
On le voit mieux dans le "programming reference" figure 2.1.1 (tu as la partie instructions fixes et la partie instructions programmables avec les 16 micro-codes).
Et le détail est donné dans les §2.15, 2.16 et 2.17.
Bref... d'un TMS1000 à l'autre, une instruction ayant pourtant le même opcode ne fera pas forcément la même chose
Mal au crâne ?
Tu as deux doc indispensables : la première c'est le datasheet, plutôt orienté hardware. Mais dedans, tu n'as pas le détail des "opcodes" et comment fonctionne le bidule. Il te faut impérativement le "programming ref" (ou qq chose comme ça) qui est le gros bouquin dédié à la programmation, orienté software. Là, tu as les opcodes, mais tu va aussi découvrir que ce CPU est encore plus exotique qu'on ne le soupçonne.
Déjà, quand tu regarde un DUMP mémoire d'un CPU, il faut se méfier car tout n'est pas que du code. Tu peux très bien avoir des tables diverses de données et donc ça, ce n'est pas vraiment à désassembler. Selon les CPU, l'adresse de départ n'est pas toujours 0. Sur du Z80, oui, les adresses de démarrage/interruption (sauf mode 8080) sont fixes.
Sur du 6502/6800/6809 tu dois plutôt regarder le contenu des vecteurs pour savoir à partir de où commencer le désassemblage.
Je me rappelle plus bien sur les TMS1000, mais il ne me semble pas qu'il y ait de "vecteur" et que ca démarre toujours à l'adresse 0.
Mais ça, c'est encore du fonctionnement "classique".
Ce qui l'est beaucoup moins, c'est que dans le TMS 1000 tu as un PLA. En fait... il y en a deux !!!
Le plus connu, c'est le PLA "output". En gros, ca permet de programmer des sorties "à la demande". L'utilisation classique, c'est le décodeur "7-segments". Tu présente une donnée binaire/hexa (0 à 9 - A à F) sur 4 bits, et derrière le PLA décode ça pour piloter 7 sorties.
Celui-là est simple, facile à comprendre et souvent utilisé pour la même chose .
C'est fait pour limiter le nombre de circuits à implanter, là par exemple, on économise des décodeurs BCD/7-Segments. En plus, vu les tensions supportées par le CPU, on peut brancher des afficheurs direct en sortie, sans avoir besoin de buffers/amplificateurs comme en CMOS ou TTL.
L'autre partie plus exotique du PLA, c'est que l'on peut programmer ses propres instructions
Sur un CPU classique, Z80, 6800/6500, PIC, ATR,... le jeu d'instructions est fixe et connu.
En interne, chaque instruction est décodée en "micro-code" qui correspondent aux opérations "hardware" de base. Par exemple, lire le bus d'adresses, lire le bus de données, charger la valeur dans l'ALU.
Normalement, quand on programme - même au plus bas niveau - en assembleur, on ne s'occupe pas de cela. On a le jeu d'instructions normal du CPU et ç'est tout.
Sur le TMS1000, tu as aussi le jeu d'instructions "fixes" comme n'importe quel CPU, mais tu as aussi des instructions personnalisables
Dans le datasheet, c'est mentionné au §2.7 "The instruction programmable logic array".
Tu peux définir tes propres instructions en utilisant les 16 micro-instructions du cœur du CPU.
C'est le genre de fonction que je n'ai jamais vu sur aucun autre CPU ou micro-contrôleur.
On le voit mieux dans le "programming reference" figure 2.1.1 (tu as la partie instructions fixes et la partie instructions programmables avec les 16 micro-codes).
Et le détail est donné dans les §2.15, 2.16 et 2.17.
Bref... d'un TMS1000 à l'autre, une instruction ayant pourtant le même opcode ne fera pas forcément la même chose
Mal au crâne ?
Thierry.
- noflip95
- Dept: 95
- Rech/Achete: 0 flip
- Messages : 377
- Enregistré le : 11/09/2010
- Niveau : Expert
- Pro / revendeur : non
- Localisation : Franconville
- Contact :
Re: Cadeau pour la comu des jukebox atari TMS1300 mp2012 enfin dump!!!
Bon, ben finalement avec un peu de logique on arrive assez facilement à identifier sur la puce, les secteurs "physiques" correspondant aux zones mémoire ou programmables.
Et effectivement, ca confirme bien ce qui est dit dans la doc: on retrouve les deux gros blocs pour la RAM (512 bits - 128 x 4) et la ROM (16384 bits -2048 x 8 )
On trouve également les deux PLA, celui pour le "output", en haut à gauche et celui pour les "instructions", en haut à droite
Les PLA du TMS1000 fonctionnent sur un principe similaire a celui des PAL (ceux qui connaissent les PAL16L8 ou les GAL20V10 ne seront pas dépaysé).
On retrouve ici, la construction classique d'une matrice AND couplée à une matrice OR.
En entrées de la matrice AND on injecte ce qui vient du registre, et on choisi soit le signal normal, soit le signal inversé (comme sur un PAL).
Chaque "term" (équation) logique issu de cette matrice AND, pilote ensuite les sorties de la matrice OR (exactement pareil sur un PAL).
Dans la doc, c'est décrit comme cela:
Et physiquement, voilà par quoi ça se traduit:
Pour la matrice AND du PLA "Output", les colonnes correspondent aux signaux injectables (et leurs inverses):
J'ai rapidement comparé par rapport aux exemples de Texas, comme celui pour le classique décodeur 7-segments:
Le TMS1300 du Jukebox utilise bien son Output PAL pour piloter des afficheurs 7-segments, mais visiblement sa programmation est légèrement différente du modèle standard. Quand on regarde la matrice AND, on voit par exemple que les colonnes SL et /SL sont inversées et aussi, que tous les "terms" sont décalés de 1.
Je ne pense pas que cela ait un impact fondamental sur la compréhension du programme, car le principe reste toujours le même.
D'ailleurs, au final, le résultat est peut-être aussi le même ! car comme dans un PAL, on peut très bien intervertir les lignes... cela n'a pas d'importance. Pire encore, sur un PAL on peut travailler en logique positive ou négative: pour résumer, on peut coder les mêmes fonctions de plusieurs manières. Mais ça, ca ne semble pas être prévu sur les TMS1000 (on ne peut pas inverser les sorties du PLA). Ouf pas d'output register, ni d'OLMC comme sur un GAL.
On peut relever cependant, que pour l'époque, c'était une technologie vraiment très en avance sur ce qui se faisait ailleurs.
Concernant le PAL "instructions", je n'ai pas regardé dans le détail.
Visiblement, cette fonctionnalité est prévue pour reprogrammer le microcode du CPU. Autrement dit, pour que certaines instructions ne fonctionnent plus comme elles le font par défaut.
D'après ce que j'ai compris de la philosophie de ce CPU, le jeu d'instruction est modifiable sauf pour les instructions fixes (genre celles de contrôle, les JMP et autres CALL). Si j'ai bien compris, l'intérêt de modifier le comportement serait lié aux opérations I/O et mémoire (genre aller lire directement dans des emplacements ou des ports). Je ne suis pas certain que ce soit utilisé dans tous les cas.
Il est d'ailleurs intéressant de regarder la doc "software" du TMS1000. On y découvre que chaque instruction "classique" est détaillée avec les différentes micro-instructions qui seront exécutées. Je n'ai jamais vu ça sur d'autres CPU. D'ailleurs, les micro-instructions sont la plupart du temps ignorées (et totalement inutiles) pour les programmeurs. Il n'y a que quand on s'interresse au fonctionnement interne des CPU, ou que l'on s'amuse à les modéliser en VHDL ou Verilog que l'on s'interresse a cet aspect.
Je me trompe peut être, mais j'ai l'impression que le PLA "instructions" devait être programmé avec un contenu relativement standard, fourni par Texas, et qu'il était possible, mais pas forcement obligatoire de le modifier. Il est probable, que la majorité des TMS1000 fonctionnaient avec le jeu d'instruction par défaut. Mais ce n'est qu'une supposition.
En tout cas, il faudrait s'assurer au moins que le contenu de ce PLA est bien "standard", car sinon désassembler le programme ne va pas servir à grand chose si on ne sait pas à quoi correspondent les instructions.
L'américain qui a fait l'extraction n'a semble-t-il pas fourni le dump correspondant à ce PLA. Est-ce un oubli, ou est-ce volontaire, car c'est peut être inutile si le TMS1300 du jukebox utilise un jeu d'instructions standard ?
Et effectivement, ca confirme bien ce qui est dit dans la doc: on retrouve les deux gros blocs pour la RAM (512 bits - 128 x 4) et la ROM (16384 bits -2048 x 8 )
On trouve également les deux PLA, celui pour le "output", en haut à gauche et celui pour les "instructions", en haut à droite
Les PLA du TMS1000 fonctionnent sur un principe similaire a celui des PAL (ceux qui connaissent les PAL16L8 ou les GAL20V10 ne seront pas dépaysé).
On retrouve ici, la construction classique d'une matrice AND couplée à une matrice OR.
En entrées de la matrice AND on injecte ce qui vient du registre, et on choisi soit le signal normal, soit le signal inversé (comme sur un PAL).
Chaque "term" (équation) logique issu de cette matrice AND, pilote ensuite les sorties de la matrice OR (exactement pareil sur un PAL).
Dans la doc, c'est décrit comme cela:
Et physiquement, voilà par quoi ça se traduit:
Pour la matrice AND du PLA "Output", les colonnes correspondent aux signaux injectables (et leurs inverses):
J'ai rapidement comparé par rapport aux exemples de Texas, comme celui pour le classique décodeur 7-segments:
Le TMS1300 du Jukebox utilise bien son Output PAL pour piloter des afficheurs 7-segments, mais visiblement sa programmation est légèrement différente du modèle standard. Quand on regarde la matrice AND, on voit par exemple que les colonnes SL et /SL sont inversées et aussi, que tous les "terms" sont décalés de 1.
Je ne pense pas que cela ait un impact fondamental sur la compréhension du programme, car le principe reste toujours le même.
D'ailleurs, au final, le résultat est peut-être aussi le même ! car comme dans un PAL, on peut très bien intervertir les lignes... cela n'a pas d'importance. Pire encore, sur un PAL on peut travailler en logique positive ou négative: pour résumer, on peut coder les mêmes fonctions de plusieurs manières. Mais ça, ca ne semble pas être prévu sur les TMS1000 (on ne peut pas inverser les sorties du PLA). Ouf pas d'output register, ni d'OLMC comme sur un GAL.
On peut relever cependant, que pour l'époque, c'était une technologie vraiment très en avance sur ce qui se faisait ailleurs.
Concernant le PAL "instructions", je n'ai pas regardé dans le détail.
Visiblement, cette fonctionnalité est prévue pour reprogrammer le microcode du CPU. Autrement dit, pour que certaines instructions ne fonctionnent plus comme elles le font par défaut.
D'après ce que j'ai compris de la philosophie de ce CPU, le jeu d'instruction est modifiable sauf pour les instructions fixes (genre celles de contrôle, les JMP et autres CALL). Si j'ai bien compris, l'intérêt de modifier le comportement serait lié aux opérations I/O et mémoire (genre aller lire directement dans des emplacements ou des ports). Je ne suis pas certain que ce soit utilisé dans tous les cas.
Il est d'ailleurs intéressant de regarder la doc "software" du TMS1000. On y découvre que chaque instruction "classique" est détaillée avec les différentes micro-instructions qui seront exécutées. Je n'ai jamais vu ça sur d'autres CPU. D'ailleurs, les micro-instructions sont la plupart du temps ignorées (et totalement inutiles) pour les programmeurs. Il n'y a que quand on s'interresse au fonctionnement interne des CPU, ou que l'on s'amuse à les modéliser en VHDL ou Verilog que l'on s'interresse a cet aspect.
Je me trompe peut être, mais j'ai l'impression que le PLA "instructions" devait être programmé avec un contenu relativement standard, fourni par Texas, et qu'il était possible, mais pas forcement obligatoire de le modifier. Il est probable, que la majorité des TMS1000 fonctionnaient avec le jeu d'instruction par défaut. Mais ce n'est qu'une supposition.
En tout cas, il faudrait s'assurer au moins que le contenu de ce PLA est bien "standard", car sinon désassembler le programme ne va pas servir à grand chose si on ne sait pas à quoi correspondent les instructions.
L'américain qui a fait l'extraction n'a semble-t-il pas fourni le dump correspondant à ce PLA. Est-ce un oubli, ou est-ce volontaire, car c'est peut être inutile si le TMS1300 du jukebox utilise un jeu d'instructions standard ?
Thierry.
- noflip95
- Dept: 95
- Rech/Achete: 0 flip
- Messages : 377
- Enregistré le : 11/09/2010
- Niveau : Expert
- Pro / revendeur : non
- Localisation : Franconville
- Contact :
Re: Cadeau pour la comu des jukebox atari TMS1300 mp2012 enfin dump!!!
Bonjour,
Ca ne m'étonne pas que tu trouve cela incohérent, car pour que cela soit exploitable il faudrait faire figurer les ADRESSES !!!
Un désassemblage sans les adresses ne sert pas à grand chose, car quand on cherche les points d'entrées des call/jump c'est tout simplement imbittable
Heureusement, ici, c'est assez facile à rajouter, mais surtout il faut d'abord comprendre l'architecture des TMS1000 (ou TMS1300 dans ce cas).
Ce qui est très arrangeant avec ce CPU, c'est que toutes les instructions sont au format 8 bits. Il n'y a jamais d'instruction sur 2 ou 3 octets.
Je me suis assuré que le "asm" publié, avait bien utilisé le jeu d'instruction du TMS1300 (et non pas celui du TMS1000, qui est légèrement différent).
La mémoire ROM dans les TMS1000 (et 1300) est organisé en pages.
En effet , le PC (program counter) ne fait que 6 bits, et on ne peut adresser au maximum que des programmes de 64 octets
Il y a 16 pages numérotée de 0 à 15.
Sur le TMS1300, qui a le double de mémoire du TMS1000, chaque page est divisée en deux chapitres (0 et 1) sélectionnables par un bit/instruction (Chapter bit - CB / COMC).
Et physiquement, cela apparait très bien sur la photo du "die": sur l'axe Y de la matrice ROM, on voit bien les deux blocs (chapter 0 et 1) de 64 lignes chacun. Sur l'axe X en revanche, on distingue bien 16 blocs (de 8 bits) qui correspondent aux pages.
Autrement dit, pour la lecture "visuelle" du "die", les octets se suivent non pas horizontalement, mais verticalement !
Par contre, ce qu'il serait intéressant de savoir, c'est comment est organisé le dump binaire qui a été produit.
Car il y a deux façon de faire:
- option1 : (solution la plus lisible), on met d'abord toutes les adresses du chapitre 0 (pages 0 à a 15) et ensuite toutes celles du chapitre 1 (pages 0 à 15).
- option2 : pour chaque page, on met les chapitres (0 et 1) l'un derrière l'autre.
Ou plus clairement : à l'adresse $040, as-t-on la page 1/ch. 0 ou la page 0/ch. 1 ?
Car suivant l'option qui a été choisie par celui qui a fait le dump, on a les deux possibilités d'organisation suivantes :
Code : Tout sélectionner
Adresses Option1 Option2 // Adresses Option1 Option2
--------- --------------- --------------- --------- --------------- ---------------
$000-$03F Page 0 - ch. 0 Page 0 - ch. 0 // $400-$43F Page 0 - ch. 1 Page 8 - ch. 0
$040-$07F Page 1 - Ch. 0 Page 0 - Ch. 1 // $440-$47F Page 1 - Ch. 1 Page 8 - Ch. 1
$080-$0BF Page 2 - Ch. 0 Page 1 - Ch. 0 // $480-$4BF Page 2 - Ch. 1 Page 9 - Ch. 0
$0C0-$0FF Page 3 - Ch. 0 Page 1 - Ch. 1 // $4C0-$4FF Page 3 - Ch. 1 Page 9 - Ch. 1
$100-$13F Page 4 - Ch. 0 Page 2 - Ch. 0 // $500-$53F Page 4 - Ch. 1 Page 10 - Ch. 0
$140-$17F Page 5 - Ch. 0 Page 2 - Ch. 1 // $540-$57F Page 5 - Ch. 1 Page 10 - Ch. 1
$180-$1BF Page 6 - Ch. 0 Page 3 - Ch. 0 // $580-$5BF Page 6 - Ch. 1 Page 11 - Ch. 0
$1C0-$1FF Page 7 - Ch. 0 Page 3 - Ch. 1 // $5C0-$5FF Page 7 - Ch. 1 Page 11 - Ch. 1
$200-$23F Page 8 - Ch. 0 Page 4 - Ch. 0 // $600-$63F Page 8 - Ch. 1 Page 12 - Ch. 0
$240-$27F Page 9 - Ch. 0 Page 4 - Ch. 1 // $640-$67F Page 9 - Ch. 1 Page 12 - Ch. 1
$280-$2BF Page 10 - Ch. 0 Page 5 - Ch. 0 // $680-$6BF Page 10 - Ch. 1 Page 13 - Ch. 0
$2C0-$2FF Page 11 - Ch. 0 Page 5 - Ch. 1 // $6C0-$6FF Page 11 - Ch. 1 Page 13 - Ch. 1
$300-$33F Page 12 - Ch. 0 Page 6 - Ch. 0 // $700-$73F Page 12 - Ch. 1 Page 14 - Ch. 0
$340-$37F Page 13 - Ch. 0 Page 6 - Ch. 1 // $740-$77F Page 13 - Ch. 1 Page 14 - Ch. 1
$380-$3BF Page 14 - Ch. 0 Page 7 - Ch. 0 // $780-$7BF Page 14 - Ch. 1 Page 15 - Ch. 0
$3C0-$3FF Page 15 - Ch. 0 Page 7 - Ch. 1 // $7C0-$7FF Page 15 - Ch. 1 Page 15 - Ch. 1
Hé bien, chaque CPU a son propre mode de fonctionnement. Sur du Zilog Z80, c'est toujours à l'adresse 0. Sur des 6800/6500 l'adresse de départ est dans un vecteur de reset (en haut de la mémoire). Sur du TMS1000/1300 c'est... DANS LA PAGE 15 (et chapitre 0 pour le TMS1300).
Si vous voulez suivre/décoder ce que fait le CPU, il faudra donc commencer par analyser ce qui se passe a partir:
- de l'adresse $3C0, si tout les chapitres 0 sont au début du dump
- de l'adresse $780, si le chapitres 0 et 1 sont stockés l'un après l'autre dans le dump
Thierry.
- noflip95
- Dept: 95
- Rech/Achete: 0 flip
- Messages : 377
- Enregistré le : 11/09/2010
- Niveau : Expert
- Pro / revendeur : non
- Localisation : Franconville
- Contact :
Re: Cadeau pour la comu des jukebox atari TMS1300 mp2012 enfin dump!!!
J'ai dit une petite bêtise , il y a bien les "adresses" dans le asm !
Mais c'est écrit d'une façon tellement peu conventionnelle (pour ne pas dire orthodoxe) qu'on ne le voit pas tout de suite.
En plus... il y a un mic-mac à la sauce Texas concernant les "labels"
Au lieu d'avoir une belle adresse hexa, comme pour n'importe quel autre CPU, on a trois champs en début de ligne séparés par des ":"
- Le premier, c'est effectivement le chapitre.
Et visiblement, le dump est bien organisé avec d'abord tous les chapitres 0 (pour les 16 pages) puis les chapitres 1 (de nouveau pour les 16 pages).
- Ensuite en colonne 2, on a la page : de 0 à F
- Enfin en troisième colonne on a le label.
Là, j'avoue ne pas avoir tout saisi
Mais d'après ce que je comprend, quand on a un branch/call avec une adresse 6 bits (par exemple un branch $3f = code BF = 1011.1111), l'adresse en question n'est pas celle physique ($3F), mais une adresse remappée ($06 ???). Quand on regarde le dump sur une page, on retrouve bien toutes les valeurs 00 à 3F, mais sauf qu'elles ne sont pas aux emplacements que l'on pourrait attendre. CE N'EST FINALEMENT PAS TRES GENANT, car en fin de compte, le asm sait calculer ça et à la limite, on s'en moque puisque le "label" apparait en clair. On le voit bien au début de la page, où on a la série :00: , :01: , :03: , :07: (au lieu de :00: , :01: , :02: , :03:)
J'avoue ne pas bien comprendre la logique du truc, mais ça ne m'étonne qu'a moitié, car quand on regarde le codage des instructions des TMS1000, on voit qu'un coup les bits LSB...MSB sont dans un sens, et un coup dans l'autre C'est la logique Texas
Voilà le début du programme, et le traitement au RESET devient tout de suite beaucoup moins obscur: On a en gros, une initialisation classique.
Le programme initialise la RAM en traitant 4 blocs successivement.
Là où il y a une subtilité, c'est le RETN planté en plein milieu.
Sur les TMS1000/1300, la notion de sous-programme est extrêmement simplifiée: il n'y a pas de pile (pour les adresses de retour), juste un registre (et des bits associés pour la page/chapitre). Bref, on n'a jamais d'appels imbriqués.
En revanche, le comportement du RETN est double: soit il agit comme un retour classique si l'appel a été fait par un CALL, soit il agit comme un NOP si aucun CALL n'a été fait.
Lors du RESET, pour initialiser le premier bloc (0), la boucle est mise linéairement dans le programme. Quand on arrive au RETN, ca ne fait rien (NOP) et ça passe à l'instruction suivante. Ensuite, lors des CALL pour les autres blocs (1, 2 et 3), ca fera bien un retour. En après le bloc 3, le programme continu normalement.
Je vais arrêter là l'analyse du code, n'ayant pas ce jukebox, je ne vais pas me lancer dans le reverse complet de la ROM.
Mais c'est intéressant techniquement de comprendre comment marchaient ces technologies.
Bon courage pour la suite.
Mais c'est écrit d'une façon tellement peu conventionnelle (pour ne pas dire orthodoxe) qu'on ne le voit pas tout de suite.
En plus... il y a un mic-mac à la sauce Texas concernant les "labels"
Au lieu d'avoir une belle adresse hexa, comme pour n'importe quel autre CPU, on a trois champs en début de ligne séparés par des ":"
- Le premier, c'est effectivement le chapitre.
Et visiblement, le dump est bien organisé avec d'abord tous les chapitres 0 (pour les 16 pages) puis les chapitres 1 (de nouveau pour les 16 pages).
- Ensuite en colonne 2, on a la page : de 0 à F
- Enfin en troisième colonne on a le label.
Là, j'avoue ne pas avoir tout saisi
Mais d'après ce que je comprend, quand on a un branch/call avec une adresse 6 bits (par exemple un branch $3f = code BF = 1011.1111), l'adresse en question n'est pas celle physique ($3F), mais une adresse remappée ($06 ???). Quand on regarde le dump sur une page, on retrouve bien toutes les valeurs 00 à 3F, mais sauf qu'elles ne sont pas aux emplacements que l'on pourrait attendre. CE N'EST FINALEMENT PAS TRES GENANT, car en fin de compte, le asm sait calculer ça et à la limite, on s'en moque puisque le "label" apparait en clair. On le voit bien au début de la page, où on a la série :00: , :01: , :03: , :07: (au lieu de :00: , :01: , :02: , :03:)
J'avoue ne pas bien comprendre la logique du truc, mais ça ne m'étonne qu'a moitié, car quand on regarde le codage des instructions des TMS1000, on voit qu'un coup les bits LSB...MSB sont dans un sens, et un coup dans l'autre C'est la logique Texas
Voilà le début du programme, et le traitement au RESET devient tout de suite beaucoup moins obscur: On a en gros, une initialisation classique.
Le programme initialise la RAM en traitant 4 blocs successivement.
Là où il y a une subtilité, c'est le RETN planté en plein milieu.
Sur les TMS1000/1300, la notion de sous-programme est extrêmement simplifiée: il n'y a pas de pile (pour les adresses de retour), juste un registre (et des bits associés pour la page/chapitre). Bref, on n'a jamais d'appels imbriqués.
En revanche, le comportement du RETN est double: soit il agit comme un retour classique si l'appel a été fait par un CALL, soit il agit comme un NOP si aucun CALL n'a été fait.
Lors du RESET, pour initialiser le premier bloc (0), la boucle est mise linéairement dans le programme. Quand on arrive au RETN, ca ne fait rien (NOP) et ça passe à l'instruction suivante. Ensuite, lors des CALL pour les autres blocs (1, 2 et 3), ca fera bien un retour. En après le bloc 3, le programme continu normalement.
Je vais arrêter là l'analyse du code, n'ayant pas ce jukebox, je ne vais pas me lancer dans le reverse complet de la ROM.
Mais c'est intéressant techniquement de comprendre comment marchaient ces technologies.
Bon courage pour la suite.
Thierry.
- Pet
- Dept: 33
- Rech/Achete: 0 flip
- Messages : 2599
- Enregistré le : 05/01/2010
- Pas vu depuis 3 mois
- Niveau : Expert
- Pro / revendeur : non
- Localisation : Léognan
Re: Cadeau pour la comu des jukebox atari TMS1300 mp2012 enfin dump!!!
C est toujours un plaisir de lire tes explications, tu es trés clair, précis et c est superbement illustré.
Un clavier AZERTY en vaut deux
-
- Dept: 79
- Rech/Achete: 0 flip
- Messages : 5
- Enregistré le : 18/06/2015
- Pas vu depuis 3 mois
- Niveau : Débutant
- Pro / revendeur : non
Re: Cadeau pour la comu des jukebox atari TMS1300 mp2012 enfin dump!!!
Bonjour j ai un mp2032 qui je pense est ok, voulez vous le dump avant que je le vende.
Cdt thomas FEILLANT
Cdt thomas FEILLANT
-
- Dept: 79
- Rech/Achete: 0 flip
- Messages : 5
- Enregistré le : 18/06/2015
- Pas vu depuis 3 mois
- Niveau : Débutant
- Pro / revendeur : non
Re: Cadeau pour la comu des jukebox atari TMS1300 mp2012 enfin dump!!!
Désolé j avais pas vu que vous faites un d’UMP « hardware «
Je vais suivre avec intérêt votre thread.
Je vais suivre avec intérêt votre thread.