psp fixes, gamma
[libpicofe.git] / psp / asm_utils.s
diff --git a/psp/asm_utils.s b/psp/asm_utils.s
new file mode 100644 (file)
index 0000000..11e3a17
--- /dev/null
@@ -0,0 +1,122 @@
+# vim:filetype=mips
+
+# some asm utils
+# (c) Copyright 2007, Grazvydas "notaz" Ignotas
+# All Rights Reserved
+
+.set noreorder
+.set noat
+
+.data
+.align 4
+
+.byte  0,  1,  6, 11, 16, 21, 26, 31 # -4
+.byte  0,  2,  7, 12, 16, 21, 26, 31 # -3
+.byte  0,  3,  7, 12, 17, 22, 26, 31 # -2
+.byte  0,  4,  8, 13, 17, 22, 26, 31 # -1
+gmtab:
+.byte  0,  5, 10, 15, 16, 21, 26, 31 #  0
+.byte  0,  6, 10, 15, 19, 23, 27, 31
+.byte  0,  7, 11, 15, 19, 23, 27, 31
+.byte  0,  8, 12, 16, 19, 23, 27, 31
+.byte  0,  9, 12, 16, 20, 24, 27, 31
+.byte  0, 10, 13, 17, 20, 24, 27, 31
+.byte  0, 10, 14, 17, 21, 24, 28, 31
+.byte  0, 11, 15, 18, 21, 24, 28, 31
+.byte  0, 12, 15, 18, 22, 25, 28, 31
+.byte  0, 13, 16, 19, 22, 25, 28, 31
+.byte  0, 14, 17, 20, 22, 25, 28, 31 # 10
+.byte  0, 15, 17, 20, 23, 26, 28, 31
+.byte  0, 16, 18, 21, 23, 26, 28, 31
+.byte  0, 16, 19, 21, 24, 26, 29, 31
+.byte  0, 17, 20, 22, 24, 26, 29, 31
+.byte  0, 18, 20, 22, 25, 27, 29, 31
+.byte  0, 19, 21, 23, 25, 27, 29, 31 # 16
+
+.text
+.align 4
+
+# bbbb bggg gggr rrrr
+
+.global do_pal_convert # dest, src, gammaa_val
+
+do_pal_convert:
+    bnez    $a2, dpc_gma
+    li      $t0, 64/2
+    lui     $t2, 0x00e
+    ori     $t2, 0x00e
+    lui     $t3, 0x006
+    ori     $t3, 0x006
+    lui     $t4, 0x0e0
+    ori     $t4, 0x0e0
+    lui     $t6, 0xe00
+    ori     $t6, 0xe00
+    lui     $t7, 0x600
+    ori     $t7, 0x600
+
+dpc_loop:
+    lw      $v0, 0($a1)
+    addiu   $a1, 4
+    and     $v1, $v0, $t2   # r
+    sll     $v1, 1
+    and     $t9, $v0, $t3
+    srl     $t9, 1
+    or      $v1, $t9        # r
+    and     $t9, $v0, $t4   # g
+    sll     $t8, $t9, 3
+    or      $v1, $t8
+    or      $v1, $t9        # g
+    and     $t9, $v0, $t6   # b
+    sll     $t9, 4
+    or      $v1, $t9
+    and     $t9, $v0, $t7
+    sll     $t9, 2
+    or      $v1, $t9        # b
+    sw      $v1, 0($a0)
+    addiu   $t0, -1
+    bnez    $t0, dpc_loop
+    addiu   $a0, 4
+
+    jr      $ra
+    nop
+
+dpc_gma:
+    sll     $a2, 3
+    lui     $t1, %hi(gmtab)
+    addiu   $t1, %lo(gmtab)
+    addu    $a2, $t1
+
+dpc_gma_loop:
+    lw      $v0, 0($a1)
+    addiu   $a1, 4
+    ext     $v1, $v0, 1, 3
+    addu    $v1, $a2
+    lb      $v1, 0($v1)
+    ext     $t1, $v0, 5, 3
+    addu    $t1, $a2
+    lb      $t1, 0($t1)
+    ext     $t2, $v0, 9, 3
+    addu    $t2, $a2
+    lb      $t2, 0($t2)
+    ext     $t3, $v0, 17, 3
+    addu    $t3, $a2
+    lb      $t3, 0($t3)
+    ext     $t4, $v0, 21, 3
+    addu    $t4, $a2
+    lb      $t4, 0($t4)
+    ext     $t5, $v0, 25, 3
+    addu    $t5, $a2
+    lb      $t5, 0($t5)
+    ins     $v1, $t1,  6, 5
+    ins     $v1, $t2, 11, 5
+    ins     $v1, $t3, 16, 5
+    ins     $v1, $t4, 22, 5
+    ins     $v1, $t5, 27, 5
+    sw      $v1, 0($a0)
+    addiu   $t0, -1
+    bnez    $t0, dpc_gma_loop
+    addiu   $a0, 4
+
+    jr      $ra
+    nop
+