obj2exl : utilitaire d'encapsulation d'un fichier binaire excutable dans divers containeur sur support exelvision

Cette commande est le partenaire principal de toute tape de dveloppement. Le fichier binaire produit par un assembleur (par exemple TASM) doit tre format de diffrentes manires pour tre excutable au sein d'une plateforme exelvision (DcExel ou machine exelvision). obj2exl permet de gnrer un fichier excutable sur disquette, un bloc K7 chargeable via le BASIC ou mme une image de ROM. Les paramtres de cette commande autorisent un rglage relativement fin de chacun des types de containeur choisi.
Cette commande est donc au cur de la chane de dveloppement:
TASM -> OBJ2EXL -> test sur DcExel -> validation en environnement rel.
La suite de ce document dcrit les nombreuses options de cette commande. Les diffrents formats gnrs sont dtaills ci-aprs.

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 gnr par un assembleur (ou  la main)
targetFile = fichier binaire dans le format cible pour excution sur plateforme exelvision
-t:EXE = gnration d'un binaire excutable via la commande EXEC sur support disquette. Ce format autorise la personnalisation des adresses de chargement (RelocAdr) et de branchement sur la premire instruction  excuter (BranchAdr). Par dfaut l'adresse de chargement sera 0x1000 (adresse standard dans la mmoire Exeldisk). Cette adresse peut varier entre 0x0200 et 0xBFFF, c'est--dire la plage de RAM Exeldisk + la plage ExelMmoire 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 spcifiques  la CRAM 64ko (pour le moment).
-t:DOS = gnration d'un binaire directement excutable 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 premire instruction excutable doit aussi se trouver  cette adresse (RelocAdr=BranchAdr). Ce type de fichier, s'il peut sembler pratique, est  rserver pour de petits programmes ou des commandes supplmentaires ExelDos. La taille d'un fichier au format TI est en effet assez importante, digne d'une syntaxe XML. Mais il ne rclame aucun outil supplmentaire (comme EXEC), le loader d'ExelDos sait le grer directement. La taille de l'excutable suit les mmes contraintes que le mode EXE.
-t:ROM = gnration d'un binaire sur support cartouche. La zone mmoire o rside le programme est 0x200  0x7FFB. 4 octets sont rservs en fin de ROM pour le branchement sur la premire 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 personnalises dans la zone de validit. Leur valeur par dfaut est 0x1000 afin d'assurer la portabilit du code en ROM sur la RAM Exeldisk (mais il n'y a pas obligation).
-t:K7 = gnration d'un fichier binaire excutable 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 excutable, mais il peut tre prcd par un bloc chargeur (loader) qui automatise le chargement et l'excution du programme  partir du BASIC. L'adresse de chargement peut tre spcifie dans la zone de validit de ce mode (par dfaut 0xC300). Il existe en fait deux zones lgales: 1) une zone en SRAM de 0xC300  0xC7FFX (le X dpend du loader choisi) ou 2) une zone en CRAM de 0x8000  0xBFFF. Un programme prvu 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 empiter sur les derniers octets de la zone en SRAM. L'adresse de branchement doit tre l'adresse de chargement (RelocAdr=BranchAdr).
-t:BAS = gnration 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 mmoire et de l'excuter. L'adresse de chargement est personnalisable et se situe dans la zone SRAM 0xC380  0xC7FF (par dfaut 0xC380). L'adresse de branchement est gale  l'adresse de chargement. Le programme doit tre petit sinon prfrer le mode K7.
-r:0xRelocAdr = adresse de chargement (relocation par abus de langage) en hexadcimal
-r:0xBranchAdr = adresse de branchement (premire instruction excutable) en hexadcimal
-n:WXYZ = permet de spcifier les 4 lettres du nom du bloc K7 lors de la gnration d'un excutable dans ce containeur. Par dfaut le nom est compos de 4 espaces.
-l:1 = ajoute un loader de type 1  l'excutable sur fichier k7. Ce loader est un petit programme basique qui place en mmoire un code machine pour charger le programme sur K7 automatiquement. Le loader de type 1 est extrmement simple et ne fait rien d'autre que charger le bloc k7 programme  l'adresse de chargement spcifi et  se brancher sur la premire instruction. Il sauvegarde nanmoins les registres A et B pour prparer 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 empiter sur la zone SRAM dbutant en 0xC7FE.
-l:2 = ajoute un loader de type 2  l'excutable sur fichier k7. Ce loader est un petit programme spcifique  l'Exeltel, qui place en mmoire un code machine pour charger le programme sur K7 automatiquement. Le loader de type 2 ralise la mme tche que le loader de type 1 mais il initialise le mode 80 colonnes de l'Exeltel avant le branchement sur le premire instruction (adresse BAPA du VDP en 0x0A00). Le loader ralise aussi le chargement du gnrateur de caractre 80 colonnes (en 0x0000), et efface l'cran. Un test est ralis pour vrifier la prsence d'un Exeltel (sinon retour direct sur la console BASIC). Il sauvegarde aussi les registres A et B pour prparer un retour ventuel sur la console BASIC. Le programme ne doit pas empiter sur la zone SRAM dbutant en 0xC7FA.
-p : prcise que le programme en ROM sait paginer (dans le cas d'un fichier de type ROM).
-c : fixe le bit de remise  zro de la RAM VDP pour le mode EXE (la commande EXEC efface la RAM avant l'excution du programme).

exemple:
obj2exl demo1.obj demo1.k7 t:K7 l:1
gnre un bloc K7  partir du binaire demo1.obj et insre un loader de type 1 pour le BASIC. Le programme se charge (par dfaut) 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
gnre un bloc K7  partir de demo2.obj et insre un loader de type 2 pour le BASIC. Le programme se charge en CRAM (0x8000)  condition que la machine soit un Exeltel.


Spcification d'un fichier pour la commande EXEC:
La commande EXEC pour machine Exelvision est trs 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 rduire la taille du fichier au minimum tout en disposant de toutes les informations utiles  la gestion de ce binaire dans l'entte.
Description du header: 17 octets
- idendifiant octets 1  6 : caractres 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 excution" (cette option est fixe automatiquement si le programme doit tre relog avant l'adresse 0x1000 et donc empiter sur la zone de travail ExelDos).
			bit 1  1 signifie "effacer RAM VDP avant excution" (ce bit est fix  0 par dfaut)
			bit 2  1 signifie "demander l'autorisation d'craser la CRAM" (ce bit est fix lorsque le programme empite 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 (premire instruction)
- octets 16 et 17 : zone rserve pour usages futurs.

A noter que pour simplifier le chargement et la gestion en RAM, le header et les donnes sont stockes en miroir dans le fichier.
