asm_utils.s 3.1 KB

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