initial commit
[megadrive_tetris] / src / util.s
1 | ------------------------------------------------------------------------
2 |  Utilities
3 | ------------------------------------------------------------------------
4
5         .include "macros.inc"
6
7 |  Random number generator
8 | ------------------------------------------------------------------------
9
10 | Seed random number generator, using a 32 bit seed stored in d0 (s0s1s2s3 high
11 | to low bytes) This needn't be a pseudoroutine, but just for symmetry with the
12 | following routine, we'll make it one
13         .text
14 rng_seed:
15         move.b %d0, %d4
16         lsr.l #8, %d0
17         move.b %d0, %d5
18         lsr.l #8, %d0
19         move.b %d0, %d6
20         lsr.l #8, %d0
21         move.b %d0, %d7
22         pseudo_ret
23
24 | Reverse of seed: it will collect the seed from registers d4-d7 to d0  
25 rng_unseed:
26         move.b  %d7, %d0
27         lsl.l   #8, %d0
28         move.b  %d6, %d0
29         lsl.l   #8, %d0
30         move.b  %d5, %d0
31         lsl.l   #8, %d0
32         move.b  %d4, %d0
33         lsl.l   #8, %d0
34         pseudo_ret
35         
36 | Calculate next random number, it will be stored in the low byte of d7
37 rng_calc_next:
38         add.l #1, %d4
39         eor.b %d7, %d5
40         eor.b %d4, %d5
41         add.b %d5, %d6
42         
43         lsl.w #8, %d4   | Hack  - shift d4 to the left, so we can use its 8 LSB for storing the intermediate value
44         move.b %d6, %d4 |               - Tmp store d6
45         lsr.b #1, %d4   |               - This will produce d6>>1 in the LSB
46         
47         add.b %d4, %d7  | Yup! I remebered it!
48         
49         lsr.w #8, %d4   | Hack  - Revert d4 to what it was before
50         
51         eor.b %d5, %d7
52         pseudo_ret
53
54 | Function exposed to C - 1 longword argument
55         .global rng_next
56 rng_next:
57         link %fp, #0
58         movem %d2-%d7/%a2-%a5, -(%sp)
59         move.l  8(%fp), %d0
60         pseudo_call rng_seed
61         pseudo_call rng_calc_next
62         pseudo_call rng_unseed
63         movem (%sp)+, %d2-%d7/%a2-%a5
64         unlk %fp
65         rts
66