~ubuntu-branches/ubuntu/lucid/libsdl1.2/lucid-proposed

« back to all changes in this revision

Viewing changes to src/hermes/x86p_16.asm

  • Committer: Bazaar Package Importer
  • Author(s): Matthew Danish
  • Date: 2004-06-11 22:30:47 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20040611223047-smb1s91z497k92o5
Tags: 1.2.7-7
* Updates from CVS:
  - joystick ioctl error checking, and "logical joystick" enhancement.
  - Don't crash if SoftStretch used on hardware surface.
  - Fix DirectFB crash on exit.
  - Free X11 mouse cursor pixmaps properly in FreeWMCursor.
  - Fix for gcc-3.4.0 / PIC; and cpuinfo detects more extensions now.
  - Don't allow video modes larger than maximum size.
  - Properly set error when OpenGL init fails.
* De-multilined Build-Depends and Uploaders field.
* Converted changelog to UTF-8.

Show diffs side-by-side

added added

removed removed

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