shithub: wl3d

ref: a0c3c62fcd25dd62d5c69353a604d3f6afbaa75b
dir: /us.asm/

View raw version
IDEAL
MODEL	MEDIUM,C

;	Assembly portion of the User Mgr. This is just John Carmack's table
;		driven pseudo-random number generator, and we put it in the User Mgr
;		because we couldn't figure out where it should go


;============================================================================
;
;                           RANDOM ROUTINES
;
;============================================================================

	FARDATA

rndindex	dw	?

rndtable db    0,   8, 109, 220, 222, 241, 149, 107,  75, 248, 254, 140,  16,  66
	db   74,  21, 211,  47,  80, 242, 154,  27, 205, 128, 161,  89,  77,  36
	db   95, 110,  85,  48, 212, 140, 211, 249,  22,  79, 200,  50,  28, 188
	db   52, 140, 202, 120,  68, 145,  62,  70, 184, 190,  91, 197, 152, 224
	db  149, 104,  25, 178, 252, 182, 202, 182, 141, 197,   4,  81, 181, 242
	db  145,  42,  39, 227, 156, 198, 225, 193, 219,  93, 122, 175, 249,   0
	db  175, 143,  70, 239,  46, 246, 163,  53, 163, 109, 168, 135,   2, 235
	db   25,  92,  20, 145, 138,  77,  69, 166,  78, 176, 173, 212, 166, 113
	db   94, 161,  41,  50, 239,  49, 111, 164,  70,  60,   2,  37, 171,  75
	db  136, 156,  11,  56,  42, 146, 138, 229,  73, 146,  77,  61,  98, 196
	db  135, 106,  63, 197, 195,  86,  96, 203, 113, 101, 170, 247, 181, 113
	db   80, 250, 108,   7, 255, 237, 129, 226,  79, 107, 112, 166, 103, 241
	db   24, 223, 239, 120, 198,  58,  60,  82, 128,   3, 184,  66, 143, 224
	db  145, 224,  81, 206, 163,  45,  63,  90, 168, 114,  59,  33, 159,  95
	db   28, 139, 123,  98, 125, 196,  15,  70, 194, 253,  54,  14, 109, 226
	db   71,  17, 161,  93, 186,  87, 244, 138,  20,  52, 123, 251,  26,  36
	db   17,  46,  52, 231, 232,  76,  31, 221,  84,  37, 216, 165, 212, 106
	db  197, 242,  98,  43,  39, 175, 254, 145, 190,  84, 118, 222, 187, 136
	db  120, 163, 236, 249

PUBLIC	rndtable

	CODESEG

LastRnd		dw	?

;=================================================
;
; void US_InitRndT (int randomize)
; Init table based RND generator
; if randomize is false, the counter is set to 0
;
;=================================================

PROC	US_InitRndT randomize:word
	uses	si,di
	public	US_InitRndT

	mov	ax,SEG rndtable
	mov	es,ax

	mov	ax,[randomize]
	or	ax,ax
	jne	@@timeit		;if randomize is true, really random

	mov	dx,0			;set to a definite value
	jmp	@@setit

@@timeit:
	mov	ah,2ch
	int	21h			;GetSystemTime
	and	dx,0ffh

@@setit:
	mov	[es:rndindex],dx
	ret

ENDP

;=================================================
;
; int US_RndT (void)
; Return a random # between 0-255
; Exit : AX = value
;
;=================================================
PROC	US_RndT
	public	US_RndT

	mov	ax,SEG rndtable
	mov	es,ax
	mov	bx,[es:rndindex]
	inc	bx
	and	bx,0ffh
	mov	[es:rndindex],bx
	mov	al,[es:rndtable+BX]
	xor	ah,ah
	ret

ENDP

END