Cadeau pour la comu des jukebox atari TMS1300 mp2012 enfin dump!!!

Modérateur : Resp. Jukeboxes

Avatar du membre
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!!!

Message par Pet » mar. 30 06, 2020 18:05

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é!
Un clavier AZERTY en vaut deux

Avatar du membre
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!!!

Message par noflip95 » mer. 01 07, 2020 14:20

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 !!! :9):

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 :x25:

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 :x25:

Mal au crâne ? :))
Thierry.

Avatar du membre
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!!!

Message par noflip95 » mer. 01 07, 2020 21:36

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
TMS1300_1.jpg
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:
TMS1300_2.jpg
TMS1300_2.jpg (56.18 Kio) Vu 965 fois
Et physiquement, voilà par quoi ça se traduit:
TMS1300_3.jpg
TMS1300_3.jpg (86.41 Kio) Vu 965 fois
Pour la matrice AND du PLA "Output", les colonnes correspondent aux signaux injectables (et leurs inverses):
2020-07-01_18h52_41.png
2020-07-01_18h52_41.png (978.51 Kio) Vu 965 fois
J'ai rapidement comparé par rapport aux exemples de Texas, comme celui pour le classique décodeur 7-segments:
2020-07-01_19h34_03.png
2020-07-01_19h34_03.png (98.53 Kio) Vu 965 fois

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 :D: 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.

Avatar du membre
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!!!

Message par noflip95 » sam. 04 07, 2020 10:35

Pet a écrit :
mar. 30 06, 2020 18:05
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é!
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).

:arrow: 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 :s1:
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
 
:arrow: Quoi qu'il en soit, mais où donc démarre le programme au reset du CPU ?

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.

Avatar du membre
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!!!

Message par noflip95 » sam. 04 07, 2020 15:56

J'ai dit une petite bêtise :shock: , 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 :x25:
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:
2020-07-04_14h35_31.png
2020-07-04_14h35_31.png (128.62 Kio) Vu 910 fois
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. :u~:
Thierry.

Avatar du membre
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!!!

Message par Pet » sam. 04 07, 2020 16:40

C est toujours un plaisir de lire tes explications, tu es trés clair, précis et c est superbement illustré. :x26:
Un clavier AZERTY en vaut deux

feiltom
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!!!

Message par feiltom » mer. 13 12, 2023 23:00

Bonjour j ai un mp2032 qui je pense est ok, voulez vous le dump avant que je le vende.
Cdt thomas FEILLANT

feiltom
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!!!

Message par feiltom » mer. 13 12, 2023 23:54

Désolé j avais pas vu que vous faites un d’UMP « hardware « 
Je vais suivre avec intérêt votre thread.

Répondre