2632Fermer2634
FarewellLe 25/02/2014 à 16:05
Ca fait toujours plaisir de retrouver ses vieux algos
Et ça donne ça :
impl
;===============================================================================
;
;	EvalExpression
;
;	Evaluate an expression. Support macros and relocs
;
;	in	a2	beginning of the expression
;
;	out	d0	value
;		d1	-1	NAN
;			0	ok
;			1	overflow
;		a2	point after the expression
;
;	destroy	nothing
;
;	This function doesn't throw an error in case of overflow, because
;	it can be called when parsing a source file or the CLI
;
;===============================================================================

EvalExpression:					; In: a2 = EXPR*

	bsr	Decompose
	tst.w	d1
	bne.s	\End				; NAN or overflow

	tst.w	d2
	beq.s	\End				; No operator, just a number

	bsr	EvalDecomposedExpression

\End:	rts


EvalDecomposedExpression:			; In:	d0 = IMM1, d2 = OP1, a2 = EXPR*
						; Out:	d0 = IMM
	movem.l	d0/d2-d4,-(sp)
	bsr	Decompose
	tst.w	d1
	beq.s	\Ok
	movem.l	(sp)+,d0/d2-d4			; NAN or overflow
	rts

\Ok:	tst.w	d2
	beq.s	\LastOperation

	cmp.b	7(sp),d2
	bcs.s	\Recurse

		movem.l	(sp)+,d3-d4	; IMM1 = d3, OP1 = d4
		bsr	ExecOperator
		movem.l	(sp)+,d3-d4
		bra.s	EvalDecomposedExpression

\Recurse:	bsr.s	EvalDecomposedExpression
\LastOperation:	movem.l	(sp)+,d3-d4
		bsr	ExecOperator
		movem.l	(sp)+,d3-d4
		rts


Decompose:					; In:	a2 = EXPR*
						; Out:	d0 == IMM, d1 = -1/0/1, d2 = OP1, a2 = EXPR*


ExecOperator:					; In: 	d3 = IMM1, d4 = OP, d0 = IMM2
						; Out:	d0 = IMM, d1 = -1/0/1, d2-d4 unchanged
						; Perform IMM1 OP IMM2

Je crois que c'est mieux implémenté que la première fois.