psp fixes, gamma
[libpicofe.git] / psp / asm_utils.s
1 # vim:filetype=mips
2
3 # some asm utils
4 # (c) Copyright 2007, Grazvydas "notaz" Ignotas
5 # All Rights Reserved
6
7 .set noreorder
8 .set noat
9
10 .data
11 .align 4
12
13 .byte  0,  1,  6, 11, 16, 21, 26, 31 # -4
14 .byte  0,  2,  7, 12, 16, 21, 26, 31 # -3
15 .byte  0,  3,  7, 12, 17, 22, 26, 31 # -2
16 .byte  0,  4,  8, 13, 17, 22, 26, 31 # -1
17 gmtab:
18 .byte  0,  5, 10, 15, 16, 21, 26, 31 #  0
19 .byte  0,  6, 10, 15, 19, 23, 27, 31
20 .byte  0,  7, 11, 15, 19, 23, 27, 31
21 .byte  0,  8, 12, 16, 19, 23, 27, 31
22 .byte  0,  9, 12, 16, 20, 24, 27, 31
23 .byte  0, 10, 13, 17, 20, 24, 27, 31
24 .byte  0, 10, 14, 17, 21, 24, 28, 31
25 .byte  0, 11, 15, 18, 21, 24, 28, 31
26 .byte  0, 12, 15, 18, 22, 25, 28, 31
27 .byte  0, 13, 16, 19, 22, 25, 28, 31
28 .byte  0, 14, 17, 20, 22, 25, 28, 31 # 10
29 .byte  0, 15, 17, 20, 23, 26, 28, 31
30 .byte  0, 16, 18, 21, 23, 26, 28, 31
31 .byte  0, 16, 19, 21, 24, 26, 29, 31
32 .byte  0, 17, 20, 22, 24, 26, 29, 31
33 .byte  0, 18, 20, 22, 25, 27, 29, 31
34 .byte  0, 19, 21, 23, 25, 27, 29, 31 # 16
35
36 .text
37 .align 4
38
39 # bbbb bggg gggr rrrr
40
41 .global do_pal_convert # dest, src, gammaa_val
42
43 do_pal_convert:
44     bnez    $a2, dpc_gma
45     li      $t0, 64/2
46     lui     $t2, 0x00e
47     ori     $t2, 0x00e
48     lui     $t3, 0x006
49     ori     $t3, 0x006
50     lui     $t4, 0x0e0
51     ori     $t4, 0x0e0
52     lui     $t6, 0xe00
53     ori     $t6, 0xe00
54     lui     $t7, 0x600
55     ori     $t7, 0x600
56
57 dpc_loop:
58     lw      $v0, 0($a1)
59     addiu   $a1, 4
60     and     $v1, $v0, $t2   # r
61     sll     $v1, 1
62     and     $t9, $v0, $t3
63     srl     $t9, 1
64     or      $v1, $t9        # r
65     and     $t9, $v0, $t4   # g
66     sll     $t8, $t9, 3
67     or      $v1, $t8
68     or      $v1, $t9        # g
69     and     $t9, $v0, $t6   # b
70     sll     $t9, 4
71     or      $v1, $t9
72     and     $t9, $v0, $t7
73     sll     $t9, 2
74     or      $v1, $t9        # b
75     sw      $v1, 0($a0)
76     addiu   $t0, -1
77     bnez    $t0, dpc_loop
78     addiu   $a0, 4
79
80     jr      $ra
81     nop
82
83 dpc_gma:
84     sll     $a2, 3
85     lui     $t1, %hi(gmtab)
86     addiu   $t1, %lo(gmtab)
87     addu    $a2, $t1
88
89 dpc_gma_loop:
90     lw      $v0, 0($a1)
91     addiu   $a1, 4
92     ext     $v1, $v0, 1, 3
93     addu    $v1, $a2
94     lb      $v1, 0($v1)
95     ext     $t1, $v0, 5, 3
96     addu    $t1, $a2
97     lb      $t1, 0($t1)
98     ext     $t2, $v0, 9, 3
99     addu    $t2, $a2
100     lb      $t2, 0($t2)
101     ext     $t3, $v0, 17, 3
102     addu    $t3, $a2
103     lb      $t3, 0($t3)
104     ext     $t4, $v0, 21, 3
105     addu    $t4, $a2
106     lb      $t4, 0($t4)
107     ext     $t5, $v0, 25, 3
108     addu    $t5, $a2
109     lb      $t5, 0($t5)
110     ins     $v1, $t1,  6, 5
111     ins     $v1, $t2, 11, 5
112     ins     $v1, $t3, 16, 5
113     ins     $v1, $t4, 22, 5
114     ins     $v1, $t5, 27, 5
115     sw      $v1, 0($a0)
116     addiu   $t0, -1
117     bnez    $t0, dpc_gma_loop
118     addiu   $a0, 4
119
120     jr      $ra
121     nop
122