101 lines
2.8 KiB
NASM
101 lines
2.8 KiB
NASM
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 (boolean 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
|
|
|