# move iconv's headers and libs out of the main developer directory, so that it isn...
[AROS-Contrib.git] / Games / Doom / amiga_fixed.s
blob5a4b82d6a8dff3e8b8a7ebde8a537b20fa34fd4a
2 .extern SetFPMode
3 .extern FixedMul
4 .extern FixedDiv
6 # set rounding mode to "truncate towards minus infinity"
7 # otherwise demos get out of step and play wrong
9 SetFPMode: mtfsb1 30
10 mtfsb1 31
11 blr
13 # fixed_t FixedMul (fixed_t a, fixed_t b)
15 FixedMul: mullw r5,r3,r4
16 mulhw r6,r3,r4
17 rlwinm r3,r5,16,16,31
18 rlwimi r3,r6,16,0,15
19 blr
21 # fixed_t FixedDiv (fixed_t a, fixed_t b)
23 FixedDiv: cmpwi r4,0
24 beq over
26 subi r1,r1,8 # make space on stack for FP
28 # convert a to double
30 cmpwi r3,0
31 lis r5,0x4330
32 li r6,0
33 bge cont1
34 neg r3,r3
35 cont1: stw r3,4(r1)
36 stw r5,0(r1)
37 lfd f0,0(r1)
38 stw r6,4(r1)
39 lfd f1,0(r1)
40 fsub f0,f0,f1
41 bge conv2
42 fneg f0,f0
44 # convert b to double
46 conv2: cmpwi r4,0
47 bge cont2
48 neg r4,r4
49 cont2: stw r4,4(r1)
50 lfd f1,0(r1)
51 stw r6,4(r1)
52 lfd f2,0(r1)
53 fsub f1,f1,f2
54 bge ldcons
55 fneg f1,f1
57 # load 1/65536
59 ldcons: lis r5,0x40F0
60 stw r5,0(r1)
61 stw r6,4(r1)
62 lfd f2,0(r1)
64 # do fixed pt division
66 fdiv f0,f0,f1
67 fmul f0,f0,f2
69 fctiw f0,f0
70 stfd f0,(r1)
71 lwz r3,4(r1)
73 addi r1,r1,8
74 blr
76 # divide by 0, overflow
78 over: cmpwi r3,0
79 lis r3,-0x8000
80 blt return
81 not r3,r3
82 return: blr