diff src/hermes/x86_main.asm @ 0:74212992fb08

Initial revision
author Sam Lantinga <slouken@lokigames.com>
date Thu, 26 Apr 2001 16:45:43 +0000
parents
children da33b7e6d181
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/hermes/x86_main.asm	Thu Apr 26 16:45:43 2001 +0000
@@ -0,0 +1,125 @@
+;
+; x86 format converters for HERMES
+; Some routines Copyright (c) 1998 Christian Nentwich (brn@eleet.mcb.at)
+; This source code is licensed under the GNU LGPL
+; 
+; Please refer to the file COPYING.LIB contained in the distribution for
+; licensing conditions		
+;
+; Most routines are (c) Glenn Fiedler (ptc@gaffer.org), used with permission
+; 
+
+BITS 32
+
+GLOBAL _ConvertX86
+GLOBAL _x86return
+	
+GLOBAL _Hermes_X86_CPU
+
+
+SECTION .data
+	
+cpu_flags dd 0
+	
+		
+SECTION .text
+		
+;; _ConvertX86:	 
+;; [ESP+8] ConverterInfo*
+;; --------------------------------------------------------------------------
+;; ConverterInfo (ebp+..)
+;;   0:	void *s_pixels
+;;   4:	int s_width
+;;   8:	int s_height
+;;  12:	int s_add
+;;  16:	void *d_pixels
+;;  20:	int d_width
+;;  24:	int d_height
+;;  28:	int d_add
+;;  32:	void (*converter_function)() 
+;;  36: int32 *lookup
+	
+_ConvertX86:
+	push ebp
+	mov ebp,esp
+
+; Save the registers used by the blitters, necessary for optimized code
+	pusha
+
+	mov eax,[ebp+8]
+
+        cmp dword [eax+4],BYTE 0
+	je endconvert
+	
+	mov ebp,eax
+	
+	mov esi,[ebp+0]
+	mov edi,[ebp+16]
+	
+y_loop:	
+	mov ecx,[ebp+4]
+
+	jmp [ebp+32]
+
+_x86return:	
+	add esi,[ebp+12]
+	add edi,[ebp+28]
+	
+	dec dword  [ebp+8]
+	jnz y_loop
+
+; Restore the registers used by the blitters, necessary for optimized code
+	popa
+	
+	pop ebp
+
+endconvert:	
+	ret		
+
+
+
+;; Hermes_X86_CPU returns the CPUID flags in eax
+	
+_Hermes_X86_CPU:
+	pushfd
+	pop eax
+	
+	mov ecx,eax
+	
+	xor eax,040000h
+	push eax
+	
+	popfd
+	pushfd
+
+	pop eax
+	xor eax,ecx
+	jz .L1			; Processor is 386
+
+	push ecx
+	popfd
+
+	mov eax,ecx
+	xor eax,200000h
+
+	push eax
+	popfd
+	pushfd
+
+	pop eax
+	xor eax,ecx
+	je .L1
+	
+	pusha
+	
+	mov eax,1
+	cpuid
+
+	mov [cpu_flags],edx
+
+	popa
+
+	mov eax,[cpu_flags]
+
+.L1:	
+	ret