.ALIGN
@	.ARM

	.GLOBAL cpu_speed
	.GLOBAL mmu_change
	.GLOBAL gp_enableIRQ
	.GLOBAL gp_disableIRQ
	.GLOBAL gp_installSWIIRQ
	.GLOBAL gp_removeSWIIRQ

cpu_speed:
	stmdb	r13!, {r0-r12,lr}
	stmdb	sp!, {r0, r1, r2}
	mov		r0, sp
	swi		#0x0d
	add		sp, sp, #12
	ldmia	r13!, {r0-r12,lr}
	bx		lr
	nop

mmu_change:
	stmdb   r13!, {r0-r12,lr}
	swi     #0x02
	ldmia   r13!, {r0-r12,lr}
	bx      lr
	nop

gp_enableIRQ:
	stmdb   r13!, {r0,lr}
	mrs     r0, CPSR
	bic     r0, r0, #0x80
	msr     CPSR, r0
	ldmia   r13!, {r0,pc}
	bx      lr

gp_disableIRQ:
	stmdb   r13!, {r0,lr}
	MRS     r0, CPSR
	ORR     r0, r0, #0xc0
	MSR     CPSR, r0
	ldmia   r13!, {r0,pc}
	bx      lr

gp_installSWIIRQ:
	stmdb   r13!, {r14}
	swi     0x9
	ldmia   r13!, {pc}
	bx      lr

gp_removeSWIIRQ:
	stmdb   r13!, {r14}
	swi     0xa
	ldmia   r13!, {pc}
	bx      lr


@ ******** ASMFastSolidBlit(unsigned char *src4, unsigned char *dst4, int nbx, int nby, int height2, int trans, int coul) ********

	.ALIGN
	.GLOBAL ASMFastSolidBlit
	.TYPE   ASMFastSolidBlit, function
	.CODE 32

@r0 = src4
@r1 = dst4
@r2 = nbx
@r3 = nby

@r4 = height2
@r5 = trans
@r6 = coul
@r7 = tmp
@r8 = tmpnby
@r9 = tmp2

_bx7:
	ldrb		r8,[r0,+r3]		@lecture 1er pixel
	subs		r7,r3,#1
	bmi		_sauty2

_sauty2:					@ecriture r8
	TEQ		r8,r5
	STRNEB	r8,[r1,+r7]
	SUB		r0,r0,r4
	SUB		r1,r1,#240
	SUBS		r2,r2,#1
	BPL		_bx7

        ldmfd		r13!,{r4-r8}
	add		sp,sp,#8
	bx		lr

