PPRULE:
db 100, 75, 16,  3,229, 51,197,118, 24, 62,198, 11,141,152,241,188
db   2, 17, 71, 47,179,177,126,231,202,243, 59, 25, 77,196, 30,134
db 199,163, 34,216, 21, 84, 37,182,224,186, 64, 79,225, 45,143, 20
db  48,147,209,221,125, 29, 99, 12, 46,190,102,220, 80,215,242,105
db  15, 53,  0, 67, 68, 69, 70, 89,109,195,170, 78,210,131, 42,110
db 181,145, 40,114,254, 85,107, 87, 72,192, 90,201,162,122, 86,252
db  94,129, 98,132,193,249,156,172,219,230,153, 54,180,151, 83,214
db 123, 88,164,167,116,117,  7, 27, 23,213,235,  5, 65,124, 60,127
db 236,149, 44, 28, 58,121,191, 13,250, 10,232,112,101,217,183,239
db   8, 32,228,174, 49,113,247,158,106,218,154, 66,226,157, 50, 26
db 253, 93,205, 41,133,165, 61,161,187,169,  6,171, 81,248, 56,175
db 246, 36,178, 52, 57,212, 39,176,184,185,245, 63, 35,189,206, 76
db 104,233,194, 19, 43,159,108, 55,200,155, 14, 74,244,255,222,207
db 208,137,128,135, 96,144, 18, 95,234,139,173, 92,  1,203,115,223
db 130, 97, 91,227,146,  4, 31,120,211, 38, 22,138,140,237,238,251
db 240,160,142,119, 73,103,166, 33,148,  9,111,136,168,150, 82,204
db 100, 75, 16,  3,229, 51,197,118, 24, 62,198, 11,141,152,241,188
db   2, 17, 71, 47,179,177,126,231,202,243, 59, 25, 77,196, 30,134
db 199,163, 34,216, 21, 84, 37,182,224,186, 64, 79,225, 45,143, 20
db  48,147,209,221,125, 29, 99, 12, 46,190,102,220, 80,215,242,105
db  15, 53,  0, 67, 68, 69, 70, 89,109,195,170, 78,210,131, 42,110
db 181,145, 40,114,254, 85,107, 87, 72,192, 90,201,162,122, 86,252
db  94,129, 98,132,193,249,156,172,219,230,153, 54,180,151, 83,214
db 123, 88,164,167,116,117,  7, 27, 23,213,235,  5, 65,124, 60,127
db 236,149, 44, 28, 58,121,191, 13,250, 10,232,112,101,217,183,239
db   8, 32,228,174, 49,113,247,158,106,218,154, 66,226,157, 50, 26
db 253, 93,205, 41,133,165, 61,161,187,169,  6,171, 81,248, 56,175
db 246, 36,178, 52, 57,212, 39,176,184,185,245, 63, 35,189,206, 76
db 104,233,194, 19, 43,159,108, 55,200,155, 14, 74,244,255,222,207
db 208,137,128,135, 96,144, 18, 95,234,139,173, 92,  1,203,115,223
db 130, 97, 91,227,146,  4, 31,120,211, 38, 22,138,140,237,238,251
db 240,160,142,119, 73,103,166, 33,148,  9,111,136,168,150, 82,  0
ALIGN 64
rd 2
PPState:
rb PPStateWidth/4
PPRenew:
	pushad
	mov ebp,PPStateWidth-1
	movzx esi,BYTE[PPState+ebp+4-4]
@@:
	mov eax,esi
	movzx ebx,BYTE[PPState+ebp+3-4]
	movzx ecx,BYTE[PPState+ebp+2-4]
	movzx edx,BYTE[PPState+ebp+1-4]
	movzx esi,BYTE[PPState+ebp+0-4]
	add eax,ebx
	add ebx,ecx
	add ecx,edx
	add edx,esi
	movzx eax,BYTE[PPRULE+eax]
	movzx ebx,BYTE[PPRULE+ebx]
	movzx ecx,BYTE[PPRULE+ecx]
	movzx edx,BYTE[PPRULE+edx]
	mov [PPState+ebp+4-4],al
	mov [PPState+ebp+3-4],bl
	mov [PPState+ebp+2-4],cl
	mov [PPState+ebp+1-4],dl
	sub ebp, 4
	jnc @b
	popad
	ret
PPSeed:
	mov eax,[esp+4]
	mov ecx,PPStateWidth - 5
	mov [PPState+PPStateWidth-4],eax
	inc eax
@@:	mov edx,eax
	shr edx,cl
	mov [PPState+ecx],dl
	dec ecx
	jns @b
	mov ecx,PPStateWidth - 1
@@:	call PPRenew
	dec ecx
	jns @b
	ret 4
PPStateWidth=2056
macro PP reg,indx
{
	mov reg,DWORD[PPState+indx*4-4]
	dec indx
	jne @f
	call PPRenew
	mov indx, PPStateWidth/4
@@:
}
