lhTools-0.8.0 (alpha)

Ici, on fait dans le petit, le LCD qui déchire sa race, on y cause même calculatrices quand on est en manque !

Modérateur : Politburo

Répondre
cgh
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2143
Enregistré le : 30 août 2011 12:23
Localisation : Vous êtes ici -> .

lhTools-0.8.0 (alpha)

Message par cgh »

Hello, hello,

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 :ugeek: .
Qu'est ce que le fichier de debug ?

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
Comme on peut le voir, lhexec a execute le code qui inverse B et C en preservant A. On peut suivre le programme source... que voici:

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
Les options de lhexec permettent de charger des valeurs dans des registres, puis d'executer le code... Il y en a plein d'autres pour charger et afficher, aussi bien les registres que des zones memoires, sous differents formats (hexa, decimal, ascii, texte...)

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* ]
Ce qui signifie que A sera modifie, B ne le sera pas, F sera modifie par son flag Z (Zero si A est nul, NZero autrement).
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:
Un exemple d'execution avec la valeur &12 chargee dans B:

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
On peut verifier que AEX ne sera pas executer si B=00:

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 
Bon, tout n'est pas encore completement operationel, ni mature pour devenir une nouvelle version. Je ne peux pas y consacrer autant de temps que je le voudrais, alors cela avance doucement !
Modifié en dernier par cgh le 16 nov. 2018 09:44, modifié 3 fois.
Il y a ceux qui voient les choses telles qu'elles sont et se demandent pourquoi, et il y a ceux qui imaginent les choses telles qu'elles pourraient être et se disent... pourquoi pas? - George Bernard Shaw
J'adore parler de rien, c'est le seul domaine où j'ai de vagues connaissances ! - Oscar Wilde
Ce n'est pas parce que les choses sont difficiles que nous n'osons pas. C'est parce que nous n'osons pas que les choses sont difficiles. - Sénèque
cgh
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2143
Enregistré le : 30 août 2011 12:23
Localisation : Vous êtes ici -> .

Re: lhTools-0.8.0 (alpha)

Message par cgh »

Comment est ne lhexec ? He, he, souvenez-vous d'un jeudi soir de fevrier 2015 ou Charognard avait poste son Challenge Mono-ligne Calcul d'indice.
J'etais chez mon pere ce week-end la. Et comme le challenge etait rigolo, que je n'avais de PC1500 avec moi, et que je voulais l'ecrire en assembleur pour faire enrager Charo... Seule solution : Emuler le LH5801 :geek:

Cela a commence par emuler uniquement les quelques instructions necessaires au programme... Celui que j'ai produit dans le fil n'a jamais tourne dans un vrai PC1500... J'y suis alle au culot, et j'ai propose mon delire l'ayant seulement emule ! :mrgreen: :mrgreen: :mrgreen: (Hmmm.... J'ai verifie depuis que le programme fonctionnait a l'identique dans une machine reelle :) )

Le programme, le voici:

Code : Tout sélectionner

	.CODE
STARTUP:
	PUSH	BC
	LD	L,00
strlen:
	LDI	(BC)
	JR	Z,endlen
	INC	L
	JR	strlen
endlen:
	LDA	L
	JR	Z,exitNONE
	PUSH	HL
	DEC	BC
	PUSH	BC
	DEC	BC
	DEC	L
loop:
	LDA	(BC)
	CPA	$Z
	JR	NZ,add+1
	LDA	$@
add+1:
	INC	A
	STD	(BC)
	CPA	$A
	JR	NZ,endloop
	DJC	loop
endloop:
	POP	BC
	POP	HL
	CPA	$A
	JR	NZ,exitNONE
	INC	L
	STI	(BC)
exitNONE:
	AND	(BC),00
	SCF
	POP	BC
EXIT:
	RET
	.END
Quand a son execution emulee:

Code : Tout sélectionner

./lhexec -followsource -T -G zplan.dbg -m pc1500 -clearvar -e entry=40c5 -e exit=40f7 \
 -reg BC=78C0 -mem '78C0="ZZ"' -prmem 78C0/4s zplan.bin
