Scripting help - accum


(T34R4k) #21

Wow, great inspiration, thx a lot !

Only some changes and it should work for negative and positive cases :


// Transfer globalaccum 1 to globalaccum 2 using globalaccum3 as a temp 
// Warning : Could get nasty with large values ...
fmov { 
	trigger mov { 		
		trigger	fmov movpos
		trigger	fmov movneg
	}

	// handle positive source accum
	trigger movpos { 
		globalaccum 1 abort_if_less_than 0

		// init temp accum
		globalaccum 3 set 0
		// init dest accum
		globalaccum 2 set 0
				
		trigger fmov movtmppos 
		trigger fmov movdstpos 
	} 

	trigger movtmppos { 
		globalaccum 1 abort_if_equal 0 
		
		globalaccum 1 inc -1 
		globalaccum 3 inc 1 

		trigger fmov movtmppos
	} 

	trigger movdstpos { 
		globalaccum 3 abort_if_equal 0 
		
		globalaccum 3 inc -1 
		globalaccum 1 inc 1 
		globalaccum 2 inc 1 

		trigger fmov movdstpos 
	} 

	// handle negative source accum
	trigger movneg { 
		globalaccum 1 abort_if_greater_than -1

		// init temp accum
		globalaccum 3 set -1
		// init dest accum
		globalaccum 2 set -1
				
		trigger fmov movtmpneg 
		trigger fmov movdstneg 
	} 

	trigger movtmpneg { 
		globalaccum 1 abort_if_equal -1 
		
		globalaccum 1 inc 1 
		globalaccum 3 inc -1 

		trigger fmov movtmpneg
	} 

	trigger movdstneg { 
		globalaccum 3 abort_if_equal -1 
		
		globalaccum 3 inc 1 
		globalaccum 1 inc -1 
		globalaccum 2 inc -1 

		trigger fmov movdstneg 
	} 
}

Iam getting busy to find something for equal accums.


(SiliconSlick) #22

For comparison, I was thinking along the lines of
(assuming both accums are positive)… just keep
decrementing both until one of them reaches 0.
If the other one reaches 0 at the same time they
are equal, otherwise, not.

SiliconSlick


(T34R4k) #23

Yes, it works :drink:

  
// Equals globalaccum 1 with globalaccum 2 using globalaccum 3 and 4 as a temp
// The result will be finally written to globalaccum 5 : 
// result 0 means globalaccum 1 is equal to globalaccum 2
// result -1 means globalaccum 1 is less than globalaccum 2
// result +1 means globalaccum 1 is greater than globalaccum 2
// Warning : Could get nasty with large values ...
fequ { 
	trigger equ { 
		globalaccum 5 set -2

		// Checking for different signs
		globalaccum 3 set 0
		trigger fequ equlz1
		trigger fequ equlz2
		globalaccum 3 abort_if_equal 1

		globalaccum 4 set 0
		globalaccum 5 set -2
		
		globalaccum 3 trigger_if_equal 2 fequ equpos
		globalaccum 5 abort_if_not_equal -2		
		globalaccum 3 trigger_if_equal 0 fequ equneg
	} 
	
	// Check if globalaccum 1 is positive
	trigger equlz1 { 
		globalaccum 5 set -1
		globalaccum 1 abort_if_less_than 0
		globalaccum 3 inc 1
		globalaccum 5 set 1
	} 

	// Check if globalaccum 2 is positive
	trigger equlz2 { 
		globalaccum 2 abort_if_less_than 0
		globalaccum 3 inc 1
	} 

	// ********** POSITIVE HANDLER **********
	// Equal positive globalaccum's 1 / 2
	trigger equpos { 
		globalaccum 1 inc -1
		globalaccum 2 inc -1
		globalaccum 4 inc 1

		// As soon as one of the globalaccum's 1 / 2 goes negative, checking for different signs again
		globalaccum 1 trigger_if_equal -1 fequ equposchk
		globalaccum 5 abort_if_not_equal -2		
		globalaccum 2 trigger_if_equal -1 fequ equposchk
		globalaccum 5 abort_if_not_equal -2		
		
		trigger fequ equpos
	}

	// Check signs of globalaccum's 1 / 2
	trigger equposchk { 
		// Checking for different signs
		globalaccum 3 set 0
		trigger fequ equlz1
		trigger fequ equlz2
		
		// Restore modified globalaccum's 1 / 2
		trigger fequ equposfin
		
		// One of the globalaccum's 1 / 2 is -1 and the other is still positive => unequal
		globalaccum 3 abort_if_equal 1
		
		// Both globalaccum's 1 / 2 are -1 => equal
		globalaccum 5 set 0
	}

	// Restore modified globalaccum's 1 / 2
	trigger equposfin { 
		globalaccum 4 abort_if_less_than 1

		globalaccum 1 inc 1
		globalaccum 2 inc 1
		globalaccum 4 inc -1

		trigger fequ equposfin
	}
	// **************************************

	// ********** NEGATIVE HANDLER **********
	// Equal negative globalaccum's 1 / 2
	trigger equneg { 
		globalaccum 1 inc 1
		globalaccum 2 inc 1
		globalaccum 4 inc 1

		// As soon as one of the globalaccum's 1 / 2 goes positive, checking for different signs again
		globalaccum 1 trigger_if_equal 0 fequ equnegchk
		globalaccum 5 abort_if_not_equal -2		
		globalaccum 2 trigger_if_equal 0 fequ equnegchk
		globalaccum 5 abort_if_not_equal -2		
		
		trigger fequ equneg
	}

	// Check signs of globalaccum's 1 / 2
	trigger equnegchk { 
		// Checking for different signs
		globalaccum 3 set 0
		trigger fequ equlz1
		trigger fequ equlz2
		
		// Restore modified globalaccum's 1 / 2
		trigger fequ equnegfin
		
		// One of the globalaccum's 1 / 2 is 0 and the other is still negative => unequal
		globalaccum 3 abort_if_equal 1
		
		// Both globalaccum's 1 / 2 are 0 => equal
		globalaccum 5 set 0
	}

	// Restore modified globalaccum's 1 / 2
	trigger equnegfin { 
		globalaccum 4 abort_if_less_than 1

		globalaccum 1 inc -1
		globalaccum 2 inc -1
		globalaccum 4 inc -1

		trigger fequ equnegfin
	}
	// **************************************
}

Does somebody have some suggestion doing the same using less than 5 globalaccums …?

:suspicious: GOD*T34R4k