Version des lhTools :
0.6.0 disponible sur le
Site de repaire.
C'est une
0.6.0 car le format des fichiers de keyword a change, meme si le format ancien est compatible.
La documentation est a jour. On peut telecharger le manuel des
lhTools-0.6.0.pdf
J'ai compile les executables pour Windows32 a l'aide des MinGW. Par contre, ce n'est pas du tout teste.
Nouveautes:
.DEFINE: "<basic>" = <code> <bits> avec
<bits> =
N|
P|
C|
? avec N : normal (PRINT), P : programmable (FOR), C : commande (NEW), ? : other (???).
Pour chaque keyword, 3 symboles sont crees:
- <basic>\\._code : le code sur 2 octets du keyword, par ex. F0B0
- <basic>\\._jump : l'adresse de jump de la routine du keyword,
- <basic>\\._bits : les bits du keyword, definis comme suit: poids fort, la lettre ASCII (N|P|C|?); poids faible les bits dans la table (&CE,&A0,&80,&E0)
Je les ai rajoutes car cela permet de faire des tables de RESERVE (besoin dans BASFILE pour les ROM0).
Dans le fragment
.KEYWORD, il est juste necessaire de mettre le
"<basic>" keyword entre ".
lhasm genere le fichier de keyword
au nouveau format avec l'option
-K <kywordfile>, ou a l'ancien format (< 0.6.0) avec
-KK <kywordfile>.
lhdump sait traiter les 2 formats de keywords.
On peut aussi maintenant exporter les keywords. Avant il fallait declarer une table de keyword pour que le fichier keyword soit ecrit. Avec cette version, les options -KE ou -KKE exportent les symboles definis dans le source par
.DEFINE:, si aucune table n'est declaree...
Autres nouveautes
- Ajout du module CE163 (-m ce163). La banque 1 n'est pas supportee.
- .IF ORIGIN? - Vrai si une origine a ete definie (.ORIGIN: ou option -O),
- .IF 0 et .IF 1 - Toujours faux ou toujours vrai. Utile pour "commenter" du code.
- .IF KEYWORD? "<keyw>" - Vrai si le token <keyw> existe (.DEFINE: ...)
- .IMPORT: <sym|keyfile> - Importe un fichier de symboles ou de keywords. Ces fichiers sont directement issus de lhasm -S <symfile> -K[K] <keywfile>.
- Correction de bugs divers, et ajout de messages d'erreur si un deplacement est > 255.
- Declaration et utilisation des structures. Voir plus bas...
- Option -J Introduit le remplacement de JR [cc,]&nn par [JR !cc,+3] JP &nn si le deplacement est > 255 fonctionne lhasm est oblige de faire autant de passes que necessaire, mais ca n'a pas l'air mal... lhasm embarque cette option par defaut. Cependant, -Jloop=N stop l'optimiseur apres N passes.
- Option -EE qui traite les erreurs comme fatales.
- Option -W changee. Elle provoque l'affichage de warning de basse priorite, pour ne pas surcharger l'affichage de warning. C'est utilise par le BIND et UNBIND des structures.
Pas mal de corrections d'incoherences et quelque bugs, encore... et encore...
Un petit topo sur les structures, maintenant gerees par lhasm. Je les introduites car je suis en train de documente BASFILE et cela va etre tres utile pour "simplifier" le code et surtout aider a lisibilite et la maintenance du code. (Il faudra apres que je refasse un passage sur MMPS...)
Qu'est-ce qu'une structure ?
Comme en C (ou ADA,...), il s'agit de l'organisation de donnees. Ceci est utilise par exemple pour les entetes des fichiers BASFILE.
Exemple:
Code : Tout sélectionner
.STRUCT: basfile2
ptr word,#2
.ENDSTRUCT
.STRUCT: basfile_header
filename byte,#11
filetype byte
filelen word
fileprev struct'basfile2
.ENDSTRUCT
La structure
basfile_header est composee des champs
filename,
filetype,
filelen et
fileprev. De son cote,
fileprev est lui meme une structure
Une fois, la structure definie, de nouveaux operateurs sont disponibles. Ils fonctionnent sur la structure ou les champs.
- SIZEOF' - Retourne la taille de la structure ou d'un champ,
- TYPEOF' - Retourne le type d'un champ. 1 pour la structure,
- ARRAYOF' - Retourne le nombre d'elements d'un champ, 1 pour la structure,
- ELEMENTOF' - Retourne la taille d'un element,
- OFFSETOF' - Retourne l'offset de la base du champ, 0 pour la structure.
On peut donc manipuler les champs et la structure directement. Par exemple, remettons a 0 le champ filename:
Code : Tout sélectionner
; BC pointe a la base de la structure
LDA OFFSETOF'basfile_header.filename
ADD BC
LD L,SIZEOF'basfile_header.filename
DEC L
CLA
loop:
STI (BC)
DJC loop
Oui, mais comment les utiliser:
Pour ca, j'ai introduit aussi de nouvelles instructions: BIND et UNBIND.
BIND permet de lier un registre a une structure, un champ ou un registre BINDe.
Dans ce cas, lhasm va automatiquement generer le code necessaire au changement de champ. Il n'est plus necessaire de savoir j'ajoute tant, je retranche, etc... Par exemple:
Code : Tout sélectionner
BIND DE,basfile_header.filelen ; DE sur le champ filelen
LDI (DE)
STA H
LDI (DE)
STA L
; Ici lhasm a fait "passer" DE sur le champ suivant fileprev.
; Mais si je veux revenir sur le filename, il faut retrancher...
BIND DE,basfile_header.filename
; Va generer le code pour moi :)
Avec la sortie du .lst, c'est plus parlant...
Code : Tout sélectionner
20 40D0 BIND DE basfile_header.filelen
20 40D0 B5 0C FD DA BIND DE basfile_header.filelen ; DE sur le champ filelen
21 40D4 55 LDI (DE)
22 40D5 28 STA H
23 40D6 55 LDI (DE)
24 40D7 2A STA L
25 40D8 ; Ici lhasm a fait "passer" DE sur le champ suivant fileprev.
26 40D8 ; Mais si je veux revenir sur le filename il faut retrancher...
27 40D8 BIND DE basfile_header.filename
27 40D8 FB 14 B1 0E 1A BIND DE basfile_header.filename
94 30 18
28 40E0 ; Va generer le code pour moi :)
UNBIND va "liberer" le registre, qui ne sera plus liee a une structure.
En attendant vos retours eventuels. Bon amusement !