avec le fameux "ZZ" qui doit donner "AAA" ;)

Code : Tout sélectionner

STARTUP:
[  0,0010]	File "asm/zplan.asm":3
[  2,0001]	File "asm/zplan.asm":4
	40C5	78C0 0000 0000 00 00 [hvzic] 784F
	40C5 in file "asm/zplan.asm", line 3
     3	STARTUP:
     4		PUSH	BC
[  2,0001]	File "asm/zplan.asm":5
	40C7	78C0 0000 0000 00 00 [hvzic] 784D
	40C7 in file "asm/zplan.asm", line 5
     5		LD	L,00
strlen:
[  0,0010]	File "asm/zplan.asm":6
[  1,0001]	File "asm/zplan.asm":7
	40C9	78C0 0000 0000 00 00 [hvzic] 784D
	40C9 in file "asm/zplan.asm", line 6
     6	strlen:
     7		LDI	(BC)
[  2,0001]	File "asm/zplan.asm":8
	40CA	78C1 0000 0000 5A 00 [hvzic] 784D
	40CA in file "asm/zplan.asm", line 8
     8		JR	Z,endlen
[  1,0001]	File "asm/zplan.asm":9
	40CC	78C1 0000 0000 5A 00 [hvzic] 784D
	40CC in file "asm/zplan.asm", line 9
     9		INC	L
[  2,0001]	File "asm/zplan.asm":10
	40CD	78C1 0000 0001 5A 00 [hvzic] 784D
	40CD in file "asm/zplan.asm", line 10
    10		JR	strlen
strlen:
[  0,0010]	File "asm/zplan.asm":6
[  1,0001]	File "asm/zplan.asm":7
	40C9	78C1 0000 0001 5A 00 [hvzic] 784D
	40C9 in file "asm/zplan.asm", line 6
     6	strlen:
     7		LDI	(BC)
[  2,0001]	File "asm/zplan.asm":8
	40CA	78C2 0000 0001 5A 00 [hvzic] 784D
	40CA in file "asm/zplan.asm", line 8
     8		JR	Z,endlen
[  1,0001]	File "asm/zplan.asm":9
	40CC	78C2 0000 0001 5A 00 [hvzic] 784D
	40CC in file "asm/zplan.asm", line 9
     9		INC	L
[  2,0001]	File "asm/zplan.asm":10
	40CD	78C2 0000 0002 5A 00 [hvzic] 784D
	40CD in file "asm/zplan.asm", line 10
    10		JR	strlen
strlen:
[  0,0010]	File "asm/zplan.asm":6
[  1,0001]	File "asm/zplan.asm":7
	40C9	78C2 0000 0002 5A 00 [hvzic] 784D
	40C9 in file "asm/zplan.asm", line 6
     6	strlen:
     7		LDI	(BC)
[  2,0001]	File "asm/zplan.asm":8
	40CA	78C3 0000 0002 00 04 [hvZic] 784D
	40CA in file "asm/zplan.asm", line 8
     8		JR	Z,endlen
endlen:
[  0,0010]	File "asm/zplan.asm":11
[  1,0001]	File "asm/zplan.asm":12
	40CF	78C3 0000 0002 00 04 [hvZic] 784D
	40CF in file "asm/zplan.asm", line 11
    11	endlen:
    12		LDA	L
[  2,0001]	File "asm/zplan.asm":13
	40D0	78C3 0000 0002 02 00 [hvzic] 784D
	40D0 in file "asm/zplan.asm", line 13
    13		JR	Z,exitNONE
[  2,0001]	File "asm/zplan.asm":14
	40D2	78C3 0000 0002 02 00 [hvzic] 784D
	40D2 in file "asm/zplan.asm", line 14
    14		PUSH	HL
[  1,0001]	File "asm/zplan.asm":15
	40D4	78C3 0000 0002 02 00 [hvzic] 784B
	40D4 in file "asm/zplan.asm", line 15
    15		DEC	BC
[  2,0001]	File "asm/zplan.asm":16
	40D5	78C2 0000 0002 02 00 [hvzic] 784B
	40D5 in file "asm/zplan.asm", line 16
    16		PUSH	BC
