obj2exl : utilitaire d'encapsulation d'un fichier binaire exécutable dans divers containeur sur support exelvision

Cette commande est le partenaire principal de toute étape de développement. Le fichier binaire produit par un assembleur (par exemple TASM) doit être formaté de différentes manières pour être exécutable au sein d'une plateforme exelvision (DcExel ou machine exelvision). obj2exl permet de générer un fichier exécutable sur disquette, un bloc K7 chargeable via le BASIC ou même une image de ROM. Les paramètres de cette commande autorisent un réglage relativement fin de chacun des types de containeur choisi.
Cette commande est donc au cœur de la chaîne de développement:
TASM -> OBJ2EXL -> test sur DcExel -> validation en environnement réel.
La suite de ce document décrit les nombreuses options de cette commande. Les différents formats générés sont détaillés ci-après.

usage : obj2exl sourceFile targetFile [-t:EXE|DOS|ROM|K7|BAS] [-r:0xRelocAdr] [-b:0xBranchAdr] [-n:4LettersK7Filename] [-l:1|2] [-p] [-c]
sourceFile = fichier binaire source généré par un assembleur (ou à la main)
targetFile = fichier binaire dans le format cible pour exécution sur plateforme exelvision
-t:EXE = génération d'un binaire exécutable via la commande EXEC sur support disquette. Ce format autorise la personnalisation des adresses de chargement (RelocAdr) et de branchement sur la première instruction à exécuter (BranchAdr). Par défaut l'adresse de chargement sera 0x1000 (adresse standard dans la mémoire Exeldisk). Cette adresse peut varier entre 0x0200 et 0xBFFF, c'est-à-dire la plage de RAM Exeldisk + la plage ExelMémoire 16Ko (soit 47,5Ko). La taille du binaire doit être comprise entre l'adresse de chargement et la fin de cette zone 0xBFFF, idem pour l'adresse de branchement. Un programme pourra utiliser ExelDos s'il se charge à partir de l'adresse 0x1000. Le binaire ne pas être chargé dans les zones spécifiques à la CRAM 64ko (pour le moment).
-t:DOS = génération d'un binaire directement exécutable sur la console ExelDos sur support disquette. Le fichier est au format Objet TI mais n'est pas relogeable, le programme doit être chargé à l'adresse 0x1000 et la première instruction exécutable doit aussi se trouver à cette adresse (RelocAdr=BranchAdr). Ce type de fichier, s'il peut sembler pratique, est à réserver pour de petits programmes ou des commandes supplémentaires ExelDos. La taille d'un fichier au format TI est en effet assez importante, digne d'une syntaxe XML. Mais il ne réclame aucun outil supplémentaire (comme EXEC), le loader d'ExelDos sait le gérer directement. La taille de l'exécutable suit les mêmes contraintes que le mode EXE.
-t:ROM = génération d'un binaire sur support cartouche. La zone mémoire où réside le programme est 0x200 à 0x7FFB. 4 octets sont réservés en fin de ROM pour le branchement sur la première instruction (instruction BR) et 1 octet en 0x7FFC qui indique si la ROM sait ou non paginer. Les adresses de chargement comme de branchement peuvent donc être personnalisées dans la zone de validité. Leur valeur par défaut est 0x1000 afin d'assurer la portabilité du code en ROM sur la RAM Exeldisk (mais il n'y a pas obligation).
-t:K7 = génération d'un fichier binaire exécutable pour un support K7. Obj2Exl utilise le format k7 de DcExel qui peut facilement être converti en fichier Wav (pour une machine Exelvision). Ce bloc K7 n'est pas directement exécutable, mais il peut être précédé par un bloc chargeur (loader) qui automatise le chargement et l'exécution du programme à partir du BASIC. L'adresse de chargement peut être spécifiée dans la zone de validité de ce mode (par défaut 0xC300). Il existe en fait deux zones légales: 1) une zone en SRAM de 0xC300 à 0xC7FFX (le X dépend du loader choisi) ou 2) une zone en CRAM de 0x8000 à 0xBFFF. Un programme prévu pour la SRAM ou la CRAM peut donc être chargé. En SRAM la taille du programme doit respecter certaines contraintes: selon le loader choisi le programme ne doit pas empiéter sur les derniers octets de la zone en SRAM. L'adresse de branchement doit être l'adresse de chargement (RelocAdr=BranchAdr).
-t:BAS = génération d'un source en BASIC à copier dans DcExel via la simulation du clavier ou sur une machine exelvision à l'aide de ses doigts. Le fichier est une succession de DATA avec un micro code BASIC permettant d'implanter le programme en mémoire et de l'exécuter. L'adresse de chargement est personnalisable et se situe dans la zone SRAM 0xC380 à 0xC7FF (par défaut 0xC380). L'adresse de branchement est égale à l'adresse de chargement. Le programme doit être petit sinon préférer le mode K7.
-r:0xRelocAdr = adresse de chargement (relocation par abus de langage) en hexadécimal
-r:0xBranchAdr = adresse de branchement (première instruction exécutable) en hexadécimal
-n:WXYZ = permet de spécifier les 4 lettres du nom du bloc K7 lors de la génération d'un exécutable dans ce containeur. Par défaut le nom est composé de 4 espaces.
-l:1 = ajoute un loader de type 1 à l'exécutable sur fichier k7. Ce loader est un petit programme basique qui place en mémoire un code machine pour charger le programme sur K7 automatiquement. Le loader de type 1 est extrêmement simple et ne fait rien d'autre que charger le bloc k7 programme à l'adresse de chargement spécifié et à se brancher sur la première instruction. Il sauvegarde néanmoins les registres A et B pour préparer un retour éventuel sur la console BASIC, votre programme doit dans ce cas restituer ces 2 registres avant l'instruction RETS qui renvoie sous le BASIC. Le programme ne doit pas empiéter sur la zone SRAM débutant en 0xC7FE.
-l:2 = ajoute un loader de type 2 à l'exécutable sur fichier k7. Ce loader est un petit programme spécifique à l'Exeltel, qui place en mémoire un code machine pour charger le programme sur K7 automatiquement. Le loader de type 2 réalise la même tâche que le loader de type 1 mais il initialise le mode 80 colonnes de l'Exeltel avant le branchement sur le première instruction (adresse BAPA du VDP en 0x0A00). Le loader réalise aussi le chargement du générateur de caractère 80 colonnes (en 0x0000), et efface l'écran. Un test est réalisé pour vérifier la présence d'un Exeltel (sinon retour direct sur la console BASIC). Il sauvegarde aussi les registres A et B pour préparer un retour éventuel sur la console BASIC. Le programme ne doit pas empiéter sur la zone SRAM débutant en 0xC7FA.
-p : précise que le programme en ROM sait paginer (dans le cas d'un fichier de type ROM).
-c : fixe le bit de remise à zéro de la RAM VDP pour le mode EXE (la commande EXEC efface la RAM avant l'exécution du programme).

exemple:
obj2exl demo1.obj demo1.k7 –t:K7 –l:1
génère un bloc K7 à partir du binaire demo1.obj et insère un loader de type 1 pour le BASIC. Le programme se charge (par défaut) en SRAM (0xC300).
Il suffit sous BASIC de taper RUN"1" ou LOAD"1" + RUN

obj2exl demo2.obj demo2.k7 –t:K7 –l:2 –r:0X8000
génère un bloc K7 à partir de demo2.obj et insère un loader de type 2 pour le BASIC. Le programme se charge en CRAM (0x8000) à condition que la machine soit un Exeltel.


Spécification d'un fichier pour la commande EXEC:
La commande EXEC pour machine Exelvision est très souple et permet de charger un code binaire dans un fichier sur disquette à n'importe quelle adresse dans la zone 0x0200-0xBFFF. Le code binaire doit cependant être encapsulé dans un fichier au format particulier.
Ce fichier est composé de deux enregistrements: un header et le code binaire.
Ce choix permet de réduire la taille du fichier au minimum tout en disposant de toutes les informations utiles à la gestion de ce binaire dans l'entête.
Description du header: 17 octets
- idendifiant octets 1 à 6 : caractères J E S T E R
- Version octets 7 et 8 : 00 01 pou l'instant
- Flag octet 9 :
			bit 0 à 1 signifie "charger le programme en RAM VDP avant de le copier en RAM pour exécution" (cette option est fixée automatiquement si le programme doit être relogé avant l'adresse 0x1000 et donc empiéter sur la zone de travail ExelDos).
			bit 1 à 1 signifie "effacer RAM VDP avant exécution" (ce bit est fixé à 0 par défaut)
			bit 2 à 1 signifie "demander l'autorisation d'écraser la CRAM" (ce bit est fixé lorsque le programme empiète sur la CRAM)
- RelocAdr octets 10 et 11 : adresse de chargement du programme en RAM
- CodeLength octets 12 et 13 : taille du code binaire en octets
- BranchAdr octets 14 et 15 : adresse de branchement en RAM (première instruction)
- octets 16 et 17 : zone réservée pour usages futurs.

A noter que pour simplifier le chargement et la gestion en RAM, le header et les données sont stockées en miroir dans le fichier.
