0
+ − 1 ;
+ − 2 ; x86 format converters for HERMES
+ − 3 ; Some routines Copyright (c) 1998 Christian Nentwich (brn@eleet.mcb.at)
+ − 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 ; Most routines are (c) Glenn Fiedler (ptc@gaffer.org), used with permission
+ − 10 ;
+ − 11
+ − 12 BITS 32
+ − 13
+ − 14 GLOBAL _ConvertX86
+ − 15 GLOBAL _x86return
+ − 16
+ − 17 GLOBAL _Hermes_X86_CPU
+ − 18
+ − 19
+ − 20 SECTION .data
+ − 21
+ − 22 cpu_flags dd 0
+ − 23
+ − 24
+ − 25 SECTION .text
+ − 26
+ − 27 ;; _ConvertX86:
+ − 28 ;; [ESP+8] ConverterInfo*
+ − 29 ;; --------------------------------------------------------------------------
+ − 30 ;; ConverterInfo (ebp+..)
+ − 31 ;; 0: void *s_pixels
+ − 32 ;; 4: int s_width
+ − 33 ;; 8: int s_height
+ − 34 ;; 12: int s_add
+ − 35 ;; 16: void *d_pixels
+ − 36 ;; 20: int d_width
+ − 37 ;; 24: int d_height
+ − 38 ;; 28: int d_add
+ − 39 ;; 32: void (*converter_function)()
+ − 40 ;; 36: int32 *lookup
+ − 41
+ − 42 _ConvertX86:
+ − 43 push ebp
+ − 44 mov ebp,esp
+ − 45
+ − 46 ; Save the registers used by the blitters, necessary for optimized code
+ − 47 pusha
+ − 48
+ − 49 mov eax,[ebp+8]
+ − 50
+ − 51 cmp dword [eax+4],BYTE 0
+ − 52 je endconvert
+ − 53
+ − 54 mov ebp,eax
+ − 55
+ − 56 mov esi,[ebp+0]
+ − 57 mov edi,[ebp+16]
+ − 58
+ − 59 y_loop:
+ − 60 mov ecx,[ebp+4]
+ − 61
+ − 62 jmp [ebp+32]
+ − 63
+ − 64 _x86return:
+ − 65 add esi,[ebp+12]
+ − 66 add edi,[ebp+28]
+ − 67
+ − 68 dec dword [ebp+8]
+ − 69 jnz y_loop
+ − 70
+ − 71 ; Restore the registers used by the blitters, necessary for optimized code
+ − 72 popa
+ − 73
+ − 74 pop ebp
+ − 75
+ − 76 endconvert:
+ − 77 ret
+ − 78
+ − 79
+ − 80
+ − 81 ;; Hermes_X86_CPU returns the CPUID flags in eax
+ − 82
+ − 83 _Hermes_X86_CPU:
+ − 84 pushfd
+ − 85 pop eax
+ − 86
+ − 87 mov ecx,eax
+ − 88
+ − 89 xor eax,040000h
+ − 90 push eax
+ − 91
+ − 92 popfd
+ − 93 pushfd
+ − 94
+ − 95 pop eax
+ − 96 xor eax,ecx
+ − 97 jz .L1 ; Processor is 386
+ − 98
+ − 99 push ecx
+ − 100 popfd
+ − 101
+ − 102 mov eax,ecx
+ − 103 xor eax,200000h
+ − 104
+ − 105 push eax
+ − 106 popfd
+ − 107 pushfd
+ − 108
+ − 109 pop eax
+ − 110 xor eax,ecx
+ − 111 je .L1
+ − 112
+ − 113 pusha
+ − 114
+ − 115 mov eax,1
+ − 116 cpuid
+ − 117
+ − 118 mov [cpu_flags],edx
+ − 119
+ − 120 popa
+ − 121
+ − 122 mov eax,[cpu_flags]
+ − 123
+ − 124 .L1:
+ − 125 ret