Grosse mise a jour des lhTools ce soir . Cependant, c'est toujours une ALPHA release, donc non parfaitement stable. Les formats des differents fichiers ne sont pas non plus encore completement figes. la documentation n'est pas encore a jour... Desole.
Tout d'abord: Quelques corrections de bugs dans lhasm, qui assemble mal les instructions SBR (&nn) pour &nn >= &C0. En fait, lhasm supporte des aliases pour les 32 macros SBR de &C0 à &FE.
En nouveautes:
- lhcks - Un utilitaire pour generer une checksum. J'utilise souvent une checksum dans mes logiciels. Cela me permet de verifier l'integrite du dit logiciel apres un crash. Mais aussi d'identifier la "version" de ce logiciel.
- lhdbg - Un utilitaire pour affichier le fichier de debug... Qu'est ce que c'est ? Et bien, c'est la grande nouveaute des lhTools-0.8.0...
- lhexec - Un executeur de code LH5801, mais aussi un emulateur, parfaitement operationnel, y compris TIME, mais sans le son ni le graphisme. Ni les interfaces CE-150 et CE-158. En fait, c'est plus une "sonde JTAG" qu'un emulateur parfait comme PockEmul .
Il s'agit en fait d'un fichier genere par l'assembleur lhasm et qui se veut comparable aux sections de debug des .ELF. Ce fichier contient plein d'informations qui pourront etre exploitees par le dumper lhdump et par l'executeur lhexec. Il est cree avec l'option -G fichier.dbg
Il est par exemple possible de suivre l'execution d'un programme binaire avec l'affichage du fichier source, donc des commentaires... ce qui est bien plus agreable. Si si.... !
De meme, lhexec qui sait se servir dedans peut par exemple retrouver le code source dans le fichier source de l'adresse donnee
Aller, un petit exemple avec l'execution du programme asm/exbc.asm :
Code : Tout sélectionner
bash-4.2$ ./lhexec -G exbc.g -reg BC=1234 -reg A=AA -followregs -followsource exbc.b
File: 0, Fragment C0DE: start 40C5 length 000F
Loading code at 40c5, Binary exbc.b
lhTools Version 0.8.0 (9594cc1)
Compiled (cgh@varvotier) Thu Dec 1 22:35:58 CET 2016
Platform Linux 3.2.29 x86_64
Copyright 1992-2015 CGH
Welcome to lhexec :)
Create MAP 000100E6 for SYSTEM stack: 7800 784F
Create MAP 000000D5 for fragment CODE: 40C5 40D3
Create MAP 000000E7 for fragment WORD: 40D4 40D5
40C5 1234 0000 0000 AA 00 [hvzic] 784F
40C5 in file "exbc.s", line 4
4 EXBC:
5 PUSH A ; Save accumulator
40C7 1234 0000 0000 AA 00 [hvzic] 784E
40C7 1234 0000 0000 AA 00 [hvzic] 784E
40C7 in file "exbc.s", line 7
7 PUSH A ; Save accumulator
40C9 1234 0000 0000 AA 00 [hvzic] 784D
40C9 1234 0000 0000 AA 00 [hvzic] 784D
40C9 in file "exbc.s", line 8
8 PUSH BC ; Push BC -> SP + 2 = C, SP + 1 = B
40CB 1234 0000 0000 AA 00 [hvzic] 784B
40CB 1234 0000 0000 AA 00 [hvzic] 784B
40CB in file "exbc.s", line 9
9 POP A ; Pop SP + 1 to A
40CD 1234 0000 0000 12 00 [hvzic] 784C
40CD 1234 0000 0000 12 00 [hvzic] 784C
40CD in file "exbc.s", line 10
10 STA C ; Store to C
40CE 1212 0000 0000 12 00 [hvzic] 784C
40CE 1212 0000 0000 12 00 [hvzic] 784C
40CE in file "exbc.s", line 11
11 POP A ; Pop SP + 2 to A
40D0 1212 0000 0000 34 00 [hvzic] 784D
40D0 1212 0000 0000 34 00 [hvzic] 784D
40D0 in file "exbc.s", line 12
12 STA B ; Store to B
40D1 3412 0000 0000 34 00 [hvzic] 784D
40D1 3412 0000 0000 34 00 [hvzic] 784D
40D1 in file "exbc.s", line 13
13 POP A ; Restore accumulator
40D3 3412 0000 0000 AA 00 [hvzic] 784E
40D3 [[[[[ EXIT ]]]]] : Exit point reached
40D3 3412 0000 0000 AA 00 [hvzic] 784E
COMPLETED B) .......... Entering into debugger
Code : Tout sélectionner
; EXBC : Exchange B and C register
.CODE
EXBC:
PUSH A ; Save accumulator
; Enter with BC, exit with B and C exchanged
PUSH A ; Save accumulator
PUSH BC ; Push BC -> SP + 2 = C, SP + 1 = B
POP A ; Pop SP + 1 to A
STA C ; Store to C
POP A ; Pop SP + 2 to A
STA B ; Store to B
POP A ; Restore accumulator
EXIT:
RET ; Return to caller
.WORD
BCVAL:
ABCD
.END
lhexec possede bien sur un mode "interactif" (-i) qui permet de renter de faire une emulation de la machine PC1500 complete avec le clavier et l'affichage, les interruptions, ... mais ni le son ni le graphisme.
Se voulant plus une sorte de "sonde JTAG", lhexec en dehors de toute la batteries de braekpoint, watchpoint, executionpoint, etc... possede aussi une "MMU" qui permet de restreindre les acces a des parties de la memoire.
Par exemple, les segments de CODE sont proteges contre l'ecriture, et les segments de donnees (BYTE, TEXT, WORD, ...) contre l'execution. Bien sur, tout cela est activable/desactivable a volonte
J'ai introduit avec lhasm les DATA, STRUCTURE et BITFIELD qui permettent d'organiser la memoire de facon complexe, et bien sur lhexec sait tirer profit des informations passees par dans le fichier de debug. Bon, ici, c'est vraiment encore au stade alpha... J'ai encore quelque soucis avec les offsets a corriger.
Enfin, pour finir, j'ai ajouter un "operand dissector" qui permet d'afficher les entrees et sorties d'une operande. Par exemple, le dissector de LDA B sera:
Code : Tout sélectionner
2 40C5 84 LDA B
Dissector: [ A* F* B ZERO* ]
Bien sur, lhexec, lui affichera cela de facon encore plus interessante:
Par exemple, le petit programme suivant charge B dans A, et si A n'est pas nul, inverse les poids fort et faible de A:
Code : Tout sélectionner
LDA B
JR Z,lbl_4_0c9
AEX
lbl_4_0c9:
Code : Tout sélectionner
Dissector:IN<< A=00 B=12
Dissector:DO[[ 40C5 LDA B ]]
Dissector:OUT>> A=12 F=hvzic ZERO=clear
Dissector:IN<< CND:Zero
Dissector:DO[[ 40C6 JR Z,40C9 ]]
Dissector:TST?? F=hvzic Cond 'Zero', Verified false... Skipping instruction
Dissector:OUT>>
Dissector:IN<< A=12
Dissector:DO[[ 40C8 AEX ]]
Dissector:OUT>> A=21
Code : Tout sélectionner
Dissector:IN<< A=00 B=00
Dissector:DO[[ 40C5 LDA B ]]
Dissector:OUT>> A=00 F=hvZic ZERO=SET
Dissector:IN<< CND:Zero
Dissector:DO[[ 40C6 JR Z,40C9 ]]
Dissector:TST?? F=hvZic Cond 'Zero', Verified TRUE... Execing instruction
Dissector:OUT>> PC=40C9