[  1,0001]	File "asm/zplan.asm":17
	40D7	78C2 0000 0002 02 00 [hvzic] 7849
	40D7 in file "asm/zplan.asm", line 17
    17		DEC	BC
[  1,0001]	File "asm/zplan.asm":18
	40D8	78C1 0000 0002 02 00 [hvzic] 7849
	40D8 in file "asm/zplan.asm", line 18
    18		DEC	L
loop:
[  0,0010]	File "asm/zplan.asm":19
[  1,0001]	File "asm/zplan.asm":20
	40D9	78C1 0000 0001 02 11 [HvziC] 7849
	40D9 in file "asm/zplan.asm", line 19
    19	loop:
    20		LDA	(BC)
[  2,0001]	File "asm/zplan.asm":21
	40DA	78C1 0000 0001 5A 11 [HvziC] 7849
	40DA in file "asm/zplan.asm", line 21
    21		CPA	$Z
[  2,0001]	File "asm/zplan.asm":22
	40DC	78C1 0000 0001 5A 15 [HvZiC] 7849
	40DC in file "asm/zplan.asm", line 22
    22		JR	NZ,add+1
[  2,0001]	File "asm/zplan.asm":23
	40DE	78C1 0000 0001 5A 15 [HvZiC] 7849
	40DE in file "asm/zplan.asm", line 23
    23		LDA	$@
add+1:
[  0,0010]	File "asm/zplan.asm":24
[  1,0001]	File "asm/zplan.asm":25
	40E0	78C1 0000 0001 40 11 [HvziC] 7849
	40E0 in file "asm/zplan.asm", line 24
    24	add+1:
    25		INC	A
[  1,0001]	File "asm/zplan.asm":26
	40E1	78C1 0000 0001 41 00 [hvzic] 7849
	40E1 in file "asm/zplan.asm", line 26
    26		STD	(BC)
[  2,0001]	File "asm/zplan.asm":27
	40E2	78C0 0000 0001 41 00 [hvzic] 7849
	40E2 in file "asm/zplan.asm", line 27
    27		CPA	$A
[  2,0001]	File "asm/zplan.asm":28
	40E4	78C0 0000 0001 41 15 [HvZiC] 7849
	40E4 in file "asm/zplan.asm", line 28
    28		JR	NZ,endloop
[  2,0001]	File "asm/zplan.asm":29
	40E6	78C0 0000 0001 41 15 [HvZiC] 7849
	40E6 in file "asm/zplan.asm", line 29
    29		DJC	loop
loop:
[  0,0010]	File "asm/zplan.asm":19
[  1,0001]	File "asm/zplan.asm":20
	40D9	78C0 0000 0000 41 15 [HvZiC] 7849
	40D9 in file "asm/zplan.asm", line 19
    19	loop:
    20		LDA	(BC)
[  2,0001]	File "asm/zplan.asm":21
	40DA	78C0 0000 0000 5A 11 [HvziC] 7849
	40DA in file "asm/zplan.asm", line 21
    21		CPA	$Z
[  2,0001]	File "asm/zplan.asm":22
	40DC	78C0 0000 0000 5A 15 [HvZiC] 7849
	40DC in file "asm/zplan.asm", line 22
    22		JR	NZ,add+1
[  2,0001]	File "asm/zplan.asm":23
	40DE	78C0 0000 0000 5A 15 [HvZiC] 7849
	40DE in file "asm/zplan.asm", line 23
    23		LDA	$@
add+1:
[  0,0010]	File "asm/zplan.asm":24
[  1,0001]	File "asm/zplan.asm":25
	40E0	78C0 0000 0000 40 11 [HvziC] 7849
	40E0 in file "asm/zplan.asm", line 24
    24	add+1:
    25		INC	A
[  1,0001]	File "asm/zplan.asm":26
	40E1	78C0 0000 0000 41 00 [hvzic] 7849
	40E1 in file "asm/zplan.asm", line 26
    26		STD	(BC)
[  2,0001]	File "asm/zplan.asm":27
	40E2	78BF 0000 0000 41 00 [hvzic] 7849
	40E2 in file "asm/zplan.asm", line 27
    27		CPA	$A
