4070Fermer4072
FarewellLe 22/11/2014 à 21:34
Ça, c'est beau
EvalExpression:					; In: a2 = EXPR*

	bsr	Decompose
	tst.b	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.b	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			; Compare operators priority
	bcs.s	\Recurse

		movem.l	(sp)+,d3-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*
...