ASMFastSolidBlit:

	sub		sp,sp,#12
        stmfd		r13!,{r4-r9}
        ldr		r4,[r13,#36]
        ldr		r5,[r13,#40]
        ldr		r6,[r13,#44]

_bx8:
	ldrb		r9,[r0,+r3]		@lecture 1er pixel
	subs		r8,r3,#1
	bmi		_sauty2

_by8:
	LDRB		r7,[r0,+r8]
	TEQ		r9,r5
	STRNEB	r6,[r1,+r8]
	SUBS		r8,r8,#1
	BMI		_sauty3b
	LDRB		r9,[r0,+r8]
	TEQ		r7,r5
	STRNEB	r6,[r1,+r8]
	SUBS		r8,r8,#1
	BMI		_sauty3
	LDRB		r7,[r0,+r8]
	TEQ		r9,r5
	STRNEB	r6,[r1,+r8]
	SUBS		r8,r8,#1
	BMI		_sauty3b
	LDRB		r9,[r0,+r8]
	TEQ		r7,r5
	STRNEB	r6,[r1,+r8]
	SUBS		r8,r8,#1
	BMI		_sauty3
	LDRB		r7,[r0,+r8]
	TEQ		r9,r5
	STRNEB	r6,[r1,+r8]
	SUBS		r8,r8,#1
	BMI		_sauty3b
	LDRB		r9,[r0,+r8]
	TEQ		r7,r5
	STRNEB	r6,[r1,+r8]
	SUBS		r8,r8,#1
	BMI		_sauty3
	LDRB		r7,[r0,+r8]
	TEQ		r9,r5
	STRNEB	r6,[r1,+r8]
	SUBS		r8,r8,#1
	BMI		_sauty3b
	LDRB		r9,[r0,+r8]
	TEQ		r7,r5
	STRNEB	r6,[r1,+r8]
	SUBS		r8,r8,#1
	BMI		_sauty3
	LDRB		r7,[r0,+r8]
	TEQ		r9,r5
	STRNEB	r6,[r1,+r8]
	SUBS		r8,r8,#1
	BMI		_sauty3b
	LDRB		r9,[r0,+r8]
	TEQ		r7,r5
	STRNEB	r6,[r1,+r8]
	SUBS		r8,r8,#1
	BMI		_sauty3
	LDRB		r7,[r0,+r8]
	TEQ		r9,r5
	STRNEB	r6,[r1,+r8]
	SUBS		r8,r8,#1
	BMI		_sauty3b
	LDRB		r9,[r0,+r8]
	TEQ		r7,r5
	STRNEB	r6,[r1,+r8]
	SUBS		r8,r8,#1
	BMI		_sauty3
	LDRB		r7,[r0,+r8]
	TEQ		r9,r5
	STRNEB	r6,[r1,+r8]
	SUBS		r8,r8,#1
	BMI		_sauty3b
	LDRB		r9,[r0,+r8]
	TEQ		r7,r5
	STRNEB	r6,[r1,+r8]
	SUBS		r8,r8,#1
	BMI		_sauty3
	LDRB		r7,[r0,+r8]
	TEQ		r9,r5
	STRNEB	r6,[r1,+r8]
	SUBS		r8,r8,#1
	BMI		_sauty3b
	LDRB		r9,[r0,+r8]
	TEQ		r7,r5
	STRNEB	r6,[r1,+r8]
	SUBS		r8,r8,#1

	BPL		_by8

_sauty3:					@ecriture pour r9
	TEQ		r9,r5
	STRNEB	r6,[r1,+r8]
	SUB		r0,r0,r4
	SUB		r1,r1,#240
	SUBS		r2,r2,#1
	BPL		_bx8

        ldmfd		r13!,{r4-r9}
	add		sp,sp,#12
	bx		lr

_sauty3b:					@ecriture pour r7
	TEQ		r7,r5
	STRNEB	r6,[r1,+r8]
	SUB		r0,r0,r4
	SUB		r1,r1,#240
	SUBS		r2,r2,#1
	BPL		_bx8

        ldmfd		r13!,{r4-r9}
	add		sp,sp,#12
	bx		lr


@ ******** ASMSaveBitmap(unsigned char *src4, unsigned char *dst, int nbx, int nby, int height2) ********

	.ALIGN
	.GLOBAL ASMSaveBitmap
	.TYPE   ASMSaveBitmap, function
	.CODE 32

@r0 = src4
@r1 = dst + 1
@r2 = nbx
@r3 = nby

@r7 = height2
@r8 = tmp
@r9 = tmpnby
@r10 = dst4

ASMSaveBitmap:

	sub		sp,sp,#4
        stmfd		r13!,{r7-r10}
        LDR		r7,[r13,#20]

_bx6:
	MLA		r10,r2,r7,r1
	MOV		r9,r3

_by6:
	LDRB		r8,[r0,+r9]
	SUBS		r9,r9,#1
	STRB		r8,[r10,+r9]
	BMI		_fincol6
	LDRB		r8,[r0,+r9]
	SUBS		r9,r9,#1
	STRB		r8,[r10,+r9]
	BMI		_fincol6
	LDRB		r8,[r0,+r9]
	SUBS		r9,r9,#1
	STRB		r8,[r10,+r9]
	BMI		_fincol6
	LDRB		r8,[r0,+r9]
	SUBS		r9,r9,#1
	STRB		r8,[r10,+r9]
	BMI		_fincol6
	LDRB		r8,[r0,+r9]
	SUBS		r9,r9,#1
	STRB		r8,[r10,+r9]
	BMI		_fincol6
	LDRB		r8,[r0,+r9]
	SUBS		r9,r9,#1
	STRB		r8,[r10,+r9]
	BMI		_fincol6
	LDRB		r8,[r0,+r9]
	SUBS		r9,r9,#1
	STRB		r8,[r10,+r9]
	BMI		_fincol6
	LDRB		r8,[r0,+r9]
	SUBS		r9,r9,#1
	STRB		r8,[r10,+r9]
	BMI		_fincol6
	LDRB		r8,[r0,+r9]
	SUBS		r9,r9,#1
	STRB		r8,[r10,+r9]
	BMI		_fincol6
	LDRB		r8,[r0,+r9]
	SUBS		r9,r9,#1
	STRB		r8,[r10,+r9]
	BMI		_fincol6
	LDRB		r8,[r0,+r9]
	SUBS		r9,r9,#1
	STRB		r8,[r10,+r9]
	BMI		_fincol6
	LDRB		r8,[r0,+r9]
	SUBS		r9,r9,#1
	STRB		r8,[r10,+r9]
	BMI		_fincol6
	LDRB		r8,[r0,+r9]
	SUBS		r9,r9,#1
	STRB		r8,[r10,+r9]
	BMI		_fincol6
	LDRB		r8,[r0,+r9]
	SUBS		r9,r9,#1
	STRB		r8,[r10,+r9]
	BMI		_fincol6
	LDRB		r8,[r0,+r9]
	SUBS		r9,r9,#1
	STRB		r8,[r10,+r9]
	BMI		_fincol6
	LDRB		r8,[r0,+r9]
	SUBS		r9,r9,#1
	STRB		r8,[r10,+r9]

	BPL		_by6

_fincol6:
	SUB		r0,r0,#240
	SUBS		r2,r2,#1
	BPL		_bx6

        ldmfd		r13!,{r7-r10}
	add		sp,sp,#4
	bx		lr


	.ALIGN
	.GLOBAL gp_clearFramebuffer
	.TYPE   gp_clearFramebuffer, function
	.CODE 32
gp_clearFramebuffer:
        @ r0 = framebuffer
        @ r1 = color
        orr r1,r1,r1,lsl #16   @hi halfword = lo halfword  
        mov r2,#38400
clear:  str  r1,[r0],#4
        subs r2,r2,#1
        bne clear
        bx lr


@ ******** ASMFastClear(unsigned char *dst4, int nbx, int nby) ********

	.ALIGN
	.GLOBAL ASMFastClear
	.TYPE   ASMFastClear, function
	.CODE 32

@r0 = dst4
@r1 = nbx
@r2 = nby

@r3 = #0
@r4 = tmpnby

@optimis?pour h=20

ASMFastClear:

	str		r4,[sp,#-4]!
	MOV		r3,#0

_bx9:
	MOV		r4,r2

_by9:
	STRB		r3,[r0,+r4]
	SUBS		r4,r4,#1
	BMI		_sauty4
	STRB		r3,[r0,+r4]
	SUBS		r4,r4,#1
	BMI		_sauty4
	STRB		r3,[r0,+r4]
	SUBS		r4,r4,#1
	BMI		_sauty4
	STRB		r3,[r0,+r4]
	SUBS		r4,r4,#1
	BMI		_sauty4
	STRB		r3,[r0,+r4]
	SUBS		r4,r4,#1
	BMI		_sauty4
	STRB		r3,[r0,+r4]
	SUBS		r4,r4,#1
	BMI		_sauty4
	STRB		r3,[r0,+r4]
	SUBS		r4,r4,#1
	BMI		_sauty4
	STRB		r3,[r0,+r4]
	SUBS		r4,r4,#1
	BMI		_sauty4
	STRB		r3,[r0,+r4]
	SUBS		r4,r4,#1
	BMI		_sauty4
	STRB		r3,[r0,+r4]
	SUBS		r4,r4,#1
	BMI		_sauty4
	STRB		r3,[r0,+r4]
	SUBS		r4,r4,#1
	BMI		_sauty4
	STRB		r3,[r0,+r4]
	SUBS		r4,r4,#1
	BMI		_sauty4
	STRB		r3,[r0,+r4]
	SUBS		r4,r4,#1
	BMI		_sauty4
	STRB		r3,[r0,+r4]
	SUBS		r4,r4,#1
	BMI		_sauty4
	STRB		r3,[r0,+r4]
	SUBS		r4,r4,#1
	BMI		_sauty4
	STRB		r3,[r0,+r4]
	SUBS		r4,r4,#1
	BMI		_sauty4
	STRB		r3,[r0,+r4]
	SUBS		r4,r4,#1
	BMI		_sauty4
	STRB		r3,[r0,+r4]
	SUBS		r4,r4,#1
	BMI		_sauty4
	STRB		r3,[r0,+r4]
	SUBS		r4,r4,#1
	BMI		_sauty4
	STRB		r3,[r0,+r4]
	SUBS		r4,r4,#1

	BPL		_by9

_sauty4:
	SUB		r0,r0,#240
	SUBS		r1,r1,#1
	BPL		_bx9

	ldr		r4,[sp],#4
	bx		lr