[  2,0001]	File "asm/zplan.asm":28
	40E4	78BF 0000 0000 41 15 [HvZiC] 7849
	40E4 in file "asm/zplan.asm", line 28
    28		JR	NZ,endloop
[  2,0001]	File "asm/zplan.asm":29
	40E6	78BF 0000 0000 41 15 [HvZiC] 7849
	40E6 in file "asm/zplan.asm", line 29
    29		DJC	loop
endloop:
[  0,0010]	File "asm/zplan.asm":30
[  2,0001]	File "asm/zplan.asm":31
	40E8	78BF 0000 00FF 41 15 [HvZiC] 7849
	40E8 in file "asm/zplan.asm", line 30
    30	endloop:
    31		POP	BC
[  2,0001]	File "asm/zplan.asm":32
	40EA	78C2 0000 00FF 41 15 [HvZiC] 784B
	40EA in file "asm/zplan.asm", line 32
    32		POP	HL
[  2,0001]	File "asm/zplan.asm":33
	40EC	78C2 0000 0002 41 15 [HvZiC] 784D
	40EC in file "asm/zplan.asm", line 33
    33		CPA	$A
[  2,0001]	File "asm/zplan.asm":34
	40EE	78C2 0000 0002 41 15 [HvZiC] 784D
	40EE in file "asm/zplan.asm", line 34
    34		JR	NZ,exitNONE
[  1,0001]	File "asm/zplan.asm":35
	40F0	78C2 0000 0002 41 15 [HvZiC] 784D
	40F0 in file "asm/zplan.asm", line 35
    35		INC	L
[  1,0001]	File "asm/zplan.asm":36
	40F1	78C2 0000 0003 41 00 [hvzic] 784D
	40F1 in file "asm/zplan.asm", line 36
    36		STI	(BC)
exitNONE:
[  0,0010]	File "asm/zplan.asm":37
[  2,0001]	File "asm/zplan.asm":38
	40F2	78C3 0000 0003 41 00 [hvzic] 784D
	40F2 in file "asm/zplan.asm", line 37
    37	exitNONE:
    38		AND	(BC),00
[  1,0001]	File "asm/zplan.asm":39
	40F4	78C3 0000 0003 41 04 [hvZic] 784D
	40F4 in file "asm/zplan.asm", line 39
    39		SCF
[  2,0001]	File "asm/zplan.asm":40
	40F5	78C3 0000 0003 41 05 [hvZiC] 784D
	40F5 in file "asm/zplan.asm", line 40
    40		POP	BC
[  0,0010]	File "asm/zplan.asm":41
[  1,0001]	File "asm/zplan.asm":42
	40F7 [[[[[ EXIT ]]]]] : Exit point reached
	40F7	78C0 0000 0003 41 05 [hvZiC] 784F
	COMPLETED B) .......... Entering into debugger

	78C0: "AAA "
L'affichage est encore un peu redondant et bordelique, mais cela est du a mes traces de debug !
Il y a ceux qui voient les choses telles qu'elles sont et se demandent pourquoi, et il y a ceux qui imaginent les choses telles qu'elles pourraient être et se disent... pourquoi pas? - George Bernard Shaw
J'adore parler de rien, c'est le seul domaine où j'ai de vagues connaissances ! - Oscar Wilde
Ce n'est pas parce que les choses sont difficiles que nous n'osons pas. C'est parce que nous n'osons pas que les choses sont difficiles. - Sénèque
Avatar du membre
badaze
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 8402
Enregistré le : 12 févr. 2007 18:36
Localisation : Pas très loin de Lyon
Contact :

Re: lhTools-0.8.0 (alpha)

Message par badaze »

T'es un grand malade !
8)

J'aimerais savoir faire ça. Mais so much things to do and so little time.
Tout est bon dans le pocket.
Moi j'aime tout.... Casio, HP, Sharp, TI et les autres sauf que les TI semblent ne pas m'aimer :(
http://www.emmella.fr
Mes Casio - HP - Sharp - TI
Homme invisible.
Répondre

Retourner vers « Tous les Pockets »