Dutra de Lacerda (dulac@ip.pt)
Sat, 22 Aug 1998 01:34:19 +0100
TRUE RANDOM No-Hardware Routine (in Pseudocode)
This routine is based on Keyboard Input and Keyboard latency.
Can be modified so each KeyPressed creates one new 32bits word.
Idle Transforms have been influenced by TEA algorithm.
        function GetTickCount()
        Input	None
        Call	Mov	ah, 00h
                Int	1Ah
        Output	CX = High( TickCount )
                DX = Low ( TickCount )
        function GetKeybStatus()
        Input	None
        Call	Mov	ah, 11h
                Int	16h
        Output	Zero flag Set   = ZF = No KeyPressed
                Zero Flag Clear	= NZ = Key Waiting
        function GetKeyPressed()
        Input	None
        Call	Mov	ah, 10h
                Int	16h
        Output	AH = Keyboard Scan Code
                AL = ASCII Char
        
        function Random()	
        Input	None
        Call 	mov	CODES, 0000
                mov 	RAND,  00000000	
                mov	SUM,   00000000
                mov 	DELTA, 9E3779B9	 
        Loop:
                add 	SUM, DELTA
                mov 	RAND, SUM
                rol	RAND, 3
                call	GetKeybStatus
                jz	Tick
                jnz	Key
        Tick:	
                Call	GetTickCount
                add	RAND, Ticks in CX:DX
                jmp	Next
        Key:	
                Call	GetKeyPressed
                Mov	CODES, AX
                add	Low(RAND), CODES
                jmp 	Next
        Next:
                XOR	RAND, SUM
        Until:  
                mov	AL, Low(Codes)
                Test	AL, 10h
                JZ	Return
                Test 	AL, 13h
                JZ	Return
                Test	AL, 1Bh
                JZ	Return
                JMP	LOOP
        Return:	
                MOV	CX, High( RAND )
                MOV	DX, Low ( RAND )
                
        Output	RAND in CX:DX
Notes:	This routines have an undetermined number of cycles while waiting
        for a keypressed. IMHO this is a TRUE random routine.
        I suspect that if pipes are used ( I suspect they can't ) even then
        a good degree of randomness would be achieved due to system chaotic
        events... Specially if a disk running at the same time AND/OR Mouse
        usage.
        This can be changed to use Disk or Mouse events instead of Keyboard.
        It seems an elegant procedure... But I still may do some changes...
Regards,
Dutra de Lacerda.
 - - - 
Antonio Manuel Melo de Carvalho Dutra de Lacerda
Morada		: Rua Rodrigues Cabrilho, 5 - 5 Esq.
                  1400 Lisboa, PORTUGAL
Telefone	: +351-(1)-3013579
FAX & BBS	: +351-(1)-3021098
The following archive was created by hippie-mail 7.98617-22 on Sat Apr 10 1999 - 01:11:00