Home | History | Annotate | Download | only in hermes
      1 ;
      2 ; x86 format converters for HERMES
      3 ; Copyright (c) 1998 Glenn Fielder (gaffer (a] gaffer.org)
      4 ; This source code is licensed under the GNU LGPL
      5 ; 
      6 ; Please refer to the file COPYING.LIB contained in the distribution for
      7 ; licensing conditions		
      8 ; 
      9 ; Routines adjusted for Hermes by Christian Nentwich (brn (a] eleet.mcb.at)
     10 ; Used with permission.
     11 ; 
     12 
     13 BITS 32
     14 
     15 %include "common.inc"
     16 
     17 SDL_FUNC _ConvertX86p16_16BGR565
     18 SDL_FUNC _ConvertX86p16_16RGB555
     19 SDL_FUNC _ConvertX86p16_16BGR555
     20 SDL_FUNC _ConvertX86p16_8RGB332
     21 
     22 EXTERN _ConvertX86
     23 
     24 SECTION .text
     25 
     26 _ConvertX86p16_16BGR565:
     27 
     28     ; check short
     29     cmp ecx,BYTE 16
     30     ja .L3
     31 
     32 
     33 .L1 ; short loop
     34     mov al,[esi]
     35     mov ah,[esi+1]
     36     mov ebx,eax
     37     mov edx,eax
     38     shr eax,11
     39     and eax,BYTE 11111b
     40     and ebx,11111100000b
     41     shl edx,11
     42     add eax,ebx
     43     add eax,edx
     44     mov [edi],al
     45     mov [edi+1],ah
     46     add esi,BYTE 2
     47     add edi,BYTE 2
     48     dec ecx
     49     jnz .L1
     50 .L2
     51     retn
     52 
     53 .L3 ; head
     54     mov eax,edi
     55     and eax,BYTE 11b
     56     jz .L4
     57     mov al,[esi]
     58     mov ah,[esi+1]
     59     mov ebx,eax
     60     mov edx,eax
     61     shr eax,11
     62     and eax,BYTE 11111b
     63     and ebx,11111100000b
     64     shl edx,11
     65     add eax,ebx
     66     add eax,edx
     67     mov [edi],al
     68     mov [edi+1],ah
     69     add esi,BYTE 2
     70     add edi,BYTE 2
     71     dec ecx
     72 
     73 .L4 ; save count
     74     push ecx
     75 
     76     ; unroll twice
     77     shr ecx,1
     78     
     79     ; point arrays to end
     80     lea esi,[esi+ecx*4]
     81     lea edi,[edi+ecx*4]
     82 
     83     ; negative counter 
     84     neg ecx
     85     jmp SHORT .L6
     86                               
     87 .L5     mov [edi+ecx*4-4],eax
     88 .L6     mov eax,[esi+ecx*4]
     89 
     90         mov ebx,[esi+ecx*4]
     91         and eax,07E007E0h         
     92 
     93         mov edx,[esi+ecx*4]
     94         and ebx,0F800F800h
     95 
     96         shr ebx,11
     97         and edx,001F001Fh
     98 
     99         shl edx,11
    100         add eax,ebx
    101 
    102         add eax,edx                 
    103         inc ecx
    104 
    105         jnz .L5                 
    106          
    107     mov [edi+ecx*4-4],eax
    108 
    109     ; tail
    110     pop ecx
    111     and ecx,BYTE 1
    112     jz .L7
    113     mov al,[esi]
    114     mov ah,[esi+1]
    115     mov ebx,eax
    116     mov edx,eax
    117     shr eax,11
    118     and eax,BYTE 11111b
    119     and ebx,11111100000b
    120     shl edx,11
    121     add eax,ebx
    122     add eax,edx
    123     mov [edi],al
    124     mov [edi+1],ah
    125     add esi,BYTE 2
    126     add edi,BYTE 2
    127 
    128 .L7
    129     retn
    130 
    131 
    132 
    133 
    134 
    135 
    136 _ConvertX86p16_16RGB555:
    137 
    138     ; check short
    139     cmp ecx,BYTE 32
    140     ja .L3
    141 
    142 
    143 .L1 ; short loop
    144     mov al,[esi]
    145     mov ah,[esi+1]
    146     mov ebx,eax
    147     shr ebx,1
    148     and ebx,     0111111111100000b
    149     and eax,BYTE 0000000000011111b
    150     add eax,ebx
    151     mov [edi],al
    152     mov [edi+1],ah
    153     add esi,BYTE 2
    154     add edi,BYTE 2
    155     dec ecx
    156     jnz .L1
    157 .L2
    158     retn
    159 
    160 .L3 ; head
    161     mov eax,edi
    162     and eax,BYTE 11b
    163     jz .L4
    164     mov al,[esi]
    165     mov ah,[esi+1]
    166     mov ebx,eax
    167     shr ebx,1
    168     and ebx,     0111111111100000b
    169     and eax,BYTE 0000000000011111b
    170     add eax,ebx
    171     mov [edi],al
    172     mov [edi+1],ah
    173     add esi,BYTE 2
    174     add edi,BYTE 2
    175     dec ecx
    176 
    177 .L4 ; save ebp
    178     push ebp
    179 
    180     ; save count
    181     push ecx
    182 
    183     ; unroll four times
    184     shr ecx,2
    185     
    186     ; point arrays to end
    187     lea esi,[esi+ecx*8]
    188     lea edi,[edi+ecx*8]
    189 
    190     ; negative counter 
    191     xor ebp,ebp
    192     sub ebp,ecx
    193 
    194 .L5     mov eax,[esi+ebp*8]        ; agi?
    195         mov ecx,[esi+ebp*8+4]
    196        
    197         mov ebx,eax
    198         mov edx,ecx
    199 
    200         and eax,0FFC0FFC0h
    201         and ecx,0FFC0FFC0h
    202 
    203         shr eax,1
    204         and ebx,001F001Fh
    205 
    206         shr ecx,1
    207         and edx,001F001Fh
    208 
    209         add eax,ebx
    210         add ecx,edx
    211 
    212         mov [edi+ebp*8],eax
    213         mov [edi+ebp*8+4],ecx
    214 
    215         inc ebp
    216         jnz .L5                 
    217 
    218     ; tail
    219     pop ecx
    220 .L6 and ecx,BYTE 11b
    221     jz .L7
    222     mov al,[esi]
    223     mov ah,[esi+1]
    224     mov ebx,eax
    225     shr ebx,1
    226     and ebx,     0111111111100000b
    227     and eax,BYTE 0000000000011111b
    228     add eax,ebx
    229     mov [edi],al
    230     mov [edi+1],ah
    231     add esi,BYTE 2
    232     add edi,BYTE 2
    233     dec ecx
    234     jmp SHORT .L6
    235 
    236 .L7 pop ebp
    237     retn
    238 
    239 
    240 
    241 
    242 
    243 
    244 _ConvertX86p16_16BGR555:
    245 
    246     ; check short
    247     cmp ecx,BYTE 16
    248     ja .L3
    249 
    250 	
    251 .L1 ; short loop
    252     mov al,[esi]
    253     mov ah,[esi+1]
    254     mov ebx,eax
    255     mov edx,eax
    256     shr eax,11
    257     and eax,BYTE 11111b
    258     shr ebx,1
    259     and ebx,1111100000b
    260     shl edx,10
    261     and edx,0111110000000000b
    262     add eax,ebx
    263     add eax,edx
    264     mov [edi],al
    265     mov [edi+1],ah
    266     add esi,BYTE 2
    267     add edi,BYTE 2
    268     dec ecx
    269     jnz .L1
    270 .L2
    271     retn
    272 
    273 .L3 ; head
    274     mov eax,edi
    275     and eax,BYTE 11b
    276     jz .L4
    277     mov al,[esi]
    278     mov ah,[esi+1]
    279     mov ebx,eax
    280     mov edx,eax
    281     shr eax,11
    282     and eax,BYTE 11111b
    283     shr ebx,1
    284     and ebx,1111100000b
    285     shl edx,10
    286     and edx,0111110000000000b
    287     add eax,ebx
    288     add eax,edx
    289     mov [edi],al
    290     mov [edi+1],ah
    291     add esi,BYTE 2
    292     add edi,BYTE 2
    293     dec ecx
    294 
    295 .L4 ; save count
    296     push ecx
    297 
    298     ; unroll twice
    299     shr ecx,1
    300     
    301     ; point arrays to end
    302     lea esi,[esi+ecx*4]
    303     lea edi,[edi+ecx*4]
    304 
    305     ; negative counter 
    306     neg ecx
    307     jmp SHORT .L6
    308                               
    309 .L5     mov [edi+ecx*4-4],eax
    310 .L6     mov eax,[esi+ecx*4]
    311 
    312         shr eax,1
    313         mov ebx,[esi+ecx*4]
    314         
    315         and eax,03E003E0h         
    316         mov edx,[esi+ecx*4]
    317 
    318         and ebx,0F800F800h
    319 
    320         shr ebx,11
    321         and edx,001F001Fh
    322 
    323         shl edx,10
    324         add eax,ebx
    325 
    326         add eax,edx                 
    327         inc ecx
    328 
    329         jnz .L5                 
    330          
    331     mov [edi+ecx*4-4],eax
    332 
    333     ; tail
    334     pop ecx
    335     and ecx,BYTE 1
    336     jz .L7
    337     mov al,[esi]
    338     mov ah,[esi+1]
    339     mov ebx,eax
    340     mov edx,eax
    341     shr eax,11
    342     and eax,BYTE 11111b
    343     shr ebx,1
    344     and ebx,1111100000b
    345     shl edx,10
    346     and edx,0111110000000000b
    347     add eax,ebx
    348     add eax,edx
    349     mov [edi],al
    350     mov [edi+1],ah
    351     add esi,BYTE 2
    352     add edi,BYTE 2
    353 
    354 .L7
    355     retn
    356 
    357 
    358 
    359 
    360 
    361 
    362 _ConvertX86p16_8RGB332:
    363 
    364     ; check short
    365     cmp ecx,BYTE 16
    366     ja .L3
    367 
    368 
    369 .L1 ; short loop
    370     mov al,[esi+0]
    371     mov ah,[esi+1]
    372     mov ebx,eax
    373     mov edx,eax
    374     and eax,BYTE 11000b         ; blue
    375     shr eax,3
    376     and ebx,11100000000b        ; green
    377     shr ebx,6
    378     and edx,1110000000000000b   ; red
    379     shr edx,8
    380     add eax,ebx
    381     add eax,edx
    382     mov [edi],al
    383     add esi,BYTE 2
    384     inc edi
    385     dec ecx
    386     jnz .L1
    387 .L2
    388     retn
    389 
    390 .L3 mov eax,edi
    391     and eax,BYTE 11b
    392     jz .L4
    393     mov al,[esi+0]
    394     mov ah,[esi+1]
    395     mov ebx,eax
    396     mov edx,eax
    397     and eax,BYTE 11000b         ; blue
    398     shr eax,3
    399     and ebx,11100000000b        ; green
    400     shr ebx,6
    401     and edx,1110000000000000b   ; red
    402     shr edx,8
    403     add eax,ebx
    404     add eax,edx
    405     mov [edi],al
    406     add esi,BYTE 2
    407     inc edi
    408     dec ecx
    409     jmp SHORT .L3
    410 
    411 .L4 ; save ebp
    412     push ebp
    413 
    414     ; save count
    415     push ecx
    416 
    417     ; unroll 4 times
    418     shr ecx,2
    419 
    420     ; prestep
    421     mov dl,[esi+0]
    422     mov bl,[esi+1]
    423     mov dh,[esi+2]
    424         
    425 .L5     shl edx,16
    426         mov bh,[esi+3]
    427         
    428         shl ebx,16
    429         mov dl,[esi+4]
    430 
    431         mov dh,[esi+6]
    432         mov bl,[esi+5]
    433 
    434         and edx,00011000000110000001100000011000b
    435         mov bh,[esi+7]
    436 
    437         ror edx,16+3
    438         mov eax,ebx                                     ; setup eax for reds
    439 
    440         and ebx,00000111000001110000011100000111b
    441         and eax,11100000111000001110000011100000b       ; reds
    442 
    443         ror ebx,16-2
    444         add esi,BYTE 8
    445 
    446         ror eax,16
    447         add edi,BYTE 4
    448 
    449         add eax,ebx
    450         mov bl,[esi+1]                                  ; greens
    451 
    452         add eax,edx
    453         mov dl,[esi+0]                                  ; blues
    454 
    455         mov [edi-4],eax
    456         mov dh,[esi+2]
    457 
    458         dec ecx
    459         jnz .L5                 
    460     
    461     ; check tail
    462     pop ecx
    463     and ecx,BYTE 11b
    464     jz .L7
    465 
    466 .L6 ; tail
    467     mov al,[esi+0]
    468     mov ah,[esi+1]
    469     mov ebx,eax
    470     mov edx,eax
    471     and eax,BYTE 11000b         ; blue
    472     shr eax,3
    473     and ebx,11100000000b        ; green
    474     shr ebx,6
    475     and edx,1110000000000000b   ; red
    476     shr edx,8
    477     add eax,ebx
    478     add eax,edx
    479     mov [edi],al
    480     add esi,BYTE 2
    481     inc edi
    482     dec ecx
    483     jnz .L6
    484 
    485 .L7 pop ebp
    486     retn
    487 
    488 %ifidn __OUTPUT_FORMAT__,elf
    489 section .note.GNU-stack noalloc noexec nowrite progbits
    490 %endif
    491