]> 4ch.mooo.com Git - 16.git/blob - 16/wf3d8086/id_us_a.asm
code miraculously works on real hardware
[16.git] / 16 / wf3d8086 / id_us_a.asm
1 IDEAL\r
2 MODEL   MEDIUM,C\r
3 \r
4 ;       Assembly portion of the User Mgr. This is just John Carmack's table\r
5 ;               driven pseudo-random number generator, and we put it in the User Mgr\r
6 ;               because we couldn't figure out where it should go\r
7 \r
8 \r
9 ;============================================================================\r
10 ;\r
11 ;                           RANDOM ROUTINES\r
12 ;\r
13 ;============================================================================\r
14 \r
15         FARDATA\r
16 \r
17 rndindex        dw      ?\r
18 \r
19 rndtable db    0,   8, 109, 220, 222, 241, 149, 107,  75, 248, 254, 140,  16,  66\r
20         db   74,  21, 211,  47,  80, 242, 154,  27, 205, 128, 161,  89,  77,  36\r
21         db   95, 110,  85,  48, 212, 140, 211, 249,  22,  79, 200,  50,  28, 188\r
22         db   52, 140, 202, 120,  68, 145,  62,  70, 184, 190,  91, 197, 152, 224\r
23         db  149, 104,  25, 178, 252, 182, 202, 182, 141, 197,   4,  81, 181, 242\r
24         db  145,  42,  39, 227, 156, 198, 225, 193, 219,  93, 122, 175, 249,   0\r
25         db  175, 143,  70, 239,  46, 246, 163,  53, 163, 109, 168, 135,   2, 235\r
26         db   25,  92,  20, 145, 138,  77,  69, 166,  78, 176, 173, 212, 166, 113\r
27         db   94, 161,  41,  50, 239,  49, 111, 164,  70,  60,   2,  37, 171,  75\r
28         db  136, 156,  11,  56,  42, 146, 138, 229,  73, 146,  77,  61,  98, 196\r
29         db  135, 106,  63, 197, 195,  86,  96, 203, 113, 101, 170, 247, 181, 113\r
30         db   80, 250, 108,   7, 255, 237, 129, 226,  79, 107, 112, 166, 103, 241\r
31         db   24, 223, 239, 120, 198,  58,  60,  82, 128,   3, 184,  66, 143, 224\r
32         db  145, 224,  81, 206, 163,  45,  63,  90, 168, 114,  59,  33, 159,  95\r
33         db   28, 139, 123,  98, 125, 196,  15,  70, 194, 253,  54,  14, 109, 226\r
34         db   71,  17, 161,  93, 186,  87, 244, 138,  20,  52, 123, 251,  26,  36\r
35         db   17,  46,  52, 231, 232,  76,  31, 221,  84,  37, 216, 165, 212, 106\r
36         db  197, 242,  98,  43,  39, 175, 254, 145, 190,  84, 118, 222, 187, 136\r
37         db  120, 163, 236, 249\r
38 \r
39 PUBLIC  rndtable\r
40 \r
41         CODESEG\r
42 \r
43 LastRnd         dw      ?\r
44 \r
45 ;=================================================\r
46 ;\r
47 ; void US_InitRndT (boolean randomize)\r
48 ; Init table based RND generator\r
49 ; if randomize is false, the counter is set to 0\r
50 ;\r
51 ;=================================================\r
52 \r
53 PROC    US_InitRndT randomize:word\r
54         uses    si,di\r
55         public  US_InitRndT\r
56 \r
57         mov     ax,SEG rndtable\r
58         mov     es,ax\r
59 \r
60         mov     ax,[randomize]\r
61         or      ax,ax\r
62         jne     @@timeit                ;if randomize is true, really random\r
63 \r
64         mov     dx,0                    ;set to a definite value\r
65         jmp     @@setit\r
66 \r
67 @@timeit:\r
68         mov     ah,2ch\r
69         int     21h                     ;GetSystemTime\r
70         and     dx,0ffh\r
71 \r
72 @@setit:\r
73         mov     [es:rndindex],dx\r
74         ret\r
75 \r
76 ENDP\r
77 \r
78 ;=================================================\r
79 ;\r
80 ; int US_RndT (void)\r
81 ; Return a random # between 0-255\r
82 ; Exit : AX = value\r
83 ;\r
84 ;=================================================\r
85 PROC    US_RndT\r
86         public  US_RndT\r
87 \r
88         mov     ax,SEG rndtable\r
89         mov     es,ax\r
90         mov     bx,[es:rndindex]\r
91         inc     bx\r
92         and     bx,0ffh\r
93         mov     [es:rndindex],bx\r
94         mov     al,[es:rndtable+BX]\r
95         xor     ah,ah\r
96         ret\r
97 \r
98 ENDP\r
99 \r
100 END\r
101 \r